@opencodehub/mcp 0.1.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 (210) hide show
  1. package/README.md +62 -0
  2. package/dist/analysis-bridge.d.ts +23 -0
  3. package/dist/analysis-bridge.d.ts.map +1 -0
  4. package/dist/analysis-bridge.js +83 -0
  5. package/dist/analysis-bridge.js.map +1 -0
  6. package/dist/connection-pool.d.ts +76 -0
  7. package/dist/connection-pool.d.ts.map +1 -0
  8. package/dist/connection-pool.js +179 -0
  9. package/dist/connection-pool.js.map +1 -0
  10. package/dist/error-envelope.d.ts +97 -0
  11. package/dist/error-envelope.d.ts.map +1 -0
  12. package/dist/error-envelope.js +75 -0
  13. package/dist/error-envelope.js.map +1 -0
  14. package/dist/group-resolver.d.ts +29 -0
  15. package/dist/group-resolver.d.ts.map +1 -0
  16. package/dist/group-resolver.js +100 -0
  17. package/dist/group-resolver.js.map +1 -0
  18. package/dist/index.d.ts +43 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +54 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/next-step-hints.d.ts +24 -0
  23. package/dist/next-step-hints.d.ts.map +1 -0
  24. package/dist/next-step-hints.js +41 -0
  25. package/dist/next-step-hints.js.map +1 -0
  26. package/dist/repo-resolver.d.ts +88 -0
  27. package/dist/repo-resolver.d.ts.map +1 -0
  28. package/dist/repo-resolver.js +211 -0
  29. package/dist/repo-resolver.js.map +1 -0
  30. package/dist/repo-uri-for-entry.d.ts +25 -0
  31. package/dist/repo-uri-for-entry.d.ts.map +1 -0
  32. package/dist/repo-uri-for-entry.js +64 -0
  33. package/dist/repo-uri-for-entry.js.map +1 -0
  34. package/dist/resources/repo-cluster.d.ts +19 -0
  35. package/dist/resources/repo-cluster.d.ts.map +1 -0
  36. package/dist/resources/repo-cluster.js +203 -0
  37. package/dist/resources/repo-cluster.js.map +1 -0
  38. package/dist/resources/repo-clusters.d.ts +14 -0
  39. package/dist/resources/repo-clusters.d.ts.map +1 -0
  40. package/dist/resources/repo-clusters.js +97 -0
  41. package/dist/resources/repo-clusters.js.map +1 -0
  42. package/dist/resources/repo-context.d.ts +12 -0
  43. package/dist/resources/repo-context.d.ts.map +1 -0
  44. package/dist/resources/repo-context.js +84 -0
  45. package/dist/resources/repo-context.js.map +1 -0
  46. package/dist/resources/repo-process.d.ts +19 -0
  47. package/dist/resources/repo-process.d.ts.map +1 -0
  48. package/dist/resources/repo-process.js +220 -0
  49. package/dist/resources/repo-process.js.map +1 -0
  50. package/dist/resources/repo-processes.d.ts +13 -0
  51. package/dist/resources/repo-processes.d.ts.map +1 -0
  52. package/dist/resources/repo-processes.js +99 -0
  53. package/dist/resources/repo-processes.js.map +1 -0
  54. package/dist/resources/repo-schema.d.ts +13 -0
  55. package/dist/resources/repo-schema.d.ts.map +1 -0
  56. package/dist/resources/repo-schema.js +99 -0
  57. package/dist/resources/repo-schema.js.map +1 -0
  58. package/dist/resources/repos.d.ts +20 -0
  59. package/dist/resources/repos.d.ts.map +1 -0
  60. package/dist/resources/repos.js +58 -0
  61. package/dist/resources/repos.js.map +1 -0
  62. package/dist/resources/store-helper.d.ts +28 -0
  63. package/dist/resources/store-helper.d.ts.map +1 -0
  64. package/dist/resources/store-helper.js +58 -0
  65. package/dist/resources/store-helper.js.map +1 -0
  66. package/dist/resources/yaml.d.ts +10 -0
  67. package/dist/resources/yaml.d.ts.map +1 -0
  68. package/dist/resources/yaml.js +16 -0
  69. package/dist/resources/yaml.js.map +1 -0
  70. package/dist/server.d.ts +46 -0
  71. package/dist/server.d.ts.map +1 -0
  72. package/dist/server.js +194 -0
  73. package/dist/server.js.map +1 -0
  74. package/dist/staleness.d.ts +19 -0
  75. package/dist/staleness.d.ts.map +1 -0
  76. package/dist/staleness.js +40 -0
  77. package/dist/staleness.js.map +1 -0
  78. package/dist/test-utils.d.ts +170 -0
  79. package/dist/test-utils.d.ts.map +1 -0
  80. package/dist/test-utils.js +473 -0
  81. package/dist/test-utils.js.map +1 -0
  82. package/dist/tools/api-impact.d.ts +47 -0
  83. package/dist/tools/api-impact.d.ts.map +1 -0
  84. package/dist/tools/api-impact.js +199 -0
  85. package/dist/tools/api-impact.js.map +1 -0
  86. package/dist/tools/confidence.d.ts +39 -0
  87. package/dist/tools/confidence.d.ts.map +1 -0
  88. package/dist/tools/confidence.js +58 -0
  89. package/dist/tools/confidence.js.map +1 -0
  90. package/dist/tools/context.d.ts +47 -0
  91. package/dist/tools/context.d.ts.map +1 -0
  92. package/dist/tools/context.js +577 -0
  93. package/dist/tools/context.js.map +1 -0
  94. package/dist/tools/dependencies.d.ts +29 -0
  95. package/dist/tools/dependencies.d.ts.map +1 -0
  96. package/dist/tools/dependencies.js +110 -0
  97. package/dist/tools/dependencies.js.map +1 -0
  98. package/dist/tools/detect-changes.d.ts +15 -0
  99. package/dist/tools/detect-changes.d.ts.map +1 -0
  100. package/dist/tools/detect-changes.js +78 -0
  101. package/dist/tools/detect-changes.js.map +1 -0
  102. package/dist/tools/group-contracts.d.ts +26 -0
  103. package/dist/tools/group-contracts.d.ts.map +1 -0
  104. package/dist/tools/group-contracts.js +251 -0
  105. package/dist/tools/group-contracts.js.map +1 -0
  106. package/dist/tools/group-cross-repo-links.d.ts +28 -0
  107. package/dist/tools/group-cross-repo-links.d.ts.map +1 -0
  108. package/dist/tools/group-cross-repo-links.js +128 -0
  109. package/dist/tools/group-cross-repo-links.js.map +1 -0
  110. package/dist/tools/group-list.d.ts +10 -0
  111. package/dist/tools/group-list.d.ts.map +1 -0
  112. package/dist/tools/group-list.js +74 -0
  113. package/dist/tools/group-list.js.map +1 -0
  114. package/dist/tools/group-query.d.ts +40 -0
  115. package/dist/tools/group-query.d.ts.map +1 -0
  116. package/dist/tools/group-query.js +209 -0
  117. package/dist/tools/group-query.js.map +1 -0
  118. package/dist/tools/group-status.d.ts +21 -0
  119. package/dist/tools/group-status.d.ts.map +1 -0
  120. package/dist/tools/group-status.js +121 -0
  121. package/dist/tools/group-status.js.map +1 -0
  122. package/dist/tools/group-sync.d.ts +23 -0
  123. package/dist/tools/group-sync.d.ts.map +1 -0
  124. package/dist/tools/group-sync.js +112 -0
  125. package/dist/tools/group-sync.js.map +1 -0
  126. package/dist/tools/impact.d.ts +36 -0
  127. package/dist/tools/impact.d.ts.map +1 -0
  128. package/dist/tools/impact.js +232 -0
  129. package/dist/tools/impact.js.map +1 -0
  130. package/dist/tools/license-audit.d.ts +34 -0
  131. package/dist/tools/license-audit.d.ts.map +1 -0
  132. package/dist/tools/license-audit.js +108 -0
  133. package/dist/tools/license-audit.js.map +1 -0
  134. package/dist/tools/list-dead-code.d.ts +26 -0
  135. package/dist/tools/list-dead-code.d.ts.map +1 -0
  136. package/dist/tools/list-dead-code.js +110 -0
  137. package/dist/tools/list-dead-code.js.map +1 -0
  138. package/dist/tools/list-findings-delta.d.ts +36 -0
  139. package/dist/tools/list-findings-delta.d.ts.map +1 -0
  140. package/dist/tools/list-findings-delta.js +274 -0
  141. package/dist/tools/list-findings-delta.js.map +1 -0
  142. package/dist/tools/list-findings.d.ts +30 -0
  143. package/dist/tools/list-findings.d.ts.map +1 -0
  144. package/dist/tools/list-findings.js +129 -0
  145. package/dist/tools/list-findings.js.map +1 -0
  146. package/dist/tools/list-repos.d.ts +17 -0
  147. package/dist/tools/list-repos.d.ts.map +1 -0
  148. package/dist/tools/list-repos.js +63 -0
  149. package/dist/tools/list-repos.js.map +1 -0
  150. package/dist/tools/owners.d.ts +23 -0
  151. package/dist/tools/owners.d.ts.map +1 -0
  152. package/dist/tools/owners.js +103 -0
  153. package/dist/tools/owners.js.map +1 -0
  154. package/dist/tools/pack-codebase.d.ts +76 -0
  155. package/dist/tools/pack-codebase.d.ts.map +1 -0
  156. package/dist/tools/pack-codebase.js +289 -0
  157. package/dist/tools/pack-codebase.js.map +1 -0
  158. package/dist/tools/project-profile.d.ts +28 -0
  159. package/dist/tools/project-profile.d.ts.map +1 -0
  160. package/dist/tools/project-profile.js +109 -0
  161. package/dist/tools/project-profile.js.map +1 -0
  162. package/dist/tools/query.d.ts +63 -0
  163. package/dist/tools/query.d.ts.map +1 -0
  164. package/dist/tools/query.js +662 -0
  165. package/dist/tools/query.js.map +1 -0
  166. package/dist/tools/remove-dead-code.d.ts +47 -0
  167. package/dist/tools/remove-dead-code.d.ts.map +1 -0
  168. package/dist/tools/remove-dead-code.js +258 -0
  169. package/dist/tools/remove-dead-code.js.map +1 -0
  170. package/dist/tools/rename.d.ts +21 -0
  171. package/dist/tools/rename.d.ts.map +1 -0
  172. package/dist/tools/rename.js +116 -0
  173. package/dist/tools/rename.js.map +1 -0
  174. package/dist/tools/risk-trends.d.ts +19 -0
  175. package/dist/tools/risk-trends.d.ts.map +1 -0
  176. package/dist/tools/risk-trends.js +73 -0
  177. package/dist/tools/risk-trends.js.map +1 -0
  178. package/dist/tools/route-map.d.ts +27 -0
  179. package/dist/tools/route-map.d.ts.map +1 -0
  180. package/dist/tools/route-map.js +119 -0
  181. package/dist/tools/route-map.js.map +1 -0
  182. package/dist/tools/scan.d.ts +27 -0
  183. package/dist/tools/scan.d.ts.map +1 -0
  184. package/dist/tools/scan.js +136 -0
  185. package/dist/tools/scan.js.map +1 -0
  186. package/dist/tools/shape-check.d.ts +53 -0
  187. package/dist/tools/shape-check.d.ts.map +1 -0
  188. package/dist/tools/shape-check.js +161 -0
  189. package/dist/tools/shape-check.js.map +1 -0
  190. package/dist/tools/shared.d.ts +101 -0
  191. package/dist/tools/shared.d.ts.map +1 -0
  192. package/dist/tools/shared.js +114 -0
  193. package/dist/tools/shared.js.map +1 -0
  194. package/dist/tools/signature.d.ts +38 -0
  195. package/dist/tools/signature.d.ts.map +1 -0
  196. package/dist/tools/signature.js +332 -0
  197. package/dist/tools/signature.js.map +1 -0
  198. package/dist/tools/sql.d.ts +34 -0
  199. package/dist/tools/sql.d.ts.map +1 -0
  200. package/dist/tools/sql.js +222 -0
  201. package/dist/tools/sql.js.map +1 -0
  202. package/dist/tools/tool-map.d.ts +24 -0
  203. package/dist/tools/tool-map.d.ts.map +1 -0
  204. package/dist/tools/tool-map.js +97 -0
  205. package/dist/tools/tool-map.js.map +1 -0
  206. package/dist/tools/verdict.d.ts +33 -0
  207. package/dist/tools/verdict.d.ts.map +1 -0
  208. package/dist/tools/verdict.js +102 -0
  209. package/dist/tools/verdict.js.map +1 -0
  210. package/package.json +76 -0
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Shared scaffolding for MCP tool handlers.
3
+ *
4
+ * Each tool depends on a `ToolContext` that carries the connection pool
5
+ * (for checkout/release) plus the registry home override (to let tests
6
+ * point at a fake `~/.codehub`). The factory functions in `server.ts`
7
+ * construct one `ToolContext` per server and pass it into every
8
+ * `registerXxxTool` call.
9
+ */
10
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
12
+ import type { FsAbstraction } from "@opencodehub/analysis";
13
+ import type { Embedder } from "@opencodehub/embedder";
14
+ import { type Store } from "@opencodehub/storage";
15
+ import { z } from "zod";
16
+ import type { ConnectionPool } from "../connection-pool.js";
17
+ import { type ResolvedRepo } from "../repo-resolver.js";
18
+ /**
19
+ * Factory for opening an embedder on demand. The default factory imports
20
+ * `@opencodehub/embedder` and calls `openOnnxEmbedder()`; tests inject a
21
+ * fake so they don't need gte-modernbert-base weights on disk. The factory
22
+ * must throw on failure — the `query` tool treats any throw as
23
+ * "embedder unavailable, warn + fall back to BM25".
24
+ */
25
+ export type EmbedderFactory = () => Promise<Embedder>;
26
+ export interface ToolContext {
27
+ readonly pool: ConnectionPool;
28
+ readonly home?: string;
29
+ /**
30
+ * Optional override for how the `query` tool opens an embedder when the
31
+ * `embeddings` table is populated. Production callers leave this unset
32
+ * and the tool lazy-imports `@opencodehub/embedder`.
33
+ */
34
+ readonly openEmbedder?: EmbedderFactory;
35
+ /**
36
+ * Optional factory for the file-reading abstraction used when tools need
37
+ * to slice source files (e.g. `query` snippet extraction,
38
+ * `remove_dead_code` edit planning). Production callers leave this unset
39
+ * and the tools use `createNodeFs()`.
40
+ */
41
+ readonly fsFactory?: () => FsAbstraction;
42
+ }
43
+ export type RegisteredServer = McpServer;
44
+ /**
45
+ * Transport-agnostic tool result shape. The MCP-registered handler
46
+ * adapts this into the SDK's `CallToolResult`. Keep this minimal — `text`
47
+ * is the rendered agent-readable body; `structuredContent` carries the
48
+ * machine-readable payload (with `next_steps`, `error`, `_meta.*` as
49
+ * usual); `isError` mirrors the MCP semantics.
50
+ */
51
+ export interface ToolResult {
52
+ readonly structuredContent: unknown;
53
+ readonly text: string;
54
+ readonly isError?: boolean;
55
+ }
56
+ /**
57
+ * Convert an MCP `CallToolResult` to the transport-agnostic `ToolResult`.
58
+ * The SDK result always carries at least one `{ type: 'text', text }`
59
+ * content entry in our tools, so the extraction is lossless in practice.
60
+ */
61
+ export declare function toToolResult(r: CallToolResult): ToolResult;
62
+ /**
63
+ * Convert a transport-agnostic `ToolResult` back to the MCP SDK shape.
64
+ * The MCP-registered handler uses this so it can return exactly the
65
+ * `CallToolResult` shape the SDK expects.
66
+ */
67
+ export declare function fromToolResult(r: ToolResult): CallToolResult;
68
+ /**
69
+ * Shared zod shape for `{ repo, repo_uri }` — every per-repo MCP tool
70
+ * spreads this into its `inputSchema` so callers can pass either the
71
+ * registry name (`repo`) or a Sourcegraph-style URI (`repo_uri`). When
72
+ * both are provided, `repo_uri` wins at the resolver.
73
+ */
74
+ export declare const repoArgShape: {
75
+ readonly repo: z.ZodOptional<z.ZodString>;
76
+ readonly repo_uri: z.ZodOptional<z.ZodString>;
77
+ };
78
+ /**
79
+ * Shape of the `{ repo, repo_uri }` arg pair accepted by tool handlers.
80
+ *
81
+ * Permits explicit `undefined` values so tool-handler arg types (which
82
+ * declare `repo?: string | undefined` under `exactOptionalPropertyTypes`)
83
+ * are structurally assignable without wrapping.
84
+ */
85
+ export interface RepoArgs {
86
+ readonly repo?: string | undefined;
87
+ readonly repo_uri?: string | undefined;
88
+ }
89
+ /**
90
+ * Acquire a store for the given repo argument, invoke `fn`, and release
91
+ * the handle unconditionally. Errors from repo resolution become
92
+ * structured NO_INDEX/NOT_FOUND envelopes; DuckDB errors become DB_ERROR.
93
+ * The inner function always returns a CallToolResult so the surface of
94
+ * this helper is the same type.
95
+ *
96
+ * `arg` accepts either a bare registry name (back-compat with pre-M6
97
+ * callers), an `undefined` (single-repo defaulting), or the full
98
+ * `{ repo?, repo_uri? }` object. The resolver handles the alias logic.
99
+ */
100
+ export declare function withStore(ctx: ToolContext, arg: RepoArgs | string | undefined, fn: (store: Store, resolved: ResolvedRepo) => Promise<CallToolResult>): Promise<CallToolResult>;
101
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAoB,KAAK,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAEvF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,aAAa,CAAC;CAC1C;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,GAAG,UAAU,CAS1D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,cAAc,CAQ5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY;;;CAaf,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,EAClC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,GACpE,OAAO,CAAC,cAAc,CAAC,CA2CzB"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Shared scaffolding for MCP tool handlers.
3
+ *
4
+ * Each tool depends on a `ToolContext` that carries the connection pool
5
+ * (for checkout/release) plus the registry home override (to let tests
6
+ * point at a fake `~/.codehub`). The factory functions in `server.ts`
7
+ * construct one `ToolContext` per server and pass it into every
8
+ * `registerXxxTool` call.
9
+ */
10
+ import { describeArtifacts } from "@opencodehub/storage";
11
+ import { z } from "zod";
12
+ import { toolAmbiguousRepoError, toolError, toolErrorFromUnknown } from "../error-envelope.js";
13
+ import { RepoResolveError, resolveRepo } from "../repo-resolver.js";
14
+ /**
15
+ * Convert an MCP `CallToolResult` to the transport-agnostic `ToolResult`.
16
+ * The SDK result always carries at least one `{ type: 'text', text }`
17
+ * content entry in our tools, so the extraction is lossless in practice.
18
+ */
19
+ export function toToolResult(r) {
20
+ const first = r.content[0];
21
+ const text = first && first.type === "text" ? first.text : "";
22
+ const out = {
23
+ structuredContent: r.structuredContent,
24
+ text,
25
+ };
26
+ if (r.isError)
27
+ out.isError = true;
28
+ return out;
29
+ }
30
+ /**
31
+ * Convert a transport-agnostic `ToolResult` back to the MCP SDK shape.
32
+ * The MCP-registered handler uses this so it can return exactly the
33
+ * `CallToolResult` shape the SDK expects.
34
+ */
35
+ export function fromToolResult(r) {
36
+ const sc = r.structuredContent;
37
+ const out = {
38
+ content: [{ type: "text", text: r.text }],
39
+ ...(sc !== undefined ? { structuredContent: sc } : {}),
40
+ };
41
+ if (r.isError)
42
+ out.isError = true;
43
+ return out;
44
+ }
45
+ /**
46
+ * Shared zod shape for `{ repo, repo_uri }` — every per-repo MCP tool
47
+ * spreads this into its `inputSchema` so callers can pass either the
48
+ * registry name (`repo`) or a Sourcegraph-style URI (`repo_uri`). When
49
+ * both are provided, `repo_uri` wins at the resolver.
50
+ */
51
+ export const repoArgShape = {
52
+ repo: z
53
+ .string()
54
+ .optional()
55
+ .describe("Registered repo name. Required when ≥ 2 repos are registered; optional when exactly one is. Prefer `repo_uri` for cross-host portability."),
56
+ repo_uri: z
57
+ .string()
58
+ .optional()
59
+ .describe("Sourcegraph-style repo URI (e.g. `github.com/org/repo`, or `local:<hash>` for unpublished repos). Accepted as an alias for `repo`; wins when both are provided."),
60
+ };
61
+ /**
62
+ * Acquire a store for the given repo argument, invoke `fn`, and release
63
+ * the handle unconditionally. Errors from repo resolution become
64
+ * structured NO_INDEX/NOT_FOUND envelopes; DuckDB errors become DB_ERROR.
65
+ * The inner function always returns a CallToolResult so the surface of
66
+ * this helper is the same type.
67
+ *
68
+ * `arg` accepts either a bare registry name (back-compat with pre-M6
69
+ * callers), an `undefined` (single-repo defaulting), or the full
70
+ * `{ repo?, repo_uri? }` object. The resolver handles the alias logic.
71
+ */
72
+ export async function withStore(ctx, arg, fn) {
73
+ let resolved;
74
+ try {
75
+ const opts = ctx.home !== undefined ? { home: ctx.home } : {};
76
+ resolved = await resolveRepo(arg, opts);
77
+ }
78
+ catch (err) {
79
+ if (err instanceof RepoResolveError) {
80
+ if (err.code === "AMBIGUOUS_REPO" && err.ambiguous !== undefined) {
81
+ return toolAmbiguousRepoError({
82
+ message: err.message,
83
+ hint: err.hint,
84
+ choices: err.ambiguous.choices,
85
+ totalMatches: err.ambiguous.totalMatches,
86
+ });
87
+ }
88
+ return toolError(err.code, err.message, err.hint);
89
+ }
90
+ return toolErrorFromUnknown(err);
91
+ }
92
+ let store;
93
+ try {
94
+ store = await ctx.pool.acquire(resolved.repoPath, resolved.dbPath);
95
+ }
96
+ catch (err) {
97
+ const msg = err instanceof Error ? err.message : String(err);
98
+ // Enumerate every in-tree backend's artifact filename so the hint is
99
+ // useful regardless of which backend produced the index. Pulling the
100
+ // filenames from `describeArtifacts` keeps two-store deployments in
101
+ // sync with a single source of truth.
102
+ const candidates = ["duck", "lbug"]
103
+ .map((b) => `.codehub/${describeArtifacts(b).graphFile}`)
104
+ .join(" or ");
105
+ return toolError("DB_ERROR", `Failed to open store at ${resolved.dbPath}: ${msg}`, `Ensure the repo was indexed and that the ${candidates} file is readable.`);
106
+ }
107
+ try {
108
+ return await fn(store, resolved);
109
+ }
110
+ finally {
111
+ await ctx.pool.release(resolved.repoPath);
112
+ }
113
+ }
114
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `signature` — return a symbol's declaration header with bodies elided.
3
+ *
4
+ * Token-saving alternative to reading a whole file. For a class or interface,
5
+ * emits the type declaration followed by every child method / property as a
6
+ * stub: signature line + language-appropriate body placeholder (`;`, `{ }`,
7
+ * or `pass` / `...` for Python). For a standalone function, emits a single
8
+ * signature stub.
9
+ *
10
+ * Resolution mirrors `context`: `name` is required (or `uid` when the caller
11
+ * already has a node id), with optional `filePath` / `kind` / `repo` for
12
+ * disambiguation. A multi-candidate match returns the candidate list, not
13
+ * one arbitrary pick (EC-04 behaviour from context.ts).
14
+ *
15
+ * SQL shape:
16
+ * - one `SELECT … FROM nodes WHERE name/id=?` to resolve the target,
17
+ * - one follow-up `SELECT … FROM relations JOIN nodes …` for
18
+ * HAS_METHOD + HAS_PROPERTY children when the target is a type.
19
+ *
20
+ * Signature text comes from `CallableShape.signature` when populated by the
21
+ * parse / complexity phases; otherwise we reconstruct `name(p1,...,pN): T`
22
+ * from `parameter_count` + `return_type`. Language detection keys off the
23
+ * file extension alone — the node rows don't carry an explicit language tag.
24
+ */
25
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
26
+ import { type ToolContext, type ToolResult } from "./shared.js";
27
+ interface SignatureArgs {
28
+ readonly name?: string | undefined;
29
+ readonly uid?: string | undefined;
30
+ readonly filePath?: string | undefined;
31
+ readonly kind?: string | undefined;
32
+ readonly repo?: string | undefined;
33
+ readonly repo_uri?: string | undefined;
34
+ }
35
+ export declare function runSignature(ctx: ToolContext, args: SignatureArgs): Promise<ToolResult>;
36
+ export declare function registerSignatureTool(server: McpServer, ctx: ToolContext): void;
37
+ export {};
38
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../src/tools/signature.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EAGhB,MAAM,aAAa,CAAC;AAyDrB,UAAU,aAAa;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAgF7F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiB/E"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * `signature` — return a symbol's declaration header with bodies elided.
3
+ *
4
+ * Token-saving alternative to reading a whole file. For a class or interface,
5
+ * emits the type declaration followed by every child method / property as a
6
+ * stub: signature line + language-appropriate body placeholder (`;`, `{ }`,
7
+ * or `pass` / `...` for Python). For a standalone function, emits a single
8
+ * signature stub.
9
+ *
10
+ * Resolution mirrors `context`: `name` is required (or `uid` when the caller
11
+ * already has a node id), with optional `filePath` / `kind` / `repo` for
12
+ * disambiguation. A multi-candidate match returns the candidate list, not
13
+ * one arbitrary pick (EC-04 behaviour from context.ts).
14
+ *
15
+ * SQL shape:
16
+ * - one `SELECT … FROM nodes WHERE name/id=?` to resolve the target,
17
+ * - one follow-up `SELECT … FROM relations JOIN nodes …` for
18
+ * HAS_METHOD + HAS_PROPERTY children when the target is a type.
19
+ *
20
+ * Signature text comes from `CallableShape.signature` when populated by the
21
+ * parse / complexity phases; otherwise we reconstruct `name(p1,...,pN): T`
22
+ * from `parameter_count` + `return_type`. Language detection keys off the
23
+ * file extension alone — the node rows don't carry an explicit language tag.
24
+ */
25
+ // biome-ignore-all lint/complexity/useLiteralKeys: dot-access disallowed on Record index signatures
26
+ import { z } from "zod";
27
+ import { toolErrorFromUnknown } from "../error-envelope.js";
28
+ import { withNextSteps } from "../next-step-hints.js";
29
+ import { stalenessFromMeta } from "../staleness.js";
30
+ import { fromToolResult, repoArgShape, toToolResult, withStore, } from "./shared.js";
31
+ const SignatureInput = {
32
+ name: z
33
+ .string()
34
+ .optional()
35
+ .describe("Symbol name to inspect (class, interface, function, method). Mutually exclusive with `uid`."),
36
+ uid: z
37
+ .string()
38
+ .optional()
39
+ .describe("Pre-resolved node id (skips name lookup). Mutually exclusive with `name`."),
40
+ filePath: z
41
+ .string()
42
+ .optional()
43
+ .describe("Optional file-path suffix to disambiguate same-named symbols."),
44
+ kind: z
45
+ .string()
46
+ .optional()
47
+ .describe("Optional NodeKind to disambiguate (e.g. 'Class' vs 'Function')."),
48
+ ...repoArgShape,
49
+ };
50
+ /** Kinds treated as aggregate "type declarations" with method / property children. */
51
+ const TYPE_KINDS = new Set([
52
+ "Class",
53
+ "Interface",
54
+ "Struct",
55
+ "Trait",
56
+ "Enum",
57
+ "Record",
58
+ "Union",
59
+ "Impl",
60
+ "Namespace",
61
+ "Module",
62
+ "Protocol",
63
+ ]);
64
+ const CALLABLE_KINDS = new Set(["Function", "Method", "Constructor"]);
65
+ const PROPERTY_KINDS = new Set(["Property", "Const", "Static", "Variable", "Field"]);
66
+ export async function runSignature(ctx, args) {
67
+ const call = await withStore(ctx, args, async (store, resolved) => {
68
+ try {
69
+ if (args.name === undefined && args.uid === undefined) {
70
+ return withNextSteps("signature requires either `name` or `uid`.", { target: null, candidates: [] }, ["re-call `signature` with `name` or `uid`"], stalenessFromMeta(resolved.meta));
71
+ }
72
+ const matches = await resolveMatches(store.graph, args);
73
+ if (matches.length === 0) {
74
+ const probe = args.name ?? args.uid ?? "<unspecified>";
75
+ return withNextSteps(`No symbol matched "${probe}" in ${resolved.name}.`, { target: null, candidates: [] }, ["call `query` with a broader phrase to locate similar symbols"], stalenessFromMeta(resolved.meta));
76
+ }
77
+ if (matches.length > 1) {
78
+ const probe = args.name ?? args.uid ?? "<unspecified>";
79
+ const list = matches
80
+ .map((c, i) => `${i + 1}. [${c.kind}] ${c.filePath} (${c.id})`)
81
+ .join("\n");
82
+ return withNextSteps(`"${probe}" is ambiguous (${matches.length} matches):\n${list}`, { target: null, candidates: matches }, ["re-call `signature` with `kind` or `filePath` to pick a specific match"], stalenessFromMeta(resolved.meta));
83
+ }
84
+ const target = matches[0];
85
+ if (!target) {
86
+ return withNextSteps("No symbol matched.", { target: null, candidates: [] }, ["call `query` with a broader phrase to locate similar symbols"], stalenessFromMeta(resolved.meta));
87
+ }
88
+ const language = detectLanguage(target.filePath);
89
+ let members = [];
90
+ if (TYPE_KINDS.has(target.kind)) {
91
+ members = await fetchMembers(store.graph, target.id);
92
+ }
93
+ const stub = renderStub(target, members, language);
94
+ const next = [
95
+ `call \`context\` with symbol="${target.name}" for callers / callees`,
96
+ ];
97
+ if (members.length > 0) {
98
+ next.push(`class has ${members.length} members — use \`context\` on individual members for full signatures`);
99
+ }
100
+ return withNextSteps(stub, {
101
+ target,
102
+ language,
103
+ memberCount: members.length,
104
+ members,
105
+ stub,
106
+ }, next, stalenessFromMeta(resolved.meta));
107
+ }
108
+ catch (err) {
109
+ return toolErrorFromUnknown(err);
110
+ }
111
+ });
112
+ return toToolResult(call);
113
+ }
114
+ export function registerSignatureTool(server, ctx) {
115
+ server.registerTool("signature", {
116
+ title: "Symbol declaration + stubbed members",
117
+ description: "Return a class/interface declaration plus its method and property signatures with bodies elided (stub syntax per language). For a standalone function, returns a single signature. Saves tokens vs reading the whole file.",
118
+ inputSchema: SignatureInput,
119
+ annotations: {
120
+ readOnlyHint: true,
121
+ destructiveHint: false,
122
+ idempotentHint: true,
123
+ openWorldHint: false,
124
+ },
125
+ }, async (args) => fromToolResult(await runSignature(ctx, args)));
126
+ }
127
+ async function resolveMatches(graph, args) {
128
+ let candidates;
129
+ if (args.uid !== undefined) {
130
+ candidates = await graph.listNodes({ ids: [args.uid] });
131
+ }
132
+ else if (args.name !== undefined) {
133
+ const opts = args.kind !== undefined ? { kinds: [args.kind] } : {};
134
+ let res = await graph.listNodesByName(args.name, opts);
135
+ if (args.filePath !== undefined) {
136
+ const sub = args.filePath;
137
+ res = res.filter((n) => n.filePath.includes(sub));
138
+ }
139
+ candidates = res;
140
+ }
141
+ else {
142
+ return [];
143
+ }
144
+ // Match prior ORDER BY file_path LIMIT 25.
145
+ const sorted = [...candidates].sort((a, b) => a.filePath < b.filePath ? -1 : a.filePath > b.filePath ? 1 : 0);
146
+ return sorted.slice(0, 25).map(nodeToRow);
147
+ }
148
+ async function fetchMembers(graph, ownerId) {
149
+ const edges = await graph.listEdges({
150
+ types: ["HAS_METHOD", "HAS_PROPERTY"],
151
+ fromIds: [ownerId],
152
+ limit: 500,
153
+ });
154
+ if (edges.length === 0)
155
+ return [];
156
+ const partnerIds = Array.from(new Set(edges.map((e) => e.to)));
157
+ const partners = await graph.listNodes({ ids: partnerIds });
158
+ const out = partners.map(nodeToRow);
159
+ out.sort((a, b) => {
160
+ const as = a.startLine ?? Number.POSITIVE_INFINITY;
161
+ const bs = b.startLine ?? Number.POSITIVE_INFINITY;
162
+ if (as !== bs)
163
+ return as - bs;
164
+ return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
165
+ });
166
+ return out;
167
+ }
168
+ function nodeToRow(n) {
169
+ const any = n;
170
+ const out = {
171
+ id: n.id,
172
+ name: n.name,
173
+ kind: n.kind,
174
+ filePath: n.filePath,
175
+ };
176
+ const sl = any["startLine"];
177
+ if (typeof sl === "number" && Number.isFinite(sl))
178
+ out.startLine = sl;
179
+ const el = any["endLine"];
180
+ if (typeof el === "number" && Number.isFinite(el))
181
+ out.endLine = el;
182
+ const sig = any["signature"];
183
+ if (typeof sig === "string" && sig.length > 0)
184
+ out.signature = sig;
185
+ const pc = any["parameterCount"];
186
+ if (typeof pc === "number" && Number.isFinite(pc))
187
+ out.parameterCount = pc;
188
+ const rt = any["returnType"];
189
+ if (typeof rt === "string" && rt.length > 0)
190
+ out.returnType = rt;
191
+ return out;
192
+ }
193
+ function detectLanguage(filePath) {
194
+ const lower = filePath.toLowerCase();
195
+ if (lower.endsWith(".py") || lower.endsWith(".pyi"))
196
+ return "python";
197
+ if (lower.endsWith(".ts") ||
198
+ lower.endsWith(".tsx") ||
199
+ lower.endsWith(".js") ||
200
+ lower.endsWith(".jsx") ||
201
+ lower.endsWith(".mjs") ||
202
+ lower.endsWith(".cjs")) {
203
+ return "typescript";
204
+ }
205
+ if (lower.endsWith(".java") || lower.endsWith(".kt") || lower.endsWith(".kts"))
206
+ return "java";
207
+ if (lower.endsWith(".go"))
208
+ return "go";
209
+ if (lower.endsWith(".rs"))
210
+ return "rust";
211
+ if (lower.endsWith(".cs"))
212
+ return "csharp";
213
+ if (lower.endsWith(".rb"))
214
+ return "ruby";
215
+ return "other";
216
+ }
217
+ /**
218
+ * Render the target node and its children into a language-appropriate stub.
219
+ *
220
+ * For TypeScript/Java/C#: `class Foo { ... }` or `interface Foo { ... }` with
221
+ * per-member `name(args): ReturnType;` lines. For Python: `class Foo:` with
222
+ * indented `def name(...) -> ReturnType: ...` / `name: ReturnType` lines.
223
+ * For Rust/Go we fall back to a language-agnostic text form — the phases
224
+ * don't always populate `signature` in those languages.
225
+ */
226
+ function renderStub(target, members, language) {
227
+ if (!TYPE_KINDS.has(target.kind)) {
228
+ return renderCallableOrDeclaration(target, language, 0);
229
+ }
230
+ if (language === "python") {
231
+ const header = `class ${target.name}:`;
232
+ if (members.length === 0)
233
+ return `${header}\n pass`;
234
+ const lines = [header];
235
+ for (const m of members) {
236
+ lines.push(renderCallableOrDeclaration(m, language, 4));
237
+ }
238
+ return lines.join("\n");
239
+ }
240
+ // Default brace-style: TS / Java / C# / Rust / Go / other.
241
+ const typeWord = typeKeyword(target.kind, language);
242
+ const header = `${typeWord} ${target.name} {`;
243
+ if (members.length === 0)
244
+ return `${header}\n}`;
245
+ const lines = [header];
246
+ for (const m of members) {
247
+ lines.push(renderCallableOrDeclaration(m, language, 2));
248
+ }
249
+ lines.push("}");
250
+ return lines.join("\n");
251
+ }
252
+ function typeKeyword(kind, language) {
253
+ if (kind === "Interface")
254
+ return "interface";
255
+ if (kind === "Struct")
256
+ return language === "rust" || language === "go" ? "struct" : "class";
257
+ if (kind === "Trait")
258
+ return language === "rust" ? "trait" : "interface";
259
+ if (kind === "Enum")
260
+ return "enum";
261
+ if (kind === "Record")
262
+ return "record";
263
+ if (kind === "Union")
264
+ return "union";
265
+ if (kind === "Impl")
266
+ return "impl";
267
+ if (kind === "Namespace")
268
+ return "namespace";
269
+ if (kind === "Module")
270
+ return "module";
271
+ return "class";
272
+ }
273
+ function renderCallableOrDeclaration(node, language, indent) {
274
+ const pad = " ".repeat(indent);
275
+ if (CALLABLE_KINDS.has(node.kind)) {
276
+ const sig = callableSignature(node, language);
277
+ if (language === "python")
278
+ return `${pad}${sig}: ...`;
279
+ // TS / Java / C# / Rust / Go: emit as a signature declaration.
280
+ return `${pad}${sig};`;
281
+ }
282
+ if (PROPERTY_KINDS.has(node.kind)) {
283
+ return `${pad}${propertyLine(node, language)};`;
284
+ }
285
+ // Unknown child kind — fall back to name only.
286
+ return `${pad}${node.name};`;
287
+ }
288
+ /**
289
+ * Prefer the parse-phase-populated `signature` column verbatim. Strip any
290
+ * leading visibility keyword so classes don't end up with `public public foo`
291
+ * in the stub; trailing body braces are stripped because we render the stub
292
+ * body ourselves (`;` or `: ...`).
293
+ */
294
+ function callableSignature(node, language) {
295
+ if (node.signature !== undefined) {
296
+ // Trim trailing body / block if present (e.g. `foo(): T { ... }`).
297
+ const trimmed = node.signature.trim();
298
+ const braceIdx = trimmed.indexOf("{");
299
+ const core = braceIdx === -1 ? trimmed : trimmed.slice(0, braceIdx).trim();
300
+ // Drop trailing semicolons so the renderer can add its own.
301
+ return core.replace(/;$/, "").trim();
302
+ }
303
+ // Reconstruct from parameterCount + returnType.
304
+ const argCount = node.parameterCount ?? 0;
305
+ const argList = Array.from({ length: argCount }, (_, i) => `arg${i}`).join(", ");
306
+ const ret = node.returnType ?? (language === "python" ? "None" : "void");
307
+ if (language === "python") {
308
+ return `def ${node.name}(${argList}) -> ${ret}`;
309
+ }
310
+ if (language === "go") {
311
+ return `func ${node.name}(${argList}) ${ret}`;
312
+ }
313
+ if (language === "rust") {
314
+ return `fn ${node.name}(${argList}) -> ${ret}`;
315
+ }
316
+ // TS / Java / C# fallback.
317
+ return `${node.name}(${argList}): ${ret}`;
318
+ }
319
+ function propertyLine(node, language) {
320
+ const ret = node.returnType;
321
+ if (language === "python") {
322
+ return ret !== undefined ? `${node.name}: ${ret}` : `${node.name} = ...`;
323
+ }
324
+ if (language === "go") {
325
+ return ret !== undefined ? `${node.name} ${ret}` : node.name;
326
+ }
327
+ if (language === "rust") {
328
+ return ret !== undefined ? `${node.name}: ${ret}` : node.name;
329
+ }
330
+ return ret !== undefined ? `${node.name}: ${ret}` : node.name;
331
+ }
332
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/tools/signature.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `sql` — raw read-only SQL / Cypher over the local graph store.
3
+ *
4
+ * The tool accepts either `sql` (DuckDB backend) or `cypher` (graph-db
5
+ * backend, `CODEHUB_STORE=lbug`) — exactly one per call. The read-only
6
+ * guards (`assertReadOnlySql` / `assertReadOnlyCypher`) reject any write
7
+ * verb before the statement reaches the underlying engine.
8
+ *
9
+ * - SQL path: `SqlGuardError` on violation → INVALID_INPUT envelope.
10
+ * - Cypher path: `CypherGuardError` on violation → INVALID_INPUT envelope.
11
+ * - Cypher path without `CODEHUB_STORE=lbug` → INVALID_INPUT with a
12
+ * "cypher unavailable" hint.
13
+ * - Both `sql` and `cypher` supplied → INVALID_INPUT "choose one".
14
+ *
15
+ * A default 5 s timeout caps runaway queries (DuckDB itself has no SQL
16
+ * timeout — the adapter interrupts via a JS timer; the graph-db adapter
17
+ * honours `timeoutMs` through its pool).
18
+ *
19
+ * The tool description embeds the node-kind and relation-type vocabulary
20
+ * so agents can author correct queries without a separate schema probe.
21
+ */
22
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
23
+ import { type ToolContext, type ToolResult } from "./shared.js";
24
+ interface SqlArgs {
25
+ readonly sql?: string | undefined;
26
+ readonly cypher?: string | undefined;
27
+ readonly repo?: string | undefined;
28
+ readonly repo_uri?: string | undefined;
29
+ readonly timeout_ms?: number | undefined;
30
+ }
31
+ export declare function runSql(ctx: ToolContext, args: SqlArgs): Promise<ToolResult>;
32
+ export declare function registerSqlTool(server: McpServer, ctx: ToolContext): void;
33
+ export {};
34
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/tools/sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EAGhB,MAAM,aAAa,CAAC;AAiCrB,UAAU,OAAO;IACf,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAWD,wBAAsB,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAqHjF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAoBzE"}