@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
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ /**
3
+ * MCP shared engine — the heavyweight, *shared* state for an MCP server:
4
+ * the project's {@link CodeGraph} instance, file watcher, and the
5
+ * {@link ToolHandler} cache for cross-project queries.
6
+ *
7
+ * One engine, many sessions:
8
+ * - direct mode (single stdio session) instantiates one engine + one session;
9
+ * - daemon mode instantiates one engine and a new session per socket
10
+ * connection. Every session reads from the same SQLite WAL and the same
11
+ * inotify watch set — that's the entire point of issue #411.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.MCPEngine = void 0;
15
+ exports.parseDebounceEnv = parseDebounceEnv;
16
+ const directory_1 = require("../directory");
17
+ const sync_1 = require("../sync");
18
+ const tools_1 = require("./tools");
19
+ // Lazy-load the heavy CodeGraph chain (sqlite + query/graph/context layers) OFF
20
+ // the MCP startup path. It's only needed once a tool actually opens a project —
21
+ // not to answer initialize/tools-list — so deferring it lets `serve --mcp` (and
22
+ // the daemon it spawns) bind + register tools in ~Node-startup time instead of
23
+ // ~800ms, closing the "No such tool available" cold-start race that made headless
24
+ // agents flounder. require() is sync + cached on the CommonJS build.
25
+ const loadCodeGraph = () => require('../index').default;
26
+ /**
27
+ * Shared MCP engine. Thread-safe in the sense that multiple sessions can
28
+ * call its methods concurrently — internally it serializes initialization
29
+ * through a single promise so multiple sessions racing each other on first
30
+ * connect never double-open the SQLite file.
31
+ */
32
+ class MCPEngine {
33
+ cg = null;
34
+ toolHandler;
35
+ // Project root we resolved to. Null until `ensureInitialized` succeeds
36
+ // (or null forever if no .codegraph/ ever turned up — that's a valid
37
+ // state for the engine, since cross-project queries still work).
38
+ projectPath = null;
39
+ // Set on first `ensureInitialized` so subsequent sessions don't redo work.
40
+ initPromise = null;
41
+ watcherStarted = false;
42
+ opts;
43
+ closed = false;
44
+ constructor(opts = {}) {
45
+ this.opts = { watch: opts.watch ?? true };
46
+ this.toolHandler = new tools_1.ToolHandler(null);
47
+ }
48
+ /**
49
+ * Convenience for {@link MCPServer} compatibility: pre-seed an explicit
50
+ * project path (from the `--path` CLI flag) without yet opening it. This
51
+ * keeps the synchronous constructor cheap; the actual open happens on the
52
+ * first `ensureInitialized` call.
53
+ */
54
+ setProjectPathHint(projectPath) {
55
+ this.projectPath = projectPath;
56
+ this.toolHandler.setDefaultProjectHint(projectPath);
57
+ }
58
+ /** Project root that the engine resolved on first init (null if none). */
59
+ getProjectPath() {
60
+ return this.projectPath;
61
+ }
62
+ /** Shared ToolHandler — sessions delegate tool dispatch through this. */
63
+ getToolHandler() {
64
+ return this.toolHandler;
65
+ }
66
+ /** Whether the default project's CodeGraph is open. */
67
+ hasDefaultCodeGraph() {
68
+ return this.toolHandler.hasDefaultCodeGraph();
69
+ }
70
+ /**
71
+ * Walk up from `searchFrom` to find the nearest `.codegraph/` and open it.
72
+ * Idempotent: concurrent callers share one in-flight init; subsequent
73
+ * callers after success are no-ops.
74
+ *
75
+ * The original `MCPServer.tryInitializeDefault` carried the same retry-on-
76
+ * subsequent-tool-call semantics; we preserve them by NOT throwing when the
77
+ * search misses (just leaves `cg` null so the next call can retry).
78
+ */
79
+ async ensureInitialized(searchFrom) {
80
+ if (this.closed)
81
+ return;
82
+ if (this.toolHandler.hasDefaultCodeGraph())
83
+ return;
84
+ if (this.initPromise) {
85
+ try {
86
+ await this.initPromise;
87
+ }
88
+ catch { /* let caller retry */ }
89
+ return;
90
+ }
91
+ this.initPromise = this.doInitialize(searchFrom).finally(() => {
92
+ this.initPromise = null;
93
+ });
94
+ try {
95
+ await this.initPromise;
96
+ }
97
+ catch {
98
+ // Init errors are logged inside `doInitialize`; falling through here
99
+ // matches MCPServer's previous "retry on next tool call" behavior.
100
+ }
101
+ }
102
+ /**
103
+ * Synchronous last-resort init used by the per-session retry loop when the
104
+ * background `ensureInitialized` already finished (or failed) and we need
105
+ * to pick up a project that appeared *after* the engine started.
106
+ */
107
+ retryInitializeSync(searchFrom) {
108
+ if (this.closed)
109
+ return;
110
+ if (this.toolHandler.hasDefaultCodeGraph())
111
+ return;
112
+ this.toolHandler.setDefaultProjectHint(searchFrom);
113
+ const resolvedRoot = (0, directory_1.findNearestCodeGraphRoot)(searchFrom);
114
+ if (!resolvedRoot)
115
+ return;
116
+ try {
117
+ // Close any previously failed instance to avoid leaking resources.
118
+ if (this.cg) {
119
+ try {
120
+ this.cg.close();
121
+ }
122
+ catch { /* ignore */ }
123
+ this.cg = null;
124
+ }
125
+ this.cg = loadCodeGraph().openSync(resolvedRoot);
126
+ this.projectPath = resolvedRoot;
127
+ this.toolHandler.setDefaultCodeGraph(this.cg);
128
+ this.startWatching();
129
+ this.catchUpSync();
130
+ }
131
+ catch {
132
+ // Still failing — caller will try again on the next tool call.
133
+ }
134
+ }
135
+ /**
136
+ * Close everything. Used on graceful daemon shutdown (SIGTERM/idle timeout)
137
+ * and on direct-mode stop. Idempotent.
138
+ */
139
+ stop() {
140
+ if (this.closed)
141
+ return;
142
+ this.closed = true;
143
+ this.toolHandler.closeAll();
144
+ if (this.cg) {
145
+ try {
146
+ this.cg.close();
147
+ }
148
+ catch { /* ignore */ }
149
+ this.cg = null;
150
+ }
151
+ }
152
+ async doInitialize(searchFrom) {
153
+ this.toolHandler.setDefaultProjectHint(searchFrom);
154
+ const resolvedRoot = (0, directory_1.findNearestCodeGraphRoot)(searchFrom);
155
+ if (!resolvedRoot) {
156
+ // No .codegraph/ above searchFrom. Sessions may still discover one later via roots/list
157
+ this.projectPath = searchFrom;
158
+ return;
159
+ }
160
+ this.projectPath = resolvedRoot;
161
+ try {
162
+ this.cg = await loadCodeGraph().open(resolvedRoot);
163
+ this.toolHandler.setDefaultCodeGraph(this.cg);
164
+ this.startWatching();
165
+ this.catchUpSync();
166
+ }
167
+ catch (err) {
168
+ const msg = err instanceof Error ? err.message : String(err);
169
+ process.stderr.write(`[CodeGraph MCP] Failed to open project at ${resolvedRoot}: ${msg}\n`);
170
+ }
171
+ }
172
+ /**
173
+ * Start file watching on the active CodeGraph instance. Idempotent — the
174
+ * watcher is per-engine, not per-session, which is why the daemon path
175
+ * collapses N inotify sets to one. The wording of the disabled-reason log
176
+ * exactly matches the prior in-tree implementation so log-driven dashboards
177
+ * keep working.
178
+ */
179
+ startWatching() {
180
+ if (!this.cg || this.watcherStarted || !this.opts.watch)
181
+ return;
182
+ const disabledReason = (0, sync_1.watchDisabledReason)(this.projectPath ?? process.cwd());
183
+ if (disabledReason) {
184
+ process.stderr.write(`[CodeGraph MCP] File watcher disabled — ${disabledReason}. ` +
185
+ `The graph will not auto-update; run \`codegraph sync\` (or install the git sync hooks via \`codegraph init\`) to refresh.\n`);
186
+ this.watcherStarted = true;
187
+ return;
188
+ }
189
+ // Optional override for the debounce window via env var (issue #403).
190
+ // Useful for workspaces with bursty writes (formatter-on-save chains,
191
+ // large generated outputs) where the 2s default fires too often. Clamped
192
+ // to [100ms, 60s]; out-of-range / non-numeric values fall back to the
193
+ // FileWatcher default. We log the active value so it's discoverable.
194
+ const debounceMs = parseDebounceEnv(process.env.CODEGRAPH_WATCH_DEBOUNCE_MS);
195
+ if (debounceMs !== undefined) {
196
+ process.stderr.write(`[CodeGraph MCP] File watcher debounce: ${debounceMs}ms (CODEGRAPH_WATCH_DEBOUNCE_MS)\n`);
197
+ }
198
+ const started = this.cg.watch({
199
+ debounceMs,
200
+ onSyncComplete: (result) => {
201
+ if (result.filesChanged > 0) {
202
+ process.stderr.write(`[CodeGraph MCP] Auto-synced ${result.filesChanged} file(s) in ${result.durationMs}ms\n`);
203
+ }
204
+ },
205
+ onSyncError: (err) => {
206
+ process.stderr.write(`[CodeGraph MCP] Auto-sync error: ${err.message}\n`);
207
+ },
208
+ });
209
+ this.watcherStarted = true;
210
+ if (started) {
211
+ process.stderr.write('[CodeGraph MCP] File watcher active — graph will auto-sync on changes\n');
212
+ }
213
+ else {
214
+ process.stderr.write('[CodeGraph MCP] File watcher unavailable on this platform — run `codegraph sync` to refresh the graph after changes.\n');
215
+ }
216
+ }
217
+ /**
218
+ * Reconcile the index with the current filesystem once, right after open —
219
+ * catches edits, adds, deletes, and `git pull`/`checkout` changes made while
220
+ * no watcher was running. Runs in the background, but the returned promise
221
+ * is pushed into the ToolHandler as a one-shot gate so the *first* tool
222
+ * call awaits completion before serving (without this, a tool call that
223
+ * races past sync returns rows for files that no longer exist on disk —
224
+ * and the per-file staleness banner can't help because `getPendingFiles()`
225
+ * is populated by the watcher, not by catch-up).
226
+ */
227
+ catchUpSync() {
228
+ const cg = this.cg;
229
+ if (!cg)
230
+ return;
231
+ const p = cg
232
+ .sync()
233
+ .then((result) => {
234
+ const changed = result.filesAdded + result.filesModified + result.filesRemoved;
235
+ if (changed > 0) {
236
+ process.stderr.write(`[CodeGraph MCP] Caught up ${changed} file(s) changed since last run\n`);
237
+ }
238
+ })
239
+ .catch((err) => {
240
+ const msg = err instanceof Error ? err.message : String(err);
241
+ process.stderr.write(`[CodeGraph MCP] Catch-up sync failed: ${msg}\n`);
242
+ });
243
+ this.toolHandler.setCatchUpGate(p);
244
+ }
245
+ }
246
+ exports.MCPEngine = MCPEngine;
247
+ /**
248
+ * Parse and clamp the CODEGRAPH_WATCH_DEBOUNCE_MS env override.
249
+ *
250
+ * Issue #403: workspaces with bursty writes (formatter-on-save, multi-file
251
+ * refactors) sometimes want a longer quiet window before sync. Returns
252
+ * `undefined` for unset / empty / non-numeric / out-of-range values so the
253
+ * FileWatcher default (2000ms) takes over — never throws.
254
+ *
255
+ * Clamp range: 100ms (faster would mean a sync per keystroke) to 60s (longer
256
+ * and the watcher feels broken). Out-of-range values are treated as "ignore
257
+ * this misconfiguration" rather than capped, since silently capping a 0 or
258
+ * a typoed value would mask a real config bug.
259
+ */
260
+ function parseDebounceEnv(raw) {
261
+ if (!raw || !raw.trim())
262
+ return undefined;
263
+ const n = Number(raw);
264
+ if (!Number.isFinite(n) || !Number.isInteger(n))
265
+ return undefined;
266
+ if (n < 100 || n > 60000)
267
+ return undefined;
268
+ return n;
269
+ }
270
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mcp/engine.ts"],"names":[],"mappings":"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"}
@@ -13,86 +13,100 @@
13
13
  * const server = new MCPServer('/path/to/project');
14
14
  * await server.start();
15
15
  * ```
16
+ *
17
+ * Runtime modes (decided in {@link MCPServer.start}):
18
+ *
19
+ * - **Direct** — one process serves one MCP client over stdio. The pre-#411
20
+ * behavior; used when the user opts out (`CODEGRAPH_NO_DAEMON=1`), no
21
+ * `.codegraph/` is reachable, or the daemon machinery fails for any reason.
22
+ * - **Proxy** — what an MCP host actually talks to when sharing is on: a thin
23
+ * stdio↔socket pipe to the shared daemon. The proxy carries the #277 PPID
24
+ * watchdog, so a SIGKILL'd host reaps its proxy promptly. See {@link ./proxy.ts}.
25
+ * - **Daemon** — a *detached* background process (its own session/process
26
+ * group) that serves N proxies over a Unix-domain socket / named pipe,
27
+ * sharing one CodeGraph + watcher + SQLite handle. Spawned on demand; never a
28
+ * child of any host, so it survives individual sessions and is reaped by
29
+ * client-refcount + idle timeout. See {@link ./daemon.ts} and issue #411.
30
+ *
31
+ * The detached-daemon + always-proxy split is the fix for the review finding
32
+ * that the original in-process daemon (a) was the first host's child, so closing
33
+ * that terminal severed every other client, and (b) disabled the PPID watchdog,
34
+ * regressing #277 (orphaned daemons on host SIGKILL).
16
35
  */
17
36
  /**
18
37
  * MCP Server for CodeGraph
19
38
  *
20
39
  * Implements the Model Context Protocol to expose CodeGraph
21
40
  * functionality as tools that can be called by AI assistants.
41
+ *
42
+ * Backwards-compatible constructor and `start()` signature with the
43
+ * pre-issue-#411 implementation: callers continue to do
44
+ * `new MCPServer(path).start()`. Internally we now pick from direct / proxy /
45
+ * daemon at start time.
22
46
  */
23
47
  export declare class MCPServer {
24
- private transport;
25
- private cg;
26
- private toolHandler;
27
48
  private projectPath;
28
- private initPromise;
29
- private clientSupportsRoots;
30
- private rootsAttempted;
49
+ private session;
50
+ private engine;
51
+ private daemon;
52
+ private ppidWatchdog;
31
53
  private originalPpid;
32
54
  private hostPpid;
33
- private ppidWatchdog;
34
55
  private stopped;
56
+ private mode;
35
57
  constructor(projectPath?: string);
36
58
  /**
37
- * Start the MCP server
59
+ * Start the MCP server.
38
60
  *
39
- * Note: CodeGraph initialization is deferred until the initialize request
40
- * is received, which includes the rootUri from the client.
41
- */
42
- start(): Promise<void>;
43
- /**
44
- * Try to initialize CodeGraph for the default project.
61
+ * Decision order:
62
+ * 1. `CODEGRAPH_NO_DAEMON=1` direct mode (unchanged pre-#411 behavior).
63
+ * 2. `CODEGRAPH_DAEMON_INTERNAL=1` → we ARE the detached daemon; listen.
64
+ * 3. No `.codegraph/` reachable → direct mode (the daemon's lockfile and
65
+ * socket both live under `.codegraph/`).
66
+ * 4. Otherwise connect to (or spawn) the shared daemon and proxy to it.
45
67
  *
46
- * Walks up parent directories to find the nearest .codegraph/ folder,
47
- * similar to how git finds .git/ directories.
48
- *
49
- * If initialization fails, the error is recorded but the server continues
50
- * to work — cross-project queries and retries on subsequent tool calls
51
- * are still possible.
68
+ * On any unexpected failure in step 4 we transparently fall back to direct
69
+ * mode a misbehaving daemon must never block a session from starting.
52
70
  */
53
- private tryInitializeDefault;
54
- /**
55
- * Retry initialization of the default project if it previously failed.
56
- * Called lazily on tool calls that need the default project.
57
- * Re-walks parent directories each time so it picks up projects
58
- * initialized after the MCP server started.
59
- *
60
- * Awaits any in-flight background init (kicked off by handleInitialize) so
61
- * we never open the SQLite file twice concurrently.
62
- */
63
- private retryInitIfNeeded;
64
- /**
65
- * Resolve the project root via the MCP `roots/list` request and initialize
66
- * from the first root the client reports. Falls back to the process cwd if
67
- * the client returns no usable root or doesn't answer in time. See issue #196.
68
- */
69
- private initFromRoots;
70
- /**
71
- * Start file watching on the active CodeGraph instance.
72
- * Logs sync activity to stderr for diagnostics.
73
- */
74
- private startWatching;
71
+ start(): Promise<void>;
75
72
  /**
76
- * Stop the server
73
+ * Stop the server. In daemon mode this triggers graceful shutdown of every
74
+ * connected session; in direct mode it mirrors the pre-#411 behavior (close
75
+ * cg, exit). Proxy mode never routes through here — the proxy exits itself.
77
76
  */
78
77
  stop(): void;
78
+ /** Single-process stdio MCP session — the pre-issue-#411 code path. */
79
+ private startDirect;
79
80
  /**
80
- * Handle incoming JSON-RPC messages
81
- */
82
- private handleMessage;
83
- /**
84
- * Handle initialize request
81
+ * Run as the detached shared daemon (process spawned with
82
+ * `CODEGRAPH_DAEMON_INTERNAL=1`). Arbitrate the O_EXCL lock, then either
83
+ * become the daemon (bind the socket, serve forever) or — if a live daemon
84
+ * already holds the lock — exit so we don't leak a redundant process.
85
+ *
86
+ * No PPID watchdog and no stdin handlers: the daemon is detached on purpose
87
+ * and reaps itself via client-refcount + idle timeout (see {@link Daemon}).
85
88
  */
86
- private handleInitialize;
89
+ private startDaemonProcess;
87
90
  /**
88
- * Handle tools/list request
91
+ * Proxy mode (the common case). Serve the MCP handshake LOCALLY for instant
92
+ * tool registration, forwarding tool calls to the shared daemon — which is
93
+ * connected in the background (probed, then spawned + polled if absent) so the
94
+ * handshake never waits ~600ms on it. Runs until the host disconnects; the
95
+ * proxy falls back to an in-process engine if the daemon never binds, so this
96
+ * never wedges a session.
89
97
  */
90
- private handleToolsList;
98
+ private runProxyWithLocalHandshake;
99
+ /** Standard SIGINT/SIGTERM handlers that route to our `stop()` (direct mode). */
100
+ private installSignalHandlers;
91
101
  /**
92
- * Handle tools/call request
102
+ * PPID watchdog (#277) — direct mode only. Daemon mode is detached on purpose
103
+ * and reaps via idle timeout; proxy mode installs its own watchdog inside
104
+ * {@link runProxy}. So this only ever runs for an in-process direct session.
93
105
  */
94
- private handleToolsCall;
106
+ private installPpidWatchdog;
95
107
  }
96
108
  export { StdioTransport } from './transport';
97
109
  export { tools, ToolHandler } from './tools';
110
+ export { Daemon } from './daemon';
111
+ export { CodeGraphPackageVersion } from './version';
98
112
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA2GH;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAgB;IAGnC,OAAO,CAAC,WAAW,CAA8B;IAIjD,OAAO,CAAC,mBAAmB,CAAS;IAGpC,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,YAAY,CAAwB;IAK5C,OAAO,CAAC,QAAQ,CAA4D;IAC5E,OAAO,CAAC,YAAY,CAA+C;IAInE,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,CAAC,EAAE,MAAM;IAOhC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C5B;;;;;;;;;OASG;YACW,oBAAoB;IAyBlC;;;;;;;;OAQG;YACW,iBAAiB;IA+C/B;;;;OAIG;YACW,aAAa;IAiB3B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAsCrB;;OAEG;IACH,IAAI,IAAI,IAAI;IAkBZ;;OAEG;YACW,aAAa;IA6C3B;;OAEG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,eAAe;IAO7B;;OAEG;YACW,eAAe;CAqC9B;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAsKH;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAgB;IAGnC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAA+C;IAGnE,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAA4D;IAE5E,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAA4D;gBAE5D,WAAW,CAAC,EAAE,MAAM;IAIhC;;;;;;;;;;;;OAYG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;;;OAIG;IACH,IAAI,IAAI,IAAI;IAuBZ,uEAAuE;YACzD,WAAW;IA4BzB;;;;;;;;OAQG;YACW,kBAAkB;IAiChC;;;;;;;OAOG;YACW,0BAA0B;IAoBxC,iFAAiF;IACjF,OAAO,CAAC,qBAAqB;IAK7B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAoB5B;AAWD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC"}