@skillsmith/core 0.7.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analytics/ROIDashboardService.compute.d.ts +17 -0
- package/dist/src/analytics/ROIDashboardService.compute.d.ts.map +1 -0
- package/dist/src/analytics/ROIDashboardService.compute.js +134 -0
- package/dist/src/analytics/ROIDashboardService.compute.js.map +1 -0
- package/dist/src/analytics/ROIDashboardService.d.ts +0 -8
- package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
- package/dist/src/analytics/ROIDashboardService.js +9 -138
- package/dist/src/analytics/ROIDashboardService.js.map +1 -1
- package/dist/src/api/client.types.d.ts +5 -0
- package/dist/src/api/client.types.d.ts.map +1 -1
- package/dist/src/api/index.d.ts +1 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +4 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/schemas.compatibility.test.d.ts +11 -0
- package/dist/src/api/schemas.compatibility.test.d.ts.map +1 -0
- package/dist/src/api/schemas.compatibility.test.js +38 -0
- package/dist/src/api/schemas.compatibility.test.js.map +1 -0
- package/dist/src/api/schemas.d.ts +16 -9
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +13 -4
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/api/schemas.license.test.d.ts +11 -0
- package/dist/src/api/schemas.license.test.d.ts.map +1 -0
- package/dist/src/api/schemas.license.test.js +51 -0
- package/dist/src/api/schemas.license.test.js.map +1 -0
- package/dist/src/api/types.d.ts +18 -3
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +29 -2
- package/dist/src/api/types.js.map +1 -1
- package/dist/src/audit/remote-audit.d.ts +41 -0
- package/dist/src/audit/remote-audit.d.ts.map +1 -1
- package/dist/src/audit/remote-audit.js +71 -28
- package/dist/src/audit/remote-audit.js.map +1 -1
- package/dist/src/audit/remote-audit.test.js +89 -1
- package/dist/src/audit/remote-audit.test.js.map +1 -1
- package/dist/src/compatibility/slugs.d.ts +34 -0
- package/dist/src/compatibility/slugs.d.ts.map +1 -0
- package/dist/src/compatibility/slugs.js +57 -0
- package/dist/src/compatibility/slugs.js.map +1 -0
- package/dist/src/db/schema-sql.d.ts +1 -1
- package/dist/src/db/schema-sql.d.ts.map +1 -1
- package/dist/src/db/schema-sql.js +1 -1
- package/dist/src/embeddings/probe.d.ts +62 -0
- package/dist/src/embeddings/probe.d.ts.map +1 -0
- package/dist/src/embeddings/probe.js +89 -0
- package/dist/src/embeddings/probe.js.map +1 -0
- package/dist/src/exports/types.d.ts +1 -0
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js +4 -0
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js +1 -1
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/provenance/SourceRecoveryService.d.ts +48 -0
- package/dist/src/provenance/SourceRecoveryService.d.ts.map +1 -0
- package/dist/src/provenance/SourceRecoveryService.js +182 -0
- package/dist/src/provenance/SourceRecoveryService.js.map +1 -0
- package/dist/src/provenance/backfill.d.ts +47 -0
- package/dist/src/provenance/backfill.d.ts.map +1 -0
- package/dist/src/provenance/backfill.js +206 -0
- package/dist/src/provenance/backfill.js.map +1 -0
- package/dist/src/provenance/git-config.d.ts +22 -0
- package/dist/src/provenance/git-config.d.ts.map +1 -0
- package/dist/src/provenance/git-config.js +117 -0
- package/dist/src/provenance/git-config.js.map +1 -0
- package/dist/src/provenance/index.d.ts +12 -0
- package/dist/src/provenance/index.d.ts.map +1 -0
- package/dist/src/provenance/index.js +12 -0
- package/dist/src/provenance/index.js.map +1 -0
- package/dist/src/provenance/local-skill-scan.d.ts +35 -0
- package/dist/src/provenance/local-skill-scan.d.ts.map +1 -0
- package/dist/src/provenance/local-skill-scan.js +79 -0
- package/dist/src/provenance/local-skill-scan.js.map +1 -0
- package/dist/src/provenance/plugin-manifest.d.ts +16 -0
- package/dist/src/provenance/plugin-manifest.d.ts.map +1 -0
- package/dist/src/provenance/plugin-manifest.js +52 -0
- package/dist/src/provenance/plugin-manifest.js.map +1 -0
- package/dist/src/provenance/types.d.ts +86 -0
- package/dist/src/provenance/types.d.ts.map +1 -0
- package/dist/src/provenance/types.js +21 -0
- package/dist/src/provenance/types.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +3 -1
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +10 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -1
- package/dist/src/scripts/validation/normalizers.js +9 -7
- package/dist/src/scripts/validation/normalizers.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +8 -2
- package/dist/src/scripts/validation/types.d.ts.map +1 -1
- package/dist/src/scripts/validation/types.js +10 -2
- package/dist/src/scripts/validation/types.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +0 -7
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts +56 -0
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.exec.js +255 -0
- package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +17 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +34 -199
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +22 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.js +213 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +1 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +1 -1
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +21 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +34 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +3 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +6 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +2 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.d.ts +2 -26
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +2 -120
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.io.d.ts +43 -0
- package/dist/src/services/skill-installation.io.d.ts.map +1 -0
- package/dist/src/services/skill-installation.io.js +176 -0
- package/dist/src/services/skill-installation.io.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +51 -113
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/services/skill-installation.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.types.js +9 -0
- package/dist/src/services/skill-installation.types.js.map +1 -1
- package/dist/src/services/skill-installation.validate.d.ts +44 -0
- package/dist/src/services/skill-installation.validate.d.ts.map +1 -0
- package/dist/src/services/skill-installation.validate.js +134 -0
- package/dist/src/services/skill-installation.validate.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +4 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +19 -1
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +14 -0
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.d.ts +13 -0
- package/dist/src/telemetry/wrap.bench.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.bench.js +41 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -0
- package/dist/src/telemetry/wrap.d.ts +75 -0
- package/dist/src/telemetry/wrap.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.js +124 -0
- package/dist/src/telemetry/wrap.js.map +1 -0
- package/dist/src/telemetry/wrap.test.d.ts +14 -0
- package/dist/src/telemetry/wrap.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.test.js +283 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -0
- package/dist/src/types/skill.d.ts +6 -1
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +25 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +3 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tests/GitHubIndexer.edge-cases.test.js +2 -2
- package/dist/tests/GitHubIndexer.repository.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.repository.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.repository.test.js +190 -0
- package/dist/tests/GitHubIndexer.repository.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.test.d.ts +2 -1
- package/dist/tests/GitHubIndexer.test.d.ts.map +1 -1
- package/dist/tests/GitHubIndexer.test.js +5 -183
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/QuarantineRepository.review-state-machine.test.d.ts +14 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.d.ts.map +1 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.js +296 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.js.map +1 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.js +3 -2
- package/dist/tests/RawUrlSourceAdapter.security.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.d.ts +11 -0
- package/dist/tests/SecurityScanner.exec.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.exec.test.js +190 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -0
- package/dist/tests/SwarmIndexer.test.js +2 -2
- package/dist/tests/api/client.validation.test.js +7 -4
- package/dist/tests/api/client.validation.test.js.map +1 -1
- package/dist/tests/embeddings/probe.test.d.ts +13 -0
- package/dist/tests/embeddings/probe.test.d.ts.map +1 -0
- package/dist/tests/embeddings/probe.test.js +154 -0
- package/dist/tests/embeddings/probe.test.js.map +1 -0
- package/dist/tests/fixtures/api-responses/index.js +1 -1
- package/dist/tests/fixtures/api-responses/index.js.map +1 -1
- package/dist/tests/integration/QuarantineService.concurrency.test.d.ts +34 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.d.ts.map +1 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.js +280 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.js.map +1 -0
- package/dist/tests/integration/openapi-contract.test.d.ts +16 -0
- package/dist/tests/integration/openapi-contract.test.d.ts.map +1 -0
- package/dist/tests/integration/openapi-contract.test.js +231 -0
- package/dist/tests/integration/openapi-contract.test.js.map +1 -0
- package/dist/tests/provenance/SourceRecoveryService.test.d.ts +2 -0
- package/dist/tests/provenance/SourceRecoveryService.test.d.ts.map +1 -0
- package/dist/tests/provenance/SourceRecoveryService.test.js +132 -0
- package/dist/tests/provenance/SourceRecoveryService.test.js.map +1 -0
- package/dist/tests/provenance/backfill.test.d.ts +2 -0
- package/dist/tests/provenance/backfill.test.d.ts.map +1 -0
- package/dist/tests/provenance/backfill.test.js +278 -0
- package/dist/tests/provenance/backfill.test.js.map +1 -0
- package/dist/tests/provenance/git-config.test.d.ts +2 -0
- package/dist/tests/provenance/git-config.test.d.ts.map +1 -0
- package/dist/tests/provenance/git-config.test.js +73 -0
- package/dist/tests/provenance/git-config.test.js.map +1 -0
- package/dist/tests/provenance/local-skill-scan.test.d.ts +2 -0
- package/dist/tests/provenance/local-skill-scan.test.d.ts.map +1 -0
- package/dist/tests/provenance/local-skill-scan.test.js +51 -0
- package/dist/tests/provenance/local-skill-scan.test.js.map +1 -0
- package/dist/tests/provenance/plugin-manifest.test.d.ts +2 -0
- package/dist/tests/provenance/plugin-manifest.test.d.ts.map +1 -0
- package/dist/tests/provenance/plugin-manifest.test.js +49 -0
- package/dist/tests/provenance/plugin-manifest.test.js.map +1 -0
- package/dist/tests/scripts/import-to-database.test.js +7 -1
- package/dist/tests/scripts/import-to-database.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +5 -1
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security.test.js +45 -0
- package/dist/tests/security.test.js.map +1 -1
- package/dist/tests/services/aidefence-feedback.test.js +2 -0
- package/dist/tests/services/aidefence-feedback.test.js.map +1 -1
- package/dist/tests/services/dep-quarantine-check.test.js +1 -1
- package/dist/tests/services/dep-quarantine-check.test.js.map +1 -1
- package/dist/tests/skill-scanner/allowlist.test.js +8 -1
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.gap1.test.d.ts +12 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.js +96 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.d.ts +11 -0
- package/dist/tests/unit/services/skill-installation.io.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +130 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -0
- package/dist/tests/validate-skills.dedup.test.d.ts +5 -0
- package/dist/tests/validate-skills.dedup.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.dedup.test.js +241 -0
- package/dist/tests/validate-skills.dedup.test.js.map +1 -0
- package/dist/tests/validate-skills.normalizers.test.d.ts +5 -0
- package/dist/tests/validate-skills.normalizers.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.normalizers.test.js +109 -0
- package/dist/tests/validate-skills.normalizers.test.js.map +1 -0
- package/dist/tests/validate-skills.test.d.ts +1 -1
- package/dist/tests/validate-skills.test.js +7 -345
- package/dist/tests/validate-skills.test.js.map +1 -1
- package/package.json +29 -8
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Validation and ID-parsing helpers for SkillInstallationService
|
|
3
|
+
* @module @skillsmith/core/services/skill-installation.validate
|
|
4
|
+
* @see SMI-4745: domain-driven split to stay under the 500-line CI gate
|
|
5
|
+
*/
|
|
6
|
+
import { parseRepoUrl } from '../utils/github-url.js';
|
|
7
|
+
import { validateSkillConfig } from './skill-config-schema.js';
|
|
8
|
+
import { buildInstallFailure } from './skill-installation.errors.js';
|
|
9
|
+
export function parseSkillIdInternal(input) {
|
|
10
|
+
if (input.startsWith('https://github.com/')) {
|
|
11
|
+
const url = new URL(input);
|
|
12
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
13
|
+
return {
|
|
14
|
+
owner: parts[0],
|
|
15
|
+
repo: parts[1],
|
|
16
|
+
path: parts.slice(2).join('/') || '',
|
|
17
|
+
isRegistryId: false,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (input.includes('/')) {
|
|
21
|
+
const parts = input.split('/');
|
|
22
|
+
if (parts.length === 2) {
|
|
23
|
+
return { owner: parts[0], repo: parts[1], path: '', isRegistryId: true };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
owner: parts[0],
|
|
27
|
+
repo: parts[1],
|
|
28
|
+
path: parts.slice(2).join('/'),
|
|
29
|
+
isRegistryId: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
33
|
+
if (UUID_REGEX.test(input)) {
|
|
34
|
+
return { owner: '', repo: '', path: '', isRegistryId: true };
|
|
35
|
+
}
|
|
36
|
+
throw new Error('Invalid skill ID format: ' + input + '. Use owner/repo or GitHub URL.');
|
|
37
|
+
}
|
|
38
|
+
export function validateSkillMd(content) {
|
|
39
|
+
const errors = [];
|
|
40
|
+
if (!content.includes('# ')) {
|
|
41
|
+
errors.push('Missing title (# heading)');
|
|
42
|
+
}
|
|
43
|
+
if (content.length < 100) {
|
|
44
|
+
errors.push('SKILL.md is too short (minimum 100 characters)');
|
|
45
|
+
}
|
|
46
|
+
return { valid: errors.length === 0, errors };
|
|
47
|
+
}
|
|
48
|
+
/** SMI-3870: Validate config.json content; returns validity and warnings. */
|
|
49
|
+
export function validateOptionalConfig(content) {
|
|
50
|
+
const result = validateSkillConfig(content);
|
|
51
|
+
if (!result.valid) {
|
|
52
|
+
return { valid: false, warnings: ['config.json rejected: ' + result.errors.join('; ')] };
|
|
53
|
+
}
|
|
54
|
+
return { valid: true, warnings: result.warnings };
|
|
55
|
+
}
|
|
56
|
+
/** SMI-3871: Cross-reference dependency targets against quarantine status. */
|
|
57
|
+
export function checkDepsAgainstQuarantine(depIntel, getStatus) {
|
|
58
|
+
const warnings = [];
|
|
59
|
+
const quarantinedDeps = [];
|
|
60
|
+
const checked = new Set();
|
|
61
|
+
const check = (target) => {
|
|
62
|
+
if (checked.has(target))
|
|
63
|
+
return;
|
|
64
|
+
checked.add(target);
|
|
65
|
+
const status = getStatus(target);
|
|
66
|
+
if (!status)
|
|
67
|
+
return;
|
|
68
|
+
quarantinedDeps.push(target);
|
|
69
|
+
const label = status === 'pending'
|
|
70
|
+
? 'under review for security concerns'
|
|
71
|
+
: 'quarantined (confirmed malicious)';
|
|
72
|
+
warnings.push('Dependency "' + target + '" is ' + label + '.');
|
|
73
|
+
};
|
|
74
|
+
for (const server of depIntel.dep_inferred_servers)
|
|
75
|
+
check(server);
|
|
76
|
+
if (depIntel.dep_declared?.platform?.mcp_servers) {
|
|
77
|
+
for (const srv of depIntel.dep_declared.platform.mcp_servers)
|
|
78
|
+
check(srv.name);
|
|
79
|
+
}
|
|
80
|
+
return { warnings, quarantinedDeps };
|
|
81
|
+
}
|
|
82
|
+
export async function resolveRegistryInstall(skillId, lookup) {
|
|
83
|
+
const registrySkill = await lookup.lookup(skillId);
|
|
84
|
+
if (!registrySkill) {
|
|
85
|
+
return {
|
|
86
|
+
resolved: false,
|
|
87
|
+
failure: buildInstallFailure('REGISTRY_SKILL_NOT_FOUND', {
|
|
88
|
+
skillId,
|
|
89
|
+
installPath: '',
|
|
90
|
+
error: 'Skill "' +
|
|
91
|
+
skillId +
|
|
92
|
+
'" is indexed for discovery only. ' +
|
|
93
|
+
'No installation source available (repo_url is missing). ' +
|
|
94
|
+
'This may be placeholder/seed data or a metadata-only entry.',
|
|
95
|
+
tips: [
|
|
96
|
+
'Use a full GitHub URL instead: install { skillId: "https://github.com/owner/repo" }',
|
|
97
|
+
'Search for installable skills using the search tool',
|
|
98
|
+
'Many indexed skills are metadata-only and cannot be installed directly',
|
|
99
|
+
],
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (registrySkill.quarantined) {
|
|
104
|
+
return {
|
|
105
|
+
resolved: false,
|
|
106
|
+
failure: buildInstallFailure('QUARANTINED', {
|
|
107
|
+
skillId,
|
|
108
|
+
installPath: '',
|
|
109
|
+
trustTier: registrySkill.trustTier,
|
|
110
|
+
error: 'Skill "' +
|
|
111
|
+
skillId +
|
|
112
|
+
'" has been quarantined due to security concerns. ' +
|
|
113
|
+
'Installation is blocked to protect your environment.',
|
|
114
|
+
tips: [
|
|
115
|
+
'Visit https://skillsmith.app/docs/quarantine for details on quarantine policies',
|
|
116
|
+
'If you believe this is a false positive, contact support via https://skillsmith.app/contact?topic=security',
|
|
117
|
+
'Contact the skill author or visit the quarantine documentation for more information',
|
|
118
|
+
],
|
|
119
|
+
}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const repoInfo = parseRepoUrl(registrySkill.repoUrl);
|
|
123
|
+
return {
|
|
124
|
+
resolved: true,
|
|
125
|
+
owner: repoInfo.owner,
|
|
126
|
+
repo: repoInfo.repo,
|
|
127
|
+
basePath: repoInfo.path ? repoInfo.path + '/' : '',
|
|
128
|
+
branch: repoInfo.branch,
|
|
129
|
+
skillName: registrySkill.name,
|
|
130
|
+
trustTier: registrySkill.trustTier,
|
|
131
|
+
indexedContentHash: registrySkill.contentHash,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=skill-installation.validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installation.validate.js","sourceRoot":"","sources":["../../../src/services/skill-installation.validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
export { SkillsmithTracer, getTracer, initializeTracing, shutdownTracing, traced, type TracerConfig, type SpanAttributes, type SpanWrapper, } from './tracer.js';
|
|
10
10
|
export { MetricsRegistry, getMetrics, initializeMetrics, timeAsync, timeSync, LATENCY_BUCKETS, type MetricsConfig, type MetricLabels, type Counter, type Histogram, type Gauge, type MetricsSnapshot, } from './metrics.js';
|
|
11
11
|
export { exportToPrometheus, getPrometheusMetrics, createPrometheusHandler, type PrometheusExportOptions, } from './prometheus.js';
|
|
12
|
-
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, type PostHogConfig, type SkillsmithEventType, type SkillEventProperties, type AllowedUserTraits, } from './posthog.js';
|
|
12
|
+
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackSkillInvoke, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, type PostHogConfig, type SkillsmithEventType, type SkillEventProperties, type TrackSkillInvokeParams, type AllowedUserTraits, } from './posthog.js';
|
|
13
|
+
export { withTelemetry, isTelemetered, setEmissionGate, type WithTelemetryOpts } from './wrap.js';
|
|
13
14
|
/**
|
|
14
15
|
* Initialize all telemetry (tracing + metrics)
|
|
15
16
|
* Call this at application startup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,eAAe,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,eAAe,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAEjG;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE;IACjD,OAAO,CAAC,EAAE,OAAO,aAAa,EAAE,YAAY,CAAA;IAC5C,OAAO,CAAC,EAAE,OAAO,cAAc,EAAE,aAAa,CAAA;CAC/C,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGvD"}
|
|
@@ -13,7 +13,10 @@ export { MetricsRegistry, getMetrics, initializeMetrics, timeAsync, timeSync, LA
|
|
|
13
13
|
// Prometheus exports (SMI-1018)
|
|
14
14
|
export { exportToPrometheus, getPrometheusMetrics, createPrometheusHandler, } from './prometheus.js';
|
|
15
15
|
// PostHog exports (SMI-1184)
|
|
16
|
-
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, } from './posthog.js';
|
|
16
|
+
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackSkillInvoke, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, } from './posthog.js';
|
|
17
|
+
// In-process HOF + registry (SMI-5016)
|
|
18
|
+
// Emission gate (SMI-5019 wire-in) — privacy-safe default-suppress.
|
|
19
|
+
export { withTelemetry, isTelemetered, setEmissionGate } from './wrap.js';
|
|
17
20
|
/**
|
|
18
21
|
* Initialize all telemetry (tracing + metrics)
|
|
19
22
|
* Call this at application startup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,GAIP,MAAM,aAAa,CAAA;AAEpB,kBAAkB;AAClB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,GAOhB,MAAM,cAAc,CAAA;AAErB,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iBAAiB,CAAA;AAExB,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,GAIP,MAAM,aAAa,CAAA;AAEpB,kBAAkB;AAClB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,GAOhB,MAAM,cAAc,CAAA;AAErB,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iBAAiB,CAAA;AAExB,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,GAMf,MAAM,cAAc,CAAA;AAErB,uCAAuC;AACvC,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAA0B,MAAM,WAAW,CAAA;AAEjG;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAGzC;IACC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACzD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAE1D,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACvD,MAAM,eAAe,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -28,7 +28,7 @@ export interface PostHogConfig {
|
|
|
28
28
|
/**
|
|
29
29
|
* Event types for Skillsmith analytics
|
|
30
30
|
*/
|
|
31
|
-
export type SkillsmithEventType = 'skill_search' | 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_compare' | 'skill_recommend' | 'api_error' | 'feature_flag_evaluated';
|
|
31
|
+
export type SkillsmithEventType = 'skill_search' | 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_compare' | 'skill_recommend' | 'api_error' | 'feature_flag_evaluated' | 'skill_invoke' | 'skill_context_load' | 'skill_invoke_unparsed';
|
|
32
32
|
/**
|
|
33
33
|
* Event properties for skill-related events
|
|
34
34
|
*/
|
|
@@ -140,6 +140,24 @@ export declare function trackSkillView(distinctId: string, skillId: string, sour
|
|
|
140
140
|
* Convenience function to track skill install events
|
|
141
141
|
*/
|
|
142
142
|
export declare function trackSkillInstall(distinctId: string, skillId: string, source: 'cli' | 'mcp' | 'api'): void;
|
|
143
|
+
/**
|
|
144
|
+
* Parameters for tracking a skill invocation event (SMI-5016).
|
|
145
|
+
* `distinctId` defaults to `'anonymous'` so the HOF can emit without knowing
|
|
146
|
+
* the per-user ID at wrap-time; callers with a resolved ID should pass it.
|
|
147
|
+
*/
|
|
148
|
+
export interface TrackSkillInvokeParams {
|
|
149
|
+
skillId: string;
|
|
150
|
+
source: 'mcp-tool' | 'cli' | 'vscode-extension';
|
|
151
|
+
framework: string;
|
|
152
|
+
durationMs: number;
|
|
153
|
+
success: boolean;
|
|
154
|
+
distinctId?: string;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Convenience function to track skill invocation events (SMI-5016).
|
|
158
|
+
* Mirrors `trackSkillInstall()` — positional for resolved-ID callers.
|
|
159
|
+
*/
|
|
160
|
+
export declare function trackSkillInvoke(params: TrackSkillInvokeParams): void;
|
|
143
161
|
/**
|
|
144
162
|
* Convenience function to track API errors
|
|
145
163
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,WAAW,GACX,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"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"}
|
|
@@ -200,6 +200,20 @@ export function trackSkillInstall(distinctId, skillId, source) {
|
|
|
200
200
|
source,
|
|
201
201
|
});
|
|
202
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Convenience function to track skill invocation events (SMI-5016).
|
|
205
|
+
* Mirrors `trackSkillInstall()` — positional for resolved-ID callers.
|
|
206
|
+
*/
|
|
207
|
+
export function trackSkillInvoke(params) {
|
|
208
|
+
const { skillId, source, framework, durationMs, success, distinctId = 'anonymous' } = params;
|
|
209
|
+
trackEvent(distinctId, 'skill_invoke', {
|
|
210
|
+
skill_id: skillId,
|
|
211
|
+
invoke_source: source,
|
|
212
|
+
framework,
|
|
213
|
+
duration_ms: durationMs,
|
|
214
|
+
success,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
203
217
|
/**
|
|
204
218
|
* Convenience function to track API errors
|
|
205
219
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016 / Risk #7: withTelemetry overhead microbenchmark.
|
|
3
|
+
*
|
|
4
|
+
* Uses vitest `bench()` for reporting. Run via:
|
|
5
|
+
* docker exec skillsmith-dev-1 \
|
|
6
|
+
* npx vitest bench --run packages/core/src/telemetry/wrap.bench.ts
|
|
7
|
+
*
|
|
8
|
+
* NOTE: `bench()` is reporting-only — it does NOT fail CI on regression.
|
|
9
|
+
* The assertable p99 < 1ms gate lives in `wrap.test.ts` ('overhead' suite)
|
|
10
|
+
* and runs in every CI test pass.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=wrap.bench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.bench.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016 / Risk #7: withTelemetry overhead microbenchmark.
|
|
3
|
+
*
|
|
4
|
+
* Uses vitest `bench()` for reporting. Run via:
|
|
5
|
+
* docker exec skillsmith-dev-1 \
|
|
6
|
+
* npx vitest bench --run packages/core/src/telemetry/wrap.bench.ts
|
|
7
|
+
*
|
|
8
|
+
* NOTE: `bench()` is reporting-only — it does NOT fail CI on regression.
|
|
9
|
+
* The assertable p99 < 1ms gate lives in `wrap.test.ts` ('overhead' suite)
|
|
10
|
+
* and runs in every CI test pass.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, bench, vi, beforeAll } from 'vitest';
|
|
13
|
+
import { withTelemetry } from './wrap.js';
|
|
14
|
+
vi.mock('./posthog.js', () => ({
|
|
15
|
+
trackSkillInvoke: vi.fn(),
|
|
16
|
+
}));
|
|
17
|
+
const noopHandler = async () => 42;
|
|
18
|
+
const wrappedNoop = withTelemetry(noopHandler, {
|
|
19
|
+
source: 'mcp-tool',
|
|
20
|
+
extractSkillId: () => 'bench/skill',
|
|
21
|
+
});
|
|
22
|
+
const wrappedWithFramework = withTelemetry(noopHandler, {
|
|
23
|
+
source: 'mcp-tool',
|
|
24
|
+
extractSkillId: () => 'bench/skill',
|
|
25
|
+
extractFramework: () => 'cursor',
|
|
26
|
+
});
|
|
27
|
+
beforeAll(async () => {
|
|
28
|
+
// JIT warm-up before measurement begins
|
|
29
|
+
for (let i = 0; i < 200; i++) {
|
|
30
|
+
await wrappedNoop();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
describe('withTelemetry HOF overhead', () => {
|
|
34
|
+
bench('no-op handler — no extractFramework', async () => {
|
|
35
|
+
await wrappedNoop();
|
|
36
|
+
}, { iterations: 500, warmupIterations: 50 });
|
|
37
|
+
bench('no-op handler — with extractFramework', async () => {
|
|
38
|
+
await wrappedWithFramework();
|
|
39
|
+
}, { iterations: 500, warmupIterations: 50 });
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=wrap.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.bench.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAA;AAEH,MAAM,WAAW,GAAG,KAAK,IAAqB,EAAE,CAAC,EAAE,CAAA;AAEnD,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,EAAE;IAC7C,MAAM,EAAE,UAAU;IAClB,cAAc,EAAE,GAAG,EAAE,CAAC,aAAa;CACpC,CAAC,CAAA;AAEF,MAAM,oBAAoB,GAAG,aAAa,CAAC,WAAW,EAAE;IACtD,MAAM,EAAE,UAAU;IAClB,cAAc,EAAE,GAAG,EAAE,CAAC,aAAa;IACnC,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ;CACjC,CAAC,CAAA;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,wCAAwC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAO,WAAiD,EAAE,CAAA;IAC5D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,KAAK,CACH,qCAAqC,EACrC,KAAK,IAAI,EAAE;QACT,MAAO,WAAiD,EAAE,CAAA;IAC5D,CAAC,EACD,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAC1C,CAAA;IAED,KAAK,CACH,uCAAuC,EACvC,KAAK,IAAI,EAAE;QACT,MAAO,oBAA0D,EAAE,CAAA;IACrE,CAAC,EACD,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAC1C,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: In-process telemetry HOF + Set-based registry.
|
|
3
|
+
*
|
|
4
|
+
* `withTelemetry` wraps a handler function with timing + emit + error-safe
|
|
5
|
+
* envelope. A module-scoped `Set<Function>` tracks all wrapped functions so
|
|
6
|
+
* the three-tree snapshot test (SMI-5018) can assert 100% dispatcher coverage
|
|
7
|
+
* via `isTelemetered()`.
|
|
8
|
+
*
|
|
9
|
+
* Applied review change H3: registry is an exported Set (not function-object
|
|
10
|
+
* mutation) so arrow-const exports can be wrapped without mutation.
|
|
11
|
+
* Applied review change H4: `framework` is captured per-call, not memoised.
|
|
12
|
+
*/
|
|
13
|
+
type AnyFunction = (...args: never[]) => unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Install (or clear) the per-process emission gate.
|
|
16
|
+
*
|
|
17
|
+
* Pass a predicate to enable telemetry only when the predicate returns true;
|
|
18
|
+
* pass `undefined` to revert to the default-suppress behaviour. Callers should
|
|
19
|
+
* always reset to `undefined` in a `finally` so a thrown handler does not
|
|
20
|
+
* leak emission permission to the next request.
|
|
21
|
+
*
|
|
22
|
+
* The predicate is evaluated once per call to a wrapped function, inside the
|
|
23
|
+
* `finally` block, so it sees the live state of any per-request resolver.
|
|
24
|
+
*/
|
|
25
|
+
export declare function setEmissionGate(gate: (() => boolean) | undefined): void;
|
|
26
|
+
/**
|
|
27
|
+
* Options for `withTelemetry`.
|
|
28
|
+
*
|
|
29
|
+
* `extractSkillId` and `extractFramework` receive the arguments array at
|
|
30
|
+
* call-time so they can derive values from the live request context.
|
|
31
|
+
* `extractFramework` is intentionally per-call (H4) — not memoised.
|
|
32
|
+
*/
|
|
33
|
+
export interface WithTelemetryOpts<TArgs extends readonly unknown[]> {
|
|
34
|
+
/** Discriminator stored with the event — which invocation surface this is. */
|
|
35
|
+
source: 'mcp-tool' | 'cli' | 'vscode-extension';
|
|
36
|
+
/** Derive the skill ID from the handler's arguments at call-time. */
|
|
37
|
+
extractSkillId: (args: TArgs) => string;
|
|
38
|
+
/**
|
|
39
|
+
* Derive the framework string from the handler's arguments at call-time.
|
|
40
|
+
* Per H4: called once per invocation, never memoised.
|
|
41
|
+
* Returns `'unknown'` if omitted.
|
|
42
|
+
*/
|
|
43
|
+
extractFramework?: (args: TArgs) => string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Wraps `handler` with a timing + telemetry emit envelope and registers the
|
|
47
|
+
* returned function in the module-scoped `wrapped` Set.
|
|
48
|
+
*
|
|
49
|
+
* Guarantees:
|
|
50
|
+
* - The emit happens even when `handler` throws (`finally` block).
|
|
51
|
+
* - Telemetry errors are swallowed — they never affect the caller.
|
|
52
|
+
* - The returned function preserves the original call signature (`F`).
|
|
53
|
+
* - Calling `withTelemetry` on the same original function twice produces two
|
|
54
|
+
* distinct wrapped functions (both registered in the Set).
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* // Arrow-const export — the critical H3 case:
|
|
58
|
+
* export const myTool = withTelemetry(
|
|
59
|
+
* async (args) => { ... },
|
|
60
|
+
* { source: 'mcp-tool', extractSkillId: (a) => a[0].skill }
|
|
61
|
+
* )
|
|
62
|
+
*/
|
|
63
|
+
export declare function withTelemetry<TArgs extends readonly unknown[], TReturn>(handler: (...args: TArgs) => Promise<TReturn> | TReturn, opts: WithTelemetryOpts<TArgs>): (...args: TArgs) => Promise<TReturn>;
|
|
64
|
+
/**
|
|
65
|
+
* Returns `true` if `fn` was produced by `withTelemetry`.
|
|
66
|
+
*
|
|
67
|
+
* Used by the three-tree snapshot test (SMI-5018) to assert that every
|
|
68
|
+
* dispatcher export is telemetry-wrapped.
|
|
69
|
+
*
|
|
70
|
+
* Note: checks the *wrapped* function reference, not the original handler.
|
|
71
|
+
* `isTelemetered(originalHandler)` is always `false`.
|
|
72
|
+
*/
|
|
73
|
+
export declare function isTelemetered(fn: AnyFunction): boolean;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=wrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAA;AAyBhD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAEvE;AAMD;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE;IACjE,8EAA8E;IAC9E,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAA;IAC/C,qEAAqE;IACrE,cAAc,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;IACvC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;CAC3C;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACrE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACvD,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAC7B,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAoCtC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: In-process telemetry HOF + Set-based registry.
|
|
3
|
+
*
|
|
4
|
+
* `withTelemetry` wraps a handler function with timing + emit + error-safe
|
|
5
|
+
* envelope. A module-scoped `Set<Function>` tracks all wrapped functions so
|
|
6
|
+
* the three-tree snapshot test (SMI-5018) can assert 100% dispatcher coverage
|
|
7
|
+
* via `isTelemetered()`.
|
|
8
|
+
*
|
|
9
|
+
* Applied review change H3: registry is an exported Set (not function-object
|
|
10
|
+
* mutation) so arrow-const exports can be wrapped without mutation.
|
|
11
|
+
* Applied review change H4: `framework` is captured per-call, not memoised.
|
|
12
|
+
*/
|
|
13
|
+
import { trackSkillInvoke } from './posthog.js';
|
|
14
|
+
const wrapped = new Set();
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Emission gate (SMI-5019 wire-in)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
//
|
|
19
|
+
// Default-suppress: until an emission gate is installed via `setEmissionGate`,
|
|
20
|
+
// `withTelemetry` does NOT emit. Privacy-safe by construction — consumers
|
|
21
|
+
// (e.g. the mcp-server license-gate middleware) MUST call `setEmissionGate`
|
|
22
|
+
// during request handling to enable emission for their context.
|
|
23
|
+
//
|
|
24
|
+
// The alternative (default-emit) would be backwards-compatible but risks
|
|
25
|
+
// emitting telemetry for an unknown anonymous_id before consent has been
|
|
26
|
+
// resolved. We pick the privacy-safe default per SMI-5019; a misconfigured
|
|
27
|
+
// host that forgets to install a gate simply emits no telemetry, which is
|
|
28
|
+
// observable (counts stay at zero) and recoverable.
|
|
29
|
+
//
|
|
30
|
+
// Multi-tenancy caveat: the gate is module-scoped. For a single-tenant MCP
|
|
31
|
+
// server process (the v1 shape) this is correct. A future multi-tenant
|
|
32
|
+
// transport would need `AsyncLocalStorage`-backed per-request state — see
|
|
33
|
+
// the matching caveat in `license.gate.ts`.
|
|
34
|
+
let emissionGate;
|
|
35
|
+
/**
|
|
36
|
+
* Install (or clear) the per-process emission gate.
|
|
37
|
+
*
|
|
38
|
+
* Pass a predicate to enable telemetry only when the predicate returns true;
|
|
39
|
+
* pass `undefined` to revert to the default-suppress behaviour. Callers should
|
|
40
|
+
* always reset to `undefined` in a `finally` so a thrown handler does not
|
|
41
|
+
* leak emission permission to the next request.
|
|
42
|
+
*
|
|
43
|
+
* The predicate is evaluated once per call to a wrapped function, inside the
|
|
44
|
+
* `finally` block, so it sees the live state of any per-request resolver.
|
|
45
|
+
*/
|
|
46
|
+
export function setEmissionGate(gate) {
|
|
47
|
+
emissionGate = gate;
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// HOF
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Wraps `handler` with a timing + telemetry emit envelope and registers the
|
|
54
|
+
* returned function in the module-scoped `wrapped` Set.
|
|
55
|
+
*
|
|
56
|
+
* Guarantees:
|
|
57
|
+
* - The emit happens even when `handler` throws (`finally` block).
|
|
58
|
+
* - Telemetry errors are swallowed — they never affect the caller.
|
|
59
|
+
* - The returned function preserves the original call signature (`F`).
|
|
60
|
+
* - Calling `withTelemetry` on the same original function twice produces two
|
|
61
|
+
* distinct wrapped functions (both registered in the Set).
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Arrow-const export — the critical H3 case:
|
|
65
|
+
* export const myTool = withTelemetry(
|
|
66
|
+
* async (args) => { ... },
|
|
67
|
+
* { source: 'mcp-tool', extractSkillId: (a) => a[0].skill }
|
|
68
|
+
* )
|
|
69
|
+
*/
|
|
70
|
+
export function withTelemetry(handler, opts) {
|
|
71
|
+
const wrappedFn = async (...args) => {
|
|
72
|
+
const start = Date.now();
|
|
73
|
+
const skillId = opts.extractSkillId(args);
|
|
74
|
+
// Per H4: evaluated per-call so a single server process can serve multiple
|
|
75
|
+
// clients with different frameworks on the same HTTP transport.
|
|
76
|
+
const framework = opts.extractFramework?.(args) ?? 'unknown';
|
|
77
|
+
let success = true;
|
|
78
|
+
try {
|
|
79
|
+
return await handler(...args);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
success = false;
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
// Emit BEFORE the catch re-throw lands; swallow telemetry errors so they
|
|
87
|
+
// never affect the wrapped function's observable behaviour.
|
|
88
|
+
try {
|
|
89
|
+
// SMI-5019 wire-in: consult the emission gate. Default-suppress when
|
|
90
|
+
// no gate is installed — see module-level comment for the rationale.
|
|
91
|
+
if (emissionGate && emissionGate()) {
|
|
92
|
+
trackSkillInvoke({
|
|
93
|
+
skillId,
|
|
94
|
+
source: opts.source,
|
|
95
|
+
framework,
|
|
96
|
+
durationMs: Date.now() - start,
|
|
97
|
+
success,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Intentionally swallowed — telemetry must never break user code.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
wrapped.add(wrappedFn);
|
|
107
|
+
return wrappedFn;
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Registry accessor
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
/**
|
|
113
|
+
* Returns `true` if `fn` was produced by `withTelemetry`.
|
|
114
|
+
*
|
|
115
|
+
* Used by the three-tree snapshot test (SMI-5018) to assert that every
|
|
116
|
+
* dispatcher export is telemetry-wrapped.
|
|
117
|
+
*
|
|
118
|
+
* Note: checks the *wrapped* function reference, not the original handler.
|
|
119
|
+
* `isTelemetered(originalHandler)` is always `false`.
|
|
120
|
+
*/
|
|
121
|
+
export function isTelemetered(fn) {
|
|
122
|
+
return wrapped.has(fn);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAW/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAA;AAEtC,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,0EAA0E;AAC1E,4CAA4C;AAC5C,IAAI,YAAyC,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiC;IAC/D,YAAY,GAAG,IAAI,CAAA;AACrB,CAAC;AA+BD,8EAA8E;AAC9E,MAAM;AACN,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAuD,EACvD,IAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,EAAE,GAAG,IAAW,EAAoB,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACzC,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,SAAS,CAAA;QAC5D,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,KAAK,CAAA;YACf,MAAM,CAAC,CAAA;QACT,CAAC;gBAAS,CAAC;YACT,yEAAyE;YACzE,4DAA4D;YAC5D,IAAI,CAAC;gBACH,qEAAqE;gBACrE,qEAAqE;gBACrE,IAAI,YAAY,IAAI,YAAY,EAAE,EAAE,CAAC;oBACnC,gBAAgB,CAAC;wBACf,OAAO;wBACP,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,SAAS;wBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC9B,OAAO;qBACR,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACtB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,EAAe;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: Unit tests for withTelemetry HOF + isTelemetered registry.
|
|
3
|
+
*
|
|
4
|
+
* Covers the shared-state matrix invariants from plan line 720:
|
|
5
|
+
* - function-decl wrap
|
|
6
|
+
* - arrow-const export wrap (H3 critical case)
|
|
7
|
+
* - double-register idempotency (Set dedupes by reference)
|
|
8
|
+
* - isTelemetered true/false
|
|
9
|
+
* - emit-on-throw (success:false, then re-throw)
|
|
10
|
+
* - telemetry emit failure does NOT affect wrapped fn
|
|
11
|
+
* - per-request framework (H4 — not memoised)
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=wrap.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.test.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|