@skillsmith/mcp-server 0.4.11 → 0.4.12

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 (75) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/__tests__/tool-dispatch.envelope.test.d.ts +12 -0
  4. package/dist/src/__tests__/tool-dispatch.envelope.test.d.ts.map +1 -0
  5. package/dist/src/__tests__/tool-dispatch.envelope.test.js +205 -0
  6. package/dist/src/__tests__/tool-dispatch.envelope.test.js.map +1 -0
  7. package/dist/src/index.js +10 -1
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/middleware/license.d.ts +6 -6
  10. package/dist/src/middleware/license.d.ts.map +1 -1
  11. package/dist/src/middleware/license.js +11 -8
  12. package/dist/src/middleware/license.js.map +1 -1
  13. package/dist/src/tool-dispatch.d.ts.map +1 -1
  14. package/dist/src/tool-dispatch.js +58 -19
  15. package/dist/src/tool-dispatch.js.map +1 -1
  16. package/dist/src/tools/analytics.d.ts +8 -8
  17. package/dist/src/tools/audit-tools.d.ts +6 -6
  18. package/dist/src/tools/compliance-tools.d.ts +2 -2
  19. package/dist/src/tools/install.d.ts +9 -3
  20. package/dist/src/tools/install.d.ts.map +1 -1
  21. package/dist/src/tools/install.js +52 -11
  22. package/dist/src/tools/install.js.map +1 -1
  23. package/dist/src/tools/install.test.d.ts +17 -0
  24. package/dist/src/tools/install.test.d.ts.map +1 -0
  25. package/dist/src/tools/install.test.js +237 -0
  26. package/dist/src/tools/install.test.js.map +1 -0
  27. package/dist/src/tools/integration-tools.d.ts +8 -8
  28. package/dist/src/tools/publish.types.d.ts +2 -2
  29. package/dist/src/tools/rbac-tools.d.ts +4 -4
  30. package/dist/src/tools/recommend.types.d.ts +3 -3
  31. package/dist/src/tools/registry-tools.d.ts +6 -6
  32. package/dist/src/tools/registry-tools.d.ts.map +1 -1
  33. package/dist/src/tools/registry-tools.js +42 -4
  34. package/dist/src/tools/registry-tools.js.map +1 -1
  35. package/dist/src/tools/skill-diff.d.ts +2 -2
  36. package/dist/src/tools/sso-tools.d.ts +2 -2
  37. package/dist/src/tools/suggest.d.ts +4 -4
  38. package/dist/src/tools/team-resolver.d.ts +29 -0
  39. package/dist/src/tools/team-resolver.d.ts.map +1 -0
  40. package/dist/src/tools/team-resolver.js +46 -0
  41. package/dist/src/tools/team-resolver.js.map +1 -0
  42. package/dist/src/tools/team-resolver.test.d.ts +6 -0
  43. package/dist/src/tools/team-resolver.test.d.ts.map +1 -0
  44. package/dist/src/tools/team-resolver.test.js +73 -0
  45. package/dist/src/tools/team-resolver.test.js.map +1 -0
  46. package/dist/src/tools/team-workspace.d.ts +18 -4
  47. package/dist/src/tools/team-workspace.d.ts.map +1 -1
  48. package/dist/src/tools/team-workspace.js +149 -75
  49. package/dist/src/tools/team-workspace.js.map +1 -1
  50. package/dist/src/tools/team-workspace.live.d.ts +34 -0
  51. package/dist/src/tools/team-workspace.live.d.ts.map +1 -0
  52. package/dist/src/tools/team-workspace.live.js +182 -0
  53. package/dist/src/tools/team-workspace.live.js.map +1 -0
  54. package/dist/src/tools/team-workspace.live.test.d.ts +10 -0
  55. package/dist/src/tools/team-workspace.live.test.d.ts.map +1 -0
  56. package/dist/src/tools/team-workspace.live.test.js +177 -0
  57. package/dist/src/tools/team-workspace.live.test.js.map +1 -0
  58. package/dist/src/tools/team-workspace.stub.d.ts.map +1 -1
  59. package/dist/src/tools/team-workspace.stub.js +3 -1
  60. package/dist/src/tools/team-workspace.stub.js.map +1 -1
  61. package/dist/src/tools/team-workspace.test.d.ts +1 -0
  62. package/dist/src/tools/team-workspace.test.d.ts.map +1 -1
  63. package/dist/src/tools/team-workspace.test.js +43 -1
  64. package/dist/src/tools/team-workspace.test.js.map +1 -1
  65. package/dist/src/tools/uninstall.d.ts +1 -1
  66. package/dist/src/validation.d.ts +64 -0
  67. package/dist/src/validation.d.ts.map +1 -0
  68. package/dist/src/validation.js +73 -0
  69. package/dist/src/validation.js.map +1 -0
  70. package/dist/src/validation.test.d.ts +6 -0
  71. package/dist/src/validation.test.d.ts.map +1 -0
  72. package/dist/src/validation.test.js +102 -0
  73. package/dist/src/validation.test.js.map +1 -0
  74. package/package.json +2 -2
  75. package/server.json +3 -7
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @fileoverview Live-mode tests for team_workspace + share_skill MCP tools
3
+ * @see SMI-4312: service-role client post-resolution + cross-team hardening
4
+ *
5
+ * Kept in a sidecar so team-workspace.test.ts stays under the 500-line CI limit.
6
+ * Exercises the live Supabase-backed service by mocking `getSupabaseAdminClient`
7
+ * with a recording fake client.
8
+ */
9
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
10
+ // Live service and handlers: imported AFTER the vi.mock block below so that
11
+ // the module under test sees the mocked supabase-client exports.
12
+ import { executeTeamWorkspace, executeShareSkill, setTeamWorkspaceService, createStubService, } from './team-workspace.js';
13
+ import { createLiveService } from './team-workspace.live.js';
14
+ vi.mock('../supabase-client.js', () => ({
15
+ isSupabaseConfigured: vi.fn(() => true),
16
+ getSupabaseClient: vi.fn(),
17
+ getSupabaseAdminClient: vi.fn(),
18
+ resetSupabaseClients: vi.fn(),
19
+ }));
20
+ vi.mock('./team-resolver.js', () => ({
21
+ readLicenseKey: vi.fn(() => 'sk_test_fake_license'),
22
+ resolveLicenseTeamId: vi.fn(async () => 'team-alpha'),
23
+ }));
24
+ function createFakeClient(opts = {}) {
25
+ const calls = [];
26
+ function makeQuery(table, op) {
27
+ const record = { table, op, filters: [] };
28
+ calls.push(record);
29
+ const chain = {
30
+ select: () => chain,
31
+ eq: (column, value) => {
32
+ record.filters.push({ column, value });
33
+ return chain;
34
+ },
35
+ insert: (row) => {
36
+ record.op = 'insert';
37
+ record.payload = row;
38
+ return chain;
39
+ },
40
+ delete: () => {
41
+ record.op = 'delete';
42
+ return chain;
43
+ },
44
+ single: async () => {
45
+ return (opts.singleResponder?.() ?? {
46
+ data: null,
47
+ error: null,
48
+ });
49
+ },
50
+ then: (onFulfilled) => {
51
+ const resp = opts.thenResponder?.() ?? { data: [], error: null };
52
+ return Promise.resolve(onFulfilled(resp));
53
+ },
54
+ };
55
+ return chain;
56
+ }
57
+ const client = {
58
+ from: (table) => makeQuery(table, 'select'),
59
+ };
60
+ return { client, calls };
61
+ }
62
+ function makeContext() {
63
+ return {};
64
+ }
65
+ // ============================================================================
66
+ // Shared setup
67
+ // ============================================================================
68
+ beforeEach(() => {
69
+ // Install the live service so handlers hit the mocked admin client.
70
+ setTeamWorkspaceService(createLiveService());
71
+ });
72
+ afterEach(() => {
73
+ // Restore stub so unrelated tests start clean if the file grows.
74
+ setTeamWorkspaceService(createStubService());
75
+ vi.clearAllMocks();
76
+ });
77
+ // ============================================================================
78
+ // Tests — admin client is used post license resolution
79
+ // ============================================================================
80
+ describe('team-workspace live mode — SMI-4312', () => {
81
+ it('listWorkspaces calls the admin (service-role) client with team_id filter', async () => {
82
+ const { client, calls } = createFakeClient({
83
+ thenResponder: () => ({ data: [], error: null }),
84
+ });
85
+ const { getSupabaseAdminClient, getSupabaseClient } = await import('../supabase-client.js');
86
+ vi.mocked(getSupabaseAdminClient).mockResolvedValue(client);
87
+ const result = await executeTeamWorkspace({ action: 'list' }, makeContext());
88
+ expect(result.success).toBe(true);
89
+ expect(result.dataSource).toBe('live');
90
+ expect(getSupabaseAdminClient).toHaveBeenCalled();
91
+ // The anon-key client must NOT be used for CRUD in live mode.
92
+ expect(getSupabaseClient).not.toHaveBeenCalled();
93
+ // team_id filter must be applied on the query.
94
+ const q = calls.find((c) => c.table === 'team_workspaces');
95
+ expect(q).toBeDefined();
96
+ expect(q.filters.some((f) => f.column === 'team_id' && f.value === 'team-alpha')).toBe(true);
97
+ });
98
+ it('createWorkspace inserts with team_id from the resolved license', async () => {
99
+ const { client, calls } = createFakeClient({
100
+ singleResponder: () => ({
101
+ data: {
102
+ id: 'ws-new',
103
+ team_id: 'team-alpha',
104
+ name: 'New WS',
105
+ description: null,
106
+ settings: null,
107
+ created_by: null,
108
+ created_at: '2026-04-19T00:00:00Z',
109
+ updated_at: '2026-04-19T00:00:00Z',
110
+ },
111
+ error: null,
112
+ }),
113
+ });
114
+ const { getSupabaseAdminClient } = await import('../supabase-client.js');
115
+ vi.mocked(getSupabaseAdminClient).mockResolvedValue(client);
116
+ const result = await executeTeamWorkspace({ action: 'create', name: 'New WS' }, makeContext());
117
+ expect(result.success).toBe(true);
118
+ expect(result.workspace?.teamId).toBe('team-alpha');
119
+ const insertCall = calls.find((c) => c.op === 'insert');
120
+ expect(insertCall).toBeDefined();
121
+ expect(insertCall.payload?.team_id).toBe('team-alpha');
122
+ });
123
+ it('surfaces a typed error when SUPABASE_SERVICE_ROLE_KEY is not configured', async () => {
124
+ const { getSupabaseAdminClient } = await import('../supabase-client.js');
125
+ vi.mocked(getSupabaseAdminClient).mockRejectedValueOnce(new Error('Supabase admin not configured: SUPABASE_SERVICE_ROLE_KEY required'));
126
+ const result = await executeTeamWorkspace({ action: 'list' }, makeContext());
127
+ expect(result.success).toBe(false);
128
+ expect(result.dataSource).toBe('live');
129
+ expect(result.error).toMatch(/SUPABASE_SERVICE_ROLE_KEY/);
130
+ });
131
+ });
132
+ // ============================================================================
133
+ // Tests — cross-team workspace access hardening
134
+ // ============================================================================
135
+ describe('share_skill live mode — cross-team hardening — SMI-4312', () => {
136
+ const foreignWorkspaceId = '00000000-0000-0000-0000-0000000000ff';
137
+ /**
138
+ * Fake that returns "no row" whenever the team_workspaces SELECT is
139
+ * team-scoped — i.e. the caller tried to access a workspace owned by
140
+ * a different team. This is the cross-team attack shape.
141
+ */
142
+ function foreignWorkspaceFake() {
143
+ return createFakeClient({
144
+ singleResponder: () => ({
145
+ data: null,
146
+ error: { message: 'No rows found' },
147
+ }),
148
+ thenResponder: () => ({ data: [], error: null }),
149
+ });
150
+ }
151
+ it('share_skill add rejects a workspaceId that does not belong to the resolved team', async () => {
152
+ const { client } = foreignWorkspaceFake();
153
+ const { getSupabaseAdminClient } = await import('../supabase-client.js');
154
+ vi.mocked(getSupabaseAdminClient).mockResolvedValue(client);
155
+ const result = await executeShareSkill({ action: 'add', workspaceId: foreignWorkspaceId, skillId: 'author/name' }, makeContext());
156
+ expect(result.success).toBe(false);
157
+ expect(result.dataSource).toBe('live');
158
+ expect(result.error).toMatch(/not found in team/i);
159
+ });
160
+ it('share_skill list rejects a cross-team workspaceId', async () => {
161
+ const { client } = foreignWorkspaceFake();
162
+ const { getSupabaseAdminClient } = await import('../supabase-client.js');
163
+ vi.mocked(getSupabaseAdminClient).mockResolvedValue(client);
164
+ const result = await executeShareSkill({ action: 'list', workspaceId: foreignWorkspaceId }, makeContext());
165
+ expect(result.success).toBe(false);
166
+ expect(result.error).toMatch(/not found in team/i);
167
+ });
168
+ it('share_skill remove rejects a cross-team workspaceId', async () => {
169
+ const { client } = foreignWorkspaceFake();
170
+ const { getSupabaseAdminClient } = await import('../supabase-client.js');
171
+ vi.mocked(getSupabaseAdminClient).mockResolvedValue(client);
172
+ const result = await executeShareSkill({ action: 'remove', workspaceId: foreignWorkspaceId, skillId: 'author/name' }, makeContext());
173
+ expect(result.success).toBe(false);
174
+ expect(result.error).toMatch(/not found in team/i);
175
+ });
176
+ });
177
+ //# sourceMappingURL=team-workspace.live.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-workspace.live.test.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.live.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"team-workspace.stub.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,qBAAqB,CAAA;AAM5B,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI,oBAAoB,CAsExD"}
1
+ {"version":3,"file":"team-workspace.stub.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,qBAAqB,CAAA;AAM5B,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI,oBAAoB,CAwExD"}
@@ -17,7 +17,9 @@ export function createStubService() {
17
17
  const skills = new Map();
18
18
  return {
19
19
  async resolveTeamId(_licenseKey) {
20
- // TODO: Replace with Supabase RPC: license_key -> subscription -> team_id
20
+ // SMI-4292: Live resolution lives in team-workspace.live.ts via
21
+ // resolve_team_from_license RPC (migration 071). This stub returns a
22
+ // static team id for unit tests and unauthenticated environments.
21
23
  return 'team_stub_00000000-0000-0000-0000-000000000000';
22
24
  },
23
25
  async createWorkspace(teamId, name, description) {
@@ -1 +1 @@
1
- {"version":3,"file":"team-workspace.stub.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.stub.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-workspace.stub.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.stub.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * @fileoverview Unit tests for team_workspace and share_skill MCP tools
3
3
  * @see SMI-3895: Team Workspace + Share Skill MCP Tools
4
4
  * @see SMI-3898: Skill Sharing Controls
5
+ * @see SMI-4292: Wave 5A — live Supabase integration + typed error paths
5
6
  */
6
7
  export {};
7
8
  //# sourceMappingURL=team-workspace.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"team-workspace.test.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
1
+ {"version":3,"file":"team-workspace.test.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -2,9 +2,17 @@
2
2
  * @fileoverview Unit tests for team_workspace and share_skill MCP tools
3
3
  * @see SMI-3895: Team Workspace + Share Skill MCP Tools
4
4
  * @see SMI-3898: Skill Sharing Controls
5
+ * @see SMI-4292: Wave 5A — live Supabase integration + typed error paths
5
6
  */
6
- import { describe, it, expect, beforeEach } from 'vitest';
7
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
8
  import { teamWorkspaceInputSchema, shareSkillInputSchema, executeTeamWorkspace, executeShareSkill, createStubService, setTeamWorkspaceService, matchesPattern, checkSharingPolicy, } from './team-workspace.js';
9
+ // Mock isSupabaseConfigured so we can flip between 'stub' and 'live' modes
10
+ vi.mock('../supabase-client.js', () => ({
11
+ isSupabaseConfigured: vi.fn(() => false),
12
+ getSupabaseClient: vi.fn(),
13
+ getSupabaseAdminClient: vi.fn(),
14
+ resetSupabaseClients: vi.fn(),
15
+ }));
8
16
  // ============================================================================
9
17
  // Helpers
10
18
  // ============================================================================
@@ -199,6 +207,23 @@ describe('executeTeamWorkspace', () => {
199
207
  const result = await executeTeamWorkspace({ action: 'delete', workspaceId: '00000000-0000-0000-0000-000000000099' }, makeContext());
200
208
  expect(result.success).toBe(false);
201
209
  });
210
+ // SMI-4292: Typed error when Supabase live but license key missing
211
+ it('returns typed error in live mode when SKILLSMITH_LICENSE_KEY is missing', async () => {
212
+ const { isSupabaseConfigured } = await import('../supabase-client.js');
213
+ vi.mocked(isSupabaseConfigured).mockReturnValueOnce(true);
214
+ const orig = process.env.SKILLSMITH_LICENSE_KEY;
215
+ delete process.env.SKILLSMITH_LICENSE_KEY;
216
+ try {
217
+ const result = await executeTeamWorkspace({ action: 'list' }, makeContext());
218
+ expect(result.success).toBe(false);
219
+ expect(result.dataSource).toBe('live');
220
+ expect(result.error).toContain('SKILLSMITH_LICENSE_KEY');
221
+ }
222
+ finally {
223
+ if (orig !== undefined)
224
+ process.env.SKILLSMITH_LICENSE_KEY = orig;
225
+ }
226
+ });
202
227
  });
203
228
  // ============================================================================
204
229
  // executeShareSkill
@@ -240,6 +265,23 @@ describe('executeShareSkill', () => {
240
265
  expect(result.success).toBe(false);
241
266
  expect(result.error).toContain('not found');
242
267
  });
268
+ // SMI-4292: Typed error when Supabase live but license key missing
269
+ it('returns typed error in live mode when SKILLSMITH_LICENSE_KEY is missing', async () => {
270
+ const { isSupabaseConfigured } = await import('../supabase-client.js');
271
+ vi.mocked(isSupabaseConfigured).mockReturnValueOnce(true);
272
+ const orig = process.env.SKILLSMITH_LICENSE_KEY;
273
+ delete process.env.SKILLSMITH_LICENSE_KEY;
274
+ try {
275
+ const result = await executeShareSkill({ action: 'list', workspaceId: wsId }, makeContext());
276
+ expect(result.success).toBe(false);
277
+ expect(result.dataSource).toBe('live');
278
+ expect(result.error).toContain('SKILLSMITH_LICENSE_KEY');
279
+ }
280
+ finally {
281
+ if (orig !== undefined)
282
+ process.env.SKILLSMITH_LICENSE_KEY = orig;
283
+ }
284
+ });
243
285
  // SMI-3898: Deny list enforcement
244
286
  it('rejects skill matching deny list pattern', async () => {
245
287
  // Create a service with deny list
@@ -1 +1 @@
1
- {"version":3,"file":"team-workspace.test.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-workspace.test.js","sourceRoot":"","sources":["../../../src/tools/team-workspace.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,kBAAkB,GAGnB,MAAM,qBAAqB,CAAA;AAG5B,2EAA2E;AAC3E,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IACxC,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC1B,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC/B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAA;AAEH,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,WAAW;IAClB,OAAO,EAA4B,CAAA;AACrC,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC;YAC5C,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,kBAAkB;SAChC,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC;YAC5C,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,sCAAsC;SACpD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,EAAE,CACV,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAC7E,CAAC,OAAO,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC;YACzC,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,sCAAsC;YACnD,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC;YACzC,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,sCAAsC;SACpD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,EAAE,CACV,qBAAqB,CAAC,KAAK,CAAC;YAC1B,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,sCAAsC;YACnD,OAAO,EAAE,UAAU;SACpB,CAAC,CACH,CAAC,OAAO,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IACzE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAkB,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QACrF,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAkB;YAC5B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B,CAAA;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAkB;YAC5B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B,CAAA;QACD,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAkB;YAC5B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,CAAC,YAAY,CAAC;YACzB,QAAQ,EAAE,EAAE;SACb,CAAA;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAkB;YAC5B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,CAAC,YAAY,CAAC;YACzB,QAAQ,EAAE,EAAE;SACb,CAAA;QACD,MAAM,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAkB;YAC5B,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,CAAC,KAAK,CAAC;YAClB,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB,CAAA;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,uBAAuB,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAChG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,SAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC5E,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC5E,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC5E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC7F,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,SAAU,CAAC,EAAE,EAAE,EACrD,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,SAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC3E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,sCAAsC,EAAE,EACtE,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CACxC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EACtC,WAAW,EAAE,CACd,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,SAAU,CAAC,EAAE,EAAE,EACxD,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE,EACzE,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,mEAAmE;IACnE,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;QACtE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;QAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;YAC5E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QAC1D,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAA;QACnE,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,IAAY,CAAA;IAEhB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,uBAAuB,CAAC,iBAAiB,EAAE,CAAC,CAAA;QAC5C,uCAAuC;QACvC,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9F,IAAI,GAAG,EAAE,CAAC,SAAU,CAAC,EAAE,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAChE,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC3F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9F,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9F,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC9F,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EACzD,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,EACjE,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,mEAAmE;IACnE,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAA;QACtE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;QAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;YAC5F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QAC1D,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAA;QACnE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,kCAAkC;IAClC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,kCAAkC;QAClC,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAA;QAC/B,sDAAsD;QACtD,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChD,MAAM,eAAe,GAAG,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAE1D,kEAAkE;QAClE,MAAM,SAAS,GAAyB;YACtC,GAAG,GAAG;YACN,eAAe,EAAE,UAAU;YAC3B,KAAK,CAAC,oBAAoB,CAAC,MAAM,EAAE,WAAW;gBAC5C,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;gBACvD,OAAO;oBACL,GAAG,IAAI;oBACP,OAAO,EAAE;wBACP,eAAe,EAAE,KAAK;wBACtB,SAAS,EAAE,EAAE;wBACb,QAAQ,EAAE,CAAC,eAAe,CAAC;qBAC5B;iBACF,CAAA;YACH,CAAC;SACF,CAAA;QACD,uBAAuB,CAAC,SAAS,CAAC,CAAA;QAElC,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;QAC/F,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,SAAU,CAAC,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAClF,WAAW,EAAE,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -19,8 +19,8 @@ export declare const uninstallInputSchema: z.ZodObject<{
19
19
  skillName: z.ZodString;
20
20
  force: z.ZodDefault<z.ZodBoolean>;
21
21
  }, "strip", z.ZodTypeAny, {
22
- force: boolean;
23
22
  skillName: string;
23
+ force: boolean;
24
24
  }, {
25
25
  skillName: string;
26
26
  force?: boolean | undefined;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview Shared Zod `safeParse` envelope helper for MCP tool-dispatch.
3
+ * @module @skillsmith/mcp-server/validation
4
+ *
5
+ * SMI-4313: Prior to this helper, ~20 tool-dispatch branches called
6
+ * `schema.parse(args)` (throwing on invalid input). The outer catch at
7
+ * `index.ts` flattened those `ZodError`s to plain-text `isError: true`
8
+ * content, losing the structured issue array.
9
+ *
10
+ * This helper returns a discriminated union so every call site can
11
+ * short-circuit to a structured error envelope on invalid input without
12
+ * throwing. The envelope shape is aligned with the MCP protocol's
13
+ * `CallToolResult` (`isError: true` + JSON-serialised body with
14
+ * `error`, `tool`, and `issues[]`).
15
+ *
16
+ * Reference: `packages/mcp-server/src/tools/install.ts` uses an
17
+ * application-level `InstallResult` envelope (different shape — that one
18
+ * lives inside a successful tool response and signals application-level
19
+ * failure). This helper is the protocol-level complement for the 9 direct
20
+ * dispatch sites plus `withLicenseAndQuota`.
21
+ */
22
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
23
+ import type { ZodType, ZodTypeDef } from 'zod';
24
+ /**
25
+ * Discriminated result of a `safeParseOrError` call.
26
+ *
27
+ * - `ok: true` — parse succeeded; `data` carries the typed payload.
28
+ * - `ok: false` — parse failed; `response` is a ready-to-return
29
+ * `CallToolResult` with `isError: true` and a JSON body.
30
+ */
31
+ export type SafeParseResult<T> = {
32
+ ok: true;
33
+ data: T;
34
+ } | {
35
+ ok: false;
36
+ response: CallToolResult;
37
+ };
38
+ /**
39
+ * Run Zod `safeParse` at an MCP tool boundary and map failures to a
40
+ * structured `CallToolResult` envelope.
41
+ *
42
+ * Envelope body shape (JSON-encoded in `content[0].text`):
43
+ * ```json
44
+ * {
45
+ * "error": "ValidationError",
46
+ * "tool": "<canonical tool name>",
47
+ * "issues": [
48
+ * { "path": "limit", "message": "...", "code": "..." },
49
+ * ...
50
+ * ]
51
+ * }
52
+ * ```
53
+ *
54
+ * Clients that `JSON.parse(content[0].text)` recover the issue array.
55
+ * Clients that regex over the raw text still see human-readable messages
56
+ * embedded in `issues[].message`.
57
+ *
58
+ * @param schema Zod schema to validate against.
59
+ * @param args Raw MCP tool arguments (unknown at this layer).
60
+ * @param toolName Canonical registered MCP tool name for client correlation.
61
+ * @returns `{ ok: true, data }` on success, `{ ok: false, response }` on failure.
62
+ */
63
+ export declare function safeParseOrError<T>(schema: ZodType<T, ZodTypeDef, unknown>, args: unknown, toolName: string): SafeParseResult<T>;
64
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAA;AAEhG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EACvC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GACf,eAAe,CAAC,CAAC,CAAC,CA8BpB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Shared Zod `safeParse` envelope helper for MCP tool-dispatch.
3
+ * @module @skillsmith/mcp-server/validation
4
+ *
5
+ * SMI-4313: Prior to this helper, ~20 tool-dispatch branches called
6
+ * `schema.parse(args)` (throwing on invalid input). The outer catch at
7
+ * `index.ts` flattened those `ZodError`s to plain-text `isError: true`
8
+ * content, losing the structured issue array.
9
+ *
10
+ * This helper returns a discriminated union so every call site can
11
+ * short-circuit to a structured error envelope on invalid input without
12
+ * throwing. The envelope shape is aligned with the MCP protocol's
13
+ * `CallToolResult` (`isError: true` + JSON-serialised body with
14
+ * `error`, `tool`, and `issues[]`).
15
+ *
16
+ * Reference: `packages/mcp-server/src/tools/install.ts` uses an
17
+ * application-level `InstallResult` envelope (different shape — that one
18
+ * lives inside a successful tool response and signals application-level
19
+ * failure). This helper is the protocol-level complement for the 9 direct
20
+ * dispatch sites plus `withLicenseAndQuota`.
21
+ */
22
+ /**
23
+ * Run Zod `safeParse` at an MCP tool boundary and map failures to a
24
+ * structured `CallToolResult` envelope.
25
+ *
26
+ * Envelope body shape (JSON-encoded in `content[0].text`):
27
+ * ```json
28
+ * {
29
+ * "error": "ValidationError",
30
+ * "tool": "<canonical tool name>",
31
+ * "issues": [
32
+ * { "path": "limit", "message": "...", "code": "..." },
33
+ * ...
34
+ * ]
35
+ * }
36
+ * ```
37
+ *
38
+ * Clients that `JSON.parse(content[0].text)` recover the issue array.
39
+ * Clients that regex over the raw text still see human-readable messages
40
+ * embedded in `issues[].message`.
41
+ *
42
+ * @param schema Zod schema to validate against.
43
+ * @param args Raw MCP tool arguments (unknown at this layer).
44
+ * @param toolName Canonical registered MCP tool name for client correlation.
45
+ * @returns `{ ok: true, data }` on success, `{ ok: false, response }` on failure.
46
+ */
47
+ export function safeParseOrError(schema, args, toolName) {
48
+ const parsed = schema.safeParse(args);
49
+ if (parsed.success) {
50
+ return { ok: true, data: parsed.data };
51
+ }
52
+ return {
53
+ ok: false,
54
+ response: {
55
+ isError: true,
56
+ content: [
57
+ {
58
+ type: 'text',
59
+ text: JSON.stringify({
60
+ error: 'ValidationError',
61
+ tool: toolName,
62
+ issues: parsed.error.issues.map((issue) => ({
63
+ path: issue.path.join('.'),
64
+ message: issue.message,
65
+ code: issue.code,
66
+ })),
67
+ }, null, 2),
68
+ },
69
+ ],
70
+ },
71
+ };
72
+ }
73
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAcH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAuC,EACvC,IAAa,EACb,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IACxC,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI;YACb,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,KAAK,EAAE,iBAAiB;wBACxB,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BAC1C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;4BAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,IAAI,EAAE,KAAK,CAAC,IAAI;yBACjB,CAAC,CAAC;qBACJ,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Unit tests for `safeParseOrError` helper.
3
+ * @see SMI-4313: MCP tool-dispatch safeParse envelope refactor
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/validation.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @fileoverview Unit tests for `safeParseOrError` helper.
3
+ * @see SMI-4313: MCP tool-dispatch safeParse envelope refactor
4
+ */
5
+ import { describe, expect, it } from 'vitest';
6
+ import { z } from 'zod';
7
+ import { safeParseOrError } from './validation.js';
8
+ const demoSchema = z.object({
9
+ skillId: z.string().min(1),
10
+ limit: z.number().int().positive().optional(),
11
+ mode: z.enum(['fast', 'thorough']).optional(),
12
+ });
13
+ describe('safeParseOrError', () => {
14
+ it('returns { ok: true, data } for valid input', () => {
15
+ const result = safeParseOrError(demoSchema, { skillId: 'owner/repo', limit: 10 }, 'demo_tool');
16
+ expect(result.ok).toBe(true);
17
+ if (result.ok) {
18
+ expect(result.data).toEqual({ skillId: 'owner/repo', limit: 10 });
19
+ }
20
+ });
21
+ it('returns { ok: false, response } for missing required field', () => {
22
+ const result = safeParseOrError(demoSchema, {}, 'demo_tool');
23
+ expect(result.ok).toBe(false);
24
+ if (!result.ok) {
25
+ expect(result.response.isError).toBe(true);
26
+ expect(result.response.content).toHaveLength(1);
27
+ const textEntry = result.response.content[0];
28
+ expect(textEntry.type).toBe('text');
29
+ const body = JSON.parse(textEntry.text);
30
+ expect(body.error).toBe('ValidationError');
31
+ expect(body.tool).toBe('demo_tool');
32
+ expect(body.issues.length).toBeGreaterThan(0);
33
+ const skillIdIssue = body.issues.find((issue) => issue.path === 'skillId');
34
+ expect(skillIdIssue).toBeDefined();
35
+ expect(skillIdIssue?.code).toBeTruthy();
36
+ expect(skillIdIssue?.message).toBeTruthy();
37
+ }
38
+ });
39
+ it('returns { ok: false, response } for wrong type', () => {
40
+ const result = safeParseOrError(demoSchema, { skillId: 'x', limit: 'abc' }, 'demo_tool');
41
+ expect(result.ok).toBe(false);
42
+ if (!result.ok) {
43
+ const body = JSON.parse(result.response.content[0].text);
44
+ expect(body.issues.some((issue) => issue.path === 'limit')).toBe(true);
45
+ }
46
+ });
47
+ it('returns { ok: false, response } for invalid enum value', () => {
48
+ const result = safeParseOrError(demoSchema, { skillId: 'x', mode: 'bogus' }, 'demo_tool');
49
+ expect(result.ok).toBe(false);
50
+ if (!result.ok) {
51
+ const body = JSON.parse(result.response.content[0].text);
52
+ expect(body.issues.some((issue) => issue.path === 'mode')).toBe(true);
53
+ }
54
+ });
55
+ it('joins nested path segments with "." (zod path array → dotted string)', () => {
56
+ const nested = z.object({
57
+ outer: z.object({
58
+ inner: z.string(),
59
+ }),
60
+ });
61
+ const result = safeParseOrError(nested, { outer: {} }, 'nested_tool');
62
+ expect(result.ok).toBe(false);
63
+ if (!result.ok) {
64
+ const body = JSON.parse(result.response.content[0].text);
65
+ expect(body.issues[0]?.path).toBe('outer.inner');
66
+ }
67
+ });
68
+ it('threads the toolName through unchanged', () => {
69
+ const result = safeParseOrError(demoSchema, {}, 'uninstall_skill');
70
+ expect(result.ok).toBe(false);
71
+ if (!result.ok) {
72
+ const body = JSON.parse(result.response.content[0].text);
73
+ expect(body.tool).toBe('uninstall_skill');
74
+ }
75
+ });
76
+ it('matches the documented envelope shape (inline snapshot)', () => {
77
+ const result = safeParseOrError(demoSchema, {}, 'demo_tool');
78
+ expect(result.ok).toBe(false);
79
+ if (!result.ok) {
80
+ const body = JSON.parse(result.response.content[0].text);
81
+ // Guard against silent drift back to stringified ZodError.message.
82
+ expect(body).toMatchInlineSnapshot({
83
+ issues: expect.any(Array),
84
+ }, `
85
+ {
86
+ "error": "ValidationError",
87
+ "issues": Any<Array>,
88
+ "tool": "demo_tool",
89
+ }
90
+ `);
91
+ // Each issue must have the documented keys
92
+ for (const issue of body.issues) {
93
+ expect(issue).toEqual(expect.objectContaining({
94
+ path: expect.any(String),
95
+ message: expect.any(String),
96
+ code: expect.any(String),
97
+ }));
98
+ }
99
+ }
100
+ });
101
+ });
102
+ //# sourceMappingURL=validation.test.js.map