@skillsmith/core 0.11.4 → 0.11.5

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 (183) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +10 -7
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/api/client.d.ts.map +1 -1
  5. package/dist/src/api/client.js +15 -5
  6. package/dist/src/api/client.js.map +1 -1
  7. package/dist/src/api/client.private-registry.d.ts +80 -0
  8. package/dist/src/api/client.private-registry.d.ts.map +1 -0
  9. package/dist/src/api/client.private-registry.js +97 -0
  10. package/dist/src/api/client.private-registry.js.map +1 -0
  11. package/dist/src/api/client.private-registry.test.d.ts +9 -0
  12. package/dist/src/api/client.private-registry.test.d.ts.map +1 -0
  13. package/dist/src/api/client.private-registry.test.js +127 -0
  14. package/dist/src/api/client.private-registry.test.js.map +1 -0
  15. package/dist/src/api/client.toSkill.test.d.ts +25 -0
  16. package/dist/src/api/client.toSkill.test.d.ts.map +1 -0
  17. package/dist/src/api/client.toSkill.test.js +97 -0
  18. package/dist/src/api/client.toSkill.test.js.map +1 -0
  19. package/dist/src/api/client.token-refresh.d.ts +8 -0
  20. package/dist/src/api/client.token-refresh.d.ts.map +1 -1
  21. package/dist/src/api/client.token-refresh.js +26 -0
  22. package/dist/src/api/client.token-refresh.js.map +1 -1
  23. package/dist/src/api/client.token-refresh.test.js +82 -0
  24. package/dist/src/api/client.token-refresh.test.js.map +1 -1
  25. package/dist/src/api/index.d.ts +2 -0
  26. package/dist/src/api/index.d.ts.map +1 -1
  27. package/dist/src/api/index.js +9 -0
  28. package/dist/src/api/index.js.map +1 -1
  29. package/dist/src/api/security-summary.d.ts +73 -0
  30. package/dist/src/api/security-summary.d.ts.map +1 -0
  31. package/dist/src/api/security-summary.js +88 -0
  32. package/dist/src/api/security-summary.js.map +1 -0
  33. package/dist/src/api/security-summary.test.d.ts +9 -0
  34. package/dist/src/api/security-summary.test.d.ts.map +1 -0
  35. package/dist/src/api/security-summary.test.js +94 -0
  36. package/dist/src/api/security-summary.test.js.map +1 -0
  37. package/dist/src/config/config-atomic-write.d.ts +30 -10
  38. package/dist/src/config/config-atomic-write.d.ts.map +1 -1
  39. package/dist/src/config/config-atomic-write.js +33 -80
  40. package/dist/src/config/config-atomic-write.js.map +1 -1
  41. package/dist/src/config/config-atomic-write.test.d.ts +8 -0
  42. package/dist/src/config/config-atomic-write.test.d.ts.map +1 -1
  43. package/dist/src/config/config-atomic-write.test.js +64 -12
  44. package/dist/src/config/config-atomic-write.test.js.map +1 -1
  45. package/dist/src/config/owned-lock.acquire.d.ts +53 -0
  46. package/dist/src/config/owned-lock.acquire.d.ts.map +1 -0
  47. package/dist/src/config/owned-lock.acquire.js +140 -0
  48. package/dist/src/config/owned-lock.acquire.js.map +1 -0
  49. package/dist/src/config/owned-lock.claim.d.ts +84 -0
  50. package/dist/src/config/owned-lock.claim.d.ts.map +1 -0
  51. package/dist/src/config/owned-lock.claim.js +310 -0
  52. package/dist/src/config/owned-lock.claim.js.map +1 -0
  53. package/dist/src/config/owned-lock.d.ts +113 -0
  54. package/dist/src/config/owned-lock.d.ts.map +1 -0
  55. package/dist/src/config/owned-lock.js +121 -0
  56. package/dist/src/config/owned-lock.js.map +1 -0
  57. package/dist/src/config/owned-lock.test.d.ts +12 -0
  58. package/dist/src/config/owned-lock.test.d.ts.map +1 -0
  59. package/dist/src/config/owned-lock.test.js +412 -0
  60. package/dist/src/config/owned-lock.test.js.map +1 -0
  61. package/dist/src/config/owned-lock.types.d.ts +78 -0
  62. package/dist/src/config/owned-lock.types.d.ts.map +1 -0
  63. package/dist/src/config/owned-lock.types.js +30 -0
  64. package/dist/src/config/owned-lock.types.js.map +1 -0
  65. package/dist/src/db/createDatabase.d.ts.map +1 -1
  66. package/dist/src/db/createDatabase.js +19 -7
  67. package/dist/src/db/createDatabase.js.map +1 -1
  68. package/dist/src/embeddings/hnsw-store.exports.d.ts +11 -0
  69. package/dist/src/embeddings/hnsw-store.exports.d.ts.map +1 -0
  70. package/dist/src/embeddings/hnsw-store.exports.js +10 -0
  71. package/dist/src/embeddings/hnsw-store.exports.js.map +1 -0
  72. package/dist/src/embeddings/index.d.ts +1 -2
  73. package/dist/src/embeddings/index.d.ts.map +1 -1
  74. package/dist/src/embeddings/index.js +17 -3
  75. package/dist/src/embeddings/index.js.map +1 -1
  76. package/dist/src/embeddings/probe.d.ts.map +1 -1
  77. package/dist/src/embeddings/probe.js +4 -8
  78. package/dist/src/embeddings/probe.js.map +1 -1
  79. package/dist/src/exports/services.d.ts +4 -1
  80. package/dist/src/exports/services.d.ts.map +1 -1
  81. package/dist/src/exports/services.js +22 -0
  82. package/dist/src/exports/services.js.map +1 -1
  83. package/dist/src/index.d.ts +3 -3
  84. package/dist/src/index.d.ts.map +1 -1
  85. package/dist/src/index.js +9 -3
  86. package/dist/src/index.js.map +1 -1
  87. package/dist/src/install/index.d.ts +1 -1
  88. package/dist/src/install/index.d.ts.map +1 -1
  89. package/dist/src/install/index.js +1 -1
  90. package/dist/src/install/index.js.map +1 -1
  91. package/dist/src/install/paths.d.ts +10 -0
  92. package/dist/src/install/paths.d.ts.map +1 -1
  93. package/dist/src/install/paths.js +19 -0
  94. package/dist/src/install/paths.js.map +1 -1
  95. package/dist/src/security/scanner/multiline-category-closure.test.d.ts +80 -0
  96. package/dist/src/security/scanner/multiline-category-closure.test.d.ts.map +1 -0
  97. package/dist/src/security/scanner/multiline-category-closure.test.js +287 -0
  98. package/dist/src/security/scanner/multiline-category-closure.test.js.map +1 -0
  99. package/dist/src/services/recommend-guard.d.ts +28 -0
  100. package/dist/src/services/recommend-guard.d.ts.map +1 -0
  101. package/dist/src/services/recommend-guard.js +34 -0
  102. package/dist/src/services/recommend-guard.js.map +1 -0
  103. package/dist/src/services/recommend-guard.test.d.ts +2 -0
  104. package/dist/src/services/recommend-guard.test.d.ts.map +1 -0
  105. package/dist/src/services/recommend-guard.test.js +28 -0
  106. package/dist/src/services/recommend-guard.test.js.map +1 -0
  107. package/dist/src/services/skill-installation.content.d.ts +88 -0
  108. package/dist/src/services/skill-installation.content.d.ts.map +1 -0
  109. package/dist/src/services/skill-installation.content.js +319 -0
  110. package/dist/src/services/skill-installation.content.js.map +1 -0
  111. package/dist/src/services/skill-installation.helpers.d.ts +32 -1
  112. package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
  113. package/dist/src/services/skill-installation.helpers.js +39 -6
  114. package/dist/src/services/skill-installation.helpers.js.map +1 -1
  115. package/dist/src/services/skill-installation.helpers.test.js +34 -2
  116. package/dist/src/services/skill-installation.helpers.test.js.map +1 -1
  117. package/dist/src/services/skill-installation.io.d.ts.map +1 -1
  118. package/dist/src/services/skill-installation.io.js +74 -1
  119. package/dist/src/services/skill-installation.io.js.map +1 -1
  120. package/dist/src/services/skill-installation.service.d.ts +20 -1
  121. package/dist/src/services/skill-installation.service.d.ts.map +1 -1
  122. package/dist/src/services/skill-installation.service.js +26 -4
  123. package/dist/src/services/skill-installation.service.js.map +1 -1
  124. package/dist/src/services/skill-installation.types.d.ts +42 -1
  125. package/dist/src/services/skill-installation.types.d.ts.map +1 -1
  126. package/dist/src/services/skill-installation.types.js.map +1 -1
  127. package/dist/src/services/skill-resolution.d.ts +67 -0
  128. package/dist/src/services/skill-resolution.d.ts.map +1 -0
  129. package/dist/src/services/skill-resolution.js +67 -0
  130. package/dist/src/services/skill-resolution.js.map +1 -0
  131. package/dist/src/services/skill-resolution.test.d.ts +2 -0
  132. package/dist/src/services/skill-resolution.test.d.ts.map +1 -0
  133. package/dist/src/services/skill-resolution.test.js +143 -0
  134. package/dist/src/services/skill-resolution.test.js.map +1 -0
  135. package/dist/src/utils/index.d.ts +1 -0
  136. package/dist/src/utils/index.d.ts.map +1 -1
  137. package/dist/src/utils/index.js +4 -0
  138. package/dist/src/utils/index.js.map +1 -1
  139. package/dist/src/utils/quiet-mode.d.ts +21 -0
  140. package/dist/src/utils/quiet-mode.d.ts.map +1 -0
  141. package/dist/src/utils/quiet-mode.js +26 -0
  142. package/dist/src/utils/quiet-mode.js.map +1 -0
  143. package/dist/tests/EmbeddingService.test.js +58 -1
  144. package/dist/tests/EmbeddingService.test.js.map +1 -1
  145. package/dist/tests/SecurityScanner.performance.test.js +5 -2
  146. package/dist/tests/SecurityScanner.performance.test.js.map +1 -1
  147. package/dist/tests/db/database-abstraction.test.js +45 -1
  148. package/dist/tests/db/database-abstraction.test.js.map +1 -1
  149. package/dist/tests/helpers/deterministic-dead-pid.d.ts +13 -0
  150. package/dist/tests/helpers/deterministic-dead-pid.d.ts.map +1 -0
  151. package/dist/tests/helpers/deterministic-dead-pid.js +31 -0
  152. package/dist/tests/helpers/deterministic-dead-pid.js.map +1 -0
  153. package/dist/tests/integration/owned-lock-lost-update.test.d.ts +12 -0
  154. package/dist/tests/integration/owned-lock-lost-update.test.d.ts.map +1 -0
  155. package/dist/tests/integration/owned-lock-lost-update.test.js +52 -0
  156. package/dist/tests/integration/owned-lock-lost-update.test.js.map +1 -0
  157. package/dist/tests/integration/owned-lock-reclaim-race.test.d.ts +19 -0
  158. package/dist/tests/integration/owned-lock-reclaim-race.test.d.ts.map +1 -0
  159. package/dist/tests/integration/owned-lock-reclaim-race.test.js +177 -0
  160. package/dist/tests/integration/owned-lock-reclaim-race.test.js.map +1 -0
  161. package/dist/tests/unit/services/skill-installation.content.test.d.ts +10 -0
  162. package/dist/tests/unit/services/skill-installation.content.test.d.ts.map +1 -0
  163. package/dist/tests/unit/services/skill-installation.content.test.js +290 -0
  164. package/dist/tests/unit/services/skill-installation.content.test.js.map +1 -0
  165. package/dist/tests/unit/services/skill-installation.io.symlink.test.d.ts +8 -0
  166. package/dist/tests/unit/services/skill-installation.io.symlink.test.d.ts.map +1 -0
  167. package/dist/tests/unit/services/skill-installation.io.symlink.test.js +72 -0
  168. package/dist/tests/unit/services/skill-installation.io.symlink.test.js.map +1 -0
  169. package/dist/tests/unit/services/skill-installation.service.error-codes.test.d.ts +15 -0
  170. package/dist/tests/unit/services/skill-installation.service.error-codes.test.d.ts.map +1 -0
  171. package/dist/tests/unit/services/skill-installation.service.error-codes.test.js +190 -0
  172. package/dist/tests/unit/services/skill-installation.service.error-codes.test.js.map +1 -0
  173. package/dist/tests/unit/services/skill-installation.service.multi-client.test.d.ts +17 -0
  174. package/dist/tests/unit/services/skill-installation.service.multi-client.test.d.ts.map +1 -0
  175. package/dist/tests/unit/services/skill-installation.service.multi-client.test.js +126 -0
  176. package/dist/tests/unit/services/skill-installation.service.multi-client.test.js.map +1 -0
  177. package/dist/tests/unit/services/skill-installation.service.test.js +7 -112
  178. package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
  179. package/dist/tests/utils/quiet-mode.test.d.ts +12 -0
  180. package/dist/tests/utils/quiet-mode.test.d.ts.map +1 -0
  181. package/dist/tests/utils/quiet-mode.test.js +42 -0
  182. package/dist/tests/utils/quiet-mode.test.js.map +1 -0
  183. package/package.json +17 -5
@@ -0,0 +1,319 @@
1
+ /**
2
+ * @fileoverview Content-based skill install path (private registry).
3
+ * @module @skillsmith/core/services/skill-installation.content
4
+ * @see SMI-5905 Wave 1: installFromContent() + resolveFreshAccessToken() extraction
5
+ * @see docs/internal/implementation/private-registry-skill-install.md
6
+ *
7
+ * `install()` (skill-installation.service.ts) only knows how to fetch a
8
+ * skill from GitHub. This module adds a second entry point,
9
+ * `installFromContent()`, for skills whose content has already been resolved
10
+ * elsewhere (a private-registry `content` JSONB column, read via a
11
+ * per-team-member Supabase session or the `private-registry-get` Edge
12
+ * Function — Waves 2/3 wire those transports; this module only needs the
13
+ * already-fetched `{skillId, version, content}` triple).
14
+ *
15
+ * SCOPE TRIM (Sol review #5 — read before extending this function):
16
+ * `installFromContent()` deliberately reuses only two things from the
17
+ * `install()` policy chain:
18
+ * 1. `writeInstallFiles()`'s disk-write + rollback-on-partial-write handling
19
+ * (skill-installation.io.ts), plus this module's own manifest-driven
20
+ * already-installed/force gate (mirrors `install()`'s ALREADY_INSTALLED
21
+ * check).
22
+ * 2. A security scan at the `community` trust tier, via the same
23
+ * `classifyBundledFile()`/`isRejectableScan()` policy `install()` uses
24
+ * for optional bundled files (skill-installation.policy.ts) — applied
25
+ * here to every content-map entry (including "SKILL.md" itself, which
26
+ * falls through to the conservative 'structured' default class since it
27
+ * has no BUNDLED_SCAN_FILES entry).
28
+ *
29
+ * It deliberately does NOT route through the rest of `install()`'s chain:
30
+ * - `skipScan` is NOT an accepted option here. Registry-content installs
31
+ * always scan — there is no opt-out, unlike `install()`'s tier-gated
32
+ * skipScan.
33
+ * - Dependency-intelligence extraction/persistence (extractDepIntel,
34
+ * persistDependencies, checkDepsAgainstQuarantine), risk-history
35
+ * recording, AI-defence feedback, and co-install-session recording are
36
+ * all OUT of v1 scope — a known, intentional gap, not a silent drop.
37
+ * Wave 3's MCP `install` action and Wave 4's CLI command do not get
38
+ * these signals for private-registry installs yet.
39
+ * - Frontmatter/manifest validation on `SKILL.md` itself DOES still run
40
+ * (`validateSkillMd()`), same as any other install.
41
+ *
42
+ * PATH VALIDATION (Sol review #2, critical, confirmed exploitable): every key
43
+ * in `content` is attacker-controlled — any team member with publish access
44
+ * chooses these filenames — and flows into `writeInstallFiles()`'s
45
+ * `path.join(installPath, subSkill.filename)` (skill-installation.io.ts:167)
46
+ * with NO containment check of its own. `path.join('/a/b', '../../etc/passwd')`
47
+ * escapes `installPath` after normalization, so every key is validated here,
48
+ * BEFORE any disk write — see `validateContentKeys()`.
49
+ */
50
+ import * as path from 'path';
51
+ import { TRUST_TIER_SCANNER_OPTIONS } from './skill-installation.types.js';
52
+ import { SecurityScanner } from '../security/index.js';
53
+ import { classifyBundledFile, extractPackageJsonLifecycleScripts, isRejectableScan, } from './skill-installation.policy.js';
54
+ import { validateSkillMd } from './skill-installation.validate.js';
55
+ import { buildInstallFailure } from './skill-installation.errors.js';
56
+ import { writeInstallFiles } from './skill-installation.io.js';
57
+ import { applyOptimization, generateTips, hashContent, manifestKeyFor, sanitizeInstallError, } from './skill-installation.helpers.js';
58
+ /** SMI-5905: content-based installs always scan at this trust tier — no skipScan opt-out. */
59
+ const CONTENT_INSTALL_TRUST_TIER = 'community';
60
+ /** Byte used to detect NUL-byte injection in a content-map key. */
61
+ const NUL_BYTE = '\x00';
62
+ /**
63
+ * Classify why a single content-map key is unsafe to use as a relative
64
+ * install-path filename, or return null when it's safe.
65
+ *
66
+ * Each check below is independently sufficient to reject the key — order
67
+ * only affects which reason surfaces first in the error message.
68
+ */
69
+ function unsafeContentKeyReason(key) {
70
+ if (key.length === 0 || key === '.')
71
+ return 'is empty or a bare "." path';
72
+ if (key.includes(NUL_BYTE))
73
+ return 'contains a NUL byte';
74
+ if (key.includes('\\'))
75
+ return 'contains a backslash';
76
+ // path.win32.isAbsolute() recognizes drive-letter ("C:\\foo") and UNC
77
+ // ("\\\\server\\share") forms regardless of the host platform; POSIX-style
78
+ // absolute paths are covered by path.posix.isAbsolute().
79
+ if (path.posix.isAbsolute(key) || path.win32.isAbsolute(key))
80
+ return 'is an absolute path';
81
+ const segments = key.split('/');
82
+ if (segments.some((seg) => seg === '..'))
83
+ return 'contains a ".." path segment';
84
+ if (segments[0] === '.git')
85
+ return 'targets the .git directory';
86
+ return null;
87
+ }
88
+ /**
89
+ * Validate every key in a content map before any disk write.
90
+ *
91
+ * Rejects (as a single combined error, first offense wins):
92
+ * - path-traversal (`..` segment), absolute paths (posix or win32/UNC),
93
+ * NUL bytes, backslashes, empty/bare-"."/".git"-adjacent keys;
94
+ * - any key that, after `path.resolve()` against `installPath`, resolves
95
+ * outside `installPath` (a lexical backstop behind the checks above,
96
+ * matching `writeInstallFiles()`'s own lexical escape check);
97
+ * - two keys that `path.normalize()` to the same on-disk path (a
98
+ * collision — e.g. "SKILL.md" and "./SKILL.md").
99
+ */
100
+ export function validateContentKeys(content, installPath) {
101
+ const resolvedInstall = path.resolve(installPath);
102
+ const seenByNormalizedPath = new Map();
103
+ for (const key of Object.keys(content)) {
104
+ const reason = unsafeContentKeyReason(key);
105
+ if (reason) {
106
+ return { valid: false, error: `Rejected content key "${key}": ${reason}.` };
107
+ }
108
+ const resolved = path.resolve(installPath, key);
109
+ if (resolved !== resolvedInstall && !resolved.startsWith(resolvedInstall + path.sep)) {
110
+ return {
111
+ valid: false,
112
+ error: `Rejected content key "${key}": resolves outside the install directory.`,
113
+ };
114
+ }
115
+ const normalized = path.normalize(key);
116
+ const priorKey = seenByNormalizedPath.get(normalized);
117
+ if (priorKey !== undefined) {
118
+ return {
119
+ valid: false,
120
+ error: `Rejected content keys "${priorKey}" and "${key}": both normalize to the ` +
121
+ 'same on-disk path.',
122
+ };
123
+ }
124
+ seenByNormalizedPath.set(normalized, key);
125
+ }
126
+ return { valid: true };
127
+ }
128
+ /**
129
+ * Scan every content-map entry at the `community` trust tier, reusing the
130
+ * exact per-file classification/rejection policy `install()` applies to
131
+ * optional bundled files (skill-installation.policy.ts) — unchanged.
132
+ *
133
+ * "SKILL.md" has no BUNDLED_SCAN_FILES entry, so it falls through to the
134
+ * conservative 'structured' default class (hard-reject on failure), which is
135
+ * the correct posture for a team member's own untrusted main content.
136
+ *
137
+ * Returns the first rejecting file's report, or null if every file passed
138
+ * (or was a 'doc'-class file whose scan failure is a documented FP-control
139
+ * skip — see isRejectableScan()'s doc comment).
140
+ */
141
+ function scanContentFiles(content, skillId) {
142
+ const scanner = new SecurityScanner(TRUST_TIER_SCANNER_OPTIONS[CONTENT_INSTALL_TRUST_TIER]);
143
+ for (const [filename, text] of Object.entries(content)) {
144
+ const fileClass = classifyBundledFile(filename);
145
+ let textToScan = text;
146
+ if (fileClass === 'package-json') {
147
+ const lifecycle = extractPackageJsonLifecycleScripts(text);
148
+ textToScan = lifecycle.length > 0 ? lifecycle : null;
149
+ }
150
+ if (textToScan === null)
151
+ continue;
152
+ const report = scanner.scan(skillId + '/' + filename, textToScan);
153
+ if (isRejectableScan(report)) {
154
+ if (fileClass === 'doc')
155
+ continue; // H6 FP control — same as fetchAndScanOptionalFiles
156
+ return { file: filename, report };
157
+ }
158
+ }
159
+ return null;
160
+ }
161
+ /**
162
+ * Derive the on-disk skill name from an `author/name`-format skillId, or `null` if any
163
+ * `/`-separated segment is unsafe as a path component.
164
+ *
165
+ * Sol final-code-review finding #1 (confirmed exploitable): callers upstream (the MCP/CLI/Edge
166
+ * Function skillId validators, and the `private_registry_skills.skill_id` DB CHECK itself) all
167
+ * share the same permissive `/^[^/]+\/[^/]+$/` format check, which accepts "." and ".." as
168
+ * either segment — "myteam/.." passes it. Without this check, `path.join(skillsDir, '..')`
169
+ * collapses the install path to skillsDir's PARENT, and `writeInstallFiles()` would happily
170
+ * write "SKILL.md" there. This is the actual disk-write boundary and the last line of defense
171
+ * regardless of what any upstream schema/DB-constraint layer allows — a schema-only fix would
172
+ * not protect a stub/test call site (or a future caller) that bypasses Zod entirely.
173
+ */
174
+ function skillNameFromSkillId(skillId) {
175
+ const parts = skillId.split('/');
176
+ const name = parts.length >= 2 ? parts[parts.length - 1] : skillId;
177
+ for (const part of parts) {
178
+ const trimmed = part.trim();
179
+ if (trimmed.length === 0 || trimmed === '.' || trimmed === '..')
180
+ return null;
181
+ }
182
+ return name;
183
+ }
184
+ /**
185
+ * Install an already-resolved private-registry skill's content to disk.
186
+ *
187
+ * See this file's header doc comment for the full scope trim vs. `install()`.
188
+ */
189
+ export async function installFromContent(params) {
190
+ const { db, skillsDir, manifest, client, onProgress, skillId, version, content, force = false, } = params;
191
+ const skillName = skillNameFromSkillId(skillId);
192
+ const trustTier = CONTENT_INSTALL_TRUST_TIER;
193
+ if (skillName === null) {
194
+ return buildInstallFailure('INVALID_CONTENT', {
195
+ skillId,
196
+ installPath: skillsDir,
197
+ trustTier,
198
+ error: `Rejected skillId "${skillId}": segments must not be empty, ".", or "..".`,
199
+ });
200
+ }
201
+ const installPath = path.join(skillsDir, skillName);
202
+ try {
203
+ onProgress('validate', 'Validating package content');
204
+ const skillMdContent = content['SKILL.md'];
205
+ if (typeof skillMdContent !== 'string' || skillMdContent.length === 0) {
206
+ return buildInstallFailure('INVALID_CONTENT', {
207
+ skillId,
208
+ installPath,
209
+ trustTier,
210
+ error: 'Package content must include a non-empty "SKILL.md" entry.',
211
+ });
212
+ }
213
+ // Critical (Sol review #2): every content-map key is attacker-controlled.
214
+ // Must run BEFORE any disk write.
215
+ const keyValidation = validateContentKeys(content, installPath);
216
+ if (!keyValidation.valid) {
217
+ return buildInstallFailure('INVALID_CONTENT', {
218
+ skillId,
219
+ installPath,
220
+ trustTier,
221
+ error: keyValidation.error,
222
+ });
223
+ }
224
+ const mdValidation = validateSkillMd(skillMdContent);
225
+ if (!mdValidation.valid) {
226
+ return buildInstallFailure('VALIDATION_FAILED', {
227
+ skillId,
228
+ installPath,
229
+ trustTier,
230
+ error: 'Invalid SKILL.md: ' + mdValidation.errors.join(', '),
231
+ tips: [
232
+ 'SKILL.md must have YAML frontmatter with name and description fields',
233
+ 'Content must be at least 100 characters',
234
+ ],
235
+ });
236
+ }
237
+ onProgress('manifest', 'Checking manifest');
238
+ const manifestData = await manifest.load();
239
+ const manifestKey = manifestKeyFor(skillName, client);
240
+ if (manifestData.installedSkills[manifestKey] && !force) {
241
+ return buildInstallFailure('ALREADY_INSTALLED', {
242
+ skillId,
243
+ installPath,
244
+ trustTier,
245
+ error: 'Skill "' + skillName + '" is already installed. Use force=true to reinstall.',
246
+ });
247
+ }
248
+ onProgress('scan', 'Running security scan');
249
+ const rejected = scanContentFiles(content, skillId);
250
+ if (rejected) {
251
+ return buildInstallFailure('SCAN_REJECTED', {
252
+ skillId,
253
+ installPath,
254
+ trustTier,
255
+ securityReport: rejected.report,
256
+ error: 'File "' +
257
+ rejected.file +
258
+ '" failed the security scan (risk score ' +
259
+ rejected.report.riskScore +
260
+ '). See https://skillsmith.app/docs/security/scanner',
261
+ tips: [
262
+ 'Rejected file: ' + rejected.file,
263
+ 'Risk score: ' + rejected.report.riskScore,
264
+ 'Security scanner docs: https://skillsmith.app/docs/security/scanner',
265
+ ],
266
+ });
267
+ }
268
+ onProgress('optimize', 'Applying optimization');
269
+ const { finalSkillContent, subSkillFiles, subagentContent, optimizationInfo } = await applyOptimization(db, skillId, skillName, skillMdContent);
270
+ // Team-authored content wins any filename collision with a generated sub-skill.
271
+ const teamAuthoredSubFiles = Object.entries(content)
272
+ .filter(([filename]) => filename !== 'SKILL.md')
273
+ .map(([filename, fileContent]) => ({ filename, content: fileContent }));
274
+ const generatedNoCollision = subSkillFiles.filter((generated) => !teamAuthoredSubFiles.some((team) => team.filename === generated.filename));
275
+ onProgress('write', 'Writing skill files');
276
+ const writeResult = await writeInstallFiles(installPath, skillsDir, skillName, finalSkillContent, [...generatedNoCollision, ...teamAuthoredSubFiles], subagentContent);
277
+ if (writeResult.subagentPath) {
278
+ optimizationInfo.subagentPath = writeResult.subagentPath;
279
+ }
280
+ onProgress('manifest', 'Updating manifest');
281
+ await manifest.updateSafely((currentManifest) => ({
282
+ ...currentManifest,
283
+ installedSkills: {
284
+ ...currentManifest.installedSkills,
285
+ [manifestKey]: {
286
+ id: skillId,
287
+ name: skillName,
288
+ version,
289
+ // SMI-5905: provenance for content-sourced installs (never a github: URL).
290
+ source: 'private-registry:' + skillId,
291
+ installPath,
292
+ installedAt: new Date().toISOString(),
293
+ lastUpdated: new Date().toISOString(),
294
+ originalContentHash: hashContent(finalSkillContent),
295
+ client,
296
+ },
297
+ },
298
+ }));
299
+ onProgress('done', 'Installation complete');
300
+ const tips = generateTips(skillName, optimizationInfo, client, skillsDir);
301
+ return {
302
+ success: true,
303
+ skillId,
304
+ installPath,
305
+ trustTier,
306
+ optimization: optimizationInfo,
307
+ tips,
308
+ };
309
+ }
310
+ catch (error) {
311
+ return buildInstallFailure('UNKNOWN', {
312
+ skillId,
313
+ installPath,
314
+ trustTier,
315
+ error: sanitizeInstallError(error),
316
+ });
317
+ }
318
+ }
319
+ //# sourceMappingURL=skill-installation.content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installation.content.js","sourceRoot":"","sources":["../../../src/services/skill-installation.content.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import type { ScanReport } from '../security/index.js';
13
13
  import type { DepIntelResult, OptimizationInfo, ProgressCallback, UninstallResult } from './skill-installation.types.js';
14
14
  export { fetchFromGitHub } from './skill-installation.io.js';
15
15
  import type { ManifestManager } from './skill-manifest.js';
16
+ import { type ClientId } from '../install/paths.js';
16
17
  /** Result of applying optimization to a skill's content. */
17
18
  export interface OptimizationResult {
18
19
  finalSkillContent: string;
@@ -25,7 +26,15 @@ export interface OptimizationResult {
25
26
  optimizationInfo: OptimizationInfo;
26
27
  }
27
28
  export declare function hashContent(content: string): string;
28
- export declare function generateTips(skillName: string, optimizationInfo: OptimizationInfo): string[];
29
+ /**
30
+ * SMI-5894 (Wave 1 Step 5): `client`/`skillsDir` default to the canonical
31
+ * (Claude Code) client so every existing caller that doesn't pass them
32
+ * (tests, and anywhere the service is constructed without `client`) keeps
33
+ * seeing exactly the previous "Claude Code" / `~/.claude/skills/` wording —
34
+ * only a caller that actually resolved a non-canonical client sees the tips
35
+ * name that client and its real install path.
36
+ */
37
+ export declare function generateTips(skillName: string, optimizationInfo: OptimizationInfo, client?: ClientId, skillsDir?: string): string[];
29
38
  /**
30
39
  * Read the MCP server names registered in the consuming project's
31
40
  * `.mcp.json` (SMI-5676). Used to cross-check `extractMcpReferences`
@@ -61,6 +70,25 @@ export declare function extractDepIntel(skillMdContent: string): DepIntelResult;
61
70
  * value directly.
62
71
  */
63
72
  export declare function persistDependencies(repo: SkillDependencyRepository, skillId: string, content: string, declared: DepIntelResult['dep_declared']): number;
73
+ /**
74
+ * SMI-5894 (Wave 1 Step 3): compute the `~/.skillsmith/manifest.json`
75
+ * `installedSkills` key for a given skill name + client.
76
+ *
77
+ * Canonical-client (`claude-code`) entries keep the legacy bare-name key —
78
+ * every manifest reader written before multi-client installs existed
79
+ * (`pin.ts`, `diff.ts`, MCP's `install.conflict.ts`, MCP's `uninstall_skill`
80
+ * `listInstalledSkills()`, none of which are in this wave's scope) indexes
81
+ * `installedSkills[name]` directly and must keep working unmodified for the
82
+ * single-client-install case, which remains the overwhelming majority.
83
+ * Only non-canonical clients get the composite `name::client` key, since
84
+ * those are the ONLY entries that could previously silently collide with
85
+ * (overwrite) a same-named install recorded under a different client —
86
+ * exactly the bug this function exists to close. See the plan doc
87
+ * (docs/internal/implementation/cursor-integration-readiness-cli-mcp-parity.md,
88
+ * Wave 1 Step 3) for the full rationale and the deliberately additive,
89
+ * backward-compatible shape of this fix.
90
+ */
91
+ export declare function manifestKeyFor(name: string, client: ClientId): string;
64
92
  /** Perform skill uninstall with manifest awareness and orphan fallback. */
65
93
  export declare function performUninstall(params: {
66
94
  skillName: string;
@@ -69,6 +97,9 @@ export declare function performUninstall(params: {
69
97
  manifest: ManifestManager;
70
98
  skillDependencyRepo: SkillDependencyRepository;
71
99
  onProgress: ProgressCallback;
100
+ /** SMI-5894 Wave 1 Step 3: defaults to the canonical client for callers
101
+ * that don't yet resolve a client (preserves pre-existing behavior). */
102
+ client?: ClientId;
72
103
  }): Promise<UninstallResult>;
73
104
  /**
74
105
  * Apply skill optimization via TransformationService.
@@ -1 +1 @@
1
- {"version":3,"file":"skill-installation.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-installation.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"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"}
@@ -16,14 +16,25 @@ import { TransformationService } from '../services/TransformationService.js';
16
16
  import { computeQualityScore } from '../scoring/quality-score.js';
17
17
  import { checkForModifications } from './skill-installation.io.js';
18
18
  export { fetchFromGitHub } from './skill-installation.io.js';
19
+ import { CANONICAL_CLIENT, CLIENT_DISPLAY_LABELS } from '../install/paths.js';
19
20
  export function hashContent(content) {
20
21
  return createHash('sha256').update(content).digest('hex');
21
22
  }
22
- export function generateTips(skillName, optimizationInfo) {
23
+ /**
24
+ * SMI-5894 (Wave 1 Step 5): `client`/`skillsDir` default to the canonical
25
+ * (Claude Code) client so every existing caller that doesn't pass them
26
+ * (tests, and anywhere the service is constructed without `client`) keeps
27
+ * seeing exactly the previous "Claude Code" / `~/.claude/skills/` wording —
28
+ * only a caller that actually resolved a non-canonical client sees the tips
29
+ * name that client and its real install path.
30
+ */
31
+ export function generateTips(skillName, optimizationInfo, client = CANONICAL_CLIENT, skillsDir) {
32
+ const clientLabel = CLIENT_DISPLAY_LABELS[client];
33
+ const dir = skillsDir ?? '~/.claude/skills';
23
34
  const tips = [
24
35
  'Skill "' + skillName + '" installed successfully!',
25
- 'To use this skill, mention it in Claude Code: "Use the ' + skillName + ' skill to..."',
26
- 'View installed skills: ls ~/.claude/skills/',
36
+ 'To use this skill, mention it in ' + clientLabel + ': "Use the ' + skillName + ' skill to..."',
37
+ 'View installed skills: ls ' + dir + '/',
27
38
  ];
28
39
  if (optimizationInfo.optimized) {
29
40
  tips.push('', '[Optimization] Skillsmith Optimization Applied:');
@@ -132,13 +143,35 @@ export function persistDependencies(repo, skillId, content, declared) {
132
143
  }
133
144
  return rows.length;
134
145
  }
146
+ /**
147
+ * SMI-5894 (Wave 1 Step 3): compute the `~/.skillsmith/manifest.json`
148
+ * `installedSkills` key for a given skill name + client.
149
+ *
150
+ * Canonical-client (`claude-code`) entries keep the legacy bare-name key —
151
+ * every manifest reader written before multi-client installs existed
152
+ * (`pin.ts`, `diff.ts`, MCP's `install.conflict.ts`, MCP's `uninstall_skill`
153
+ * `listInstalledSkills()`, none of which are in this wave's scope) indexes
154
+ * `installedSkills[name]` directly and must keep working unmodified for the
155
+ * single-client-install case, which remains the overwhelming majority.
156
+ * Only non-canonical clients get the composite `name::client` key, since
157
+ * those are the ONLY entries that could previously silently collide with
158
+ * (overwrite) a same-named install recorded under a different client —
159
+ * exactly the bug this function exists to close. See the plan doc
160
+ * (docs/internal/implementation/cursor-integration-readiness-cli-mcp-parity.md,
161
+ * Wave 1 Step 3) for the full rationale and the deliberately additive,
162
+ * backward-compatible shape of this fix.
163
+ */
164
+ export function manifestKeyFor(name, client) {
165
+ return client === CANONICAL_CLIENT ? name : `${name}::${client}`;
166
+ }
135
167
  /** Perform skill uninstall with manifest awareness and orphan fallback. */
136
168
  export async function performUninstall(params) {
137
- const { skillName, force, skillsDir, manifest, skillDependencyRepo, onProgress } = params;
169
+ const { skillName, force, skillsDir, manifest, skillDependencyRepo, onProgress, client = CANONICAL_CLIENT, } = params;
170
+ const manifestKey = manifestKeyFor(skillName, client);
138
171
  try {
139
172
  onProgress('manifest', 'Loading manifest');
140
173
  const manifestData = await manifest.load();
141
- const skillEntry = manifestData.installedSkills[skillName];
174
+ const skillEntry = manifestData.installedSkills[manifestKey];
142
175
  if (!skillEntry) {
143
176
  const potentialPath = path.join(skillsDir, skillName);
144
177
  try {
@@ -197,7 +230,7 @@ export async function performUninstall(params) {
197
230
  // Table may not exist pre-migration
198
231
  }
199
232
  onProgress('manifest', 'Updating manifest');
200
- delete manifestData.installedSkills[skillName];
233
+ delete manifestData.installedSkills[manifestKey];
201
234
  await manifest.save(manifestData);
202
235
  onProgress('done', 'Uninstall complete');
203
236
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"skill-installation.helpers.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-installation.helpers.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,18 @@
1
1
  /**
2
2
  * @fileoverview Tests for the SMI-5676 `.mcp.json` cross-check additions to
3
3
  * skill-installation.helpers.ts (`getRegisteredMcpServers`, and the
4
- * resolution-aware warning filtering in `extractDepIntel`).
4
+ * resolution-aware warning filtering in `extractDepIntel`), plus the
5
+ * SMI-5894 Wave 1 multi-client manifest-keying + tips additions
6
+ * (`manifestKeyFor`, `generateTips`).
5
7
  * @module @skillsmith/core/services/skill-installation.helpers.test
6
8
  * @see SMI-5676: Wave 1 Step 3b — harden extractMcpReferences
9
+ * @see SMI-5894: Wave 1 Steps 3/5 — multi-client manifest re-keying + tips
7
10
  */
8
11
  import { describe, expect, it, beforeEach, afterEach } from 'vitest';
9
12
  import * as fs from 'fs';
10
13
  import * as os from 'os';
11
14
  import * as path from 'path';
12
- import { extractDepIntel, getRegisteredMcpServers } from './skill-installation.helpers.js';
15
+ import { extractDepIntel, getRegisteredMcpServers, generateTips, manifestKeyFor, } from './skill-installation.helpers.js';
13
16
  describe('getRegisteredMcpServers (SMI-5676)', () => {
14
17
  let tmpDir;
15
18
  beforeEach(() => {
@@ -77,4 +80,33 @@ describe('extractDepIntel resolution-aware warnings (SMI-5676)', () => {
77
80
  expect(result.dep_warnings.some((w) => w.includes('linear'))).toBe(true);
78
81
  });
79
82
  });
83
+ describe('manifestKeyFor (SMI-5894 Wave 1 Step 3)', () => {
84
+ it('keys the canonical client (claude-code) by bare name — backward compatible', () => {
85
+ expect(manifestKeyFor('my-skill', 'claude-code')).toBe('my-skill');
86
+ });
87
+ it('keys a non-canonical client with a composite name::client key', () => {
88
+ expect(manifestKeyFor('my-skill', 'cursor')).toBe('my-skill::cursor');
89
+ expect(manifestKeyFor('my-skill', 'windsurf')).toBe('my-skill::windsurf');
90
+ });
91
+ it('produces distinct keys for the same skill name under different clients', () => {
92
+ const claudeKey = manifestKeyFor('same-name', 'claude-code');
93
+ const cursorKey = manifestKeyFor('same-name', 'cursor');
94
+ expect(claudeKey).not.toBe(cursorKey);
95
+ });
96
+ });
97
+ describe('generateTips (SMI-5894 Wave 1 Step 5)', () => {
98
+ const optimizationInfo = { optimized: false };
99
+ it('defaults to Claude Code wording when client/skillsDir are omitted (backward compatible)', () => {
100
+ const tips = generateTips('my-skill', optimizationInfo);
101
+ expect(tips.join('\n')).toContain('mention it in Claude Code');
102
+ expect(tips.join('\n')).toContain('ls ~/.claude/skills/');
103
+ });
104
+ it('names the actual client and install path when a non-canonical client is resolved', () => {
105
+ const tips = generateTips('my-skill', optimizationInfo, 'cursor', '/home/user/.cursor/skills');
106
+ const joined = tips.join('\n');
107
+ expect(joined).toContain('mention it in Cursor');
108
+ expect(joined).toContain('ls /home/user/.cursor/skills/');
109
+ expect(joined).not.toContain('Claude Code');
110
+ });
111
+ });
80
112
  //# sourceMappingURL=skill-installation.helpers.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-installation.helpers.test.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-installation.helpers.test.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill-installation.io.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAStE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQ1E;AAkBD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAcD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3D,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,kBAAkB,CAAC,CA0E7B;AAED,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB;;;OAGG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,CAAA;IACxD,4EAA4E;IAC5E,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,GAAG,IAAI,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAgDrC"}
1
+ {"version":3,"file":"skill-installation.io.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAStE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQ1E;AAkBD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAcD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAmED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3D,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAiF7B;AAED,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB;;;OAGG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,CAAA;IACxD,4EAA4E;IAC5E,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,GAAG,IAAI,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAgDrC"}