@sudocode-ai/local-server 0.1.7 → 0.1.8

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 (274) hide show
  1. package/README.md +6 -0
  2. package/dist/errors/agent-errors.d.ts +43 -0
  3. package/dist/errors/agent-errors.d.ts.map +1 -0
  4. package/dist/errors/agent-errors.js +69 -0
  5. package/dist/errors/agent-errors.js.map +1 -0
  6. package/dist/execution/adapters/claude-adapter.d.ts +63 -0
  7. package/dist/execution/adapters/claude-adapter.d.ts.map +1 -0
  8. package/dist/execution/adapters/claude-adapter.js +82 -0
  9. package/dist/execution/adapters/claude-adapter.js.map +1 -0
  10. package/dist/execution/adapters/codex-adapter.d.ts +67 -0
  11. package/dist/execution/adapters/codex-adapter.d.ts.map +1 -0
  12. package/dist/execution/adapters/codex-adapter.js +183 -0
  13. package/dist/execution/adapters/codex-adapter.js.map +1 -0
  14. package/dist/execution/adapters/codex-config-builder.d.ts +30 -0
  15. package/dist/execution/adapters/codex-config-builder.d.ts.map +1 -0
  16. package/dist/execution/adapters/codex-config-builder.js +110 -0
  17. package/dist/execution/adapters/codex-config-builder.js.map +1 -0
  18. package/dist/execution/adapters/copilot-adapter.d.ts +94 -0
  19. package/dist/execution/adapters/copilot-adapter.d.ts.map +1 -0
  20. package/dist/execution/adapters/copilot-adapter.js +163 -0
  21. package/dist/execution/adapters/copilot-adapter.js.map +1 -0
  22. package/dist/execution/adapters/copilot-config-builder.d.ts +48 -0
  23. package/dist/execution/adapters/copilot-config-builder.d.ts.map +1 -0
  24. package/dist/execution/adapters/copilot-config-builder.js +125 -0
  25. package/dist/execution/adapters/copilot-config-builder.js.map +1 -0
  26. package/dist/execution/adapters/cursor-adapter.d.ts +66 -0
  27. package/dist/execution/adapters/cursor-adapter.d.ts.map +1 -0
  28. package/dist/execution/adapters/cursor-adapter.js +121 -0
  29. package/dist/execution/adapters/cursor-adapter.js.map +1 -0
  30. package/dist/execution/adapters/cursor-config-builder.d.ts +29 -0
  31. package/dist/execution/adapters/cursor-config-builder.d.ts.map +1 -0
  32. package/dist/execution/adapters/cursor-config-builder.js +49 -0
  33. package/dist/execution/adapters/cursor-config-builder.js.map +1 -0
  34. package/dist/execution/adapters/shared/config-presets.d.ts +102 -0
  35. package/dist/execution/adapters/shared/config-presets.d.ts.map +1 -0
  36. package/dist/execution/adapters/shared/config-presets.js +205 -0
  37. package/dist/execution/adapters/shared/config-presets.js.map +1 -0
  38. package/dist/execution/adapters/shared/config-utils.d.ts +95 -0
  39. package/dist/execution/adapters/shared/config-utils.d.ts.map +1 -0
  40. package/dist/execution/adapters/shared/config-utils.js +163 -0
  41. package/dist/execution/adapters/shared/config-utils.js.map +1 -0
  42. package/dist/execution/adapters/shared/index.d.ts +8 -0
  43. package/dist/execution/adapters/shared/index.d.ts.map +1 -0
  44. package/dist/execution/adapters/shared/index.js +8 -0
  45. package/dist/execution/adapters/shared/index.js.map +1 -0
  46. package/dist/execution/executors/agent-executor-wrapper.d.ts +153 -0
  47. package/dist/execution/executors/agent-executor-wrapper.d.ts.map +1 -0
  48. package/dist/execution/executors/agent-executor-wrapper.js +652 -0
  49. package/dist/execution/executors/agent-executor-wrapper.js.map +1 -0
  50. package/dist/execution/executors/executor-factory.d.ts +95 -0
  51. package/dist/execution/executors/executor-factory.d.ts.map +1 -0
  52. package/dist/execution/executors/executor-factory.js +120 -0
  53. package/dist/execution/executors/executor-factory.js.map +1 -0
  54. package/dist/execution/output/ag-ui-adapter.d.ts +0 -2
  55. package/dist/execution/output/ag-ui-adapter.d.ts.map +1 -1
  56. package/dist/execution/output/ag-ui-adapter.js +0 -2
  57. package/dist/execution/output/ag-ui-adapter.js.map +1 -1
  58. package/dist/execution/output/index.d.ts +0 -3
  59. package/dist/execution/output/index.d.ts.map +1 -1
  60. package/dist/execution/output/index.js +0 -2
  61. package/dist/execution/output/index.js.map +1 -1
  62. package/dist/execution/output/normalized-to-ag-ui-adapter.d.ts +108 -0
  63. package/dist/execution/output/normalized-to-ag-ui-adapter.d.ts.map +1 -0
  64. package/dist/execution/output/normalized-to-ag-ui-adapter.js +321 -0
  65. package/dist/execution/output/normalized-to-ag-ui-adapter.js.map +1 -0
  66. package/dist/execution/process/builders/claude.d.ts +24 -57
  67. package/dist/execution/process/builders/claude.d.ts.map +1 -1
  68. package/dist/execution/process/builders/claude.js +153 -19
  69. package/dist/execution/process/builders/claude.js.map +1 -1
  70. package/dist/execution/transport/ipc-transport-manager.d.ts +74 -0
  71. package/dist/execution/transport/ipc-transport-manager.d.ts.map +1 -0
  72. package/dist/execution/transport/ipc-transport-manager.js +104 -0
  73. package/dist/execution/transport/ipc-transport-manager.js.map +1 -0
  74. package/dist/execution/transport/transport-manager.d.ts.map +1 -1
  75. package/dist/execution/transport/transport-manager.js +3 -0
  76. package/dist/execution/transport/transport-manager.js.map +1 -1
  77. package/dist/execution/worktree/conflict-detector.d.ts +85 -0
  78. package/dist/execution/worktree/conflict-detector.d.ts.map +1 -0
  79. package/dist/execution/worktree/conflict-detector.js +129 -0
  80. package/dist/execution/worktree/conflict-detector.js.map +1 -0
  81. package/dist/execution/worktree/git-cli.d.ts +9 -0
  82. package/dist/execution/worktree/git-cli.d.ts.map +1 -1
  83. package/dist/execution/worktree/git-cli.js +10 -0
  84. package/dist/execution/worktree/git-cli.js.map +1 -1
  85. package/dist/execution/worktree/git-sync-cli.d.ts +187 -0
  86. package/dist/execution/worktree/git-sync-cli.d.ts.map +1 -0
  87. package/dist/execution/worktree/git-sync-cli.js +350 -0
  88. package/dist/execution/worktree/git-sync-cli.js.map +1 -0
  89. package/dist/execution/worktree/manager.d.ts +18 -0
  90. package/dist/execution/worktree/manager.d.ts.map +1 -1
  91. package/dist/execution/worktree/manager.js +9 -3
  92. package/dist/execution/worktree/manager.js.map +1 -1
  93. package/dist/index.d.ts +1 -3
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +132 -211
  96. package/dist/index.js.map +1 -1
  97. package/dist/middleware/project-context.d.ts +37 -0
  98. package/dist/middleware/project-context.d.ts.map +1 -0
  99. package/dist/middleware/project-context.js +91 -0
  100. package/dist/middleware/project-context.js.map +1 -0
  101. package/dist/public/assets/index-Bb_W5bUr.css +1 -0
  102. package/dist/public/assets/index-CFKL113G.js +710 -0
  103. package/dist/public/assets/index-CFKL113G.js.map +1 -0
  104. package/dist/public/assets/{react-vendor-ByUx1V_q.js → react-vendor-DiL5hC7l.js} +2 -2
  105. package/dist/public/assets/{react-vendor-ByUx1V_q.js.map → react-vendor-DiL5hC7l.js.map} +1 -1
  106. package/dist/public/assets/ui-vendor-B4WMPEfa.js +54 -0
  107. package/dist/public/assets/ui-vendor-B4WMPEfa.js.map +1 -0
  108. package/dist/public/index.html +4 -4
  109. package/dist/routes/agents.d.ts +3 -0
  110. package/dist/routes/agents.d.ts.map +1 -0
  111. package/dist/routes/agents.js +62 -0
  112. package/dist/routes/agents.js.map +1 -0
  113. package/dist/routes/config.d.ts +3 -0
  114. package/dist/routes/config.d.ts.map +1 -0
  115. package/dist/routes/config.js +25 -0
  116. package/dist/routes/config.js.map +1 -0
  117. package/dist/routes/editors.d.ts +15 -0
  118. package/dist/routes/editors.d.ts.map +1 -0
  119. package/dist/routes/editors.js +98 -0
  120. package/dist/routes/editors.js.map +1 -0
  121. package/dist/routes/executions-stream.d.ts +8 -5
  122. package/dist/routes/executions-stream.d.ts.map +1 -1
  123. package/dist/routes/executions-stream.js +10 -6
  124. package/dist/routes/executions-stream.js.map +1 -1
  125. package/dist/routes/executions.d.ts +6 -10
  126. package/dist/routes/executions.d.ts.map +1 -1
  127. package/dist/routes/executions.js +506 -54
  128. package/dist/routes/executions.js.map +1 -1
  129. package/dist/routes/feedback.d.ts +3 -2
  130. package/dist/routes/feedback.d.ts.map +1 -1
  131. package/dist/routes/feedback.js +12 -10
  132. package/dist/routes/feedback.js.map +1 -1
  133. package/dist/routes/files.d.ts +18 -0
  134. package/dist/routes/files.d.ts.map +1 -0
  135. package/dist/routes/files.js +89 -0
  136. package/dist/routes/files.js.map +1 -0
  137. package/dist/routes/issues.d.ts +3 -2
  138. package/dist/routes/issues.d.ts.map +1 -1
  139. package/dist/routes/issues.js +19 -18
  140. package/dist/routes/issues.js.map +1 -1
  141. package/dist/routes/projects.d.ts +11 -0
  142. package/dist/routes/projects.d.ts.map +1 -0
  143. package/dist/routes/projects.js +447 -0
  144. package/dist/routes/projects.js.map +1 -0
  145. package/dist/routes/relationships.d.ts +3 -2
  146. package/dist/routes/relationships.d.ts.map +1 -1
  147. package/dist/routes/relationships.js +12 -10
  148. package/dist/routes/relationships.js.map +1 -1
  149. package/dist/routes/repo-info.d.ts +3 -0
  150. package/dist/routes/repo-info.d.ts.map +1 -0
  151. package/dist/routes/repo-info.js +126 -0
  152. package/dist/routes/repo-info.js.map +1 -0
  153. package/dist/routes/specs.d.ts +3 -2
  154. package/dist/routes/specs.d.ts.map +1 -1
  155. package/dist/routes/specs.js +19 -18
  156. package/dist/routes/specs.js.map +1 -1
  157. package/dist/services/agent-registry.d.ts +140 -0
  158. package/dist/services/agent-registry.d.ts.map +1 -0
  159. package/dist/services/agent-registry.js +272 -0
  160. package/dist/services/agent-registry.js.map +1 -0
  161. package/dist/services/editor-service.d.ts +57 -0
  162. package/dist/services/editor-service.d.ts.map +1 -0
  163. package/dist/services/editor-service.js +204 -0
  164. package/dist/services/editor-service.js.map +1 -0
  165. package/dist/services/execution-changes-service.d.ts +92 -0
  166. package/dist/services/execution-changes-service.d.ts.map +1 -0
  167. package/dist/services/execution-changes-service.js +546 -0
  168. package/dist/services/execution-changes-service.js.map +1 -0
  169. package/dist/services/execution-lifecycle.d.ts +1 -0
  170. package/dist/services/execution-lifecycle.d.ts.map +1 -1
  171. package/dist/services/execution-lifecycle.js +37 -7
  172. package/dist/services/execution-lifecycle.js.map +1 -1
  173. package/dist/services/execution-logs-store.d.ts +75 -0
  174. package/dist/services/execution-logs-store.d.ts.map +1 -1
  175. package/dist/services/execution-logs-store.js +142 -2
  176. package/dist/services/execution-logs-store.js.map +1 -1
  177. package/dist/services/execution-service.d.ts +50 -58
  178. package/dist/services/execution-service.d.ts.map +1 -1
  179. package/dist/services/execution-service.js +433 -469
  180. package/dist/services/execution-service.js.map +1 -1
  181. package/dist/services/execution-worker-pool.d.ts +116 -0
  182. package/dist/services/execution-worker-pool.d.ts.map +1 -0
  183. package/dist/services/execution-worker-pool.js +326 -0
  184. package/dist/services/execution-worker-pool.js.map +1 -0
  185. package/dist/services/executions.d.ts +3 -0
  186. package/dist/services/executions.d.ts.map +1 -1
  187. package/dist/services/executions.js +11 -17
  188. package/dist/services/executions.js.map +1 -1
  189. package/dist/services/export.d.ts +8 -2
  190. package/dist/services/export.d.ts.map +1 -1
  191. package/dist/services/export.js +29 -23
  192. package/dist/services/export.js.map +1 -1
  193. package/dist/services/file-search/git-ls-files-strategy.d.ts +72 -0
  194. package/dist/services/file-search/git-ls-files-strategy.d.ts.map +1 -0
  195. package/dist/services/file-search/git-ls-files-strategy.js +176 -0
  196. package/dist/services/file-search/git-ls-files-strategy.js.map +1 -0
  197. package/dist/services/file-search/index.d.ts +9 -0
  198. package/dist/services/file-search/index.d.ts.map +1 -0
  199. package/dist/services/file-search/index.js +10 -0
  200. package/dist/services/file-search/index.js.map +1 -0
  201. package/dist/services/file-search/registry.d.ts +97 -0
  202. package/dist/services/file-search/registry.d.ts.map +1 -0
  203. package/dist/services/file-search/registry.js +140 -0
  204. package/dist/services/file-search/registry.js.map +1 -0
  205. package/dist/services/file-search/strategy.d.ts +58 -0
  206. package/dist/services/file-search/strategy.d.ts.map +1 -0
  207. package/dist/services/file-search/strategy.js +8 -0
  208. package/dist/services/file-search/strategy.js.map +1 -0
  209. package/dist/services/project-context.d.ts +69 -0
  210. package/dist/services/project-context.d.ts.map +1 -0
  211. package/dist/services/project-context.js +113 -0
  212. package/dist/services/project-context.js.map +1 -0
  213. package/dist/services/project-manager.d.ts +95 -0
  214. package/dist/services/project-manager.d.ts.map +1 -0
  215. package/dist/services/project-manager.js +388 -0
  216. package/dist/services/project-manager.js.map +1 -0
  217. package/dist/services/project-registry.d.ts +98 -0
  218. package/dist/services/project-registry.d.ts.map +1 -0
  219. package/dist/services/project-registry.js +289 -0
  220. package/dist/services/project-registry.js.map +1 -0
  221. package/dist/services/prompt-resolver.d.ts +97 -0
  222. package/dist/services/prompt-resolver.d.ts.map +1 -0
  223. package/dist/services/prompt-resolver.js +377 -0
  224. package/dist/services/prompt-resolver.js.map +1 -0
  225. package/dist/services/repo-info.d.ts +12 -0
  226. package/dist/services/repo-info.d.ts.map +1 -1
  227. package/dist/services/repo-info.js +46 -0
  228. package/dist/services/repo-info.js.map +1 -1
  229. package/dist/services/watcher.d.ts +3 -4
  230. package/dist/services/watcher.d.ts.map +1 -1
  231. package/dist/services/watcher.js +18 -35
  232. package/dist/services/watcher.js.map +1 -1
  233. package/dist/services/websocket.d.ts +30 -16
  234. package/dist/services/websocket.d.ts.map +1 -1
  235. package/dist/services/websocket.js +102 -37
  236. package/dist/services/websocket.js.map +1 -1
  237. package/dist/services/worktree-sync-service.d.ts +228 -0
  238. package/dist/services/worktree-sync-service.d.ts.map +1 -0
  239. package/dist/services/worktree-sync-service.js +563 -0
  240. package/dist/services/worktree-sync-service.js.map +1 -0
  241. package/dist/types/editor.d.ts +49 -0
  242. package/dist/types/editor.d.ts.map +1 -0
  243. package/dist/types/editor.js +50 -0
  244. package/dist/types/editor.js.map +1 -0
  245. package/dist/types/project.d.ts +58 -0
  246. package/dist/types/project.d.ts.map +1 -0
  247. package/dist/types/project.js +10 -0
  248. package/dist/types/project.js.map +1 -0
  249. package/dist/utils/executable-check.d.ts +36 -0
  250. package/dist/utils/executable-check.d.ts.map +1 -0
  251. package/dist/utils/executable-check.js +79 -0
  252. package/dist/utils/executable-check.js.map +1 -0
  253. package/dist/workers/execution-worker.d.ts +18 -0
  254. package/dist/workers/execution-worker.d.ts.map +1 -0
  255. package/dist/workers/execution-worker.js +340 -0
  256. package/dist/workers/execution-worker.js.map +1 -0
  257. package/dist/workers/worker-ipc.d.ts +84 -0
  258. package/dist/workers/worker-ipc.d.ts.map +1 -0
  259. package/dist/workers/worker-ipc.js +29 -0
  260. package/dist/workers/worker-ipc.js.map +1 -0
  261. package/package.json +6 -5
  262. package/dist/execution/output/ag-ui-integration.d.ts +0 -96
  263. package/dist/execution/output/ag-ui-integration.d.ts.map +0 -1
  264. package/dist/execution/output/ag-ui-integration.js +0 -96
  265. package/dist/execution/output/ag-ui-integration.js.map +0 -1
  266. package/dist/execution/output/claude-code-output-processor.d.ts +0 -321
  267. package/dist/execution/output/claude-code-output-processor.d.ts.map +0 -1
  268. package/dist/execution/output/claude-code-output-processor.js +0 -769
  269. package/dist/execution/output/claude-code-output-processor.js.map +0 -1
  270. package/dist/public/assets/index-B3SEMufD.js +0 -580
  271. package/dist/public/assets/index-B3SEMufD.js.map +0 -1
  272. package/dist/public/assets/index-D2YGL3gX.css +0 -1
  273. package/dist/public/assets/ui-vendor-CotR6bx9.js +0 -54
  274. package/dist/public/assets/ui-vendor-CotR6bx9.js.map +0 -1
@@ -2,7 +2,6 @@
2
2
  * Executions service - database operations for agent executions
3
3
  */
4
4
  import { randomUUID } from "crypto";
5
- import { broadcastExecutionUpdate } from "./websocket.js";
6
5
  /**
7
6
  * Create a new execution
8
7
  */
@@ -34,17 +33,16 @@ export function createExecution(db, input) {
34
33
  target_branch,
35
34
  branch_name,
36
35
  worktree_path,
36
+ parent_execution_id,
37
37
  created_at,
38
38
  updated_at
39
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
39
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
40
40
  `);
41
- stmt.run(id, input.issue_id, issue_uuid, input.agent_type, input.mode || null, input.prompt || null, input.config || null, "running", now, input.before_commit || null, input.target_branch, input.branch_name, input.worktree_path || null, now, now);
41
+ stmt.run(id, input.issue_id, issue_uuid, input.agent_type, input.mode || null, input.prompt || null, input.config || null, "running", now, input.before_commit || null, input.target_branch, input.branch_name, input.worktree_path || null, input.parent_execution_id || null, now, now);
42
42
  const execution = getExecution(db, id);
43
43
  if (!execution) {
44
44
  throw new Error(`Failed to create execution with id ${id}`);
45
45
  }
46
- // Broadcast to execution subscribers AND issue subscribers (dual broadcast)
47
- broadcastExecutionUpdate(execution.id, "created", execution, execution.issue_id || undefined);
48
46
  return execution;
49
47
  }
50
48
  /**
@@ -94,6 +92,10 @@ export function updateExecution(db, id, input) {
94
92
  updates.push("error_message = ?");
95
93
  values.push(input.error_message);
96
94
  }
95
+ if (input.before_commit !== undefined) {
96
+ updates.push("before_commit = ?");
97
+ values.push(input.before_commit);
98
+ }
97
99
  if (input.after_commit !== undefined) {
98
100
  updates.push("after_commit = ?");
99
101
  values.push(input.after_commit);
@@ -114,6 +116,10 @@ export function updateExecution(db, id, input) {
114
116
  updates.push("summary = ?");
115
117
  values.push(input.summary);
116
118
  }
119
+ if (input.files_changed !== undefined) {
120
+ updates.push("files_changed = ?");
121
+ values.push(input.files_changed);
122
+ }
117
123
  // Always update updated_at
118
124
  updates.push("updated_at = ?");
119
125
  values.push(new Date().toISOString());
@@ -132,28 +138,16 @@ export function updateExecution(db, id, input) {
132
138
  if (!updated) {
133
139
  throw new Error(`Failed to update execution ${id}`);
134
140
  }
135
- // Determine action type based on what changed
136
- const statusChanged = input.status !== undefined &&
137
- execution.status !== input.status;
138
- const action = statusChanged ? "status_changed" : "updated";
139
- // Broadcast to both execution and issue subscribers
140
- broadcastExecutionUpdate(updated.id, action, updated, updated.issue_id || undefined);
141
141
  return updated;
142
142
  }
143
143
  /**
144
144
  * Delete an execution
145
145
  */
146
146
  export function deleteExecution(db, id) {
147
- // Get execution before deletion to access issue_id for broadcast
148
- const execution = getExecution(db, id);
149
147
  const stmt = db.prepare(`
150
148
  DELETE FROM executions WHERE id = ?
151
149
  `);
152
150
  const result = stmt.run(id);
153
- // Broadcast deletion if execution existed
154
- if (result.changes > 0 && execution) {
155
- broadcastExecutionUpdate(id, "deleted", { id }, execution.issue_id || undefined);
156
- }
157
151
  return result.changes > 0;
158
152
  }
159
153
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"executions.js","sourceRoot":"","sources":["../../src/services/executions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executions.js","sourceRoot":"","sources":["../../src/services/executions.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,15 @@ import type Database from "better-sqlite3";
5
5
  /**
6
6
  * Sync a single entity to its markdown file
7
7
  */
8
- export declare function syncEntityToMarkdown(db: Database.Database, entityId: string, entityType: "spec" | "issue"): Promise<void>;
8
+ export declare function syncEntityToMarkdown(db: Database.Database, entityId: string, entityType: "spec" | "issue", outputDir?: string): Promise<void>;
9
9
  /**
10
10
  * Trigger an export to JSONL and Markdown files (debounced)
11
11
  * This should be called after any database modifications
12
+ *
13
+ * @param db - Database instance
14
+ * @param outputDir - Optional output directory (defaults to getSudocodeDir())
12
15
  */
13
- export declare function triggerExport(db: Database.Database): void;
16
+ export declare function triggerExport(db: Database.Database, outputDir?: string): void;
14
17
  /**
15
18
  * Execute export immediately (bypass debouncing)
16
19
  * Exports to both JSONL and Markdown files
@@ -19,6 +22,9 @@ export declare function executeExportNow(db: Database.Database): Promise<void>;
19
22
  /**
20
23
  * Cleanup the export debouncer (cancel pending exports and reset)
21
24
  * Should be called when closing the database or during test cleanup
25
+ *
26
+ * Note: With WeakMap-based debouncers, this is now a no-op since
27
+ * debouncers are automatically garbage collected when the database is closed
22
28
  */
23
29
  export declare function cleanupExport(): void;
24
30
  //# sourceMappingURL=export.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/services/export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AA8C3C;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,OAAO,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAmBzD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAOpC"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/services/export.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAkD3C;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,OAAO,EAC5B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAsB7E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
@@ -5,20 +5,21 @@ import { exportToJSONL } from "@sudocode-ai/cli/dist/export.js";
5
5
  import { syncJSONLToMarkdown } from "@sudocode-ai/cli/dist/sync.js";
6
6
  import { getSudocodeDir } from "../utils/sudocode-dir.js";
7
7
  import * as path from "path";
8
- // Global debouncer state
9
- let exportDebouncer = null;
8
+ // Global debouncer state (keyed by database instance)
9
+ const exportDebouncers = new WeakMap();
10
10
  /**
11
- * Initialize or get the export debouncer
11
+ * Initialize or get the export debouncer for a specific database
12
12
  */
13
13
  function getExportDebouncer(db) {
14
- if (!exportDebouncer) {
15
- exportDebouncer = {
16
- db,
14
+ let debouncer = exportDebouncers.get(db);
15
+ if (!debouncer) {
16
+ debouncer = {
17
17
  timeoutId: null,
18
18
  pending: false,
19
19
  };
20
+ exportDebouncers.set(db, debouncer);
20
21
  }
21
- return exportDebouncer;
22
+ return debouncer;
22
23
  }
23
24
  /**
24
25
  * Execute the full export (JSONL only)
@@ -26,10 +27,10 @@ function getExportDebouncer(db) {
26
27
  * Markdown updates should happen through the watcher's reverse sync if enabled,
27
28
  * or through explicit sync commands.
28
29
  */
29
- async function executeFullExport(db) {
30
- const outputDir = getSudocodeDir();
30
+ async function executeFullExport(db, outputDir) {
31
+ const dir = outputDir || getSudocodeDir();
31
32
  // Export to JSONL only
32
- await exportToJSONL(db, { outputDir });
33
+ await exportToJSONL(db, { outputDir: dir });
33
34
  // Note: We don't sync to markdown here because:
34
35
  // 1. It would update ALL markdown files on every change (inefficient)
35
36
  // 2. The watcher can handle reverse sync if enabled (JSONL → Markdown)
@@ -39,13 +40,13 @@ async function executeFullExport(db) {
39
40
  /**
40
41
  * Sync a single entity to its markdown file
41
42
  */
42
- export async function syncEntityToMarkdown(db, entityId, entityType) {
43
- const outputDir = getSudocodeDir();
43
+ export async function syncEntityToMarkdown(db, entityId, entityType, outputDir) {
44
+ const dir = outputDir || getSudocodeDir();
44
45
  if (entityType === "issue") {
45
46
  const { getIssueById } = await import("./issues.js");
46
47
  const issue = getIssueById(db, entityId);
47
48
  if (issue) {
48
- const mdPath = path.join(outputDir, "issues", `${issue.id}.md`);
49
+ const mdPath = path.join(dir, "issues", `${issue.id}.md`);
49
50
  await syncJSONLToMarkdown(db, issue.id, "issue", mdPath);
50
51
  }
51
52
  }
@@ -54,8 +55,8 @@ export async function syncEntityToMarkdown(db, entityId, entityType) {
54
55
  const spec = getSpecById(db, entityId);
55
56
  if (spec) {
56
57
  const mdPath = spec.file_path
57
- ? path.join(outputDir, spec.file_path)
58
- : path.join(outputDir, "specs", `${spec.id}.md`);
58
+ ? path.join(dir, spec.file_path)
59
+ : path.join(dir, "specs", `${spec.id}.md`);
59
60
  await syncJSONLToMarkdown(db, spec.id, "spec", mdPath);
60
61
  }
61
62
  }
@@ -63,16 +64,22 @@ export async function syncEntityToMarkdown(db, entityId, entityType) {
63
64
  /**
64
65
  * Trigger an export to JSONL and Markdown files (debounced)
65
66
  * This should be called after any database modifications
67
+ *
68
+ * @param db - Database instance
69
+ * @param outputDir - Optional output directory (defaults to getSudocodeDir())
66
70
  */
67
- export function triggerExport(db) {
71
+ export function triggerExport(db, outputDir) {
68
72
  const debouncer = getExportDebouncer(db);
69
73
  debouncer.pending = true;
74
+ if (outputDir) {
75
+ debouncer.outputDir = outputDir;
76
+ }
70
77
  if (debouncer.timeoutId) {
71
78
  clearTimeout(debouncer.timeoutId);
72
79
  }
73
80
  debouncer.timeoutId = setTimeout(async () => {
74
81
  try {
75
- await executeFullExport(db);
82
+ await executeFullExport(db, debouncer.outputDir);
76
83
  }
77
84
  catch (error) {
78
85
  console.error("Export failed:", error);
@@ -94,13 +101,12 @@ export async function executeExportNow(db) {
94
101
  /**
95
102
  * Cleanup the export debouncer (cancel pending exports and reset)
96
103
  * Should be called when closing the database or during test cleanup
104
+ *
105
+ * Note: With WeakMap-based debouncers, this is now a no-op since
106
+ * debouncers are automatically garbage collected when the database is closed
97
107
  */
98
108
  export function cleanupExport() {
99
- if (exportDebouncer) {
100
- if (exportDebouncer.timeoutId) {
101
- clearTimeout(exportDebouncer.timeoutId);
102
- }
103
- exportDebouncer = null;
104
- }
109
+ // No-op: debouncers are now per-database and will be GC'd automatically
110
+ // Kept for backward compatibility
105
111
  }
106
112
  //# sourceMappingURL=export.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/services/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/services/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Git ls-files search strategy
3
+ *
4
+ * Uses `git ls-files` command to search for files in a git repository.
5
+ * This strategy respects .gitignore and is fast for git repositories.
6
+ */
7
+ import type { FileSearchStrategy, FileSearchOptions, FileSearchResult } from "./strategy.js";
8
+ /**
9
+ * Git ls-files strategy implementation
10
+ *
11
+ * Uses git ls-files to list all tracked files in a repository,
12
+ * then filters and ranks them based on the search query.
13
+ *
14
+ * Features:
15
+ * - Respects .gitignore automatically
16
+ * - Fast for git repositories
17
+ * - 5 second cache to reduce repeated git calls
18
+ * - Graceful fallback for non-git directories
19
+ */
20
+ export declare class GitLsFilesStrategy implements FileSearchStrategy {
21
+ private cache;
22
+ private readonly cacheTTL;
23
+ getName(): string;
24
+ /**
25
+ * Search for files matching the query
26
+ *
27
+ * @param workspacePath - Absolute path to workspace root
28
+ * @param options - Search options
29
+ * @returns Matching files sorted by relevance
30
+ */
31
+ search(workspacePath: string, options: FileSearchOptions): Promise<FileSearchResult[]>;
32
+ /**
33
+ * Get files from git ls-files with caching
34
+ *
35
+ * @param workspacePath - Absolute path to workspace
36
+ * @returns Array of file paths relative to workspace root
37
+ */
38
+ private getCachedFiles;
39
+ /**
40
+ * Match a file path against the query
41
+ *
42
+ * @param path - File path relative to workspace root
43
+ * @param query - Search query (case-insensitive)
44
+ * @returns Match result with type, or null if no match
45
+ */
46
+ private matchFile;
47
+ /**
48
+ * Compare two match results for sorting
49
+ *
50
+ * Priority:
51
+ * 1. Match type (exact > prefix > contains)
52
+ * 2. Path length (shorter first)
53
+ * 3. Alphabetical
54
+ *
55
+ * @param a - First result
56
+ * @param b - Second result
57
+ * @returns Negative if a < b, positive if a > b, 0 if equal
58
+ */
59
+ private compareMatchQuality;
60
+ /**
61
+ * Clear the cache (useful for testing or manual invalidation)
62
+ */
63
+ clearCache(): void;
64
+ /**
65
+ * Get cache statistics (useful for debugging/monitoring)
66
+ */
67
+ getCacheStats(): {
68
+ entries: number;
69
+ workspaces: string[];
70
+ };
71
+ }
72
+ //# sourceMappingURL=git-ls-files-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-ls-files-strategy.d.ts","sourceRoot":"","sources":["../../../src/services/file-search/git-ls-files-strategy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,eAAe,CAAA;AAYtB;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAO;IAEhC,OAAO,IAAI,MAAM;IAIjB;;;;;;OAMG;IACG,MAAM,CACV,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAsC9B;;;;;OAKG;YACW,cAAc;IAqC5B;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IA8BjB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,aAAa,IAAI;QACf,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,EAAE,CAAA;KACrB;CAMF"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Git ls-files search strategy
3
+ *
4
+ * Uses `git ls-files` command to search for files in a git repository.
5
+ * This strategy respects .gitignore and is fast for git repositories.
6
+ */
7
+ import { execSync } from "child_process";
8
+ /**
9
+ * Git ls-files strategy implementation
10
+ *
11
+ * Uses git ls-files to list all tracked files in a repository,
12
+ * then filters and ranks them based on the search query.
13
+ *
14
+ * Features:
15
+ * - Respects .gitignore automatically
16
+ * - Fast for git repositories
17
+ * - 5 second cache to reduce repeated git calls
18
+ * - Graceful fallback for non-git directories
19
+ */
20
+ export class GitLsFilesStrategy {
21
+ cache = new Map();
22
+ cacheTTL = 5000; // 5 seconds in milliseconds
23
+ getName() {
24
+ return "git-ls-files";
25
+ }
26
+ /**
27
+ * Search for files matching the query
28
+ *
29
+ * @param workspacePath - Absolute path to workspace root
30
+ * @param options - Search options
31
+ * @returns Matching files sorted by relevance
32
+ */
33
+ async search(workspacePath, options) {
34
+ const { query, limit, includeDirectories } = options;
35
+ // Empty query returns empty results
36
+ if (!query || query.trim().length === 0) {
37
+ return [];
38
+ }
39
+ try {
40
+ // Get all files from git (cached)
41
+ const allFiles = await this.getCachedFiles(workspacePath);
42
+ // Filter directories if requested
43
+ let filesToSearch = allFiles;
44
+ if (!includeDirectories) {
45
+ // git ls-files only returns files by default, so no filtering needed
46
+ // but we keep this for consistency with other strategies
47
+ filesToSearch = allFiles.filter((path) => !path.endsWith("/"));
48
+ }
49
+ // Match and rank files
50
+ const matches = filesToSearch
51
+ .map((path) => this.matchFile(path, query))
52
+ .filter((result) => result !== null)
53
+ .sort((a, b) => this.compareMatchQuality(a, b))
54
+ .slice(0, limit);
55
+ return matches;
56
+ }
57
+ catch (error) {
58
+ // Log error but don't throw - gracefully return empty results
59
+ console.warn(`[GitLsFilesStrategy] Failed to search files in ${workspacePath}:`, error instanceof Error ? error.message : String(error));
60
+ return [];
61
+ }
62
+ }
63
+ /**
64
+ * Get files from git ls-files with caching
65
+ *
66
+ * @param workspacePath - Absolute path to workspace
67
+ * @returns Array of file paths relative to workspace root
68
+ */
69
+ async getCachedFiles(workspacePath) {
70
+ const now = Date.now();
71
+ const cached = this.cache.get(workspacePath);
72
+ // Return cached files if still valid
73
+ if (cached && now - cached.timestamp < this.cacheTTL) {
74
+ return cached.files;
75
+ }
76
+ // Execute git ls-files
77
+ try {
78
+ const output = execSync("git ls-files", {
79
+ cwd: workspacePath,
80
+ encoding: "utf-8",
81
+ stdio: ["ignore", "pipe", "pipe"], // Ignore stdin, capture stdout, capture stderr
82
+ });
83
+ const files = output
84
+ .split("\n")
85
+ .map((line) => line.trim())
86
+ .filter((line) => line.length > 0);
87
+ // Cache the results
88
+ this.cache.set(workspacePath, {
89
+ files,
90
+ timestamp: now,
91
+ });
92
+ return files;
93
+ }
94
+ catch (error) {
95
+ // Git command failed (not a git repo, or other error)
96
+ // Clear cache and return empty array
97
+ this.cache.delete(workspacePath);
98
+ throw error;
99
+ }
100
+ }
101
+ /**
102
+ * Match a file path against the query
103
+ *
104
+ * @param path - File path relative to workspace root
105
+ * @param query - Search query (case-insensitive)
106
+ * @returns Match result with type, or null if no match
107
+ */
108
+ matchFile(path, query) {
109
+ const name = path.split("/").pop();
110
+ const lowerQuery = query.toLowerCase();
111
+ const lowerPath = path.toLowerCase();
112
+ const lowerName = name.toLowerCase();
113
+ // Exact match on filename
114
+ if (lowerName === lowerQuery) {
115
+ return { path, name, isFile: true, matchType: "exact" };
116
+ }
117
+ // Prefix match on filename
118
+ if (lowerName.startsWith(lowerQuery)) {
119
+ return { path, name, isFile: true, matchType: "prefix" };
120
+ }
121
+ // Prefix match on path
122
+ if (lowerPath.startsWith(lowerQuery)) {
123
+ return { path, name, isFile: true, matchType: "prefix" };
124
+ }
125
+ // Contains match anywhere in path
126
+ if (lowerPath.includes(lowerQuery)) {
127
+ return { path, name, isFile: true, matchType: "contains" };
128
+ }
129
+ // No match
130
+ return null;
131
+ }
132
+ /**
133
+ * Compare two match results for sorting
134
+ *
135
+ * Priority:
136
+ * 1. Match type (exact > prefix > contains)
137
+ * 2. Path length (shorter first)
138
+ * 3. Alphabetical
139
+ *
140
+ * @param a - First result
141
+ * @param b - Second result
142
+ * @returns Negative if a < b, positive if a > b, 0 if equal
143
+ */
144
+ compareMatchQuality(a, b) {
145
+ // Define match type ordering
146
+ const matchOrder = { exact: 0, prefix: 1, contains: 2 };
147
+ const aOrder = matchOrder[a.matchType || "contains"];
148
+ const bOrder = matchOrder[b.matchType || "contains"];
149
+ // Compare by match type first
150
+ if (aOrder !== bOrder) {
151
+ return aOrder - bOrder;
152
+ }
153
+ // Same match type - shorter paths first
154
+ if (a.path.length !== b.path.length) {
155
+ return a.path.length - b.path.length;
156
+ }
157
+ // Same length - alphabetical
158
+ return a.path.localeCompare(b.path);
159
+ }
160
+ /**
161
+ * Clear the cache (useful for testing or manual invalidation)
162
+ */
163
+ clearCache() {
164
+ this.cache.clear();
165
+ }
166
+ /**
167
+ * Get cache statistics (useful for debugging/monitoring)
168
+ */
169
+ getCacheStats() {
170
+ return {
171
+ entries: this.cache.size,
172
+ workspaces: Array.from(this.cache.keys()),
173
+ };
174
+ }
175
+ }
176
+ //# sourceMappingURL=git-ls-files-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-ls-files-strategy.js","sourceRoot":"","sources":["../../../src/services/file-search/git-ls-files-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * File search service exports
3
+ *
4
+ * Provides file search capabilities with pluggable strategies.
5
+ */
6
+ export type { FileSearchStrategy, FileSearchOptions, FileSearchResult, } from "./strategy.js";
7
+ export { FileSearchStrategyRegistry, fileSearchRegistry, type StrategyType, } from "./registry.js";
8
+ export { GitLsFilesStrategy } from "./git-ls-files-strategy.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/file-search/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * File search service exports
3
+ *
4
+ * Provides file search capabilities with pluggable strategies.
5
+ */
6
+ // Registry for managing strategies
7
+ export { FileSearchStrategyRegistry, fileSearchRegistry, } from "./registry.js";
8
+ // Strategies
9
+ export { GitLsFilesStrategy } from "./git-ls-files-strategy.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/file-search/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,mCAAmC;AACnC,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GAEnB,MAAM,eAAe,CAAA;AAEtB,aAAa;AACb,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * File search strategy registry
3
+ *
4
+ * Manages registration and retrieval of file search strategies.
5
+ * Allows switching between different search implementations.
6
+ */
7
+ import type { FileSearchStrategy } from "./strategy.js";
8
+ /**
9
+ * Type name for registered strategies
10
+ */
11
+ export type StrategyType = "git-ls-files" | "fast-glob" | "indexed";
12
+ /**
13
+ * Registry for file search strategies
14
+ *
15
+ * Manages multiple search strategy implementations and provides
16
+ * a way to select which one to use (globally or per-project).
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // Register a strategy
21
+ * fileSearchRegistry.register('git-ls-files', new GitLsFilesStrategy())
22
+ *
23
+ * // Set as default
24
+ * fileSearchRegistry.setDefault('git-ls-files')
25
+ *
26
+ * // Get strategy (uses default if not specified)
27
+ * const strategy = fileSearchRegistry.get()
28
+ * const results = await strategy.search(workspacePath, options)
29
+ * ```
30
+ */
31
+ export declare class FileSearchStrategyRegistry {
32
+ private strategies;
33
+ private defaultStrategy;
34
+ /**
35
+ * Register a new search strategy
36
+ *
37
+ * @param type - Unique identifier for this strategy
38
+ * @param strategy - Strategy implementation
39
+ * @throws Error if strategy with this type already registered
40
+ */
41
+ register(type: StrategyType, strategy: FileSearchStrategy): void;
42
+ /**
43
+ * Unregister a search strategy
44
+ *
45
+ * @param type - Strategy type to remove
46
+ * @returns True if strategy was found and removed, false otherwise
47
+ */
48
+ unregister(type: StrategyType): boolean;
49
+ /**
50
+ * Get a specific strategy by type, or the default strategy
51
+ *
52
+ * @param type - Optional strategy type. If not provided, returns default.
53
+ * @returns The requested strategy
54
+ * @throws Error if no strategy found for the given type
55
+ * @throws Error if no default strategy set and type not provided
56
+ */
57
+ get(type?: StrategyType): FileSearchStrategy;
58
+ /**
59
+ * Set the default strategy to use
60
+ *
61
+ * @param type - Strategy type to set as default
62
+ * @throws Error if strategy type not registered
63
+ */
64
+ setDefault(type: StrategyType): void;
65
+ /**
66
+ * Get the current default strategy type
67
+ *
68
+ * @returns Default strategy type, or null if no default set
69
+ */
70
+ getDefaultType(): StrategyType | null;
71
+ /**
72
+ * Check if a strategy is registered
73
+ *
74
+ * @param type - Strategy type to check
75
+ * @returns True if registered, false otherwise
76
+ */
77
+ has(type: StrategyType): boolean;
78
+ /**
79
+ * Get all registered strategy types
80
+ *
81
+ * @returns Array of registered strategy type names
82
+ */
83
+ listTypes(): StrategyType[];
84
+ /**
85
+ * Clear all registered strategies and reset default
86
+ *
87
+ * Useful for testing or complete reconfiguration
88
+ */
89
+ clear(): void;
90
+ }
91
+ /**
92
+ * Global file search strategy registry instance
93
+ *
94
+ * Use this singleton for application-wide strategy management.
95
+ */
96
+ export declare const fileSearchRegistry: FileSearchStrategyRegistry;
97
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/services/file-search/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAEvD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,CAAA;AAEnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,UAAU,CAAmD;IACrE,OAAO,CAAC,eAAe,CAA4B;IAEnD;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAgBhE;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAavC;;;;;;;OAOG;IACH,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,kBAAkB;IAuB5C;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAYpC;;;;OAIG;IACH,cAAc,IAAI,YAAY,GAAG,IAAI;IAIrC;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAIhC;;;;OAIG;IACH,SAAS,IAAI,YAAY,EAAE;IAI3B;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAId;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,4BAAmC,CAAA"}