@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.
Files changed (202) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/api/client.d.ts +19 -21
  4. package/dist/src/api/client.d.ts.map +1 -1
  5. package/dist/src/api/client.events.d.ts +39 -0
  6. package/dist/src/api/client.events.d.ts.map +1 -0
  7. package/dist/src/api/client.events.js +77 -0
  8. package/dist/src/api/client.events.js.map +1 -0
  9. package/dist/src/api/client.js +39 -33
  10. package/dist/src/api/client.js.map +1 -1
  11. package/dist/src/api/event-batcher.d.ts +81 -0
  12. package/dist/src/api/event-batcher.d.ts.map +1 -0
  13. package/dist/src/api/event-batcher.js +191 -0
  14. package/dist/src/api/event-batcher.js.map +1 -0
  15. package/dist/src/api/index.d.ts +1 -0
  16. package/dist/src/api/index.d.ts.map +1 -1
  17. package/dist/src/api/index.js +2 -0
  18. package/dist/src/api/index.js.map +1 -1
  19. package/dist/src/api/schemas.d.ts +58 -0
  20. package/dist/src/api/schemas.d.ts.map +1 -1
  21. package/dist/src/api/schemas.js +45 -0
  22. package/dist/src/api/schemas.js.map +1 -1
  23. package/dist/src/db/migration-runner.d.ts +44 -0
  24. package/dist/src/db/migration-runner.d.ts.map +1 -0
  25. package/dist/src/db/migration-runner.js +175 -0
  26. package/dist/src/db/migration-runner.js.map +1 -0
  27. package/dist/src/db/migration.d.ts.map +1 -1
  28. package/dist/src/db/migration.js +2 -1
  29. package/dist/src/db/migration.js.map +1 -1
  30. package/dist/src/db/migrations/v12-risk-score-history.d.ts +10 -0
  31. package/dist/src/db/migrations/v12-risk-score-history.d.ts.map +1 -0
  32. package/dist/src/db/migrations/v12-risk-score-history.js +25 -0
  33. package/dist/src/db/migrations/v12-risk-score-history.js.map +1 -0
  34. package/dist/src/db/migrations/v13-team-tables.d.ts +11 -0
  35. package/dist/src/db/migrations/v13-team-tables.d.ts.map +1 -0
  36. package/dist/src/db/migrations/v13-team-tables.js +14 -0
  37. package/dist/src/db/migrations/v13-team-tables.js.map +1 -0
  38. package/dist/src/db/schema-sql.d.ts +16 -0
  39. package/dist/src/db/schema-sql.d.ts.map +1 -0
  40. package/dist/src/db/schema-sql.js +161 -0
  41. package/dist/src/db/schema-sql.js.map +1 -0
  42. package/dist/src/db/schema.d.ts +7 -32
  43. package/dist/src/db/schema.d.ts.map +1 -1
  44. package/dist/src/db/schema.js +13 -303
  45. package/dist/src/db/schema.js.map +1 -1
  46. package/dist/src/exports/repositories.d.ts +1 -0
  47. package/dist/src/exports/repositories.d.ts.map +1 -1
  48. package/dist/src/exports/repositories.js +4 -0
  49. package/dist/src/exports/repositories.js.map +1 -1
  50. package/dist/src/exports/services.d.ts +2 -1
  51. package/dist/src/exports/services.d.ts.map +1 -1
  52. package/dist/src/exports/services.js +1 -0
  53. package/dist/src/exports/services.js.map +1 -1
  54. package/dist/src/index.d.ts +1 -1
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +1 -1
  57. package/dist/src/index.js.map +1 -1
  58. package/dist/src/repositories/RiskScoreHistoryRepository.d.ts +37 -0
  59. package/dist/src/repositories/RiskScoreHistoryRepository.d.ts.map +1 -0
  60. package/dist/src/repositories/RiskScoreHistoryRepository.js +66 -0
  61. package/dist/src/repositories/RiskScoreHistoryRepository.js.map +1 -0
  62. package/dist/src/scoring/index.d.ts +1 -0
  63. package/dist/src/scoring/index.d.ts.map +1 -1
  64. package/dist/src/scoring/index.js +1 -0
  65. package/dist/src/scoring/index.js.map +1 -1
  66. package/dist/src/scoring/quality-score.d.ts +49 -0
  67. package/dist/src/scoring/quality-score.d.ts.map +1 -0
  68. package/dist/src/scoring/quality-score.js +73 -0
  69. package/dist/src/scoring/quality-score.js.map +1 -0
  70. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
  71. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  72. package/dist/src/security/index.d.ts +2 -0
  73. package/dist/src/security/index.d.ts.map +1 -1
  74. package/dist/src/security/index.js +2 -0
  75. package/dist/src/security/index.js.map +1 -1
  76. package/dist/src/security/risk-trend.d.ts +21 -0
  77. package/dist/src/security/risk-trend.d.ts.map +1 -0
  78. package/dist/src/security/risk-trend.js +81 -0
  79. package/dist/src/security/risk-trend.js.map +1 -0
  80. package/dist/src/security/scanner/SecurityScanner.d.ts +2 -0
  81. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  82. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
  83. package/dist/src/security/scanner/SecurityScanner.helpers.js +14 -8
  84. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
  85. package/dist/src/security/scanner/SecurityScanner.js +55 -1
  86. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  87. package/dist/src/security/scanner/index.d.ts +1 -1
  88. package/dist/src/security/scanner/index.d.ts.map +1 -1
  89. package/dist/src/security/scanner/index.js +1 -1
  90. package/dist/src/security/scanner/index.js.map +1 -1
  91. package/dist/src/security/scanner/patterns.d.ts +6 -0
  92. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  93. package/dist/src/security/scanner/patterns.js +25 -0
  94. package/dist/src/security/scanner/patterns.js.map +1 -1
  95. package/dist/src/security/scanner/types.d.ts +2 -1
  96. package/dist/src/security/scanner/types.d.ts.map +1 -1
  97. package/dist/src/security/scanner/weights.d.ts.map +1 -1
  98. package/dist/src/security/scanner/weights.js +1 -0
  99. package/dist/src/security/scanner/weights.js.map +1 -1
  100. package/dist/src/services/skill-config-schema.d.ts +36 -0
  101. package/dist/src/services/skill-config-schema.d.ts.map +1 -0
  102. package/dist/src/services/skill-config-schema.js +76 -0
  103. package/dist/src/services/skill-config-schema.js.map +1 -0
  104. package/dist/src/services/skill-installation.feedback.d.ts +24 -0
  105. package/dist/src/services/skill-installation.feedback.d.ts.map +1 -0
  106. package/dist/src/services/skill-installation.feedback.js +37 -0
  107. package/dist/src/services/skill-installation.feedback.js.map +1 -0
  108. package/dist/src/services/skill-installation.helpers.d.ts +33 -7
  109. package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
  110. package/dist/src/services/skill-installation.helpers.js +74 -32
  111. package/dist/src/services/skill-installation.helpers.js.map +1 -1
  112. package/dist/src/services/skill-installation.service.d.ts +8 -16
  113. package/dist/src/services/skill-installation.service.d.ts.map +1 -1
  114. package/dist/src/services/skill-installation.service.js +86 -37
  115. package/dist/src/services/skill-installation.service.js.map +1 -1
  116. package/dist/src/services/skill-installation.types.d.ts +22 -0
  117. package/dist/src/services/skill-installation.types.d.ts.map +1 -1
  118. package/dist/src/services/skill-installation.types.js.map +1 -1
  119. package/dist/src/types.d.ts +2 -0
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/tests/SecurityScanner.ai-defence.test.d.ts +6 -0
  122. package/dist/tests/SecurityScanner.ai-defence.test.d.ts.map +1 -0
  123. package/dist/tests/SecurityScanner.ai-defence.test.js +221 -0
  124. package/dist/tests/SecurityScanner.ai-defence.test.js.map +1 -0
  125. package/dist/tests/SecurityScanner.performance.test.d.ts +6 -0
  126. package/dist/tests/SecurityScanner.performance.test.d.ts.map +1 -0
  127. package/dist/tests/SecurityScanner.performance.test.js +132 -0
  128. package/dist/tests/SecurityScanner.performance.test.js.map +1 -0
  129. package/dist/tests/SecurityScanner.scoring.test.d.ts +6 -0
  130. package/dist/tests/SecurityScanner.scoring.test.d.ts.map +1 -0
  131. package/dist/tests/SecurityScanner.scoring.test.js +197 -0
  132. package/dist/tests/SecurityScanner.scoring.test.js.map +1 -0
  133. package/dist/tests/SecurityScanner.test.d.ts +2 -2
  134. package/dist/tests/SecurityScanner.test.js +2 -520
  135. package/dist/tests/SecurityScanner.test.js.map +1 -1
  136. package/dist/tests/SkillMatcher.test.js +5 -5
  137. package/dist/tests/SkillMatcher.test.js.map +1 -1
  138. package/dist/tests/db/schema-migrations.test.js +8 -6
  139. package/dist/tests/db/schema-migrations.test.js.map +1 -1
  140. package/dist/tests/integration/events-batch-contract.test.d.ts +12 -0
  141. package/dist/tests/integration/events-batch-contract.test.d.ts.map +1 -0
  142. package/dist/tests/integration/events-batch-contract.test.js +69 -0
  143. package/dist/tests/integration/events-batch-contract.test.js.map +1 -0
  144. package/dist/tests/scoring/quality-score.test.d.ts +7 -0
  145. package/dist/tests/scoring/quality-score.test.d.ts.map +1 -0
  146. package/dist/tests/scoring/quality-score.test.js +78 -0
  147. package/dist/tests/scoring/quality-score.test.js.map +1 -0
  148. package/dist/tests/security/ContinuousSecurity.false-positives.test.d.ts +6 -0
  149. package/dist/tests/security/ContinuousSecurity.false-positives.test.d.ts.map +1 -0
  150. package/dist/tests/security/ContinuousSecurity.false-positives.test.js +89 -0
  151. package/dist/tests/security/ContinuousSecurity.false-positives.test.js.map +1 -0
  152. package/dist/tests/security/ContinuousSecurity.performance.test.d.ts +6 -0
  153. package/dist/tests/security/ContinuousSecurity.performance.test.d.ts.map +1 -0
  154. package/dist/tests/security/ContinuousSecurity.performance.test.js +177 -0
  155. package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -0
  156. package/dist/tests/security/ContinuousSecurity.reporting.test.d.ts +6 -0
  157. package/dist/tests/security/ContinuousSecurity.reporting.test.d.ts.map +1 -0
  158. package/dist/tests/security/ContinuousSecurity.reporting.test.js +106 -0
  159. package/dist/tests/security/ContinuousSecurity.reporting.test.js.map +1 -0
  160. package/dist/tests/security/ContinuousSecurity.test.d.ts +9 -2
  161. package/dist/tests/security/ContinuousSecurity.test.d.ts.map +1 -1
  162. package/dist/tests/security/ContinuousSecurity.test.js +9 -336
  163. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  164. package/dist/tests/security/pii-detection.test.d.ts +7 -0
  165. package/dist/tests/security/pii-detection.test.d.ts.map +1 -0
  166. package/dist/tests/security/pii-detection.test.js +91 -0
  167. package/dist/tests/security/pii-detection.test.js.map +1 -0
  168. package/dist/tests/security/risk-trend.test.d.ts +6 -0
  169. package/dist/tests/security/risk-trend.test.d.ts.map +1 -0
  170. package/dist/tests/security/risk-trend.test.js +68 -0
  171. package/dist/tests/security/risk-trend.test.js.map +1 -0
  172. package/dist/tests/security/scanner-regression-guard.test.d.ts +12 -0
  173. package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -0
  174. package/dist/tests/security/scanner-regression-guard.test.js +111 -0
  175. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -0
  176. package/dist/tests/services/aidefence-feedback.test.d.ts +6 -0
  177. package/dist/tests/services/aidefence-feedback.test.d.ts.map +1 -0
  178. package/dist/tests/services/aidefence-feedback.test.js +115 -0
  179. package/dist/tests/services/aidefence-feedback.test.js.map +1 -0
  180. package/dist/tests/services/dep-quarantine-check.test.d.ts +5 -0
  181. package/dist/tests/services/dep-quarantine-check.test.d.ts.map +1 -0
  182. package/dist/tests/services/dep-quarantine-check.test.js +92 -0
  183. package/dist/tests/services/dep-quarantine-check.test.js.map +1 -0
  184. package/dist/tests/services/skill-config-schema.test.d.ts +5 -0
  185. package/dist/tests/services/skill-config-schema.test.d.ts.map +1 -0
  186. package/dist/tests/services/skill-config-schema.test.js +98 -0
  187. package/dist/tests/services/skill-config-schema.test.js.map +1 -0
  188. package/dist/tests/unit/api-client-events.test.d.ts +10 -0
  189. package/dist/tests/unit/api-client-events.test.d.ts.map +1 -0
  190. package/dist/tests/unit/api-client-events.test.js +73 -0
  191. package/dist/tests/unit/api-client-events.test.js.map +1 -0
  192. package/dist/tests/unit/event-batcher.test.d.ts +13 -0
  193. package/dist/tests/unit/event-batcher.test.d.ts.map +1 -0
  194. package/dist/tests/unit/event-batcher.test.js +155 -0
  195. package/dist/tests/unit/event-batcher.test.js.map +1 -0
  196. package/dist/tests/unit/services/skill-installation-extended.test.d.ts +8 -0
  197. package/dist/tests/unit/services/skill-installation-extended.test.d.ts.map +1 -0
  198. package/dist/tests/unit/services/skill-installation-extended.test.js +423 -0
  199. package/dist/tests/unit/services/skill-installation-extended.test.js.map +1 -0
  200. package/dist/tests/unit/services/skill-installation.service.test.js +0 -390
  201. package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
  202. 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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"}
@@ -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;AAMpB,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"}
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"}
@@ -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;;;;;;;;;;;;;;;;;;;;iBAchC,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;;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"}
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"}
@@ -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,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;AAIvE,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"}
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"}
@@ -7,7 +7,8 @@
7
7
  *
8
8
  * @see migration-types.ts for type definitions
9
9
  */
10
- import { SCHEMA_VERSION, getSchemaVersion, runMigrationsSafe, MIGRATIONS } from './schema.js';
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
  // ============================================================================