@skillsmith/core 0.4.17 → 0.5.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 +29 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.cache.d.ts +34 -0
- package/dist/src/api/client.cache.d.ts.map +1 -0
- package/dist/src/api/client.cache.js +37 -0
- package/dist/src/api/client.cache.js.map +1 -0
- package/dist/src/api/client.d.ts +32 -104
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.events.d.ts +39 -0
- package/dist/src/api/client.events.d.ts.map +1 -0
- package/dist/src/api/client.events.js +77 -0
- package/dist/src/api/client.events.js.map +1 -0
- package/dist/src/api/client.js +65 -52
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.types.d.ts +98 -0
- package/dist/src/api/client.types.d.ts.map +1 -0
- package/dist/src/api/client.types.js +22 -0
- package/dist/src/api/client.types.js.map +1 -0
- package/dist/src/api/event-batcher.d.ts +81 -0
- package/dist/src/api/event-batcher.d.ts.map +1 -0
- package/dist/src/api/event-batcher.js +191 -0
- package/dist/src/api/event-batcher.js.map +1 -0
- 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 +2 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/schemas.d.ts +58 -0
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +45 -0
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/audit/remote-audit.d.ts +28 -0
- package/dist/src/audit/remote-audit.d.ts.map +1 -0
- package/dist/src/audit/remote-audit.js +90 -0
- package/dist/src/audit/remote-audit.js.map +1 -0
- package/dist/src/audit/remote-audit.test.d.ts +2 -0
- package/dist/src/audit/remote-audit.test.d.ts.map +1 -0
- package/dist/src/audit/remote-audit.test.js +81 -0
- package/dist/src/audit/remote-audit.test.js.map +1 -0
- package/dist/src/data/generic-triggers.d.ts +24 -0
- package/dist/src/data/generic-triggers.d.ts.map +1 -0
- package/dist/src/data/generic-triggers.js +19 -0
- package/dist/src/data/generic-triggers.js.map +1 -0
- package/dist/src/data/generic-triggers.json +35 -0
- package/dist/src/db/migration-runner.d.ts +44 -0
- package/dist/src/db/migration-runner.d.ts.map +1 -0
- package/dist/src/db/migration-runner.js +175 -0
- package/dist/src/db/migration-runner.js.map +1 -0
- package/dist/src/db/migration.d.ts.map +1 -1
- package/dist/src/db/migration.js +2 -1
- package/dist/src/db/migration.js.map +1 -1
- package/dist/src/db/migrations/v12-risk-score-history.d.ts +10 -0
- package/dist/src/db/migrations/v12-risk-score-history.d.ts.map +1 -0
- package/dist/src/db/migrations/v12-risk-score-history.js +25 -0
- package/dist/src/db/migrations/v12-risk-score-history.js.map +1 -0
- package/dist/src/db/migrations/v13-team-tables.d.ts +11 -0
- package/dist/src/db/migrations/v13-team-tables.d.ts.map +1 -0
- package/dist/src/db/migrations/v13-team-tables.js +14 -0
- package/dist/src/db/migrations/v13-team-tables.js.map +1 -0
- package/dist/src/db/schema-sql.d.ts +16 -0
- package/dist/src/db/schema-sql.d.ts.map +1 -0
- package/dist/src/db/schema-sql.js +161 -0
- package/dist/src/db/schema-sql.js.map +1 -0
- package/dist/src/db/schema.d.ts +7 -32
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +13 -303
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +1 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +4 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/services.d.ts +2 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +1 -0
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +5 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/repositories/RiskScoreHistoryRepository.d.ts +37 -0
- package/dist/src/repositories/RiskScoreHistoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/RiskScoreHistoryRepository.js +66 -0
- package/dist/src/repositories/RiskScoreHistoryRepository.js.map +1 -0
- package/dist/src/scoring/index.d.ts +1 -0
- package/dist/src/scoring/index.d.ts.map +1 -1
- package/dist/src/scoring/index.js +1 -0
- package/dist/src/scoring/index.js.map +1 -1
- package/dist/src/scoring/quality-score.d.ts +49 -0
- package/dist/src/scoring/quality-score.d.ts.map +1 -0
- package/dist/src/scoring/quality-score.js +73 -0
- package/dist/src/scoring/quality-score.js.map +1 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/security/index.d.ts +2 -0
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +2 -0
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/risk-trend.d.ts +21 -0
- package/dist/src/security/risk-trend.d.ts.map +1 -0
- package/dist/src/security/risk-trend.js +81 -0
- package/dist/src/security/risk-trend.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts +2 -0
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +14 -8
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +55 -1
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- 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 +6 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +25 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +2 -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 +1 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/skill-config-schema.d.ts +36 -0
- package/dist/src/services/skill-config-schema.d.ts.map +1 -0
- package/dist/src/services/skill-config-schema.js +76 -0
- package/dist/src/services/skill-config-schema.js.map +1 -0
- package/dist/src/services/skill-installation.feedback.d.ts +24 -0
- package/dist/src/services/skill-installation.feedback.d.ts.map +1 -0
- package/dist/src/services/skill-installation.feedback.js +37 -0
- package/dist/src/services/skill-installation.feedback.js.map +1 -0
- package/dist/src/services/skill-installation.helpers.d.ts +33 -7
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +74 -32
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.service.d.ts +8 -16
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +86 -37
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/services/skill-installation.types.d.ts +22 -0
- package/dist/src/services/skill-installation.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.types.js.map +1 -1
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/SecurityScanner.ai-defence.test.d.ts +6 -0
- package/dist/tests/SecurityScanner.ai-defence.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.ai-defence.test.js +221 -0
- package/dist/tests/SecurityScanner.ai-defence.test.js.map +1 -0
- package/dist/tests/SecurityScanner.performance.test.d.ts +6 -0
- package/dist/tests/SecurityScanner.performance.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.performance.test.js +132 -0
- package/dist/tests/SecurityScanner.performance.test.js.map +1 -0
- package/dist/tests/SecurityScanner.scoring.test.d.ts +6 -0
- package/dist/tests/SecurityScanner.scoring.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.scoring.test.js +197 -0
- package/dist/tests/SecurityScanner.scoring.test.js.map +1 -0
- package/dist/tests/SecurityScanner.test.d.ts +2 -2
- package/dist/tests/SecurityScanner.test.js +2 -520
- package/dist/tests/SecurityScanner.test.js.map +1 -1
- package/dist/tests/SkillMatcher.test.js +5 -5
- package/dist/tests/SkillMatcher.test.js.map +1 -1
- package/dist/tests/api/client.cache.test.d.ts +8 -0
- package/dist/tests/api/client.cache.test.d.ts.map +1 -0
- package/dist/tests/api/client.cache.test.js +128 -0
- package/dist/tests/api/client.cache.test.js.map +1 -0
- package/dist/tests/db/schema-migrations.test.js +8 -6
- package/dist/tests/db/schema-migrations.test.js.map +1 -1
- package/dist/tests/integration/events-batch-contract.test.d.ts +12 -0
- package/dist/tests/integration/events-batch-contract.test.d.ts.map +1 -0
- package/dist/tests/integration/events-batch-contract.test.js +69 -0
- package/dist/tests/integration/events-batch-contract.test.js.map +1 -0
- package/dist/tests/scoring/quality-score.test.d.ts +7 -0
- package/dist/tests/scoring/quality-score.test.d.ts.map +1 -0
- package/dist/tests/scoring/quality-score.test.js +78 -0
- package/dist/tests/scoring/quality-score.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.false-positives.test.d.ts +6 -0
- package/dist/tests/security/ContinuousSecurity.false-positives.test.d.ts.map +1 -0
- package/dist/tests/security/ContinuousSecurity.false-positives.test.js +89 -0
- package/dist/tests/security/ContinuousSecurity.false-positives.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.performance.test.d.ts +6 -0
- package/dist/tests/security/ContinuousSecurity.performance.test.d.ts.map +1 -0
- package/dist/tests/security/ContinuousSecurity.performance.test.js +177 -0
- package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.reporting.test.d.ts +6 -0
- package/dist/tests/security/ContinuousSecurity.reporting.test.d.ts.map +1 -0
- package/dist/tests/security/ContinuousSecurity.reporting.test.js +106 -0
- package/dist/tests/security/ContinuousSecurity.reporting.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.test.d.ts +9 -2
- package/dist/tests/security/ContinuousSecurity.test.d.ts.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +9 -336
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/pii-detection.test.d.ts +7 -0
- package/dist/tests/security/pii-detection.test.d.ts.map +1 -0
- package/dist/tests/security/pii-detection.test.js +91 -0
- package/dist/tests/security/pii-detection.test.js.map +1 -0
- package/dist/tests/security/risk-trend.test.d.ts +6 -0
- package/dist/tests/security/risk-trend.test.d.ts.map +1 -0
- package/dist/tests/security/risk-trend.test.js +68 -0
- package/dist/tests/security/risk-trend.test.js.map +1 -0
- package/dist/tests/security/scanner-regression-guard.test.d.ts +12 -0
- package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-regression-guard.test.js +111 -0
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -0
- package/dist/tests/services/aidefence-feedback.test.d.ts +6 -0
- package/dist/tests/services/aidefence-feedback.test.d.ts.map +1 -0
- package/dist/tests/services/aidefence-feedback.test.js +115 -0
- package/dist/tests/services/aidefence-feedback.test.js.map +1 -0
- package/dist/tests/services/dep-quarantine-check.test.d.ts +5 -0
- package/dist/tests/services/dep-quarantine-check.test.d.ts.map +1 -0
- package/dist/tests/services/dep-quarantine-check.test.js +92 -0
- package/dist/tests/services/dep-quarantine-check.test.js.map +1 -0
- package/dist/tests/services/skill-config-schema.test.d.ts +5 -0
- package/dist/tests/services/skill-config-schema.test.d.ts.map +1 -0
- package/dist/tests/services/skill-config-schema.test.js +98 -0
- package/dist/tests/services/skill-config-schema.test.js.map +1 -0
- package/dist/tests/unit/api-client-events.test.d.ts +10 -0
- package/dist/tests/unit/api-client-events.test.d.ts.map +1 -0
- package/dist/tests/unit/api-client-events.test.js +73 -0
- package/dist/tests/unit/api-client-events.test.js.map +1 -0
- package/dist/tests/unit/event-batcher.test.d.ts +13 -0
- package/dist/tests/unit/event-batcher.test.d.ts.map +1 -0
- package/dist/tests/unit/event-batcher.test.js +155 -0
- package/dist/tests/unit/event-batcher.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation-extended.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation-extended.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation-extended.test.js +423 -0
- package/dist/tests/unit/services/skill-installation-extended.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.test.js +0 -390
- package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API client types & error class
|
|
3
|
+
* @module api/client.types
|
|
4
|
+
*
|
|
5
|
+
* SMI-4120: Extracted from client.ts to keep the client under the 500-line
|
|
6
|
+
* pre-commit gate (scripts/check-file-length.mjs).
|
|
7
|
+
*/
|
|
8
|
+
import type { TrustTier } from '../types/skill.js';
|
|
9
|
+
import type { ClientCacheSetting } from './client.cache.js';
|
|
10
|
+
/**
|
|
11
|
+
* API response wrapper
|
|
12
|
+
*/
|
|
13
|
+
export interface ApiResponse<T> {
|
|
14
|
+
data: T;
|
|
15
|
+
meta?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* API error response
|
|
19
|
+
*/
|
|
20
|
+
export interface ApiErrorResponse {
|
|
21
|
+
error: string;
|
|
22
|
+
details?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Custom error class for API client errors with retry control
|
|
26
|
+
* SMI-1257: Replace string-based retry skip with custom error class
|
|
27
|
+
*/
|
|
28
|
+
export declare class ApiClientError extends Error {
|
|
29
|
+
readonly retryable: boolean;
|
|
30
|
+
readonly statusCode?: number | undefined;
|
|
31
|
+
constructor(message: string, retryable?: boolean, statusCode?: number | undefined);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search result from API
|
|
35
|
+
* SMI-1577: Made repo_url, created_at, updated_at optional to match schema
|
|
36
|
+
*/
|
|
37
|
+
export interface ApiSearchResult {
|
|
38
|
+
id: string;
|
|
39
|
+
name: string;
|
|
40
|
+
description: string | null;
|
|
41
|
+
author: string | null;
|
|
42
|
+
repo_url?: string | null;
|
|
43
|
+
quality_score: number | null;
|
|
44
|
+
trust_tier: TrustTier;
|
|
45
|
+
tags: string[];
|
|
46
|
+
stars?: number | null;
|
|
47
|
+
installable?: boolean | null;
|
|
48
|
+
quarantined?: boolean;
|
|
49
|
+
/** SHA-256 hash of SKILL.md content at index time */
|
|
50
|
+
content_hash?: string | null;
|
|
51
|
+
/** SMI-3672: Raw SKILL.md content (only when include_content=true) */
|
|
52
|
+
content?: string | null;
|
|
53
|
+
created_at?: string;
|
|
54
|
+
updated_at?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Recommendation request
|
|
58
|
+
*/
|
|
59
|
+
export interface RecommendationRequest {
|
|
60
|
+
stack: string[];
|
|
61
|
+
project_type?: string;
|
|
62
|
+
limit?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Telemetry event
|
|
66
|
+
*/
|
|
67
|
+
export interface TelemetryEvent {
|
|
68
|
+
event: 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_rate' | 'search' | 'recommend' | 'compare' | 'validate';
|
|
69
|
+
skill_id?: string;
|
|
70
|
+
anonymous_id: string;
|
|
71
|
+
metadata?: Record<string, unknown>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* API client configuration
|
|
75
|
+
*/
|
|
76
|
+
export interface ApiClientConfig {
|
|
77
|
+
/** Base URL for the API (defaults to production Supabase) */
|
|
78
|
+
baseUrl?: string;
|
|
79
|
+
/** Supabase anon key for authentication */
|
|
80
|
+
anonKey?: string;
|
|
81
|
+
/** API key for authenticated requests (X-API-Key header) */
|
|
82
|
+
apiKey?: string;
|
|
83
|
+
/** Request timeout in ms (default 30000) */
|
|
84
|
+
timeout?: number;
|
|
85
|
+
/** Max retry attempts (default 3) */
|
|
86
|
+
maxRetries?: number;
|
|
87
|
+
/** Enable debug logging */
|
|
88
|
+
debug?: boolean;
|
|
89
|
+
/** Enable offline mode (disables API calls) */
|
|
90
|
+
offlineMode?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* SMI-4120: Response cache config. Provide a pre-built ApiCache, a config
|
|
93
|
+
* object, or `false` to disable. `SKILLSMITH_DISABLE_CLIENT_CACHE=1` also
|
|
94
|
+
* disables (takes precedence).
|
|
95
|
+
*/
|
|
96
|
+
cache?: ClientCacheSetting;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=client.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.types.d.ts","sourceRoot":"","sources":["../../../src/api/client.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,SAAS,EAAE,OAAO;aAClB,UAAU,CAAC,EAAE,MAAM;gBAFnC,OAAO,EAAE,MAAM,EACC,SAAS,GAAE,OAAe,EAC1B,UAAU,CAAC,EAAE,MAAM,YAAA;CAKtC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,SAAS,CAAA;IACrB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EACD,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,SAAS,GACT,UAAU,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,kBAAkB,CAAA;CAC3B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API client types & error class
|
|
3
|
+
* @module api/client.types
|
|
4
|
+
*
|
|
5
|
+
* SMI-4120: Extracted from client.ts to keep the client under the 500-line
|
|
6
|
+
* pre-commit gate (scripts/check-file-length.mjs).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Custom error class for API client errors with retry control
|
|
10
|
+
* SMI-1257: Replace string-based retry skip with custom error class
|
|
11
|
+
*/
|
|
12
|
+
export class ApiClientError extends Error {
|
|
13
|
+
retryable;
|
|
14
|
+
statusCode;
|
|
15
|
+
constructor(message, retryable = false, statusCode) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.retryable = retryable;
|
|
18
|
+
this.statusCode = statusCode;
|
|
19
|
+
this.name = 'ApiClientError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=client.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.types.js","sourceRoot":"","sources":["../../../src/api/client.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGrB;IACA;IAHlB,YACE,OAAe,EACC,YAAqB,KAAK,EAC1B,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAA;QAHE,cAAS,GAAT,SAAS,CAAiB;QAC1B,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBatcher — client-side telemetry batcher
|
|
3
|
+
* @module api/event-batcher
|
|
4
|
+
*
|
|
5
|
+
* SMI-4119: Batch telemetry events to reduce Supabase edge function invocations.
|
|
6
|
+
*
|
|
7
|
+
* Flushes on:
|
|
8
|
+
* - size : queue reaches `maxBatchSize` (default 20)
|
|
9
|
+
* - time : `maxWaitMs` elapsed since first enqueue in the current batch (default 10s)
|
|
10
|
+
* - exit : `beforeExit` / `SIGINT` / `SIGTERM` (drain with `drainTimeoutMs`, default 2s)
|
|
11
|
+
*
|
|
12
|
+
* POSTs to `/events` with `{events: [...]}` and `X-Skillsmith-Batched: true` header.
|
|
13
|
+
* On failure: retry once after `retryDelayMs` (default 2s); on second failure, drop silently
|
|
14
|
+
* (matches the existing "fail silently" contract on telemetry).
|
|
15
|
+
*/
|
|
16
|
+
import type { TelemetryEvent } from './client.js';
|
|
17
|
+
/**
|
|
18
|
+
* Flush function signature. Returns a resolved promise on success, rejects on failure.
|
|
19
|
+
* Must throw / reject on non-2xx responses so the batcher can retry.
|
|
20
|
+
*/
|
|
21
|
+
export type BatchFlushFn = (events: TelemetryEvent[]) => Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Construction options for EventBatcher (all optional; defaults documented inline).
|
|
24
|
+
*/
|
|
25
|
+
export interface EventBatcherOptions {
|
|
26
|
+
/** Max events per batch before forced flush. Default: 20 (aligns with edge function max). */
|
|
27
|
+
maxBatchSize?: number;
|
|
28
|
+
/** Max ms to wait after first enqueue before flushing. Default: 10_000. */
|
|
29
|
+
maxWaitMs?: number;
|
|
30
|
+
/** Delay before retry on first flush failure. Default: 2_000. */
|
|
31
|
+
retryDelayMs?: number;
|
|
32
|
+
/** Max time to wait during process-exit drain. Default: 2_000. */
|
|
33
|
+
drainTimeoutMs?: number;
|
|
34
|
+
/** Attach process-exit listeners. Default: true. Disable in tests to avoid handler leaks. */
|
|
35
|
+
registerExitHandlers?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* In-memory batcher. Single-process, fire-and-forget.
|
|
39
|
+
*/
|
|
40
|
+
export declare class EventBatcher {
|
|
41
|
+
private queue;
|
|
42
|
+
private timer;
|
|
43
|
+
private activeFlush;
|
|
44
|
+
private readonly maxBatchSize;
|
|
45
|
+
private readonly maxWaitMs;
|
|
46
|
+
private readonly retryDelayMs;
|
|
47
|
+
private readonly drainTimeoutMs;
|
|
48
|
+
private readonly flushFn;
|
|
49
|
+
private exitHandlersAttached;
|
|
50
|
+
private disposed;
|
|
51
|
+
constructor(flushFn: BatchFlushFn, options?: EventBatcherOptions);
|
|
52
|
+
/**
|
|
53
|
+
* Enqueue an event. Flushes immediately if the batch reaches `maxBatchSize`.
|
|
54
|
+
* Fire-and-forget — errors are swallowed.
|
|
55
|
+
*/
|
|
56
|
+
enqueue(event: TelemetryEvent): void;
|
|
57
|
+
/**
|
|
58
|
+
* Force a flush of any queued events. Resolves when the in-flight POST completes.
|
|
59
|
+
* Used by shutdown paths and tests.
|
|
60
|
+
*/
|
|
61
|
+
flush(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Current queue depth (observability / tests).
|
|
64
|
+
*/
|
|
65
|
+
size(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Detach exit handlers and clear timers. Call when disposing short-lived clients.
|
|
68
|
+
*/
|
|
69
|
+
dispose(): void;
|
|
70
|
+
private clearTimer;
|
|
71
|
+
private flushNow;
|
|
72
|
+
private doFlushWithRetry;
|
|
73
|
+
private attachExitHandlers;
|
|
74
|
+
private detachExitHandlers;
|
|
75
|
+
private drainHandler;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Factory for an EventBatcher bound to a POST function.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createEventBatcher(flushFn: BatchFlushFn, options?: EventBatcherOptions): EventBatcher;
|
|
81
|
+
//# sourceMappingURL=event-batcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-batcher.d.ts","sourceRoot":"","sources":["../../../src/api/event-batcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEtE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,6FAA6F;IAC7F,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAOD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,oBAAoB,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,OAAO,EAAE,YAAY,EAAE,OAAO,GAAE,mBAAwB;IAYpE;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAuBpC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,UAAU;YAOJ,QAAQ;YA+BR,gBAAgB;IAoB9B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY,CAWnB;CACF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBatcher — client-side telemetry batcher
|
|
3
|
+
* @module api/event-batcher
|
|
4
|
+
*
|
|
5
|
+
* SMI-4119: Batch telemetry events to reduce Supabase edge function invocations.
|
|
6
|
+
*
|
|
7
|
+
* Flushes on:
|
|
8
|
+
* - size : queue reaches `maxBatchSize` (default 20)
|
|
9
|
+
* - time : `maxWaitMs` elapsed since first enqueue in the current batch (default 10s)
|
|
10
|
+
* - exit : `beforeExit` / `SIGINT` / `SIGTERM` (drain with `drainTimeoutMs`, default 2s)
|
|
11
|
+
*
|
|
12
|
+
* POSTs to `/events` with `{events: [...]}` and `X-Skillsmith-Batched: true` header.
|
|
13
|
+
* On failure: retry once after `retryDelayMs` (default 2s); on second failure, drop silently
|
|
14
|
+
* (matches the existing "fail silently" contract on telemetry).
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_MAX_BATCH_SIZE = 20;
|
|
17
|
+
const DEFAULT_MAX_WAIT_MS = 10_000;
|
|
18
|
+
const DEFAULT_RETRY_DELAY_MS = 2_000;
|
|
19
|
+
const DEFAULT_DRAIN_TIMEOUT_MS = 2_000;
|
|
20
|
+
/**
|
|
21
|
+
* In-memory batcher. Single-process, fire-and-forget.
|
|
22
|
+
*/
|
|
23
|
+
export class EventBatcher {
|
|
24
|
+
queue = [];
|
|
25
|
+
timer = null;
|
|
26
|
+
activeFlush = null;
|
|
27
|
+
maxBatchSize;
|
|
28
|
+
maxWaitMs;
|
|
29
|
+
retryDelayMs;
|
|
30
|
+
drainTimeoutMs;
|
|
31
|
+
flushFn;
|
|
32
|
+
exitHandlersAttached = false;
|
|
33
|
+
disposed = false;
|
|
34
|
+
constructor(flushFn, options = {}) {
|
|
35
|
+
this.flushFn = flushFn;
|
|
36
|
+
this.maxBatchSize = options.maxBatchSize ?? DEFAULT_MAX_BATCH_SIZE;
|
|
37
|
+
this.maxWaitMs = options.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;
|
|
38
|
+
this.retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
|
|
39
|
+
this.drainTimeoutMs = options.drainTimeoutMs ?? DEFAULT_DRAIN_TIMEOUT_MS;
|
|
40
|
+
if (options.registerExitHandlers !== false) {
|
|
41
|
+
this.attachExitHandlers();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Enqueue an event. Flushes immediately if the batch reaches `maxBatchSize`.
|
|
46
|
+
* Fire-and-forget — errors are swallowed.
|
|
47
|
+
*/
|
|
48
|
+
enqueue(event) {
|
|
49
|
+
if (this.disposed)
|
|
50
|
+
return;
|
|
51
|
+
this.queue.push(event);
|
|
52
|
+
if (this.queue.length >= this.maxBatchSize) {
|
|
53
|
+
// Size-based flush: cancel pending timer, fire immediately.
|
|
54
|
+
this.clearTimer();
|
|
55
|
+
void this.flushNow();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (this.timer === null) {
|
|
59
|
+
this.timer = setTimeout(() => {
|
|
60
|
+
this.timer = null;
|
|
61
|
+
void this.flushNow();
|
|
62
|
+
}, this.maxWaitMs);
|
|
63
|
+
// Unref so the timer does not keep the event loop alive.
|
|
64
|
+
if (typeof this.timer.unref === 'function') {
|
|
65
|
+
;
|
|
66
|
+
this.timer.unref();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Force a flush of any queued events. Resolves when the in-flight POST completes.
|
|
72
|
+
* Used by shutdown paths and tests.
|
|
73
|
+
*/
|
|
74
|
+
async flush() {
|
|
75
|
+
this.clearTimer();
|
|
76
|
+
await this.flushNow();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Current queue depth (observability / tests).
|
|
80
|
+
*/
|
|
81
|
+
size() {
|
|
82
|
+
return this.queue.length;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Detach exit handlers and clear timers. Call when disposing short-lived clients.
|
|
86
|
+
*/
|
|
87
|
+
dispose() {
|
|
88
|
+
this.disposed = true;
|
|
89
|
+
this.clearTimer();
|
|
90
|
+
this.detachExitHandlers();
|
|
91
|
+
}
|
|
92
|
+
clearTimer() {
|
|
93
|
+
if (this.timer !== null) {
|
|
94
|
+
clearTimeout(this.timer);
|
|
95
|
+
this.timer = null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async flushNow() {
|
|
99
|
+
// Serialize flushes: if one is in flight, chain.
|
|
100
|
+
if (this.activeFlush) {
|
|
101
|
+
await this.activeFlush.catch(() => undefined);
|
|
102
|
+
}
|
|
103
|
+
if (this.queue.length === 0)
|
|
104
|
+
return;
|
|
105
|
+
const batch = this.queue.splice(0, this.maxBatchSize);
|
|
106
|
+
this.activeFlush = this.doFlushWithRetry(batch).finally(() => {
|
|
107
|
+
this.activeFlush = null;
|
|
108
|
+
});
|
|
109
|
+
await this.activeFlush.catch(() => undefined);
|
|
110
|
+
// SMI-4119: If a burst enqueued more than `maxBatchSize` events while we
|
|
111
|
+
// were splicing, the leftover tail has no timer scheduled (size-triggered
|
|
112
|
+
// flush cleared it) and would otherwise stall until the next enqueue or
|
|
113
|
+
// process exit. Re-arm the timer or flush immediately if we're still at
|
|
114
|
+
// capacity.
|
|
115
|
+
if (this.queue.length >= this.maxBatchSize) {
|
|
116
|
+
void this.flushNow();
|
|
117
|
+
}
|
|
118
|
+
else if (this.queue.length > 0 && this.timer === null && !this.disposed) {
|
|
119
|
+
this.timer = setTimeout(() => {
|
|
120
|
+
this.timer = null;
|
|
121
|
+
void this.flushNow();
|
|
122
|
+
}, this.maxWaitMs);
|
|
123
|
+
if (typeof this.timer.unref === 'function') {
|
|
124
|
+
;
|
|
125
|
+
this.timer.unref();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async doFlushWithRetry(batch) {
|
|
130
|
+
try {
|
|
131
|
+
await this.flushFn(batch);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// swallow; retry below
|
|
136
|
+
}
|
|
137
|
+
await new Promise((resolve) => {
|
|
138
|
+
const t = setTimeout(resolve, this.retryDelayMs);
|
|
139
|
+
if (typeof t.unref === 'function') {
|
|
140
|
+
;
|
|
141
|
+
t.unref();
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
try {
|
|
145
|
+
await this.flushFn(batch);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Second failure: drop silently to match telemetry contract.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
attachExitHandlers() {
|
|
152
|
+
if (this.exitHandlersAttached)
|
|
153
|
+
return;
|
|
154
|
+
if (typeof process === 'undefined' || typeof process.on !== 'function')
|
|
155
|
+
return;
|
|
156
|
+
this.exitHandlersAttached = true;
|
|
157
|
+
process.on('beforeExit', this.drainHandler);
|
|
158
|
+
process.on('SIGINT', this.drainHandler);
|
|
159
|
+
process.on('SIGTERM', this.drainHandler);
|
|
160
|
+
}
|
|
161
|
+
detachExitHandlers() {
|
|
162
|
+
if (!this.exitHandlersAttached)
|
|
163
|
+
return;
|
|
164
|
+
if (typeof process === 'undefined' || typeof process.off !== 'function')
|
|
165
|
+
return;
|
|
166
|
+
this.exitHandlersAttached = false;
|
|
167
|
+
process.off('beforeExit', this.drainHandler);
|
|
168
|
+
process.off('SIGINT', this.drainHandler);
|
|
169
|
+
process.off('SIGTERM', this.drainHandler);
|
|
170
|
+
}
|
|
171
|
+
drainHandler = () => {
|
|
172
|
+
// Best-effort drain with timeout. Fire-and-forget — callers of beforeExit
|
|
173
|
+
// cannot await async handlers reliably, but attaching starts the work.
|
|
174
|
+
const drain = this.flush();
|
|
175
|
+
const timeout = new Promise((resolve) => {
|
|
176
|
+
const t = setTimeout(resolve, this.drainTimeoutMs);
|
|
177
|
+
if (typeof t.unref === 'function') {
|
|
178
|
+
;
|
|
179
|
+
t.unref();
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
void Promise.race([drain, timeout]).catch(() => undefined);
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Factory for an EventBatcher bound to a POST function.
|
|
187
|
+
*/
|
|
188
|
+
export function createEventBatcher(flushFn, options) {
|
|
189
|
+
return new EventBatcher(flushFn, options);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=event-batcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-batcher.js","sourceRoot":"","sources":["../../../src/api/event-batcher.ts"],"names":[],"mappings":"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"}
|
package/dist/src/api/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* SMI-1300: API types matching OpenAPI spec
|
|
8
8
|
*/
|
|
9
9
|
export { SkillsmithApiClient, createApiClient, generateAnonymousId, type ApiClientConfig, type ApiResponse, type ApiErrorResponse, type ApiSearchResult, type RecommendationRequest, type TelemetryEvent, } from './client.js';
|
|
10
|
+
export { EventBatcher, createEventBatcher, type EventBatcherOptions, type BatchFlushFn, } from './event-batcher.js';
|
|
10
11
|
export { ApiCache, createCache, getGlobalCache, DEFAULT_TTL, type CacheConfig, type CacheStats, } from './cache.js';
|
|
11
12
|
export type { ApiTrustTier, ApiCategory, ApiProjectType, ApiSkill, ApiSearchResult as OpenApiSearchResult, RecommendedSkill, SearchParams, SearchResponse, SearchResponseMeta, RecommendParams, RecommendResponse, RecommendResponseMeta, SkillResponse, HealthStatus, TelemetryEventType, TelemetryMetadata, TelemetryEventPayload, TelemetryResponse, ApiErrorResponse as OpenApiErrorResponse, RateLimitInfo, ApiClientOptions, ApiResponse as OpenApiResponse, } from './types.js';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACpB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,GACpB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAA;AAM3B,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAA;AAMnB,YAAY,EAEV,YAAY,EACZ,WAAW,EACX,cAAc,EAEd,QAAQ,EACR,eAAe,IAAI,mBAAmB,EACtC,gBAAgB,EAEhB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAElB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EAErB,aAAa,EAEb,YAAY,EAEZ,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EAEjB,gBAAgB,IAAI,oBAAoB,EAExC,aAAa,EAEb,gBAAgB,EAEhB,WAAW,IAAI,eAAe,GAC/B,MAAM,YAAY,CAAA"}
|
package/dist/src/api/index.js
CHANGED
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
// API Client
|
|
11
11
|
// ============================================================================
|
|
12
12
|
export { SkillsmithApiClient, createApiClient, generateAnonymousId, } from './client.js';
|
|
13
|
+
// SMI-4119: Event batching
|
|
14
|
+
export { EventBatcher, createEventBatcher, } from './event-batcher.js';
|
|
13
15
|
// ============================================================================
|
|
14
16
|
// API Cache
|
|
15
17
|
// ============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GAOpB,MAAM,aAAa,CAAA;AAEpB,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,GAGZ,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GAOpB,MAAM,aAAa,CAAA;AAEpB,2BAA2B;AAC3B,OAAO,EACL,YAAY,EACZ,kBAAkB,GAGnB,MAAM,oBAAoB,CAAA;AAE3B,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,GAGZ,MAAM,YAAY,CAAA"}
|
|
@@ -37,6 +37,7 @@ export declare const ApiSearchResultSchema: z.ZodObject<{
|
|
|
37
37
|
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
38
38
|
stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
39
39
|
installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
40
|
+
content: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
40
41
|
created_at: z.ZodOptional<z.ZodString>;
|
|
41
42
|
updated_at: z.ZodOptional<z.ZodString>;
|
|
42
43
|
}, z.core.$strip>;
|
|
@@ -56,6 +57,61 @@ export declare const TelemetryResponseSchema: z.ZodObject<{
|
|
|
56
57
|
}, z.core.$strip>;
|
|
57
58
|
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
58
59
|
}, z.core.$strip>;
|
|
60
|
+
/**
|
|
61
|
+
* Schema for a single telemetry event payload.
|
|
62
|
+
* Used to validate batch entries client-side before POST.
|
|
63
|
+
*/
|
|
64
|
+
export declare const TelemetryEventSchema: z.ZodObject<{
|
|
65
|
+
event: z.ZodEnum<{
|
|
66
|
+
skill_install: "skill_install";
|
|
67
|
+
skill_uninstall: "skill_uninstall";
|
|
68
|
+
search: "search";
|
|
69
|
+
recommend: "recommend";
|
|
70
|
+
skill_view: "skill_view";
|
|
71
|
+
skill_rate: "skill_rate";
|
|
72
|
+
compare: "compare";
|
|
73
|
+
validate: "validate";
|
|
74
|
+
}>;
|
|
75
|
+
skill_id: z.ZodOptional<z.ZodString>;
|
|
76
|
+
anonymous_id: z.ZodString;
|
|
77
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
78
|
+
}, z.core.$strip>;
|
|
79
|
+
/**
|
|
80
|
+
* Request schema for batched telemetry: `{ events: [...] }` (1..=20).
|
|
81
|
+
*/
|
|
82
|
+
export declare const TelemetryEventBatchSchema: z.ZodObject<{
|
|
83
|
+
events: z.ZodArray<z.ZodObject<{
|
|
84
|
+
event: z.ZodEnum<{
|
|
85
|
+
skill_install: "skill_install";
|
|
86
|
+
skill_uninstall: "skill_uninstall";
|
|
87
|
+
search: "search";
|
|
88
|
+
recommend: "recommend";
|
|
89
|
+
skill_view: "skill_view";
|
|
90
|
+
skill_rate: "skill_rate";
|
|
91
|
+
compare: "compare";
|
|
92
|
+
validate: "validate";
|
|
93
|
+
}>;
|
|
94
|
+
skill_id: z.ZodOptional<z.ZodString>;
|
|
95
|
+
anonymous_id: z.ZodString;
|
|
96
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
/**
|
|
100
|
+
* Response schema for batched telemetry POST.
|
|
101
|
+
* Returned ONLY for the array-body path; single-event POST still returns `{ ok: true }`.
|
|
102
|
+
*/
|
|
103
|
+
export declare const TelemetryBatchResponseSchema: z.ZodObject<{
|
|
104
|
+
ok: z.ZodBoolean;
|
|
105
|
+
accepted: z.ZodNumber;
|
|
106
|
+
rejected: z.ZodNumber;
|
|
107
|
+
errors: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
108
|
+
index: z.ZodNumber;
|
|
109
|
+
reason: z.ZodString;
|
|
110
|
+
}, z.core.$strip>>>;
|
|
111
|
+
}, z.core.$strip>;
|
|
112
|
+
export type TelemetryEventPayload = z.infer<typeof TelemetryEventSchema>;
|
|
113
|
+
export type TelemetryEventBatch = z.infer<typeof TelemetryEventBatchSchema>;
|
|
114
|
+
export type TelemetryBatchResponse = z.infer<typeof TelemetryBatchResponseSchema>;
|
|
59
115
|
/**
|
|
60
116
|
* Search response schema with array of results
|
|
61
117
|
*/
|
|
@@ -78,6 +134,7 @@ export declare const SearchResponseSchema: z.ZodObject<{
|
|
|
78
134
|
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
79
135
|
stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
80
136
|
installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
137
|
+
content: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
81
138
|
created_at: z.ZodOptional<z.ZodString>;
|
|
82
139
|
updated_at: z.ZodOptional<z.ZodString>;
|
|
83
140
|
}, z.core.$strip>>;
|
|
@@ -105,6 +162,7 @@ export declare const SingleSkillResponseSchema: z.ZodObject<{
|
|
|
105
162
|
tags: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
106
163
|
stars: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
107
164
|
installable: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
165
|
+
content: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
108
166
|
created_at: z.ZodOptional<z.ZodString>;
|
|
109
167
|
updated_at: z.ZodOptional<z.ZodString>;
|
|
110
168
|
}, z.core.$strip>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/api/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAA;AAMF;;;GAGG;AACH,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/api/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAA;AAMF;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;iBAgBhC,CAAA;AAMF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;;;kBAK5E;AAMD;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;iBAKlC,CAAA;AAMF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAc/B,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBAEpC,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;iBAYvC,CAAA;AAEF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACxE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAC3E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAMjF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAA0D,CAAA;AAE3F;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;iBAAiD,CAAA;AAMvF;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAE5E;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAE1E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAEpF;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA"}
|
package/dist/src/api/schemas.js
CHANGED
|
@@ -37,6 +37,8 @@ export const ApiSearchResultSchema = z.object({
|
|
|
37
37
|
tags: z.array(z.string()).default([]),
|
|
38
38
|
stars: z.number().nullable().optional(),
|
|
39
39
|
installable: z.boolean().nullable().optional(),
|
|
40
|
+
/** SMI-3672: Raw SKILL.md content (only present when include_content=true) */
|
|
41
|
+
content: z.string().nullable().optional(),
|
|
40
42
|
created_at: z.string().optional(),
|
|
41
43
|
updated_at: z.string().optional(),
|
|
42
44
|
});
|
|
@@ -65,6 +67,49 @@ export const TelemetryResponseSchema = z.object({
|
|
|
65
67
|
meta: z.record(z.string(), z.unknown()).optional(),
|
|
66
68
|
});
|
|
67
69
|
// ============================================================================
|
|
70
|
+
// Telemetry Batch Schemas (SMI-4119)
|
|
71
|
+
// ============================================================================
|
|
72
|
+
/**
|
|
73
|
+
* Schema for a single telemetry event payload.
|
|
74
|
+
* Used to validate batch entries client-side before POST.
|
|
75
|
+
*/
|
|
76
|
+
export const TelemetryEventSchema = z.object({
|
|
77
|
+
event: z.enum([
|
|
78
|
+
'skill_view',
|
|
79
|
+
'skill_install',
|
|
80
|
+
'skill_uninstall',
|
|
81
|
+
'skill_rate',
|
|
82
|
+
'search',
|
|
83
|
+
'recommend',
|
|
84
|
+
'compare',
|
|
85
|
+
'validate',
|
|
86
|
+
]),
|
|
87
|
+
skill_id: z.string().optional(),
|
|
88
|
+
anonymous_id: z.string(),
|
|
89
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* Request schema for batched telemetry: `{ events: [...] }` (1..=20).
|
|
93
|
+
*/
|
|
94
|
+
export const TelemetryEventBatchSchema = z.object({
|
|
95
|
+
events: z.array(TelemetryEventSchema).min(1).max(20),
|
|
96
|
+
});
|
|
97
|
+
/**
|
|
98
|
+
* Response schema for batched telemetry POST.
|
|
99
|
+
* Returned ONLY for the array-body path; single-event POST still returns `{ ok: true }`.
|
|
100
|
+
*/
|
|
101
|
+
export const TelemetryBatchResponseSchema = z.object({
|
|
102
|
+
ok: z.boolean(),
|
|
103
|
+
accepted: z.number().int().min(0),
|
|
104
|
+
rejected: z.number().int().min(0),
|
|
105
|
+
errors: z
|
|
106
|
+
.array(z.object({
|
|
107
|
+
index: z.number().int(),
|
|
108
|
+
reason: z.string(),
|
|
109
|
+
}))
|
|
110
|
+
.optional(),
|
|
111
|
+
});
|
|
112
|
+
// ============================================================================
|
|
68
113
|
// Pre-built Response Schemas
|
|
69
114
|
// ============================================================================
|
|
70
115
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/api/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,UAAU;IACV,SAAS;IACT,WAAW;IACX,cAAc;IACd,SAAS;CACV,CAAC,CAAA;AAEF,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACvC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAA;AAEF,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAyB,UAAa;IAC3E,OAAO,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;KACnD,CAAC,CAAA;AACJ,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;KAChB,CAAC;IACF,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAA;AAEF,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAA;AAE3F;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC,qBAAqB,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/api/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface InstallEventPayload {
|
|
2
|
+
skillId: string;
|
|
3
|
+
source: 'mcp' | 'cli' | 'vscode';
|
|
4
|
+
success: boolean;
|
|
5
|
+
durationMs?: number;
|
|
6
|
+
trustTier?: string;
|
|
7
|
+
errorCode?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Emit a skill-install event to Skillsmith's remote telemetry endpoint.
|
|
11
|
+
*
|
|
12
|
+
* Best-effort: never throws, never blocks the caller. Silently skips in these cases:
|
|
13
|
+
* - No API key available (CLI offline / unauthenticated)
|
|
14
|
+
* - SKILLSMITH_TELEMETRY=0 (opt-out)
|
|
15
|
+
* - Network / endpoint failure
|
|
16
|
+
*
|
|
17
|
+
* The API key is mapped to a namespaced, non-reversible telemetry actor ID
|
|
18
|
+
* (HMAC-SHA-256 keyed by `skillsmith-telemetry-actor:v1`) before transmission.
|
|
19
|
+
* The server stores that digest as `actor` — never the raw key, never an
|
|
20
|
+
* email, never a user ID.
|
|
21
|
+
*
|
|
22
|
+
* Event shape when emitted:
|
|
23
|
+
* event_type: "telemetry:skill_install"
|
|
24
|
+
* actor: hmac_sha256("skillsmith-telemetry-actor:v1", apiKey) hex
|
|
25
|
+
* metadata: { skill_id, source, success, duration_ms?, trust_tier?, error_code? }
|
|
26
|
+
*/
|
|
27
|
+
export declare function emitInstallEvent(payload: InstallEventPayload): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=remote-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-audit.d.ts","sourceRoot":"","sources":["../../../src/audit/remote-audit.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAyCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgClF"}
|