@dollhousemcp/mcp-server 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +494 -111
  3. package/data/agents/code-reviewer.md +8 -1
  4. package/data/agents/research-assistant.md +8 -1
  5. package/data/agents/task-manager.md +8 -1
  6. package/data/ensembles/business-advisor.md +8 -1
  7. package/data/ensembles/creative-studio.md +8 -1
  8. package/data/ensembles/development-team.md +8 -1
  9. package/data/ensembles/security-analysis-team.md +8 -1
  10. package/data/memories/conversation-history.md +8 -1
  11. package/data/memories/learning-progress.md +8 -1
  12. package/data/memories/project-context.md +8 -1
  13. package/data/personas/business-consultant.md +8 -1
  14. package/data/personas/creative-writer.md +8 -1
  15. package/data/personas/debug-detective.md +8 -1
  16. package/data/personas/eli5-explainer.md +8 -1
  17. package/data/personas/security-analyst.md +8 -1
  18. package/data/personas/technical-analyst.md +8 -1
  19. package/data/skills/code-review.md +8 -1
  20. package/data/skills/creative-writing.md +8 -1
  21. package/data/skills/data-analysis.md +8 -1
  22. package/data/skills/penetration-testing.md +8 -1
  23. package/data/skills/research.md +8 -1
  24. package/data/skills/threat-modeling.md +8 -1
  25. package/data/skills/translation.md +8 -1
  26. package/data/templates/code-documentation.md +8 -1
  27. package/data/templates/email-professional.md +8 -1
  28. package/data/templates/meeting-notes.md +8 -1
  29. package/data/templates/penetration-test-report.md +8 -1
  30. package/data/templates/project-brief.md +8 -1
  31. package/data/templates/report-executive.md +8 -1
  32. package/data/templates/security-vulnerability-report.md +8 -1
  33. package/data/templates/threat-assessment-report.md +8 -1
  34. package/dist/auth/GitHubAuthManager.d.ts +6 -1
  35. package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
  36. package/dist/auth/GitHubAuthManager.js +45 -18
  37. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
  38. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
  39. package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
  40. package/dist/cache/CollectionCache.d.ts.map +1 -1
  41. package/dist/cache/CollectionCache.js +13 -3
  42. package/dist/cache/CollectionIndexCache.d.ts +77 -0
  43. package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
  44. package/dist/cache/CollectionIndexCache.js +349 -0
  45. package/dist/cache/LRUCache.d.ts +93 -0
  46. package/dist/cache/LRUCache.d.ts.map +1 -0
  47. package/dist/cache/LRUCache.js +299 -0
  48. package/dist/cache/index.d.ts +1 -0
  49. package/dist/cache/index.d.ts.map +1 -1
  50. package/dist/cache/index.js +2 -1
  51. package/dist/collection/CollectionBrowser.d.ts +21 -1
  52. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  53. package/dist/collection/CollectionBrowser.js +130 -10
  54. package/dist/collection/CollectionIndexManager.d.ts +151 -0
  55. package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
  56. package/dist/collection/CollectionIndexManager.js +499 -0
  57. package/dist/collection/CollectionSearch.d.ts +55 -0
  58. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  59. package/dist/collection/CollectionSearch.js +338 -13
  60. package/dist/collection/CollectionSeeder.d.ts.map +1 -1
  61. package/dist/collection/CollectionSeeder.js +38 -1
  62. package/dist/collection/ElementInstaller.d.ts +31 -0
  63. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  64. package/dist/collection/ElementInstaller.js +77 -15
  65. package/dist/collection/PersonaSubmitter.d.ts +1 -1
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  67. package/dist/collection/PersonaSubmitter.js +2 -2
  68. package/dist/collection/index.d.ts +1 -0
  69. package/dist/collection/index.d.ts.map +1 -1
  70. package/dist/collection/index.js +2 -1
  71. package/dist/config/ConfigManager.d.ts +78 -0
  72. package/dist/config/ConfigManager.d.ts.map +1 -0
  73. package/dist/config/ConfigManager.js +216 -0
  74. package/dist/config/element-types.d.ts +135 -0
  75. package/dist/config/element-types.d.ts.map +1 -0
  76. package/dist/config/element-types.js +108 -0
  77. package/dist/config/index.d.ts +2 -0
  78. package/dist/config/index.d.ts.map +1 -1
  79. package/dist/config/index.js +3 -1
  80. package/dist/config/portfolio-constants.d.ts +83 -0
  81. package/dist/config/portfolio-constants.d.ts.map +1 -0
  82. package/dist/config/portfolio-constants.js +99 -0
  83. package/dist/elements/BaseElement.d.ts +14 -2
  84. package/dist/elements/BaseElement.d.ts.map +1 -1
  85. package/dist/elements/BaseElement.js +88 -6
  86. package/dist/elements/agents/Agent.d.ts +10 -1
  87. package/dist/elements/agents/Agent.d.ts.map +1 -1
  88. package/dist/elements/agents/Agent.js +66 -19
  89. package/dist/elements/agents/AgentManager.d.ts +2 -0
  90. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  91. package/dist/elements/agents/AgentManager.js +12 -10
  92. package/dist/elements/skills/Skill.d.ts +10 -1
  93. package/dist/elements/skills/Skill.d.ts.map +1 -1
  94. package/dist/elements/skills/Skill.js +40 -3
  95. package/dist/elements/skills/SkillManager.d.ts +1 -0
  96. package/dist/elements/skills/SkillManager.d.ts.map +1 -1
  97. package/dist/elements/skills/SkillManager.js +10 -4
  98. package/dist/elements/templates/Template.d.ts +10 -1
  99. package/dist/elements/templates/Template.d.ts.map +1 -1
  100. package/dist/elements/templates/Template.js +35 -18
  101. package/dist/elements/templates/TemplateManager.d.ts +1 -1
  102. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  103. package/dist/elements/templates/TemplateManager.js +6 -5
  104. package/dist/generated/version.d.ts +2 -2
  105. package/dist/generated/version.js +3 -3
  106. package/dist/index.barrel.d.ts +1 -2
  107. package/dist/index.barrel.d.ts.map +1 -1
  108. package/dist/index.barrel.js +2 -4
  109. package/dist/index.d.ts +143 -25
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +1883 -310
  112. package/dist/persona/PersonaElement.d.ts +10 -0
  113. package/dist/persona/PersonaElement.d.ts.map +1 -1
  114. package/dist/persona/PersonaElement.js +55 -32
  115. package/dist/persona/PersonaElementManager.d.ts.map +1 -1
  116. package/dist/persona/PersonaElementManager.js +13 -11
  117. package/dist/persona/PersonaLoader.d.ts.map +1 -1
  118. package/dist/persona/PersonaLoader.js +8 -2
  119. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
  120. package/dist/persona/export-import/PersonaImporter.js +24 -5
  121. package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
  122. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
  123. package/dist/persona/export-import/PersonaSharer.js +198 -22
  124. package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
  125. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  126. package/dist/portfolio/DefaultElementProvider.js +499 -7
  127. package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
  128. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
  129. package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
  130. package/dist/portfolio/MigrationManager.d.ts.map +1 -1
  131. package/dist/portfolio/MigrationManager.js +136 -3
  132. package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
  133. package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
  134. package/dist/portfolio/PortfolioIndexManager.js +478 -0
  135. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  136. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  137. package/dist/portfolio/PortfolioManager.js +61 -20
  138. package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
  139. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
  140. package/dist/portfolio/PortfolioRepoManager.js +337 -0
  141. package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
  142. package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
  143. package/dist/portfolio/UnifiedIndexManager.js +1434 -0
  144. package/dist/portfolio/index.d.ts +15 -0
  145. package/dist/portfolio/index.d.ts.map +1 -0
  146. package/dist/portfolio/index.js +15 -0
  147. package/dist/portfolio/types.d.ts +7 -0
  148. package/dist/portfolio/types.d.ts.map +1 -1
  149. package/dist/portfolio/types.js +6 -1
  150. package/dist/security/InputValidator.d.ts.map +1 -1
  151. package/dist/security/InputValidator.js +50 -48
  152. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  153. package/dist/security/audit/SecurityAuditor.js +17 -9
  154. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  155. package/dist/security/audit/config/suppressions.js +19 -3
  156. package/dist/security/contentValidator.d.ts +2 -0
  157. package/dist/security/contentValidator.d.ts.map +1 -1
  158. package/dist/security/contentValidator.js +115 -4
  159. package/dist/security/secureYamlParser.d.ts +1 -0
  160. package/dist/security/secureYamlParser.d.ts.map +1 -1
  161. package/dist/security/secureYamlParser.js +29 -7
  162. package/dist/security/securityMonitor.d.ts +1 -1
  163. package/dist/security/securityMonitor.d.ts.map +1 -1
  164. package/dist/security/securityMonitor.js +1 -1
  165. package/dist/security/tokenManager.d.ts +1 -1
  166. package/dist/security/tokenManager.d.ts.map +1 -1
  167. package/dist/security/tokenManager.js +30 -10
  168. package/dist/server/ServerSetup.d.ts +22 -2
  169. package/dist/server/ServerSetup.d.ts.map +1 -1
  170. package/dist/server/ServerSetup.js +77 -12
  171. package/dist/server/tools/AuthTools.d.ts.map +1 -1
  172. package/dist/server/tools/AuthTools.js +33 -1
  173. package/dist/server/tools/BuildInfoTools.d.ts +25 -0
  174. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
  175. package/dist/server/tools/BuildInfoTools.js +36 -0
  176. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  177. package/dist/server/tools/CollectionTools.js +55 -46
  178. package/dist/server/tools/ConfigTools.d.ts.map +1 -1
  179. package/dist/server/tools/ConfigTools.js +29 -1
  180. package/dist/server/tools/PersonaTools.d.ts +4 -2
  181. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  182. package/dist/server/tools/PersonaTools.js +5 -152
  183. package/dist/server/tools/PortfolioTools.d.ts +12 -0
  184. package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
  185. package/dist/server/tools/PortfolioTools.js +221 -0
  186. package/dist/server/tools/index.d.ts +3 -1
  187. package/dist/server/tools/index.d.ts.map +1 -1
  188. package/dist/server/tools/index.js +4 -2
  189. package/dist/server/types.d.ts +40 -5
  190. package/dist/server/types.d.ts.map +1 -1
  191. package/dist/server/types.js +1 -1
  192. package/dist/services/BuildInfoService.d.ts +84 -0
  193. package/dist/services/BuildInfoService.d.ts.map +1 -0
  194. package/dist/services/BuildInfoService.js +271 -0
  195. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
  196. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
  197. package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
  198. package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
  199. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
  200. package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
  201. package/dist/tools/portfolio/types.d.ts +41 -0
  202. package/dist/tools/portfolio/types.d.ts.map +1 -0
  203. package/dist/tools/portfolio/types.js +15 -0
  204. package/dist/types/collection.d.ts +51 -0
  205. package/dist/types/collection.d.ts.map +1 -1
  206. package/dist/types/collection.js +1 -1
  207. package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
  208. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
  209. package/dist/utils/EarlyTerminationSearch.js +164 -0
  210. package/dist/utils/ErrorHandler.d.ts +86 -0
  211. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  212. package/dist/utils/ErrorHandler.js +201 -0
  213. package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
  214. package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
  215. package/dist/utils/FileDiscoveryUtil.js +169 -0
  216. package/dist/utils/GitHubRateLimiter.d.ts +88 -0
  217. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
  218. package/dist/utils/GitHubRateLimiter.js +315 -0
  219. package/dist/utils/PerformanceMonitor.d.ts +134 -0
  220. package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
  221. package/dist/utils/PerformanceMonitor.js +347 -0
  222. package/dist/utils/RateLimiter.d.ts.map +1 -0
  223. package/dist/utils/RateLimiter.js +172 -0
  224. package/dist/utils/SecureDownloader.d.ts +241 -0
  225. package/dist/utils/SecureDownloader.d.ts.map +1 -0
  226. package/dist/utils/SecureDownloader.js +759 -0
  227. package/dist/utils/ToolCache.d.ts +82 -0
  228. package/dist/utils/ToolCache.d.ts.map +1 -0
  229. package/dist/utils/ToolCache.js +196 -0
  230. package/dist/utils/errorCodes.d.ts +136 -0
  231. package/dist/utils/errorCodes.d.ts.map +1 -0
  232. package/dist/utils/errorCodes.js +87 -0
  233. package/dist/utils/index.d.ts +3 -0
  234. package/dist/utils/index.d.ts.map +1 -1
  235. package/dist/utils/index.js +4 -1
  236. package/dist/utils/installation.d.ts +1 -1
  237. package/dist/utils/installation.d.ts.map +1 -1
  238. package/dist/utils/installation.js +9 -8
  239. package/dist/utils/searchUtils.d.ts +31 -0
  240. package/dist/utils/searchUtils.d.ts.map +1 -1
  241. package/dist/utils/searchUtils.js +62 -1
  242. package/package.json +17 -7
  243. package/dist/config/updateConfig.d.ts +0 -84
  244. package/dist/config/updateConfig.d.ts.map +0 -1
  245. package/dist/config/updateConfig.js +0 -148
  246. package/dist/server/tools/UpdateTools.d.ts +0 -10
  247. package/dist/server/tools/UpdateTools.d.ts.map +0 -1
  248. package/dist/server/tools/UpdateTools.js +0 -85
  249. package/dist/update/BackupManager.d.ts +0 -63
  250. package/dist/update/BackupManager.d.ts.map +0 -1
  251. package/dist/update/BackupManager.js +0 -370
  252. package/dist/update/DependencyChecker.d.ts +0 -41
  253. package/dist/update/DependencyChecker.d.ts.map +0 -1
  254. package/dist/update/DependencyChecker.js +0 -132
  255. package/dist/update/RateLimiter.d.ts.map +0 -1
  256. package/dist/update/RateLimiter.js +0 -172
  257. package/dist/update/SignatureVerifier.d.ts +0 -71
  258. package/dist/update/SignatureVerifier.d.ts.map +0 -1
  259. package/dist/update/SignatureVerifier.js +0 -214
  260. package/dist/update/UpdateChecker.d.ts +0 -132
  261. package/dist/update/UpdateChecker.d.ts.map +0 -1
  262. package/dist/update/UpdateChecker.js +0 -506
  263. package/dist/update/UpdateManager.d.ts +0 -60
  264. package/dist/update/UpdateManager.d.ts.map +0 -1
  265. package/dist/update/UpdateManager.js +0 -730
  266. package/dist/update/VersionManager.d.ts +0 -31
  267. package/dist/update/VersionManager.d.ts.map +0 -1
  268. package/dist/update/VersionManager.js +0 -181
  269. package/dist/update/index.d.ts +0 -9
  270. package/dist/update/index.d.ts.map +0 -1
  271. package/dist/update/index.js +0 -9
  272. /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
@@ -1,214 +0,0 @@
1
- /**
2
- * SignatureVerifier - Verifies GitHub release signatures to ensure authenticity
3
- *
4
- * Security features:
5
- * - Verifies GPG signatures on git tags
6
- * - Validates release artifacts checksums
7
- * - Ensures releases come from trusted sources
8
- * - Prevents tampering and supply chain attacks
9
- */
10
- import { safeExec } from '../utils/git.js';
11
- import * as crypto from 'crypto';
12
- import * as fs from 'fs/promises';
13
- import * as path from 'path';
14
- import { randomBytes } from 'crypto';
15
- import { logger } from '../utils/logger.js';
16
- export class SignatureVerifier {
17
- trustedKeys;
18
- allowUnsignedInDev;
19
- constructor(options) {
20
- // Default trusted keys - should be GPG key IDs of maintainers
21
- this.trustedKeys = new Set(options?.trustedKeys || [
22
- // Add trusted GPG key fingerprints here
23
- // Example: '1234567890ABCDEF1234567890ABCDEF12345678'
24
- ]);
25
- // Allow unsigned releases in development mode
26
- this.allowUnsignedInDev = options?.allowUnsignedInDev ?? true;
27
- }
28
- /**
29
- * Verify a git tag signature
30
- * @param tagName The tag to verify (e.g., 'v1.2.0')
31
- * @returns Verification result with signer information
32
- */
33
- async verifyTagSignature(tagName) {
34
- try {
35
- // Check if GPG is available
36
- try {
37
- await safeExec('gpg', ['--version']);
38
- }
39
- catch {
40
- return {
41
- verified: false,
42
- error: 'GPG is not installed or not available in PATH'
43
- };
44
- }
45
- // Verify the tag signature
46
- const { stdout, stderr } = await safeExec('git', ['verify-tag', tagName]);
47
- // Parse GPG output (comes on stderr)
48
- const output = stderr || stdout;
49
- // Check for good signature
50
- if (!output.includes('Good signature')) {
51
- // Check if tag is unsigned
52
- if (output.includes('error: no signature found')) {
53
- if (this.allowUnsignedInDev && process.env.NODE_ENV !== 'production') {
54
- return {
55
- verified: true,
56
- error: 'Tag is unsigned (allowed in development mode)'
57
- };
58
- }
59
- return {
60
- verified: false,
61
- error: 'Tag is not signed'
62
- };
63
- }
64
- return {
65
- verified: false,
66
- error: 'Invalid signature'
67
- };
68
- }
69
- // Extract signer information
70
- const keyMatch = output.match(/key (?:ID )?([A-F0-9]+)/i);
71
- const emailMatch = output.match(/"([^"]+)"/);
72
- const dateMatch = output.match(/made (\w+ \w+ \d+ \d+:\d+:\d+ \d+ \w+)/);
73
- const signerKey = keyMatch ? keyMatch[1] : undefined;
74
- const signerEmail = emailMatch ? emailMatch[1] : undefined;
75
- const signatureDate = dateMatch ? new Date(dateMatch[1]) : undefined;
76
- // Check if key is trusted
77
- if (this.trustedKeys.size > 0 && signerKey) {
78
- // Check if the key ID ends with any of our trusted keys
79
- const isTrusted = Array.from(this.trustedKeys).some(trustedKey => signerKey.endsWith(trustedKey.toUpperCase()));
80
- if (!isTrusted) {
81
- return {
82
- verified: false,
83
- signerKey,
84
- signerEmail,
85
- signatureDate,
86
- error: `Signature is valid but key ${signerKey} is not in trusted keys list`
87
- };
88
- }
89
- }
90
- return {
91
- verified: true,
92
- signerKey,
93
- signerEmail,
94
- signatureDate
95
- };
96
- }
97
- catch (error) {
98
- return {
99
- verified: false,
100
- error: `Failed to verify signature: ${error instanceof Error ? error.message : String(error)}`
101
- };
102
- }
103
- }
104
- /**
105
- * Verify a file checksum against expected value
106
- * @param filePath Path to the file to verify
107
- * @param expectedChecksum Expected SHA256 checksum
108
- * @returns Verification result
109
- */
110
- async verifyChecksum(filePath, expectedChecksum) {
111
- try {
112
- // Read file and calculate checksum
113
- const fileBuffer = await fs.readFile(filePath);
114
- const hash = crypto.createHash('sha256');
115
- hash.update(fileBuffer);
116
- const actualChecksum = hash.digest('hex');
117
- // Compare checksums
118
- const verified = actualChecksum.toLowerCase() === expectedChecksum.toLowerCase();
119
- return {
120
- verified,
121
- expectedChecksum,
122
- actualChecksum,
123
- error: verified ? undefined : 'Checksum mismatch'
124
- };
125
- }
126
- catch (error) {
127
- return {
128
- verified: false,
129
- expectedChecksum,
130
- error: `Failed to verify checksum: ${error instanceof Error ? error.message : String(error)}`
131
- };
132
- }
133
- }
134
- /**
135
- * Verify release artifacts using a checksums file
136
- * @param checksumsFile Path to checksums file (e.g., SHA256SUMS)
137
- * @param artifactDir Directory containing artifacts to verify
138
- * @returns Map of filename to verification result
139
- */
140
- async verifyReleaseArtifacts(checksumsFile, artifactDir) {
141
- const results = new Map();
142
- try {
143
- // Read checksums file
144
- const checksumsContent = await fs.readFile(checksumsFile, 'utf-8');
145
- const lines = checksumsContent.split('\n').filter(line => line.trim());
146
- // Parse checksums (format: "checksum filename" or "checksum *filename")
147
- for (const line of lines) {
148
- const match = line.match(/^([a-f0-9]+)\s+\*?(.+)$/i);
149
- if (!match)
150
- continue;
151
- const [, checksum, filename] = match;
152
- const filePath = path.join(artifactDir, filename);
153
- // Verify each file
154
- const result = await this.verifyChecksum(filePath, checksum);
155
- results.set(filename, result);
156
- }
157
- return results;
158
- }
159
- catch (error) {
160
- // If we can't read the checksums file, mark all as unverified
161
- results.set('*', {
162
- verified: false,
163
- error: `Failed to read checksums file: ${error instanceof Error ? error.message : String(error)}`
164
- });
165
- return results;
166
- }
167
- }
168
- /**
169
- * Add a trusted key for signature verification
170
- * @param keyId GPG key ID or fingerprint
171
- */
172
- addTrustedKey(keyId) {
173
- this.trustedKeys.add(keyId.toUpperCase());
174
- }
175
- /**
176
- * Remove a trusted key
177
- * @param keyId GPG key ID or fingerprint
178
- */
179
- removeTrustedKey(keyId) {
180
- this.trustedKeys.delete(keyId.toUpperCase());
181
- }
182
- /**
183
- * Get list of trusted keys
184
- */
185
- getTrustedKeys() {
186
- return Array.from(this.trustedKeys);
187
- }
188
- /**
189
- * Import a GPG public key
190
- * @param keyData The public key data to import
191
- * @returns Success status
192
- */
193
- async importPublicKey(keyData) {
194
- try {
195
- // Write key data to temporary file with secure random name
196
- const tempFile = path.join(process.cwd(), `.gpg-import-${randomBytes(8).toString('hex')}.asc`);
197
- await fs.writeFile(tempFile, keyData);
198
- try {
199
- // Import the key
200
- await safeExec('gpg', ['--import', tempFile]);
201
- return true;
202
- }
203
- finally {
204
- // Clean up temp file
205
- await fs.unlink(tempFile).catch(() => { });
206
- }
207
- }
208
- catch (error) {
209
- logger.error('Failed to import GPG key:', error);
210
- return false;
211
- }
212
- }
213
- }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbmF0dXJlVmVyaWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXBkYXRlL1NpZ25hdHVyZVZlcmlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBaUI1QyxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFdBQVcsQ0FBYztJQUN6QixrQkFBa0IsQ0FBVTtJQUVwQyxZQUFZLE9BR1g7UUFDQyw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJO1FBQ2pELHdDQUF3QztRQUN4QyxzREFBc0Q7U0FDdkQsQ0FBQyxDQUFDO1FBRUgsOENBQThDO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLEVBQUUsa0JBQWtCLElBQUksSUFBSSxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQWU7UUFDdEMsSUFBSSxDQUFDO1lBQ0gsNEJBQTRCO1lBQzVCLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTztvQkFDTCxRQUFRLEVBQUUsS0FBSztvQkFDZixLQUFLLEVBQUUsK0NBQStDO2lCQUN2RCxDQUFDO1lBQ0os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KipcbiAqIFNpZ25hdHVyZVZlcmlmaWVyIC0gVmVyaWZpZXMgR2l0SHViIHJlbGVhc2Ugc2lnbmF0dXJlcyB0byBlbnN1cmUgYXV0aGVudGljaXR5XG4gKiBcbiAqIFNlY3VyaXR5IGZlYXR1cmVzOlxuICogLSBWZXJpZmllcyBHUEcgc2lnbmF0dXJlcyBvbiBnaXQgdGFnc1xuICogLSBWYWxpZGF0ZXMgcmVsZWFzZSBhcnRpZmFjdHMgY2hlY2tzdW1zXG4gKiAtIEVuc3VyZXMgcmVsZWFzZXMgY29tZSBmcm9tIHRydXN0ZWQgc291cmNlc1xuICogLSBQcmV2ZW50cyB0YW1wZXJpbmcgYW5kIHN1cHBseSBjaGFpbiBhdHRhY2tzXG4gKi9cblxuaW1wb3J0IHsgc2FmZUV4ZWMgfSBmcm9tICcuLi91dGlscy9naXQuanMnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduYXR1cmVWZXJpZmljYXRpb25SZXN1bHQge1xuICB2ZXJpZmllZDogYm9vbGVhbjtcbiAgc2lnbmVyS2V5Pzogc3RyaW5nO1xuICBzaWduZXJFbWFpbD86IHN0cmluZztcbiAgc2lnbmF0dXJlRGF0ZT86IERhdGU7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrc3VtVmVyaWZpY2F0aW9uUmVzdWx0IHtcbiAgdmVyaWZpZWQ6IGJvb2xlYW47XG4gIGV4cGVjdGVkQ2hlY2tzdW0/OiBzdHJpbmc7XG4gIGFjdHVhbENoZWNrc3VtPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNpZ25hdHVyZVZlcmlmaWVyIHtcbiAgcHJpdmF0ZSB0cnVzdGVkS2V5czogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgYWxsb3dVbnNpZ25lZEluRGV2OiBib29sZWFuO1xuICBcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IHtcbiAgICB0cnVzdGVkS2V5cz86IHN0cmluZ1tdO1xuICAgIGFsbG93VW5zaWduZWRJbkRldj86IGJvb2xlYW47XG4gIH0pIHtcbiAgICAvLyBEZWZhdWx0IHRydXN0ZWQga2V5cyAtIHNob3VsZCBiZSBHUEcga2V5IElEcyBvZiBtYWludGFpbmVyc1xuICAgIHRoaXMudHJ1c3RlZEtleXMgPSBuZXcgU2V0KG9wdGlvbnM/LnRydXN0ZWRLZXlzIHx8IFtcbiAgICAgIC8vIEFkZCB0cnVzdGVkIEdQRyBrZXkgZmluZ2VycHJpbnRzIGhlcmVcbiAgICAgIC8vIEV4YW1wbGU6ICcxMjM0NTY3ODkwQUJDREVGMTIzNDU2Nzg5MEFCQ0RFRjEyMzQ1Njc4J1xuICAgIF0pO1xuICAgIFxuICAgIC8vIEFsbG93IHVuc2lnbmVkIHJlbGVhc2VzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICB0aGlzLmFsbG93VW5zaWduZWRJbkRldiA9IG9wdGlvbnM/LmFsbG93VW5zaWduZWRJbkRldiA/PyB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogVmVyaWZ5IGEgZ2l0IHRhZyBzaWduYXR1cmVcbiAgICogQHBhcmFtIHRhZ05hbWUgVGhlIHRhZyB0byB2ZXJpZnkgKGUuZy4sICd2MS4yLjAnKVxuICAgKiBAcmV0dXJucyBWZXJpZmljYXRpb24gcmVzdWx0IHdpdGggc2lnbmVyIGluZm9ybWF0aW9uXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUYWdTaWduYXR1cmUodGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTaWduYXR1cmVWZXJpZmljYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgR1BHIGlzIGF2YWlsYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2FmZUV4ZWMoJ2dwZycsIFsnLS12ZXJzaW9uJ10pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAnR1BHIGlzIG5vdCBpbnN0YWxsZWQgb3Igbm90IGF2YWlsYWJsZSBpbiBQQVRIJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWZXJpZnkgdGhlIHRhZyBzaWduYXR1cmVcbiAgICAgIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IHNhZmVFeGVjKCdnaXQnLCBbJ3ZlcmlmeS10YWcnLCB0YWdOYW1lXSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIEdQRyBvdXRwdXQgKGNvbWVzIG9uIHN0ZGVycilcbiAgICAgIGNvbnN0IG91dHB1dCA9IHN0ZGVyciB8fCBzdGRvdXQ7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGZvciBnb29kIHNpZ25hdHVyZVxuICAgICAgaWYgKCFvdXRwdXQuaW5jbHVkZXMoJ0dvb2Qgc2lnbmF0dXJlJykpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGFnIGlzIHVuc2lnbmVkXG4gICAgICAgIGlmIChvdXRwdXQuaW5jbHVkZXMoJ2Vycm9yOiBubyBzaWduYXR1cmUgZm91bmQnKSkge1xuICAgICAgICAgIGlmICh0aGlzLmFsbG93VW5zaWduZWRJbkRldiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZXJyb3I6ICdUYWcgaXMgdW5zaWduZWQgKGFsbG93ZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSknXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6ICdUYWcgaXMgbm90IHNpZ25lZCdcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogJ0ludmFsaWQgc2lnbmF0dXJlJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFeHRyYWN0IHNpZ25lciBpbmZvcm1hdGlvblxuICAgICAgY29uc3Qga2V5TWF0Y2ggPSBvdXRwdXQubWF0Y2goL2tleSAoPzpJRCApPyhbQS1GMC05XSspL2kpO1xuICAgICAgY29uc3QgZW1haWxNYXRjaCA9IG91dHB1dC5tYXRjaCgvXCIoW15cIl0rKVwiLyk7XG4gICAgICBjb25zdCBkYXRlTWF0Y2ggPSBvdXRwdXQubWF0Y2goL21hZGUgKFxcdysgXFx3KyBcXGQrIFxcZCs6XFxkKzpcXGQrIFxcZCsgXFx3KykvKTtcbiAgICAgIFxuICAgICAgY29uc3Qgc2lnbmVyS2V5ID0ga2V5TWF0Y2ggPyBrZXlNYXRjaFsxXSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHNpZ25lckVtYWlsID0gZW1haWxNYXRjaCA/IGVtYWlsTWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaWduYXR1cmVEYXRlID0gZGF0ZU1hdGNoID8gbmV3IERhdGUoZGF0ZU1hdGNoWzFdKSA6IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYga2V5IGlzIHRydXN0ZWRcbiAgICAgIGlmICh0aGlzLnRydXN0ZWRLZXlzLnNpemUgPiAwICYmIHNpZ25lcktleSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IElEIGVuZHMgd2l0aCBhbnkgb2Ygb3VyIHRydXN0ZWQga2V5c1xuICAgICAgICBjb25zdCBpc1RydXN0ZWQgPSBBcnJheS5mcm9tKHRoaXMudHJ1c3RlZEtleXMpLnNvbWUodHJ1c3RlZEtleSA9PiBcbiAgICAgICAgICBzaWduZXJLZXkuZW5kc1dpdGgodHJ1c3RlZEtleS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFpc1RydXN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc2lnbmVyS2V5LFxuICAgICAgICAgICAgc2lnbmVyRW1haWwsXG4gICAgICAgICAgICBzaWduYXR1cmVEYXRlLFxuICAgICAgICAgICAgZXJyb3I6IGBTaWduYXR1cmUgaXMgdmFsaWQgYnV0IGtleSAke3NpZ25lcktleX0gaXMgbm90IGluIHRydXN0ZWQga2V5cyBsaXN0YFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmVyaWZpZWQ6IHRydWUsXG4gICAgICAgIHNpZ25lcktleSxcbiAgICAgICAgc2lnbmVyRW1haWwsXG4gICAgICAgIHNpZ25hdHVyZURhdGVcbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYEZhaWxlZCB0byB2ZXJpZnkgc2lnbmF0dXJlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFZlcmlmeSBhIGZpbGUgY2hlY2tzdW0gYWdhaW5zdCBleHBlY3RlZCB2YWx1ZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkQ2hlY2tzdW0gRXhwZWN0ZWQgU0hBMjU2IGNoZWNrc3VtXG4gICAqIEByZXR1cm5zIFZlcmlmaWNhdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHZlcmlmeUNoZWNrc3VtKGZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkQ2hlY2tzdW06IHN0cmluZyk6IFByb21pc2U8Q2hlY2tzdW1WZXJpZmljYXRpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBmaWxlIGFuZCBjYWxjdWxhdGUgY2hlY2tzdW1cbiAgICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICAgICAgaGFzaC51cGRhdGUoZmlsZUJ1ZmZlcik7XG4gICAgICBjb25zdCBhY3R1YWxDaGVja3N1bSA9IGhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICAgIFxuICAgICAgLy8gQ29tcGFyZSBjaGVja3N1bXNcbiAgICAgIGNvbnN0IHZlcmlmaWVkID0gYWN0dWFsQ2hlY2tzdW0udG9Mb3dlckNhc2UoKSA9PT0gZXhwZWN0ZWRDaGVja3N1bS50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZXJpZmllZCxcbiAgICAgICAgZXhwZWN0ZWRDaGVja3N1bSxcbiAgICAgICAgYWN0dWFsQ2hlY2tzdW0sXG4gICAgICAgIGVycm9yOiB2ZXJpZmllZCA/IHVuZGVmaW5lZCA6ICdDaGVja3N1bSBtaXNtYXRjaCdcbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmVyaWZpZWQ6IGZhbHNlLFxuICAgICAgICBleHBlY3RlZENoZWNrc3VtLFxuICAgICAgICBlcnJvcjogYEZhaWxlZCB0byB2ZXJpZnkgY2hlY2tzdW06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogVmVyaWZ5IHJlbGVhc2UgYXJ0aWZhY3RzIHVzaW5nIGEgY2hlY2tzdW1zIGZpbGVcbiAgICogQHBhcmFtIGNoZWNrc3Vtc0ZpbGUgUGF0aCB0byBjaGVja3N1bXMgZmlsZSAoZS5nLiwgU0hBMjU2U1VNUylcbiAgICogQHBhcmFtIGFydGlmYWN0RGlyIERpcmVjdG9yeSBjb250YWluaW5nIGFydGlmYWN0cyB0byB2ZXJpZnlcbiAgICogQHJldHVybnMgTWFwIG9mIGZpbGVuYW1lIHRvIHZlcmlmaWNhdGlvbiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHZlcmlmeVJlbGVhc2VBcnRpZmFjdHMoXG4gICAgY2hlY2tzdW1zRmlsZTogc3RyaW5nLCBcbiAgICBhcnRpZmFjdERpcjogc3RyaW5nXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgQ2hlY2tzdW1WZXJpZmljYXRpb25SZXN1bHQ+PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBNYXA8c3RyaW5nLCBDaGVja3N1bVZlcmlmaWNhdGlvblJlc3VsdD4oKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBjaGVja3N1bXMgZmlsZVxuICAgICAgY29uc3QgY2hlY2tzdW1zQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNoZWNrc3Vtc0ZpbGUsICd1dGYtOCcpO1xuICAgICAgY29uc3QgbGluZXMgPSBjaGVja3N1bXNDb250ZW50LnNwbGl0KCdcXG4nKS5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIGNoZWNrc3VtcyAoZm9ybWF0OiBcImNoZWNrc3VtICBmaWxlbmFtZVwiIG9yIFwiY2hlY2tzdW0gKmZpbGVuYW1lXCIpXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFthLWYwLTldKylcXHMrXFwqPyguKykkL2kpO1xuICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IFssIGNoZWNrc3VtLCBmaWxlbmFtZV0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXJ0aWZhY3REaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBlYWNoIGZpbGVcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52ZXJpZnlDaGVja3N1bShmaWxlUGF0aCwgY2hlY2tzdW0pO1xuICAgICAgICByZXN1bHRzLnNldChmaWxlbmFtZSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgcmVhZCB0aGUgY2hlY2tzdW1zIGZpbGUsIG1hcmsgYWxsIGFzIHVudmVyaWZpZWRcbiAgICAgIHJlc3VsdHMuc2V0KCcqJywge1xuICAgICAgICB2ZXJpZmllZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgRmFpbGVkIHRvIHJlYWQgY2hlY2tzdW1zIGZpbGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgdHJ1c3RlZCBrZXkgZm9yIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGtleUlkIEdQRyBrZXkgSUQgb3IgZmluZ2VycHJpbnRcbiAgICovXG4gIGFkZFRydXN0ZWRLZXkoa2V5SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJ1c3RlZEtleXMuYWRkKGtleUlkLnRvVXBwZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJ1c3RlZCBrZXlcbiAgICogQHBhcmFtIGtleUlkIEdQRyBrZXkgSUQgb3IgZmluZ2VycHJpbnRcbiAgICovXG4gIHJlbW92ZVRydXN0ZWRLZXkoa2V5SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHJ1c3RlZEtleXMuZGVsZXRlKGtleUlkLnRvVXBwZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgdHJ1c3RlZCBrZXlzXG4gICAqL1xuICBnZXRUcnVzdGVkS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy50cnVzdGVkS2V5cyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBHUEcgcHVibGljIGtleVxuICAgKiBAcGFyYW0ga2V5RGF0YSBUaGUgcHVibGljIGtleSBkYXRhIHRvIGltcG9ydFxuICAgKiBAcmV0dXJucyBTdWNjZXNzIHN0YXR1c1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0UHVibGljS2V5KGtleURhdGE6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBXcml0ZSBrZXkgZGF0YSB0byB0ZW1wb3JhcnkgZmlsZSB3aXRoIHNlY3VyZSByYW5kb20gbmFtZVxuICAgICAgY29uc3QgdGVtcEZpbGUgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgYC5ncGctaW1wb3J0LSR7cmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoJ2hleCcpfS5hc2NgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wRmlsZSwga2V5RGF0YSk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEltcG9ydCB0aGUga2V5XG4gICAgICAgIGF3YWl0IHNhZmVFeGVjKCdncGcnLCBbJy0taW1wb3J0JywgdGVtcEZpbGVdKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wIGZpbGVcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHRlbXBGaWxlKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW1wb3J0IEdQRyBrZXk6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -1,132 +0,0 @@
1
- /**
2
- * UpdateChecker - Secure GitHub release update checking with comprehensive sanitization
3
- *
4
- * Security measures implemented:
5
- * 1. XSS Protection: DOMPurify with strict no-tags/no-attributes policy
6
- * 2. Command Injection Prevention: Multiple regex patterns for various escape sequences
7
- * 3. URL Validation: Whitelist approach allowing only http/https schemes
8
- * 4. Information Disclosure Prevention: Sanitized logging of sensitive data
9
- * 5. Length Limits: Configurable limits to prevent DoS attacks
10
- * 6. OWASP Patterns: Protection against PHP, ASP, hex, unicode, and octal escapes
11
- *
12
- * Performance optimizations:
13
- * - Cached DOMPurify instance to avoid recreation overhead
14
- * - Single-pass regex processing for injection patterns
15
- * - Exponential backoff for network retries
16
- */
17
- import { VersionManager } from './VersionManager.js';
18
- import { RateLimiter } from './RateLimiter.js';
19
- import { SignatureVerifier } from './SignatureVerifier.js';
20
- export interface UpdateCheckResult {
21
- currentVersion: string;
22
- latestVersion: string;
23
- isUpdateAvailable: boolean;
24
- releaseDate: string;
25
- releaseNotes: string;
26
- releaseUrl: string;
27
- tagName?: string;
28
- signatureVerified?: boolean;
29
- signerInfo?: string;
30
- }
31
- export declare class UpdateChecker {
32
- private versionManager;
33
- private rateLimiter;
34
- private signatureVerifier;
35
- private static purifyWindow;
36
- private static purify;
37
- /**
38
- * Lazily initialize DOMPurify to prevent crashes during startup
39
- * CRITICAL FIX: Prevents jsdom from crashing during MCP initialization
40
- */
41
- private initializeDOMPurify;
42
- private readonly releaseNotesMaxLength;
43
- private readonly urlMaxLength;
44
- private readonly securityLogger?;
45
- private readonly requireSignedReleases;
46
- constructor(versionManager: VersionManager, options?: {
47
- releaseNotesMaxLength?: number;
48
- urlMaxLength?: number;
49
- securityLogger?: (event: string, details: any) => void;
50
- rateLimiter?: RateLimiter;
51
- signatureVerifier?: SignatureVerifier;
52
- requireSignedReleases?: boolean;
53
- });
54
- /**
55
- * Execute a network operation with retry logic and exponential backoff
56
- * @param operation - The async operation to execute
57
- * @param maxRetries - Maximum number of retry attempts (default: 3)
58
- * @param baseDelay - Base delay in milliseconds for exponential backoff (default: 1000ms)
59
- * @returns Promise resolving to the operation result
60
- * @throws The last error if all retries fail
61
- */
62
- private retryNetworkOperation;
63
- /**
64
- * Check for updates from GitHub releases with security and error handling
65
- * @returns UpdateCheckResult if update info is available, null if no releases found
66
- * @throws Error for network or API failures or rate limit exceeded
67
- */
68
- checkForUpdates(): Promise<UpdateCheckResult | null>;
69
- /**
70
- * Get current rate limit status
71
- * @returns Current rate limit status including remaining requests and reset time
72
- */
73
- getRateLimitStatus(): {
74
- allowed: boolean;
75
- remainingRequests: number;
76
- resetTime: Date;
77
- waitTimeSeconds?: number;
78
- };
79
- /**
80
- * Format update check results for display with comprehensive sanitization
81
- * @param result - The update check result to format
82
- * @param error - Optional error from update check
83
- * @param personaIndicator - Optional persona indicator prefix
84
- * @returns Formatted string safe for display
85
- */
86
- formatUpdateCheckResult(result: UpdateCheckResult | null, error?: Error, personaIndicator?: string): string;
87
- /**
88
- * Sanitize URLs to prevent dangerous schemes and information disclosure
89
- *
90
- * Security measures:
91
- * - Length validation to prevent DoS
92
- * - Whitelist approach: only http/https allowed
93
- * - Sanitized logging to prevent sensitive data exposure
94
- *
95
- * @param url - The URL to sanitize
96
- * @returns Empty string if invalid/dangerous, original URL if safe
97
- */
98
- private sanitizeUrl;
99
- /**
100
- * Sanitize release notes to prevent XSS, command injection, and DoS
101
- *
102
- * Security layers:
103
- * 1. Length limiting (configurable, default 5000 chars)
104
- * 2. HTML/JS sanitization via DOMPurify (no tags/attributes allowed)
105
- * 3. Command injection pattern removal (backticks, command substitution)
106
- * 4. OWASP pattern removal (PHP, ASP, hex/unicode/octal escapes)
107
- *
108
- * @param notes - The release notes to sanitize
109
- * @returns Sanitized release notes safe for display
110
- */
111
- private sanitizeReleaseNotes;
112
- /**
113
- * Format date to human-readable format with consistent timezone handling
114
- * @param dateStr - ISO date string to format
115
- * @returns Human-readable date string (e.g., "January 5, 2025")
116
- */
117
- private formatDate;
118
- /**
119
- * Log security events for monitoring and alerting
120
- * Only logs if securityLogger callback was provided in constructor
121
- * @param event - The security event type
122
- * @param details - Event details (sanitized to prevent info disclosure)
123
- */
124
- private logSecurityEvent;
125
- /**
126
- * Reset static DOMPurify cache (useful for long-running processes)
127
- * This prevents memory accumulation in services that run for extended periods
128
- * @static
129
- */
130
- static resetCache(): void;
131
- }
132
- //# sourceMappingURL=UpdateChecker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UpdateChecker.d.ts","sourceRoot":"","sources":["../../src/update/UpdateChecker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAoB;IAK7C,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAEvD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAG9C,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;QACvD,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;QACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC;IA+CH;;;;;;;OAOG;YACW,qBAAqB;IAgCnC;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA4H1D;;;OAGG;IACH,kBAAkB,IAAI;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAUD;;;;;;OAMG;IACH,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAE,MAAW,GAAG,MAAM;IAoF/G;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IAiCnB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAqF5B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmBlB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;WACW,UAAU,IAAI,IAAI;CAIjC"}