@skillsmith/core 0.4.13 → 0.4.15
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/README.md +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analytics/storage.d.ts +8 -2
- package/dist/src/analytics/storage.d.ts.map +1 -1
- package/dist/src/analytics/storage.js +16 -5
- package/dist/src/analytics/storage.js.map +1 -1
- package/dist/src/analytics/usage-tracker.d.ts +8 -2
- package/dist/src/analytics/usage-tracker.d.ts.map +1 -1
- package/dist/src/analytics/usage-tracker.js +24 -11
- package/dist/src/analytics/usage-tracker.js.map +1 -1
- package/dist/src/api/client.d.ts +1 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.health.d.ts +26 -0
- package/dist/src/api/client.health.d.ts.map +1 -0
- package/dist/src/api/client.health.js +74 -0
- package/dist/src/api/client.health.js.map +1 -0
- package/dist/src/api/client.js +3 -51
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/benchmarks/IndexBenchmark.js +2 -2
- package/dist/src/benchmarks/IndexBenchmark.js.map +1 -1
- package/dist/src/benchmarks/SearchBenchmark.js +2 -2
- package/dist/src/benchmarks/SearchBenchmark.js.map +1 -1
- package/dist/src/benchmarks/cacheBenchmark.js +2 -2
- package/dist/src/benchmarks/cacheBenchmark.js.map +1 -1
- package/dist/src/benchmarks/embeddingBenchmark.js +1 -1
- package/dist/src/benchmarks/embeddingBenchmark.js.map +1 -1
- package/dist/src/cache/CacheManager.d.ts +13 -2
- package/dist/src/cache/CacheManager.d.ts.map +1 -1
- package/dist/src/cache/CacheManager.js +27 -6
- package/dist/src/cache/CacheManager.js.map +1 -1
- package/dist/src/cache/TieredCache.d.ts +15 -2
- package/dist/src/cache/TieredCache.d.ts.map +1 -1
- package/dist/src/cache/TieredCache.js +52 -70
- package/dist/src/cache/TieredCache.js.map +1 -1
- package/dist/src/cache/index.d.ts +12 -0
- package/dist/src/cache/index.d.ts.map +1 -1
- package/dist/src/cache/index.js +20 -1
- package/dist/src/cache/index.js.map +1 -1
- package/dist/src/cache/sqlite.d.ts +15 -1
- package/dist/src/cache/sqlite.d.ts.map +1 -1
- package/dist/src/cache/sqlite.js +22 -4
- package/dist/src/cache/sqlite.js.map +1 -1
- package/dist/src/db/createDatabase.d.ts +9 -1
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +21 -1
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +5 -2
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/db/migrations/v5-skill-versions.d.ts +30 -0
- package/dist/src/db/migrations/v5-skill-versions.d.ts.map +1 -0
- package/dist/src/db/migrations/v5-skill-versions.js +45 -0
- package/dist/src/db/migrations/v5-skill-versions.js.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.js +22 -0
- package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
- package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
- package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
- package/dist/src/db/migrations/v6-advisories.js +53 -0
- package/dist/src/db/migrations/v6-advisories.js.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.js +23 -0
- package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.js +33 -0
- package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
- package/dist/src/db/schema.d.ts +6 -11
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +38 -17
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.d.ts +14 -0
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.helpers.d.ts +4 -4
- package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.helpers.js +5 -5
- package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.js +32 -4
- package/dist/src/embeddings/hnsw-store.js.map +1 -1
- package/dist/src/embeddings/index.d.ts +15 -1
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +24 -4
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +5 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +17 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/types.d.ts +1 -1
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.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 +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +2 -0
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +8 -2
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.js +51 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -1
- package/dist/src/learning/PatternStore.js +19 -39
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
- package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.js +128 -0
- package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
- package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
- package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
- package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
- package/dist/src/repositories/CoInstallRepository.js +122 -0
- package/dist/src/repositories/CoInstallRepository.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +16 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/repositories/SkillVersionRepository.d.ts +82 -0
- package/dist/src/repositories/SkillVersionRepository.d.ts.map +1 -0
- package/dist/src/repositories/SkillVersionRepository.js +118 -0
- package/dist/src/repositories/SkillVersionRepository.js.map +1 -0
- package/dist/src/search/hybrid.d.ts +15 -4
- package/dist/src/search/hybrid.d.ts.map +1 -1
- package/dist/src/search/hybrid.js +25 -9
- package/dist/src/search/hybrid.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +4 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.d.ts +5 -81
- package/dist/src/services/TaskRunner.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.js +7 -68
- package/dist/src/services/TaskRunner.js.map +1 -1
- package/dist/src/services/TaskRunner.process.d.ts +33 -0
- package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.process.js +70 -0
- package/dist/src/services/TaskRunner.process.js.map +1 -0
- package/dist/src/services/TaskRunner.types.d.ts +76 -0
- package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.types.js +22 -0
- package/dist/src/services/TaskRunner.types.js.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
- package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.js +8 -205
- package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +2 -33
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +14 -238
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.memory.d.ts +67 -0
- package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
- package/dist/src/session/SessionManager.memory.js +262 -0
- package/dist/src/session/SessionManager.memory.js.map +1 -0
- package/dist/src/sync/SyncEngine.d.ts +13 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +50 -1
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.js +18 -130
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
- package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
- package/dist/src/types/skill.d.ts +10 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +34 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning/change-classifier.d.ts +38 -0
- package/dist/src/versioning/change-classifier.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.js +187 -0
- package/dist/src/versioning/change-classifier.js.map +1 -0
- package/dist/src/versioning/change-classifier.test.d.ts +6 -0
- package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.test.js +275 -0
- package/dist/src/versioning/change-classifier.test.js.map +1 -0
- package/dist/src/versioning/update-risk.d.ts +50 -0
- package/dist/src/versioning/update-risk.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.js +80 -0
- package/dist/src/versioning/update-risk.js.map +1 -0
- package/dist/src/versioning/update-risk.test.d.ts +6 -0
- package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.test.js +200 -0
- package/dist/src/versioning/update-risk.test.js.map +1 -0
- package/dist/tests/AnalyticsStorage.test.js +2 -2
- package/dist/tests/AnalyticsStorage.test.js.map +1 -1
- package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
- package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
- package/dist/tests/CacheManager.test.d.ts +9 -0
- package/dist/tests/CacheManager.test.d.ts.map +1 -0
- package/dist/tests/CacheManager.test.js +163 -0
- package/dist/tests/CacheManager.test.js.map +1 -0
- package/dist/tests/CacheSecurity.test.js +4 -4
- package/dist/tests/CacheSecurity.test.js.map +1 -1
- package/dist/tests/EmbeddingService.test.js +11 -12
- package/dist/tests/EmbeddingService.test.js.map +1 -1
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
- package/dist/tests/HybridSearch.test.d.ts +8 -0
- package/dist/tests/HybridSearch.test.d.ts.map +1 -0
- package/dist/tests/HybridSearch.test.js +48 -0
- package/dist/tests/HybridSearch.test.js.map +1 -0
- package/dist/tests/SearchService.test.js +71 -0
- package/dist/tests/SearchService.test.js.map +1 -1
- package/dist/tests/SkillVersionRepository.test.d.ts +2 -0
- package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -0
- package/dist/tests/SkillVersionRepository.test.js +168 -0
- package/dist/tests/SkillVersionRepository.test.js.map +1 -0
- package/dist/tests/TieredCache.test.js +10 -10
- package/dist/tests/TieredCache.test.js.map +1 -1
- package/dist/tests/UsageTracker.test.js +6 -6
- package/dist/tests/UsageTracker.test.js.map +1 -1
- package/dist/tests/analytics/usage-tracker.test.js +8 -8
- package/dist/tests/analytics/usage-tracker.test.js.map +1 -1
- package/dist/tests/api/client.health.test.d.ts +15 -0
- package/dist/tests/api/client.health.test.d.ts.map +1 -0
- package/dist/tests/api/client.health.test.js +111 -0
- package/dist/tests/api/client.health.test.js.map +1 -0
- package/dist/tests/cache.test.js +7 -9
- package/dist/tests/cache.test.js.map +1 -1
- package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
- package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
- package/dist/tests/db/database-abstraction.test.js +48 -0
- package/dist/tests/db/database-abstraction.test.js.map +1 -1
- package/dist/tests/db/schema-migrations.test.d.ts +10 -0
- package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
- package/dist/tests/db/schema-migrations.test.js +134 -0
- package/dist/tests/db/schema-migrations.test.js.map +1 -0
- package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
- package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
- package/dist/tests/db/sqljsDriver.test.js +75 -0
- package/dist/tests/db/sqljsDriver.test.js.map +1 -0
- package/dist/tests/embeddings/hnsw-store.test.js +27 -24
- package/dist/tests/embeddings/hnsw-store.test.js.map +1 -1
- package/dist/tests/helpers/database.d.ts +32 -0
- package/dist/tests/helpers/database.d.ts.map +1 -0
- package/dist/tests/helpers/database.js +54 -0
- package/dist/tests/helpers/database.js.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
- package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
- package/dist/tests/learning/PatternStore.test.js +9 -0
- package/dist/tests/learning/PatternStore.test.js.map +1 -1
- package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
- package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.js +150 -0
- package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.js +219 -0
- package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +32 -18
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
- package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
- package/package.json +1 -3
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SkillVersionRepository — persistent content-hash version tracking
|
|
3
|
+
* @module @skillsmith/core/repositories/SkillVersionRepository
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 1
|
|
5
|
+
*
|
|
6
|
+
* Records a content hash after every successful skill upsert so that the
|
|
7
|
+
* skill_updates MCP tool (Individual tier) can detect registry changes by
|
|
8
|
+
* comparing the locally-stored hash against the current registry hash.
|
|
9
|
+
*
|
|
10
|
+
* Design notes:
|
|
11
|
+
* - No FK on skill_id — soft reference, version history survives skill removal
|
|
12
|
+
* - recordVersion is idempotent via INSERT OR IGNORE on the unique index
|
|
13
|
+
* - pruneVersions keeps the 50 most-recent rows per skill (configurable)
|
|
14
|
+
*/
|
|
15
|
+
import type { Database as DatabaseType } from '../db/database-interface.js';
|
|
16
|
+
/**
|
|
17
|
+
* Raw database row for skill_versions
|
|
18
|
+
*/
|
|
19
|
+
export interface SkillVersionRow {
|
|
20
|
+
id: number;
|
|
21
|
+
skill_id: string;
|
|
22
|
+
content_hash: string;
|
|
23
|
+
recorded_at: number;
|
|
24
|
+
semver: string | null;
|
|
25
|
+
metadata: string | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Repository for reading and writing skill version records
|
|
29
|
+
*/
|
|
30
|
+
export declare class SkillVersionRepository {
|
|
31
|
+
private db;
|
|
32
|
+
constructor(db: DatabaseType);
|
|
33
|
+
/**
|
|
34
|
+
* Record a version hash for a skill.
|
|
35
|
+
*
|
|
36
|
+
* Idempotent: if (skill_id, content_hash) already exists the INSERT is
|
|
37
|
+
* silently ignored (INSERT OR IGNORE on the unique index).
|
|
38
|
+
*
|
|
39
|
+
* After inserting, prunes rows beyond keepCount to bound table growth.
|
|
40
|
+
*
|
|
41
|
+
* @param skillId Registry skill identifier
|
|
42
|
+
* @param contentHash SHA-256 hex digest
|
|
43
|
+
* @param semver Optional semver string
|
|
44
|
+
* @param metadata Optional JSON string for future extension
|
|
45
|
+
* @param keepCount Maximum rows to keep per skill (default 50)
|
|
46
|
+
*/
|
|
47
|
+
recordVersion(skillId: string, contentHash: string, semver?: string, metadata?: string, keepCount?: number): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get the most recently recorded version for a skill.
|
|
50
|
+
*
|
|
51
|
+
* @param skillId Registry skill identifier
|
|
52
|
+
* @returns Most recent SkillVersionRow or null if none recorded
|
|
53
|
+
*/
|
|
54
|
+
getLatestVersion(skillId: string): Promise<SkillVersionRow | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Get the full version history for a skill, newest first.
|
|
57
|
+
*
|
|
58
|
+
* @param skillId Registry skill identifier
|
|
59
|
+
* @param limit Maximum rows to return (default 20)
|
|
60
|
+
* @returns Array of SkillVersionRow ordered by recorded_at DESC
|
|
61
|
+
*/
|
|
62
|
+
getVersionHistory(skillId: string, limit?: number): Promise<SkillVersionRow[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Look up a specific version by its content hash.
|
|
65
|
+
*
|
|
66
|
+
* @param skillId Registry skill identifier
|
|
67
|
+
* @param contentHash SHA-256 hex digest to look up
|
|
68
|
+
* @returns Matching SkillVersionRow or null
|
|
69
|
+
*/
|
|
70
|
+
getVersionByHash(skillId: string, contentHash: string): Promise<SkillVersionRow | null>;
|
|
71
|
+
/**
|
|
72
|
+
* Prune version history to at most keepCount rows per skill.
|
|
73
|
+
*
|
|
74
|
+
* Uses the subquery pattern (DELETE WHERE id NOT IN SELECT … LIMIT)
|
|
75
|
+
* which is compatible with SQLite's restricted DELETE syntax.
|
|
76
|
+
*
|
|
77
|
+
* @param skillId Registry skill identifier
|
|
78
|
+
* @param keepCount Number of most-recent rows to retain (default 50)
|
|
79
|
+
*/
|
|
80
|
+
pruneVersions(skillId: string, keepCount?: number): Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=SkillVersionRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillVersionRepository.d.ts","sourceRoot":"","sources":["../../../src/repositories/SkillVersionRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAM3E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAMD;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,EAAE,YAAY;IAI5B;;;;;;;;;;;;;OAaG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,SAAK,GACb,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;OAKG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAcxE;;;;;;OAMG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAYhF;;;;;;OAMG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAc7F;;;;;;;;OAQG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAcpE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SkillVersionRepository — persistent content-hash version tracking
|
|
3
|
+
* @module @skillsmith/core/repositories/SkillVersionRepository
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 1
|
|
5
|
+
*
|
|
6
|
+
* Records a content hash after every successful skill upsert so that the
|
|
7
|
+
* skill_updates MCP tool (Individual tier) can detect registry changes by
|
|
8
|
+
* comparing the locally-stored hash against the current registry hash.
|
|
9
|
+
*
|
|
10
|
+
* Design notes:
|
|
11
|
+
* - No FK on skill_id — soft reference, version history survives skill removal
|
|
12
|
+
* - recordVersion is idempotent via INSERT OR IGNORE on the unique index
|
|
13
|
+
* - pruneVersions keeps the 50 most-recent rows per skill (configurable)
|
|
14
|
+
*/
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Repository
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Repository for reading and writing skill version records
|
|
20
|
+
*/
|
|
21
|
+
export class SkillVersionRepository {
|
|
22
|
+
db;
|
|
23
|
+
constructor(db) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Record a version hash for a skill.
|
|
28
|
+
*
|
|
29
|
+
* Idempotent: if (skill_id, content_hash) already exists the INSERT is
|
|
30
|
+
* silently ignored (INSERT OR IGNORE on the unique index).
|
|
31
|
+
*
|
|
32
|
+
* After inserting, prunes rows beyond keepCount to bound table growth.
|
|
33
|
+
*
|
|
34
|
+
* @param skillId Registry skill identifier
|
|
35
|
+
* @param contentHash SHA-256 hex digest
|
|
36
|
+
* @param semver Optional semver string
|
|
37
|
+
* @param metadata Optional JSON string for future extension
|
|
38
|
+
* @param keepCount Maximum rows to keep per skill (default 50)
|
|
39
|
+
*/
|
|
40
|
+
async recordVersion(skillId, contentHash, semver, metadata, keepCount = 50) {
|
|
41
|
+
this.db
|
|
42
|
+
.prepare(`INSERT OR IGNORE INTO skill_versions (skill_id, content_hash, semver, metadata)
|
|
43
|
+
VALUES (?, ?, ?, ?)`)
|
|
44
|
+
.run(skillId, contentHash, semver ?? null, metadata ?? null);
|
|
45
|
+
await this.pruneVersions(skillId, keepCount);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the most recently recorded version for a skill.
|
|
49
|
+
*
|
|
50
|
+
* @param skillId Registry skill identifier
|
|
51
|
+
* @returns Most recent SkillVersionRow or null if none recorded
|
|
52
|
+
*/
|
|
53
|
+
async getLatestVersion(skillId) {
|
|
54
|
+
const row = this.db
|
|
55
|
+
.prepare(`SELECT id, skill_id, content_hash, recorded_at, semver, metadata
|
|
56
|
+
FROM skill_versions
|
|
57
|
+
WHERE skill_id = ?
|
|
58
|
+
ORDER BY recorded_at DESC
|
|
59
|
+
LIMIT 1`)
|
|
60
|
+
.get(skillId);
|
|
61
|
+
return row ?? null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the full version history for a skill, newest first.
|
|
65
|
+
*
|
|
66
|
+
* @param skillId Registry skill identifier
|
|
67
|
+
* @param limit Maximum rows to return (default 20)
|
|
68
|
+
* @returns Array of SkillVersionRow ordered by recorded_at DESC
|
|
69
|
+
*/
|
|
70
|
+
async getVersionHistory(skillId, limit = 20) {
|
|
71
|
+
return this.db
|
|
72
|
+
.prepare(`SELECT id, skill_id, content_hash, recorded_at, semver, metadata
|
|
73
|
+
FROM skill_versions
|
|
74
|
+
WHERE skill_id = ?
|
|
75
|
+
ORDER BY recorded_at DESC
|
|
76
|
+
LIMIT ?`)
|
|
77
|
+
.all(skillId, limit);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Look up a specific version by its content hash.
|
|
81
|
+
*
|
|
82
|
+
* @param skillId Registry skill identifier
|
|
83
|
+
* @param contentHash SHA-256 hex digest to look up
|
|
84
|
+
* @returns Matching SkillVersionRow or null
|
|
85
|
+
*/
|
|
86
|
+
async getVersionByHash(skillId, contentHash) {
|
|
87
|
+
const row = this.db
|
|
88
|
+
.prepare(`SELECT id, skill_id, content_hash, recorded_at, semver, metadata
|
|
89
|
+
FROM skill_versions
|
|
90
|
+
WHERE skill_id = ?
|
|
91
|
+
AND content_hash = ?
|
|
92
|
+
LIMIT 1`)
|
|
93
|
+
.get(skillId, contentHash);
|
|
94
|
+
return row ?? null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Prune version history to at most keepCount rows per skill.
|
|
98
|
+
*
|
|
99
|
+
* Uses the subquery pattern (DELETE WHERE id NOT IN SELECT … LIMIT)
|
|
100
|
+
* which is compatible with SQLite's restricted DELETE syntax.
|
|
101
|
+
*
|
|
102
|
+
* @param skillId Registry skill identifier
|
|
103
|
+
* @param keepCount Number of most-recent rows to retain (default 50)
|
|
104
|
+
*/
|
|
105
|
+
async pruneVersions(skillId, keepCount = 50) {
|
|
106
|
+
this.db
|
|
107
|
+
.prepare(`DELETE FROM skill_versions
|
|
108
|
+
WHERE skill_id = ?
|
|
109
|
+
AND id NOT IN (
|
|
110
|
+
SELECT id FROM skill_versions
|
|
111
|
+
WHERE skill_id = ?
|
|
112
|
+
ORDER BY recorded_at DESC
|
|
113
|
+
LIMIT ?
|
|
114
|
+
)`)
|
|
115
|
+
.run(skillId, skillId, keepCount);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=SkillVersionRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillVersionRepository.js","sourceRoot":"","sources":["../../../src/repositories/SkillVersionRepository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAoBH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,sBAAsB;IACzB,EAAE,CAAc;IAExB,YAAY,EAAgB;QAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,WAAmB,EACnB,MAAe,EACf,QAAiB,EACjB,SAAS,GAAG,EAAE;QAEd,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;6BACqB,CACtB;aACA,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAA;QAE9D,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAC9C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;kBAIU,CACX;aACA,GAAG,CAAC,OAAO,CAAgC,CAAA;QAE9C,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CAAC,OAAe,EAAE,KAAK,GAAG,EAAE;QACjD,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN;;;;kBAIU,CACX;aACA,GAAG,CAAC,OAAO,EAAE,KAAK,CAAsB,CAAA;IAC7C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,WAAmB;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;kBAIU,CACX;aACA,GAAG,CAAC,OAAO,EAAE,WAAW,CAAgC,CAAA;QAE3D,OAAO,GAAG,IAAI,IAAI,CAAA;IACpB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,SAAS,GAAG,EAAE;QACjD,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;;;;cAOM,CACP;aACA,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IACrC,CAAC;CACF"}
|
|
@@ -30,10 +30,21 @@ export declare class HybridSearch {
|
|
|
30
30
|
private db;
|
|
31
31
|
private embeddings;
|
|
32
32
|
private cache;
|
|
33
|
-
private
|
|
34
|
-
private
|
|
35
|
-
private
|
|
36
|
-
|
|
33
|
+
private k;
|
|
34
|
+
private ftsWeight;
|
|
35
|
+
private semanticWeight;
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated Use HybridSearch.create(options) — async factory with WASM fallback.
|
|
38
|
+
* This constructor always throws to prevent silent data loss.
|
|
39
|
+
*/
|
|
40
|
+
constructor(_options: HybridSearchOptions);
|
|
41
|
+
/**
|
|
42
|
+
* Async factory — supports both native and WASM SQLite.
|
|
43
|
+
*
|
|
44
|
+
* @param options - Search options; dbPath is opened via createDatabaseAsync
|
|
45
|
+
* @returns Fully initialised HybridSearch instance
|
|
46
|
+
*/
|
|
47
|
+
static create(options: HybridSearchOptions): Promise<HybridSearch>;
|
|
37
48
|
private initFTS;
|
|
38
49
|
/**
|
|
39
50
|
* FTS5 keyword search
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../../src/search/hybrid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE3E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;AA0BD,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"hybrid.d.ts","sourceRoot":"","sources":["../../../src/search/hybrid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE3E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,CAAC,CAAC,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;AA0BD,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,CAAC,CAAS;IAClB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAE/B;;;OAGG;gBACS,QAAQ,EAAE,mBAAmB;IAOzC;;;;;OAKG;WACU,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBxE,OAAO,CAAC,OAAO;IAiDf;;OAEG;IACH,OAAO,CAAC,SAAS;IAwCjB;;OAEG;YACW,cAAc;IAoB5B;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IA6GzD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE;QACtB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjB;;OAEG;IACG,SAAS,CACb,MAAM,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAC,GACD,OAAO,CAAC,MAAM,CAAC;IAiClB;;OAEG;IACH,aAAa;;;;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SMI-584: Hybrid Search with Semantic Embeddings
|
|
3
3
|
* Combines FTS5 keyword search with vector similarity using RRF
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { createDatabaseAsync } from '../db/createDatabase.js';
|
|
6
6
|
import { EmbeddingService } from '../embeddings/index.js';
|
|
7
7
|
import { TieredCache, L1Cache } from '../cache/index.js';
|
|
8
8
|
/**
|
|
@@ -29,13 +29,28 @@ export class HybridSearch {
|
|
|
29
29
|
k;
|
|
30
30
|
ftsWeight;
|
|
31
31
|
semanticWeight;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Use HybridSearch.create(options) — async factory with WASM fallback.
|
|
34
|
+
* This constructor always throws to prevent silent data loss.
|
|
35
|
+
*/
|
|
36
|
+
constructor(_options) {
|
|
37
|
+
throw new Error('[HybridSearch] Cannot construct synchronously. ' +
|
|
38
|
+
'Use await HybridSearch.create(options) instead.');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Async factory — supports both native and WASM SQLite.
|
|
42
|
+
*
|
|
43
|
+
* @param options - Search options; dbPath is opened via createDatabaseAsync
|
|
44
|
+
* @returns Fully initialised HybridSearch instance
|
|
45
|
+
*/
|
|
46
|
+
static async create(options) {
|
|
47
|
+
const instance = Object.create(HybridSearch.prototype);
|
|
48
|
+
instance.db = await createDatabaseAsync(options.dbPath);
|
|
49
|
+
instance.embeddings = await EmbeddingService.create(options.dbPath);
|
|
50
|
+
instance.k = options.k ?? 60;
|
|
51
|
+
instance.ftsWeight = options.ftsWeight ?? 0.5;
|
|
52
|
+
instance.semanticWeight = options.semanticWeight ?? 0.5;
|
|
53
|
+
instance.cache = await TieredCache.create({
|
|
39
54
|
l1MaxSize: 100,
|
|
40
55
|
l2Options: options.cachePath
|
|
41
56
|
? {
|
|
@@ -44,7 +59,8 @@ export class HybridSearch {
|
|
|
44
59
|
}
|
|
45
60
|
: undefined,
|
|
46
61
|
});
|
|
47
|
-
|
|
62
|
+
instance.initFTS();
|
|
63
|
+
return instance;
|
|
48
64
|
}
|
|
49
65
|
initFTS() {
|
|
50
66
|
// Create skills table if not exists
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../../src/search/hybrid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hybrid.js","sourceRoot":"","sources":["../../../src/search/hybrid.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchService.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/SearchService.helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAEtD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyBnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"SearchService.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/SearchService.helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAEtD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyBnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAwB7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAyCvF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAS1E"}
|
|
@@ -72,6 +72,10 @@ export function rowToSkill(row) {
|
|
|
72
72
|
securityFindingsCount: row.security_findings_count ?? 0,
|
|
73
73
|
securityScannedAt: row.security_scanned_at,
|
|
74
74
|
securityPassed: row.security_passed === null ? null : row.security_passed === 1,
|
|
75
|
+
// SMI-2760: Compatibility tags
|
|
76
|
+
compatibility: row.compatibility && row.compatibility !== '[]'
|
|
77
|
+
? JSON.parse(row.compatibility)
|
|
78
|
+
: undefined,
|
|
75
79
|
createdAt: row.created_at,
|
|
76
80
|
updatedAt: row.updated_at,
|
|
77
81
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchService.helpers.js","sourceRoot":"","sources":["../../../src/services/SearchService.helpers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SearchService.helpers.js","sourceRoot":"","sources":["../../../src/services/SearchService.helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK;SACT,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,sDAAsD;SACvF,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,2BAA2B;SAChD,IAAI,EAAE,CAAA;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,uEAAuE;IACvE,4FAA4F;IAC5F,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;IACnD,MAAM,iBAAiB,GAAG,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,KAAK,CAAC,CAAA;IAChE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjG,IAAI,iBAAiB,IAAI,YAAY,EAAE,CAAC;QACtC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,2DAA2D;IAC3D,MAAM,MAAM,GAAG,KAAK;SACjB,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA,CAAC,qCAAqC;IAEpE,gDAAgD;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAA;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,SAAS,EAAE,GAAG,CAAC,UAAuB;QACtC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;QAClC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,KAAK;QACrC,gCAAgC;QAChC,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,qBAAqB,EAAE,GAAG,CAAC,uBAAuB,IAAI,CAAC;QACvD,iBAAiB,EAAE,GAAG,CAAC,mBAAmB;QAC1C,cAAc,EAAE,GAAG,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC;QAC/E,+BAA+B;QAC/B,aAAa,EACX,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI;YAC7C,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAc;YAC7C,CAAC,CAAC,SAAS;QACf,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,KAAa;IACzD,MAAM,UAAU,GAA+B,EAAE,CAAA;IAEjD,2CAA2C;IAC3C,MAAM,KAAK,GAAG,KAAK;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;SAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;IAEjD,2BAA2B;IAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAA;IAEzC,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAC3E,IAAI,CACL,CAAA;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IAChE,CAAC;IAED,2BAA2B;IAC3B,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,uDAAuD;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;YAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAA;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;YAE5E,IAAI,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACjD,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;YACxC,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM;gBAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAAA;YAE7D,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAa;IAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC7B,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAEhD,OAAO;QACL,KAAK;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,+BAA+B;QACzD,UAAU;KACX,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchService.types.d.ts","sourceRoot":"","sources":["../../../src/services/SearchService.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;IAE3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"SearchService.types.d.ts","sourceRoot":"","sources":["../../../src/services/SearchService.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;IAE3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAE9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-1662: TaskRunner - Background Task Timeout Management
|
|
3
|
+
* @see SMI-2741: Types split to TaskRunner.types.ts, process utils to TaskRunner.process.ts
|
|
3
4
|
*
|
|
4
5
|
* Provides configurable timeout enforcement for background Task agents.
|
|
5
6
|
* Addresses orphaned process memory leaks identified in incident 2026-01-22.
|
|
@@ -23,75 +24,10 @@
|
|
|
23
24
|
* await runner.cleanupOrphaned()
|
|
24
25
|
* ```
|
|
25
26
|
*/
|
|
26
|
-
import { type
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export declare const DEFAULT_TASK_TIMEOUT_MS = 600000;
|
|
31
|
-
/**
|
|
32
|
-
* Grace period before SIGKILL after SIGTERM: 5 seconds
|
|
33
|
-
*/
|
|
34
|
-
export declare const SIGKILL_GRACE_PERIOD_MS = 5000;
|
|
35
|
-
/**
|
|
36
|
-
* Warning threshold: 80% of timeout
|
|
37
|
-
*/
|
|
38
|
-
export declare const WARNING_THRESHOLD_RATIO = 0.8;
|
|
39
|
-
/**
|
|
40
|
-
* Configuration options for TaskRunner
|
|
41
|
-
*/
|
|
42
|
-
export interface TaskRunnerConfig {
|
|
43
|
-
/** Timeout in milliseconds (default: 600000 = 10 minutes) */
|
|
44
|
-
timeoutMs?: number;
|
|
45
|
-
/** Enable debug logging (default: false) */
|
|
46
|
-
debug?: boolean;
|
|
47
|
-
/** Custom logger instance */
|
|
48
|
-
logger?: Logger;
|
|
49
|
-
/** Callback when a task times out */
|
|
50
|
-
onTimeout?: (task: TrackedTask) => void;
|
|
51
|
-
/** Callback when warning threshold is reached */
|
|
52
|
-
onWarning?: (task: TrackedTask, remainingMs: number) => void;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Status of a tracked task
|
|
56
|
-
*/
|
|
57
|
-
export type TaskStatus = 'running' | 'completed' | 'failed' | 'timeout' | 'killed';
|
|
58
|
-
/**
|
|
59
|
-
* A tracked background task
|
|
60
|
-
*/
|
|
61
|
-
export interface TrackedTask {
|
|
62
|
-
/** Unique task identifier */
|
|
63
|
-
id: string;
|
|
64
|
-
/** Process ID of the background task */
|
|
65
|
-
pid: number;
|
|
66
|
-
/** Human-readable description */
|
|
67
|
-
description: string;
|
|
68
|
-
/** When the task started */
|
|
69
|
-
startedAt: number;
|
|
70
|
-
/** Current status */
|
|
71
|
-
status: TaskStatus;
|
|
72
|
-
/** When the task completed/failed/timed out */
|
|
73
|
-
endedAt?: number;
|
|
74
|
-
/** Duration in milliseconds */
|
|
75
|
-
durationMs?: number;
|
|
76
|
-
/** Whether warning was issued */
|
|
77
|
-
warningIssued: boolean;
|
|
78
|
-
/** Error message if failed */
|
|
79
|
-
error?: string;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Result of a cleanup operation
|
|
83
|
-
*/
|
|
84
|
-
export interface CleanupResult {
|
|
85
|
-
/** Number of tasks cleaned up */
|
|
86
|
-
cleaned: number;
|
|
87
|
-
/** Task IDs that were cleaned */
|
|
88
|
-
taskIds: string[];
|
|
89
|
-
/** Any errors encountered */
|
|
90
|
-
errors: Array<{
|
|
91
|
-
taskId: string;
|
|
92
|
-
error: string;
|
|
93
|
-
}>;
|
|
94
|
-
}
|
|
27
|
+
import { type TaskRunnerConfig, type TaskStatus, type TrackedTask, type CleanupResult } from './TaskRunner.types.js';
|
|
28
|
+
export type { TaskRunnerConfig, TaskStatus, TrackedTask, CleanupResult, } from './TaskRunner.types.js';
|
|
29
|
+
export { DEFAULT_TASK_TIMEOUT_MS, SIGKILL_GRACE_PERIOD_MS, WARNING_THRESHOLD_RATIO, } from './TaskRunner.types.js';
|
|
30
|
+
export { gracefulShutdown, killProcess, sleep } from './TaskRunner.process.js';
|
|
95
31
|
/**
|
|
96
32
|
* TaskRunner manages background task lifecycles with timeout enforcement.
|
|
97
33
|
*
|
|
@@ -186,22 +122,10 @@ export declare class TaskRunner {
|
|
|
186
122
|
* Handle a task timeout
|
|
187
123
|
*/
|
|
188
124
|
private handleTimeout;
|
|
189
|
-
/**
|
|
190
|
-
* Gracefully shutdown a process: SIGTERM -> wait -> SIGKILL
|
|
191
|
-
*/
|
|
192
|
-
private gracefulShutdown;
|
|
193
|
-
/**
|
|
194
|
-
* Kill a process immediately with SIGKILL
|
|
195
|
-
*/
|
|
196
|
-
private killProcess;
|
|
197
125
|
/**
|
|
198
126
|
* Finish a task and clean up timers
|
|
199
127
|
*/
|
|
200
128
|
private finishTask;
|
|
201
|
-
/**
|
|
202
|
-
* Sleep for a specified duration
|
|
203
|
-
*/
|
|
204
|
-
private sleep;
|
|
205
129
|
}
|
|
206
130
|
/**
|
|
207
131
|
* Create a TaskRunner with environment-based configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskRunner.d.ts","sourceRoot":"","sources":["../../../src/services/TaskRunner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"TaskRunner.d.ts","sourceRoot":"","sources":["../../../src/services/TaskRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAA;AAI9B,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAE9E;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwE;IAC/F,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyC;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAkD;gBAEjE,MAAM,GAAE,gBAAqB;IAqBzC;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAwClD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9B;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAQjD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIhD;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW,EAAE;IAK5C;;OAEG;IACH,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;KACf;IAYD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,GAAE,MAAgB,GAAG,MAAM;IAkB3C;;;;;OAKG;IACG,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC;IAmC/C;;OAEG;IACH,OAAO,IAAI,IAAI;IAiBf;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;YACW,aAAa;IAgC3B;;OAEG;IACH,OAAO,CAAC,UAAU;CAiCnB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,UAAU,CAEtE;AAOD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,UAAU,CAKhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SMI-1662: TaskRunner - Background Task Timeout Management
|
|
3
|
+
* @see SMI-2741: Types split to TaskRunner.types.ts, process utils to TaskRunner.process.ts
|
|
3
4
|
*
|
|
4
5
|
* Provides configurable timeout enforcement for background Task agents.
|
|
5
6
|
* Addresses orphaned process memory leaks identified in incident 2026-01-22.
|
|
@@ -25,18 +26,10 @@
|
|
|
25
26
|
*/
|
|
26
27
|
import { randomUUID } from 'crypto';
|
|
27
28
|
import { createLogger } from '../utils/logger.js';
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
export
|
|
32
|
-
/**
|
|
33
|
-
* Grace period before SIGKILL after SIGTERM: 5 seconds
|
|
34
|
-
*/
|
|
35
|
-
export const SIGKILL_GRACE_PERIOD_MS = 5000;
|
|
36
|
-
/**
|
|
37
|
-
* Warning threshold: 80% of timeout
|
|
38
|
-
*/
|
|
39
|
-
export const WARNING_THRESHOLD_RATIO = 0.8;
|
|
29
|
+
import { DEFAULT_TASK_TIMEOUT_MS, WARNING_THRESHOLD_RATIO, } from './TaskRunner.types.js';
|
|
30
|
+
import { gracefulShutdown, killProcess } from './TaskRunner.process.js';
|
|
31
|
+
export { DEFAULT_TASK_TIMEOUT_MS, SIGKILL_GRACE_PERIOD_MS, WARNING_THRESHOLD_RATIO, } from './TaskRunner.types.js';
|
|
32
|
+
export { gracefulShutdown, killProcess, sleep } from './TaskRunner.process.js';
|
|
40
33
|
/**
|
|
41
34
|
* TaskRunner manages background task lifecycles with timeout enforcement.
|
|
42
35
|
*
|
|
@@ -202,7 +195,7 @@ export class TaskRunner {
|
|
|
202
195
|
for (const [id, task] of this.tasks.entries()) {
|
|
203
196
|
if (task.status === 'running' && now - task.startedAt > this.config.timeoutMs) {
|
|
204
197
|
try {
|
|
205
|
-
await
|
|
198
|
+
await killProcess(task.pid);
|
|
206
199
|
this.finishTask(id, 'killed');
|
|
207
200
|
result.cleaned++;
|
|
208
201
|
result.taskIds.push(id);
|
|
@@ -285,7 +278,7 @@ export class TaskRunner {
|
|
|
285
278
|
});
|
|
286
279
|
// Attempt graceful shutdown
|
|
287
280
|
try {
|
|
288
|
-
await
|
|
281
|
+
await gracefulShutdown(task.pid);
|
|
289
282
|
this.finishTask(taskId, 'timeout');
|
|
290
283
|
}
|
|
291
284
|
catch (error) {
|
|
@@ -294,54 +287,6 @@ export class TaskRunner {
|
|
|
294
287
|
}
|
|
295
288
|
this.onTimeout?.(task);
|
|
296
289
|
}
|
|
297
|
-
/**
|
|
298
|
-
* Gracefully shutdown a process: SIGTERM -> wait -> SIGKILL
|
|
299
|
-
*/
|
|
300
|
-
async gracefulShutdown(pid) {
|
|
301
|
-
// First, send SIGTERM for graceful shutdown
|
|
302
|
-
try {
|
|
303
|
-
process.kill(pid, 'SIGTERM');
|
|
304
|
-
}
|
|
305
|
-
catch (error) {
|
|
306
|
-
// Process might already be dead
|
|
307
|
-
if (error.code === 'ESRCH') {
|
|
308
|
-
if (this.config.debug) {
|
|
309
|
-
this.logger.debug('Process already terminated', { pid });
|
|
310
|
-
}
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
throw error;
|
|
314
|
-
}
|
|
315
|
-
// Wait for grace period
|
|
316
|
-
await this.sleep(SIGKILL_GRACE_PERIOD_MS);
|
|
317
|
-
// Check if still running and send SIGKILL
|
|
318
|
-
try {
|
|
319
|
-
// process.kill(pid, 0) checks if process exists
|
|
320
|
-
process.kill(pid, 0);
|
|
321
|
-
// Process still running, send SIGKILL
|
|
322
|
-
if (this.config.debug) {
|
|
323
|
-
this.logger.debug('Process did not terminate gracefully, sending SIGKILL', { pid });
|
|
324
|
-
}
|
|
325
|
-
process.kill(pid, 'SIGKILL');
|
|
326
|
-
}
|
|
327
|
-
catch {
|
|
328
|
-
// Process is already dead, which is fine
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Kill a process immediately with SIGKILL
|
|
333
|
-
*/
|
|
334
|
-
async killProcess(pid) {
|
|
335
|
-
try {
|
|
336
|
-
process.kill(pid, 'SIGKILL');
|
|
337
|
-
}
|
|
338
|
-
catch (error) {
|
|
339
|
-
// ESRCH means process doesn't exist, which is fine
|
|
340
|
-
if (error.code !== 'ESRCH') {
|
|
341
|
-
throw error;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
290
|
/**
|
|
346
291
|
* Finish a task and clean up timers
|
|
347
292
|
*/
|
|
@@ -374,12 +319,6 @@ export class TaskRunner {
|
|
|
374
319
|
});
|
|
375
320
|
}
|
|
376
321
|
}
|
|
377
|
-
/**
|
|
378
|
-
* Sleep for a specified duration
|
|
379
|
-
*/
|
|
380
|
-
sleep(ms) {
|
|
381
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
382
|
-
}
|
|
383
322
|
}
|
|
384
323
|
/**
|
|
385
324
|
* Create a TaskRunner with environment-based configuration
|