@livestore/cli 0.4.0-dev.9 → 0.5.0-dev.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 (136) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/__tests__/fixtures/mock-config.d.ts +63 -0
  3. package/dist/__tests__/fixtures/mock-config.d.ts.map +1 -0
  4. package/dist/__tests__/fixtures/mock-config.js +94 -0
  5. package/dist/__tests__/fixtures/mock-config.js.map +1 -0
  6. package/dist/__tests__/sync-operations.test.d.ts +2 -0
  7. package/dist/__tests__/sync-operations.test.d.ts.map +1 -0
  8. package/dist/__tests__/sync-operations.test.js +167 -0
  9. package/dist/__tests__/sync-operations.test.js.map +1 -0
  10. package/dist/bin.js +6 -5
  11. package/dist/bin.js.map +1 -1
  12. package/dist/cli.d.ts +2 -9
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +4 -5
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/__fixtures__/mcp-protocol-server.d.ts +2 -0
  17. package/dist/commands/__fixtures__/mcp-protocol-server.d.ts.map +1 -0
  18. package/dist/commands/__fixtures__/mcp-protocol-server.js +10 -0
  19. package/dist/commands/__fixtures__/mcp-protocol-server.js.map +1 -0
  20. package/dist/commands/import-export.d.ts +20 -0
  21. package/dist/commands/import-export.d.ts.map +1 -0
  22. package/dist/commands/import-export.js +135 -0
  23. package/dist/commands/import-export.js.map +1 -0
  24. package/dist/commands/mcp-coach.d.ts +21 -12
  25. package/dist/commands/mcp-coach.d.ts.map +1 -1
  26. package/dist/commands/mcp-coach.js +49 -53
  27. package/dist/commands/mcp-coach.js.map +1 -1
  28. package/dist/commands/mcp-protocols.d.ts +7 -0
  29. package/dist/commands/mcp-protocols.d.ts.map +1 -0
  30. package/dist/commands/mcp-protocols.js +12 -0
  31. package/dist/commands/mcp-protocols.js.map +1 -0
  32. package/dist/commands/mcp-protocols.test.d.ts +2 -0
  33. package/dist/commands/mcp-protocols.test.d.ts.map +1 -0
  34. package/dist/commands/mcp-protocols.test.js +60 -0
  35. package/dist/commands/mcp-protocols.test.js.map +1 -0
  36. package/dist/commands/mcp-stdio.test.d.ts +2 -0
  37. package/dist/commands/mcp-stdio.test.d.ts.map +1 -0
  38. package/dist/commands/mcp-stdio.test.js +79 -0
  39. package/dist/commands/mcp-stdio.test.js.map +1 -0
  40. package/dist/commands/mcp-tool-handlers.d.ts +6 -0
  41. package/dist/commands/mcp-tool-handlers.d.ts.map +1 -0
  42. package/dist/commands/{mcp-tools.js → mcp-tool-handlers.js} +80 -45
  43. package/dist/commands/mcp-tool-handlers.js.map +1 -0
  44. package/dist/commands/mcp-tools-defs.d.ts +134 -0
  45. package/dist/commands/mcp-tools-defs.d.ts.map +1 -0
  46. package/dist/commands/mcp-tools-defs.js +285 -0
  47. package/dist/commands/mcp-tools-defs.js.map +1 -0
  48. package/dist/commands/mcp-tools-defs.test.d.ts +2 -0
  49. package/dist/commands/mcp-tools-defs.test.d.ts.map +1 -0
  50. package/dist/commands/mcp-tools-defs.test.js +11 -0
  51. package/dist/commands/mcp-tools-defs.test.js.map +1 -0
  52. package/dist/commands/mcp.d.ts +1 -3
  53. package/dist/commands/mcp.d.ts.map +1 -1
  54. package/dist/commands/mcp.js +7 -5
  55. package/dist/commands/mcp.js.map +1 -1
  56. package/dist/commands/new-project.d.ts +22 -23
  57. package/dist/commands/new-project.d.ts.map +1 -1
  58. package/dist/commands/new-project.js +85 -44
  59. package/dist/commands/new-project.js.map +1 -1
  60. package/dist/mcp-content/architecture.d.ts +1 -1
  61. package/dist/mcp-content/architecture.d.ts.map +1 -1
  62. package/dist/mcp-content/architecture.js +3 -3
  63. package/dist/mcp-content/features.d.ts +1 -1
  64. package/dist/mcp-content/features.d.ts.map +1 -1
  65. package/dist/mcp-content/features.js +1 -1
  66. package/dist/mcp-content/getting-started.d.ts +1 -1
  67. package/dist/mcp-content/getting-started.d.ts.map +1 -1
  68. package/dist/mcp-content/getting-started.js +37 -37
  69. package/dist/mcp-content/overview.d.ts +1 -1
  70. package/dist/mcp-content/overview.d.ts.map +1 -1
  71. package/dist/mcp-content/overview.js +6 -6
  72. package/dist/mcp-content/schemas/blog.d.ts +1 -1
  73. package/dist/mcp-content/schemas/blog.d.ts.map +1 -1
  74. package/dist/mcp-content/schemas/blog.js +25 -25
  75. package/dist/mcp-content/schemas/ecommerce.d.ts +1 -1
  76. package/dist/mcp-content/schemas/ecommerce.d.ts.map +1 -1
  77. package/dist/mcp-content/schemas/ecommerce.js +67 -67
  78. package/dist/mcp-content/schemas/social.d.ts +1 -1
  79. package/dist/mcp-content/schemas/social.d.ts.map +1 -1
  80. package/dist/mcp-content/schemas/social.js +48 -48
  81. package/dist/mcp-content/schemas/todo.d.ts +1 -1
  82. package/dist/mcp-content/schemas/todo.d.ts.map +1 -1
  83. package/dist/mcp-content/schemas/todo.js +35 -35
  84. package/dist/mcp-runtime/runtime.d.ts +48 -0
  85. package/dist/mcp-runtime/runtime.d.ts.map +1 -0
  86. package/dist/mcp-runtime/runtime.js +107 -0
  87. package/dist/mcp-runtime/runtime.js.map +1 -0
  88. package/dist/module-loader.d.ts +22 -0
  89. package/dist/module-loader.d.ts.map +1 -0
  90. package/dist/module-loader.js +75 -0
  91. package/dist/module-loader.js.map +1 -0
  92. package/dist/package-manager.d.ts +38 -0
  93. package/dist/package-manager.d.ts.map +1 -0
  94. package/dist/package-manager.js +33 -0
  95. package/dist/package-manager.js.map +1 -0
  96. package/dist/package-manager.test.d.ts +2 -0
  97. package/dist/package-manager.test.d.ts.map +1 -0
  98. package/dist/package-manager.test.js +57 -0
  99. package/dist/package-manager.test.js.map +1 -0
  100. package/dist/sync-operations.d.ts +115 -0
  101. package/dist/sync-operations.d.ts.map +1 -0
  102. package/dist/sync-operations.js +178 -0
  103. package/dist/sync-operations.js.map +1 -0
  104. package/package.json +57 -15
  105. package/src/__tests__/fixtures/mock-config.ts +112 -0
  106. package/src/__tests__/sync-operations.test.ts +218 -0
  107. package/src/bin.ts +8 -6
  108. package/src/cli.ts +5 -6
  109. package/src/commands/__fixtures__/mcp-protocol-server.ts +12 -0
  110. package/src/commands/import-export.ts +283 -0
  111. package/src/commands/mcp-coach.ts +76 -75
  112. package/src/commands/mcp-protocols.test.ts +76 -0
  113. package/src/commands/mcp-protocols.ts +12 -0
  114. package/src/commands/mcp-stdio.test.ts +93 -0
  115. package/src/commands/{mcp-tools.ts → mcp-tool-handlers.ts} +100 -61
  116. package/src/commands/mcp-tools-defs.test.ts +13 -0
  117. package/src/commands/mcp-tools-defs.ts +320 -0
  118. package/src/commands/mcp.ts +10 -6
  119. package/src/commands/new-project.ts +124 -57
  120. package/src/mcp-content/architecture.ts +3 -3
  121. package/src/mcp-content/features.ts +1 -1
  122. package/src/mcp-content/getting-started.ts +37 -37
  123. package/src/mcp-content/overview.ts +6 -6
  124. package/src/mcp-content/schemas/blog.ts +25 -25
  125. package/src/mcp-content/schemas/ecommerce.ts +67 -67
  126. package/src/mcp-content/schemas/social.ts +48 -48
  127. package/src/mcp-content/schemas/todo.ts +35 -35
  128. package/src/mcp-runtime/runtime.ts +147 -0
  129. package/src/module-loader.ts +94 -0
  130. package/src/package-manager.test.ts +66 -0
  131. package/src/package-manager.ts +44 -0
  132. package/src/sync-operations.ts +360 -0
  133. package/dist/commands/mcp-tools.d.ts +0 -58
  134. package/dist/commands/mcp-tools.d.ts.map +0 -1
  135. package/dist/commands/mcp-tools.js.map +0 -1
  136. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-export.js","sourceRoot":"","sources":["../../src/commands/import-export.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,28 @@
1
- import { AiError, Effect, Schema, Tool } from '@livestore/utils/effect';
1
+ import { AiError, Tool } from 'effect/unstable/ai';
2
+ import { Effect, Schema } from '@livestore/utils/effect';
2
3
  export declare const coachTool: Tool.Tool<"livestore_coach", {
3
4
  readonly parameters: Schema.Struct<{
4
- code: Schema.SchemaClass<string, string, never>;
5
- codeType: Schema.optional<Schema.SchemaClass<string, string, never>>;
5
+ readonly code: Schema.String;
6
+ readonly codeType: Schema.optional<Schema.String>;
6
7
  }>;
7
8
  readonly success: Schema.Struct<{
8
- feedback: Schema.SchemaClass<string, string, never>;
9
- score: Schema.optional<Schema.SchemaClass<number, number, never>>;
10
- suggestions: Schema.Array$<Schema.SchemaClass<string, string, never>>;
9
+ readonly feedback: Schema.String;
10
+ readonly score: Schema.optional<Schema.Number>;
11
+ readonly suggestions: Schema.$Array<Schema.String>;
11
12
  }>;
12
- readonly failure: Schema.Union<[typeof AiError.HttpRequestError, typeof AiError.HttpResponseError, typeof AiError.MalformedInput, typeof AiError.MalformedOutput, typeof AiError.UnknownError]>;
13
+ readonly failure: typeof AiError.AiError;
14
+ readonly failureMode: "error";
13
15
  }, never>;
14
- export declare const coachToolHandler: (args_0: any) => Effect.Effect<{
15
- feedback: string;
16
- score: number | undefined;
17
- suggestions: string[];
18
- }, AiError.AiError, never>;
16
+ type CoachToolHandlerInput = {
17
+ readonly code: string;
18
+ readonly codeType?: string | undefined;
19
+ };
20
+ type CoachToolResult = {
21
+ readonly feedback: string;
22
+ readonly score: number | undefined;
23
+ readonly suggestions: string[];
24
+ };
25
+ /** Coach tool handler that uses OpenAI for analysis */
26
+ export declare const coachToolHandler: (input: CoachToolHandlerInput) => Effect.Effect<CoachToolResult, AiError.AiError>;
27
+ export {};
19
28
  //# sourceMappingURL=mcp-coach.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-coach.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-coach.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EAEP,MAAM,EAKN,MAAM,EACN,IAAI,EACL,MAAM,yBAAyB,CAAA;AAGhC,eAAO,MAAM,SAAS;;;;;;;;;;;SA+BpB,CAAA;AAWF,eAAO,MAAM,gBAAgB;;;;0BAyE5B,CAAA"}
1
+ {"version":3,"file":"mcp-coach.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-coach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAyB,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAGzE,OAAO,EAAU,MAAM,EAA0B,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGxF,eAAO,MAAM,SAAS;;;;;;;;;;;;SA+BpB,CAAA;AAQF,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAC/B,CAAA;AAED,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,CAyE3G,CAAA"}
@@ -1,45 +1,42 @@
1
+ import { AiError, LanguageModel, Prompt, Tool } from 'effect/unstable/ai';
1
2
  import { OpenAiClient, OpenAiLanguageModel } from '@effect/ai-openai';
2
- import { AiError, Config, Effect, FetchHttpClient, LanguageModel, Layer, Prompt, Schema, Tool, } from '@livestore/utils/effect';
3
+ import { Config, Effect, FetchHttpClient, Layer, Schema } from '@livestore/utils/effect';
3
4
  // Define the coach tool that analyzes LiveStore usage
4
5
  export const coachTool = Tool.make('livestore_coach', {
5
6
  description: 'Analyze LiveStore code (schemas, queries, mutations, etc.) and provide AI-powered feedback on best practices, performance, and improvements.',
6
- parameters: {
7
- code: Schema.String.annotations({
7
+ parameters: Schema.Struct({
8
+ code: Schema.String.annotate({
8
9
  description: 'The LiveStore code to analyze (TypeScript/JavaScript)',
9
10
  }),
10
- codeType: Schema.optional(Schema.String.annotations({
11
+ codeType: Schema.optional(Schema.String.annotate({
11
12
  description: "Type of code being analyzed: 'schema', 'query', 'mutation', 'component', or 'general'",
12
13
  })),
13
- },
14
+ }),
14
15
  success: Schema.Struct({
15
- feedback: Schema.String.annotations({
16
+ feedback: Schema.String.annotate({
16
17
  description: 'AI-generated feedback and recommendations for the code',
17
18
  }),
18
- score: Schema.optional(Schema.Number.annotations({
19
+ score: Schema.optional(Schema.Number.annotate({
19
20
  description: 'Code quality score from 1-10 (optional)',
20
21
  })),
21
- suggestions: Schema.Array(Schema.String.annotations({
22
+ suggestions: Schema.Array(Schema.String.annotate({
22
23
  description: 'Specific actionable suggestions for improvement',
23
- })).annotations({
24
+ })).annotate({
24
25
  description: 'List of specific improvement suggestions',
25
26
  }),
26
27
  }),
27
28
  failure: AiError.AiError,
28
29
  });
29
- const OpenAiClientLayer = OpenAiClient.layerConfig({
30
- apiKey: Config.redacted('OPENAI_API_KEY'),
31
- });
32
- const OpenAiModel = OpenAiLanguageModel.layer({
33
- model: 'gpt-5-nano',
34
- });
35
- // Coach tool handler that uses OpenAI for analysis
36
- export const coachToolHandler = Effect.fnUntraced(function* ({ code, codeType }) {
37
- // Build the analysis prompt
38
- const codeTypeContext = codeType ? `This is ${codeType} code using LiveStore. ` : 'This is LiveStore code. ';
39
- const prompt = Prompt.makeMessage('user', {
40
- content: [
41
- Prompt.makePart('text', {
42
- text: `${codeTypeContext}Please review the following code and provide helpful feedback focusing on:
30
+ /** Composed layer: HttpClient → OpenAiClient → LanguageModel */
31
+ const LanguageModelLayer = OpenAiLanguageModel.layer({ model: 'gpt-4o-mini' }).pipe(Layer.provide(OpenAiClient.layerConfig({ apiKey: Config.redacted('OPENAI_API_KEY') })), Layer.provide(FetchHttpClient.layer));
32
+ /** Coach tool handler that uses OpenAI for analysis */
33
+ export const coachToolHandler = Effect.fn('mcp-coach-handler')(({ code, codeType }) => {
34
+ const effect = Effect.gen(function* () {
35
+ const codeTypeContext = codeType !== undefined ? `This is ${codeType} code using LiveStore. ` : 'This is LiveStore code. ';
36
+ const prompt = Prompt.makeMessage('user', {
37
+ content: [
38
+ Prompt.makePart('text', {
39
+ text: `${codeTypeContext}Please review the following code and provide helpful feedback focusing on:
43
40
 
44
41
  1. LiveStore best practices and conventions
45
42
  2. Schema design and relationships (if applicable)
@@ -61,35 +58,34 @@ Please provide:
61
58
  4. Any potential issues or concerns
62
59
 
63
60
  Format your response as constructive feedback that helps developers improve their LiveStore usage.`,
64
- }),
65
- ],
61
+ }),
62
+ ],
63
+ });
64
+ const systemPrompt = Prompt.makeMessage('system', {
65
+ content: `You are an expert LiveStore developer and code reviewer. Provide constructive, specific, and actionable feedback on LiveStore code. Focus on best practices, performance, and maintainability.`,
66
+ });
67
+ const llm = yield* LanguageModel.LanguageModel;
68
+ const completion = yield* llm.generateText({ prompt: Prompt.fromMessages([systemPrompt, prompt]) });
69
+ const feedback = completion.text ?? 'Unable to generate feedback';
70
+ const suggestions = feedback
71
+ .split('\n')
72
+ .filter((line) => line.trim().startsWith('-') ||
73
+ line.trim().startsWith('*') ||
74
+ line.trim().startsWith('•') ||
75
+ line.toLowerCase().includes('recommend') ||
76
+ line.toLowerCase().includes('consider') ||
77
+ line.toLowerCase().includes('improve'))
78
+ .map((line) => line.replace(/^[-*•]\s*/, '').trim())
79
+ .filter((suggestion) => suggestion.length > 10)
80
+ .slice(0, 5);
81
+ const scoreMatch = feedback.match(/(?:score|rating|quality).*?(\d+(?:\.\d+)?)/i);
82
+ const score = scoreMatch !== null ? Number.parseFloat(scoreMatch[1] ?? '0') : undefined;
83
+ return {
84
+ feedback,
85
+ score: score !== undefined && score >= 1 && score <= 10 ? score : undefined,
86
+ suggestions,
87
+ };
66
88
  });
67
- const systemPrompt = Prompt.makeMessage('system', {
68
- content: `You are an expert LiveStore developer and code reviewer. Provide constructive, specific, and actionable feedback on LiveStore code. Focus on best practices, performance, and maintainability.`,
69
- });
70
- // Get OpenAI client and call the API
71
- const llm = yield* LanguageModel.LanguageModel;
72
- const completion = yield* llm.generateText({ prompt: Prompt.fromMessages([systemPrompt, prompt]) });
73
- const feedback = completion.text ?? 'Unable to generate feedback';
74
- // Extract suggestions from the feedback (simple approach)
75
- const suggestions = feedback
76
- .split('\n')
77
- .filter((line) => line.trim().startsWith('-') ||
78
- line.trim().startsWith('*') ||
79
- line.trim().startsWith('•') ||
80
- line.toLowerCase().includes('recommend') ||
81
- line.toLowerCase().includes('consider') ||
82
- line.toLowerCase().includes('improve'))
83
- .map((line) => line.replace(/^[-*•]\s*/, '').trim())
84
- .filter((suggestion) => suggestion.length > 10)
85
- .slice(0, 5); // Limit to 5 suggestions
86
- // Try to extract a score (simple regex approach)
87
- const scoreMatch = feedback.match(/(?:score|rating|quality).*?(\d+(?:\.\d+)?)/i);
88
- const score = scoreMatch ? Number.parseFloat(scoreMatch[1] ?? '0') : undefined;
89
- return {
90
- feedback,
91
- score: score && score >= 1 && score <= 10 ? score : undefined,
92
- suggestions,
93
- };
94
- }, Effect.provide(Layer.provideMerge(OpenAiModel, OpenAiClientLayer)), Effect.provide(FetchHttpClient.layer), Effect.catchTag('ConfigError', (e) => Effect.die(e)));
89
+ return effect.pipe(Effect.provide(LanguageModelLayer), Effect.catchTag('ConfigError', (e) => Effect.die(e)));
90
+ });
95
91
  //# sourceMappingURL=mcp-coach.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-coach.js","sourceRoot":"","sources":["../../src/commands/mcp-coach.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-coach.js","sourceRoot":"","sources":["../../src/commands/mcp-coach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpProtocol } from 'effect/unstable/ai';
2
+ /**
3
+ * MCP stdio selects an exact offered version when available and otherwise
4
+ * falls back to the first adapter, so keep every supported adapter newest-first.
5
+ */
6
+ export declare const supportedMcpProtocols: readonly [McpProtocol.ProtocolAdapter<"2025-11-25">, McpProtocol.ProtocolAdapter<"2025-06-18">, McpProtocol.ProtocolAdapter<"2025-03-26">, McpProtocol.ProtocolAdapter<"2024-11-05">];
7
+ //# sourceMappingURL=mcp-protocols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-protocols.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-protocols.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,uLAKxB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { McpProtocol } from 'effect/unstable/ai';
2
+ /**
3
+ * MCP stdio selects an exact offered version when available and otherwise
4
+ * falls back to the first adapter, so keep every supported adapter newest-first.
5
+ */
6
+ export const supportedMcpProtocols = [
7
+ McpProtocol.v2025_11_25,
8
+ McpProtocol.v2025_06_18,
9
+ McpProtocol.v2025_03_26,
10
+ McpProtocol.v2024_11_05,
11
+ ];
12
+ //# sourceMappingURL=mcp-protocols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-protocols.js","sourceRoot":"","sources":["../../src/commands/mcp-protocols.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,WAAW;IACvB,WAAW,CAAC,WAAW;CACf,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-protocols.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-protocols.test.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-protocols.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
3
+ import { supportedMcpProtocols } from "./mcp-protocols.js";
4
+ const protocolVersions = ['2025-11-25', '2025-06-18', '2025-03-26', '2024-11-05'];
5
+ Vitest.describe('supportedMcpProtocols', () => {
6
+ Vitest.it('keeps the fallback protocol newest-first', () => {
7
+ Vitest.expect(supportedMcpProtocols.map((protocol) => protocol.protocolVersion)).toEqual(protocolVersions);
8
+ });
9
+ Vitest.it.each(protocolVersions)('negotiates an exact %s stdio initialize offer', async (protocolVersion) => {
10
+ const response = await initialize(protocolVersion);
11
+ Vitest.expect(response.result?.protocolVersion).toBe(protocolVersion);
12
+ });
13
+ });
14
+ const initialize = (protocolVersion) => new Promise((resolve, reject) => {
15
+ const child = spawn('bun', [new URL('./__fixtures__/mcp-protocol-server.ts', import.meta.url).pathname], {
16
+ stdio: ['pipe', 'pipe', 'pipe'],
17
+ });
18
+ let stdout = '';
19
+ let stderr = '';
20
+ const timeout = setTimeout(() => {
21
+ child.kill('SIGTERM');
22
+ reject(new Error(`MCP initialize timed out. stdout=${stdout} stderr=${stderr}`));
23
+ }, 5_000);
24
+ child.stdout.setEncoding('utf8');
25
+ child.stderr.setEncoding('utf8');
26
+ child.stdout.on('data', (chunk) => {
27
+ stdout += chunk;
28
+ if (stdout.endsWith('\n') === false)
29
+ return;
30
+ try {
31
+ const response = JSON.parse(stdout.trim());
32
+ clearTimeout(timeout);
33
+ child.kill('SIGTERM');
34
+ resolve(response);
35
+ }
36
+ catch (error) {
37
+ clearTimeout(timeout);
38
+ child.kill('SIGTERM');
39
+ reject(error);
40
+ }
41
+ });
42
+ child.stderr.on('data', (chunk) => {
43
+ stderr += chunk;
44
+ });
45
+ child.on('error', (error) => {
46
+ clearTimeout(timeout);
47
+ reject(error);
48
+ });
49
+ child.stdin.write(`${JSON.stringify({
50
+ jsonrpc: '2.0',
51
+ id: 1,
52
+ method: 'initialize',
53
+ params: {
54
+ protocolVersion,
55
+ capabilities: {},
56
+ clientInfo: { name: 'livestore-mcp-protocol-test', version: '0.0.0' },
57
+ },
58
+ })}\n`);
59
+ });
60
+ //# sourceMappingURL=mcp-protocols.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-protocols.test.js","sourceRoot":"","sources":["../../src/commands/mcp-protocols.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-stdio.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio.test.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-stdio.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
3
+ Vitest.describe('mcp server stdio', () => {
4
+ Vitest.it('reserves stdout for JSON-RPC messages', async () => {
5
+ const response = await initialize();
6
+ Vitest.expect(response.result?.protocolVersion).toBe('2025-06-18');
7
+ });
8
+ });
9
+ /** Exercises the real CLI entrypoint so root-level warnings and logs cannot corrupt MCP framing. */
10
+ const initialize = () => new Promise((resolve, reject) => {
11
+ const child = spawn('bun', [new URL('../bin.ts', import.meta.url).pathname, 'mcp', 'server'], {
12
+ stdio: ['pipe', 'pipe', 'pipe'],
13
+ });
14
+ let stdoutBuffer = '';
15
+ let stderr = '';
16
+ let settled = false;
17
+ const finish = (result) => {
18
+ if (settled === true)
19
+ return;
20
+ settled = true;
21
+ clearTimeout(timeout);
22
+ child.kill('SIGTERM');
23
+ if ('error' in result)
24
+ reject(result.error);
25
+ else
26
+ resolve(result.response);
27
+ };
28
+ const timeout = setTimeout(() => {
29
+ finish({ error: new Error(`MCP initialize timed out. stdout=${stdoutBuffer} stderr=${stderr}`) });
30
+ }, 5_000);
31
+ child.stdout.setEncoding('utf8');
32
+ child.stderr.setEncoding('utf8');
33
+ child.stdout.on('data', (chunk) => {
34
+ stdoutBuffer += chunk;
35
+ const lines = stdoutBuffer.split('\n');
36
+ stdoutBuffer = lines.pop() ?? '';
37
+ for (const line of lines) {
38
+ if (line.length === 0)
39
+ continue;
40
+ try {
41
+ const message = JSON.parse(line);
42
+ if (message.jsonrpc !== '2.0') {
43
+ finish({ error: new Error(`MCP stdout contained a non-JSON-RPC message: ${line}`) });
44
+ return;
45
+ }
46
+ if (message.id === 1) {
47
+ finish({ response: message });
48
+ return;
49
+ }
50
+ }
51
+ catch (error) {
52
+ finish({ error: new Error(`MCP stdout contained invalid JSON: ${line}`, { cause: error }) });
53
+ return;
54
+ }
55
+ }
56
+ });
57
+ child.stderr.on('data', (chunk) => {
58
+ stderr += chunk;
59
+ });
60
+ child.on('error', (error) => {
61
+ finish({ error });
62
+ });
63
+ child.on('exit', (code) => {
64
+ if (settled === false) {
65
+ finish({ error: new Error(`MCP server exited before initialize completed (code ${code}). stderr=${stderr}`) });
66
+ }
67
+ });
68
+ child.stdin.write(`${JSON.stringify({
69
+ jsonrpc: '2.0',
70
+ id: 1,
71
+ method: 'initialize',
72
+ params: {
73
+ protocolVersion: '2025-06-18',
74
+ capabilities: {},
75
+ clientInfo: { name: 'livestore-mcp-stdio-test', version: '0.0.0' },
76
+ },
77
+ })}\n`);
78
+ });
79
+ //# sourceMappingURL=mcp-stdio.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-stdio.test.js","sourceRoot":"","sources":["../../src/commands/mcp-stdio.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type Toolkit } from 'effect/unstable/ai';
2
+ import { livestoreToolkit } from './mcp-tools-defs.ts';
3
+ type LivestoreToolHandlers = Toolkit.HandlersFrom<Toolkit.Tools<typeof livestoreToolkit>>;
4
+ export declare const toolHandlers: LivestoreToolHandlers;
5
+ export {};
6
+ //# sourceMappingURL=mcp-tool-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-handlers.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-tool-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAYjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAKtD,KAAK,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAA;AAEzF,eAAO,MAAM,YAAY,EAAE,qBA4LzB,CAAA"}
@@ -1,47 +1,16 @@
1
- import { Effect, Schema, Tool, Toolkit } from '@livestore/utils/effect';
1
+ import {} from 'effect/unstable/ai';
2
+ import { Effect, FetchHttpClient, Layer } from '@livestore/utils/effect';
3
+ import { PlatformNode } from '@livestore/utils/node';
2
4
  import { blogSchemaContent } from "../mcp-content/schemas/blog.js";
3
5
  import { ecommerceSchemaContent } from "../mcp-content/schemas/ecommerce.js";
4
6
  import { socialSchemaContent } from "../mcp-content/schemas/social.js";
5
7
  import { todoSchemaContent } from "../mcp-content/schemas/todo.js";
6
- import { coachTool, coachToolHandler } from "./mcp-coach.js";
7
- // Create toolkit with tools and handlers following Tim Smart's pattern
8
- export const livestoreToolkit = Toolkit.make(coachTool, Tool.make('livestore_generate_schema', {
9
- description: 'Generate a LiveStore schema for a specific use case. Choose from predefined types (todo, blog, social, ecommerce) or request a custom schema by providing a description.',
10
- parameters: {
11
- schemaType: Schema.String.annotations({
12
- description: "Schema type: 'todo', 'blog', 'social', 'ecommerce', or 'custom'",
13
- }),
14
- customDescription: Schema.optional(Schema.String.annotations({
15
- description: "For custom schemas: describe your data model needs (e.g., 'user management system with roles and permissions')",
16
- })),
17
- },
18
- success: Schema.Struct({
19
- schemaCode: Schema.String.annotations({
20
- description: 'The generated LiveStore schema TypeScript code',
21
- }),
22
- explanation: Schema.String.annotations({
23
- description: 'Brief explanation of the schema structure',
24
- }),
25
- }),
26
- }), Tool.make('livestore_get_example_schema', {
27
- description: 'Get a complete example LiveStore schema with TypeScript code. Returns ready-to-use schema definitions for common application types.',
28
- parameters: {
29
- type: Schema.String.annotations({
30
- description: "Example type: 'todo', 'blog', 'social', or 'ecommerce'",
31
- }),
32
- },
33
- success: Schema.Struct({
34
- schemaCode: Schema.String.annotations({
35
- description: 'The complete LiveStore schema code',
36
- }),
37
- description: Schema.String.annotations({
38
- description: 'Description of what this schema models',
39
- }),
40
- }),
41
- })
42
- .annotate(Tool.Readonly, true)
43
- .annotate(Tool.Destructive, false));
44
- // Tool handlers using Tim Smart's pattern
8
+ import * as Runtime from "../mcp-runtime/runtime.js";
9
+ import * as SyncOps from "../sync-operations.js";
10
+ import { coachToolHandler } from "./mcp-coach.js";
11
+ import { livestoreToolkit } from "./mcp-tools-defs.js";
12
+ /** Layer providing FileSystem and HttpClient for sync operations */
13
+ const SyncOpsLayer = Layer.mergeAll(PlatformNode.NodeFileSystem.layer, FetchHttpClient.layer);
45
14
  export const toolHandlers = livestoreToolkit.of({
46
15
  livestore_coach: coachToolHandler,
47
16
  livestore_generate_schema: Effect.fnUntraced(function* ({ schemaType, customDescription }) {
@@ -65,7 +34,7 @@ export const toolHandlers = livestoreToolkit.of({
65
34
  explanation = 'E-commerce schema with products, categories, orders, and inventory';
66
35
  break;
67
36
  case 'custom': {
68
- if (!customDescription) {
37
+ if (customDescription == null) {
69
38
  schemaCode = `// Custom schema requested but no description provided
70
39
  import { Schema } from '@livestore/livestore'
71
40
 
@@ -83,11 +52,11 @@ export const schema = Schema.create({
83
52
  break;
84
53
  }
85
54
  // Generate a basic custom schema based on description
86
- const tableName = customDescription.toLowerCase().includes('user')
55
+ const tableName = customDescription.toLowerCase().includes('user') === true
87
56
  ? 'users'
88
- : customDescription.toLowerCase().includes('product')
57
+ : customDescription.toLowerCase().includes('product') === true
89
58
  ? 'products'
90
- : customDescription.toLowerCase().includes('post')
59
+ : customDescription.toLowerCase().includes('post') === true
91
60
  ? 'posts'
92
61
  : 'items';
93
62
  schemaCode = `// Custom schema based on: ${customDescription}
@@ -144,5 +113,71 @@ export const schema = Schema.create({
144
113
  }
145
114
  return { schemaCode, description };
146
115
  }),
116
+ // Connect the single in-process LiveStore instance from user module
117
+ livestore_instance_connect: Effect.fnUntraced(function* ({ configPath, storeId, clientId, sessionId }) {
118
+ const store = yield* Runtime.init({
119
+ configPath,
120
+ storeId,
121
+ ...(clientId !== undefined ? { clientId } : {}),
122
+ ...(sessionId !== undefined ? { sessionId } : {}),
123
+ }).pipe(Effect.orDie);
124
+ const eventNames = Array.from(store.schema.eventsDefsMap.keys());
125
+ const tableNames = Array.from(store.schema.state.sqlite.tables.keys());
126
+ return {
127
+ storeId: store.storeId,
128
+ clientId: store.clientId,
129
+ sessionId: store.sessionId,
130
+ schemaInfo: {
131
+ tableNames,
132
+ eventNames,
133
+ },
134
+ };
135
+ }),
136
+ // Execute a raw SQL query against the local client DB
137
+ livestore_instance_query: Effect.fnUntraced(function* ({ sql, bindValues }) {
138
+ return yield* Runtime.query({ sql, bindValues });
139
+ }),
140
+ // Validate and commit events
141
+ livestore_instance_commit_events: Effect.fnUntraced(function* ({ events }) {
142
+ return yield* Runtime.commit({ events });
143
+ }),
144
+ // Status
145
+ livestore_instance_status: Effect.fnUntraced(function* () {
146
+ return yield* Runtime.status;
147
+ }),
148
+ // Disconnect
149
+ livestore_instance_disconnect: Effect.fnUntraced(function* () {
150
+ return yield* Runtime.disconnect;
151
+ }),
152
+ // Sync export - pull all events from sync backend
153
+ livestore_sync_export: Effect.fnUntraced(function* ({ configPath, storeId, clientId }) {
154
+ const result = yield* SyncOps.pullEventsFromSyncBackend({
155
+ configPath,
156
+ storeId,
157
+ clientId: clientId ?? 'mcp-export',
158
+ }).pipe(Effect.scoped, Effect.provide(SyncOpsLayer), Effect.orDie);
159
+ return {
160
+ storeId: result.storeId,
161
+ eventCount: result.eventCount,
162
+ exportedAt: result.exportedAt,
163
+ data: result.data,
164
+ };
165
+ }),
166
+ // Sync import - push events to sync backend
167
+ livestore_sync_import: Effect.fnUntraced(function* ({ configPath, storeId, clientId, data, force, dryRun }) {
168
+ const result = yield* SyncOps.pushEventsToSyncBackend({
169
+ configPath,
170
+ storeId,
171
+ clientId: clientId ?? 'mcp-import',
172
+ data,
173
+ force: force ?? false,
174
+ dryRun: dryRun ?? false,
175
+ }).pipe(Effect.scoped, Effect.provide(SyncOpsLayer), Effect.orDie);
176
+ return {
177
+ storeId: result.storeId,
178
+ eventCount: result.eventCount,
179
+ dryRun: result.dryRun,
180
+ };
181
+ }),
147
182
  });
148
- //# sourceMappingURL=mcp-tools.js.map
183
+ //# sourceMappingURL=mcp-tool-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-handlers.js","sourceRoot":"","sources":["../../src/commands/mcp-tool-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAA;AACpD,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,oEAAoE;AACpE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAA;AAI7F,MAAM,CAAC,MAAM,YAAY,GAA0B,gBAAgB,CAAC,EAAE,CAAC;IACrE,eAAe,EAAE,gBAAgB;IAEjC,yBAAyB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE;QACvF,IAAI,UAAkB,CAAA;QACtB,IAAI,WAAmB,CAAA;QAEvB,QAAQ,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;YACjC,KAAK,MAAM;gBACT,UAAU,GAAG,iBAAiB,CAAA;gBAC9B,WAAW,GAAG,0EAA0E,CAAA;gBACxF,MAAK;YACP,KAAK,MAAM;gBACT,UAAU,GAAG,iBAAiB,CAAA;gBAC9B,WAAW,GAAG,oEAAoE,CAAA;gBAClF,MAAK;YACP,KAAK,QAAQ;gBACX,UAAU,GAAG,mBAAmB,CAAA;gBAChC,WAAW,GAAG,2DAA2D,CAAA;gBACzE,MAAK;YACP,KAAK,WAAW;gBACd,UAAU,GAAG,sBAAsB,CAAA;gBACnC,WAAW,GAAG,oEAAoE,CAAA;gBAClF,MAAK;YACP,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC;oBAC9B,UAAU,GAAG;;;;;;;;;;;;GAYpB,CAAA;oBACO,WAAW,GAAG,oFAAoF,CAAA;oBAClG,MAAK;gBACP,CAAC;gBAED,sDAAsD;gBACtD,MAAM,SAAS,GACb,iBAAiB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI;oBACvD,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI;wBAC5D,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI;4BACzD,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,OAAO,CAAA;gBAEjB,UAAU,GAAG,8BAA8B,iBAAiB;;;eAGrD,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0BAA0B,SAAS;;;;;;;;;IASxG,SAAS,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;GACzE,CAAA;gBAEK,WAAW,GAAG,gCAAgC,iBAAiB,wGAAwG,CAAA;gBACvK,MAAK;YACP,CAAC;YACD;gBACE,UAAU,GAAG,iBAAiB,CAAA;gBAC9B,WAAW;oBACT,qGAAqG,CAAA;QAC3G,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;IACpC,CAAC,CAAC;IAEF,4BAA4B,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE;QACjE,IAAI,UAAkB,CAAA;QACtB,IAAI,WAAmB,CAAA;QAEvB,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3B,KAAK,MAAM;gBACT,UAAU,GAAG,iBAAiB,CAAA;gBAC9B,WAAW;oBACT,gIAAgI,CAAA;gBAClI,MAAK;YACP,KAAK,MAAM;gBACT,UAAU,GAAG,iBAAiB,CAAA;gBAC9B,WAAW;oBACT,yGAAyG,CAAA;gBAC3G,MAAK;YACP,KAAK,QAAQ;gBACX,UAAU,GAAG,mBAAmB,CAAA;gBAChC,WAAW;oBACT,8GAA8G,CAAA;gBAChH,MAAK;YACP,KAAK,WAAW;gBACd,UAAU,GAAG,sBAAsB,CAAA;gBACnC,WAAW;oBACT,4HAA4H,CAAA;gBAC9H,MAAK;YACP;gBACE,UAAU,GAAG,iBAAiB,CAAA;gBAC9B,WAAW,GAAG,+FAA+F,CAAA;QACjH,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;IACpC,CAAC,CAAC;IAEF,oEAAoE;IACpE,0BAA0B,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;QACnG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YAChC,UAAU;YACV,OAAO;YACP,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAEtE,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE;gBACV,UAAU;gBACV,UAAU;aACX;SACF,CAAA;IACH,CAAC,CAAC;IAEF,sDAAsD;IACtD,wBAAwB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE;QACxE,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAA;IAClD,CAAC,CAAC;IAEF,6BAA6B;IAC7B,gCAAgC,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;QACvE,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAC;IAEF,SAAS;IACT,yBAAyB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QACpD,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAA;IAC9B,CAAC,CAAC;IAEF,aAAa;IACb,6BAA6B,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QACxD,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAA;IAClC,CAAC,CAAC;IAEF,kDAAkD;IAClD,qBAAqB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE;QACnF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC;YACtD,UAAU;YACV,OAAO;YACP,QAAQ,EAAE,QAAQ,IAAI,YAAY;SACnC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAElE,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAA;IACH,CAAC,CAAC;IAEF,4CAA4C;IAC5C,qBAAqB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QACxG,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;YACpD,UAAU;YACV,OAAO;YACP,QAAQ,EAAE,QAAQ,IAAI,YAAY;YAClC,IAAI;YACJ,KAAK,EAAE,KAAK,IAAI,KAAK;YACrB,MAAM,EAAE,MAAM,IAAI,KAAK;SACxB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAElE,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAA;IACH,CAAC,CAAC;CACH,CAAC,CAAA"}