@skillsmith/mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +6 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
- package/dist/src/__tests__/get-skill.test.js +88 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license.test.js +500 -0
- package/dist/src/__tests__/middleware/license.test.js.map +1 -0
- package/dist/src/__tests__/search.test.d.ts +6 -0
- package/dist/src/__tests__/search.test.d.ts.map +1 -0
- package/dist/src/__tests__/search.test.js +86 -0
- package/dist/src/__tests__/search.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +19 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +87 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/context/index.d.ts +19 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +25 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/project-detector.d.ts +145 -0
- package/dist/src/context/project-detector.d.ts.map +1 -0
- package/dist/src/context/project-detector.js +321 -0
- package/dist/src/context/project-detector.js.map +1 -0
- package/dist/src/context.d.ts +100 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +157 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/core-shim.d.ts +7 -0
- package/dist/src/core-shim.d.ts.map +1 -0
- package/dist/src/core-shim.js +9 -0
- package/dist/src/core-shim.js.map +1 -0
- package/dist/src/health/healthCheck.d.ts +88 -0
- package/dist/src/health/healthCheck.d.ts.map +1 -0
- package/dist/src/health/healthCheck.js +117 -0
- package/dist/src/health/healthCheck.js.map +1 -0
- package/dist/src/health/index.d.ts +21 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +21 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +139 -0
- package/dist/src/health/readinessCheck.d.ts.map +1 -0
- package/dist/src/health/readinessCheck.js +266 -0
- package/dist/src/health/readinessCheck.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +178 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +43 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +179 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.js +389 -0
- package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
- package/dist/src/middleware/csp.d.ts +87 -0
- package/dist/src/middleware/csp.d.ts.map +1 -0
- package/dist/src/middleware/csp.js +273 -0
- package/dist/src/middleware/csp.js.map +1 -0
- package/dist/src/middleware/degradation.d.ts +99 -0
- package/dist/src/middleware/degradation.d.ts.map +1 -0
- package/dist/src/middleware/degradation.js +315 -0
- package/dist/src/middleware/degradation.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +119 -0
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.js +294 -0
- package/dist/src/middleware/errorFormatter.js.map +1 -0
- package/dist/src/middleware/index.d.ts +10 -0
- package/dist/src/middleware/index.d.ts.map +1 -0
- package/dist/src/middleware/index.js +14 -0
- package/dist/src/middleware/index.js.map +1 -0
- package/dist/src/middleware/license.d.ts +161 -0
- package/dist/src/middleware/license.d.ts.map +1 -0
- package/dist/src/middleware/license.js +281 -0
- package/dist/src/middleware/license.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.js +90 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
- package/dist/src/onboarding/first-run.d.ts +64 -0
- package/dist/src/onboarding/first-run.d.ts.map +1 -0
- package/dist/src/onboarding/first-run.js +77 -0
- package/dist/src/onboarding/first-run.js.map +1 -0
- package/dist/src/onboarding/index.d.ts +7 -0
- package/dist/src/onboarding/index.d.ts.map +1 -0
- package/dist/src/onboarding/index.js +7 -0
- package/dist/src/onboarding/index.js.map +1 -0
- package/dist/src/suggestions/index.d.ts +21 -0
- package/dist/src/suggestions/index.d.ts.map +1 -0
- package/dist/src/suggestions/index.js +20 -0
- package/dist/src/suggestions/index.js.map +1 -0
- package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
- package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
- package/dist/src/suggestions/suggestion-engine.js +352 -0
- package/dist/src/suggestions/suggestion-engine.js.map +1 -0
- package/dist/src/suggestions/types.d.ts +88 -0
- package/dist/src/suggestions/types.d.ts.map +1 -0
- package/dist/src/suggestions/types.js +21 -0
- package/dist/src/suggestions/types.js.map +1 -0
- package/dist/src/tools/analyze.d.ts +151 -0
- package/dist/src/tools/analyze.d.ts.map +1 -0
- package/dist/src/tools/analyze.js +205 -0
- package/dist/src/tools/analyze.js.map +1 -0
- package/dist/src/tools/compare.d.ts +149 -0
- package/dist/src/tools/compare.d.ts.map +1 -0
- package/dist/src/tools/compare.js +464 -0
- package/dist/src/tools/compare.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts +116 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -0
- package/dist/src/tools/get-skill.js +224 -0
- package/dist/src/tools/get-skill.js.map +1 -0
- package/dist/src/tools/index.d.ts +20 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +20 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/install.d.ts +122 -0
- package/dist/src/tools/install.d.ts.map +1 -0
- package/dist/src/tools/install.js +314 -0
- package/dist/src/tools/install.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +171 -0
- package/dist/src/tools/recommend.d.ts.map +1 -0
- package/dist/src/tools/recommend.js +325 -0
- package/dist/src/tools/recommend.js.map +1 -0
- package/dist/src/tools/search.d.ts +121 -0
- package/dist/src/tools/search.d.ts.map +1 -0
- package/dist/src/tools/search.js +249 -0
- package/dist/src/tools/search.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +181 -0
- package/dist/src/tools/suggest.d.ts.map +1 -0
- package/dist/src/tools/suggest.js +342 -0
- package/dist/src/tools/suggest.js.map +1 -0
- package/dist/src/tools/uninstall.d.ts +123 -0
- package/dist/src/tools/uninstall.d.ts.map +1 -0
- package/dist/src/tools/uninstall.js +250 -0
- package/dist/src/tools/uninstall.js.map +1 -0
- package/dist/src/tools/validate.d.ts +122 -0
- package/dist/src/tools/validate.d.ts.map +1 -0
- package/dist/src/tools/validate.js +497 -0
- package/dist/src/tools/validate.js.map +1 -0
- package/dist/src/utils/installed-skills.d.ts +101 -0
- package/dist/src/utils/installed-skills.d.ts.map +1 -0
- package/dist/src/utils/installed-skills.js +220 -0
- package/dist/src/utils/installed-skills.js.map +1 -0
- package/dist/src/utils/validation.d.ts +76 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +153 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +8 -0
- package/dist/src/webhooks/index.d.ts.map +1 -0
- package/dist/src/webhooks/index.js +9 -0
- package/dist/src/webhooks/index.js.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.js +339 -0
- package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
- package/dist/tests/compare.test.d.ts +6 -0
- package/dist/tests/compare.test.d.ts.map +1 -0
- package/dist/tests/compare.test.js +225 -0
- package/dist/tests/compare.test.js.map +1 -0
- package/dist/tests/context/project-detector.test.d.ts +6 -0
- package/dist/tests/context/project-detector.test.d.ts.map +1 -0
- package/dist/tests/context/project-detector.test.js +719 -0
- package/dist/tests/context/project-detector.test.js.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.js +286 -0
- package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
- package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.js +347 -0
- package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.js +347 -0
- package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.js +211 -0
- package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
- package/dist/tests/e2e/utils/index.d.ts +7 -0
- package/dist/tests/e2e/utils/index.d.ts.map +1 -0
- package/dist/tests/e2e/utils/index.js +7 -0
- package/dist/tests/e2e/utils/index.js.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.js +232 -0
- package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
- package/dist/tests/health.test.d.ts +9 -0
- package/dist/tests/health.test.d.ts.map +1 -0
- package/dist/tests/health.test.js +308 -0
- package/dist/tests/health.test.js.map +1 -0
- package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
- package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/analyze.integration.test.js +244 -0
- package/dist/tests/integration/analyze.integration.test.js.map +1 -0
- package/dist/tests/integration/compare.integration.test.d.ts +2 -0
- package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/compare.integration.test.js +120 -0
- package/dist/tests/integration/compare.integration.test.js.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.js +644 -0
- package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.js +203 -0
- package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
- package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
- package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/github-api.integration.test.js +190 -0
- package/dist/tests/integration/github-api.integration.test.js.map +1 -0
- package/dist/tests/integration/install.integration.test.d.ts +6 -0
- package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/install.integration.test.js +282 -0
- package/dist/tests/integration/install.integration.test.js.map +1 -0
- package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
- package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/recommend.integration.test.js +215 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -0
- package/dist/tests/integration/search.integration.test.d.ts +6 -0
- package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/search.integration.test.js +229 -0
- package/dist/tests/integration/search.integration.test.js.map +1 -0
- package/dist/tests/integration/setup.d.ts +71 -0
- package/dist/tests/integration/setup.d.ts.map +1 -0
- package/dist/tests/integration/setup.js +124 -0
- package/dist/tests/integration/setup.js.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.js +296 -0
- package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
- package/dist/tests/integration/validate.integration.test.d.ts +2 -0
- package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/validate.integration.test.js +181 -0
- package/dist/tests/integration/validate.integration.test.js.map +1 -0
- package/dist/tests/onboarding/first-run.test.d.ts +7 -0
- package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
- package/dist/tests/onboarding/first-run.test.js +258 -0
- package/dist/tests/onboarding/first-run.test.js.map +1 -0
- package/dist/tests/performance/search-performance.test.d.ts +10 -0
- package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
- package/dist/tests/performance/search-performance.test.js +218 -0
- package/dist/tests/performance/search-performance.test.js.map +1 -0
- package/dist/tests/recommend.test.d.ts +6 -0
- package/dist/tests/recommend.test.d.ts.map +1 -0
- package/dist/tests/recommend.test.js +208 -0
- package/dist/tests/recommend.test.js.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
- package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
- package/dist/tests/test-utils.d.ts +74 -0
- package/dist/tests/test-utils.d.ts.map +1 -0
- package/dist/tests/test-utils.js +98 -0
- package/dist/tests/test-utils.js.map +1 -0
- package/dist/tests/tools.test.d.ts +5 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +138 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/dist/tests/unit/installed-skills.test.d.ts +6 -0
- package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
- package/dist/tests/unit/installed-skills.test.js +285 -0
- package/dist/tests/unit/installed-skills.test.js.map +1 -0
- package/dist/tests/unit/logger.test.d.ts +6 -0
- package/dist/tests/unit/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/logger.test.js +281 -0
- package/dist/tests/unit/logger.test.js.map +1 -0
- package/dist/tests/validate.test.d.ts +5 -0
- package/dist/tests/validate.test.d.ts.map +1 -0
- package/dist/tests/validate.test.js +303 -0
- package/dist/tests/validate.test.js.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
- package/dist/vitest.config.d.ts +6 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP Server Tool Context - Database initialization and shared services
|
|
3
|
+
* @module @skillsmith/mcp-server/context
|
|
4
|
+
* @see SMI-792: Add database initialization to MCP server
|
|
5
|
+
* @see SMI-898: Path traversal protection for DB_PATH
|
|
6
|
+
*
|
|
7
|
+
* Provides shared context for MCP tool handlers including:
|
|
8
|
+
* - SQLite database connection with FTS5 search
|
|
9
|
+
* - SearchService for skill discovery
|
|
10
|
+
* - SkillRepository for CRUD operations
|
|
11
|
+
* - Secure path validation for database paths
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Initialize context at server startup
|
|
15
|
+
* const context = createToolContext();
|
|
16
|
+
*
|
|
17
|
+
* // Pass to tool handlers
|
|
18
|
+
* const result = await executeSearch(input, context);
|
|
19
|
+
*/
|
|
20
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
21
|
+
import { SearchService, SkillRepository } from '@skillsmith/core';
|
|
22
|
+
/**
|
|
23
|
+
* Shared context for MCP tool handlers
|
|
24
|
+
*/
|
|
25
|
+
export interface ToolContext {
|
|
26
|
+
/** SQLite database connection */
|
|
27
|
+
db: DatabaseType;
|
|
28
|
+
/** Search service with FTS5/BM25 */
|
|
29
|
+
searchService: SearchService;
|
|
30
|
+
/** Skill repository for CRUD operations */
|
|
31
|
+
skillRepository: SkillRepository;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Options for creating tool context
|
|
35
|
+
*/
|
|
36
|
+
export interface ToolContextOptions {
|
|
37
|
+
/** Custom database path (defaults to ~/.skillsmith/skills.db) */
|
|
38
|
+
dbPath?: string;
|
|
39
|
+
/** Search cache TTL in seconds (default: 300) */
|
|
40
|
+
searchCacheTtl?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the default database path
|
|
44
|
+
* Respects SKILLSMITH_DB_PATH environment variable
|
|
45
|
+
*
|
|
46
|
+
* @see SMI-898: Path traversal protection
|
|
47
|
+
* - Validates SKILLSMITH_DB_PATH against path traversal attacks
|
|
48
|
+
* - Rejects paths with ".." traversal sequences
|
|
49
|
+
* - Ensures path is within allowed directories
|
|
50
|
+
*
|
|
51
|
+
* @throws Error if SKILLSMITH_DB_PATH contains path traversal attempt
|
|
52
|
+
*/
|
|
53
|
+
export declare function getDefaultDbPath(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Create the shared tool context with database and services
|
|
56
|
+
*
|
|
57
|
+
* @param options - Configuration options
|
|
58
|
+
* @returns Initialized tool context
|
|
59
|
+
*
|
|
60
|
+
* @see SMI-898: Path traversal protection
|
|
61
|
+
* - Custom dbPath is validated for path traversal attacks
|
|
62
|
+
* - Rejects paths with ".." or outside allowed directories
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* // With default path (~/.skillsmith/skills.db)
|
|
66
|
+
* const context = createToolContext();
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* // With custom path (must be in allowed directory)
|
|
70
|
+
* const context = createToolContext({ dbPath: '~/.skillsmith/custom.db' });
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // For testing with in-memory database
|
|
74
|
+
* const context = createToolContext({ dbPath: ':memory:' });
|
|
75
|
+
*
|
|
76
|
+
* @throws Error if dbPath contains path traversal attempt
|
|
77
|
+
*/
|
|
78
|
+
export declare function createToolContext(options?: ToolContextOptions): ToolContext;
|
|
79
|
+
/**
|
|
80
|
+
* Close the tool context and release resources
|
|
81
|
+
*
|
|
82
|
+
* @param context - Tool context to close
|
|
83
|
+
*/
|
|
84
|
+
export declare function closeToolContext(context: ToolContext): void;
|
|
85
|
+
/**
|
|
86
|
+
* Get or create the global tool context
|
|
87
|
+
* Uses singleton pattern for MCP server lifecycle
|
|
88
|
+
*
|
|
89
|
+
* Note: Options are only applied on first call. Subsequent calls
|
|
90
|
+
* return the cached context and ignore any options.
|
|
91
|
+
*
|
|
92
|
+
* @param options - Configuration options (only used on first call)
|
|
93
|
+
* @returns The global tool context
|
|
94
|
+
*/
|
|
95
|
+
export declare function getToolContext(options?: ToolContextOptions): ToolContext;
|
|
96
|
+
/**
|
|
97
|
+
* Reset the global context (for testing)
|
|
98
|
+
*/
|
|
99
|
+
export declare function resetToolContext(): void;
|
|
100
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAkB,aAAa,EAAE,eAAe,EAAkB,MAAM,kBAAkB,CAAA;AAEjG;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,EAAE,EAAE,YAAY,CAAA;IAChB,oCAAoC;IACpC,aAAa,EAAE,aAAa,CAAA;IAC5B,2CAA2C;IAC3C,eAAe,EAAE,eAAe,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAqBzC;AAYD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CA0C/E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAE3D;AAKD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAUxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP Server Tool Context - Database initialization and shared services
|
|
3
|
+
* @module @skillsmith/mcp-server/context
|
|
4
|
+
* @see SMI-792: Add database initialization to MCP server
|
|
5
|
+
* @see SMI-898: Path traversal protection for DB_PATH
|
|
6
|
+
*
|
|
7
|
+
* Provides shared context for MCP tool handlers including:
|
|
8
|
+
* - SQLite database connection with FTS5 search
|
|
9
|
+
* - SearchService for skill discovery
|
|
10
|
+
* - SkillRepository for CRUD operations
|
|
11
|
+
* - Secure path validation for database paths
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Initialize context at server startup
|
|
15
|
+
* const context = createToolContext();
|
|
16
|
+
*
|
|
17
|
+
* // Pass to tool handlers
|
|
18
|
+
* const result = await executeSearch(input, context);
|
|
19
|
+
*/
|
|
20
|
+
import { homedir } from 'os';
|
|
21
|
+
import { join, dirname } from 'path';
|
|
22
|
+
import { mkdirSync, existsSync } from 'fs';
|
|
23
|
+
import { createDatabase, SearchService, SkillRepository, validateDbPath } from '@skillsmith/core';
|
|
24
|
+
/**
|
|
25
|
+
* Get the default database path
|
|
26
|
+
* Respects SKILLSMITH_DB_PATH environment variable
|
|
27
|
+
*
|
|
28
|
+
* @see SMI-898: Path traversal protection
|
|
29
|
+
* - Validates SKILLSMITH_DB_PATH against path traversal attacks
|
|
30
|
+
* - Rejects paths with ".." traversal sequences
|
|
31
|
+
* - Ensures path is within allowed directories
|
|
32
|
+
*
|
|
33
|
+
* @throws Error if SKILLSMITH_DB_PATH contains path traversal attempt
|
|
34
|
+
*/
|
|
35
|
+
export function getDefaultDbPath() {
|
|
36
|
+
const envPath = process.env.SKILLSMITH_DB_PATH;
|
|
37
|
+
if (envPath) {
|
|
38
|
+
// SMI-898: Validate environment variable path for path traversal
|
|
39
|
+
const validation = validateDbPath(envPath, {
|
|
40
|
+
allowInMemory: true,
|
|
41
|
+
allowTempDir: true,
|
|
42
|
+
});
|
|
43
|
+
if (!validation.valid) {
|
|
44
|
+
throw new Error(`Invalid SKILLSMITH_DB_PATH: ${validation.error}. ` +
|
|
45
|
+
'Path must be within ~/.skillsmith, ~/.claude, or temp directories.');
|
|
46
|
+
}
|
|
47
|
+
return validation.resolvedPath;
|
|
48
|
+
}
|
|
49
|
+
return join(homedir(), '.skillsmith', 'skills.db');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Ensure the database directory exists
|
|
53
|
+
*/
|
|
54
|
+
function ensureDbDirectory(dbPath) {
|
|
55
|
+
const dir = dirname(dbPath);
|
|
56
|
+
if (!existsSync(dir)) {
|
|
57
|
+
mkdirSync(dir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create the shared tool context with database and services
|
|
62
|
+
*
|
|
63
|
+
* @param options - Configuration options
|
|
64
|
+
* @returns Initialized tool context
|
|
65
|
+
*
|
|
66
|
+
* @see SMI-898: Path traversal protection
|
|
67
|
+
* - Custom dbPath is validated for path traversal attacks
|
|
68
|
+
* - Rejects paths with ".." or outside allowed directories
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* // With default path (~/.skillsmith/skills.db)
|
|
72
|
+
* const context = createToolContext();
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* // With custom path (must be in allowed directory)
|
|
76
|
+
* const context = createToolContext({ dbPath: '~/.skillsmith/custom.db' });
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // For testing with in-memory database
|
|
80
|
+
* const context = createToolContext({ dbPath: ':memory:' });
|
|
81
|
+
*
|
|
82
|
+
* @throws Error if dbPath contains path traversal attempt
|
|
83
|
+
*/
|
|
84
|
+
export function createToolContext(options = {}) {
|
|
85
|
+
let dbPath;
|
|
86
|
+
if (options.dbPath) {
|
|
87
|
+
// SMI-898: Validate custom path for path traversal
|
|
88
|
+
const validation = validateDbPath(options.dbPath, {
|
|
89
|
+
allowInMemory: true,
|
|
90
|
+
allowTempDir: true,
|
|
91
|
+
});
|
|
92
|
+
if (!validation.valid) {
|
|
93
|
+
throw new Error(`Invalid database path: ${validation.error}. ` +
|
|
94
|
+
'Path must be within ~/.skillsmith, ~/.claude, or temp directories.');
|
|
95
|
+
}
|
|
96
|
+
dbPath = validation.resolvedPath;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
dbPath = getDefaultDbPath();
|
|
100
|
+
}
|
|
101
|
+
// Ensure directory exists (skip for in-memory)
|
|
102
|
+
if (dbPath !== ':memory:') {
|
|
103
|
+
ensureDbDirectory(dbPath);
|
|
104
|
+
}
|
|
105
|
+
// Create database with schema
|
|
106
|
+
const db = createDatabase(dbPath);
|
|
107
|
+
// Initialize services
|
|
108
|
+
const searchService = new SearchService(db, {
|
|
109
|
+
cacheTtl: options.searchCacheTtl ?? 300,
|
|
110
|
+
});
|
|
111
|
+
const skillRepository = new SkillRepository(db);
|
|
112
|
+
return {
|
|
113
|
+
db,
|
|
114
|
+
searchService,
|
|
115
|
+
skillRepository,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Close the tool context and release resources
|
|
120
|
+
*
|
|
121
|
+
* @param context - Tool context to close
|
|
122
|
+
*/
|
|
123
|
+
export function closeToolContext(context) {
|
|
124
|
+
context.db.close();
|
|
125
|
+
}
|
|
126
|
+
// Singleton context for the MCP server
|
|
127
|
+
let globalContext = null;
|
|
128
|
+
/**
|
|
129
|
+
* Get or create the global tool context
|
|
130
|
+
* Uses singleton pattern for MCP server lifecycle
|
|
131
|
+
*
|
|
132
|
+
* Note: Options are only applied on first call. Subsequent calls
|
|
133
|
+
* return the cached context and ignore any options.
|
|
134
|
+
*
|
|
135
|
+
* @param options - Configuration options (only used on first call)
|
|
136
|
+
* @returns The global tool context
|
|
137
|
+
*/
|
|
138
|
+
export function getToolContext(options) {
|
|
139
|
+
if (!globalContext) {
|
|
140
|
+
globalContext = createToolContext(options);
|
|
141
|
+
}
|
|
142
|
+
else if (options) {
|
|
143
|
+
// Warn if options are provided after context is already created
|
|
144
|
+
console.warn('[skillsmith] getToolContext called with options after context was already initialized. Options ignored.');
|
|
145
|
+
}
|
|
146
|
+
return globalContext;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Reset the global context (for testing)
|
|
150
|
+
*/
|
|
151
|
+
export function resetToolContext() {
|
|
152
|
+
if (globalContext) {
|
|
153
|
+
closeToolContext(globalContext);
|
|
154
|
+
globalContext = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core package shim for testing
|
|
3
|
+
* Re-exports only the modules needed by MCP server, avoiding heavy dependencies like ONNX
|
|
4
|
+
*/
|
|
5
|
+
export { ErrorCodes, ErrorSuggestions, SkillsmithError, createErrorResponse, withErrorBoundary, type ErrorCategory, type ErrorCode, type ErrorResponse, } from '../../core/src/errors.js';
|
|
6
|
+
export { TrustTierDescriptions, type TrustTier as MCPTrustTier, type SkillCategory, type ScoreBreakdown, type Skill as MCPSkill, type SkillSearchResult, type SearchFilters, type SearchResponse as MCPSearchResponse, type GetSkillResponse, } from '../../core/src/types.js';
|
|
7
|
+
//# sourceMappingURL=core-shim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-shim.d.ts","sourceRoot":"","sources":["../../src/core-shim.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,qBAAqB,EACrB,KAAK,SAAS,IAAI,YAAY,EAC9B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,KAAK,IAAI,QAAQ,EACtB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,IAAI,iBAAiB,EACxC,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core package shim for testing
|
|
3
|
+
* Re-exports only the modules needed by MCP server, avoiding heavy dependencies like ONNX
|
|
4
|
+
*/
|
|
5
|
+
// Error handling
|
|
6
|
+
export { ErrorCodes, ErrorSuggestions, SkillsmithError, createErrorResponse, withErrorBoundary, } from '../../core/src/errors.js';
|
|
7
|
+
// MCP types
|
|
8
|
+
export { TrustTierDescriptions, } from '../../core/src/types.js';
|
|
9
|
+
//# sourceMappingURL=core-shim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-shim.js","sourceRoot":"","sources":["../../src/core-shim.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,GAIlB,MAAM,0BAA0B,CAAA;AAEjC,YAAY;AACZ,OAAO,EACL,qBAAqB,GAStB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-740: Health Check Endpoint Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple health check endpoint that returns:
|
|
5
|
+
* - status: "ok" | "degraded" | "unhealthy"
|
|
6
|
+
* - uptime: number (seconds)
|
|
7
|
+
* - version: string
|
|
8
|
+
*
|
|
9
|
+
* This endpoint should always return quickly and not perform
|
|
10
|
+
* expensive operations like database queries.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Health check response
|
|
14
|
+
*/
|
|
15
|
+
export interface HealthResponse {
|
|
16
|
+
/** Current health status */
|
|
17
|
+
status: 'ok' | 'degraded' | 'unhealthy';
|
|
18
|
+
/** Process uptime in seconds */
|
|
19
|
+
uptime: number;
|
|
20
|
+
/** Application version */
|
|
21
|
+
version: string;
|
|
22
|
+
/** Timestamp of the health check */
|
|
23
|
+
timestamp: string;
|
|
24
|
+
/** Optional additional info */
|
|
25
|
+
info?: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Health check configuration
|
|
29
|
+
*/
|
|
30
|
+
export interface HealthCheckConfig {
|
|
31
|
+
/** Application version (default: from package.json or '0.0.0') */
|
|
32
|
+
version?: string;
|
|
33
|
+
/** Custom health check function */
|
|
34
|
+
customCheck?: () => Promise<{
|
|
35
|
+
healthy: boolean;
|
|
36
|
+
info?: Record<string, unknown>;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Health Check Handler
|
|
41
|
+
*
|
|
42
|
+
* Provides lightweight health check functionality that can be used
|
|
43
|
+
* with any HTTP framework or MCP tool.
|
|
44
|
+
*/
|
|
45
|
+
export declare class HealthCheck {
|
|
46
|
+
private readonly version;
|
|
47
|
+
private readonly customCheck?;
|
|
48
|
+
constructor(config?: HealthCheckConfig);
|
|
49
|
+
/**
|
|
50
|
+
* Perform health check
|
|
51
|
+
*
|
|
52
|
+
* This is a lightweight check that should return quickly.
|
|
53
|
+
* For deep health checks including dependencies, use ReadinessCheck.
|
|
54
|
+
*/
|
|
55
|
+
check(): Promise<HealthResponse>;
|
|
56
|
+
/**
|
|
57
|
+
* Get uptime in seconds
|
|
58
|
+
*/
|
|
59
|
+
getUptime(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Get version
|
|
62
|
+
*/
|
|
63
|
+
getVersion(): string;
|
|
64
|
+
/**
|
|
65
|
+
* Check if the service is healthy (for simple boolean checks)
|
|
66
|
+
*/
|
|
67
|
+
isHealthy(): Promise<boolean>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the default health check instance
|
|
71
|
+
*/
|
|
72
|
+
export declare function getHealthCheck(): HealthCheck;
|
|
73
|
+
/**
|
|
74
|
+
* Create a new health check instance with custom configuration
|
|
75
|
+
*/
|
|
76
|
+
export declare function createHealthCheck(config: HealthCheckConfig): HealthCheck;
|
|
77
|
+
/**
|
|
78
|
+
* Perform a quick health check using the default instance
|
|
79
|
+
*/
|
|
80
|
+
export declare function checkHealth(): Promise<HealthResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Format health response for HTTP (includes status code)
|
|
83
|
+
*/
|
|
84
|
+
export declare function formatHealthResponse(response: HealthResponse): {
|
|
85
|
+
statusCode: number;
|
|
86
|
+
body: HealthResponse;
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=healthCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthCheck.d.ts","sourceRoot":"","sources":["../../../src/health/healthCheck.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,CAAA;IACvC,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;CAClF;AAOD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAqE;gBAEtF,MAAM,GAAE,iBAAsB;IAK1C;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC;IAgCtC;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAIpC;AAKD;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAExE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAE3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG;IAC9D,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,cAAc,CAAA;CACrB,CAOA"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-740: Health Check Endpoint Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides a simple health check endpoint that returns:
|
|
5
|
+
* - status: "ok" | "degraded" | "unhealthy"
|
|
6
|
+
* - uptime: number (seconds)
|
|
7
|
+
* - version: string
|
|
8
|
+
*
|
|
9
|
+
* This endpoint should always return quickly and not perform
|
|
10
|
+
* expensive operations like database queries.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Process start time for uptime calculation
|
|
14
|
+
*/
|
|
15
|
+
const processStartTime = Date.now();
|
|
16
|
+
/**
|
|
17
|
+
* Health Check Handler
|
|
18
|
+
*
|
|
19
|
+
* Provides lightweight health check functionality that can be used
|
|
20
|
+
* with any HTTP framework or MCP tool.
|
|
21
|
+
*/
|
|
22
|
+
export class HealthCheck {
|
|
23
|
+
version;
|
|
24
|
+
customCheck;
|
|
25
|
+
constructor(config = {}) {
|
|
26
|
+
this.version = config.version ?? process.env.npm_package_version ?? '0.1.0';
|
|
27
|
+
this.customCheck = config.customCheck;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Perform health check
|
|
31
|
+
*
|
|
32
|
+
* This is a lightweight check that should return quickly.
|
|
33
|
+
* For deep health checks including dependencies, use ReadinessCheck.
|
|
34
|
+
*/
|
|
35
|
+
async check() {
|
|
36
|
+
const uptimeMs = Date.now() - processStartTime;
|
|
37
|
+
const uptimeSeconds = Math.floor(uptimeMs / 1000);
|
|
38
|
+
const response = {
|
|
39
|
+
status: 'ok',
|
|
40
|
+
uptime: uptimeSeconds,
|
|
41
|
+
version: this.version,
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
};
|
|
44
|
+
// Run custom check if provided
|
|
45
|
+
if (this.customCheck) {
|
|
46
|
+
try {
|
|
47
|
+
const result = await this.customCheck();
|
|
48
|
+
if (!result.healthy) {
|
|
49
|
+
response.status = 'degraded';
|
|
50
|
+
}
|
|
51
|
+
if (result.info) {
|
|
52
|
+
response.info = result.info;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
response.status = 'degraded';
|
|
57
|
+
response.info = {
|
|
58
|
+
customCheckError: error instanceof Error ? error.message : 'Unknown error',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get uptime in seconds
|
|
66
|
+
*/
|
|
67
|
+
getUptime() {
|
|
68
|
+
return Math.floor((Date.now() - processStartTime) / 1000);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get version
|
|
72
|
+
*/
|
|
73
|
+
getVersion() {
|
|
74
|
+
return this.version;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if the service is healthy (for simple boolean checks)
|
|
78
|
+
*/
|
|
79
|
+
async isHealthy() {
|
|
80
|
+
const result = await this.check();
|
|
81
|
+
return result.status === 'ok';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Default health check instance
|
|
85
|
+
let defaultHealthCheck = null;
|
|
86
|
+
/**
|
|
87
|
+
* Get the default health check instance
|
|
88
|
+
*/
|
|
89
|
+
export function getHealthCheck() {
|
|
90
|
+
if (!defaultHealthCheck) {
|
|
91
|
+
defaultHealthCheck = new HealthCheck();
|
|
92
|
+
}
|
|
93
|
+
return defaultHealthCheck;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a new health check instance with custom configuration
|
|
97
|
+
*/
|
|
98
|
+
export function createHealthCheck(config) {
|
|
99
|
+
return new HealthCheck(config);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Perform a quick health check using the default instance
|
|
103
|
+
*/
|
|
104
|
+
export async function checkHealth() {
|
|
105
|
+
return getHealthCheck().check();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Format health response for HTTP (includes status code)
|
|
109
|
+
*/
|
|
110
|
+
export function formatHealthResponse(response) {
|
|
111
|
+
const statusCode = response.status === 'ok' ? 200 : response.status === 'degraded' ? 200 : 503;
|
|
112
|
+
return {
|
|
113
|
+
statusCode,
|
|
114
|
+
body: response,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=healthCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healthCheck.js","sourceRoot":"","sources":["../../../src/health/healthCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-740: Health Check Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Provides health and readiness check endpoints for the MCP server:
|
|
5
|
+
* - /health: Quick liveness check
|
|
6
|
+
* - /ready: Deep readiness check with dependency verification
|
|
7
|
+
*/
|
|
8
|
+
export { HealthCheck, getHealthCheck, createHealthCheck, checkHealth, formatHealthResponse, type HealthResponse, type HealthCheckConfig, } from './healthCheck.js';
|
|
9
|
+
export { ReadinessCheck, getReadinessCheck, createReadinessCheck, checkReadiness, configureReadinessCheck, formatReadinessResponse, type ReadinessResponse, type ReadinessCheckConfig, type DependencyCheck, } from './readinessCheck.js';
|
|
10
|
+
/**
|
|
11
|
+
* Combined health and readiness check response
|
|
12
|
+
*/
|
|
13
|
+
export interface HealthAndReadiness {
|
|
14
|
+
health: import('./healthCheck.js').HealthResponse;
|
|
15
|
+
readiness: import('./readinessCheck.js').ReadinessResponse;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Perform both health and readiness checks
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkAll(): Promise<HealthAndReadiness>;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/health/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,eAAe,GACrB,MAAM,qBAAqB,CAAA;AAE5B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,kBAAkB,EAAE,cAAc,CAAA;IACjD,SAAS,EAAE,OAAO,qBAAqB,EAAE,iBAAiB,CAAA;CAC3D;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAO5D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-740: Health Check Module Exports
|
|
3
|
+
*
|
|
4
|
+
* Provides health and readiness check endpoints for the MCP server:
|
|
5
|
+
* - /health: Quick liveness check
|
|
6
|
+
* - /ready: Deep readiness check with dependency verification
|
|
7
|
+
*/
|
|
8
|
+
// Health check exports
|
|
9
|
+
export { HealthCheck, getHealthCheck, createHealthCheck, checkHealth, formatHealthResponse, } from './healthCheck.js';
|
|
10
|
+
// Readiness check exports
|
|
11
|
+
export { ReadinessCheck, getReadinessCheck, createReadinessCheck, checkReadiness, configureReadinessCheck, formatReadinessResponse, } from './readinessCheck.js';
|
|
12
|
+
/**
|
|
13
|
+
* Perform both health and readiness checks
|
|
14
|
+
*/
|
|
15
|
+
export async function checkAll() {
|
|
16
|
+
const { checkHealth } = await import('./healthCheck.js');
|
|
17
|
+
const { checkReadiness } = await import('./readinessCheck.js');
|
|
18
|
+
const [health, readiness] = await Promise.all([checkHealth(), checkReadiness()]);
|
|
19
|
+
return { health, readiness };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/health/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uBAAuB;AACvB,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,oBAAoB,GAGrB,MAAM,kBAAkB,CAAA;AAEzB,0BAA0B;AAC1B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,uBAAuB,GAIxB,MAAM,qBAAqB,CAAA;AAU5B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;IACxD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;IAE9D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;IAEhF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC"}
|