@skillsmith/core 0.5.0 → 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 +11 -2
- 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 +16 -86
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +27 -20
- 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/schemas.d.ts +2 -2
- 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/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/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/package.json +1 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side response cache wiring
|
|
3
|
+
* @module api/client.cache
|
|
4
|
+
*
|
|
5
|
+
* SMI-4120: Extracted from client.ts to keep the client under the 500-line
|
|
6
|
+
* audit:standards gate. Contains cache construction, the per-call option
|
|
7
|
+
* type, and the `withCache` helper used by search/getSkill/recommend.
|
|
8
|
+
*/
|
|
9
|
+
import { ApiCache, type CacheConfig } from './cache.js';
|
|
10
|
+
import type { ApiResponse } from './client.js';
|
|
11
|
+
/**
|
|
12
|
+
* SMI-4120: Per-call cache directive, matching `fetch` RequestInit semantics.
|
|
13
|
+
* `no-store` skips both cache read and write for the call.
|
|
14
|
+
*/
|
|
15
|
+
export interface CallCacheOptions {
|
|
16
|
+
cache?: 'default' | 'no-store';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Cache configuration accepted by `SkillsmithApiClient`. Pass `false` to
|
|
20
|
+
* disable; pass a pre-built `ApiCache` to share one across clients; pass a
|
|
21
|
+
* `CacheConfig` object to customize TTLs.
|
|
22
|
+
*/
|
|
23
|
+
export type ClientCacheSetting = ApiCache | CacheConfig | false;
|
|
24
|
+
/**
|
|
25
|
+
* SMI-4120: Build the response cache honoring the env kill-switch. Returns
|
|
26
|
+
* `null` when disabled so callers can branch cheaply.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildResponseCache(setting: ClientCacheSetting | undefined): ApiCache | null;
|
|
29
|
+
/**
|
|
30
|
+
* SMI-4120: Run a thunk through the response cache. Stored values are the
|
|
31
|
+
* same `ApiResponse` reference — callers must not mutate.
|
|
32
|
+
*/
|
|
33
|
+
export declare function withResponseCache<T>(cache: ApiCache | null, endpointType: 'search' | 'getSkill' | 'recommend', key: string, noStore: boolean, fetcher: () => Promise<ApiResponse<T>>): Promise<ApiResponse<T>>;
|
|
34
|
+
//# sourceMappingURL=client.cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cache.d.ts","sourceRoot":"","sources":["../../../src/api/client.cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAA;AAE/D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAK3F;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,KAAK,EAAE,QAAQ,GAAG,IAAI,EACtB,YAAY,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,EACjD,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACrC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAOzB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side response cache wiring
|
|
3
|
+
* @module api/client.cache
|
|
4
|
+
*
|
|
5
|
+
* SMI-4120: Extracted from client.ts to keep the client under the 500-line
|
|
6
|
+
* audit:standards gate. Contains cache construction, the per-call option
|
|
7
|
+
* type, and the `withCache` helper used by search/getSkill/recommend.
|
|
8
|
+
*/
|
|
9
|
+
import { ApiCache } from './cache.js';
|
|
10
|
+
/**
|
|
11
|
+
* SMI-4120: Build the response cache honoring the env kill-switch. Returns
|
|
12
|
+
* `null` when disabled so callers can branch cheaply.
|
|
13
|
+
*/
|
|
14
|
+
export function buildResponseCache(setting) {
|
|
15
|
+
if (process.env.SKILLSMITH_DISABLE_CLIENT_CACHE === '1')
|
|
16
|
+
return null;
|
|
17
|
+
if (setting === false)
|
|
18
|
+
return null;
|
|
19
|
+
if (setting instanceof ApiCache)
|
|
20
|
+
return setting;
|
|
21
|
+
return new ApiCache(setting ?? {});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* SMI-4120: Run a thunk through the response cache. Stored values are the
|
|
25
|
+
* same `ApiResponse` reference — callers must not mutate.
|
|
26
|
+
*/
|
|
27
|
+
export async function withResponseCache(cache, endpointType, key, noStore, fetcher) {
|
|
28
|
+
if (!cache || noStore)
|
|
29
|
+
return fetcher();
|
|
30
|
+
const hit = cache.get(key);
|
|
31
|
+
if (hit)
|
|
32
|
+
return hit;
|
|
33
|
+
const fresh = await fetcher();
|
|
34
|
+
cache.set(key, fresh, endpointType);
|
|
35
|
+
return fresh;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=client.cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cache.js","sourceRoot":"","sources":["../../../src/api/client.cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAoB,MAAM,YAAY,CAAA;AAkBvD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAuC;IACxE,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IACpE,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,OAAO,YAAY,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC/C,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAsB,EACtB,YAAiD,EACjD,GAAW,EACX,OAAgB,EAChB,OAAsC;IAEtC,IAAI,CAAC,KAAK,IAAI,OAAO;QAAE,OAAO,OAAO,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAiB,GAAG,CAAC,CAAA;IAC1C,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IACnB,MAAM,KAAK,GAAG,MAAM,OAAO,EAAE,CAAA;IAC7B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;IACnC,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/dist/src/api/client.d.ts
CHANGED
|
@@ -5,92 +5,15 @@
|
|
|
5
5
|
* SMI-1244: API client for Supabase endpoints. SMI-1258: Zod response validation.
|
|
6
6
|
* SMI-4119: `recordEvent` batches via EventBatcher (see client.events.ts).
|
|
7
7
|
*/
|
|
8
|
-
import type { Skill,
|
|
8
|
+
import type { Skill, SearchOptions } from '../types/skill.js';
|
|
9
|
+
import { type ApiResponse, type ApiSearchResult, type ApiClientConfig, type RecommendationRequest, type TelemetryEvent } from './client.types.js';
|
|
10
|
+
export { ApiClientError, type ApiResponse, type ApiErrorResponse, type ApiSearchResult, type ApiClientConfig, type RecommendationRequest, type TelemetryEvent, } from './client.types.js';
|
|
11
|
+
import { ApiCache } from './cache.js';
|
|
12
|
+
import { type CallCacheOptions } from './client.cache.js';
|
|
13
|
+
export type { CallCacheOptions } from './client.cache.js';
|
|
9
14
|
export { generateAnonymousId } from './utils.js';
|
|
10
15
|
export { checkApiHealth } from './client.health.js';
|
|
11
16
|
export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, } from './schemas.js';
|
|
12
|
-
/**
|
|
13
|
-
* API response wrapper
|
|
14
|
-
*/
|
|
15
|
-
export interface ApiResponse<T> {
|
|
16
|
-
data: T;
|
|
17
|
-
meta?: Record<string, unknown>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* API error response
|
|
21
|
-
*/
|
|
22
|
-
export interface ApiErrorResponse {
|
|
23
|
-
error: string;
|
|
24
|
-
details?: Record<string, unknown>;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Custom error class for API client errors with retry control
|
|
28
|
-
* SMI-1257: Replace string-based retry skip with custom error class
|
|
29
|
-
*/
|
|
30
|
-
export declare class ApiClientError extends Error {
|
|
31
|
-
readonly retryable: boolean;
|
|
32
|
-
readonly statusCode?: number | undefined;
|
|
33
|
-
constructor(message: string, retryable?: boolean, statusCode?: number | undefined);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Search result from API
|
|
37
|
-
* SMI-1577: Made repo_url, created_at, updated_at optional to match schema
|
|
38
|
-
*/
|
|
39
|
-
export interface ApiSearchResult {
|
|
40
|
-
id: string;
|
|
41
|
-
name: string;
|
|
42
|
-
description: string | null;
|
|
43
|
-
author: string | null;
|
|
44
|
-
repo_url?: string | null;
|
|
45
|
-
quality_score: number | null;
|
|
46
|
-
trust_tier: TrustTier;
|
|
47
|
-
tags: string[];
|
|
48
|
-
stars?: number | null;
|
|
49
|
-
installable?: boolean | null;
|
|
50
|
-
quarantined?: boolean;
|
|
51
|
-
/** SHA-256 hash of SKILL.md content at index time */
|
|
52
|
-
content_hash?: string | null;
|
|
53
|
-
/** SMI-3672: Raw SKILL.md content (only when include_content=true) */
|
|
54
|
-
content?: string | null;
|
|
55
|
-
created_at?: string;
|
|
56
|
-
updated_at?: string;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Recommendation request
|
|
60
|
-
*/
|
|
61
|
-
export interface RecommendationRequest {
|
|
62
|
-
stack: string[];
|
|
63
|
-
project_type?: string;
|
|
64
|
-
limit?: number;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Telemetry event
|
|
68
|
-
*/
|
|
69
|
-
export interface TelemetryEvent {
|
|
70
|
-
event: 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_rate' | 'search' | 'recommend' | 'compare' | 'validate';
|
|
71
|
-
skill_id?: string;
|
|
72
|
-
anonymous_id: string;
|
|
73
|
-
metadata?: Record<string, unknown>;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* API client configuration
|
|
77
|
-
*/
|
|
78
|
-
export interface ApiClientConfig {
|
|
79
|
-
/** Base URL for the API (defaults to production Supabase) */
|
|
80
|
-
baseUrl?: string;
|
|
81
|
-
/** Supabase anon key for authentication */
|
|
82
|
-
anonKey?: string;
|
|
83
|
-
/** API key for authenticated requests (X-API-Key header) */
|
|
84
|
-
apiKey?: string;
|
|
85
|
-
/** Request timeout in ms (default 30000) */
|
|
86
|
-
timeout?: number;
|
|
87
|
-
/** Max retry attempts (default 3) */
|
|
88
|
-
maxRetries?: number;
|
|
89
|
-
/** Enable debug logging */
|
|
90
|
-
debug?: boolean;
|
|
91
|
-
/** Enable offline mode (disables API calls) */
|
|
92
|
-
offlineMode?: boolean;
|
|
93
|
-
}
|
|
94
17
|
/**
|
|
95
18
|
* Skillsmith API Client. See module docstring for SMI refs.
|
|
96
19
|
*/
|
|
@@ -104,7 +27,11 @@ export declare class SkillsmithApiClient {
|
|
|
104
27
|
private offlineMode;
|
|
105
28
|
/** SMI-4119: Lazily-initialized batcher for telemetry events. */
|
|
106
29
|
private eventBatcher;
|
|
30
|
+
/** SMI-4120: Response cache (null when disabled). */
|
|
31
|
+
private responseCache;
|
|
107
32
|
constructor(config?: ApiClientConfig);
|
|
33
|
+
/** SMI-4120: Expose the response cache (null when disabled). */
|
|
34
|
+
getResponseCache(): ApiCache | null;
|
|
108
35
|
/**
|
|
109
36
|
* Check if client is running in offline mode
|
|
110
37
|
*/
|
|
@@ -135,21 +62,24 @@ export declare class SkillsmithApiClient {
|
|
|
135
62
|
/**
|
|
136
63
|
* Search for skills
|
|
137
64
|
* SMI-1258: Validates response against SearchResponseSchema
|
|
65
|
+
* SMI-4120: Client LRU cache; opt-out via `{ cache: 'no-store' }`.
|
|
138
66
|
*/
|
|
139
|
-
search(options: SearchOptions): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
67
|
+
search(options: SearchOptions, callOptions?: CallCacheOptions): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
140
68
|
/**
|
|
141
69
|
* Get skill by ID
|
|
142
70
|
* SMI-1258: Validates response against SingleSkillResponseSchema
|
|
143
71
|
* SMI-3672: Added includeContent option to fetch SKILL.md content
|
|
72
|
+
* SMI-4120: Client LRU cache; opt-out via `{ cache: 'no-store' }`.
|
|
144
73
|
*/
|
|
145
74
|
getSkill(id: string, options?: {
|
|
146
75
|
includeContent?: boolean;
|
|
147
|
-
}): Promise<ApiResponse<ApiSearchResult>>;
|
|
76
|
+
} & CallCacheOptions): Promise<ApiResponse<ApiSearchResult>>;
|
|
148
77
|
/**
|
|
149
78
|
* Get skill recommendations based on tech stack
|
|
150
79
|
* SMI-1258: Validates response against SearchResponseSchema
|
|
80
|
+
* SMI-4120: Client LRU cache; opt-out via `{ cache: 'no-store' }`.
|
|
151
81
|
*/
|
|
152
|
-
getRecommendations(request: RecommendationRequest): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
82
|
+
getRecommendations(request: RecommendationRequest, callOptions?: CallCacheOptions): Promise<ApiResponse<ApiSearchResult[]>>;
|
|
153
83
|
/**
|
|
154
84
|
* Record telemetry event
|
|
155
85
|
* SMI-4119: Enqueue to in-memory batcher instead of POSTing immediately.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/api/client.js
CHANGED
|
@@ -6,29 +6,19 @@
|
|
|
6
6
|
* SMI-4119: `recordEvent` batches via EventBatcher (see client.events.ts).
|
|
7
7
|
*/
|
|
8
8
|
import { SkillsmithError, ErrorCodes } from '../errors.js';
|
|
9
|
+
import { ApiClientError, } from './client.types.js';
|
|
10
|
+
export { ApiClientError, } from './client.types.js';
|
|
9
11
|
// Import from extracted modules
|
|
10
12
|
import { SearchResponseSchema, SingleSkillResponseSchema } from './schemas.js';
|
|
11
13
|
import { calculateBackoff, buildRequestHeaders, DEFAULT_BASE_URL, PRODUCTION_ANON_KEY, } from './utils.js';
|
|
12
14
|
import { checkApiHealth } from './client.health.js';
|
|
13
15
|
import { buildClientEventBatcher } from './client.events.js';
|
|
16
|
+
import { ApiCache } from './cache.js';
|
|
17
|
+
import { buildResponseCache, withResponseCache } from './client.cache.js';
|
|
14
18
|
// Re-export for backwards compatibility
|
|
15
19
|
export { generateAnonymousId } from './utils.js';
|
|
16
20
|
export { checkApiHealth } from './client.health.js';
|
|
17
21
|
export { ApiSearchResultSchema, SearchResponseSchema, SingleSkillResponseSchema, TelemetryResponseSchema, TrustTierSchema, } from './schemas.js';
|
|
18
|
-
/**
|
|
19
|
-
* Custom error class for API client errors with retry control
|
|
20
|
-
* SMI-1257: Replace string-based retry skip with custom error class
|
|
21
|
-
*/
|
|
22
|
-
export class ApiClientError extends Error {
|
|
23
|
-
retryable;
|
|
24
|
-
statusCode;
|
|
25
|
-
constructor(message, retryable = false, statusCode) {
|
|
26
|
-
super(message);
|
|
27
|
-
this.retryable = retryable;
|
|
28
|
-
this.statusCode = statusCode;
|
|
29
|
-
this.name = 'ApiClientError';
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
22
|
// ============================================================================
|
|
33
23
|
// API Client Class
|
|
34
24
|
// ============================================================================
|
|
@@ -45,6 +35,8 @@ export class SkillsmithApiClient {
|
|
|
45
35
|
offlineMode;
|
|
46
36
|
/** SMI-4119: Lazily-initialized batcher for telemetry events. */
|
|
47
37
|
eventBatcher = null;
|
|
38
|
+
/** SMI-4120: Response cache (null when disabled). */
|
|
39
|
+
responseCache = null;
|
|
48
40
|
constructor(config = {}) {
|
|
49
41
|
// SMI-1948: DEFAULT_BASE_URL now always has a value (production URL fallback)
|
|
50
42
|
// Priority: config.baseUrl > DEFAULT_BASE_URL (which checks env vars internally)
|
|
@@ -60,6 +52,11 @@ export class SkillsmithApiClient {
|
|
|
60
52
|
this.timeout = config.timeout ?? 30000;
|
|
61
53
|
this.maxRetries = config.maxRetries ?? 3;
|
|
62
54
|
this.debug = config.debug ?? false;
|
|
55
|
+
this.responseCache = buildResponseCache(config.cache);
|
|
56
|
+
}
|
|
57
|
+
/** SMI-4120: Expose the response cache (null when disabled). */
|
|
58
|
+
getResponseCache() {
|
|
59
|
+
return this.responseCache;
|
|
63
60
|
}
|
|
64
61
|
/**
|
|
65
62
|
* Check if client is running in offline mode
|
|
@@ -198,8 +195,9 @@ export class SkillsmithApiClient {
|
|
|
198
195
|
/**
|
|
199
196
|
* Search for skills
|
|
200
197
|
* SMI-1258: Validates response against SearchResponseSchema
|
|
198
|
+
* SMI-4120: Client LRU cache; opt-out via `{ cache: 'no-store' }`.
|
|
201
199
|
*/
|
|
202
|
-
async search(options) {
|
|
200
|
+
async search(options, callOptions) {
|
|
203
201
|
const params = new URLSearchParams();
|
|
204
202
|
params.set('query', options.query);
|
|
205
203
|
if (options.limit)
|
|
@@ -212,27 +210,36 @@ export class SkillsmithApiClient {
|
|
|
212
210
|
params.set('min_score', String(options.minQualityScore));
|
|
213
211
|
if (options.category)
|
|
214
212
|
params.set('category', options.category);
|
|
215
|
-
|
|
213
|
+
const endpoint = `/skills-search?${params.toString()}`;
|
|
214
|
+
return withResponseCache(this.responseCache, 'search', endpoint, callOptions?.cache === 'no-store', () => this.request(endpoint, {}, SearchResponseSchema));
|
|
216
215
|
}
|
|
217
216
|
/**
|
|
218
217
|
* Get skill by ID
|
|
219
218
|
* SMI-1258: Validates response against SingleSkillResponseSchema
|
|
220
219
|
* SMI-3672: Added includeContent option to fetch SKILL.md content
|
|
220
|
+
* SMI-4120: Client LRU cache; opt-out via `{ cache: 'no-store' }`.
|
|
221
221
|
*/
|
|
222
222
|
async getSkill(id, options) {
|
|
223
223
|
const encodedId = encodeURIComponent(id);
|
|
224
224
|
const contentParam = options?.includeContent ? '&include_content=true' : '';
|
|
225
|
-
|
|
225
|
+
const endpoint = `/skills-get?id=${encodedId}${contentParam}`;
|
|
226
|
+
return withResponseCache(this.responseCache, 'getSkill', endpoint, options?.cache === 'no-store', () => this.request(endpoint, {}, SingleSkillResponseSchema));
|
|
226
227
|
}
|
|
227
228
|
/**
|
|
228
229
|
* Get skill recommendations based on tech stack
|
|
229
230
|
* SMI-1258: Validates response against SearchResponseSchema
|
|
231
|
+
* SMI-4120: Client LRU cache; opt-out via `{ cache: 'no-store' }`.
|
|
230
232
|
*/
|
|
231
|
-
async getRecommendations(request) {
|
|
232
|
-
|
|
233
|
+
async getRecommendations(request, callOptions) {
|
|
234
|
+
const cacheKey = ApiCache.createKey('/skills-recommend', {
|
|
235
|
+
stack: [...request.stack].sort(),
|
|
236
|
+
project_type: request.project_type ?? null,
|
|
237
|
+
limit: request.limit ?? null,
|
|
238
|
+
});
|
|
239
|
+
return withResponseCache(this.responseCache, 'recommend', cacheKey, callOptions?.cache === 'no-store', () => this.request('/skills-recommend', {
|
|
233
240
|
method: 'POST',
|
|
234
241
|
body: JSON.stringify(request),
|
|
235
|
-
}, SearchResponseSchema);
|
|
242
|
+
}, SearchResponseSchema));
|
|
236
243
|
}
|
|
237
244
|
/**
|
|
238
245
|
* Record telemetry event
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -66,9 +66,9 @@ export declare const TelemetryEventSchema: z.ZodObject<{
|
|
|
66
66
|
skill_install: "skill_install";
|
|
67
67
|
skill_uninstall: "skill_uninstall";
|
|
68
68
|
search: "search";
|
|
69
|
+
recommend: "recommend";
|
|
69
70
|
skill_view: "skill_view";
|
|
70
71
|
skill_rate: "skill_rate";
|
|
71
|
-
recommend: "recommend";
|
|
72
72
|
compare: "compare";
|
|
73
73
|
validate: "validate";
|
|
74
74
|
}>;
|
|
@@ -85,9 +85,9 @@ export declare const TelemetryEventBatchSchema: z.ZodObject<{
|
|
|
85
85
|
skill_install: "skill_install";
|
|
86
86
|
skill_uninstall: "skill_uninstall";
|
|
87
87
|
search: "search";
|
|
88
|
+
recommend: "recommend";
|
|
88
89
|
skill_view: "skill_view";
|
|
89
90
|
skill_rate: "skill_rate";
|
|
90
|
-
recommend: "recommend";
|
|
91
91
|
compare: "compare";
|
|
92
92
|
validate: "validate";
|
|
93
93
|
}>;
|
|
@@ -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"}
|