@skillsmith/mcp-server 0.4.10 → 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.
- package/CHANGELOG.md +8 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/tool-dispatch.envelope.test.d.ts +12 -0
- package/dist/src/__tests__/tool-dispatch.envelope.test.d.ts.map +1 -0
- package/dist/src/__tests__/tool-dispatch.envelope.test.js +205 -0
- package/dist/src/__tests__/tool-dispatch.envelope.test.js.map +1 -0
- package/dist/src/index.js +10 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/license.d.ts +6 -6
- package/dist/src/middleware/license.d.ts.map +1 -1
- package/dist/src/middleware/license.js +11 -8
- package/dist/src/middleware/license.js.map +1 -1
- package/dist/src/tool-dispatch.d.ts.map +1 -1
- package/dist/src/tool-dispatch.js +58 -19
- package/dist/src/tool-dispatch.js.map +1 -1
- package/dist/src/tools/audit-tools.d.ts +6 -6
- package/dist/src/tools/install.d.ts +9 -3
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.js +52 -11
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.test.d.ts +17 -0
- package/dist/src/tools/install.test.d.ts.map +1 -0
- package/dist/src/tools/install.test.js +237 -0
- package/dist/src/tools/install.test.js.map +1 -0
- package/dist/src/tools/integration-tools.d.ts +8 -8
- package/dist/src/tools/rbac-tools.d.ts +4 -4
- package/dist/src/tools/recommend.types.d.ts +3 -3
- package/dist/src/tools/registry-tools.d.ts +2 -2
- package/dist/src/tools/registry-tools.d.ts.map +1 -1
- package/dist/src/tools/registry-tools.js +42 -4
- package/dist/src/tools/registry-tools.js.map +1 -1
- package/dist/src/tools/skill-diff.d.ts +2 -2
- package/dist/src/tools/sso-tools.d.ts +2 -2
- package/dist/src/tools/suggest.d.ts +4 -4
- package/dist/src/tools/team-resolver.d.ts +29 -0
- package/dist/src/tools/team-resolver.d.ts.map +1 -0
- package/dist/src/tools/team-resolver.js +46 -0
- package/dist/src/tools/team-resolver.js.map +1 -0
- package/dist/src/tools/team-resolver.test.d.ts +6 -0
- package/dist/src/tools/team-resolver.test.d.ts.map +1 -0
- package/dist/src/tools/team-resolver.test.js +73 -0
- package/dist/src/tools/team-resolver.test.js.map +1 -0
- package/dist/src/tools/team-workspace.d.ts +18 -4
- package/dist/src/tools/team-workspace.d.ts.map +1 -1
- package/dist/src/tools/team-workspace.js +149 -75
- package/dist/src/tools/team-workspace.js.map +1 -1
- package/dist/src/tools/team-workspace.live.d.ts +34 -0
- package/dist/src/tools/team-workspace.live.d.ts.map +1 -0
- package/dist/src/tools/team-workspace.live.js +182 -0
- package/dist/src/tools/team-workspace.live.js.map +1 -0
- package/dist/src/tools/team-workspace.live.test.d.ts +10 -0
- package/dist/src/tools/team-workspace.live.test.d.ts.map +1 -0
- package/dist/src/tools/team-workspace.live.test.js +177 -0
- package/dist/src/tools/team-workspace.live.test.js.map +1 -0
- package/dist/src/tools/team-workspace.stub.d.ts.map +1 -1
- package/dist/src/tools/team-workspace.stub.js +3 -1
- package/dist/src/tools/team-workspace.stub.js.map +1 -1
- package/dist/src/tools/team-workspace.test.d.ts +1 -0
- package/dist/src/tools/team-workspace.test.d.ts.map +1 -1
- package/dist/src/tools/team-workspace.test.js +43 -1
- package/dist/src/tools/team-workspace.test.js.map +1 -1
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/validation.d.ts +64 -0
- package/dist/src/validation.d.ts.map +1 -0
- package/dist/src/validation.js +73 -0
- package/dist/src/validation.js.map +1 -0
- package/dist/src/validation.test.d.ts +6 -0
- package/dist/src/validation.test.d.ts.map +1 -0
- package/dist/src/validation.test.js +102 -0
- package/dist/src/validation.test.js.map +1 -0
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-tools.js","sourceRoot":"","sources":["../../../src/tools/registry-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"registry-tools.js","sourceRoot":"","sources":["../../../src/tools/registry-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,21 +22,21 @@ export declare const skillDiffInputSchema: z.ZodObject<{
|
|
|
22
22
|
hasLocalModifications: z.ZodDefault<z.ZodBoolean>;
|
|
23
23
|
trustTier: z.ZodDefault<z.ZodEnum<["verified", "community", "experimental"]>>;
|
|
24
24
|
}, "strip", z.ZodTypeAny, {
|
|
25
|
-
trustTier: "verified" | "community" | "experimental";
|
|
26
25
|
skillId: string;
|
|
27
26
|
oldContent: string;
|
|
28
27
|
newContent: string;
|
|
29
28
|
hasLocalModifications: boolean;
|
|
29
|
+
trustTier: "verified" | "community" | "experimental";
|
|
30
30
|
oldRiskScore?: number | undefined;
|
|
31
31
|
newRiskScore?: number | undefined;
|
|
32
32
|
}, {
|
|
33
33
|
skillId: string;
|
|
34
34
|
oldContent: string;
|
|
35
35
|
newContent: string;
|
|
36
|
-
trustTier?: "verified" | "community" | "experimental" | undefined;
|
|
37
36
|
oldRiskScore?: number | undefined;
|
|
38
37
|
newRiskScore?: number | undefined;
|
|
39
38
|
hasLocalModifications?: boolean | undefined;
|
|
39
|
+
trustTier?: "verified" | "community" | "experimental" | undefined;
|
|
40
40
|
}>;
|
|
41
41
|
export type SkillDiffInput = z.infer<typeof skillDiffInputSchema>;
|
|
42
42
|
/** Structured section-level diff response */
|
|
@@ -20,12 +20,12 @@ export declare const configureSsoInputSchema: z.ZodObject<{
|
|
|
20
20
|
idpEntityId: z.ZodOptional<z.ZodString>;
|
|
21
21
|
protocol: z.ZodDefault<z.ZodOptional<z.ZodEnum<["saml", "oidc"]>>>;
|
|
22
22
|
}, "strip", z.ZodTypeAny, {
|
|
23
|
-
action: "test" | "
|
|
23
|
+
action: "test" | "remove" | "set";
|
|
24
24
|
protocol: "saml" | "oidc";
|
|
25
25
|
idpMetadataUrl?: string | undefined;
|
|
26
26
|
idpEntityId?: string | undefined;
|
|
27
27
|
}, {
|
|
28
|
-
action: "test" | "
|
|
28
|
+
action: "test" | "remove" | "set";
|
|
29
29
|
idpMetadataUrl?: string | undefined;
|
|
30
30
|
idpEntityId?: string | undefined;
|
|
31
31
|
protocol?: "saml" | "oidc" | undefined;
|
|
@@ -45,20 +45,20 @@ export declare const suggestInputSchema: z.ZodObject<{
|
|
|
45
45
|
/** Session identifier (optional, for informational purposes) */
|
|
46
46
|
session_id: z.ZodDefault<z.ZodString>;
|
|
47
47
|
}, "strip", z.ZodTypeAny, {
|
|
48
|
-
installed_skills: string[];
|
|
49
|
-
limit: number;
|
|
50
48
|
project_path: string;
|
|
51
49
|
recent_commands: string[];
|
|
50
|
+
installed_skills: string[];
|
|
51
|
+
limit: number;
|
|
52
52
|
session_id: string;
|
|
53
53
|
current_file?: string | undefined;
|
|
54
54
|
error_message?: string | undefined;
|
|
55
55
|
}, {
|
|
56
56
|
project_path: string;
|
|
57
|
-
installed_skills?: string[] | undefined;
|
|
58
|
-
limit?: number | undefined;
|
|
59
57
|
current_file?: string | undefined;
|
|
60
58
|
recent_commands?: string[] | undefined;
|
|
61
59
|
error_message?: string | undefined;
|
|
60
|
+
installed_skills?: string[] | undefined;
|
|
61
|
+
limit?: number | undefined;
|
|
62
62
|
session_id?: string | undefined;
|
|
63
63
|
}>;
|
|
64
64
|
/**
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared license-key → team_id resolver
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/team-resolver
|
|
4
|
+
* @see SMI-4292: Wave 5A — Team workspaces foundation (finding C3)
|
|
5
|
+
*
|
|
6
|
+
* Unified team resolution for MCP tools. Both team-workspace.ts and
|
|
7
|
+
* registry-tools.ts call `resolveLicenseTeamId` so they share one auth
|
|
8
|
+
* path (no split auth resolution).
|
|
9
|
+
*
|
|
10
|
+
* License key source, in order:
|
|
11
|
+
* 1. explicit `licenseKey` argument (from `ToolContext` or tool input)
|
|
12
|
+
* 2. `process.env.SKILLSMITH_LICENSE_KEY`
|
|
13
|
+
*
|
|
14
|
+
* Calls the `resolve_team_from_license` RPC (migration 071) using an
|
|
15
|
+
* anon-key Supabase client (RPC is SECURITY DEFINER). Returns null if
|
|
16
|
+
* the key is missing, invalid, expired, or not attached to a team.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Extract the license key from an optional explicit value or the environment.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readLicenseKey(explicit?: string): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a license key to a team_id via `resolve_team_from_license` RPC.
|
|
24
|
+
*
|
|
25
|
+
* @param licenseKey - optional explicit license key; falls back to env
|
|
26
|
+
* @returns resolved team_id, or null if Supabase is not configured / key invalid
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveLicenseTeamId(licenseKey?: string): Promise<string | null>;
|
|
29
|
+
//# sourceMappingURL=team-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-resolver.d.ts","sourceRoot":"","sources":["../../../src/tools/team-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAatF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared license-key → team_id resolver
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/team-resolver
|
|
4
|
+
* @see SMI-4292: Wave 5A — Team workspaces foundation (finding C3)
|
|
5
|
+
*
|
|
6
|
+
* Unified team resolution for MCP tools. Both team-workspace.ts and
|
|
7
|
+
* registry-tools.ts call `resolveLicenseTeamId` so they share one auth
|
|
8
|
+
* path (no split auth resolution).
|
|
9
|
+
*
|
|
10
|
+
* License key source, in order:
|
|
11
|
+
* 1. explicit `licenseKey` argument (from `ToolContext` or tool input)
|
|
12
|
+
* 2. `process.env.SKILLSMITH_LICENSE_KEY`
|
|
13
|
+
*
|
|
14
|
+
* Calls the `resolve_team_from_license` RPC (migration 071) using an
|
|
15
|
+
* anon-key Supabase client (RPC is SECURITY DEFINER). Returns null if
|
|
16
|
+
* the key is missing, invalid, expired, or not attached to a team.
|
|
17
|
+
*/
|
|
18
|
+
import { getSupabaseClient, isSupabaseConfigured } from '../supabase-client.js';
|
|
19
|
+
/**
|
|
20
|
+
* Extract the license key from an optional explicit value or the environment.
|
|
21
|
+
*/
|
|
22
|
+
export function readLicenseKey(explicit) {
|
|
23
|
+
const raw = explicit ?? process.env.SKILLSMITH_LICENSE_KEY ?? '';
|
|
24
|
+
return raw.length > 0 ? raw : null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a license key to a team_id via `resolve_team_from_license` RPC.
|
|
28
|
+
*
|
|
29
|
+
* @param licenseKey - optional explicit license key; falls back to env
|
|
30
|
+
* @returns resolved team_id, or null if Supabase is not configured / key invalid
|
|
31
|
+
*/
|
|
32
|
+
export async function resolveLicenseTeamId(licenseKey) {
|
|
33
|
+
if (!isSupabaseConfigured())
|
|
34
|
+
return null;
|
|
35
|
+
const key = readLicenseKey(licenseKey);
|
|
36
|
+
if (!key)
|
|
37
|
+
return null;
|
|
38
|
+
const client = (await getSupabaseClient());
|
|
39
|
+
const { data, error } = await client.rpc('resolve_team_from_license', {
|
|
40
|
+
p_license_key: key,
|
|
41
|
+
});
|
|
42
|
+
if (error || !data)
|
|
43
|
+
return null;
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=team-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-resolver.js","sourceRoot":"","sources":["../../../src/tools/team-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAc/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,MAAM,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAA;IAChE,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAmB;IAC5D,IAAI,CAAC,oBAAoB,EAAE;QAAE,OAAO,IAAI,CAAA;IAExC,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IAErB,MAAM,MAAM,GAAG,CAAC,MAAM,iBAAiB,EAAE,CAA0B,CAAA;IACnE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAS,2BAA2B,EAAE;QAC5E,aAAa,EAAE,GAAG;KACnB,CAAC,CAAA;IAEF,IAAI,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IAC/B,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-resolver.test.d.ts","sourceRoot":"","sources":["../../../src/tools/team-resolver.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Unit tests for shared team-resolver helper
|
|
3
|
+
* @see SMI-4292: Wave 5A — Team workspaces foundation (finding C3)
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
6
|
+
import { readLicenseKey, resolveLicenseTeamId } from './team-resolver.js';
|
|
7
|
+
// Mock the supabase-client module BEFORE the import is resolved
|
|
8
|
+
const rpcMock = vi.fn();
|
|
9
|
+
vi.mock('../supabase-client.js', () => ({
|
|
10
|
+
isSupabaseConfigured: vi.fn(() => true),
|
|
11
|
+
getSupabaseClient: vi.fn(async () => ({ rpc: rpcMock })),
|
|
12
|
+
}));
|
|
13
|
+
describe('readLicenseKey', () => {
|
|
14
|
+
const origEnv = process.env.SKILLSMITH_LICENSE_KEY;
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
if (origEnv === undefined) {
|
|
17
|
+
delete process.env.SKILLSMITH_LICENSE_KEY;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
process.env.SKILLSMITH_LICENSE_KEY = origEnv;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it('prefers an explicit value over env', () => {
|
|
24
|
+
process.env.SKILLSMITH_LICENSE_KEY = 'env_key';
|
|
25
|
+
expect(readLicenseKey('arg_key')).toBe('arg_key');
|
|
26
|
+
});
|
|
27
|
+
it('falls back to env when no explicit value', () => {
|
|
28
|
+
process.env.SKILLSMITH_LICENSE_KEY = 'env_key';
|
|
29
|
+
expect(readLicenseKey()).toBe('env_key');
|
|
30
|
+
});
|
|
31
|
+
it('returns null when both sources are empty', () => {
|
|
32
|
+
delete process.env.SKILLSMITH_LICENSE_KEY;
|
|
33
|
+
expect(readLicenseKey()).toBeNull();
|
|
34
|
+
expect(readLicenseKey('')).toBeNull();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('resolveLicenseTeamId', () => {
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
rpcMock.mockReset();
|
|
40
|
+
});
|
|
41
|
+
it('returns null when Supabase is not configured', async () => {
|
|
42
|
+
const { isSupabaseConfigured } = await import('../supabase-client.js');
|
|
43
|
+
vi.mocked(isSupabaseConfigured).mockReturnValueOnce(false);
|
|
44
|
+
const result = await resolveLicenseTeamId('sk_live_something');
|
|
45
|
+
expect(result).toBeNull();
|
|
46
|
+
expect(rpcMock).not.toHaveBeenCalled();
|
|
47
|
+
});
|
|
48
|
+
it('returns null when no license key is available', async () => {
|
|
49
|
+
delete process.env.SKILLSMITH_LICENSE_KEY;
|
|
50
|
+
const result = await resolveLicenseTeamId();
|
|
51
|
+
expect(result).toBeNull();
|
|
52
|
+
expect(rpcMock).not.toHaveBeenCalled();
|
|
53
|
+
});
|
|
54
|
+
it('returns null when RPC returns an error', async () => {
|
|
55
|
+
rpcMock.mockResolvedValueOnce({ data: null, error: { message: 'nope' } });
|
|
56
|
+
const result = await resolveLicenseTeamId('sk_live_TEST');
|
|
57
|
+
expect(result).toBeNull();
|
|
58
|
+
});
|
|
59
|
+
it('returns team_id when RPC resolves a team', async () => {
|
|
60
|
+
rpcMock.mockResolvedValueOnce({ data: 'team_abc', error: null });
|
|
61
|
+
const result = await resolveLicenseTeamId('sk_live_TEST');
|
|
62
|
+
expect(result).toBe('team_abc');
|
|
63
|
+
expect(rpcMock).toHaveBeenCalledWith('resolve_team_from_license', {
|
|
64
|
+
p_license_key: 'sk_live_TEST',
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
it('returns null when RPC data is null (no matching team)', async () => {
|
|
68
|
+
rpcMock.mockResolvedValueOnce({ data: null, error: null });
|
|
69
|
+
const result = await resolveLicenseTeamId('sk_live_TEST');
|
|
70
|
+
expect(result).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=team-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-resolver.test.js","sourceRoot":"","sources":["../../../src/tools/team-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,12 +19,12 @@ export declare const teamWorkspaceInputSchema: z.ZodObject<{
|
|
|
19
19
|
description: z.ZodOptional<z.ZodString>;
|
|
20
20
|
workspaceId: z.ZodOptional<z.ZodString>;
|
|
21
21
|
}, "strip", z.ZodTypeAny, {
|
|
22
|
-
action: "
|
|
22
|
+
action: "get" | "create" | "list" | "delete";
|
|
23
23
|
name?: string | undefined;
|
|
24
24
|
description?: string | undefined;
|
|
25
25
|
workspaceId?: string | undefined;
|
|
26
26
|
}, {
|
|
27
|
-
action: "
|
|
27
|
+
action: "get" | "create" | "list" | "delete";
|
|
28
28
|
name?: string | undefined;
|
|
29
29
|
description?: string | undefined;
|
|
30
30
|
workspaceId?: string | undefined;
|
|
@@ -35,11 +35,11 @@ export declare const shareSkillInputSchema: z.ZodObject<{
|
|
|
35
35
|
workspaceId: z.ZodString;
|
|
36
36
|
skillId: z.ZodOptional<z.ZodString>;
|
|
37
37
|
}, "strip", z.ZodTypeAny, {
|
|
38
|
-
action: "
|
|
38
|
+
action: "remove" | "list" | "add";
|
|
39
39
|
workspaceId: string;
|
|
40
40
|
skillId?: string | undefined;
|
|
41
41
|
}, {
|
|
42
|
-
action: "
|
|
42
|
+
action: "remove" | "list" | "add";
|
|
43
43
|
workspaceId: string;
|
|
44
44
|
skillId?: string | undefined;
|
|
45
45
|
}>;
|
|
@@ -135,6 +135,20 @@ export declare const shareSkillToolSchema: {
|
|
|
135
135
|
required: string[];
|
|
136
136
|
};
|
|
137
137
|
};
|
|
138
|
+
/**
|
|
139
|
+
* TeamWorkspaceService — registry-mediated workspace CRUD.
|
|
140
|
+
*
|
|
141
|
+
* **Invariant (SMI-4312)**: every method MUST treat `teamId` as the
|
|
142
|
+
* authoritative scoping key. Implementations that hit a SQL backend
|
|
143
|
+
* MUST either (a) include an explicit `team_id = <teamId>` filter in
|
|
144
|
+
* the query, or (b) assert the target workspace belongs to `teamId`
|
|
145
|
+
* before performing `workspace_skills` operations. The live Supabase
|
|
146
|
+
* implementation uses the service-role client, which bypasses RLS —
|
|
147
|
+
* tenant isolation is enforced here, not by the database.
|
|
148
|
+
*
|
|
149
|
+
* @see packages/mcp-server/src/tools/team-workspace.live.ts
|
|
150
|
+
* @see docs/internal/adr/116-mcp-server-service-role-for-team-scoped-tools.md
|
|
151
|
+
*/
|
|
138
152
|
export interface TeamWorkspaceService {
|
|
139
153
|
resolveTeamId(licenseKey: string): Promise<string>;
|
|
140
154
|
createWorkspace(teamId: string, name: string, description?: string): Promise<Workspace>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-workspace.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"team-workspace.d.ts","sourceRoot":"","sources":["../../../src/tools/team-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
import { z } from 'zod';
|
|
14
14
|
import { isSupabaseConfigured } from '../supabase-client.js';
|
|
15
15
|
import { createStubService } from './team-workspace.stub.js';
|
|
16
|
+
import { createLiveService } from './team-workspace.live.js';
|
|
17
|
+
import { readLicenseKey } from './team-resolver.js';
|
|
16
18
|
// Re-export stub factory for external consumers and tests
|
|
17
19
|
export { createStubService } from './team-workspace.stub.js';
|
|
18
20
|
// ============================================================================
|
|
@@ -124,8 +126,14 @@ export function checkSharingPolicy(skillId, policy) {
|
|
|
124
126
|
}
|
|
125
127
|
return null;
|
|
126
128
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Module-level singleton. Picks the live Supabase-backed service when
|
|
131
|
+
* SUPABASE_URL + SUPABASE_ANON_KEY are configured; otherwise falls back
|
|
132
|
+
* to the in-memory stub (useful for tests and unauthenticated env).
|
|
133
|
+
*/
|
|
134
|
+
let service = isSupabaseConfigured()
|
|
135
|
+
? createLiveService()
|
|
136
|
+
: createStubService();
|
|
129
137
|
/** Replace the workspace service implementation (for testing or Supabase swap) */
|
|
130
138
|
export function setTeamWorkspaceService(svc) {
|
|
131
139
|
service = svc;
|
|
@@ -145,50 +153,80 @@ export function getTeamWorkspaceService() {
|
|
|
145
153
|
*/
|
|
146
154
|
export async function executeTeamWorkspace(input, _context) {
|
|
147
155
|
const dataSource = isSupabaseConfigured() ? 'live' : 'stub';
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
156
|
+
// SMI-4292: License key resolution order — explicit env, then anon fallback.
|
|
157
|
+
// In live mode, missing/invalid keys surface as typed errors (not stub data).
|
|
158
|
+
const licenseKey = readLicenseKey();
|
|
159
|
+
if (dataSource === 'live' && !licenseKey) {
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
dataSource,
|
|
163
|
+
error: 'SKILLSMITH_LICENSE_KEY is required for team workspace operations. ' +
|
|
164
|
+
'Set it in your MCP server config — shell exports do not reach MCP subprocesses.',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
let teamId;
|
|
168
|
+
try {
|
|
169
|
+
teamId = await service.resolveTeamId(licenseKey ?? '');
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
dataSource,
|
|
175
|
+
error: err instanceof Error ? err.message : 'Failed to resolve team from license key.',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// SMI-4312: Wrap service calls so missing service-role config or other
|
|
179
|
+
// live-mode errors surface as typed {success:false} results.
|
|
180
|
+
try {
|
|
181
|
+
switch (input.action) {
|
|
182
|
+
case 'create': {
|
|
183
|
+
if (!input.name) {
|
|
184
|
+
return { success: false, dataSource, error: 'Name is required for workspace creation.' };
|
|
185
|
+
}
|
|
186
|
+
const ws = await service.createWorkspace(teamId, input.name, input.description);
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
dataSource,
|
|
190
|
+
workspace: ws,
|
|
191
|
+
message: `Workspace "${ws.name}" created.`,
|
|
192
|
+
};
|
|
155
193
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
case 'list': {
|
|
165
|
-
const list = await service.listWorkspaces(teamId);
|
|
166
|
-
return {
|
|
167
|
-
success: true,
|
|
168
|
-
dataSource,
|
|
169
|
-
workspaces: list,
|
|
170
|
-
message: `Found ${list.length} workspace(s).`,
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
case 'get': {
|
|
174
|
-
if (!input.workspaceId) {
|
|
175
|
-
return { success: false, dataSource, error: 'workspaceId is required for get.' };
|
|
194
|
+
case 'list': {
|
|
195
|
+
const list = await service.listWorkspaces(teamId);
|
|
196
|
+
return {
|
|
197
|
+
success: true,
|
|
198
|
+
dataSource,
|
|
199
|
+
workspaces: list,
|
|
200
|
+
message: `Found ${list.length} workspace(s).`,
|
|
201
|
+
};
|
|
176
202
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return { success:
|
|
203
|
+
case 'get': {
|
|
204
|
+
if (!input.workspaceId) {
|
|
205
|
+
return { success: false, dataSource, error: 'workspaceId is required for get.' };
|
|
206
|
+
}
|
|
207
|
+
const ws = await service.getWorkspace(teamId, input.workspaceId);
|
|
208
|
+
if (!ws)
|
|
209
|
+
return { success: false, dataSource, error: 'Workspace not found.' };
|
|
210
|
+
return { success: true, dataSource, workspace: ws };
|
|
211
|
+
}
|
|
212
|
+
case 'delete': {
|
|
213
|
+
if (!input.workspaceId) {
|
|
214
|
+
return { success: false, dataSource, error: 'workspaceId is required for delete.' };
|
|
215
|
+
}
|
|
216
|
+
const deleted = await service.deleteWorkspace(teamId, input.workspaceId);
|
|
217
|
+
if (!deleted)
|
|
218
|
+
return { success: false, dataSource, error: 'Workspace not found.' };
|
|
219
|
+
return { success: true, dataSource, message: 'Workspace deleted.' };
|
|
185
220
|
}
|
|
186
|
-
const deleted = await service.deleteWorkspace(teamId, input.workspaceId);
|
|
187
|
-
if (!deleted)
|
|
188
|
-
return { success: false, dataSource, error: 'Workspace not found.' };
|
|
189
|
-
return { success: true, dataSource, message: 'Workspace deleted.' };
|
|
190
221
|
}
|
|
191
222
|
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
return {
|
|
225
|
+
success: false,
|
|
226
|
+
dataSource,
|
|
227
|
+
error: err instanceof Error ? err.message : 'Workspace operation failed.',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
192
230
|
}
|
|
193
231
|
/**
|
|
194
232
|
* Execute a share_skill operation.
|
|
@@ -200,44 +238,80 @@ export async function executeTeamWorkspace(input, _context) {
|
|
|
200
238
|
*/
|
|
201
239
|
export async function executeShareSkill(input, _context) {
|
|
202
240
|
const dataSource = isSupabaseConfigured() ? 'live' : 'stub';
|
|
203
|
-
const licenseKey =
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
241
|
+
const licenseKey = readLicenseKey();
|
|
242
|
+
if (dataSource === 'live' && !licenseKey) {
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
dataSource,
|
|
246
|
+
error: 'SKILLSMITH_LICENSE_KEY is required for skill-sharing operations. ' +
|
|
247
|
+
'Set it in your MCP server config — shell exports do not reach MCP subprocesses.',
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
let teamId;
|
|
251
|
+
try {
|
|
252
|
+
teamId = await service.resolveTeamId(licenseKey ?? '');
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
return {
|
|
256
|
+
success: false,
|
|
257
|
+
dataSource,
|
|
258
|
+
error: err instanceof Error ? err.message : 'Failed to resolve team from license key.',
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// SMI-4312: All service calls wrapped so thrown tenant-isolation errors
|
|
262
|
+
// (e.g. cross-team workspace access) surface as typed {success:false} results
|
|
263
|
+
// instead of propagating as unhandled exceptions.
|
|
264
|
+
try {
|
|
265
|
+
switch (input.action) {
|
|
266
|
+
case 'add': {
|
|
267
|
+
if (!input.skillId) {
|
|
268
|
+
return { success: false, dataSource, error: 'skillId is required for add.' };
|
|
269
|
+
}
|
|
270
|
+
// SMI-3898: Check sharing policy before adding
|
|
271
|
+
const settings = await service.getWorkspaceSettings(teamId, input.workspaceId);
|
|
272
|
+
const policyError = checkSharingPolicy(input.skillId, settings.sharing);
|
|
273
|
+
if (policyError) {
|
|
274
|
+
return { success: false, dataSource, error: policyError };
|
|
275
|
+
}
|
|
276
|
+
const skill = await service.addSkill(teamId, input.workspaceId, input.skillId);
|
|
277
|
+
return {
|
|
278
|
+
success: true,
|
|
279
|
+
dataSource,
|
|
280
|
+
skills: [skill],
|
|
281
|
+
message: `Skill "${input.skillId}" shared to workspace.`,
|
|
282
|
+
};
|
|
209
283
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
284
|
+
case 'remove': {
|
|
285
|
+
if (!input.skillId) {
|
|
286
|
+
return { success: false, dataSource, error: 'skillId is required for remove.' };
|
|
287
|
+
}
|
|
288
|
+
const removed = await service.removeSkill(teamId, input.workspaceId, input.skillId);
|
|
289
|
+
if (!removed) {
|
|
290
|
+
return { success: false, dataSource, error: 'Skill not found in workspace.' };
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
success: true,
|
|
294
|
+
dataSource,
|
|
295
|
+
message: `Skill "${input.skillId}" removed from workspace.`,
|
|
296
|
+
};
|
|
215
297
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
case 'remove': {
|
|
225
|
-
if (!input.skillId) {
|
|
226
|
-
return { success: false, dataSource, error: 'skillId is required for remove.' };
|
|
298
|
+
case 'list': {
|
|
299
|
+
const list = await service.listSkills(teamId, input.workspaceId);
|
|
300
|
+
return {
|
|
301
|
+
success: true,
|
|
302
|
+
dataSource,
|
|
303
|
+
skills: list,
|
|
304
|
+
message: `${list.length} shared skill(s).`,
|
|
305
|
+
};
|
|
227
306
|
}
|
|
228
|
-
const removed = await service.removeSkill(teamId, input.workspaceId, input.skillId);
|
|
229
|
-
if (!removed)
|
|
230
|
-
return { success: false, dataSource, error: 'Skill not found in workspace.' };
|
|
231
|
-
return {
|
|
232
|
-
success: true,
|
|
233
|
-
dataSource,
|
|
234
|
-
message: `Skill "${input.skillId}" removed from workspace.`,
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
case 'list': {
|
|
238
|
-
const list = await service.listSkills(teamId, input.workspaceId);
|
|
239
|
-
return { success: true, dataSource, skills: list, message: `${list.length} shared skill(s).` };
|
|
240
307
|
}
|
|
241
308
|
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
return {
|
|
311
|
+
success: false,
|
|
312
|
+
dataSource,
|
|
313
|
+
error: err instanceof Error ? err.message : 'Share skill operation failed.',
|
|
314
|
+
};
|
|
315
|
+
}
|
|
242
316
|
}
|
|
243
317
|
//# sourceMappingURL=team-workspace.js.map
|