@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,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1060: Graceful Degradation Middleware
|
|
3
|
+
*
|
|
4
|
+
* Middleware that wraps tool handlers with graceful degradation,
|
|
5
|
+
* returning helpful messages instead of hard errors when features
|
|
6
|
+
* are unavailable.
|
|
7
|
+
*/
|
|
8
|
+
import { createLicenseMiddleware, getRequiredFeature, } from './license.js';
|
|
9
|
+
import { TOOL_FEATURES, FEATURE_DISPLAY_NAMES, FEATURE_TIERS, } from './toolFeatureMapping.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Constants
|
|
12
|
+
// ============================================================================
|
|
13
|
+
const BASE_URL = 'https://skillsmith.io';
|
|
14
|
+
/**
|
|
15
|
+
* Pricing information for each tier
|
|
16
|
+
*/
|
|
17
|
+
const TIER_PRICING = {
|
|
18
|
+
community: '$0/month',
|
|
19
|
+
team: '$25/user/month',
|
|
20
|
+
enterprise: '$55/user/month',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Feature descriptions for upgrade prompts
|
|
24
|
+
*/
|
|
25
|
+
const FEATURE_DESCRIPTIONS = {
|
|
26
|
+
// Team tier features
|
|
27
|
+
private_skills: 'Create and manage private skills for your organization',
|
|
28
|
+
team_workspaces: 'Collaborate with your team on shared skill collections',
|
|
29
|
+
usage_analytics: 'Track skill usage and adoption across your organization',
|
|
30
|
+
priority_support: 'Get faster response times from our support team',
|
|
31
|
+
// Enterprise tier features
|
|
32
|
+
sso_saml: 'Integrate with your identity provider for secure single sign-on',
|
|
33
|
+
rbac: 'Fine-grained access control with custom roles and permissions',
|
|
34
|
+
audit_logging: 'Comprehensive audit trail for compliance and security',
|
|
35
|
+
siem_export: 'Export audit logs to your SIEM platform for centralized monitoring',
|
|
36
|
+
compliance_reports: 'Generate compliance reports for SOC2, HIPAA, and other standards',
|
|
37
|
+
private_registry: 'Host a private registry of skills for your organization',
|
|
38
|
+
// Additional features
|
|
39
|
+
custom_integrations: 'Build custom integrations with your tools',
|
|
40
|
+
advanced_analytics: 'In-depth usage analytics and reporting',
|
|
41
|
+
};
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Default Logger
|
|
44
|
+
// ============================================================================
|
|
45
|
+
/**
|
|
46
|
+
* Default no-op logger
|
|
47
|
+
*/
|
|
48
|
+
const noopLogger = {
|
|
49
|
+
log: () => { },
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Console logger for degradation events
|
|
53
|
+
*/
|
|
54
|
+
export const consoleDegradationLogger = {
|
|
55
|
+
log: (event) => {
|
|
56
|
+
const prefix = event.action === 'degraded' ? '[UPGRADE REQUIRED]' : `[${event.action.toUpperCase()}]`;
|
|
57
|
+
console.log(`${prefix} ${event.toolName}: ${event.message || 'No message'}`);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Upgrade Message Generators
|
|
62
|
+
// ============================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Create an upgrade prompt for a denied feature
|
|
65
|
+
*/
|
|
66
|
+
function createUpgradePrompt(feature, currentTier) {
|
|
67
|
+
const displayName = FEATURE_DISPLAY_NAMES[feature];
|
|
68
|
+
const requiredTier = FEATURE_TIERS[feature];
|
|
69
|
+
const pricing = TIER_PRICING[requiredTier];
|
|
70
|
+
return `${displayName} requires ${requiredTier.charAt(0).toUpperCase() + requiredTier.slice(1)} tier (${pricing}). Upgrade at ${BASE_URL}/upgrade?tier=${requiredTier}&feature=${feature}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a detailed upgrade message with feature description
|
|
74
|
+
*/
|
|
75
|
+
function createDetailedUpgradeMessage(feature, currentTier) {
|
|
76
|
+
const displayName = FEATURE_DISPLAY_NAMES[feature];
|
|
77
|
+
const description = FEATURE_DESCRIPTIONS[feature];
|
|
78
|
+
const requiredTier = FEATURE_TIERS[feature];
|
|
79
|
+
const pricing = TIER_PRICING[requiredTier];
|
|
80
|
+
const currentPricing = TIER_PRICING[currentTier];
|
|
81
|
+
return [
|
|
82
|
+
`Feature Unavailable: ${displayName}`,
|
|
83
|
+
'',
|
|
84
|
+
description,
|
|
85
|
+
'',
|
|
86
|
+
`Current tier: ${currentTier.charAt(0).toUpperCase() + currentTier.slice(1)} (${currentPricing})`,
|
|
87
|
+
`Required tier: ${requiredTier.charAt(0).toUpperCase() + requiredTier.slice(1)} (${pricing})`,
|
|
88
|
+
'',
|
|
89
|
+
`Upgrade to unlock: ${BASE_URL}/upgrade?tier=${requiredTier}&feature=${feature}`,
|
|
90
|
+
`Compare plans: ${BASE_URL}/pricing?highlight=${feature}¤t=${currentTier}`,
|
|
91
|
+
].join('\n');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get tier comparison message
|
|
95
|
+
*/
|
|
96
|
+
export function getTierComparisonMessage() {
|
|
97
|
+
return [
|
|
98
|
+
'Skillsmith Pricing Tiers',
|
|
99
|
+
'========================',
|
|
100
|
+
'',
|
|
101
|
+
'Community ($0/month)',
|
|
102
|
+
'----------------------------------------',
|
|
103
|
+
' - Core features: search, install, recommend, validate, compare',
|
|
104
|
+
'',
|
|
105
|
+
'Team ($25/user/month)',
|
|
106
|
+
'----------------------------------------',
|
|
107
|
+
' - Private Skills',
|
|
108
|
+
' - Team Workspaces',
|
|
109
|
+
' - Priority Support',
|
|
110
|
+
'',
|
|
111
|
+
'Enterprise ($55/user/month)',
|
|
112
|
+
'----------------------------------------',
|
|
113
|
+
' - SSO/SAML Integration',
|
|
114
|
+
' - Role-Based Access Control',
|
|
115
|
+
' - Audit Logging',
|
|
116
|
+
' - Custom Integrations',
|
|
117
|
+
' - Advanced Analytics',
|
|
118
|
+
'',
|
|
119
|
+
`Learn more: ${BASE_URL}/pricing`,
|
|
120
|
+
].join('\n');
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Graceful Degradation Response
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Create a graceful degradation response for an unavailable feature
|
|
127
|
+
*/
|
|
128
|
+
function createGracefulDegradationResponse(toolName, feature, currentTier, validationResult) {
|
|
129
|
+
const requiredTier = FEATURE_TIERS[feature];
|
|
130
|
+
const displayName = FEATURE_DISPLAY_NAMES[feature];
|
|
131
|
+
const response = {
|
|
132
|
+
status: 'upgrade_required',
|
|
133
|
+
feature: {
|
|
134
|
+
id: feature,
|
|
135
|
+
name: displayName,
|
|
136
|
+
description: FEATURE_DESCRIPTIONS[feature],
|
|
137
|
+
},
|
|
138
|
+
tiers: {
|
|
139
|
+
current: {
|
|
140
|
+
id: currentTier,
|
|
141
|
+
pricing: TIER_PRICING[currentTier],
|
|
142
|
+
},
|
|
143
|
+
required: {
|
|
144
|
+
id: requiredTier,
|
|
145
|
+
pricing: TIER_PRICING[requiredTier],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
upgrade: {
|
|
149
|
+
message: createUpgradePrompt(feature, currentTier),
|
|
150
|
+
detailedMessage: createDetailedUpgradeMessage(feature, currentTier),
|
|
151
|
+
url: `${BASE_URL}/upgrade?tier=${requiredTier}&feature=${feature}&tool=${toolName}`,
|
|
152
|
+
pricingUrl: `${BASE_URL}/pricing?highlight=${feature}¤t=${currentTier}`,
|
|
153
|
+
},
|
|
154
|
+
alternatives: getCommunityAlternatives(toolName),
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
content: [
|
|
158
|
+
{
|
|
159
|
+
type: 'text',
|
|
160
|
+
text: JSON.stringify(response, null, 2),
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
isError: false,
|
|
164
|
+
_meta: {
|
|
165
|
+
upgradeRequired: true,
|
|
166
|
+
feature,
|
|
167
|
+
requiredTier,
|
|
168
|
+
upgradeUrl: response.upgrade.url,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get community-tier alternatives for a premium tool
|
|
174
|
+
*/
|
|
175
|
+
function getCommunityAlternatives(toolName) {
|
|
176
|
+
// Map of premium tools to their community alternatives
|
|
177
|
+
const alternatives = {
|
|
178
|
+
publish_private: ['search', 'get_skill', 'install_skill'],
|
|
179
|
+
team_workspace: ['search', 'install_skill'],
|
|
180
|
+
share_skill: ['search', 'skill_compare'],
|
|
181
|
+
configure_sso: ['search'],
|
|
182
|
+
audit_export: ['search'],
|
|
183
|
+
audit_query: ['search'],
|
|
184
|
+
rbac_manage: ['search'],
|
|
185
|
+
rbac_assign_role: ['search'],
|
|
186
|
+
rbac_create_policy: ['search'],
|
|
187
|
+
analytics_dashboard: ['search', 'skill_recommend'],
|
|
188
|
+
usage_report: ['search'],
|
|
189
|
+
webhook_configure: ['search'],
|
|
190
|
+
api_key_manage: ['search'],
|
|
191
|
+
};
|
|
192
|
+
return alternatives[toolName] || ['search', 'get_skill', 'install_skill'];
|
|
193
|
+
}
|
|
194
|
+
// ============================================================================
|
|
195
|
+
// Middleware Factory
|
|
196
|
+
// ============================================================================
|
|
197
|
+
/**
|
|
198
|
+
* Create the degradation middleware
|
|
199
|
+
*
|
|
200
|
+
* This middleware wraps tool handlers to provide graceful degradation
|
|
201
|
+
* when features are unavailable due to license restrictions.
|
|
202
|
+
*
|
|
203
|
+
* @param options - Middleware configuration options
|
|
204
|
+
* @returns Middleware wrapper function
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* ```typescript
|
|
208
|
+
* const middleware = createDegradationMiddleware({
|
|
209
|
+
* logger: consoleDegradationLogger,
|
|
210
|
+
* verbose: true,
|
|
211
|
+
* });
|
|
212
|
+
*
|
|
213
|
+
* const wrappedHandler = middleware.wrapHandler('audit_query', originalHandler);
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
export function createDegradationMiddleware(options = {}) {
|
|
217
|
+
const licenseMiddleware = options.licenseMiddleware ?? createLicenseMiddleware();
|
|
218
|
+
const logger = options.logger ?? noopLogger;
|
|
219
|
+
/**
|
|
220
|
+
* Wrap a tool handler with graceful degradation
|
|
221
|
+
*/
|
|
222
|
+
async function wrapHandler(toolName, handler, request) {
|
|
223
|
+
// Check if tool requires a license
|
|
224
|
+
const requiredFeature = getRequiredFeature(toolName);
|
|
225
|
+
// Community tools always pass through
|
|
226
|
+
if (requiredFeature === null) {
|
|
227
|
+
logger.log({
|
|
228
|
+
timestamp: new Date().toISOString(),
|
|
229
|
+
toolName,
|
|
230
|
+
feature: null,
|
|
231
|
+
tier: 'community',
|
|
232
|
+
action: 'allowed',
|
|
233
|
+
message: 'Community tool - no license required',
|
|
234
|
+
});
|
|
235
|
+
return handler(request);
|
|
236
|
+
}
|
|
237
|
+
// Check license for the required feature
|
|
238
|
+
const validationResult = await licenseMiddleware.checkFeature(requiredFeature);
|
|
239
|
+
if (validationResult.valid) {
|
|
240
|
+
const licenseInfo = await licenseMiddleware.getLicenseInfo();
|
|
241
|
+
logger.log({
|
|
242
|
+
timestamp: new Date().toISOString(),
|
|
243
|
+
toolName,
|
|
244
|
+
feature: requiredFeature,
|
|
245
|
+
tier: licenseInfo?.tier ?? 'community',
|
|
246
|
+
action: 'allowed',
|
|
247
|
+
message: 'Feature available in license',
|
|
248
|
+
});
|
|
249
|
+
return handler(request);
|
|
250
|
+
}
|
|
251
|
+
// Feature not available - return graceful degradation response
|
|
252
|
+
const licenseInfo = await licenseMiddleware.getLicenseInfo();
|
|
253
|
+
const currentTier = licenseInfo?.tier ?? 'community';
|
|
254
|
+
logger.log({
|
|
255
|
+
timestamp: new Date().toISOString(),
|
|
256
|
+
toolName,
|
|
257
|
+
feature: requiredFeature,
|
|
258
|
+
tier: currentTier,
|
|
259
|
+
action: 'degraded',
|
|
260
|
+
message: `Feature ${requiredFeature} requires upgrade`,
|
|
261
|
+
});
|
|
262
|
+
return createGracefulDegradationResponse(toolName, requiredFeature, currentTier, validationResult);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create a wrapped handler function
|
|
266
|
+
*/
|
|
267
|
+
function createWrappedHandler(toolName, handler) {
|
|
268
|
+
return async (request) => {
|
|
269
|
+
return wrapHandler(toolName, handler, request);
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if a tool would be degraded for the current license
|
|
274
|
+
*/
|
|
275
|
+
async function wouldDegrade(toolName) {
|
|
276
|
+
const requiredFeature = getRequiredFeature(toolName);
|
|
277
|
+
if (requiredFeature === null) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
const validationResult = await licenseMiddleware.checkFeature(requiredFeature);
|
|
281
|
+
return !validationResult.valid;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Get degradation status for all tools
|
|
285
|
+
*/
|
|
286
|
+
async function getDegradationStatus() {
|
|
287
|
+
const status = new Map();
|
|
288
|
+
for (const toolName of Object.keys(TOOL_FEATURES)) {
|
|
289
|
+
status.set(toolName, await wouldDegrade(toolName));
|
|
290
|
+
}
|
|
291
|
+
return status;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get upgrade prompt for a tool
|
|
295
|
+
*/
|
|
296
|
+
async function getUpgradePrompt(toolName) {
|
|
297
|
+
const requiredFeature = getRequiredFeature(toolName);
|
|
298
|
+
if (requiredFeature === null) {
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
const licenseInfo = await licenseMiddleware.getLicenseInfo();
|
|
302
|
+
const currentTier = licenseInfo?.tier ?? 'community';
|
|
303
|
+
return createUpgradePrompt(requiredFeature, currentTier);
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
wrapHandler,
|
|
307
|
+
createWrappedHandler,
|
|
308
|
+
wouldDegrade,
|
|
309
|
+
getDegradationStatus,
|
|
310
|
+
getUpgradePrompt,
|
|
311
|
+
getTierComparisonMessage,
|
|
312
|
+
licenseMiddleware,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=degradation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"degradation.js","sourceRoot":"","sources":["../../../src/middleware/degradation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1061: MCP Error Formatter for License Errors
|
|
3
|
+
*
|
|
4
|
+
* Formats license errors into MCP protocol-compliant error responses
|
|
5
|
+
* with actionable information for clients.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* MCP-formatted error response content
|
|
9
|
+
*/
|
|
10
|
+
export interface MCPErrorContent {
|
|
11
|
+
type: 'text';
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* MCP-formatted error response
|
|
16
|
+
*/
|
|
17
|
+
export interface MCPErrorResponse {
|
|
18
|
+
content: MCPErrorContent[];
|
|
19
|
+
isError: true;
|
|
20
|
+
_meta?: {
|
|
21
|
+
upgradeUrl?: string;
|
|
22
|
+
errorCode?: string;
|
|
23
|
+
recoverable?: boolean;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* License error details structure (mirrors the enterprise package)
|
|
28
|
+
*/
|
|
29
|
+
export interface LicenseErrorDetails {
|
|
30
|
+
code: string;
|
|
31
|
+
message: string;
|
|
32
|
+
feature?: string;
|
|
33
|
+
currentTier?: string;
|
|
34
|
+
requiredTier?: string;
|
|
35
|
+
upgradeUrl?: string;
|
|
36
|
+
context?: Record<string, unknown>;
|
|
37
|
+
timestamp?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Interface for license errors (duck-typed for optional enterprise package)
|
|
41
|
+
*/
|
|
42
|
+
export interface LicenseErrorLike {
|
|
43
|
+
code?: string;
|
|
44
|
+
message: string;
|
|
45
|
+
feature?: string;
|
|
46
|
+
currentTier?: string;
|
|
47
|
+
requiredTier?: string;
|
|
48
|
+
upgradeUrl?: string;
|
|
49
|
+
context?: Record<string, unknown>;
|
|
50
|
+
timestamp?: Date;
|
|
51
|
+
toJSON?: () => Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Format a license error into an MCP-compliant error response
|
|
55
|
+
*
|
|
56
|
+
* @param error - The license error to format
|
|
57
|
+
* @returns MCP-formatted error response
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* import { formatLicenseError } from './middleware/errorFormatter.js';
|
|
62
|
+
*
|
|
63
|
+
* try {
|
|
64
|
+
* await checkFeature('audit_logging');
|
|
65
|
+
* } catch (error) {
|
|
66
|
+
* if (isLicenseError(error)) {
|
|
67
|
+
* return formatLicenseError(error);
|
|
68
|
+
* }
|
|
69
|
+
* throw error;
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatLicenseError(error: LicenseErrorLike): MCPErrorResponse;
|
|
74
|
+
/**
|
|
75
|
+
* Format a generic error for MCP response
|
|
76
|
+
*
|
|
77
|
+
* Use this for non-license errors that still need MCP formatting.
|
|
78
|
+
*/
|
|
79
|
+
export declare function formatGenericError(error: Error, code?: string): MCPErrorResponse;
|
|
80
|
+
/**
|
|
81
|
+
* Get a user-friendly message for an error code
|
|
82
|
+
*/
|
|
83
|
+
export declare function getUserFriendlyMessage(code: string): string;
|
|
84
|
+
/**
|
|
85
|
+
* Configuration for upgrade URLs
|
|
86
|
+
*/
|
|
87
|
+
export interface UpgradeUrlConfig {
|
|
88
|
+
baseUrl?: string;
|
|
89
|
+
includeFeature?: boolean;
|
|
90
|
+
includeTiers?: boolean;
|
|
91
|
+
includeSource?: boolean;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Generate a customized upgrade URL with tracking parameters
|
|
95
|
+
*/
|
|
96
|
+
export declare function generateUpgradeUrl(error: LicenseErrorLike, config?: Partial<UpgradeUrlConfig>): string;
|
|
97
|
+
/**
|
|
98
|
+
* Build an upgrade required response
|
|
99
|
+
*
|
|
100
|
+
* Use this when a feature requires an upgrade but isn't a full error.
|
|
101
|
+
*/
|
|
102
|
+
export declare function buildUpgradeRequiredResponse(feature: string, currentTier: string, requiredTier: string): MCPErrorResponse;
|
|
103
|
+
/**
|
|
104
|
+
* Build a license expired response with renewal URL
|
|
105
|
+
*/
|
|
106
|
+
export declare function buildLicenseExpiredResponse(expiredAt?: Date): MCPErrorResponse;
|
|
107
|
+
/**
|
|
108
|
+
* Build a quota exceeded response
|
|
109
|
+
*/
|
|
110
|
+
export declare function buildQuotaExceededResponse(quotaType: string, current: number, max: number): MCPErrorResponse;
|
|
111
|
+
/**
|
|
112
|
+
* Check if an object looks like a license error
|
|
113
|
+
*/
|
|
114
|
+
export declare function isLicenseErrorLike(error: unknown): error is LicenseErrorLike;
|
|
115
|
+
/**
|
|
116
|
+
* Safely convert any error to MCP format
|
|
117
|
+
*/
|
|
118
|
+
export declare function safeFormatError(error: unknown): MCPErrorResponse;
|
|
119
|
+
//# sourceMappingURL=errorFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorFormatter.d.ts","sourceRoot":"","sources":["../../../src/middleware/errorFormatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,OAAO,EAAE,IAAI,CAAA;IACb,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACvC;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAsD5E;AAYD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,SAAmB,GAAG,gBAAgB,CAmB1F;AAsBD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AASD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM,GACrC,MAAM,CA0BR;AAMD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,gBAAgB,CAgClB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,gBAAgB,CA8B9E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,gBAAgB,CAgClB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAiB5E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAUhE"}
|