@stupidloud/codegraph 0.9.5 → 0.9.9

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 (302) hide show
  1. package/README.md +252 -116
  2. package/dist/bin/codegraph.js +52 -82
  3. package/dist/bin/codegraph.js.map +1 -1
  4. package/dist/context/formatter.d.ts.map +1 -1
  5. package/dist/context/formatter.js +25 -6
  6. package/dist/context/formatter.js.map +1 -1
  7. package/dist/context/index.d.ts +22 -0
  8. package/dist/context/index.d.ts.map +1 -1
  9. package/dist/context/index.js +257 -6
  10. package/dist/context/index.js.map +1 -1
  11. package/dist/context/markers.d.ts +19 -0
  12. package/dist/context/markers.d.ts.map +1 -0
  13. package/dist/context/markers.js +22 -0
  14. package/dist/context/markers.js.map +1 -0
  15. package/dist/db/queries.d.ts +88 -0
  16. package/dist/db/queries.d.ts.map +1 -1
  17. package/dist/db/queries.js +251 -7
  18. package/dist/db/queries.js.map +1 -1
  19. package/dist/db/sqlite-adapter.d.ts +7 -0
  20. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  21. package/dist/db/sqlite-adapter.js +3 -0
  22. package/dist/db/sqlite-adapter.js.map +1 -1
  23. package/dist/directory.d.ts.map +1 -1
  24. package/dist/directory.js +6 -20
  25. package/dist/directory.js.map +1 -1
  26. package/dist/extraction/generated-detection.d.ts +30 -0
  27. package/dist/extraction/generated-detection.d.ts.map +1 -0
  28. package/dist/extraction/generated-detection.js +80 -0
  29. package/dist/extraction/generated-detection.js.map +1 -0
  30. package/dist/extraction/grammars.d.ts +17 -1
  31. package/dist/extraction/grammars.d.ts.map +1 -1
  32. package/dist/extraction/grammars.js +65 -1
  33. package/dist/extraction/grammars.js.map +1 -1
  34. package/dist/extraction/index.d.ts +15 -2
  35. package/dist/extraction/index.d.ts.map +1 -1
  36. package/dist/extraction/index.js +206 -98
  37. package/dist/extraction/index.js.map +1 -1
  38. package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  39. package/dist/extraction/languages/c-cpp.js +45 -0
  40. package/dist/extraction/languages/c-cpp.js.map +1 -1
  41. package/dist/extraction/languages/csharp.d.ts.map +1 -1
  42. package/dist/extraction/languages/csharp.js +2 -1
  43. package/dist/extraction/languages/csharp.js.map +1 -1
  44. package/dist/extraction/languages/go.d.ts.map +1 -1
  45. package/dist/extraction/languages/go.js +18 -2
  46. package/dist/extraction/languages/go.js.map +1 -1
  47. package/dist/extraction/languages/index.d.ts.map +1 -1
  48. package/dist/extraction/languages/index.js +2 -0
  49. package/dist/extraction/languages/index.js.map +1 -1
  50. package/dist/extraction/languages/java.d.ts.map +1 -1
  51. package/dist/extraction/languages/java.js +6 -0
  52. package/dist/extraction/languages/java.js.map +1 -1
  53. package/dist/extraction/languages/kotlin.d.ts.map +1 -1
  54. package/dist/extraction/languages/kotlin.js +6 -0
  55. package/dist/extraction/languages/kotlin.js.map +1 -1
  56. package/dist/extraction/languages/objc.d.ts +3 -0
  57. package/dist/extraction/languages/objc.d.ts.map +1 -0
  58. package/dist/extraction/languages/objc.js +133 -0
  59. package/dist/extraction/languages/objc.js.map +1 -0
  60. package/dist/extraction/mybatis-extractor.d.ts +48 -0
  61. package/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  62. package/dist/extraction/mybatis-extractor.js +198 -0
  63. package/dist/extraction/mybatis-extractor.js.map +1 -0
  64. package/dist/extraction/tree-sitter-types.d.ts +14 -0
  65. package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  66. package/dist/extraction/tree-sitter.d.ts +84 -0
  67. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  68. package/dist/extraction/tree-sitter.js +681 -20
  69. package/dist/extraction/tree-sitter.js.map +1 -1
  70. package/dist/extraction/vue-extractor.d.ts +15 -0
  71. package/dist/extraction/vue-extractor.d.ts.map +1 -1
  72. package/dist/extraction/vue-extractor.js +88 -0
  73. package/dist/extraction/vue-extractor.js.map +1 -1
  74. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  75. package/dist/extraction/wasm-runtime-flags.js +1 -0
  76. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  77. package/dist/graph/traversal.d.ts.map +1 -1
  78. package/dist/graph/traversal.js +5 -2
  79. package/dist/graph/traversal.js.map +1 -1
  80. package/dist/index.d.ts +66 -3
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +105 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/installer/config-writer.d.ts +7 -8
  85. package/dist/installer/config-writer.d.ts.map +1 -1
  86. package/dist/installer/config-writer.js +7 -27
  87. package/dist/installer/config-writer.js.map +1 -1
  88. package/dist/installer/index.d.ts +3 -20
  89. package/dist/installer/index.d.ts.map +1 -1
  90. package/dist/installer/index.js +8 -39
  91. package/dist/installer/index.js.map +1 -1
  92. package/dist/installer/instructions-template.d.ts +11 -21
  93. package/dist/installer/instructions-template.d.ts.map +1 -1
  94. package/dist/installer/instructions-template.js +12 -56
  95. package/dist/installer/instructions-template.js.map +1 -1
  96. package/dist/installer/targets/antigravity.d.ts +57 -0
  97. package/dist/installer/targets/antigravity.d.ts.map +1 -0
  98. package/dist/installer/targets/antigravity.js +308 -0
  99. package/dist/installer/targets/antigravity.js.map +1 -0
  100. package/dist/installer/targets/claude.d.ts +10 -1
  101. package/dist/installer/targets/claude.d.ts.map +1 -1
  102. package/dist/installer/targets/claude.js +25 -40
  103. package/dist/installer/targets/claude.js.map +1 -1
  104. package/dist/installer/targets/codex.d.ts.map +1 -1
  105. package/dist/installer/targets/codex.js +15 -13
  106. package/dist/installer/targets/codex.js.map +1 -1
  107. package/dist/installer/targets/cursor.d.ts.map +1 -1
  108. package/dist/installer/targets/cursor.js +9 -38
  109. package/dist/installer/targets/cursor.js.map +1 -1
  110. package/dist/installer/targets/gemini.d.ts +26 -0
  111. package/dist/installer/targets/gemini.d.ts.map +1 -0
  112. package/dist/installer/targets/gemini.js +167 -0
  113. package/dist/installer/targets/gemini.js.map +1 -0
  114. package/dist/installer/targets/hermes.d.ts.map +1 -1
  115. package/dist/installer/targets/hermes.js +57 -3
  116. package/dist/installer/targets/hermes.js.map +1 -1
  117. package/dist/installer/targets/kiro.d.ts +27 -0
  118. package/dist/installer/targets/kiro.d.ts.map +1 -0
  119. package/dist/installer/targets/kiro.js +178 -0
  120. package/dist/installer/targets/kiro.js.map +1 -0
  121. package/dist/installer/targets/opencode.d.ts.map +1 -1
  122. package/dist/installer/targets/opencode.js +15 -13
  123. package/dist/installer/targets/opencode.js.map +1 -1
  124. package/dist/installer/targets/registry.d.ts.map +1 -1
  125. package/dist/installer/targets/registry.js +6 -0
  126. package/dist/installer/targets/registry.js.map +1 -1
  127. package/dist/installer/targets/shared.d.ts.map +1 -1
  128. package/dist/installer/targets/shared.js +3 -2
  129. package/dist/installer/targets/shared.js.map +1 -1
  130. package/dist/installer/targets/types.d.ts +1 -16
  131. package/dist/installer/targets/types.d.ts.map +1 -1
  132. package/dist/mcp/daemon-paths.d.ts +46 -0
  133. package/dist/mcp/daemon-paths.d.ts.map +1 -0
  134. package/dist/mcp/daemon-paths.js +125 -0
  135. package/dist/mcp/daemon-paths.js.map +1 -0
  136. package/dist/mcp/daemon.d.ts +161 -0
  137. package/dist/mcp/daemon.d.ts.map +1 -0
  138. package/dist/mcp/daemon.js +403 -0
  139. package/dist/mcp/daemon.js.map +1 -0
  140. package/dist/mcp/engine.d.ts +105 -0
  141. package/dist/mcp/engine.d.ts.map +1 -0
  142. package/dist/mcp/engine.js +270 -0
  143. package/dist/mcp/engine.js.map +1 -0
  144. package/dist/mcp/index.d.ts +67 -53
  145. package/dist/mcp/index.d.ts.map +1 -1
  146. package/dist/mcp/index.js +315 -388
  147. package/dist/mcp/index.js.map +1 -1
  148. package/dist/mcp/proxy.d.ts +81 -0
  149. package/dist/mcp/proxy.d.ts.map +1 -0
  150. package/dist/mcp/proxy.js +510 -0
  151. package/dist/mcp/proxy.js.map +1 -0
  152. package/dist/mcp/server-instructions.d.ts +1 -1
  153. package/dist/mcp/server-instructions.d.ts.map +1 -1
  154. package/dist/mcp/server-instructions.js +21 -21
  155. package/dist/mcp/session.d.ts +77 -0
  156. package/dist/mcp/session.d.ts.map +1 -0
  157. package/dist/mcp/session.js +294 -0
  158. package/dist/mcp/session.js.map +1 -0
  159. package/dist/mcp/tools.d.ts +160 -14
  160. package/dist/mcp/tools.d.ts.map +1 -1
  161. package/dist/mcp/tools.js +1622 -322
  162. package/dist/mcp/tools.js.map +1 -1
  163. package/dist/mcp/transport.d.ts +111 -29
  164. package/dist/mcp/transport.d.ts.map +1 -1
  165. package/dist/mcp/transport.js +181 -71
  166. package/dist/mcp/transport.js.map +1 -1
  167. package/dist/mcp/version.d.ts +19 -0
  168. package/dist/mcp/version.d.ts.map +1 -0
  169. package/dist/mcp/version.js +71 -0
  170. package/dist/mcp/version.js.map +1 -0
  171. package/dist/resolution/callback-synthesizer.d.ts +10 -0
  172. package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  173. package/dist/resolution/callback-synthesizer.js +1300 -0
  174. package/dist/resolution/callback-synthesizer.js.map +1 -0
  175. package/dist/resolution/frameworks/csharp.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/csharp.js +36 -8
  177. package/dist/resolution/frameworks/csharp.js.map +1 -1
  178. package/dist/resolution/frameworks/drupal.d.ts.map +1 -1
  179. package/dist/resolution/frameworks/drupal.js +44 -12
  180. package/dist/resolution/frameworks/drupal.js.map +1 -1
  181. package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  182. package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  183. package/dist/resolution/frameworks/expo-modules.js +143 -0
  184. package/dist/resolution/frameworks/expo-modules.js.map +1 -0
  185. package/dist/resolution/frameworks/express.d.ts.map +1 -1
  186. package/dist/resolution/frameworks/express.js +102 -19
  187. package/dist/resolution/frameworks/express.js.map +1 -1
  188. package/dist/resolution/frameworks/fabric.d.ts +3 -0
  189. package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  190. package/dist/resolution/frameworks/fabric.js +354 -0
  191. package/dist/resolution/frameworks/fabric.js.map +1 -0
  192. package/dist/resolution/frameworks/go.d.ts.map +1 -1
  193. package/dist/resolution/frameworks/go.js +6 -3
  194. package/dist/resolution/frameworks/go.js.map +1 -1
  195. package/dist/resolution/frameworks/index.d.ts +5 -0
  196. package/dist/resolution/frameworks/index.d.ts.map +1 -1
  197. package/dist/resolution/frameworks/index.js +25 -1
  198. package/dist/resolution/frameworks/index.js.map +1 -1
  199. package/dist/resolution/frameworks/java.d.ts.map +1 -1
  200. package/dist/resolution/frameworks/java.js +339 -12
  201. package/dist/resolution/frameworks/java.js.map +1 -1
  202. package/dist/resolution/frameworks/laravel.d.ts.map +1 -1
  203. package/dist/resolution/frameworks/laravel.js +17 -8
  204. package/dist/resolution/frameworks/laravel.js.map +1 -1
  205. package/dist/resolution/frameworks/nestjs.d.ts.map +1 -1
  206. package/dist/resolution/frameworks/nestjs.js +324 -0
  207. package/dist/resolution/frameworks/nestjs.js.map +1 -1
  208. package/dist/resolution/frameworks/play.d.ts +19 -0
  209. package/dist/resolution/frameworks/play.d.ts.map +1 -0
  210. package/dist/resolution/frameworks/play.js +111 -0
  211. package/dist/resolution/frameworks/play.js.map +1 -0
  212. package/dist/resolution/frameworks/python.d.ts.map +1 -1
  213. package/dist/resolution/frameworks/python.js +134 -16
  214. package/dist/resolution/frameworks/python.js.map +1 -1
  215. package/dist/resolution/frameworks/react-native.d.ts +3 -0
  216. package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  217. package/dist/resolution/frameworks/react-native.js +360 -0
  218. package/dist/resolution/frameworks/react-native.js.map +1 -0
  219. package/dist/resolution/frameworks/react.d.ts.map +1 -1
  220. package/dist/resolution/frameworks/react.js +96 -3
  221. package/dist/resolution/frameworks/react.js.map +1 -1
  222. package/dist/resolution/frameworks/ruby.d.ts.map +1 -1
  223. package/dist/resolution/frameworks/ruby.js +106 -2
  224. package/dist/resolution/frameworks/ruby.js.map +1 -1
  225. package/dist/resolution/frameworks/rust.d.ts.map +1 -1
  226. package/dist/resolution/frameworks/rust.js +102 -5
  227. package/dist/resolution/frameworks/rust.js.map +1 -1
  228. package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  229. package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  230. package/dist/resolution/frameworks/swift-objc.js +252 -0
  231. package/dist/resolution/frameworks/swift-objc.js.map +1 -0
  232. package/dist/resolution/frameworks/swift.d.ts.map +1 -1
  233. package/dist/resolution/frameworks/swift.js +30 -6
  234. package/dist/resolution/frameworks/swift.js.map +1 -1
  235. package/dist/resolution/go-module.d.ts +26 -0
  236. package/dist/resolution/go-module.d.ts.map +1 -0
  237. package/dist/resolution/go-module.js +78 -0
  238. package/dist/resolution/go-module.js.map +1 -0
  239. package/dist/resolution/import-resolver.d.ts +28 -0
  240. package/dist/resolution/import-resolver.d.ts.map +1 -1
  241. package/dist/resolution/import-resolver.js +617 -5
  242. package/dist/resolution/import-resolver.js.map +1 -1
  243. package/dist/resolution/index.d.ts +11 -0
  244. package/dist/resolution/index.d.ts.map +1 -1
  245. package/dist/resolution/index.js +156 -3
  246. package/dist/resolution/index.js.map +1 -1
  247. package/dist/resolution/name-matcher.d.ts.map +1 -1
  248. package/dist/resolution/name-matcher.js +212 -0
  249. package/dist/resolution/name-matcher.js.map +1 -1
  250. package/dist/resolution/swift-objc-bridge.d.ts +134 -0
  251. package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  252. package/dist/resolution/swift-objc-bridge.js +256 -0
  253. package/dist/resolution/swift-objc-bridge.js.map +1 -0
  254. package/dist/resolution/types.d.ts +44 -0
  255. package/dist/resolution/types.d.ts.map +1 -1
  256. package/dist/resolution/workspace-packages.d.ts +48 -0
  257. package/dist/resolution/workspace-packages.d.ts.map +1 -0
  258. package/dist/resolution/workspace-packages.js +208 -0
  259. package/dist/resolution/workspace-packages.js.map +1 -0
  260. package/dist/search/query-utils.d.ts +18 -0
  261. package/dist/search/query-utils.d.ts.map +1 -1
  262. package/dist/search/query-utils.js +30 -0
  263. package/dist/search/query-utils.js.map +1 -1
  264. package/dist/sync/git-hooks.d.ts.map +1 -1
  265. package/dist/sync/git-hooks.js +2 -0
  266. package/dist/sync/git-hooks.js.map +1 -1
  267. package/dist/sync/index.d.ts +3 -1
  268. package/dist/sync/index.d.ts.map +1 -1
  269. package/dist/sync/index.js +8 -1
  270. package/dist/sync/index.js.map +1 -1
  271. package/dist/sync/watcher.d.ts +212 -8
  272. package/dist/sync/watcher.d.ts.map +1 -1
  273. package/dist/sync/watcher.js +465 -51
  274. package/dist/sync/watcher.js.map +1 -1
  275. package/dist/sync/worktree.d.ts +54 -0
  276. package/dist/sync/worktree.d.ts.map +1 -0
  277. package/dist/sync/worktree.js +137 -0
  278. package/dist/sync/worktree.js.map +1 -0
  279. package/dist/types.d.ts +9 -1
  280. package/dist/types.d.ts.map +1 -1
  281. package/dist/types.js +3 -0
  282. package/dist/types.js.map +1 -1
  283. package/package.json +1 -1
  284. package/scripts/agent-eval/arms-F.sh +21 -0
  285. package/scripts/agent-eval/arms-matrix.sh +37 -0
  286. package/scripts/agent-eval/bench-readme.sh +28 -0
  287. package/scripts/agent-eval/bench-why-repo.sh +22 -0
  288. package/scripts/agent-eval/block-read-hook.sh +19 -0
  289. package/scripts/agent-eval/hook-settings.json +15 -0
  290. package/scripts/agent-eval/itrun.sh +24 -11
  291. package/scripts/agent-eval/parse-arms.mjs +116 -0
  292. package/scripts/agent-eval/parse-bench-readme.mjs +84 -0
  293. package/scripts/agent-eval/probe-context.mjs +21 -0
  294. package/scripts/agent-eval/probe-explore.mjs +40 -0
  295. package/scripts/agent-eval/probe-node.mjs +20 -0
  296. package/scripts/agent-eval/probe-sweep.mjs +119 -0
  297. package/scripts/agent-eval/probe-trace.mjs +20 -0
  298. package/scripts/agent-eval/run-arms.sh +56 -0
  299. package/scripts/agent-eval/seq-matrix.mjs +137 -0
  300. package/scripts/npm-sdk.js +75 -0
  301. package/scripts/pack-npm.sh +25 -1
  302. package/scripts/prepare-release.mjs +270 -0
@@ -2,11 +2,34 @@
2
2
  /**
3
3
  * File Watcher
4
4
  *
5
- * Watches the project directory for file changes and triggers
6
- * debounced sync operations to keep the code graph up-to-date.
5
+ * Watches the project directory for file changes and triggers debounced sync
6
+ * operations to keep the code graph up-to-date.
7
7
  *
8
- * Uses Node.js native fs.watch with recursive mode (macOS FSEvents,
9
- * Windows ReadDirectoryChangesW, Linux inotify on Node 19+).
8
+ * Uses Node's built-in `fs.watch` directly (no third-party watcher, no native
9
+ * addon) with a per-platform strategy chosen to keep the open-descriptor /
10
+ * kernel-watch cost BOUNDED rather than growing with the number of files:
11
+ *
12
+ * - macOS / Windows: a SINGLE recursive `fs.watch(root, {recursive:true})`.
13
+ * libuv maps this to one FSEvents stream (macOS) / one
14
+ * ReadDirectoryChangesW handle (Windows), so it costs O(1) descriptors no
15
+ * matter how large the tree. This is the fix for the macOS file-table
16
+ * exhaustion (#644 / #496 / #555 / #628): the previous watcher held one
17
+ * open fd PER WATCHED FILE on macOS (tens of thousands of REG fds), which
18
+ * exhausted `kern.maxfiles` and crashed unrelated processes system-wide.
19
+ *
20
+ * - Linux: recursive `fs.watch` is unsupported, so we watch each (non-ignored)
21
+ * DIRECTORY with one inotify watch — O(directories), NOT O(files). New
22
+ * directories are picked up dynamically and an overall watch cap bounds
23
+ * inotify usage on pathological monorepos (#579). A single inotify watch on
24
+ * a directory already reports create/modify/delete for its children, so
25
+ * per-file watches are never needed.
26
+ *
27
+ * Excluded trees (node_modules/, dist/, .git/, …) are filtered via the
28
+ * indexer's `buildDefaultIgnore` (built-in default-ignore dirs + the project's
29
+ * .gitignore) — on Linux they're never descended into (so they cost no watch),
30
+ * and on macOS/Windows the single recursive stream still covers them but their
31
+ * events are dropped before any sync is scheduled. Either way the watcher's
32
+ * scope matches the indexer's (#276 / #407).
10
33
  */
11
34
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
35
  if (k2 === undefined) k2 = k;
@@ -42,91 +65,353 @@ var __importStar = (this && this.__importStar) || (function () {
42
65
  };
43
66
  })();
44
67
  Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.FileWatcher = void 0;
68
+ exports.FileWatcher = exports.LockUnavailableError = void 0;
69
+ exports.__emitWatchEventForTests = __emitWatchEventForTests;
46
70
  const fs = __importStar(require("fs"));
71
+ const path = __importStar(require("path"));
47
72
  const extraction_1 = require("../extraction");
48
73
  const errors_1 = require("../errors");
49
74
  const utils_1 = require("../utils");
50
75
  const watch_policy_1 = require("./watch-policy");
76
+ /**
77
+ * Native recursive `fs.watch` is only reliable on macOS and Windows; on Linux
78
+ * (and AIX) it throws `ERR_FEATURE_UNAVAILABLE_ON_PLATFORM`. We branch on this
79
+ * to pick the recursive vs per-directory strategy.
80
+ */
81
+ function supportsRecursiveWatch() {
82
+ return process.platform === 'darwin' || process.platform === 'win32';
83
+ }
84
+ /**
85
+ * Upper bound on simultaneously-watched directories on the Linux per-directory
86
+ * path. Each is one inotify watch; the kernel's `fs.inotify.max_user_watches`
87
+ * is the hard limit (commonly 8k–128k). We stop adding watches past this and
88
+ * log once — partial live-watch (with `codegraph sync` as the backstop) is far
89
+ * better than exhausting the user's inotify budget and breaking watching
90
+ * system-wide (#579). Tunable via CODEGRAPH_MAX_DIR_WATCHES.
91
+ */
92
+ const DEFAULT_MAX_DIR_WATCHES = 50_000;
93
+ function maxDirWatches() {
94
+ const raw = process.env.CODEGRAPH_MAX_DIR_WATCHES;
95
+ if (raw && /^\d+$/.test(raw)) {
96
+ const n = Number(raw);
97
+ if (n > 0)
98
+ return n;
99
+ }
100
+ return DEFAULT_MAX_DIR_WATCHES;
101
+ }
102
+ /**
103
+ * Test seam (see {@link __emitWatchEventForTests}). Maps a watcher's project
104
+ * root to its live instance so tests can synthesize a change event
105
+ * deterministically — real fs.watch delivery latency races under parallel
106
+ * vitest (the reason the previous chokidar mock existed). Only populated under
107
+ * a test runner, so production carries no bookkeeping or retained references.
108
+ */
109
+ const liveWatchersForTests = new Map();
110
+ const IS_TEST_RUNTIME = !!(process.env.VITEST || process.env.NODE_ENV === 'test');
111
+ /**
112
+ * Thrown by a `syncFn` to signal that the underlying sync couldn't acquire
113
+ * the cross-process write lock (#449). The watcher treats this as "no
114
+ * progress" — preserves `pendingFiles`, skips `onSyncComplete`, and the
115
+ * `finally` block reschedules. Quiet (debug-only) because a long-running
116
+ * external indexer can hit this every debounce cycle.
117
+ */
118
+ class LockUnavailableError extends Error {
119
+ constructor(message = 'CodeGraph file lock unavailable; another process is writing') {
120
+ super(message);
121
+ this.name = 'LockUnavailableError';
122
+ }
123
+ }
124
+ exports.LockUnavailableError = LockUnavailableError;
51
125
  /**
52
126
  * FileWatcher monitors a project directory for changes and triggers
53
127
  * debounced sync operations via a provided callback.
54
128
  *
55
129
  * Design goals:
56
- * - Minimal resource usage (native OS file events, no polling)
130
+ * - Bounded resource usage: O(1) descriptors on macOS/Windows (one recursive
131
+ * watch), O(directories) inotify watches on Linux — never O(files), which
132
+ * was the system-crashing fd leak on macOS (#644/#496/#555/#628).
57
133
  * - Debounced to avoid thrashing on rapid saves
58
134
  * - Filters to supported source files by extension
59
- * - Ignores .codegraph/ directory changes
135
+ * - Ignores .codegraph/ and .git/ regardless of .gitignore
136
+ * - Tracks per-file pending state so MCP tools can flag stale results
137
+ * without blocking on a sync (issue #403)
60
138
  */
61
139
  class FileWatcher {
62
- watcher = null;
140
+ /** macOS/Windows: the single recursive watcher. Null on Linux. */
141
+ recursiveWatcher = null;
142
+ /** Linux: one watcher per watched directory (keyed by absolute path). */
143
+ dirWatchers = new Map();
144
+ /** Set once the per-directory watch cap is hit, so we log only once. */
145
+ dirCapWarned = false;
146
+ /** Test-only inert mode: started, but with no OS watcher installed. */
147
+ inert = false;
63
148
  debounceTimer = null;
64
- hasChanges = false;
149
+ /**
150
+ * Files seen by the watcher since the last successful sync — populated on
151
+ * every change event, cleared at the start of a sync, and re-populated by
152
+ * events that arrive mid-sync (or restored on sync failure). Keyed by the
153
+ * same project-relative POSIX path the rest of the codebase uses, so a
154
+ * caller can intersect tool-response file paths against this map cheaply.
155
+ */
156
+ pendingFiles = new Map();
157
+ /**
158
+ * Wall-clock ms at which the in-flight sync began. Combined with
159
+ * {@link pendingFiles}'s `lastSeenMs`, this distinguishes "still in the
160
+ * debounce window" (lastSeen > syncStarted, sync hasn't started yet for
161
+ * this edit) from "currently being indexed" (lastSeen <= syncStarted).
162
+ */
163
+ syncStartedMs = 0;
65
164
  syncing = false;
66
165
  stopped = false;
166
+ /**
167
+ * True once the initial watch set is established. Unlike the previous
168
+ * chokidar implementation there is no asynchronous initial "crawl" emitting
169
+ * an `add` per existing file — `fs.watch` only reports changes from the
170
+ * moment it's installed — so this flips to true synchronously at the end of
171
+ * `start()`. The startup reconcile against on-disk state is handled
172
+ * separately by the engine's catch-up sync, not by the watcher.
173
+ */
174
+ ready = false;
175
+ /**
176
+ * Callbacks that resolve when the watch set is established. Used by tests
177
+ * (and any production caller that cares about a clean baseline) to
178
+ * deterministically gate on watcher readiness.
179
+ */
180
+ readyWaiters = [];
181
+ // The shared ignore matcher (built-in defaults + project .gitignore), built
182
+ // once at start(). Same source of truth the indexer uses, so watcher scope
183
+ // can never diverge from index scope.
184
+ ignoreMatcher = null;
67
185
  projectRoot;
68
186
  debounceMs;
69
187
  syncFn;
70
188
  onSyncComplete;
71
189
  onSyncError;
190
+ inertForTests;
72
191
  constructor(projectRoot, syncFn, options = {}) {
73
192
  this.projectRoot = projectRoot;
74
193
  this.syncFn = syncFn;
75
194
  this.debounceMs = options.debounceMs ?? 2000;
76
195
  this.onSyncComplete = options.onSyncComplete;
77
196
  this.onSyncError = options.onSyncError;
197
+ this.inertForTests = options.inertForTests ?? false;
78
198
  }
79
199
  /**
80
200
  * Start watching for file changes.
81
201
  * Returns true if watching started successfully, false otherwise.
82
202
  */
83
203
  start() {
84
- if (this.watcher)
204
+ if (this.recursiveWatcher || this.dirWatchers.size > 0 || this.inert)
85
205
  return true; // Already watching
86
206
  this.stopped = false;
87
- // Some environments make recursive fs.watch unusable — most notably WSL2
88
- // /mnt/ drives, where setup blocks long enough to break MCP startup
89
- // handshakes (issue #199). Skip watching there; callers fall back to
90
- // manual `codegraph sync` or the git sync hooks.
207
+ // Some environments make filesystem watching unusable — most notably
208
+ // WSL2 /mnt/ drives, where the underlying fs.watch calls block long
209
+ // enough to break MCP startup handshakes (issue #199). Skip watching
210
+ // there; callers fall back to manual `codegraph sync` or git sync hooks.
91
211
  const disabledReason = (0, watch_policy_1.watchDisabledReason)(this.projectRoot);
92
212
  if (disabledReason) {
93
213
  (0, errors_1.logDebug)('File watcher disabled', { reason: disabledReason, projectRoot: this.projectRoot });
94
214
  return false;
95
215
  }
216
+ // Reuse the indexer's ignore set so the watcher and indexer agree on scope.
217
+ this.ignoreMatcher = (0, extraction_1.buildDefaultIgnore)(this.projectRoot);
96
218
  try {
97
- this.watcher = fs.watch(this.projectRoot, { recursive: true }, (_eventType, filename) => {
98
- if (!filename || this.stopped)
99
- return;
100
- // Normalize path separators
101
- const normalized = (0, utils_1.normalizePath)(filename);
102
- // Ignore .codegraph/ directory changes (our own DB writes)
103
- if (normalized === '.codegraph' ||
104
- normalized.startsWith('.codegraph/') ||
105
- normalized.startsWith('.codegraph\\')) {
106
- return;
107
- }
108
- // Only sync changes to files we can actually parse.
109
- if (!(0, extraction_1.isSourceFile)(normalized)) {
110
- return;
111
- }
112
- (0, errors_1.logDebug)('File change detected', { file: normalized });
113
- this.hasChanges = true;
114
- this.scheduleSync();
115
- });
116
- // Handle watcher errors gracefully
117
- this.watcher.on('error', (err) => {
118
- (0, errors_1.logWarn)('File watcher error', { error: String(err) });
119
- // Don't crash — watcher may recover or user can restart
219
+ if (this.inertForTests) {
220
+ // Test-only: install no OS watcher; the seam drives events instead.
221
+ this.inert = true;
222
+ }
223
+ else if (supportsRecursiveWatch()) {
224
+ this.startRecursive();
225
+ }
226
+ else {
227
+ this.startPerDirectory();
228
+ }
229
+ // No async crawl to wait on: as soon as the watch set is installed we
230
+ // have a clean baseline (pendingFiles is only populated by post-start
231
+ // events). Clear defensively and flip ready.
232
+ this.pendingFiles.clear();
233
+ this.ready = true;
234
+ for (const cb of this.readyWaiters)
235
+ cb();
236
+ this.readyWaiters.length = 0;
237
+ if (IS_TEST_RUNTIME)
238
+ liveWatchersForTests.set(this.projectRoot, this);
239
+ (0, errors_1.logDebug)('File watcher started', {
240
+ projectRoot: this.projectRoot,
241
+ debounceMs: this.debounceMs,
242
+ mode: this.inertForTests ? 'inert' : supportsRecursiveWatch() ? 'recursive' : 'per-directory',
243
+ watchedDirs: this.dirWatchers.size || undefined,
120
244
  });
121
- (0, errors_1.logDebug)('File watcher started', { projectRoot: this.projectRoot, debounceMs: this.debounceMs });
122
245
  return true;
123
246
  }
124
247
  catch (err) {
125
- // Recursive watch not supported (e.g., Linux < Node 19)
126
- (0, errors_1.logWarn)('Could not start file watcher — recursive fs.watch not supported on this platform', { error: String(err) });
248
+ // Watcher setup failed (e.g., permission denied, missing directory).
249
+ (0, errors_1.logWarn)('Could not start file watcher', { error: String(err) });
250
+ this.stop();
127
251
  return false;
128
252
  }
129
253
  }
254
+ /**
255
+ * macOS/Windows: one recursive watcher for the whole tree. O(1) descriptors.
256
+ * `filename` arrives relative to the project root (with subdirectories), so
257
+ * it maps straight to a project-relative path.
258
+ */
259
+ startRecursive() {
260
+ this.recursiveWatcher = fs.watch(this.projectRoot, { recursive: true, persistent: true }, (_event, filename) => {
261
+ if (this.stopped || filename == null)
262
+ return;
263
+ this.handleChange((0, utils_1.normalizePath)(String(filename)));
264
+ });
265
+ this.recursiveWatcher.on('error', (err) => {
266
+ (0, errors_1.logWarn)('File watcher error', { error: String(err) });
267
+ });
268
+ }
269
+ /**
270
+ * Linux: walk the (non-ignored) tree and watch each directory. One inotify
271
+ * watch per directory reports create/modify/delete for that directory's
272
+ * direct children, so we never watch individual files.
273
+ */
274
+ startPerDirectory() {
275
+ this.watchTree(this.projectRoot, /* markExisting */ false);
276
+ }
277
+ /**
278
+ * Add an inotify watch for `dir` and recurse into its non-ignored
279
+ * subdirectories. When `markExisting` is true (a directory that appeared
280
+ * AFTER startup), the source files already inside it are recorded as pending
281
+ * — this closes the `mkdir + write` race where files created before the new
282
+ * directory's watch is installed would otherwise be missed until the next
283
+ * full sync. The initial startup walk passes false (the engine's catch-up
284
+ * sync owns the baseline).
285
+ */
286
+ watchTree(dir, markExisting) {
287
+ if (this.dirWatchers.has(dir))
288
+ return;
289
+ if (this.dirWatchers.size >= maxDirWatches()) {
290
+ if (!this.dirCapWarned) {
291
+ this.dirCapWarned = true;
292
+ (0, errors_1.logWarn)('File watcher hit directory-watch cap; remaining subtrees rely on manual/periodic sync', {
293
+ cap: maxDirWatches(),
294
+ });
295
+ }
296
+ return;
297
+ }
298
+ let w;
299
+ try {
300
+ w = fs.watch(dir, { persistent: true }, (_event, filename) => this.handleDirEvent(dir, filename));
301
+ }
302
+ catch {
303
+ // ENOENT / EACCES / too-many-open-files — skip this directory quietly.
304
+ return;
305
+ }
306
+ w.on('error', () => this.unwatchDir(dir));
307
+ this.dirWatchers.set(dir, w);
308
+ let entries;
309
+ try {
310
+ entries = fs.readdirSync(dir, { withFileTypes: true });
311
+ }
312
+ catch {
313
+ return;
314
+ }
315
+ for (const entry of entries) {
316
+ const child = path.join(dir, entry.name);
317
+ if (entry.isDirectory()) {
318
+ if (this.shouldIgnoreDir(child))
319
+ continue;
320
+ this.watchTree(child, markExisting);
321
+ }
322
+ else if (markExisting && entry.isFile()) {
323
+ this.handleChange((0, utils_1.normalizePath)(path.relative(this.projectRoot, child)));
324
+ }
325
+ }
326
+ }
327
+ /**
328
+ * Linux per-directory event handler. `filename` is relative to `dir`. A new
329
+ * sub-directory is picked up by extending the watch tree; everything else is
330
+ * routed through the shared change handler.
331
+ */
332
+ handleDirEvent(dir, filename) {
333
+ if (this.stopped || filename == null)
334
+ return;
335
+ const full = path.join(dir, String(filename));
336
+ // A newly-created directory needs its own watch (recursive isn't available
337
+ // on Linux). statSync is cheap and these events are rare relative to file
338
+ // edits. If the path vanished (rapid create/delete) the stat throws and we
339
+ // fall through to the change handler, which no-ops on a non-source path.
340
+ try {
341
+ if (fs.statSync(full).isDirectory()) {
342
+ if (!this.shouldIgnoreDir(full))
343
+ this.watchTree(full, /* markExisting */ true);
344
+ return;
345
+ }
346
+ }
347
+ catch {
348
+ // deleted/inaccessible — treat as a normal change below
349
+ }
350
+ this.handleChange((0, utils_1.normalizePath)(path.relative(this.projectRoot, full)));
351
+ }
352
+ /**
353
+ * Shared change handler for both watch strategies. `rel` is a
354
+ * project-relative POSIX path. Applies the ignore + source-file filters and,
355
+ * for a real source change, records it as pending (#403) and schedules a
356
+ * debounced sync.
357
+ *
358
+ * The recursive (macOS/Windows) watcher reports events for ignored trees too
359
+ * (one stream covers the whole repo), so the ignore check here is load-bearing
360
+ * — it drops node_modules/dist/.git churn before any sync is scheduled.
361
+ */
362
+ handleChange(rel) {
363
+ if (!rel || rel === '.' || rel.startsWith('..'))
364
+ return;
365
+ if (this.isAlwaysIgnored(rel))
366
+ return;
367
+ if (this.ignoreMatcher && this.ignoreMatcher.ignores(rel))
368
+ return;
369
+ if (!(0, extraction_1.isSourceFile)(rel))
370
+ return;
371
+ (0, errors_1.logDebug)('File change detected', { file: rel });
372
+ if (this.ready) {
373
+ const now = Date.now();
374
+ const existing = this.pendingFiles.get(rel);
375
+ this.pendingFiles.set(rel, {
376
+ firstSeenMs: existing?.firstSeenMs ?? now,
377
+ lastSeenMs: now,
378
+ });
379
+ }
380
+ this.scheduleSync();
381
+ }
382
+ /** Close and forget the watch for a directory that errored/was removed. */
383
+ unwatchDir(dir) {
384
+ const w = this.dirWatchers.get(dir);
385
+ if (w) {
386
+ try {
387
+ w.close();
388
+ }
389
+ catch {
390
+ /* already closed */
391
+ }
392
+ this.dirWatchers.delete(dir);
393
+ }
394
+ }
395
+ /** Our own dirs are always ignored, regardless of .gitignore. */
396
+ isAlwaysIgnored(rel) {
397
+ return (rel === '.codegraph' || rel.startsWith('.codegraph/') ||
398
+ rel === '.git' || rel.startsWith('.git/'));
399
+ }
400
+ /**
401
+ * True for any directory that should NOT be watched (used while building the
402
+ * Linux per-directory watch tree). Tests the directory form of the path so a
403
+ * dir-only ignore rule like `build/` matches.
404
+ */
405
+ shouldIgnoreDir(dirPath) {
406
+ const rel = (0, utils_1.normalizePath)(path.relative(this.projectRoot, dirPath));
407
+ if (!rel || rel === '.' || rel.startsWith('..'))
408
+ return false; // root / outside
409
+ if (this.isAlwaysIgnored(rel))
410
+ return true;
411
+ if (!this.ignoreMatcher)
412
+ return false;
413
+ return this.ignoreMatcher.ignores(rel + '/');
414
+ }
130
415
  /**
131
416
  * Stop watching for file changes.
132
417
  */
@@ -136,18 +421,71 @@ class FileWatcher {
136
421
  clearTimeout(this.debounceTimer);
137
422
  this.debounceTimer = null;
138
423
  }
139
- if (this.watcher) {
140
- this.watcher.close();
141
- this.watcher = null;
424
+ if (this.recursiveWatcher) {
425
+ try {
426
+ this.recursiveWatcher.close();
427
+ }
428
+ catch {
429
+ /* already closed */
430
+ }
431
+ this.recursiveWatcher = null;
432
+ }
433
+ for (const w of this.dirWatchers.values()) {
434
+ try {
435
+ w.close();
436
+ }
437
+ catch {
438
+ /* already closed */
439
+ }
142
440
  }
143
- this.hasChanges = false;
441
+ this.dirWatchers.clear();
442
+ this.dirCapWarned = false;
443
+ this.inert = false;
444
+ this.pendingFiles.clear();
445
+ this.ready = false;
446
+ this.ignoreMatcher = null;
447
+ if (IS_TEST_RUNTIME)
448
+ liveWatchersForTests.delete(this.projectRoot);
144
449
  (0, errors_1.logDebug)('File watcher stopped');
145
450
  }
451
+ /**
452
+ * @internal Test-only: feed a synthetic project-relative change through the
453
+ * same filter → pendingFiles → debounced-sync path a real fs.watch event
454
+ * takes. Lets the watcher / staleness-banner suites stay deterministic
455
+ * instead of racing on OS watch-delivery latency. See
456
+ * {@link __emitWatchEventForTests}.
457
+ */
458
+ ingestEventForTests(relPath) {
459
+ this.handleChange((0, utils_1.normalizePath)(relPath));
460
+ }
146
461
  /**
147
462
  * Whether the watcher is currently active.
148
463
  */
149
464
  isActive() {
150
- return this.watcher !== null && !this.stopped;
465
+ return (this.recursiveWatcher !== null || this.dirWatchers.size > 0 || this.inert) && !this.stopped;
466
+ }
467
+ /**
468
+ * Resolves once the watch set has been installed (or immediately if it
469
+ * already has). Useful for tests that need a deterministic boundary before
470
+ * asserting on `pendingFiles`.
471
+ *
472
+ * Production callers don't need this: `pendingFiles` is read continuously,
473
+ * the staleness banner is always correct (empty or populated), and there is
474
+ * no asynchronous initial-scan window with `fs.watch`.
475
+ */
476
+ waitUntilReady(timeoutMs = 10000) {
477
+ if (this.ready)
478
+ return Promise.resolve();
479
+ return new Promise((resolve, reject) => {
480
+ const t = setTimeout(() => {
481
+ const idx = this.readyWaiters.indexOf(handler);
482
+ if (idx >= 0)
483
+ this.readyWaiters.splice(idx, 1);
484
+ reject(new Error(`FileWatcher.waitUntilReady timed out after ${timeoutMs}ms`));
485
+ }, timeoutMs);
486
+ const handler = () => { clearTimeout(t); resolve(); };
487
+ this.readyWaiters.push(handler);
488
+ });
151
489
  }
152
490
  /**
153
491
  * Schedule a debounced sync.
@@ -163,30 +501,106 @@ class FileWatcher {
163
501
  }
164
502
  /**
165
503
  * Flush pending changes by running sync.
504
+ *
505
+ * pendingFiles is NOT cleared at the start of sync — entries are removed
506
+ * only after sync commits successfully, and only for entries whose
507
+ * lastSeenMs <= syncStartedMs. That way, a query that arrives mid-sync
508
+ * still sees the affected files marked stale (the DB hasn't been updated
509
+ * yet), and an event that lands mid-sync persists into the follow-up.
510
+ *
511
+ * On sync failure pendingFiles is left untouched — every edit is still
512
+ * unindexed, and the rescheduled sync will absorb the same set next time.
166
513
  */
167
514
  async flush() {
168
515
  // If already syncing, the post-sync check will re-trigger
169
516
  if (this.syncing || this.stopped)
170
517
  return;
171
- this.hasChanges = false;
518
+ this.syncStartedMs = Date.now();
172
519
  this.syncing = true;
173
520
  try {
174
521
  const result = await this.syncFn();
522
+ // Remove entries whose most recent event predates this sync — those
523
+ // edits are now in the DB. Entries with lastSeenMs > syncStartedMs
524
+ // arrived mid-sync; whether the in-flight sync captured them depends
525
+ // on when sync read that file, so we keep them as pending and let
526
+ // the follow-up sync handle them. We prefer false positives ("shown
527
+ // stale, actually fresh" → at worst one extra Read) over false
528
+ // negatives ("shown fresh, actually stale" → misleads the agent).
529
+ for (const [filePath, info] of this.pendingFiles) {
530
+ if (info.lastSeenMs <= this.syncStartedMs) {
531
+ this.pendingFiles.delete(filePath);
532
+ }
533
+ }
175
534
  this.onSyncComplete?.(result);
176
535
  }
177
536
  catch (err) {
178
- const error = err instanceof Error ? err : new Error(String(err));
179
- (0, errors_1.logWarn)('Watch sync failed', { error: error.message });
180
- this.onSyncError?.(error);
537
+ if (err instanceof LockUnavailableError) {
538
+ // Lock-failure no-op (another writer holds the lock). pendingFiles
539
+ // stays intact and the `finally` block reschedules. Debug-only —
540
+ // a long external index would otherwise spam stderr every cycle.
541
+ (0, errors_1.logDebug)('Watch sync skipped: file lock unavailable', {
542
+ pendingFiles: this.pendingFiles.size,
543
+ });
544
+ }
545
+ else {
546
+ const error = err instanceof Error ? err : new Error(String(err));
547
+ (0, errors_1.logWarn)('Watch sync failed', { error: error.message });
548
+ this.onSyncError?.(error);
549
+ }
550
+ // Failure: leave pendingFiles untouched. Every edit it tracks is
551
+ // still unindexed; the rescheduled sync sees the same set.
181
552
  }
182
553
  finally {
183
554
  this.syncing = false;
184
- // If new changes arrived during sync, schedule another
185
- if (this.hasChanges && !this.stopped) {
555
+ // If pending files remain (mid-sync events, or this sync failed),
556
+ // schedule another pass.
557
+ if (this.pendingFiles.size > 0 && !this.stopped) {
186
558
  this.scheduleSync();
187
559
  }
188
560
  }
189
561
  }
562
+ /**
563
+ * Snapshot of files seen by the watcher since the last successful sync.
564
+ *
565
+ * Used by MCP tool responses to mark stale results without blocking on a
566
+ * sync: a tool that returns a hit in `src/foo.ts` while `src/foo.ts` is in
567
+ * this list tells the agent "Read this file directly, the index lags."
568
+ *
569
+ * `indexing` is true when a sync is currently in flight whose start time is
570
+ * AFTER this file's most recent event — i.e. that sync will absorb the
571
+ * edit. False means the file is still inside the debounce window and no
572
+ * sync has started yet (a follow-up call a few hundred ms later may show
573
+ * `indexing: true` or the file may have left the list entirely).
574
+ *
575
+ * Cheap: O(pendingFiles.size), no I/O, no locks.
576
+ */
577
+ getPendingFiles() {
578
+ const result = [];
579
+ for (const [filePath, info] of this.pendingFiles) {
580
+ result.push({
581
+ path: filePath,
582
+ firstSeenMs: info.firstSeenMs,
583
+ lastSeenMs: info.lastSeenMs,
584
+ indexing: this.syncing && this.syncStartedMs >= info.lastSeenMs,
585
+ });
586
+ }
587
+ return result;
588
+ }
190
589
  }
191
590
  exports.FileWatcher = FileWatcher;
591
+ /**
592
+ * Test-only: synthesize a source-file change for the live watcher running at
593
+ * `projectRoot`, exercising the real filter → pendingFiles → debounced-sync
594
+ * logic without depending on fs.watch delivery timing (which races under
595
+ * parallel vitest). `relPath` is project-relative POSIX (e.g. "src/foo.ts").
596
+ * Returns false if no live watcher is registered for that root (e.g. outside a
597
+ * test runtime, where the registry is intentionally not populated).
598
+ */
599
+ function __emitWatchEventForTests(projectRoot, relPath) {
600
+ const w = liveWatchersForTests.get(projectRoot);
601
+ if (!w)
602
+ return false;
603
+ w.ingestEventForTests(relPath);
604
+ return true;
605
+ }
192
606
  //# sourceMappingURL=watcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,8CAA6C;AAC7C,sCAA8C;AAC9C,oCAAyC;AACzC,iDAAqD;AAwBrD;;;;;;;;;GASG;AACH,MAAa,WAAW;IACd,OAAO,GAAwB,IAAI,CAAC;IACpC,aAAa,GAAyC,IAAI,CAAC;IAC3D,UAAU,GAAG,KAAK,CAAC;IACnB,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAEP,WAAW,CAAS;IACpB,UAAU,CAAS;IACnB,MAAM,CAA8D;IACpE,cAAc,CAAkC;IAChD,WAAW,CAA+B;IAE3D,YACE,WAAmB,EACnB,MAAmE,EACnE,UAAwB,EAAE;QAE1B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,CAAC,mBAAmB;QAClD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,yEAAyE;QACzE,oEAAoE;QACpE,qEAAqE;QACrE,iDAAiD;QACjD,MAAM,cAAc,GAAG,IAAA,kCAAmB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,cAAc,EAAE,CAAC;YACnB,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7F,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CACrB,IAAI,CAAC,WAAW,EAChB,EAAE,SAAS,EAAE,IAAI,EAAE,EACnB,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;gBACvB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAEtC,4BAA4B;gBAC5B,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC;gBAE3C,2DAA2D;gBAC3D,IACE,UAAU,KAAK,YAAY;oBAC3B,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC;oBACpC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,EACrC,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,oDAAoD;gBACpD,IAAI,CAAC,IAAA,yBAAY,EAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,OAAO;gBACT,CAAC;gBAED,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBACvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;YAEF,mCAAmC;YACnC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC/B,IAAA,gBAAO,EAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtD,wDAAwD;YAC1D,CAAC,CAAC,CAAC;YAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wDAAwD;YACxD,IAAA,gBAAO,EAAC,kFAAkF,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpH,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAA,iBAAQ,EAAC,sBAAsB,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChD,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,KAAK;QACjB,0DAA0D;QAC1D,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,IAAA,gBAAO,EAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAErB,uDAAuD;YACvD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA1JD,kCA0JC"}
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"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"}