@skillsmith/core 0.4.15 → 0.4.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +57 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/DependencyMerger.d.ts +39 -0
- package/dist/src/analysis/DependencyMerger.d.ts.map +1 -0
- package/dist/src/analysis/DependencyMerger.js +191 -0
- package/dist/src/analysis/DependencyMerger.js.map +1 -0
- package/dist/src/analysis/DependencyMerger.test.d.ts +2 -0
- package/dist/src/analysis/DependencyMerger.test.d.ts.map +1 -0
- package/dist/src/analysis/DependencyMerger.test.js +258 -0
- package/dist/src/analysis/DependencyMerger.test.js.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.d.ts +42 -0
- package/dist/src/analysis/McpReferenceExtractor.d.ts.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.js +92 -0
- package/dist/src/analysis/McpReferenceExtractor.js.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.test.d.ts +2 -0
- package/dist/src/analysis/McpReferenceExtractor.test.d.ts.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.test.js +262 -0
- package/dist/src/analysis/McpReferenceExtractor.test.js.map +1 -0
- package/dist/src/api/client.d.ts +2 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +4 -8
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/db/migrations/v10-dependencies.d.ts +18 -0
- package/dist/src/db/migrations/v10-dependencies.d.ts.map +1 -0
- package/dist/src/db/migrations/v10-dependencies.js +50 -0
- package/dist/src/db/migrations/v10-dependencies.js.map +1 -0
- package/dist/src/db/migrations/v2-phase5-columns.d.ts +7 -0
- package/dist/src/db/migrations/v2-phase5-columns.d.ts.map +1 -0
- package/dist/src/db/migrations/v2-phase5-columns.js +16 -0
- package/dist/src/db/migrations/v2-phase5-columns.js.map +1 -0
- package/dist/src/db/migrations/v3-sync-tables.d.ts +6 -0
- package/dist/src/db/migrations/v3-sync-tables.d.ts.map +1 -0
- package/dist/src/db/migrations/v3-sync-tables.js +41 -0
- package/dist/src/db/migrations/v3-sync-tables.js.map +1 -0
- package/dist/src/db/migrations/v4-security-columns.d.ts +7 -0
- package/dist/src/db/migrations/v4-security-columns.d.ts.map +1 -0
- package/dist/src/db/migrations/v4-security-columns.js +17 -0
- package/dist/src/db/migrations/v4-security-columns.js.map +1 -0
- package/dist/src/db/schema.d.ts +2 -2
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +20 -58
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.d.ts +1 -1
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.js +4 -34
- package/dist/src/embeddings/hnsw-store.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.types.d.ts +18 -0
- package/dist/src/embeddings/hnsw-store.types.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.types.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +1 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +4 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/services.d.ts +5 -0
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +11 -0
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/exports/types.d.ts +1 -0
- 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 +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts +3 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +20 -9
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js +17 -10
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.js +2 -9
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +5 -1
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillDependencyRepository.d.ts +73 -0
- package/dist/src/repositories/SkillDependencyRepository.d.ts.map +1 -0
- package/dist/src/repositories/SkillDependencyRepository.js +199 -0
- package/dist/src/repositories/SkillDependencyRepository.js.map +1 -0
- package/dist/src/routing/SONARouter.d.ts.map +1 -1
- package/dist/src/routing/SONARouter.js +4 -15
- package/dist/src/routing/SONARouter.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +5 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +4 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +24 -2
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +99 -3
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +29 -90
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.ssrf.d.ts +15 -0
- package/dist/src/security/scanner/SecurityScanner.ssrf.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.ssrf.js +76 -0
- package/dist/src/security/scanner/SecurityScanner.ssrf.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +1 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +1 -1
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +6 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +32 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +2 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +1 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/skill-installation.helpers.d.ts +62 -0
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -0
- package/dist/src/services/skill-installation.helpers.js +335 -0
- package/dist/src/services/skill-installation.helpers.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts +45 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -0
- package/dist/src/services/skill-installation.service.js +383 -0
- package/dist/src/services/skill-installation.service.js.map +1 -0
- package/dist/src/services/skill-installation.types.d.ts +144 -0
- package/dist/src/services/skill-installation.types.d.ts.map +1 -0
- package/dist/src/services/skill-installation.types.js +38 -0
- package/dist/src/services/skill-installation.types.js.map +1 -0
- package/dist/src/services/skill-manifest.d.ts +20 -0
- package/dist/src/services/skill-manifest.d.ts.map +1 -0
- package/dist/src/services/skill-manifest.js +84 -0
- package/dist/src/services/skill-manifest.js.map +1 -0
- package/dist/src/session/SessionManager.helpers.d.ts +1 -27
- package/dist/src/session/SessionManager.helpers.d.ts.map +1 -1
- package/dist/src/session/SessionManager.helpers.js +0 -64
- package/dist/src/session/SessionManager.helpers.js.map +1 -1
- package/dist/src/session/SessionManager.memory.d.ts +12 -11
- package/dist/src/session/SessionManager.memory.d.ts.map +1 -1
- package/dist/src/session/SessionManager.memory.js +23 -115
- package/dist/src/session/SessionManager.memory.js.map +1 -1
- package/dist/src/session/SessionManager.types.d.ts +0 -37
- package/dist/src/session/SessionManager.types.d.ts.map +1 -1
- package/dist/src/session/SessionManager.types.js.map +1 -1
- package/dist/src/session/SessionRecovery.js +4 -4
- package/dist/src/session/SessionRecovery.js.map +1 -1
- package/dist/src/sources/SourceIndexer.d.ts +3 -1
- package/dist/src/sources/SourceIndexer.d.ts.map +1 -1
- package/dist/src/sources/SourceIndexer.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.js +5 -19
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/types/dependencies.d.ts +85 -0
- package/dist/src/types/dependencies.d.ts.map +1 -0
- package/dist/src/types/dependencies.js +11 -0
- package/dist/src/types/dependencies.js.map +1 -0
- package/dist/src/types/skill.d.ts +3 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +2 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/DailyIndexPipeline.test.js +3 -3
- package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
- package/dist/tests/GitHubIndexer.test.js +4 -2
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/billing/StripeClient.test.d.ts +18 -0
- package/dist/tests/billing/StripeClient.test.d.ts.map +1 -0
- package/dist/tests/billing/StripeClient.test.js +566 -0
- package/dist/tests/billing/StripeClient.test.js.map +1 -0
- package/dist/tests/billing/StripeWebhookHandler.test.d.ts +16 -0
- package/dist/tests/billing/StripeWebhookHandler.test.d.ts.map +1 -0
- package/dist/tests/billing/StripeWebhookHandler.test.js +240 -0
- package/dist/tests/billing/StripeWebhookHandler.test.js.map +1 -0
- package/dist/tests/billing/stripe-helpers.test.d.ts +7 -0
- package/dist/tests/billing/stripe-helpers.test.d.ts.map +1 -0
- package/dist/tests/billing/stripe-helpers.test.js +91 -0
- package/dist/tests/billing/stripe-helpers.test.js.map +1 -0
- package/dist/tests/billing/webhook-handlers.test.d.ts +16 -0
- package/dist/tests/billing/webhook-handlers.test.d.ts.map +1 -0
- package/dist/tests/billing/webhook-handlers.test.js +519 -0
- package/dist/tests/billing/webhook-handlers.test.js.map +1 -0
- package/dist/tests/db/migration.test.d.ts +11 -0
- package/dist/tests/db/migration.test.d.ts.map +1 -0
- package/dist/tests/db/migration.test.js +265 -0
- package/dist/tests/db/migration.test.js.map +1 -0
- package/dist/tests/edge-cases/EdgeCases.test.js +4 -1
- package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
- package/dist/tests/repositories/SkillDependencyRepository.test.d.ts +10 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.js +336 -0
- package/dist/tests/repositories/SkillDependencyRepository.test.js.map +1 -0
- package/dist/tests/security/ContinuousSecurity.test.js +2 -2
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security.test.js +200 -0
- package/dist/tests/security.test.js.map +1 -1
- package/dist/tests/session/SessionManager.helpers.test.js +1 -9
- package/dist/tests/session/SessionManager.helpers.test.js.map +1 -1
- package/dist/tests/session/SessionManager.memory.test.d.ts +3 -4
- package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -1
- package/dist/tests/session/SessionManager.memory.test.js +41 -123
- package/dist/tests/session/SessionManager.memory.test.js.map +1 -1
- package/dist/tests/sources.test.js +1 -1
- package/dist/tests/sources.test.js.map +1 -1
- package/dist/tests/sync/BackgroundSyncService.test.d.ts +13 -0
- package/dist/tests/sync/BackgroundSyncService.test.d.ts.map +1 -0
- package/dist/tests/sync/BackgroundSyncService.test.js +259 -0
- package/dist/tests/sync/BackgroundSyncService.test.js.map +1 -0
- package/dist/tests/testkit.d.ts +14 -0
- package/dist/tests/testkit.d.ts.map +1 -0
- package/dist/tests/testkit.js +14 -0
- package/dist/tests/testkit.js.map +1 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.d.ts +6 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.d.ts.map +1 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.js +166 -0
- package/dist/tests/unit/migrations/v10-dependencies.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation.service.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.test.js +732 -0
- package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -0
- package/package.json +19 -7
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -13
- package/dist/vitest.config.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Helper functions for SkillInstallationService
|
|
3
|
+
* @module @skillsmith/core/services/skill-installation.helpers
|
|
4
|
+
* @see SMI-3483: Wave 0 — Extract SkillInstallationService into core
|
|
5
|
+
*
|
|
6
|
+
* Pure helper functions used by the service. Split from the main service
|
|
7
|
+
* file to meet the 500-line standard.
|
|
8
|
+
*/
|
|
9
|
+
import type { SkillDependencyRepository } from '../repositories/SkillDependencyRepository.js';
|
|
10
|
+
import type { Database } from '../db/database-interface.js';
|
|
11
|
+
import type { DepIntelResult, OptimizationInfo, ProgressCallback, UninstallResult } from './skill-installation.types.js';
|
|
12
|
+
import type { ManifestManager } from './skill-manifest.js';
|
|
13
|
+
/**
|
|
14
|
+
* Result of applying optimization to a skill's content.
|
|
15
|
+
*/
|
|
16
|
+
export interface OptimizationResult {
|
|
17
|
+
finalSkillContent: string;
|
|
18
|
+
subSkillFiles: Array<{
|
|
19
|
+
filename: string;
|
|
20
|
+
content: string;
|
|
21
|
+
}>;
|
|
22
|
+
subagentContent: string | undefined;
|
|
23
|
+
claudeMdSnippet: string | undefined;
|
|
24
|
+
optimizationInfo: OptimizationInfo;
|
|
25
|
+
}
|
|
26
|
+
export interface ParsedSkillId {
|
|
27
|
+
owner: string;
|
|
28
|
+
repo: string;
|
|
29
|
+
path: string;
|
|
30
|
+
isRegistryId: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function parseSkillIdInternal(input: string): ParsedSkillId;
|
|
33
|
+
export declare function hashContent(content: string): string;
|
|
34
|
+
export interface SkillMdValidation {
|
|
35
|
+
valid: boolean;
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
export declare function validateSkillMd(content: string): SkillMdValidation;
|
|
39
|
+
export declare function assertNotEncrypted(content: string, filePath: string): void;
|
|
40
|
+
export declare function fetchFromGitHub(owner: string, repo: string, filePath: string, branch?: string): Promise<string>;
|
|
41
|
+
export declare function checkForModifications(skillPath: string, installedAt: string): Promise<boolean>;
|
|
42
|
+
export declare function generateTips(skillName: string, optimizationInfo: OptimizationInfo): string[];
|
|
43
|
+
export declare function extractDepIntel(skillMdContent: string): DepIntelResult;
|
|
44
|
+
export declare function persistDependencies(repo: SkillDependencyRepository, skillId: string, content: string, declared: DepIntelResult['dep_declared']): void;
|
|
45
|
+
/**
|
|
46
|
+
* Perform skill uninstall with manifest awareness and orphan fallback.
|
|
47
|
+
*/
|
|
48
|
+
export declare function performUninstall(params: {
|
|
49
|
+
skillName: string;
|
|
50
|
+
force: boolean;
|
|
51
|
+
skillsDir: string;
|
|
52
|
+
manifest: ManifestManager;
|
|
53
|
+
skillDependencyRepo: SkillDependencyRepository;
|
|
54
|
+
onProgress: ProgressCallback;
|
|
55
|
+
}): Promise<UninstallResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Apply skill optimization via TransformationService.
|
|
58
|
+
* Returns original content if transformation fails or produces no changes.
|
|
59
|
+
*/
|
|
60
|
+
export declare function applyOptimization(db: Database, skillId: string, skillName: string, skillMdContent: string): Promise<OptimizationResult>;
|
|
61
|
+
export declare function sanitizeInstallError(error: unknown): string;
|
|
62
|
+
//# sourceMappingURL=skill-installation.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installation.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAI7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3D,eAAe,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAMD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CA+BjE;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAMD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CASlE;AAMD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAS1E;AAMD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAMD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAMD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAyB5F;AAMD,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,cAAc,CAWtE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,yBAAyB,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,CAAC,cAAc,CAAC,GACvC,IAAI,CAyBN;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,eAAe,CAAA;IACzB,mBAAmB,EAAE,yBAAyB,CAAA;IAC9C,UAAU,EAAE,gBAAgB,CAAA;CAC7B,GAAG,OAAO,CAAC,eAAe,CAAC,CAuF3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAqBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO3D"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Helper functions for SkillInstallationService
|
|
3
|
+
* @module @skillsmith/core/services/skill-installation.helpers
|
|
4
|
+
* @see SMI-3483: Wave 0 — Extract SkillInstallationService into core
|
|
5
|
+
*
|
|
6
|
+
* Pure helper functions used by the service. Split from the main service
|
|
7
|
+
* file to meet the 500-line standard.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { createHash } from 'crypto';
|
|
12
|
+
import { extractMcpReferences } from '../analysis/McpReferenceExtractor.js';
|
|
13
|
+
import { mergeDependencies } from '../analysis/DependencyMerger.js';
|
|
14
|
+
import { TransformationService } from '../services/TransformationService.js';
|
|
15
|
+
export function parseSkillIdInternal(input) {
|
|
16
|
+
if (input.startsWith('https://github.com/')) {
|
|
17
|
+
const url = new URL(input);
|
|
18
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
19
|
+
return {
|
|
20
|
+
owner: parts[0],
|
|
21
|
+
repo: parts[1],
|
|
22
|
+
path: parts.slice(2).join('/') || '',
|
|
23
|
+
isRegistryId: false,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (input.includes('/')) {
|
|
27
|
+
const parts = input.split('/');
|
|
28
|
+
if (parts.length === 2) {
|
|
29
|
+
return { owner: parts[0], repo: parts[1], path: '', isRegistryId: true };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
owner: parts[0],
|
|
33
|
+
repo: parts[1],
|
|
34
|
+
path: parts.slice(2).join('/'),
|
|
35
|
+
isRegistryId: false,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
39
|
+
if (UUID_REGEX.test(input)) {
|
|
40
|
+
return { owner: '', repo: '', path: '', isRegistryId: true };
|
|
41
|
+
}
|
|
42
|
+
throw new Error('Invalid skill ID format: ' + input + '. Use owner/repo or GitHub URL.');
|
|
43
|
+
}
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Content Hashing
|
|
46
|
+
// ============================================================================
|
|
47
|
+
export function hashContent(content) {
|
|
48
|
+
return createHash('sha256').update(content).digest('hex');
|
|
49
|
+
}
|
|
50
|
+
export function validateSkillMd(content) {
|
|
51
|
+
const errors = [];
|
|
52
|
+
if (!content.includes('# ')) {
|
|
53
|
+
errors.push('Missing title (# heading)');
|
|
54
|
+
}
|
|
55
|
+
if (content.length < 100) {
|
|
56
|
+
errors.push('SKILL.md is too short (minimum 100 characters)');
|
|
57
|
+
}
|
|
58
|
+
return { valid: errors.length === 0, errors };
|
|
59
|
+
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Git-Crypt Detection
|
|
62
|
+
// ============================================================================
|
|
63
|
+
export function assertNotEncrypted(content, filePath) {
|
|
64
|
+
if (content.startsWith('\x00GITCRYPT')) {
|
|
65
|
+
throw new Error('File "' +
|
|
66
|
+
filePath +
|
|
67
|
+
'" is git-crypt encrypted. ' +
|
|
68
|
+
'The repository uses git-crypt and this file cannot be fetched from GitHub.');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// GitHub Content Fetching
|
|
73
|
+
// ============================================================================
|
|
74
|
+
export async function fetchFromGitHub(owner, repo, filePath, branch = 'main') {
|
|
75
|
+
const url = 'https://raw.githubusercontent.com/' + owner + '/' + repo + '/' + branch + '/' + filePath;
|
|
76
|
+
const response = await fetch(url);
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
if (branch === 'main') {
|
|
79
|
+
const masterUrl = 'https://raw.githubusercontent.com/' + owner + '/' + repo + '/master/' + filePath;
|
|
80
|
+
const masterResponse = await fetch(masterUrl);
|
|
81
|
+
if (!masterResponse.ok) {
|
|
82
|
+
throw new Error('Failed to fetch ' + filePath + ': ' + response.status);
|
|
83
|
+
}
|
|
84
|
+
const masterText = await masterResponse.text();
|
|
85
|
+
assertNotEncrypted(masterText, filePath);
|
|
86
|
+
return masterText;
|
|
87
|
+
}
|
|
88
|
+
throw new Error('Failed to fetch ' + filePath + ': ' + response.status);
|
|
89
|
+
}
|
|
90
|
+
const text = await response.text();
|
|
91
|
+
assertNotEncrypted(text, filePath);
|
|
92
|
+
return text;
|
|
93
|
+
}
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// Modification Detection
|
|
96
|
+
// ============================================================================
|
|
97
|
+
export async function checkForModifications(skillPath, installedAt) {
|
|
98
|
+
try {
|
|
99
|
+
const installDate = new Date(installedAt);
|
|
100
|
+
const files = await fs.readdir(skillPath, { withFileTypes: true });
|
|
101
|
+
for (const file of files) {
|
|
102
|
+
if (file.isFile()) {
|
|
103
|
+
const filePath = path.join(skillPath, file.name);
|
|
104
|
+
const stats = await fs.stat(filePath);
|
|
105
|
+
if (stats.mtime > installDate) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// Tips Generation
|
|
118
|
+
// ============================================================================
|
|
119
|
+
export function generateTips(skillName, optimizationInfo) {
|
|
120
|
+
const tips = [
|
|
121
|
+
'Skill "' + skillName + '" installed successfully!',
|
|
122
|
+
'To use this skill, mention it in Claude Code: "Use the ' + skillName + ' skill to..."',
|
|
123
|
+
'View installed skills: ls ~/.claude/skills/',
|
|
124
|
+
];
|
|
125
|
+
if (optimizationInfo.optimized) {
|
|
126
|
+
tips.push('');
|
|
127
|
+
tips.push('[Optimization] Skillsmith Optimization Applied:');
|
|
128
|
+
if (optimizationInfo.tokenReductionPercent && optimizationInfo.tokenReductionPercent > 0) {
|
|
129
|
+
tips.push(' - Estimated ' + optimizationInfo.tokenReductionPercent + '% token reduction');
|
|
130
|
+
}
|
|
131
|
+
if (optimizationInfo.subSkills && optimizationInfo.subSkills.length > 0) {
|
|
132
|
+
tips.push(' - ' + optimizationInfo.subSkills.length + ' sub-skills created');
|
|
133
|
+
}
|
|
134
|
+
if (optimizationInfo.subagentGenerated && optimizationInfo.subagentPath) {
|
|
135
|
+
tips.push(' - Companion subagent generated: ' + optimizationInfo.subagentPath);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
tips.push('');
|
|
139
|
+
tips.push('To uninstall: use the uninstall_skill tool');
|
|
140
|
+
return tips;
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Dependency Intelligence
|
|
144
|
+
// ============================================================================
|
|
145
|
+
export function extractDepIntel(skillMdContent) {
|
|
146
|
+
const mcpResult = extractMcpReferences(skillMdContent);
|
|
147
|
+
const warnings = [];
|
|
148
|
+
for (const server of mcpResult.highConfidenceServers) {
|
|
149
|
+
warnings.push("MCP server '" + server + "' is referenced but may not be configured");
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
dep_inferred_servers: mcpResult.servers,
|
|
153
|
+
dep_declared: undefined,
|
|
154
|
+
dep_warnings: warnings,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function persistDependencies(repo, skillId, content, declared) {
|
|
158
|
+
const mcpResult = extractMcpReferences(content);
|
|
159
|
+
const merged = mergeDependencies(declared, mcpResult);
|
|
160
|
+
if (merged.length === 0)
|
|
161
|
+
return;
|
|
162
|
+
const rows = merged.map((dep) => ({
|
|
163
|
+
skill_id: skillId,
|
|
164
|
+
dep_type: dep.depType,
|
|
165
|
+
dep_target: dep.depTarget,
|
|
166
|
+
dep_version: dep.depVersion,
|
|
167
|
+
dep_source: dep.depSource,
|
|
168
|
+
confidence: dep.confidence,
|
|
169
|
+
metadata: dep.metadata,
|
|
170
|
+
}));
|
|
171
|
+
const bySource = new Map();
|
|
172
|
+
for (const row of rows) {
|
|
173
|
+
const existing = bySource.get(row.dep_source) ?? [];
|
|
174
|
+
existing.push(row);
|
|
175
|
+
bySource.set(row.dep_source, existing);
|
|
176
|
+
}
|
|
177
|
+
for (const [source, sourceRows] of bySource) {
|
|
178
|
+
repo.setDependencies(skillId, sourceRows, source);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Perform skill uninstall with manifest awareness and orphan fallback.
|
|
183
|
+
*/
|
|
184
|
+
export async function performUninstall(params) {
|
|
185
|
+
const { skillName, force, skillsDir, manifest, skillDependencyRepo, onProgress } = params;
|
|
186
|
+
try {
|
|
187
|
+
onProgress('manifest', 'Loading manifest');
|
|
188
|
+
const manifestData = await manifest.load();
|
|
189
|
+
const skillEntry = manifestData.installedSkills[skillName];
|
|
190
|
+
if (!skillEntry) {
|
|
191
|
+
const potentialPath = path.join(skillsDir, skillName);
|
|
192
|
+
try {
|
|
193
|
+
await fs.access(potentialPath);
|
|
194
|
+
if (!force) {
|
|
195
|
+
return {
|
|
196
|
+
success: false,
|
|
197
|
+
skillName,
|
|
198
|
+
message: 'Skill "' +
|
|
199
|
+
skillName +
|
|
200
|
+
'" not in manifest but exists on disk. Use force=true to remove.',
|
|
201
|
+
warning: 'This skill was not installed via Skillsmith.',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
onProgress('remove', 'Removing orphan skill from disk');
|
|
205
|
+
await fs.rm(potentialPath, { recursive: true, force: true });
|
|
206
|
+
return {
|
|
207
|
+
success: true,
|
|
208
|
+
skillName,
|
|
209
|
+
message: 'Skill "' + skillName + '" removed from disk (was not in manifest).',
|
|
210
|
+
removedPath: potentialPath,
|
|
211
|
+
warning: 'Skill was not in the manifest. Use "skillsmith install" to register skills properly.',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return { success: false, skillName, message: 'Skill "' + skillName + '" is not installed.' };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const installPath = skillEntry.installPath;
|
|
219
|
+
if (!force) {
|
|
220
|
+
onProgress('check', 'Checking for modifications');
|
|
221
|
+
const modified = await checkForModifications(installPath, skillEntry.installedAt);
|
|
222
|
+
if (modified) {
|
|
223
|
+
return {
|
|
224
|
+
success: false,
|
|
225
|
+
skillName,
|
|
226
|
+
message: 'Skill "' +
|
|
227
|
+
skillName +
|
|
228
|
+
'" has been modified since installation. Use force=true to remove anyway.',
|
|
229
|
+
warning: 'Local modifications will be lost if you force uninstall.',
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
onProgress('remove', 'Removing skill directory');
|
|
234
|
+
try {
|
|
235
|
+
await fs.rm(installPath, { recursive: true, force: true });
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
if (error.code !== 'ENOENT')
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
skillDependencyRepo.clearAll(skillEntry.id);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Table may not exist pre-migration
|
|
246
|
+
}
|
|
247
|
+
onProgress('manifest', 'Updating manifest');
|
|
248
|
+
delete manifestData.installedSkills[skillName];
|
|
249
|
+
await manifest.save(manifestData);
|
|
250
|
+
onProgress('done', 'Uninstall complete');
|
|
251
|
+
return {
|
|
252
|
+
success: true,
|
|
253
|
+
skillName,
|
|
254
|
+
message: 'Skill "' + skillName + '" has been uninstalled successfully.',
|
|
255
|
+
removedPath: installPath,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
return {
|
|
260
|
+
success: false,
|
|
261
|
+
skillName,
|
|
262
|
+
message: error instanceof Error ? error.message : 'Unknown error during uninstall',
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Apply skill optimization via TransformationService.
|
|
268
|
+
* Returns original content if transformation fails or produces no changes.
|
|
269
|
+
*/
|
|
270
|
+
export async function applyOptimization(db, skillId, skillName, skillMdContent) {
|
|
271
|
+
try {
|
|
272
|
+
const transformService = new TransformationService(db, {
|
|
273
|
+
cacheTtl: 3600,
|
|
274
|
+
version: '1.0.0',
|
|
275
|
+
});
|
|
276
|
+
const nameMatch = skillMdContent.match(/^name:\s*(\S.*)$/m);
|
|
277
|
+
const descMatch = skillMdContent.match(/^description:\s*(\S.*)$/m);
|
|
278
|
+
const extractedName = nameMatch ? nameMatch[1].trim() : skillName;
|
|
279
|
+
const extractedDesc = descMatch ? descMatch[1].trim() : '';
|
|
280
|
+
const transformResult = await transformService.transform(skillId, extractedName, extractedDesc, skillMdContent);
|
|
281
|
+
if (transformResult.transformed) {
|
|
282
|
+
return {
|
|
283
|
+
finalSkillContent: transformResult.mainSkillContent,
|
|
284
|
+
subSkillFiles: transformResult.subSkills,
|
|
285
|
+
subagentContent: transformResult.subagent?.content,
|
|
286
|
+
claudeMdSnippet: transformResult.claudeMdSnippet,
|
|
287
|
+
optimizationInfo: {
|
|
288
|
+
optimized: true,
|
|
289
|
+
subSkills: transformResult.subSkills.map((s) => s.filename),
|
|
290
|
+
subagentGenerated: !!transformResult.subagent?.content,
|
|
291
|
+
tokenReductionPercent: transformResult.stats.tokenReductionPercent,
|
|
292
|
+
originalLines: transformResult.stats.originalLines,
|
|
293
|
+
optimizedLines: transformResult.stats.optimizedLines,
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// Transformation failed — continue with original content
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
finalSkillContent: skillMdContent,
|
|
303
|
+
subSkillFiles: [],
|
|
304
|
+
subagentContent: undefined,
|
|
305
|
+
claudeMdSnippet: undefined,
|
|
306
|
+
optimizationInfo: { optimized: false },
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Sanitize install error messages to avoid leaking internal details.
|
|
311
|
+
* Returns a safe error message if the error matches known prefixes,
|
|
312
|
+
* otherwise returns a generic message.
|
|
313
|
+
*/
|
|
314
|
+
const KNOWN_ERROR_PREFIXES = [
|
|
315
|
+
'already installed',
|
|
316
|
+
'Could not find SKILL.md',
|
|
317
|
+
'registry data quality issue',
|
|
318
|
+
'Invalid SKILL.md',
|
|
319
|
+
'Invalid skill ID format',
|
|
320
|
+
'Security scan failed',
|
|
321
|
+
'exceeds maximum length',
|
|
322
|
+
'Refusing to write to symlink',
|
|
323
|
+
'Refusing to write to hardlinked file',
|
|
324
|
+
'Install path escapes skills directory',
|
|
325
|
+
'Cannot skip security scan',
|
|
326
|
+
];
|
|
327
|
+
export function sanitizeInstallError(error) {
|
|
328
|
+
if (error instanceof Error) {
|
|
329
|
+
if (KNOWN_ERROR_PREFIXES.some((p) => error.message.includes(p))) {
|
|
330
|
+
return error.message;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return 'Installation failed due to an internal error';
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=skill-installation.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installation.helpers.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SkillInstallationService — shared install/uninstall business logic
|
|
3
|
+
* @module @skillsmith/core/services/skill-installation.service
|
|
4
|
+
* @see SMI-3483: Wave 0 — Extract SkillInstallationService into core
|
|
5
|
+
*
|
|
6
|
+
* Both mcp-server and CLI consume this service. The MCP ToolContext coupling is
|
|
7
|
+
* eliminated: callers inject explicit dependencies (db, repositories, paths,
|
|
8
|
+
* registry lookup, progress callback).
|
|
9
|
+
*/
|
|
10
|
+
import type { SkillRepository } from '../repositories/SkillRepository.js';
|
|
11
|
+
import type { SkillDependencyRepository } from '../repositories/SkillDependencyRepository.js';
|
|
12
|
+
import type { Database } from '../db/database-interface.js';
|
|
13
|
+
import { type ProgressCallback, type InstallOptions, type InstallResult, type UninstallOptions, type UninstallResult, type RegistryLookup, type CoInstallRecorder } from './skill-installation.types.js';
|
|
14
|
+
export interface SkillInstallationServiceParams {
|
|
15
|
+
db: Database;
|
|
16
|
+
skillRepo: SkillRepository;
|
|
17
|
+
skillDependencyRepo: SkillDependencyRepository;
|
|
18
|
+
/** Directory where skills are installed. Default: ~/.claude/skills */
|
|
19
|
+
skillsDir?: string;
|
|
20
|
+
/** Path to the manifest file. Default: ~/.skillsmith/manifest.json */
|
|
21
|
+
manifestPath?: string;
|
|
22
|
+
/** Progress callback for reporting stages */
|
|
23
|
+
onProgress?: ProgressCallback;
|
|
24
|
+
/** Registry lookup abstraction (API-first for mcp-server, simpler for CLI) */
|
|
25
|
+
registryLookup?: RegistryLookup;
|
|
26
|
+
/** Co-install recorder for "also installed" recommendations */
|
|
27
|
+
coInstallRecorder?: CoInstallRecorder;
|
|
28
|
+
/** Skill IDs installed in this session (for co-install tracking) */
|
|
29
|
+
sessionInstalledSkillIds?: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare class SkillInstallationService {
|
|
32
|
+
private readonly db;
|
|
33
|
+
private readonly skillRepo;
|
|
34
|
+
private readonly skillDependencyRepo;
|
|
35
|
+
private readonly skillsDir;
|
|
36
|
+
private readonly manifest;
|
|
37
|
+
private readonly onProgress;
|
|
38
|
+
private readonly registryLookup?;
|
|
39
|
+
private readonly coInstallRecorder?;
|
|
40
|
+
private readonly sessionInstalledSkillIds;
|
|
41
|
+
constructor(params: SkillInstallationServiceParams);
|
|
42
|
+
install(skillId: string, options?: InstallOptions): Promise<InstallResult>;
|
|
43
|
+
uninstall(skillName: string, options?: UninstallOptions): Promise<UninstallResult>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=skill-installation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installation.service.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAA;AAqBtC,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,QAAQ,CAAA;IACZ,SAAS,EAAE,eAAe,CAAA;IAC1B,mBAAmB,EAAE,yBAAyB,CAAA;IAC9C,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,oEAAoE;IACpE,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;CACpC;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAU;gBAEvC,MAAM,EAAE,8BAA8B;IAY5C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAsX9E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;CAU7F"}
|