@skillsmith/mcp-server 0.4.2 → 0.4.3
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/README.md +11 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/LocalIndexer.test.js +158 -0
- package/dist/src/__tests__/LocalIndexer.test.js.map +1 -1
- package/dist/src/__tests__/compare.test.d.ts +8 -0
- package/dist/src/__tests__/compare.test.d.ts.map +1 -0
- package/dist/src/__tests__/compare.test.js +162 -0
- package/dist/src/__tests__/compare.test.js.map +1 -0
- package/dist/src/__tests__/context.async.test.d.ts +8 -0
- package/dist/src/__tests__/context.async.test.d.ts.map +1 -0
- package/dist/src/__tests__/context.async.test.js +223 -0
- package/dist/src/__tests__/context.async.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.d.ts +10 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.js +93 -0
- package/dist/src/__tests__/middleware/errorFormatter.builders.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license-renewal.test.d.ts +10 -0
- package/dist/src/__tests__/middleware/license-renewal.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license-renewal.test.js +152 -0
- package/dist/src/__tests__/middleware/license-renewal.test.js.map +1 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.d.ts +9 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.js +105 -0
- package/dist/src/__tests__/middleware/quota-helpers.test.js.map +1 -0
- package/dist/src/__tests__/middleware/quota.test.d.ts +12 -0
- package/dist/src/__tests__/middleware/quota.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/quota.test.js +189 -0
- package/dist/src/__tests__/middleware/quota.test.js.map +1 -0
- package/dist/src/__tests__/recommend-online-path.test.d.ts +10 -0
- package/dist/src/__tests__/recommend-online-path.test.d.ts.map +1 -0
- package/dist/src/__tests__/recommend-online-path.test.js +225 -0
- package/dist/src/__tests__/recommend-online-path.test.js.map +1 -0
- package/dist/src/__tests__/recommend.test.d.ts +2 -0
- package/dist/src/__tests__/recommend.test.d.ts.map +1 -1
- package/dist/src/__tests__/recommend.test.js +14 -2
- package/dist/src/__tests__/recommend.test.js.map +1 -1
- package/dist/src/__tests__/search-online-path.test.d.ts +10 -0
- package/dist/src/__tests__/search-online-path.test.d.ts.map +1 -0
- package/dist/src/__tests__/search-online-path.test.js +140 -0
- package/dist/src/__tests__/search-online-path.test.js.map +1 -0
- package/dist/src/__tests__/search.test.js +153 -5
- package/dist/src/__tests__/search.test.js.map +1 -1
- package/dist/src/context/project-detector.d.ts.map +1 -1
- package/dist/src/context/project-detector.js +1 -0
- package/dist/src/context/project-detector.js.map +1 -1
- package/dist/src/context.async.d.ts +48 -0
- package/dist/src/context.async.d.ts.map +1 -0
- package/dist/src/context.async.js +215 -0
- package/dist/src/context.async.js.map +1 -0
- package/dist/src/context.d.ts +5 -145
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.helpers.d.ts +25 -0
- package/dist/src/context.helpers.d.ts.map +1 -0
- package/dist/src/context.helpers.js +49 -0
- package/dist/src/context.helpers.js.map +1 -0
- package/dist/src/context.js +11 -228
- package/dist/src/context.js.map +1 -1
- package/dist/src/context.types.d.ts +110 -0
- package/dist/src/context.types.d.ts.map +1 -0
- package/dist/src/context.types.js +10 -0
- package/dist/src/context.types.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +1 -1
- package/dist/src/health/readinessCheck.d.ts.map +1 -1
- package/dist/src/index.js +21 -152
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/FrontmatterParser.d.ts +6 -0
- package/dist/src/indexer/FrontmatterParser.d.ts.map +1 -1
- package/dist/src/indexer/FrontmatterParser.js +15 -0
- package/dist/src/indexer/FrontmatterParser.js.map +1 -1
- package/dist/src/indexer/LocalIndexer.d.ts +4 -0
- package/dist/src/indexer/LocalIndexer.d.ts.map +1 -1
- package/dist/src/indexer/LocalIndexer.js +3 -0
- package/dist/src/indexer/LocalIndexer.js.map +1 -1
- package/dist/src/middleware/degradation.d.ts.map +1 -1
- package/dist/src/middleware/degradation.js +8 -0
- package/dist/src/middleware/degradation.js.map +1 -1
- package/dist/src/middleware/errorFormatter.builders.d.ts +49 -0
- package/dist/src/middleware/errorFormatter.builders.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.builders.js +237 -0
- package/dist/src/middleware/errorFormatter.builders.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +5 -100
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -1
- package/dist/src/middleware/errorFormatter.js +16 -238
- package/dist/src/middleware/errorFormatter.js.map +1 -1
- package/dist/src/middleware/errorFormatter.types.d.ts +81 -0
- package/dist/src/middleware/errorFormatter.types.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.types.js +34 -0
- package/dist/src/middleware/errorFormatter.types.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +1 -1
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
- package/dist/src/middleware/toolFeatureMapping.js +8 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
- package/dist/src/tool-dispatch.d.ts +27 -0
- package/dist/src/tool-dispatch.d.ts.map +1 -0
- package/dist/src/tool-dispatch.js +127 -0
- package/dist/src/tool-dispatch.js.map +1 -0
- package/dist/src/tools/LocalSkillSearch.d.ts.map +1 -1
- package/dist/src/tools/LocalSkillSearch.js +4 -0
- package/dist/src/tools/LocalSkillSearch.js.map +1 -1
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +14 -0
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +6 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/install.d.ts +3 -35
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.js +22 -74
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.optimize.d.ts +46 -0
- package/dist/src/tools/install.optimize.d.ts.map +1 -0
- package/dist/src/tools/install.optimize.js +67 -0
- package/dist/src/tools/install.optimize.js.map +1 -0
- package/dist/src/tools/install.tool.d.ts +44 -0
- package/dist/src/tools/install.tool.d.ts.map +1 -0
- package/dist/src/tools/install.tool.js +44 -0
- package/dist/src/tools/install.tool.js.map +1 -0
- package/dist/src/tools/install.types.d.ts +7 -1
- package/dist/src/tools/install.types.d.ts.map +1 -1
- package/dist/src/tools/recommend.d.ts +2 -4
- package/dist/src/tools/recommend.d.ts.map +1 -1
- package/dist/src/tools/recommend.format.d.ts +28 -0
- package/dist/src/tools/recommend.format.d.ts.map +1 -0
- package/dist/src/tools/recommend.format.js +111 -0
- package/dist/src/tools/recommend.format.js.map +1 -0
- package/dist/src/tools/recommend.js +6 -97
- package/dist/src/tools/recommend.js.map +1 -1
- package/dist/src/tools/recommend.types.d.ts +1 -1
- package/dist/src/tools/search.d.ts +24 -21
- package/dist/src/tools/search.d.ts.map +1 -1
- package/dist/src/tools/search.formatter.d.ts +30 -0
- package/dist/src/tools/search.formatter.d.ts.map +1 -0
- package/dist/src/tools/search.formatter.js +64 -0
- package/dist/src/tools/search.formatter.js.map +1 -0
- package/dist/src/tools/search.js +55 -54
- package/dist/src/tools/search.js.map +1 -1
- package/dist/src/tools/skill-audit.d.ts +98 -0
- package/dist/src/tools/skill-audit.d.ts.map +1 -0
- package/dist/src/tools/skill-audit.js +105 -0
- package/dist/src/tools/skill-audit.js.map +1 -0
- package/dist/src/tools/skill-audit.test.d.ts +6 -0
- package/dist/src/tools/skill-audit.test.d.ts.map +1 -0
- package/dist/src/tools/skill-audit.test.js +121 -0
- package/dist/src/tools/skill-audit.test.js.map +1 -0
- package/dist/src/tools/skill-diff.d.ts +107 -0
- package/dist/src/tools/skill-diff.d.ts.map +1 -0
- package/dist/src/tools/skill-diff.js +268 -0
- package/dist/src/tools/skill-diff.js.map +1 -0
- package/dist/src/tools/skill-diff.test.d.ts +6 -0
- package/dist/src/tools/skill-diff.test.d.ts.map +1 -0
- package/dist/src/tools/skill-diff.test.js +260 -0
- package/dist/src/tools/skill-diff.test.js.map +1 -0
- package/dist/src/tools/skill-updates.d.ts +1 -1
- package/dist/src/tools/skill-updates.d.ts.map +1 -1
- package/dist/src/tools/suggest.d.ts +4 -4
- package/dist/src/tools/uninstall.d.ts +1 -1
- package/dist/src/tools/validate.helpers.d.ts.map +1 -1
- package/dist/src/tools/validate.helpers.js +31 -0
- package/dist/src/tools/validate.helpers.js.map +1 -1
- package/dist/src/utils/validation.d.ts +13 -0
- package/dist/src/utils/validation.d.ts.map +1 -1
- package/dist/src/utils/validation.js +27 -0
- package/dist/src/utils/validation.js.map +1 -1
- package/dist/tests/health.test.js +4 -4
- package/dist/tests/health.test.js.map +1 -1
- package/dist/tests/integration/recommend.integration.test.js +2 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -1
- package/dist/tests/integration/setup.d.ts +3 -1
- package/dist/tests/integration/setup.d.ts.map +1 -1
- package/dist/tests/integration/setup.js +4 -1
- package/dist/tests/integration/setup.js.map +1 -1
- package/dist/tests/recommend.test.js +2 -0
- package/dist/tests/recommend.test.js.map +1 -1
- package/dist/tests/unit/validate-helpers.test.js +54 -0
- package/dist/tests/unit/validate-helpers.test.js.map +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for async tool context creation with WASM fallback
|
|
3
|
+
*
|
|
4
|
+
* @see SMI-2756: Wave 3 coverage — async context lifecycle
|
|
5
|
+
* @see SMI-2207: Async database functions with WASM fallback
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Hoisted mock state — must be declared with vi.hoisted() so they are
|
|
12
|
+
// accessible in the vi.mock() factory closures (hoisted to top of file).
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const { mockExistsSync } = vi.hoisted(() => ({
|
|
15
|
+
mockExistsSync: vi.fn().mockReturnValue(false),
|
|
16
|
+
}));
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Module-level mocks
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
vi.mock('fs', async (importOriginal) => {
|
|
21
|
+
const actual = await importOriginal();
|
|
22
|
+
return { ...actual, existsSync: mockExistsSync };
|
|
23
|
+
});
|
|
24
|
+
vi.mock('../context.helpers.js', () => ({
|
|
25
|
+
getDefaultDbPath: vi.fn().mockReturnValue(':memory:'),
|
|
26
|
+
ensureDbDirectory: vi.fn(),
|
|
27
|
+
}));
|
|
28
|
+
vi.mock('../llm/failover.js', () => {
|
|
29
|
+
class MockLLMFailoverChain {
|
|
30
|
+
initialize = vi.fn().mockResolvedValue(undefined);
|
|
31
|
+
close = vi.fn();
|
|
32
|
+
}
|
|
33
|
+
return { LLMFailoverChain: MockLLMFailoverChain };
|
|
34
|
+
});
|
|
35
|
+
vi.mock('@skillsmith/core', async (importOriginal) => {
|
|
36
|
+
const actual = await importOriginal();
|
|
37
|
+
function makeMockDb(name = ':memory:') {
|
|
38
|
+
return {
|
|
39
|
+
close: vi.fn(),
|
|
40
|
+
exec: vi.fn(),
|
|
41
|
+
prepare: vi.fn().mockReturnValue({
|
|
42
|
+
run: vi.fn().mockReturnValue({ changes: 0, lastInsertRowid: 0 }),
|
|
43
|
+
get: vi.fn().mockReturnValue(undefined),
|
|
44
|
+
all: vi.fn().mockReturnValue([]),
|
|
45
|
+
}),
|
|
46
|
+
transaction: vi.fn().mockImplementation((fn) => fn),
|
|
47
|
+
pragma: vi.fn(),
|
|
48
|
+
open: true,
|
|
49
|
+
name,
|
|
50
|
+
memory: name === ':memory:',
|
|
51
|
+
readonly: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
class MockSearchService {
|
|
55
|
+
}
|
|
56
|
+
class MockSkillRepository {
|
|
57
|
+
}
|
|
58
|
+
class MockSkillsmithApiClient {
|
|
59
|
+
isOffline() {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class MockSyncConfigRepository {
|
|
64
|
+
getConfig() {
|
|
65
|
+
return { enabled: false };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
class MockSyncHistoryRepository {
|
|
69
|
+
}
|
|
70
|
+
class MockSyncEngine {
|
|
71
|
+
}
|
|
72
|
+
class MockSkillVersionRepository {
|
|
73
|
+
}
|
|
74
|
+
class MockBackgroundSyncService {
|
|
75
|
+
start = vi.fn();
|
|
76
|
+
stop = vi.fn();
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
...actual,
|
|
80
|
+
createDatabaseAsync: vi.fn().mockResolvedValue(makeMockDb(':memory:')),
|
|
81
|
+
openDatabaseAsync: vi.fn().mockResolvedValue(makeMockDb('existing.db')),
|
|
82
|
+
initializeSchema: vi.fn(),
|
|
83
|
+
SearchService: MockSearchService,
|
|
84
|
+
SkillRepository: MockSkillRepository,
|
|
85
|
+
SkillsmithApiClient: MockSkillsmithApiClient,
|
|
86
|
+
initializePostHog: vi.fn(),
|
|
87
|
+
shutdownPostHog: vi.fn().mockResolvedValue(undefined),
|
|
88
|
+
generateAnonymousId: vi.fn().mockReturnValue('anon-id-123'),
|
|
89
|
+
SyncConfigRepository: MockSyncConfigRepository,
|
|
90
|
+
SyncHistoryRepository: MockSyncHistoryRepository,
|
|
91
|
+
SyncEngine: MockSyncEngine,
|
|
92
|
+
SkillVersionRepository: MockSkillVersionRepository,
|
|
93
|
+
BackgroundSyncService: MockBackgroundSyncService,
|
|
94
|
+
getApiKey: vi.fn().mockReturnValue(undefined),
|
|
95
|
+
validateDbPath: actual.validateDbPath,
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Import the module under test AFTER mocks are registered
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
import { createToolContextAsync, getToolContextAsync, resetAsyncToolContext, } from '../context.async.js';
|
|
102
|
+
describe('context.async', () => {
|
|
103
|
+
beforeEach(async () => {
|
|
104
|
+
await resetAsyncToolContext();
|
|
105
|
+
// Disable background sync by default so tests don't hit SyncConfigRepository.getConfig()
|
|
106
|
+
vi.stubEnv('SKILLSMITH_BACKGROUND_SYNC', 'false');
|
|
107
|
+
mockExistsSync.mockReturnValue(false);
|
|
108
|
+
});
|
|
109
|
+
afterEach(async () => {
|
|
110
|
+
await resetAsyncToolContext();
|
|
111
|
+
vi.unstubAllEnvs();
|
|
112
|
+
});
|
|
113
|
+
// -------------------------------------------------------------------------
|
|
114
|
+
// createToolContextAsync
|
|
115
|
+
// -------------------------------------------------------------------------
|
|
116
|
+
describe('createToolContextAsync', () => {
|
|
117
|
+
it('creates context with in-memory database path', async () => {
|
|
118
|
+
const ctx = await createToolContextAsync({ dbPath: ':memory:' });
|
|
119
|
+
expect(ctx).toBeDefined();
|
|
120
|
+
expect(ctx.db).toBeDefined();
|
|
121
|
+
expect(ctx.searchService).toBeDefined();
|
|
122
|
+
expect(ctx.skillRepository).toBeDefined();
|
|
123
|
+
expect(ctx.apiClient).toBeDefined();
|
|
124
|
+
});
|
|
125
|
+
it('throws for path traversal in dbPath', async () => {
|
|
126
|
+
await expect(createToolContextAsync({ dbPath: '/etc/../../tmp/evil.db' })).rejects.toThrow(/Invalid database path/);
|
|
127
|
+
});
|
|
128
|
+
it('skips ensureDbDirectory for :memory: path', async () => {
|
|
129
|
+
const { ensureDbDirectory } = await import('../context.helpers.js');
|
|
130
|
+
await createToolContextAsync({ dbPath: ':memory:' });
|
|
131
|
+
expect(ensureDbDirectory).not.toHaveBeenCalled();
|
|
132
|
+
});
|
|
133
|
+
it('uses openDatabaseAsync when database file already exists', async () => {
|
|
134
|
+
const { openDatabaseAsync, createDatabaseAsync } = await import('@skillsmith/core');
|
|
135
|
+
const dbPath = join(tmpdir(), 'test-existing.db');
|
|
136
|
+
mockExistsSync.mockReturnValue(true);
|
|
137
|
+
// Reset call counts before this test's assertion
|
|
138
|
+
vi.mocked(openDatabaseAsync).mockClear();
|
|
139
|
+
vi.mocked(createDatabaseAsync).mockClear();
|
|
140
|
+
await createToolContextAsync({ dbPath });
|
|
141
|
+
expect(openDatabaseAsync).toHaveBeenCalledWith(dbPath);
|
|
142
|
+
expect(createDatabaseAsync).not.toHaveBeenCalled();
|
|
143
|
+
});
|
|
144
|
+
it('calls initializePostHog when telemetry env var is true', async () => {
|
|
145
|
+
const { initializePostHog } = await import('@skillsmith/core');
|
|
146
|
+
vi.stubEnv('SKILLSMITH_TELEMETRY_ENABLED', 'true');
|
|
147
|
+
vi.stubEnv('POSTHOG_API_KEY', 'phc_test-key');
|
|
148
|
+
await createToolContextAsync({ dbPath: ':memory:' });
|
|
149
|
+
expect(initializePostHog).toHaveBeenCalledWith(expect.objectContaining({ apiKey: 'phc_test-key' }));
|
|
150
|
+
});
|
|
151
|
+
it('does not create BackgroundSyncService when SKILLSMITH_BACKGROUND_SYNC is false', async () => {
|
|
152
|
+
vi.stubEnv('SKILLSMITH_BACKGROUND_SYNC', 'false');
|
|
153
|
+
const ctx = await createToolContextAsync({ dbPath: ':memory:' });
|
|
154
|
+
expect(ctx.backgroundSync).toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
it('creates LLMFailoverChain when SKILLSMITH_LLM_FAILOVER_ENABLED is true', async () => {
|
|
157
|
+
vi.stubEnv('SKILLSMITH_LLM_FAILOVER_ENABLED', 'true');
|
|
158
|
+
const ctx = await createToolContextAsync({ dbPath: ':memory:' });
|
|
159
|
+
expect(ctx.llmFailover).toBeDefined();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
// -------------------------------------------------------------------------
|
|
163
|
+
// getToolContextAsync
|
|
164
|
+
// -------------------------------------------------------------------------
|
|
165
|
+
describe('getToolContextAsync', () => {
|
|
166
|
+
it('caches context on second call (returns same instance)', async () => {
|
|
167
|
+
const ctx1 = await getToolContextAsync({ dbPath: ':memory:' });
|
|
168
|
+
const ctx2 = await getToolContextAsync();
|
|
169
|
+
expect(ctx1).toBe(ctx2);
|
|
170
|
+
});
|
|
171
|
+
it('warns when options are provided after first initialisation', async () => {
|
|
172
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
173
|
+
await getToolContextAsync({ dbPath: ':memory:' });
|
|
174
|
+
// Second call with options — should warn and ignore them
|
|
175
|
+
await getToolContextAsync({ dbPath: ':memory:' });
|
|
176
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('already initialized'));
|
|
177
|
+
warnSpy.mockRestore();
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
// -------------------------------------------------------------------------
|
|
181
|
+
// resetAsyncToolContext
|
|
182
|
+
// -------------------------------------------------------------------------
|
|
183
|
+
describe('resetAsyncToolContext', () => {
|
|
184
|
+
it('calls backgroundSync.stop() when backgroundSync is present', async () => {
|
|
185
|
+
vi.stubEnv('SKILLSMITH_BACKGROUND_SYNC', 'true');
|
|
186
|
+
const core = await import('@skillsmith/core');
|
|
187
|
+
const stopFn = vi.fn();
|
|
188
|
+
// Override SyncConfigRepository so the sync engine actually starts
|
|
189
|
+
const _OrigSyncConfig = core.SyncConfigRepository;
|
|
190
|
+
vi.spyOn(core, 'SyncConfigRepository').mockImplementationOnce(function () {
|
|
191
|
+
return { getConfig: () => ({ enabled: true }) };
|
|
192
|
+
});
|
|
193
|
+
// Override BackgroundSyncService to capture the stop method
|
|
194
|
+
const _OrigBgSync = core.BackgroundSyncService;
|
|
195
|
+
vi.spyOn(core, 'BackgroundSyncService').mockImplementationOnce(function () {
|
|
196
|
+
return { start: vi.fn(), stop: stopFn };
|
|
197
|
+
});
|
|
198
|
+
await getToolContextAsync({ dbPath: ':memory:' });
|
|
199
|
+
await resetAsyncToolContext();
|
|
200
|
+
expect(stopFn).toHaveBeenCalled();
|
|
201
|
+
});
|
|
202
|
+
it('calls llmFailover.close() when llmFailover is present', async () => {
|
|
203
|
+
vi.stubEnv('SKILLSMITH_LLM_FAILOVER_ENABLED', 'true');
|
|
204
|
+
const failoverModule = await import('../llm/failover.js');
|
|
205
|
+
const closeFn = vi.fn();
|
|
206
|
+
vi.spyOn(failoverModule, 'LLMFailoverChain').mockImplementationOnce(function () {
|
|
207
|
+
return { initialize: vi.fn().mockResolvedValue(undefined), close: closeFn };
|
|
208
|
+
});
|
|
209
|
+
await getToolContextAsync({ dbPath: ':memory:' });
|
|
210
|
+
await resetAsyncToolContext();
|
|
211
|
+
expect(closeFn).toHaveBeenCalled();
|
|
212
|
+
});
|
|
213
|
+
it('calls shutdownPostHog when distinctId is set', async () => {
|
|
214
|
+
const { shutdownPostHog } = await import('@skillsmith/core');
|
|
215
|
+
vi.stubEnv('SKILLSMITH_TELEMETRY_ENABLED', 'true');
|
|
216
|
+
vi.stubEnv('POSTHOG_API_KEY', 'phc_test-key');
|
|
217
|
+
await getToolContextAsync({ dbPath: ':memory:' });
|
|
218
|
+
await resetAsyncToolContext();
|
|
219
|
+
expect(shutdownPostHog).toHaveBeenCalled();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=context.async.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.async.test.js","sourceRoot":"","sources":["../../../src/__tests__/context.async.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2754: Error Formatter Builders Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the authentication-error builder functions in errorFormatter.builders.ts:
|
|
5
|
+
* - formatAuthenticationError
|
|
6
|
+
* - isAuthenticationError
|
|
7
|
+
* - extractAuthErrorDetails
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=errorFormatter.builders.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorFormatter.builders.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/middleware/errorFormatter.builders.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2754: Error Formatter Builders Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the authentication-error builder functions in errorFormatter.builders.ts:
|
|
5
|
+
* - formatAuthenticationError
|
|
6
|
+
* - isAuthenticationError
|
|
7
|
+
* - extractAuthErrorDetails
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { formatAuthenticationError, isAuthenticationError, extractAuthErrorDetails, } from '../../middleware/errorFormatter.builders.js';
|
|
11
|
+
describe('formatAuthenticationError', () => {
|
|
12
|
+
it('returns MCP error response with default URLs when called with no arguments', () => {
|
|
13
|
+
const response = formatAuthenticationError();
|
|
14
|
+
expect(response.isError).toBe(true);
|
|
15
|
+
expect(response.content).toHaveLength(1);
|
|
16
|
+
expect(response.content[0].type).toBe('text');
|
|
17
|
+
expect(response.content[0].text).toContain('Authentication Required');
|
|
18
|
+
expect(response.content[0].text).toContain('https://skillsmith.app/signup');
|
|
19
|
+
expect(response.content[0].text).toContain('https://skillsmith.app/docs/getting-started#api-key');
|
|
20
|
+
expect(response._meta?.errorCode).toBe('AUTHENTICATION_REQUIRED');
|
|
21
|
+
expect(response._meta?.recoverable).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
it('includes trial usage info when trialUsed and trialLimit are both provided', () => {
|
|
24
|
+
const response = formatAuthenticationError({
|
|
25
|
+
trialUsed: 8,
|
|
26
|
+
trialLimit: 10,
|
|
27
|
+
});
|
|
28
|
+
expect(response.content[0].text).toContain('8/10 free requests used');
|
|
29
|
+
});
|
|
30
|
+
it('omits trial usage info when only trialUsed is provided (both required)', () => {
|
|
31
|
+
const response = formatAuthenticationError({ trialUsed: 5 });
|
|
32
|
+
expect(response.content[0].text).not.toContain('free requests used');
|
|
33
|
+
});
|
|
34
|
+
it('uses custom signupUrl and docsUrl when provided in details', () => {
|
|
35
|
+
const response = formatAuthenticationError({
|
|
36
|
+
signupUrl: 'https://custom.example.com/register',
|
|
37
|
+
docsUrl: 'https://custom.example.com/docs',
|
|
38
|
+
});
|
|
39
|
+
expect(response.content[0].text).toContain('https://custom.example.com/register');
|
|
40
|
+
expect(response.content[0].text).toContain('https://custom.example.com/docs');
|
|
41
|
+
expect(response._meta?.upgradeUrl).toBe('https://custom.example.com/register');
|
|
42
|
+
});
|
|
43
|
+
it('includes reason text when provided', () => {
|
|
44
|
+
const response = formatAuthenticationError({
|
|
45
|
+
reason: 'Your free trial has been exhausted.',
|
|
46
|
+
});
|
|
47
|
+
expect(response.content[0].text).toContain('Your free trial has been exhausted.');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('isAuthenticationError', () => {
|
|
51
|
+
it('returns true when object has statusCode 401', () => {
|
|
52
|
+
expect(isAuthenticationError({ statusCode: 401, message: 'Unauthorized' })).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
it('returns true when object has status 401', () => {
|
|
55
|
+
expect(isAuthenticationError({ status: 401 })).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it('returns true when message contains "authentication required" (case insensitive)', () => {
|
|
58
|
+
expect(isAuthenticationError({ message: 'Authentication Required for this route' })).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('returns true when message contains "free trial exhausted"', () => {
|
|
61
|
+
expect(isAuthenticationError({ message: 'Free trial exhausted, please upgrade' })).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
it('returns true when error field contains "authentication required"', () => {
|
|
64
|
+
expect(isAuthenticationError({ error: 'Authentication required' })).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it('returns false for an object that does not match any auth pattern', () => {
|
|
67
|
+
expect(isAuthenticationError({ statusCode: 403, message: 'Forbidden' })).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
it('returns false for null input', () => {
|
|
70
|
+
expect(isAuthenticationError(null)).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
it('returns false for non-object input (string)', () => {
|
|
73
|
+
expect(isAuthenticationError('error string')).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('extractAuthErrorDetails', () => {
|
|
77
|
+
it('returns the details object when present in the error', () => {
|
|
78
|
+
const details = { reason: 'Trial expired', trialUsed: 10, trialLimit: 10 };
|
|
79
|
+
const result = extractAuthErrorDetails({ status: 401, details });
|
|
80
|
+
expect(result).toEqual(details);
|
|
81
|
+
});
|
|
82
|
+
it('returns empty object when no details property is present', () => {
|
|
83
|
+
const result = extractAuthErrorDetails({ status: 401, message: 'Unauthorized' });
|
|
84
|
+
expect(result).toEqual({});
|
|
85
|
+
});
|
|
86
|
+
it('returns empty object for null input', () => {
|
|
87
|
+
expect(extractAuthErrorDetails(null)).toEqual({});
|
|
88
|
+
});
|
|
89
|
+
it('returns empty object for non-object input', () => {
|
|
90
|
+
expect(extractAuthErrorDetails(42)).toEqual({});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=errorFormatter.builders.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorFormatter.builders.test.js","sourceRoot":"","sources":["../../../../src/__tests__/middleware/errorFormatter.builders.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2756: Wave 3 — License middleware supplemental tests
|
|
3
|
+
*
|
|
4
|
+
* Companion file to license.test.ts (which exceeds the 500-line limit).
|
|
5
|
+
* Covers: expiration warning thresholds, getExpirationWarning boundary cases,
|
|
6
|
+
* invalidateCache forces re-validation, checkTool for community tools,
|
|
7
|
+
* createLicenseErrorResponse shape, and requireFeature HOF.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=license-renewal.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-renewal.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/middleware/license-renewal.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2756: Wave 3 — License middleware supplemental tests
|
|
3
|
+
*
|
|
4
|
+
* Companion file to license.test.ts (which exceeds the 500-line limit).
|
|
5
|
+
* Covers: expiration warning thresholds, getExpirationWarning boundary cases,
|
|
6
|
+
* invalidateCache forces re-validation, checkTool for community tools,
|
|
7
|
+
* createLicenseErrorResponse shape, and requireFeature HOF.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
10
|
+
import { createLicenseMiddleware, getExpirationWarning, requireFeature, createLicenseErrorResponse, isEnterpriseFeature, requiresLicense, } from '../../middleware/license.js';
|
|
11
|
+
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
12
|
+
describe('License middleware — supplemental (SMI-2756)', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
vi.resetModules();
|
|
15
|
+
delete process.env.SKILLSMITH_LICENSE_KEY;
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.restoreAllMocks();
|
|
19
|
+
delete process.env.SKILLSMITH_LICENSE_KEY;
|
|
20
|
+
});
|
|
21
|
+
// -------------------------------------------------------------------------
|
|
22
|
+
// getExpirationWarning boundary cases
|
|
23
|
+
// -------------------------------------------------------------------------
|
|
24
|
+
describe('getExpirationWarning', () => {
|
|
25
|
+
it('returns undefined when expiresAt is undefined', () => {
|
|
26
|
+
expect(getExpirationWarning(undefined)).toBeUndefined();
|
|
27
|
+
});
|
|
28
|
+
it('returns undefined when license expires in more than 30 days', () => {
|
|
29
|
+
const future = new Date(Date.now() + 60 * MS_PER_DAY);
|
|
30
|
+
expect(getExpirationWarning(future)).toBeUndefined();
|
|
31
|
+
});
|
|
32
|
+
it('returns a warning string when license expires in <= 30 days', () => {
|
|
33
|
+
const soon = new Date(Date.now() + 15 * MS_PER_DAY);
|
|
34
|
+
const warning = getExpirationWarning(soon);
|
|
35
|
+
expect(typeof warning).toBe('string');
|
|
36
|
+
expect(warning).toContain('day');
|
|
37
|
+
});
|
|
38
|
+
it('returns singular "day" when exactly 1 day remains', () => {
|
|
39
|
+
const tomorrow = new Date(Date.now() + 1 * MS_PER_DAY + 60_000); // +1 min buffer
|
|
40
|
+
const warning = getExpirationWarning(tomorrow);
|
|
41
|
+
expect(warning).toContain('1 day');
|
|
42
|
+
// Should not say "1 days"
|
|
43
|
+
expect(warning).not.toContain('1 days');
|
|
44
|
+
});
|
|
45
|
+
it('returns undefined when license is already expired', () => {
|
|
46
|
+
const expired = new Date(Date.now() - MS_PER_DAY);
|
|
47
|
+
// daysUntilExpiry <= 0 — condition requires > 0
|
|
48
|
+
expect(getExpirationWarning(expired)).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// -------------------------------------------------------------------------
|
|
52
|
+
// checkTool — community tool (no license required)
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
describe('checkTool — community tools', () => {
|
|
55
|
+
it('returns valid:true for a community tool even without license key', async () => {
|
|
56
|
+
const middleware = createLicenseMiddleware();
|
|
57
|
+
const result = await middleware.checkTool('search');
|
|
58
|
+
expect(result.valid).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('returns valid:true for get_skill (community)', async () => {
|
|
61
|
+
const middleware = createLicenseMiddleware();
|
|
62
|
+
const result = await middleware.checkTool('get_skill');
|
|
63
|
+
expect(result.valid).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// -------------------------------------------------------------------------
|
|
67
|
+
// invalidateCache forces community re-evaluation
|
|
68
|
+
// -------------------------------------------------------------------------
|
|
69
|
+
describe('invalidateCache', () => {
|
|
70
|
+
it('does not throw when called before any cache is populated', () => {
|
|
71
|
+
const middleware = createLicenseMiddleware();
|
|
72
|
+
expect(() => middleware.invalidateCache()).not.toThrow();
|
|
73
|
+
});
|
|
74
|
+
it('returns updated info after invalidation', async () => {
|
|
75
|
+
const middleware = createLicenseMiddleware();
|
|
76
|
+
// Populate cache
|
|
77
|
+
const first = await middleware.getLicenseInfo();
|
|
78
|
+
expect(first?.tier).toBe('community');
|
|
79
|
+
middleware.invalidateCache();
|
|
80
|
+
// Re-evaluate — should still succeed without error
|
|
81
|
+
const second = await middleware.getLicenseInfo();
|
|
82
|
+
expect(second?.tier).toBe('community');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
// -------------------------------------------------------------------------
|
|
86
|
+
// createLicenseErrorResponse
|
|
87
|
+
// -------------------------------------------------------------------------
|
|
88
|
+
describe('createLicenseErrorResponse', () => {
|
|
89
|
+
it('returns isError:true', () => {
|
|
90
|
+
const response = createLicenseErrorResponse({
|
|
91
|
+
valid: false,
|
|
92
|
+
message: 'Upgrade required',
|
|
93
|
+
feature: 'audit_logging',
|
|
94
|
+
upgradeUrl: 'https://skillsmith.app/pricing',
|
|
95
|
+
});
|
|
96
|
+
expect(response.isError).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
it('includes the message in content text', () => {
|
|
99
|
+
const response = createLicenseErrorResponse({
|
|
100
|
+
valid: false,
|
|
101
|
+
message: 'You need a team license',
|
|
102
|
+
feature: 'audit_logging',
|
|
103
|
+
upgradeUrl: 'https://skillsmith.app/pricing?feature=audit_logging',
|
|
104
|
+
});
|
|
105
|
+
const text = response.content[0].text;
|
|
106
|
+
const parsed = JSON.parse(text);
|
|
107
|
+
expect(parsed.message).toBe('You need a team license');
|
|
108
|
+
});
|
|
109
|
+
it('includes _meta.upgradeUrl when upgradeUrl is set', () => {
|
|
110
|
+
const response = createLicenseErrorResponse({
|
|
111
|
+
valid: false,
|
|
112
|
+
message: 'Upgrade',
|
|
113
|
+
upgradeUrl: 'https://skillsmith.app/pricing',
|
|
114
|
+
});
|
|
115
|
+
expect(response._meta?.upgradeUrl).toBe('https://skillsmith.app/pricing');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
// -------------------------------------------------------------------------
|
|
119
|
+
// requireFeature HOF
|
|
120
|
+
// -------------------------------------------------------------------------
|
|
121
|
+
describe('requireFeature', () => {
|
|
122
|
+
it('returns a function that delegates to middleware.checkFeature', async () => {
|
|
123
|
+
const checkFeatureMock = vi.fn().mockResolvedValue({ valid: true });
|
|
124
|
+
const mockMiddleware = {
|
|
125
|
+
checkFeature: checkFeatureMock,
|
|
126
|
+
checkTool: vi.fn(),
|
|
127
|
+
getLicenseInfo: vi.fn(),
|
|
128
|
+
invalidateCache: vi.fn(),
|
|
129
|
+
};
|
|
130
|
+
const requireAuditLogging = requireFeature('audit_logging');
|
|
131
|
+
const result = await requireAuditLogging(mockMiddleware);
|
|
132
|
+
expect(checkFeatureMock).toHaveBeenCalledWith('audit_logging');
|
|
133
|
+
expect(result.valid).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
// -------------------------------------------------------------------------
|
|
137
|
+
// isEnterpriseFeature / requiresLicense helpers
|
|
138
|
+
// -------------------------------------------------------------------------
|
|
139
|
+
describe('helper functions', () => {
|
|
140
|
+
it('isEnterpriseFeature returns false for unknown tool name', () => {
|
|
141
|
+
expect(isEnterpriseFeature('nonexistent_tool')).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
it('requiresLicense returns false for community tools', () => {
|
|
144
|
+
expect(requiresLicense('search')).toBe(false);
|
|
145
|
+
expect(requiresLicense('get_skill')).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
it('requiresLicense returns false for unknown tools', () => {
|
|
148
|
+
expect(requiresLicense('completely_made_up_tool')).toBe(false);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=license-renewal.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-renewal.test.js","sourceRoot":"","sources":["../../../../src/__tests__/middleware/license-renewal.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-2755 Wave 2: Quota helpers pure-function unit tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for InMemoryQuotaStorage, getWarningMessage, and getWarningLevel
|
|
5
|
+
* from quota-helpers.ts. No mocking needed — all pure functions or
|
|
6
|
+
* simple in-memory operations.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=quota-helpers.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-helpers.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/middleware/quota-helpers.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|