@skillsmith/core 0.4.17 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts +19 -21
- 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 +39 -33
- package/dist/src/api/client.js.map +1 -1
- 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/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 +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -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/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,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
|
+
skill_view: "skill_view";
|
|
70
|
+
skill_rate: "skill_rate";
|
|
71
|
+
recommend: "recommend";
|
|
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
|
+
skill_view: "skill_view";
|
|
89
|
+
skill_rate: "skill_rate";
|
|
90
|
+
recommend: "recommend";
|
|
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":"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,8EAA8E;IAC9E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACzC,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,qCAAqC;AACrC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;QACZ,YAAY;QACZ,eAAe;QACf,iBAAiB;QACjB,YAAY;QACZ,QAAQ;QACR,WAAW;QACX,SAAS;QACT,UAAU;KACX,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACrD,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC;SACN,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB,CAAC,CACH;SACA,QAAQ,EAAE;CACd,CAAC,CAAA;AAMF,+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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Runner
|
|
3
|
+
*
|
|
4
|
+
* Extracted from schema.ts (SMI-3910) to keep schema.ts focused on
|
|
5
|
+
* schema definition and database creation.
|
|
6
|
+
*
|
|
7
|
+
* Handles running pending migrations against the database, with
|
|
8
|
+
* graceful handling of duplicate-column errors from migrations that
|
|
9
|
+
* add columns already present in the initial schema.
|
|
10
|
+
*
|
|
11
|
+
* IMPORTANT: Uses db.exec(migration.sql) directly instead of splitting
|
|
12
|
+
* by semicolon. Splitting breaks trigger bodies (e.g., FTS5 sync triggers).
|
|
13
|
+
* See MEMORY.md "SCHEMA_SQL semicolon-split trap".
|
|
14
|
+
*/
|
|
15
|
+
import type { Database } from './database-interface.js';
|
|
16
|
+
/**
|
|
17
|
+
* Migration definition for schema upgrades
|
|
18
|
+
*/
|
|
19
|
+
export interface Migration {
|
|
20
|
+
version: number;
|
|
21
|
+
description: string;
|
|
22
|
+
sql: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const MIGRATIONS: Migration[];
|
|
25
|
+
/**
|
|
26
|
+
* Get the current schema version from the database
|
|
27
|
+
*/
|
|
28
|
+
export declare function getSchemaVersion(db: Database): number;
|
|
29
|
+
/**
|
|
30
|
+
* Run pending migrations to upgrade the schema.
|
|
31
|
+
*
|
|
32
|
+
* Uses db.exec(migration.sql) directly — never splits by semicolon,
|
|
33
|
+
* which would break trigger bodies. Duplicate-column errors are caught
|
|
34
|
+
* at the full-SQL level.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runMigrations(db: Database): number;
|
|
37
|
+
/**
|
|
38
|
+
* SMI-974: Run migrations with error handling for existing columns.
|
|
39
|
+
*
|
|
40
|
+
* Like runMigrations but wraps each migration in try/catch so a single
|
|
41
|
+
* failure doesn't prevent subsequent migrations from running.
|
|
42
|
+
*/
|
|
43
|
+
export declare function runMigrationsSafe(db: Database): number;
|
|
44
|
+
//# sourceMappingURL=migration-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-runner.d.ts","sourceRoot":"","sources":["../../../src/db/migration-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAcvD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;CACZ;AAID,eAAO,MAAM,UAAU,EAAE,SAAS,EAkEjC,CAAA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CASrD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAqBlD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAiCtD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Runner
|
|
3
|
+
*
|
|
4
|
+
* Extracted from schema.ts (SMI-3910) to keep schema.ts focused on
|
|
5
|
+
* schema definition and database creation.
|
|
6
|
+
*
|
|
7
|
+
* Handles running pending migrations against the database, with
|
|
8
|
+
* graceful handling of duplicate-column errors from migrations that
|
|
9
|
+
* add columns already present in the initial schema.
|
|
10
|
+
*
|
|
11
|
+
* IMPORTANT: Uses db.exec(migration.sql) directly instead of splitting
|
|
12
|
+
* by semicolon. Splitting breaks trigger bodies (e.g., FTS5 sync triggers).
|
|
13
|
+
* See MEMORY.md "SCHEMA_SQL semicolon-split trap".
|
|
14
|
+
*/
|
|
15
|
+
import { MIGRATION_V2_SQL } from './migrations/v2-phase5-columns.js';
|
|
16
|
+
import { MIGRATION_V3_SQL } from './migrations/v3-sync-tables.js';
|
|
17
|
+
import { MIGRATION_V4_SQL } from './migrations/v4-security-columns.js';
|
|
18
|
+
import { MIGRATION_V5_SQL } from './migrations/v5-skill-versions.js';
|
|
19
|
+
import { MIGRATION_V5B_SQL } from './migrations/v5b-change-type.js';
|
|
20
|
+
import { MIGRATION_V6_SQL } from './migrations/v6-advisories.js';
|
|
21
|
+
import { MIGRATION_V7_SQL } from './migrations/v7-compatibility.js';
|
|
22
|
+
import { MIGRATION_V8_SQL } from './migrations/v8-co-installs.js';
|
|
23
|
+
import { MIGRATION_V10_SQL } from './migrations/v10-dependencies.js';
|
|
24
|
+
import { MIGRATION_V12_SQL } from './migrations/v12-risk-score-history.js';
|
|
25
|
+
import { MIGRATION_V13_SQL } from './migrations/v13-team-tables.js';
|
|
26
|
+
import { SCHEMA_SQL, FTS5_MIGRATION_SQL } from './schema-sql.js';
|
|
27
|
+
// Reserved: v14 (RBAC), v15 (integrations)
|
|
28
|
+
export const MIGRATIONS = [
|
|
29
|
+
{
|
|
30
|
+
version: 1,
|
|
31
|
+
description: 'Initial schema creation',
|
|
32
|
+
sql: SCHEMA_SQL,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
version: 2,
|
|
36
|
+
description: 'SMI-974: Add missing columns for Phase 5 imported databases',
|
|
37
|
+
sql: MIGRATION_V2_SQL,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
version: 3,
|
|
41
|
+
description: 'Registry sync tables for local-to-live synchronization',
|
|
42
|
+
sql: MIGRATION_V3_SQL,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
version: 4,
|
|
46
|
+
description: 'SMI-825: Add security scan columns to skills table',
|
|
47
|
+
sql: MIGRATION_V4_SQL,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
version: 5,
|
|
51
|
+
description: 'SMI-skill-version-tracking Wave 1: skill_versions table',
|
|
52
|
+
sql: MIGRATION_V5_SQL,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
version: 6,
|
|
56
|
+
description: 'SMI-skill-version-tracking Wave 2: add change_type to skill_versions',
|
|
57
|
+
sql: MIGRATION_V5B_SQL,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
version: 7,
|
|
61
|
+
description: 'SMI-skill-version-tracking Wave 3: skill_advisories table',
|
|
62
|
+
sql: MIGRATION_V6_SQL,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
version: 8,
|
|
66
|
+
description: 'SMI-2760: compatibility column on skills table',
|
|
67
|
+
sql: MIGRATION_V7_SQL,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
version: 9,
|
|
71
|
+
description: 'SMI-2761: skill_co_installs table for co-install recommendations',
|
|
72
|
+
sql: MIGRATION_V8_SQL,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
version: 10,
|
|
76
|
+
description: 'Skill dependency intelligence: skill_dependencies table',
|
|
77
|
+
sql: MIGRATION_V10_SQL,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
version: 11,
|
|
81
|
+
description: 'SMI-3510: content_hash column for tamper detection',
|
|
82
|
+
sql: 'ALTER TABLE skills ADD COLUMN content_hash TEXT',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
version: 12,
|
|
86
|
+
description: 'SMI-3864: risk_score_history table for trend detection',
|
|
87
|
+
sql: MIGRATION_V12_SQL,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
version: 13,
|
|
91
|
+
description: 'SMI-3896: visibility and team_id columns for private skills',
|
|
92
|
+
sql: MIGRATION_V13_SQL,
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
/**
|
|
96
|
+
* Get the current schema version from the database
|
|
97
|
+
*/
|
|
98
|
+
export function getSchemaVersion(db) {
|
|
99
|
+
try {
|
|
100
|
+
const result = db.prepare('SELECT MAX(version) as version FROM schema_version').get();
|
|
101
|
+
return result?.version ?? 0;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Run pending migrations to upgrade the schema.
|
|
109
|
+
*
|
|
110
|
+
* Uses db.exec(migration.sql) directly — never splits by semicolon,
|
|
111
|
+
* which would break trigger bodies. Duplicate-column errors are caught
|
|
112
|
+
* at the full-SQL level.
|
|
113
|
+
*/
|
|
114
|
+
export function runMigrations(db) {
|
|
115
|
+
const currentVersion = getSchemaVersion(db);
|
|
116
|
+
let migrationsRun = 0;
|
|
117
|
+
for (const migration of MIGRATIONS) {
|
|
118
|
+
if (migration.version > currentVersion) {
|
|
119
|
+
try {
|
|
120
|
+
db.exec(migration.sql);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
// Ignore "duplicate column" errors - column already exists from initial schema
|
|
124
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
125
|
+
if (!msg.includes('duplicate column')) {
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(migration.version);
|
|
130
|
+
migrationsRun++;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return migrationsRun;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* SMI-974: Run migrations with error handling for existing columns.
|
|
137
|
+
*
|
|
138
|
+
* Like runMigrations but wraps each migration in try/catch so a single
|
|
139
|
+
* failure doesn't prevent subsequent migrations from running.
|
|
140
|
+
*/
|
|
141
|
+
export function runMigrationsSafe(db) {
|
|
142
|
+
const currentVersion = getSchemaVersion(db);
|
|
143
|
+
let migrationsRun = 0;
|
|
144
|
+
for (const migration of MIGRATIONS) {
|
|
145
|
+
if (migration.version > currentVersion) {
|
|
146
|
+
try {
|
|
147
|
+
try {
|
|
148
|
+
db.exec(migration.sql);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Ignore "duplicate column" errors - column already exists
|
|
152
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
153
|
+
if (!msg.includes('duplicate column')) {
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(migration.version);
|
|
158
|
+
migrationsRun++;
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
// Log but don't fail on migration errors
|
|
162
|
+
console.warn(`Migration ${migration.version} failed:`, error);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Try to create FTS5 table (may already exist)
|
|
167
|
+
try {
|
|
168
|
+
db.exec(FTS5_MIGRATION_SQL);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// FTS5 may already exist or have issues - that's ok
|
|
172
|
+
}
|
|
173
|
+
return migrationsRun;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=migration-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-runner.js","sourceRoot":"","sources":["../../../src/db/migration-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/db/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/db/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAKvE,YAAY,EACV,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EAEX,YAAY,EACZ,gBAAgB,EACjB,MAAM,sBAAsB,CAAA;AAM7B,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,mBAAmB,CAuD9E;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmBhE;AAqBD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,YAAyC,GACjD,WAAW,CAiLb;AAMD,wBAAgB,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CACnD;IACE,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB,EACD,WAAW,GAAG,gBAAgB,CAC/B,CAcA;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,IAAI,CAkBN;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,EACpD,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAuBR;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,SAAK,GAAG,gBAAgB,EAAE,CAI/E"}
|
package/dist/src/db/migration.js
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @see migration-types.ts for type definitions
|
|
9
9
|
*/
|
|
10
|
-
import { SCHEMA_VERSION
|
|
10
|
+
import { SCHEMA_VERSION } from './schema.js';
|
|
11
|
+
import { getSchemaVersion, runMigrationsSafe, MIGRATIONS } from './migration-runner.js';
|
|
11
12
|
// ============================================================================
|
|
12
13
|
// SMI-1446: Schema Version Compatibility
|
|
13
14
|
// ============================================================================
|