kiri-mcp-server 0.9.6 → 0.10.0

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 (207) hide show
  1. package/README.md +144 -13
  2. package/dist/client/cli.js +68 -0
  3. package/dist/client/cli.js.map +1 -0
  4. package/dist/client/index.js +5 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/eval/metrics.js +47 -0
  7. package/dist/eval/metrics.js.map +1 -0
  8. package/dist/indexer/cli.js +362 -0
  9. package/dist/indexer/cli.js.map +1 -0
  10. package/dist/indexer/codeintel.js +182 -0
  11. package/dist/indexer/codeintel.js.map +1 -0
  12. package/dist/indexer/git.js +30 -0
  13. package/dist/indexer/git.js.map +1 -0
  14. package/dist/indexer/language.js +34 -0
  15. package/dist/indexer/language.js.map +1 -0
  16. package/dist/indexer/pipeline/filters/denylist.js +71 -0
  17. package/dist/indexer/pipeline/filters/denylist.js.map +1 -0
  18. package/dist/indexer/schema.js +101 -0
  19. package/dist/indexer/schema.js.map +1 -0
  20. package/dist/package.json +14 -1
  21. package/dist/server/bootstrap.js +19 -0
  22. package/dist/server/bootstrap.js.map +1 -0
  23. package/dist/server/context.js +1 -0
  24. package/dist/server/context.js.map +1 -0
  25. package/dist/server/fallbacks/degradeController.js +69 -0
  26. package/dist/server/fallbacks/degradeController.js.map +1 -0
  27. package/dist/server/handlers.js +1268 -0
  28. package/dist/server/handlers.js.map +1 -0
  29. package/dist/server/main.js +151 -0
  30. package/dist/server/main.js.map +1 -0
  31. package/dist/server/observability/metrics.js +56 -0
  32. package/dist/server/observability/metrics.js.map +1 -0
  33. package/dist/server/observability/tracing.js +58 -0
  34. package/dist/server/observability/tracing.js.map +1 -0
  35. package/dist/server/rpc.js +477 -0
  36. package/dist/server/rpc.js.map +1 -0
  37. package/dist/server/runtime.js +47 -0
  38. package/dist/server/runtime.js.map +1 -0
  39. package/dist/server/scoring.js +116 -0
  40. package/dist/server/scoring.js.map +1 -0
  41. package/dist/server/stdio.js +76 -0
  42. package/dist/server/stdio.js.map +1 -0
  43. package/dist/shared/duckdb.js +119 -0
  44. package/dist/shared/duckdb.js.map +1 -0
  45. package/dist/shared/embedding.js +98 -0
  46. package/dist/shared/embedding.js.map +1 -0
  47. package/dist/shared/index.js +9 -0
  48. package/dist/shared/index.js.map +1 -0
  49. package/dist/shared/security/config.js +64 -0
  50. package/dist/shared/security/config.js.map +1 -0
  51. package/dist/shared/security/masker.js +56 -0
  52. package/dist/shared/security/masker.js.map +1 -0
  53. package/dist/shared/tokenizer.js +4 -0
  54. package/dist/shared/tokenizer.js.map +1 -0
  55. package/dist/shared/utils/simpleYaml.js +89 -0
  56. package/dist/shared/utils/simpleYaml.js.map +1 -0
  57. package/dist/src/client/proxy.js +83 -13
  58. package/dist/src/client/proxy.js.map +1 -1
  59. package/dist/src/client/start-daemon.d.ts.map +1 -1
  60. package/dist/src/client/start-daemon.js +2 -1
  61. package/dist/src/client/start-daemon.js.map +1 -1
  62. package/dist/src/daemon/daemon.js +97 -18
  63. package/dist/src/daemon/daemon.js.map +1 -1
  64. package/dist/src/daemon/socket.d.ts +6 -4
  65. package/dist/src/daemon/socket.d.ts.map +1 -1
  66. package/dist/src/daemon/socket.js +62 -18
  67. package/dist/src/daemon/socket.js.map +1 -1
  68. package/dist/src/indexer/cli.d.ts +1 -0
  69. package/dist/src/indexer/cli.d.ts.map +1 -1
  70. package/dist/src/indexer/cli.js +503 -257
  71. package/dist/src/indexer/cli.js.map +1 -1
  72. package/dist/src/indexer/codeintel.d.ts +1 -1
  73. package/dist/src/indexer/codeintel.d.ts.map +1 -1
  74. package/dist/src/indexer/codeintel.js +296 -3
  75. package/dist/src/indexer/codeintel.js.map +1 -1
  76. package/dist/src/indexer/dart/analyze.d.ts +29 -0
  77. package/dist/src/indexer/dart/analyze.d.ts.map +1 -0
  78. package/dist/src/indexer/dart/analyze.js +452 -0
  79. package/dist/src/indexer/dart/analyze.js.map +1 -0
  80. package/dist/src/indexer/dart/client.d.ts +113 -0
  81. package/dist/src/indexer/dart/client.d.ts.map +1 -0
  82. package/dist/src/indexer/dart/client.js +444 -0
  83. package/dist/src/indexer/dart/client.js.map +1 -0
  84. package/dist/src/indexer/dart/config.d.ts +36 -0
  85. package/dist/src/indexer/dart/config.d.ts.map +1 -0
  86. package/dist/src/indexer/dart/config.js +62 -0
  87. package/dist/src/indexer/dart/config.js.map +1 -0
  88. package/dist/src/indexer/dart/dependencies.d.ts +17 -0
  89. package/dist/src/indexer/dart/dependencies.d.ts.map +1 -0
  90. package/dist/src/indexer/dart/dependencies.js +102 -0
  91. package/dist/src/indexer/dart/dependencies.js.map +1 -0
  92. package/dist/src/indexer/dart/pathKey.d.ts +40 -0
  93. package/dist/src/indexer/dart/pathKey.d.ts.map +1 -0
  94. package/dist/src/indexer/dart/pathKey.js +72 -0
  95. package/dist/src/indexer/dart/pathKey.js.map +1 -0
  96. package/dist/src/indexer/dart/poolGate.d.ts +57 -0
  97. package/dist/src/indexer/dart/poolGate.d.ts.map +1 -0
  98. package/dist/src/indexer/dart/poolGate.js +87 -0
  99. package/dist/src/indexer/dart/poolGate.js.map +1 -0
  100. package/dist/src/indexer/dart/sdk.d.ts +40 -0
  101. package/dist/src/indexer/dart/sdk.d.ts.map +1 -0
  102. package/dist/src/indexer/dart/sdk.js +167 -0
  103. package/dist/src/indexer/dart/sdk.js.map +1 -0
  104. package/dist/src/indexer/dart/transform.d.ts +17 -0
  105. package/dist/src/indexer/dart/transform.d.ts.map +1 -0
  106. package/dist/src/indexer/dart/transform.js +157 -0
  107. package/dist/src/indexer/dart/transform.js.map +1 -0
  108. package/dist/src/indexer/dart/types.d.ts +137 -0
  109. package/dist/src/indexer/dart/types.d.ts.map +1 -0
  110. package/dist/src/indexer/dart/types.js +5 -0
  111. package/dist/src/indexer/dart/types.js.map +1 -0
  112. package/dist/src/indexer/git.d.ts +1 -0
  113. package/dist/src/indexer/git.d.ts.map +1 -1
  114. package/dist/src/indexer/git.js +8 -0
  115. package/dist/src/indexer/git.js.map +1 -1
  116. package/dist/src/indexer/language.d.ts.map +1 -1
  117. package/dist/src/indexer/language.js +1 -0
  118. package/dist/src/indexer/language.js.map +1 -1
  119. package/dist/src/indexer/queue.d.ts +19 -0
  120. package/dist/src/indexer/queue.d.ts.map +1 -0
  121. package/dist/src/indexer/queue.js +50 -0
  122. package/dist/src/indexer/queue.js.map +1 -0
  123. package/dist/src/indexer/schema.d.ts +61 -1
  124. package/dist/src/indexer/schema.d.ts.map +1 -1
  125. package/dist/src/indexer/schema.js +253 -2
  126. package/dist/src/indexer/schema.js.map +1 -1
  127. package/dist/src/indexer/watch.d.ts +21 -0
  128. package/dist/src/indexer/watch.d.ts.map +1 -1
  129. package/dist/src/indexer/watch.js +189 -28
  130. package/dist/src/indexer/watch.js.map +1 -1
  131. package/dist/src/server/abbreviations.d.ts +47 -0
  132. package/dist/src/server/abbreviations.d.ts.map +1 -0
  133. package/dist/src/server/abbreviations.js +71 -0
  134. package/dist/src/server/abbreviations.js.map +1 -0
  135. package/dist/src/server/boost-profiles.d.ts +63 -0
  136. package/dist/src/server/boost-profiles.d.ts.map +1 -0
  137. package/dist/src/server/boost-profiles.js +86 -0
  138. package/dist/src/server/boost-profiles.js.map +1 -0
  139. package/dist/src/server/context.d.ts +7 -0
  140. package/dist/src/server/context.d.ts.map +1 -1
  141. package/dist/src/server/handlers.d.ts +3 -2
  142. package/dist/src/server/handlers.d.ts.map +1 -1
  143. package/dist/src/server/handlers.js +542 -96
  144. package/dist/src/server/handlers.js.map +1 -1
  145. package/dist/src/server/indexBootstrap.d.ts.map +1 -1
  146. package/dist/src/server/indexBootstrap.js +4 -1
  147. package/dist/src/server/indexBootstrap.js.map +1 -1
  148. package/dist/src/server/main.d.ts.map +1 -1
  149. package/dist/src/server/main.js +112 -30
  150. package/dist/src/server/main.js.map +1 -1
  151. package/dist/src/server/rpc.d.ts.map +1 -1
  152. package/dist/src/server/rpc.js +28 -9
  153. package/dist/src/server/rpc.js.map +1 -1
  154. package/dist/src/server/rrf.d.ts +86 -0
  155. package/dist/src/server/rrf.d.ts.map +1 -0
  156. package/dist/src/server/rrf.js +108 -0
  157. package/dist/src/server/rrf.js.map +1 -0
  158. package/dist/src/server/runtime.d.ts.map +1 -1
  159. package/dist/src/server/runtime.js +45 -6
  160. package/dist/src/server/runtime.js.map +1 -1
  161. package/dist/src/server/scoring.d.ts.map +1 -1
  162. package/dist/src/server/scoring.js +19 -0
  163. package/dist/src/server/scoring.js.map +1 -1
  164. package/dist/src/shared/cli/args.d.ts +70 -0
  165. package/dist/src/shared/cli/args.d.ts.map +1 -0
  166. package/dist/src/shared/cli/args.js +84 -0
  167. package/dist/src/shared/cli/args.js.map +1 -0
  168. package/dist/src/shared/duckdb.d.ts.map +1 -1
  169. package/dist/src/shared/duckdb.js +9 -0
  170. package/dist/src/shared/duckdb.js.map +1 -1
  171. package/dist/src/shared/embedding/engine.d.ts +38 -0
  172. package/dist/src/shared/embedding/engine.d.ts.map +1 -0
  173. package/dist/src/shared/embedding/engine.js +6 -0
  174. package/dist/src/shared/embedding/engine.js.map +1 -0
  175. package/dist/src/shared/embedding/lsh-engine.d.ts +11 -0
  176. package/dist/src/shared/embedding/lsh-engine.d.ts.map +1 -0
  177. package/dist/src/shared/embedding/lsh-engine.js +14 -0
  178. package/dist/src/shared/embedding/lsh-engine.js.map +1 -0
  179. package/dist/src/shared/embedding/registry.d.ts +25 -0
  180. package/dist/src/shared/embedding/registry.d.ts.map +1 -0
  181. package/dist/src/shared/embedding/registry.js +50 -0
  182. package/dist/src/shared/embedding/registry.js.map +1 -0
  183. package/dist/src/shared/embedding/semantic-engine.d.ts +14 -0
  184. package/dist/src/shared/embedding/semantic-engine.d.ts.map +1 -0
  185. package/dist/src/shared/embedding/semantic-engine.js +50 -0
  186. package/dist/src/shared/embedding/semantic-engine.js.map +1 -0
  187. package/dist/src/shared/models/model-manager.d.ts +38 -0
  188. package/dist/src/shared/models/model-manager.d.ts.map +1 -0
  189. package/dist/src/shared/models/model-manager.js +116 -0
  190. package/dist/src/shared/models/model-manager.js.map +1 -0
  191. package/dist/src/shared/models/model-manifest.d.ts +22 -0
  192. package/dist/src/shared/models/model-manifest.d.ts.map +1 -0
  193. package/dist/src/shared/models/model-manifest.js +24 -0
  194. package/dist/src/shared/models/model-manifest.js.map +1 -0
  195. package/dist/src/shared/utils/path.d.ts +46 -0
  196. package/dist/src/shared/utils/path.d.ts.map +1 -0
  197. package/dist/src/shared/utils/path.js +94 -0
  198. package/dist/src/shared/utils/path.js.map +1 -0
  199. package/dist/src/shared/utils/socket.d.ts +61 -0
  200. package/dist/src/shared/utils/socket.d.ts.map +1 -0
  201. package/dist/src/shared/utils/socket.js +156 -0
  202. package/dist/src/shared/utils/socket.js.map +1 -0
  203. package/dist/src/shared/utils/validation.d.ts +14 -0
  204. package/dist/src/shared/utils/validation.d.ts.map +1 -0
  205. package/dist/src/shared/utils/validation.js +22 -0
  206. package/dist/src/shared/utils/validation.js.map +1 -0
  207. package/package.json +14 -1
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Dart Analysis Server を使った Dart ファイル解析のエントリポイント
3
+ */
4
+ import type { SymbolRecord, SnippetRecord, DependencyRecord } from "../codeintel.js";
5
+ /**
6
+ * Dart ファイルを解析してシンボル・スニペット・依存関係を抽出
7
+ *
8
+ * Fix #5: status フィールドを追加してエラーをリトライ可能にする
9
+ *
10
+ * @param filePath - ファイルパス(相対パスの場合は workspaceRoot からの相対パス)
11
+ * @param content - ファイル内容
12
+ * @param workspaceRoot - ワークスペースルート(絶対パス)
13
+ * @returns { symbols, snippets, dependencies, status, error? }
14
+ */
15
+ export declare function analyzeDartSource(filePath: string, content: string, workspaceRoot: string): Promise<{
16
+ symbols: SymbolRecord[];
17
+ snippets: SnippetRecord[];
18
+ dependencies: DependencyRecord[];
19
+ status: "success" | "error" | "sdk_unavailable";
20
+ error?: string;
21
+ }>;
22
+ /**
23
+ * 全クライアントのクリーンアップ
24
+ *
25
+ * プロセス終了時やインデクサー終了時に呼ぶ
26
+ * 全てのワークスペースのクライアントを強制的に dispose する
27
+ */
28
+ export declare function cleanup(): Promise<void>;
29
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../../src/indexer/dart/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA+TrF;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IACT,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,iBAAiB,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAkDD;AAKD;;;;;GAKG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAwE7C"}
@@ -0,0 +1,452 @@
1
+ /**
2
+ * Dart Analysis Server を使った Dart ファイル解析のエントリポイント
3
+ */
4
+ import path from "node:path";
5
+ import { DartAnalysisClient } from "./client.js";
6
+ import { parseMaxClients, parseClientWaitMs, parseIdleTtlMs } from "./config.js";
7
+ import { normalizeWorkspaceKey } from "./pathKey.js";
8
+ import { createCapacityLimiter } from "./poolGate.js";
9
+ import { isDartSdkAvailable } from "./sdk.js";
10
+ import { outlineToSymbols } from "./transform.js";
11
+ const clients = new Map();
12
+ // Fix #2: アイドルTTL (デフォルト: 60秒、環境変数で調整可能)
13
+ // Fix #6: ?? 演算子を使用して IDLE_TTL_MS=0 でTTLを無効化可能にする
14
+ // Fix #20 (Codex Critical Review Round 3): Extracted to config.ts for testability
15
+ const IDLE_TTL_MS = parseIdleTtlMs();
16
+ // Fix #4: 最大クライアント数制限(デフォルト: 8、環境変数で調整可能)
17
+ // 大規模モノレポでメモリ枯渇を防ぐため、LRU evictionを実施
18
+ // Fix #18 (Codex Critical Review Round 3): Validate MAX_CLIENTS to prevent NaN
19
+ // Extracted to config.ts for testability
20
+ const MAX_CLIENTS = parseMaxClients();
21
+ // Fix #1: Client wait timeout (default: 10000ms = 10 seconds)
22
+ // Extracted to config.ts for testability
23
+ const DART_ANALYSIS_CLIENT_WAIT_MS = parseClientWaitMs();
24
+ // Fix #1 & #2: Pool capacity limiter to enforce MAX_CLIENTS
25
+ const poolLimiter = createCapacityLimiter(MAX_CLIENTS);
26
+ // Fix #24 (Codex Critical Review Round 4): Shutdown flag to prevent client respawn during cleanup
27
+ let isShuttingDown = false;
28
+ /**
29
+ * Dart Analysis Client の取得(参照カウント方式)
30
+ *
31
+ * 進行中のリクエストがあるクライアントは dispose されず、
32
+ * 全ての参照が解放されるまで維持される
33
+ *
34
+ * @param workspaceRoot - ワークスペースルート(リポジトリパス)
35
+ * @returns DartAnalysisClient インスタンス
36
+ */
37
+ async function acquireClient(workspaceRoot) {
38
+ // Fix #24 (Codex Critical Review Round 4): Check shutdown flag
39
+ if (isShuttingDown) {
40
+ throw new Error(`[acquireClient] System is shutting down. Cannot acquire new clients for ${workspaceRoot}.`);
41
+ }
42
+ // Fix #3: Normalize workspace path for Windows case-insensitivity
43
+ const workspaceKey = normalizeWorkspaceKey(workspaceRoot);
44
+ let entry = clients.get(workspaceKey);
45
+ // Fix #9 (Codex Critical Review): Track whether this call acquired a permit
46
+ // to prevent double release when concurrent requests wait on existing initPromise
47
+ let didAcquirePermit = false;
48
+ if (!entry) {
49
+ // Fix #10 (Codex Critical Review): Try LRU eviction BEFORE acquire()
50
+ // This ensures eviction actually runs when pool is full, instead of timing out
51
+ if (clients.size >= MAX_CLIENTS) {
52
+ // Find least recently used idle client
53
+ let lruWorkspace = null;
54
+ let oldestTime = Infinity;
55
+ for (const [ws, ent] of clients.entries()) {
56
+ if (ent.refs === 0 && ent.lastUsed < oldestTime) {
57
+ oldestTime = ent.lastUsed;
58
+ lruWorkspace = ws;
59
+ }
60
+ }
61
+ // Evict LRU client synchronously to free up permit slot
62
+ if (lruWorkspace) {
63
+ const lruEntry = clients.get(lruWorkspace);
64
+ if (lruEntry.idleTimer) {
65
+ clearTimeout(lruEntry.idleTimer);
66
+ }
67
+ // Fix #28 (Codex Critical Review Round 5): Check delete() return value to prevent double eviction
68
+ const wasDeleted = clients.delete(lruWorkspace);
69
+ if (wasDeleted) {
70
+ // Only this thread successfully deleted the entry
71
+ console.log(`[acquireClient] Evicting LRU client for ${lruWorkspace} (pool size: ${MAX_CLIENTS})`);
72
+ // Dispose synchronously and release permit immediately
73
+ await lruEntry.client.dispose({ timeoutMs: 2000 }).catch((error) => {
74
+ console.error(`[acquireClient] Failed to dispose LRU client for ${lruWorkspace}:`, error);
75
+ });
76
+ poolLimiter.release(); // Free up slot for new client
77
+ }
78
+ else {
79
+ // Another thread already evicted this client - this is safe, just retry
80
+ }
81
+ }
82
+ }
83
+ // Fix #1 & #2: Acquire pool permit before creating new client
84
+ // This enforces MAX_CLIENTS limit and provides waiting queue with timeout
85
+ await poolLimiter.acquire({ timeoutMs: DART_ANALYSIS_CLIENT_WAIT_MS });
86
+ didAcquirePermit = true; // Mark that we acquired a permit
87
+ // Re-check after await (another request might have created the same client)
88
+ entry = clients.get(workspaceKey);
89
+ if (entry) {
90
+ // Client was created by concurrent request - release permit and use existing
91
+ poolLimiter.release();
92
+ didAcquirePermit = false; // We released it
93
+ }
94
+ else {
95
+ // Fix #23 (Codex Critical Review Round 4): Retry LRU eviction if pool is still full
96
+ // Instead of immediately throwing, try to evict idle clients and retry
97
+ while (clients.size >= MAX_CLIENTS) {
98
+ // Find least recently used idle client
99
+ let lruWorkspace = null;
100
+ let oldestTime = Infinity;
101
+ for (const [ws, ent] of clients.entries()) {
102
+ if (ent.refs === 0 && ent.lastUsed < oldestTime) {
103
+ oldestTime = ent.lastUsed;
104
+ lruWorkspace = ws;
105
+ }
106
+ }
107
+ if (lruWorkspace) {
108
+ // Evict LRU client to make space
109
+ const lruEntry = clients.get(lruWorkspace);
110
+ if (lruEntry.idleTimer) {
111
+ clearTimeout(lruEntry.idleTimer);
112
+ }
113
+ // Fix #28 (Codex Critical Review Round 5): Check delete() return value to prevent double eviction
114
+ const wasDeleted = clients.delete(lruWorkspace);
115
+ if (wasDeleted) {
116
+ // Only this thread successfully deleted the entry
117
+ console.log(`[acquireClient] Pool full after acquire, evicting LRU client for ${lruWorkspace}`);
118
+ await lruEntry.client.dispose({ timeoutMs: 2000 }).catch((error) => {
119
+ console.error(`[acquireClient] Failed to dispose LRU client for ${lruWorkspace}:`, error);
120
+ });
121
+ // Note: We don't release permit here because we already acquired one
122
+ break; // Exit retry loop - we made space
123
+ }
124
+ else {
125
+ // Another thread already evicted this client - retry with updated state
126
+ continue;
127
+ }
128
+ }
129
+ else {
130
+ // No idle clients available - all clients are active
131
+ poolLimiter.release();
132
+ didAcquirePermit = false;
133
+ throw new Error(`[acquireClient] Dart Analysis Server pool is full with ${MAX_CLIENTS} active clients. ` +
134
+ `Cannot create new client for workspace ${workspaceRoot}. ` +
135
+ `Consider increasing DART_ANALYSIS_MAX_CLIENTS or reducing concurrent indexing.`);
136
+ }
137
+ }
138
+ // Create new client only if we still don't have one
139
+ const client = new DartAnalysisClient({
140
+ workspaceRoots: [workspaceRoot],
141
+ });
142
+ entry = {
143
+ client,
144
+ refs: 1, // Fix #12 (Codex Critical Review): Reserve immediately to prevent LRU race
145
+ initPromise: client.initialize().then(() => client),
146
+ idleTimer: null, // Fix #2: アイドルタイマー初期化
147
+ lastUsed: Date.now(), // Fix #2: 最終使用時刻初期化
148
+ };
149
+ clients.set(workspaceKey, entry);
150
+ }
151
+ }
152
+ // Fix #2: アイドルタイマーをクリア(再利用時)
153
+ if (entry.idleTimer) {
154
+ clearTimeout(entry.idleTimer);
155
+ entry.idleTimer = null;
156
+ }
157
+ // Fix #3: 初期化を待つ(失敗時はエントリを削除してリトライ可能にする)
158
+ // Fix #17 (Codex Critical Review Round 3): Track concurrent waiters for refs accounting
159
+ const waitingOnInit = entry.initPromise !== null && !didAcquirePermit;
160
+ if (waitingOnInit) {
161
+ // Concurrent request waiting on initialization - increment refs
162
+ entry.refs += 1;
163
+ }
164
+ if (entry.initPromise) {
165
+ try {
166
+ await entry.initPromise;
167
+ entry.initPromise = null;
168
+ }
169
+ catch (error) {
170
+ // 初期化失敗: エントリを削除して次回リトライ可能にする
171
+ clients.delete(workspaceKey);
172
+ // Fix #3: skipShutdown で即時強制終了(二重タイムアウト回避)
173
+ await entry.client.dispose({ skipShutdown: true }).catch(() => { });
174
+ // Fix #17: Roll back refs increment for waiting requests
175
+ if (waitingOnInit) {
176
+ // Entry was deleted, no need to decrement
177
+ }
178
+ // Fix #9 (Codex Critical Review): Only release if WE acquired the permit
179
+ // Concurrent requests waiting on initPromise didn't acquire permits
180
+ if (didAcquirePermit) {
181
+ poolLimiter.release();
182
+ }
183
+ throw error;
184
+ }
185
+ }
186
+ else {
187
+ // Fix #12: Entry exists and is initialized - increment refs for this acquisition
188
+ entry.refs += 1;
189
+ }
190
+ entry.lastUsed = Date.now(); // Fix #2: 最終使用時刻更新
191
+ return entry.client;
192
+ }
193
+ /**
194
+ * Dart Analysis Client の解放(参照カウント + アイドルTTL方式)
195
+ *
196
+ * Fix #2: 参照カウントが 0 になったら即座に dispose せず、アイドルTTL後に dispose
197
+ * これによりファイル毎のサーバー再起動を回避し、性能を大幅に改善
198
+ *
199
+ * @param workspaceRoot - ワークスペースルート(リポジトリパス)
200
+ */
201
+ function releaseClient(workspaceRoot) {
202
+ // Fix #3: Normalize workspace path for Windows case-insensitivity
203
+ const workspaceKey = normalizeWorkspaceKey(workspaceRoot);
204
+ const entry = clients.get(workspaceKey);
205
+ if (!entry) {
206
+ console.warn(`[releaseClient] No entry found for ${workspaceRoot}`);
207
+ return;
208
+ }
209
+ entry.refs -= 1;
210
+ // Fix #14 (Codex Critical Review): Defensive check for refs underflow
211
+ if (entry.refs < 0) {
212
+ console.error(`[releaseClient] refs underflow for ${workspaceRoot}: ${entry.refs}. ` +
213
+ `This indicates a bug in acquire/release pairing.`);
214
+ entry.refs = 0;
215
+ }
216
+ // Fix #2: refs が 0 になったらアイドルタイマーを起動(即座に dispose しない)
217
+ // Fix #20 (Codex Critical Review Round 3): IDLE_TTL_MS=0 means "disable TTL" (unlimited hold)
218
+ // Fix #22 (Codex Critical Review Round 4): Check queue depth - if waiters exist, skip TTL and release immediately
219
+ if (entry.refs === 0) {
220
+ const stats = poolLimiter.stats();
221
+ // If there are waiters in the queue, skip TTL and release permit immediately
222
+ if (stats.queueDepth > 0) {
223
+ console.log(`[releaseClient] Pool has ${stats.queueDepth} waiters, disposing idle client for ${workspaceRoot} immediately`);
224
+ clients.delete(workspaceKey);
225
+ entry.client
226
+ .dispose({ timeoutMs: 2000 })
227
+ .catch((error) => {
228
+ console.error(`[releaseClient] Failed to dispose client for ${workspaceRoot}:`, error);
229
+ })
230
+ .finally(() => {
231
+ poolLimiter.release();
232
+ });
233
+ return;
234
+ }
235
+ if (IDLE_TTL_MS === 0) {
236
+ // TTL disabled: keep client alive indefinitely (LRU will handle eviction if pool full)
237
+ return;
238
+ }
239
+ const delay = Math.max(1, IDLE_TTL_MS);
240
+ entry.idleTimer = setTimeout(() => {
241
+ // タイムアウト時に再度 refs をチェック(タイマー中に再取得された可能性)
242
+ if (entry.refs === 0) {
243
+ console.log(`[releaseClient] Disposing idle client for ${workspaceRoot}`);
244
+ clients.delete(workspaceKey);
245
+ entry.client
246
+ .dispose({ timeoutMs: 2000 })
247
+ .catch((error) => {
248
+ console.error(`[releaseClient] Failed to dispose client for ${workspaceRoot}:`, error);
249
+ })
250
+ .finally(() => {
251
+ // Fix #1: Release pool permit after disposal
252
+ poolLimiter.release();
253
+ });
254
+ }
255
+ }, delay);
256
+ // Fix #1: Node.jsがタイマー待ちでハングしないように unref() を呼ぶ
257
+ // これによりCLIプロセスがアイドルタイマーを待たずに終了できる
258
+ entry.idleTimer.unref();
259
+ }
260
+ }
261
+ /**
262
+ * Dart ファイルを解析してシンボル・スニペット・依存関係を抽出
263
+ *
264
+ * Fix #5: status フィールドを追加してエラーをリトライ可能にする
265
+ *
266
+ * @param filePath - ファイルパス(相対パスの場合は workspaceRoot からの相対パス)
267
+ * @param content - ファイル内容
268
+ * @param workspaceRoot - ワークスペースルート(絶対パス)
269
+ * @returns { symbols, snippets, dependencies, status, error? }
270
+ */
271
+ export async function analyzeDartSource(filePath, content, workspaceRoot) {
272
+ // Dart SDK が利用できない場合は空の結果を返す
273
+ if (!isDartSdkAvailable()) {
274
+ console.warn(`[analyzeDartSource] Dart SDK not available, skipping analysis for ${filePath}`);
275
+ return { symbols: [], snippets: [], dependencies: [], status: "sdk_unavailable" };
276
+ }
277
+ // Analysis Server は絶対パスを要求するため、相対パスの場合は絶対パスに変換
278
+ const absoluteFilePath = path.isAbsolute(filePath)
279
+ ? filePath
280
+ : path.resolve(workspaceRoot, filePath);
281
+ // Fix #26 (Codex Critical Review Round 4): Wrap acquireClient in try/catch to prevent index rollback
282
+ // Pool errors and initialization failures should not bubble up and rollback entire repository index
283
+ let client = null;
284
+ try {
285
+ // クライアントを取得(参照カウント増加)
286
+ client = await acquireClient(workspaceRoot);
287
+ const payload = await client.analyzeFile(absoluteFilePath, content);
288
+ const { symbols, snippets } = outlineToSymbols(payload.outline, content);
289
+ // Phase 3 (disabled): 依存関係を取得
290
+ // TODO: analysis.getLibraryDependencies は workspace 全体の依存関係を返すため、
291
+ // ファイル単位の依存関係を正しく取得できない。
292
+ // Phase 4 で analysis.getOutline から import/export ディレクティブを抽出するか、
293
+ // analysis.getNavigation を使用した実装に切り替える必要がある。
294
+ // 現在は誤ったデータを返さないために空配列を返す。
295
+ const dependencies = [];
296
+ return { symbols, snippets, dependencies, status: "success" };
297
+ }
298
+ catch (error) {
299
+ console.error(`[analyzeDartSource] Failed to analyze ${absoluteFilePath}:`, error);
300
+ // Fix #5: エラー時はstatusとerrorフィールドを返して呼び出し元がリトライ可能にする
301
+ // Fix #26: This now includes pool acquisition errors and initialization failures
302
+ return {
303
+ symbols: [],
304
+ snippets: [],
305
+ dependencies: [],
306
+ status: "error",
307
+ error: error instanceof Error ? error.message : String(error),
308
+ };
309
+ }
310
+ finally {
311
+ // Fix #26: Only release if client was successfully acquired
312
+ if (client) {
313
+ releaseClient(workspaceRoot);
314
+ }
315
+ }
316
+ }
317
+ // Fix #13 (Codex Critical Review): Re-entrancy guard for cleanup()
318
+ let cleanupInProgress = false;
319
+ /**
320
+ * 全クライアントのクリーンアップ
321
+ *
322
+ * プロセス終了時やインデクサー終了時に呼ぶ
323
+ * 全てのワークスペースのクライアントを強制的に dispose する
324
+ */
325
+ export async function cleanup() {
326
+ // Fix #13: Prevent concurrent/double cleanup
327
+ if (cleanupInProgress) {
328
+ console.warn("[cleanup] Already in progress, skipping duplicate call");
329
+ return;
330
+ }
331
+ cleanupInProgress = true;
332
+ // Fix #24 (Codex Critical Review Round 4): Set shutdown flag to prevent new client acquisitions
333
+ isShuttingDown = true;
334
+ try {
335
+ const disposePromises = [];
336
+ const entriesToCleanup = Array.from(clients.entries()); // Snapshot
337
+ // Fix #13: Delete all entries immediately to prevent concurrent acquireClient() access
338
+ clients.clear();
339
+ // Fix #30 (Codex Critical Review Round 5): Check pool state before releasing permits
340
+ // to prevent available permits from exceeding maxCapacity
341
+ const poolStats = poolLimiter.stats();
342
+ const permitsToRelease = Math.min(entriesToCleanup.length, poolStats.maxCapacity - poolStats.available);
343
+ if (permitsToRelease < entriesToCleanup.length) {
344
+ console.warn(`[cleanup] Pool has ${poolStats.available}/${poolStats.maxCapacity} available permits. ` +
345
+ `Only releasing ${permitsToRelease} of ${entriesToCleanup.length} to prevent overflow.`);
346
+ }
347
+ let releasedCount = 0;
348
+ for (const [workspaceRoot, entry] of entriesToCleanup) {
349
+ // Fix #2: アイドルタイマーをクリア
350
+ if (entry.idleTimer) {
351
+ clearTimeout(entry.idleTimer);
352
+ entry.idleTimer = null;
353
+ }
354
+ // Fix #8 (Codex Critical Review): cleanup() で各クライアント dispose 後に permit を release
355
+ // これにより cleanup() 後も poolLimiter が正常に機能し、再利用可能になる
356
+ const disposeAndRelease = async () => {
357
+ try {
358
+ if (entry.initPromise) {
359
+ const client = await entry.initPromise;
360
+ await client.dispose({ timeoutMs: 2000 });
361
+ }
362
+ else {
363
+ await entry.client.dispose({ timeoutMs: 2000 });
364
+ }
365
+ }
366
+ catch (error) {
367
+ console.error(`[cleanup] Failed to dispose client for ${workspaceRoot}:`, error);
368
+ }
369
+ finally {
370
+ // Fix #30: Only release if we haven't exceeded the safe count
371
+ if (releasedCount < permitsToRelease) {
372
+ poolLimiter.release();
373
+ releasedCount++;
374
+ }
375
+ }
376
+ };
377
+ disposePromises.push(disposeAndRelease());
378
+ }
379
+ await Promise.allSettled(disposePromises);
380
+ }
381
+ finally {
382
+ cleanupInProgress = false;
383
+ // Fix #24: Reset shutdown flag after cleanup completes (allows re-initialization in tests)
384
+ isShuttingDown = false;
385
+ }
386
+ }
387
+ /**
388
+ * Fix #1: プロセスライフサイクルフックの登録
389
+ *
390
+ * beforeExit/シグナルハンドラで非同期 cleanup を実行し、
391
+ * exit フォールバックでは同期的な強制終了のみ行う
392
+ *
393
+ * Fix #29 (Codex Critical Review Round 5): Guard against multiple registrations
394
+ */
395
+ let lifecycleHooksRegistered = false;
396
+ function registerDartLifecycleHooks() {
397
+ // Fix #29: Prevent duplicate registration in test environments with vi.resetModules()
398
+ if (lifecycleHooksRegistered) {
399
+ return;
400
+ }
401
+ lifecycleHooksRegistered = true;
402
+ let cleanupInProgress = false;
403
+ const gracefulShutdown = async (signal) => {
404
+ if (cleanupInProgress) {
405
+ return; // 二重実行防止
406
+ }
407
+ cleanupInProgress = true;
408
+ console.log(`[DartLifecycle] Received ${signal}, cleaning up Analysis Server processes...`);
409
+ try {
410
+ await cleanup();
411
+ console.log(`[DartLifecycle] Cleanup completed successfully`);
412
+ }
413
+ catch (error) {
414
+ console.error(`[DartLifecycle] Cleanup failed:`, error);
415
+ }
416
+ finally {
417
+ // Fix #29: Set exit code instead of calling process.exit() from library code
418
+ // Let the parent application handle exit
419
+ if (signal !== "beforeExit") {
420
+ process.exitCode = signal === "SIGTERM" ? 0 : 1;
421
+ }
422
+ }
423
+ };
424
+ // Fix #1: beforeExit で非同期 cleanup
425
+ process.once("beforeExit", () => gracefulShutdown("beforeExit"));
426
+ // Fix #1: シグナルハンドラ
427
+ process.once("SIGINT", () => gracefulShutdown("SIGINT"));
428
+ process.once("SIGTERM", () => gracefulShutdown("SIGTERM"));
429
+ process.once("SIGQUIT", () => gracefulShutdown("SIGQUIT"));
430
+ // Fix #1: 未捕捉例外時のクリーンアップ
431
+ process.once("uncaughtException", async (error) => {
432
+ console.error(`[DartLifecycle] Uncaught exception:`, error);
433
+ await gracefulShutdown("uncaughtException");
434
+ process.exit(1);
435
+ });
436
+ // Fix #1: exit フォールバック - 同期的な強制終了のみ
437
+ process.once("exit", () => {
438
+ // 非同期処理は実行されないため、同期的にプロセスを強制終了
439
+ for (const [, entry] of clients.entries()) {
440
+ try {
441
+ entry.client.forceKill();
442
+ }
443
+ catch {
444
+ // exit時なのでエラーは無視
445
+ }
446
+ }
447
+ clients.clear();
448
+ });
449
+ }
450
+ // Fix #1: ライフサイクルフックを登録
451
+ registerDartLifecycleHooks();
452
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../../src/indexer/dart/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * DartAnalysisClient: Dart Analysis Server との JSON-RPC 通信クライアント
3
+ */
4
+ import type { GetLibraryDependenciesResult, DartAnalysisPayload } from "./types.js";
5
+ export interface DartAnalysisClientOptions {
6
+ workspaceRoots: string[];
7
+ logPath?: string;
8
+ }
9
+ export interface DisposeOptions {
10
+ timeoutMs?: number;
11
+ skipShutdown?: boolean;
12
+ }
13
+ /**
14
+ * DAPProtocolError: Analysis Server プロトコルエラー
15
+ */
16
+ export declare class DAPProtocolError extends Error {
17
+ code?: number | undefined;
18
+ data?: unknown | undefined;
19
+ constructor(message: string, code?: number | undefined, data?: unknown | undefined);
20
+ }
21
+ /**
22
+ * DartAnalysisClient: Dart Analysis Server プロセス管理と JSON-RPC 通信
23
+ */
24
+ export declare class DartAnalysisClient {
25
+ private options;
26
+ private process;
27
+ private readline;
28
+ private requestId;
29
+ private pendingRequests;
30
+ private serverVersion;
31
+ private initialized;
32
+ private initializePromise;
33
+ private fileQueues;
34
+ constructor(options: DartAnalysisClientOptions);
35
+ /**
36
+ * Analysis Server プロセスを起動し初期化する
37
+ *
38
+ * 並行呼び出しを安全に処理: 既に初期化中の場合は同じPromiseを返す
39
+ *
40
+ * @throws MissingToolError - Dart SDK が見つからない場合
41
+ * @throws DAPProtocolError - サーバー起動失敗時
42
+ */
43
+ initialize(): Promise<void>;
44
+ /**
45
+ * ファイルを解析してシンボル情報を取得(MVP版)
46
+ *
47
+ * Fix #2: 同一ファイルの並列解析でオーバーレイ競合を防ぐため、
48
+ * ファイル単位でリクエストをシリアライズ
49
+ *
50
+ * @param filePath - 解析対象ファイルの絶対パス
51
+ * @param content - ファイル内容
52
+ * @returns DartAnalysisPayload
53
+ */
54
+ analyzeFile(filePath: string, content: string): Promise<DartAnalysisPayload>;
55
+ /**
56
+ * ライブラリの依存関係を取得(Phase 3)
57
+ *
58
+ * @param _filePath - 解析対象ファイルの絶対パス (現在未使用: workspace全体の依存関係を返すため)
59
+ * @returns GetLibraryDependenciesResult
60
+ */
61
+ getLibraryDependencies(_filePath: string): Promise<GetLibraryDependenciesResult>;
62
+ /**
63
+ * Analysis Server プロセスを終了
64
+ *
65
+ * Fix #3: dispose に options パラメータを追加して柔軟な終了処理を実現
66
+ *
67
+ * @param options - 終了オプション
68
+ * @param options.timeoutMs - Graceful shutdown timeout (デフォルト: 5000ms)
69
+ * @param options.skipShutdown - server.shutdown RPC をスキップして即時強制終了
70
+ */
71
+ dispose(options?: DisposeOptions): Promise<void>;
72
+ /**
73
+ * Fix #1 & #3: プロセスを同期的に強制終了
74
+ *
75
+ * exit フォールバックや緊急時に使用
76
+ * Windows対応: SIGKILLは存在しないため、プラットフォーム別に処理
77
+ */
78
+ forceKill(): void;
79
+ /**
80
+ * JSON-RPC リクエスト送信
81
+ *
82
+ * Fix #3: タイムアウト時間を可変にして dispose や初期化での短縮タイムアウトを実現
83
+ *
84
+ * @param method - RPC メソッド名
85
+ * @param params - RPC パラメータ
86
+ * @param timeoutMs - タイムアウト時間(デフォルト: 30000ms)
87
+ */
88
+ private sendRequest;
89
+ /**
90
+ * サーバーからのメッセージを処理
91
+ */
92
+ private handleMessage;
93
+ /**
94
+ * レスポンス処理
95
+ */
96
+ private handleResponse;
97
+ /**
98
+ * 通知処理
99
+ */
100
+ private handleNotification;
101
+ /**
102
+ * 全ての pending リクエストを reject
103
+ */
104
+ private rejectAllPending;
105
+ /**
106
+ * プロセス状態をクリーンアップ(Fix #1: crash recovery用)
107
+ *
108
+ * dispose() とは異なり、server.shutdown を送らずに状態のみリセット。
109
+ * プロセスクラッシュ後の再初期化を可能にする。
110
+ */
111
+ private cleanupState;
112
+ }
113
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/indexer/dart/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EAMV,4BAA4B,EAC5B,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAGhC,IAAI,CAAC,EAAE,MAAM;IACb,IAAI,CAAC,EAAE,OAAO;gBAFrB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,IAAI,CAAC,EAAE,OAAO,YAAA;CAKxB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IA0BjB,OAAO,CAAC,OAAO;IAzB3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAOnB;IACJ,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAA8B;IAGvD,OAAO,CAAC,UAAU,CAOd;gBAEgB,OAAO,EAAE,yBAAyB;IAEtD;;;;;;;OAOG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4FjC;;;;;;;;;OASG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkFlF;;;;;OAKG;IACG,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAatF;;;;;;;;OAQG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDtD;;;;;OAKG;IACH,SAAS,IAAI,IAAI;IA4BjB;;;;;;;;OAQG;YACW,WAAW;IA+BzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;CAOrB"}