@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
@@ -0,0 +1,78 @@
1
+ /**
2
+ * ConfigManager - Thread-safe singleton for persistent configuration
3
+ *
4
+ * Handles OAuth client ID storage for Claude Desktop integration.
5
+ * Stores config in ~/.dollhouse/config.json with proper permissions.
6
+ * Prefers environment variables over config file values.
7
+ */
8
+ interface ConfigData {
9
+ version: string;
10
+ oauth?: {
11
+ githubClientId?: string;
12
+ };
13
+ [key: string]: any;
14
+ }
15
+ export declare class ConfigManager {
16
+ private static instance;
17
+ private static instanceLock;
18
+ private configDir;
19
+ private configPath;
20
+ private config;
21
+ private constructor();
22
+ /**
23
+ * Thread-safe singleton instance getter
24
+ */
25
+ static getInstance(): ConfigManager;
26
+ /**
27
+ * Attempt to repair file permissions if they're incorrect
28
+ * This helps with error recovery in permission-related issues
29
+ */
30
+ private repairPermissions;
31
+ /**
32
+ * Load configuration from file system
33
+ */
34
+ loadConfig(): Promise<void>;
35
+ /**
36
+ * Get GitHub OAuth client ID
37
+ * Environment variable takes precedence over config file
38
+ */
39
+ getGitHubClientId(): string | null;
40
+ /**
41
+ * Set GitHub OAuth client ID in config file
42
+ */
43
+ setGitHubClientId(clientId: string): Promise<void>;
44
+ /**
45
+ * Get a copy of the current configuration
46
+ * @returns A defensive copy of the configuration object
47
+ */
48
+ getConfig(): ConfigData;
49
+ /**
50
+ * Update the entire configuration
51
+ * @param newConfig The new configuration to set
52
+ */
53
+ updateConfig(newConfig: ConfigData): Promise<void>;
54
+ /**
55
+ * Validate GitHub OAuth client ID format
56
+ * Client IDs start with "Ov23li" followed by at least 14 alphanumeric characters
57
+ *
58
+ * @param clientId - The client ID to validate
59
+ * @returns true if valid, false otherwise
60
+ *
61
+ * @example
62
+ * ConfigManager.validateClientId("Ov23liABCDEFGHIJKLMN123456") // true
63
+ * ConfigManager.validateClientId("invalid") // false
64
+ * ConfigManager.validateClientId("Ov23li") // false (too short)
65
+ * ConfigManager.validateClientId("Xv23liABCDEFGHIJKLMN") // false (wrong prefix)
66
+ */
67
+ static validateClientId(clientId: any): boolean;
68
+ /**
69
+ * Ensure config directory exists with proper permissions
70
+ */
71
+ private ensureConfigDirectory;
72
+ /**
73
+ * Save config using atomic file writes
74
+ */
75
+ private saveConfig;
76
+ }
77
+ export {};
78
+ //# sourceMappingURL=ConfigManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IACrD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAkB;IAE7C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO;IAWP;;OAEG;WACW,WAAW,IAAI,aAAa;IAyB1C;;;OAGG;YACW,iBAAiB;IAkB/B;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCxC;;;OAGG;IACI,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAWzC;;OAEG;IACU,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/D;;;OAGG;IACI,SAAS,IAAI,UAAU;IAI9B;;;OAGG;IACU,YAAY,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D;;;;;;;;;;;;OAYG;WACW,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO;IAUtD;;OAEG;YACW,qBAAqB;IAWnC;;OAEG;YACW,UAAU;CAuBzB"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * ConfigManager - Thread-safe singleton for persistent configuration
3
+ *
4
+ * Handles OAuth client ID storage for Claude Desktop integration.
5
+ * Stores config in ~/.dollhouse/config.json with proper permissions.
6
+ * Prefers environment variables over config file values.
7
+ */
8
+ import * as fs from 'fs/promises';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ export class ConfigManager {
12
+ static instance = null;
13
+ static instanceLock = false;
14
+ configDir;
15
+ configPath;
16
+ config;
17
+ constructor() {
18
+ // Initialize paths
19
+ this.configDir = path.join(os.homedir(), '.dollhouse');
20
+ this.configPath = path.join(this.configDir, 'config.json');
21
+ // Initialize with default config
22
+ this.config = {
23
+ version: '1.0.0'
24
+ };
25
+ }
26
+ /**
27
+ * Thread-safe singleton instance getter
28
+ */
29
+ static getInstance() {
30
+ if (ConfigManager.instance) {
31
+ return ConfigManager.instance;
32
+ }
33
+ // Simple locking mechanism to prevent race conditions
34
+ if (ConfigManager.instanceLock) {
35
+ // Wait for lock to be released, then return the instance
36
+ while (ConfigManager.instanceLock && !ConfigManager.instance) {
37
+ // In a real scenario with async operations, this would be more sophisticated
38
+ // But for the test cases, this simple approach works
39
+ }
40
+ return ConfigManager.instance;
41
+ }
42
+ ConfigManager.instanceLock = true;
43
+ if (!ConfigManager.instance) {
44
+ ConfigManager.instance = new ConfigManager();
45
+ }
46
+ ConfigManager.instanceLock = false;
47
+ return ConfigManager.instance;
48
+ }
49
+ /**
50
+ * Attempt to repair file permissions if they're incorrect
51
+ * This helps with error recovery in permission-related issues
52
+ */
53
+ async repairPermissions() {
54
+ try {
55
+ // Try to fix directory permissions
56
+ await fs.chmod(this.configDir, 0o700);
57
+ // Try to fix file permissions if it exists
58
+ try {
59
+ await fs.access(this.configPath);
60
+ await fs.chmod(this.configPath, 0o600);
61
+ }
62
+ catch {
63
+ // File doesn't exist, that's OK
64
+ }
65
+ }
66
+ catch (error) {
67
+ // Log but don't fail - this is best-effort recovery
68
+ // We don't have a logger here, so we'll silently continue
69
+ }
70
+ }
71
+ /**
72
+ * Load configuration from file system
73
+ */
74
+ async loadConfig() {
75
+ try {
76
+ // Try to read existing config file
77
+ const configContent = await fs.readFile(this.configPath, 'utf-8');
78
+ try {
79
+ this.config = JSON.parse(configContent);
80
+ }
81
+ catch (parseError) {
82
+ // Handle corrupted JSON - create new config
83
+ console.warn('Config file corrupted, creating new config');
84
+ this.config = { version: '1.0.0' };
85
+ await this.saveConfig();
86
+ }
87
+ }
88
+ catch (error) {
89
+ if (error.code === 'ENOENT') {
90
+ // Config file doesn't exist, create directory and file
91
+ await this.ensureConfigDirectory();
92
+ await this.saveConfig();
93
+ }
94
+ else if (error.code === 'EACCES' || error.code === 'EPERM') {
95
+ // Permission denied - attempt repair
96
+ await this.repairPermissions();
97
+ // Try once more after repair attempt
98
+ try {
99
+ const configContent = await fs.readFile(this.configPath, 'utf-8');
100
+ this.config = JSON.parse(configContent);
101
+ }
102
+ catch (retryError) {
103
+ // Still failing, throw original error with helpful message
104
+ throw new Error(`Permission denied accessing config at ${this.configPath}. ` +
105
+ `Please check file permissions or run with appropriate privileges.`);
106
+ }
107
+ }
108
+ else {
109
+ throw error;
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * Get GitHub OAuth client ID
115
+ * Environment variable takes precedence over config file
116
+ */
117
+ getGitHubClientId() {
118
+ // Check environment variable first
119
+ const envClientId = process.env.DOLLHOUSE_GITHUB_CLIENT_ID;
120
+ if (envClientId) {
121
+ return envClientId;
122
+ }
123
+ // Fall back to config file
124
+ return this.config.oauth?.githubClientId || null;
125
+ }
126
+ /**
127
+ * Set GitHub OAuth client ID in config file
128
+ */
129
+ async setGitHubClientId(clientId) {
130
+ if (!ConfigManager.validateClientId(clientId)) {
131
+ throw new Error(`Invalid GitHub client ID format. Expected format: Ov23li followed by at least 14 alphanumeric characters (e.g., Ov23liABCDEFGHIJKLMN)`);
132
+ }
133
+ // Ensure oauth object exists
134
+ if (!this.config.oauth) {
135
+ this.config.oauth = {};
136
+ }
137
+ this.config.oauth.githubClientId = clientId;
138
+ await this.saveConfig();
139
+ }
140
+ /**
141
+ * Get a copy of the current configuration
142
+ * @returns A defensive copy of the configuration object
143
+ */
144
+ getConfig() {
145
+ return { ...this.config };
146
+ }
147
+ /**
148
+ * Update the entire configuration
149
+ * @param newConfig The new configuration to set
150
+ */
151
+ async updateConfig(newConfig) {
152
+ this.config = { ...newConfig };
153
+ await this.saveConfig();
154
+ }
155
+ /**
156
+ * Validate GitHub OAuth client ID format
157
+ * Client IDs start with "Ov23li" followed by at least 14 alphanumeric characters
158
+ *
159
+ * @param clientId - The client ID to validate
160
+ * @returns true if valid, false otherwise
161
+ *
162
+ * @example
163
+ * ConfigManager.validateClientId("Ov23liABCDEFGHIJKLMN123456") // true
164
+ * ConfigManager.validateClientId("invalid") // false
165
+ * ConfigManager.validateClientId("Ov23li") // false (too short)
166
+ * ConfigManager.validateClientId("Xv23liABCDEFGHIJKLMN") // false (wrong prefix)
167
+ */
168
+ static validateClientId(clientId) {
169
+ if (typeof clientId !== 'string' || !clientId) {
170
+ return false;
171
+ }
172
+ // GitHub OAuth client IDs follow the pattern: Ov23li[A-Za-z0-9]{14,}
173
+ const clientIdPattern = /^Ov23li[A-Za-z0-9]{14,}$/;
174
+ return clientIdPattern.test(clientId);
175
+ }
176
+ /**
177
+ * Ensure config directory exists with proper permissions
178
+ */
179
+ async ensureConfigDirectory() {
180
+ try {
181
+ await fs.mkdir(this.configDir, { recursive: true, mode: 0o700 });
182
+ }
183
+ catch (error) {
184
+ if (error.code === 'EACCES') {
185
+ throw new Error(`Permission denied creating config directory: ${this.configDir}`);
186
+ }
187
+ throw error;
188
+ }
189
+ }
190
+ /**
191
+ * Save config using atomic file writes
192
+ */
193
+ async saveConfig() {
194
+ await this.ensureConfigDirectory();
195
+ // Use atomic write: write to temp file, then rename
196
+ const tempPath = this.configPath + '.tmp';
197
+ const configContent = JSON.stringify(this.config, null, 2);
198
+ try {
199
+ // Write to temp file first
200
+ await fs.writeFile(tempPath, configContent, { mode: 0o600 });
201
+ // Atomic rename
202
+ await fs.rename(tempPath, this.configPath);
203
+ }
204
+ catch (error) {
205
+ // Clean up temp file if it exists
206
+ try {
207
+ await fs.unlink(tempPath);
208
+ }
209
+ catch {
210
+ // Ignore cleanup errors
211
+ }
212
+ throw error;
213
+ }
214
+ }
215
+ }
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQVV6QixNQUFNLE9BQU8sYUFBYTtJQUNoQixNQUFNLENBQUMsUUFBUSxHQUF5QixJQUFJLENBQUM7SUFDN0MsTUFBTSxDQUFDLFlBQVksR0FBWSxLQUFLLENBQUM7SUFFckMsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsQ0FBUztJQUNuQixNQUFNLENBQWE7SUFFM0I7UUFDRSxtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUUzRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQixPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDaEMsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMvQix5REFBeUQ7WUFDekQsT0FBTyxhQUFhLENBQUMsWUFBWSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3RCw2RUFBNkU7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LFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLHdCQUF3QjtZQUMxQixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlnTWFuYWdlciAtIFRocmVhZC1zYWZlIHNpbmdsZXRvbiBmb3IgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uXG4gKiBcbiAqIEhhbmRsZXMgT0F1dGggY2xpZW50IElEIHN0b3JhZ2UgZm9yIENsYXVkZSBEZXNrdG9wIGludGVncmF0aW9uLlxuICogU3RvcmVzIGNvbmZpZyBpbiB+Ly5kb2xsaG91c2UvY29uZmlnLmpzb24gd2l0aCBwcm9wZXIgcGVybWlzc2lvbnMuXG4gKiBQcmVmZXJzIGVudmlyb25tZW50IHZhcmlhYmxlcyBvdmVyIGNvbmZpZyBmaWxlIHZhbHVlcy5cbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG5pbnRlcmZhY2UgQ29uZmlnRGF0YSB7XG4gIHZlcnNpb246IHN0cmluZztcbiAgb2F1dGg/OiB7XG4gICAgZ2l0aHViQ2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG4gIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3cgdW5rbm93biBmaWVsZHMgdG8gYmUgcHJlc2VydmVkXG59XG5cbmV4cG9ydCBjbGFzcyBDb25maWdNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbmZpZ01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VMb2NrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb25maWdEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSBjb25maWdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgY29uZmlnOiBDb25maWdEYXRhO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBwYXRoc1xuICAgIHRoaXMuY29uZmlnRGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnKTtcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGhpcy5jb25maWdEaXIsICdjb25maWcuanNvbicpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgd2l0aCBkZWZhdWx0IGNvbmZpZ1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdmVyc2lvbjogJzEuMC4wJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhyZWFkLXNhZmUgc2luZ2xldG9uIGluc3RhbmNlIGdldHRlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb25maWdNYW5hZ2VyIHtcbiAgICBpZiAoQ29uZmlnTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIENvbmZpZ01hbmFnZXIuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIGxvY2tpbmcgbWVjaGFuaXNtIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgaWYgKENvbmZpZ01hbmFnZXIuaW5zdGFuY2VMb2NrKSB7XG4gICAgICAvLyBXYWl0IGZvciBsb2NrIHRvIGJlIHJlbGVhc2VkLCB0aGVuIHJldHVybiB0aGUgaW5zdGFuY2VcbiAgICAgIHdoaWxlIChDb25maWdNYW5hZ2VyLmluc3RhbmNlTG9jayAmJiAhQ29uZmlnTWFuYWdlci5pbnN0YW5jZSkge1xuICAgICAgICAvLyBJbiBhIHJlYWwgc2NlbmFyaW8gd2l0aCBhc3luYyBvcGVyYXRpb25zLCB0aGlzIHdvdWxkIGJlIG1vcmUgc29waGlzdGljYXRlZFxuICAgICAgICAvLyBCdXQgZm9yIHRoZSB0ZXN0IGNhc2VzLCB0aGlzIHNpbXBsZSBhcHByb2FjaCB3b3Jrc1xuICAgICAgfVxuICAgICAgcmV0dXJuIENvbmZpZ01hbmFnZXIuaW5zdGFuY2UhO1xuICAgIH1cblxuICAgIENvbmZpZ01hbmFnZXIuaW5zdGFuY2VMb2NrID0gdHJ1ZTtcbiAgICBcbiAgICBpZiAoIUNvbmZpZ01hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgIENvbmZpZ01hbmFnZXIuaW5zdGFuY2UgPSBuZXcgQ29uZmlnTWFuYWdlcigpO1xuICAgIH1cbiAgICBcbiAgICBDb25maWdNYW5hZ2VyLmluc3RhbmNlTG9jayA9IGZhbHNlO1xuICAgIHJldHVybiBDb25maWdNYW5hZ2VyLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gcmVwYWlyIGZpbGUgcGVybWlzc2lvbnMgaWYgdGhleSdyZSBpbmNvcnJlY3RcbiAgICogVGhpcyBoZWxwcyB3aXRoIGVycm9yIHJlY292ZXJ5IGluIHBlcm1pc3Npb24tcmVsYXRlZCBpc3N1ZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVwYWlyUGVybWlzc2lvbnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBmaXggZGlyZWN0b3J5IHBlcm1pc3Npb25zXG4gICAgICBhd2FpdCBmcy5jaG1vZCh0aGlzLmNvbmZpZ0RpciwgMG83MDApO1xuICAgICAgXG4gICAgICAvLyBUcnkgdG8gZml4IGZpbGUgcGVybWlzc2lvbnMgaWYgaXQgZXhpc3RzXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGhpcy5jb25maWdQYXRoKTtcbiAgICAgICAgYXdhaXQgZnMuY2htb2QodGhpcy5jb25maWdQYXRoLCAwbzYwMCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCB0aGF0J3MgT0tcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsIC0gdGhpcyBpcyBiZXN0LWVmZm9ydCByZWNvdmVyeVxuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIGxvZ2dlciBoZXJlLCBzbyB3ZSdsbCBzaWxlbnRseSBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBmaWxlIHN5c3RlbVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byByZWFkIGV4aXN0aW5nIGNvbmZpZyBmaWxlXG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5jb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAvLyBIYW5kbGUgY29ycnVwdGVkIEpTT04gLSBjcmVhdGUgbmV3IGNvbmZpZ1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvbmZpZyBmaWxlIGNvcnJ1cHRlZCwgY3JlYXRpbmcgbmV3IGNvbmZpZycpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgdmVyc2lvbjogJzEuMC4wJyB9O1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gQ29uZmlnIGZpbGUgZG9lc24ndCBleGlzdCwgY3JlYXRlIGRpcmVjdG9yeSBhbmQgZmlsZVxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbmZpZ0RpcmVjdG9yeSgpO1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBQ0NFUycgfHwgZXJyb3IuY29kZSA9PT0gJ0VQRVJNJykge1xuICAgICAgICAvLyBQZXJtaXNzaW9uIGRlbmllZCAtIGF0dGVtcHQgcmVwYWlyXG4gICAgICAgIGF3YWl0IHRoaXMucmVwYWlyUGVybWlzc2lvbnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFRyeSBvbmNlIG1vcmUgYWZ0ZXIgcmVwYWlyIGF0dGVtcHRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb25maWdDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGhpcy5jb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKHJldHJ5RXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIFN0aWxsIGZhaWxpbmcsIHRocm93IG9yaWdpbmFsIGVycm9yIHdpdGggaGVscGZ1bCBtZXNzYWdlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFBlcm1pc3Npb24gZGVuaWVkIGFjY2Vzc2luZyBjb25maWcgYXQgJHt0aGlzLmNvbmZpZ1BhdGh9LiBgICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgZmlsZSBwZXJtaXNzaW9ucyBvciBydW4gd2l0aCBhcHByb3ByaWF0ZSBwcml2aWxlZ2VzLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IEdpdEh1YiBPQXV0aCBjbGllbnQgSURcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbmZpZyBmaWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0R2l0SHViQ2xpZW50SWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3RcbiAgICBjb25zdCBlbnZDbGllbnRJZCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9HSVRIVUJfQ0xJRU5UX0lEO1xuICAgIGlmIChlbnZDbGllbnRJZCkge1xuICAgICAgcmV0dXJuIGVudkNsaWVudElkO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byBjb25maWcgZmlsZVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5vYXV0aD8uZ2l0aHViQ2xpZW50SWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgR2l0SHViIE9BdXRoIGNsaWVudCBJRCBpbiBjb25maWcgZmlsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldEdpdEh1YkNsaWVudElkKGNsaWVudElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIUNvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChjbGllbnRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgR2l0SHViIGNsaWVudCBJRCBmb3JtYXQuIEV4cGVjdGVkIGZvcm1hdDogT3YyM2xpIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IDE0IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIChlLmcuLCBPdjIzbGlBQkNERUZHSElKS0xNTilgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBvYXV0aCBvYmplY3QgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vYXV0aCkge1xuICAgICAgdGhpcy5jb25maWcub2F1dGggPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZy5vYXV0aC5naXRodWJDbGllbnRJZCA9IGNsaWVudElkO1xuICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBBIGRlZmVuc2l2ZSBjb3B5IG9mIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZygpOiBDb25maWdEYXRhIHtcbiAgICByZXR1cm4geyAuLi50aGlzLmNvbmZpZyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG5ld0NvbmZpZyBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlQ29uZmlnKG5ld0NvbmZpZzogQ29uZmlnRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5uZXdDb25maWcgfTtcbiAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBHaXRIdWIgT0F1dGggY2xpZW50IElEIGZvcm1hdFxuICAgKiBDbGllbnQgSURzIHN0YXJ0IHdpdGggXCJPdjIzbGlcIiBmb2xsb3dlZCBieSBhdCBsZWFzdCAxNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgKiBcbiAgICogQHBhcmFtIGNsaWVudElkIC0gVGhlIGNsaWVudCBJRCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIENvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChcIk92MjNsaUFCQ0RFRkdISUpLTE1OMTIzNDU2XCIpIC8vIHRydWVcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiaW52YWxpZFwiKSAvLyBmYWxzZVxuICAgKiBDb25maWdNYW5hZ2VyLnZhbGlkYXRlQ2xpZW50SWQoXCJPdjIzbGlcIikgLy8gZmFsc2UgKHRvbyBzaG9ydClcbiAgICogQ29uZmlnTWFuYWdlci52YWxpZGF0ZUNsaWVudElkKFwiWHYyM2xpQUJDREVGR0hJSktMTU5cIikgLy8gZmFsc2UgKHdyb25nIHByZWZpeClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVDbGllbnRJZChjbGllbnRJZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBjbGllbnRJZCAhPT0gJ3N0cmluZycgfHwgIWNsaWVudElkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gR2l0SHViIE9BdXRoIGNsaWVudCBJRHMgZm9sbG93IHRoZSBwYXR0ZXJuOiBPdjIzbGlbQS1aYS16MC05XXsxNCx9XG4gICAgY29uc3QgY2xpZW50SWRQYXR0ZXJuID0gL15PdjIzbGlbQS1aYS16MC05XXsxNCx9JC87XG4gICAgcmV0dXJuIGNsaWVudElkUGF0dGVybi50ZXN0KGNsaWVudElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgY29uZmlnIGRpcmVjdG9yeSBleGlzdHMgd2l0aCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQ29uZmlnRGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5ta2Rpcih0aGlzLmNvbmZpZ0RpciwgeyByZWN1cnNpdmU6IHRydWUsIG1vZGU6IDBvNzAwIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUFDQ0VTJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBlcm1pc3Npb24gZGVuaWVkIGNyZWF0aW5nIGNvbmZpZyBkaXJlY3Rvcnk6ICR7dGhpcy5jb25maWdEaXJ9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWcgdXNpbmcgYXRvbWljIGZpbGUgd3JpdGVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVDb25maWcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25maWdEaXJlY3RvcnkoKTtcbiAgICBcbiAgICAvLyBVc2UgYXRvbWljIHdyaXRlOiB3cml0ZSB0byB0ZW1wIGZpbGUsIHRoZW4gcmVuYW1lXG4gICAgY29uc3QgdGVtcFBhdGggPSB0aGlzLmNvbmZpZ1BhdGggKyAnLnRtcCc7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLCBudWxsLCAyKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gV3JpdGUgdG8gdGVtcCBmaWxlIGZpcnN0XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGNvbmZpZ0NvbnRlbnQsIHsgbW9kZTogMG82MDAgfSk7XG4gICAgICBcbiAgICAgIC8vIEF0b21pYyByZW5hbWVcbiAgICAgIGF3YWl0IGZzLnJlbmFtZSh0ZW1wUGF0aCwgdGhpcy5jb25maWdQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2xlYW4gdXAgdGVtcCBmaWxlIGlmIGl0IGV4aXN0c1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKHRlbXBQYXRoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Central configuration for all element types
3
+ *
4
+ * This file serves as the single source of truth for element type configurations.
5
+ * When adding new element types, update this config and use the derived arrays
6
+ * to ensure consistency across the codebase.
7
+ */
8
+ import { ElementType } from '../portfolio/types.js';
9
+ /**
10
+ * Complete configuration for each element type
11
+ */
12
+ export declare const ELEMENT_TYPE_CONFIG: {
13
+ readonly personas: {
14
+ readonly plural: "personas";
15
+ readonly directory: "personas";
16
+ readonly mcpSupported: true;
17
+ readonly hasManager: true;
18
+ readonly icon: "👤";
19
+ readonly description: "Behavioral profiles that define AI personality and interaction style";
20
+ };
21
+ readonly skills: {
22
+ readonly plural: "skills";
23
+ readonly directory: "skills";
24
+ readonly mcpSupported: true;
25
+ readonly hasManager: true;
26
+ readonly icon: "🛠️";
27
+ readonly description: "Discrete capabilities for specific tasks";
28
+ };
29
+ readonly templates: {
30
+ readonly plural: "templates";
31
+ readonly directory: "templates";
32
+ readonly mcpSupported: true;
33
+ readonly hasManager: true;
34
+ readonly icon: "📄";
35
+ readonly description: "Reusable content structures with variable substitution";
36
+ };
37
+ readonly agents: {
38
+ readonly plural: "agents";
39
+ readonly directory: "agents";
40
+ readonly mcpSupported: true;
41
+ readonly hasManager: true;
42
+ readonly icon: "🤖";
43
+ readonly description: "Autonomous goal-oriented actors with decision-making capabilities";
44
+ };
45
+ readonly memories: {
46
+ readonly plural: "memories";
47
+ readonly directory: "memories";
48
+ readonly mcpSupported: false;
49
+ readonly hasManager: false;
50
+ readonly icon: "🧠";
51
+ readonly description: "Persistent context storage for continuity and learning";
52
+ };
53
+ readonly ensembles: {
54
+ readonly plural: "ensembles";
55
+ readonly directory: "ensembles";
56
+ readonly mcpSupported: false;
57
+ readonly hasManager: false;
58
+ readonly icon: "🎭";
59
+ readonly description: "Groups of elements working together as a cohesive unit";
60
+ };
61
+ };
62
+ /**
63
+ * Derived arrays for validation and filtering
64
+ * These are automatically generated from the config above
65
+ */
66
+ export declare const MCP_SUPPORTED_TYPES: ElementType[];
67
+ export declare const VALID_TYPES_ARRAY: ("personas" | "skills" | "templates" | "agents" | "memories" | "ensembles")[];
68
+ export declare const PLURAL_TO_ELEMENT_TYPE_MAP: {
69
+ [k: string]: ElementType;
70
+ };
71
+ export declare const SINGULAR_TO_DIRECTORY_MAP: {
72
+ [k: string]: "personas" | "skills" | "templates" | "agents" | "memories" | "ensembles";
73
+ };
74
+ /**
75
+ * Utility functions
76
+ */
77
+ export declare function isElementTypeSupported(type: ElementType): boolean;
78
+ export declare function getElementTypeConfig(type: ElementType): {
79
+ readonly plural: "personas";
80
+ readonly directory: "personas";
81
+ readonly mcpSupported: true;
82
+ readonly hasManager: true;
83
+ readonly icon: "👤";
84
+ readonly description: "Behavioral profiles that define AI personality and interaction style";
85
+ } | {
86
+ readonly plural: "skills";
87
+ readonly directory: "skills";
88
+ readonly mcpSupported: true;
89
+ readonly hasManager: true;
90
+ readonly icon: "🛠️";
91
+ readonly description: "Discrete capabilities for specific tasks";
92
+ } | {
93
+ readonly plural: "templates";
94
+ readonly directory: "templates";
95
+ readonly mcpSupported: true;
96
+ readonly hasManager: true;
97
+ readonly icon: "📄";
98
+ readonly description: "Reusable content structures with variable substitution";
99
+ } | {
100
+ readonly plural: "agents";
101
+ readonly directory: "agents";
102
+ readonly mcpSupported: true;
103
+ readonly hasManager: true;
104
+ readonly icon: "🤖";
105
+ readonly description: "Autonomous goal-oriented actors with decision-making capabilities";
106
+ } | {
107
+ readonly plural: "memories";
108
+ readonly directory: "memories";
109
+ readonly mcpSupported: false;
110
+ readonly hasManager: false;
111
+ readonly icon: "🧠";
112
+ readonly description: "Persistent context storage for continuity and learning";
113
+ } | {
114
+ readonly plural: "ensembles";
115
+ readonly directory: "ensembles";
116
+ readonly mcpSupported: false;
117
+ readonly hasManager: false;
118
+ readonly icon: "🎭";
119
+ readonly description: "Groups of elements working together as a cohesive unit";
120
+ };
121
+ export declare function getAllSupportedTypes(): ElementType[];
122
+ export declare function getValidTypesForMCP(): string[];
123
+ /**
124
+ * Migration note: To use this centralized config:
125
+ *
126
+ * 1. Replace hardcoded arrays with imports from this file:
127
+ * - Replace validTypes in src/index.ts with VALID_TYPES_ARRAY
128
+ * - Replace MCP_SUPPORTED_TYPES in CollectionBrowser.ts with import
129
+ * - Replace mapping objects with imports from this file
130
+ *
131
+ * 2. Update components to use utility functions instead of hardcoded checks
132
+ *
133
+ * 3. When adding new types, only update ELEMENT_TYPE_CONFIG above
134
+ */
135
+ //# sourceMappingURL=element-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-types.d.ts","sourceRoot":"","sources":["../../src/config/element-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDtB,CAAC;AAEX;;;GAGG;AAGH,eAAO,MAAM,mBAAmB,eAEO,CAAC;AAGxC,eAAO,MAAM,iBAAiB,+EAE7B,CAAC;AAGF,eAAO,MAAM,0BAA0B;;CAItC,CAAC;AAGF,eAAO,MAAM,yBAAyB;;CAKrC,CAAC;AAEF;;GAEG;AAEH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAErD;AAED,wBAAgB,oBAAoB,IAAI,WAAW,EAAE,CAEpD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED;;;;;;;;;;;GAWG"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Central configuration for all element types
3
+ *
4
+ * This file serves as the single source of truth for element type configurations.
5
+ * When adding new element types, update this config and use the derived arrays
6
+ * to ensure consistency across the codebase.
7
+ */
8
+ import { ElementType } from '../portfolio/types.js';
9
+ /**
10
+ * Complete configuration for each element type
11
+ */
12
+ export const ELEMENT_TYPE_CONFIG = {
13
+ [ElementType.PERSONA]: {
14
+ plural: 'personas',
15
+ directory: 'personas',
16
+ mcpSupported: true,
17
+ hasManager: true,
18
+ icon: '👤',
19
+ description: 'Behavioral profiles that define AI personality and interaction style'
20
+ },
21
+ [ElementType.SKILL]: {
22
+ plural: 'skills',
23
+ directory: 'skills',
24
+ mcpSupported: true,
25
+ hasManager: true,
26
+ icon: '🛠️',
27
+ description: 'Discrete capabilities for specific tasks'
28
+ },
29
+ [ElementType.TEMPLATE]: {
30
+ plural: 'templates',
31
+ directory: 'templates',
32
+ mcpSupported: true,
33
+ hasManager: true,
34
+ icon: '📄',
35
+ description: 'Reusable content structures with variable substitution'
36
+ },
37
+ [ElementType.AGENT]: {
38
+ plural: 'agents',
39
+ directory: 'agents',
40
+ mcpSupported: true,
41
+ hasManager: true,
42
+ icon: '🤖',
43
+ description: 'Autonomous goal-oriented actors with decision-making capabilities'
44
+ },
45
+ [ElementType.MEMORY]: {
46
+ plural: 'memories',
47
+ directory: 'memories',
48
+ mcpSupported: false, // Hidden from MCP per Issue #144
49
+ hasManager: false, // Not yet implemented
50
+ icon: '🧠',
51
+ description: 'Persistent context storage for continuity and learning'
52
+ },
53
+ [ElementType.ENSEMBLE]: {
54
+ plural: 'ensembles',
55
+ directory: 'ensembles',
56
+ mcpSupported: false, // Hidden from MCP per Issue #144
57
+ hasManager: false, // Not yet implemented
58
+ icon: '🎭',
59
+ description: 'Groups of elements working together as a cohesive unit'
60
+ }
61
+ };
62
+ /**
63
+ * Derived arrays for validation and filtering
64
+ * These are automatically generated from the config above
65
+ */
66
+ // Element types that are exposed via MCP tools
67
+ export const MCP_SUPPORTED_TYPES = Object.entries(ELEMENT_TYPE_CONFIG)
68
+ .filter(([, config]) => config.mcpSupported)
69
+ .map(([type]) => type);
70
+ // Plural forms for MCP validation (used in browseCollection validTypes array)
71
+ export const VALID_TYPES_ARRAY = MCP_SUPPORTED_TYPES.map(type => ELEMENT_TYPE_CONFIG[type].plural);
72
+ // Mapping from plural forms to ElementType values
73
+ export const PLURAL_TO_ELEMENT_TYPE_MAP = Object.fromEntries(Object.entries(ELEMENT_TYPE_CONFIG).map(([type, config]) => [
74
+ config.plural, type
75
+ ]));
76
+ // Mapping from singular forms to directory names
77
+ export const SINGULAR_TO_DIRECTORY_MAP = Object.fromEntries(Object.entries(ELEMENT_TYPE_CONFIG).map(([type, config]) => [
78
+ type.toLowerCase().replace('s', ''), // Convert 'personas' -> 'persona'
79
+ config.directory
80
+ ]));
81
+ /**
82
+ * Utility functions
83
+ */
84
+ export function isElementTypeSupported(type) {
85
+ return ELEMENT_TYPE_CONFIG[type]?.mcpSupported ?? false;
86
+ }
87
+ export function getElementTypeConfig(type) {
88
+ return ELEMENT_TYPE_CONFIG[type];
89
+ }
90
+ export function getAllSupportedTypes() {
91
+ return MCP_SUPPORTED_TYPES;
92
+ }
93
+ export function getValidTypesForMCP() {
94
+ return VALID_TYPES_ARRAY;
95
+ }
96
+ /**
97
+ * Migration note: To use this centralized config:
98
+ *
99
+ * 1. Replace hardcoded arrays with imports from this file:
100
+ * - Replace validTypes in src/index.ts with VALID_TYPES_ARRAY
101
+ * - Replace MCP_SUPPORTED_TYPES in CollectionBrowser.ts with import
102
+ * - Replace mapping objects with imports from this file
103
+ *
104
+ * 2. Update components to use utility functions instead of hardcoded checks
105
+ *
106
+ * 3. When adding new types, only update ELEMENT_TYPE_CONFIG above
107
+ */
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvZWxlbWVudC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNyQixNQUFNLEVBQUUsVUFBVTtRQUNsQixTQUFTLEVBQUUsVUFBVTtRQUNyQixZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsSUFBSTtRQUNoQixJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSxzRUFBc0U7S0FDcEY7SUFDRCxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNuQixNQUFNLEVBQUUsUUFBUTtRQUNoQixTQUFTLEVBQUUsUUFBUTtRQUNuQixZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsSUFBSTtRQUNoQixJQUFJLEVBQUUsS0FBSztRQUNYLFdBQVcsRUFBRSwwQ0FBMEM7S0FDeEQ7SUFDRCxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsV0FBVztRQUNuQixTQUFTLEVBQUUsV0FBVztRQUN0QixZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsSUFBSTtRQUNoQixJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSx3REFBd0Q7S0FDdEU7SUFDRCxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNuQixNQUFNLEVBQUUsUUFBUTtRQUNoQixTQUFTLEVBQUUsUUFBUTtRQUNuQixZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsSUFBSTtRQUNoQixJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSxtRUFBbUU7S0FDakY7SUFDRCxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNwQixNQUFNLEVBQUUsVUFBVTtRQUNsQixTQUFTLEVBQUUsVUFBVTtRQUNyQixZQUFZLEVBQUUsS0FBSyxFQUFFLGlDQUFpQztRQUN0RCxVQUFVLEVBQUUsS0FBSyxFQUFJLHNCQUFzQjtRQUMzQyxJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSx3REFBd0Q7S0FDdEU7SUFDRCxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN0QixNQUFNLEVBQUUsV0FBVztRQUNuQixTQUFTLEVBQUUsV0FBVztRQUN0QixZQUFZLEVBQUUsS0FBSyxFQUFFLGlDQUFpQztRQUN0RCxVQUFVLEVBQUUsS0FBSyxFQUFJLHNCQUFzQjtRQUMzQyxJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSx3REFBd0Q7S0FDdEU7Q0FDTyxDQUFDO0FBRVg7OztHQUdHO0FBRUgsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7S0FDbkUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO0tBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQW1CLENBQUMsQ0FBQztBQUV4Qyw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUN0RCxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FDekMsQ0FBQztBQUVGLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUMxRCxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzFELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBbUI7Q0FDbkMsQ0FBQyxDQUNILENBQUM7QUFFRixtREFBbUQ7QUFDbkQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDekQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUMxRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxtQ0FBbUM7SUFDeEUsTUFBTSxDQUFDLFNBQVM7Q0FDakIsQ0FBQyxDQUNILENBQUM7QUFFRjs7R0FFRztBQUVILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxJQUFpQjtJQUN0RCxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksSUFBSSxLQUFLLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFpQjtJQUNwRCxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENlbnRyYWwgY29uZmlndXJhdGlvbiBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqIFxuICogVGhpcyBmaWxlIHNlcnZlcyBhcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZWxlbWVudCB0eXBlIGNvbmZpZ3VyYXRpb25zLlxuICogV2hlbiBhZGRpbmcgbmV3IGVsZW1lbnQgdHlwZXMsIHVwZGF0ZSB0aGlzIGNvbmZpZyBhbmQgdXNlIHRoZSBkZXJpdmVkIGFycmF5c1xuICogdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyB0aGUgY29kZWJhc2UuXG4gKi9cblxuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuXG4vKipcbiAqIENvbXBsZXRlIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggZWxlbWVudCB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBFTEVNRU5UX1RZUEVfQ09ORklHID0ge1xuICBbRWxlbWVudFR5cGUuUEVSU09OQV06IHtcbiAgICBwbHVyYWw6ICdwZXJzb25hcycsXG4gICAgZGlyZWN0b3J5OiAncGVyc29uYXMnLFxuICAgIG1jcFN1cHBvcnRlZDogdHJ1ZSxcbiAgICBoYXNNYW5hZ2VyOiB0cnVlLFxuICAgIGljb246ICfwn5GkJyxcbiAgICBkZXNjcmlwdGlvbjogJ0JlaGF2aW9yYWwgcHJvZmlsZXMgdGhhdCBkZWZpbmUgQUkgcGVyc29uYWxpdHkgYW5kIGludGVyYWN0aW9uIHN0eWxlJ1xuICB9LFxuICBbRWxlbWVudFR5cGUuU0tJTExdOiB7XG4gICAgcGx1cmFsOiAnc2tpbGxzJyxcbiAgICBkaXJlY3Rvcnk6ICdza2lsbHMnLCBcbiAgICBtY3BTdXBwb3J0ZWQ6IHRydWUsXG4gICAgaGFzTWFuYWdlcjogdHJ1ZSxcbiAgICBpY29uOiAn8J+boO+4jycsXG4gICAgZGVzY3JpcHRpb246ICdEaXNjcmV0ZSBjYXBhYmlsaXRpZXMgZm9yIHNwZWNpZmljIHRhc2tzJ1xuICB9LFxuICBbRWxlbWVudFR5cGUuVEVNUExBVEVdOiB7XG4gICAgcGx1cmFsOiAndGVtcGxhdGVzJyxcbiAgICBkaXJlY3Rvcnk6ICd0ZW1wbGF0ZXMnLFxuICAgIG1jcFN1cHBvcnRlZDogdHJ1ZSxcbiAgICBoYXNNYW5hZ2VyOiB0cnVlLFxuICAgIGljb246ICfwn5OEJyxcbiAgICBkZXNjcmlwdGlvbjogJ1JldXNhYmxlIGNvbnRlbnQgc3RydWN0dXJlcyB3aXRoIHZhcmlhYmxlIHN1YnN0aXR1dGlvbidcbiAgfSxcbiAgW0VsZW1lbnRUeXBlLkFHRU5UXToge1xuICAgIHBsdXJhbDogJ2FnZW50cycsXG4gICAgZGlyZWN0b3J5OiAnYWdlbnRzJyxcbiAgICBtY3BTdXBwb3J0ZWQ6IHRydWUsXG4gICAgaGFzTWFuYWdlcjogdHJ1ZSxcbiAgICBpY29uOiAn8J+klicsXG4gICAgZGVzY3JpcHRpb246ICdBdXRvbm9tb3VzIGdvYWwtb3JpZW50ZWQgYWN0b3JzIHdpdGggZGVjaXNpb24tbWFraW5nIGNhcGFiaWxpdGllcydcbiAgfSxcbiAgW0VsZW1lbnRUeXBlLk1FTU9SWV06IHtcbiAgICBwbHVyYWw6ICdtZW1vcmllcycsXG4gICAgZGlyZWN0b3J5OiAnbWVtb3JpZXMnLFxuICAgIG1jcFN1cHBvcnRlZDogZmFsc2UsIC8vIEhpZGRlbiBmcm9tIE1DUCBwZXIgSXNzdWUgIzE0NFxuICAgIGhhc01hbmFnZXI6IGZhbHNlLCAgIC8vIE5vdCB5ZXQgaW1wbGVtZW50ZWRcbiAgICBpY29uOiAn8J+noCcsXG4gICAgZGVzY3JpcHRpb246ICdQZXJzaXN0ZW50IGNvbnRleHQgc3RvcmFnZSBmb3IgY29udGludWl0eSBhbmQgbGVhcm5pbmcnXG4gIH0sXG4gIFtFbGVtZW50VHlwZS5FTlNFTUJMRV06IHtcbiAgICBwbHVyYWw6ICdlbnNlbWJsZXMnLFxuICAgIGRpcmVjdG9yeTogJ2Vuc2VtYmxlcycsXG4gICAgbWNwU3VwcG9ydGVkOiBmYWxzZSwgLy8gSGlkZGVuIGZyb20gTUNQIHBlciBJc3N1ZSAjMTQ0XG4gICAgaGFzTWFuYWdlcjogZmFsc2UsICAgLy8gTm90IHlldCBpbXBsZW1lbnRlZFxuICAgIGljb246ICfwn46tJyxcbiAgICBkZXNjcmlwdGlvbjogJ0dyb3VwcyBvZiBlbGVtZW50cyB3b3JraW5nIHRvZ2V0aGVyIGFzIGEgY29oZXNpdmUgdW5pdCdcbiAgfVxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBEZXJpdmVkIGFycmF5cyBmb3IgdmFsaWRhdGlvbiBhbmQgZmlsdGVyaW5nXG4gKiBUaGVzZSBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgY29uZmlnIGFib3ZlXG4gKi9cblxuLy8gRWxlbWVudCB0eXBlcyB0aGF0IGFyZSBleHBvc2VkIHZpYSBNQ1AgdG9vbHNcbmV4cG9ydCBjb25zdCBNQ1BfU1VQUE9SVEVEX1RZUEVTID0gT2JqZWN0LmVudHJpZXMoRUxFTUVOVF9UWVBFX0NPTkZJRylcbiAgLmZpbHRlcigoWywgY29uZmlnXSkgPT4gY29uZmlnLm1jcFN1cHBvcnRlZClcbiAgLm1hcCgoW3R5cGVdKSA9PiB0eXBlIGFzIEVsZW1lbnRUeXBlKTtcblxuLy8gUGx1cmFsIGZvcm1zIGZvciBNQ1AgdmFsaWRhdGlvbiAodXNlZCBpbiBicm93c2VDb2xsZWN0aW9uIHZhbGlkVHlwZXMgYXJyYXkpXG5leHBvcnQgY29uc3QgVkFMSURfVFlQRVNfQVJSQVkgPSBNQ1BfU1VQUE9SVEVEX1RZUEVTLm1hcChcbiAgdHlwZSA9PiBFTEVNRU5UX1RZUEVfQ09ORklHW3R5cGVdLnBsdXJhbFxuKTtcblxuLy8gTWFwcGluZyBmcm9tIHBsdXJhbCBmb3JtcyB0byBFbGVtZW50VHlwZSB2YWx1ZXNcbmV4cG9ydCBjb25zdCBQTFVSQUxfVE9fRUxFTUVOVF9UWVBFX01BUCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgT2JqZWN0LmVudHJpZXMoRUxFTUVOVF9UWVBFX0NPTkZJRykubWFwKChbdHlwZSwgY29uZmlnXSkgPT4gW1xuICAgIGNvbmZpZy5wbHVyYWwsIHR5cGUgYXMgRWxlbWVudFR5cGVcbiAgXSlcbik7XG5cbi8vIE1hcHBpbmcgZnJvbSBzaW5ndWxhciBmb3JtcyB0byBkaXJlY3RvcnkgbmFtZXMgIFxuZXhwb3J0IGNvbnN0IFNJTkdVTEFSX1RPX0RJUkVDVE9SWV9NQVAgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKEVMRU1FTlRfVFlQRV9DT05GSUcpLm1hcCgoW3R5cGUsIGNvbmZpZ10pID0+IFtcbiAgICB0eXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgncycsICcnKSwgLy8gQ29udmVydCAncGVyc29uYXMnIC0+ICdwZXJzb25hJyBcbiAgICBjb25maWcuZGlyZWN0b3J5XG4gIF0pXG4pO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudFR5cGVTdXBwb3J0ZWQodHlwZTogRWxlbWVudFR5cGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVMRU1FTlRfVFlQRV9DT05GSUdbdHlwZV0/Lm1jcFN1cHBvcnRlZCA/PyBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRUeXBlQ29uZmlnKHR5cGU6IEVsZW1lbnRUeXBlKSB7XG4gIHJldHVybiBFTEVNRU5UX1RZUEVfQ09ORklHW3R5cGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsU3VwcG9ydGVkVHlwZXMoKTogRWxlbWVudFR5cGVbXSB7XG4gIHJldHVybiBNQ1BfU1VQUE9SVEVEX1RZUEVTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRUeXBlc0Zvck1DUCgpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBWQUxJRF9UWVBFU19BUlJBWTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb24gbm90ZTogVG8gdXNlIHRoaXMgY2VudHJhbGl6ZWQgY29uZmlnOlxuICogXG4gKiAxLiBSZXBsYWNlIGhhcmRjb2RlZCBhcnJheXMgd2l0aCBpbXBvcnRzIGZyb20gdGhpcyBmaWxlOlxuICogICAgLSBSZXBsYWNlIHZhbGlkVHlwZXMgaW4gc3JjL2luZGV4LnRzIHdpdGggVkFMSURfVFlQRVNfQVJSQVlcbiAqICAgIC0gUmVwbGFjZSBNQ1BfU1VQUE9SVEVEX1RZUEVTIGluIENvbGxlY3Rpb25Ccm93c2VyLnRzIHdpdGggaW1wb3J0XG4gKiAgICAtIFJlcGxhY2UgbWFwcGluZyBvYmplY3RzIHdpdGggaW1wb3J0cyBmcm9tIHRoaXMgZmlsZVxuICogXG4gKiAyLiBVcGRhdGUgY29tcG9uZW50cyB0byB1c2UgdXRpbGl0eSBmdW5jdGlvbnMgaW5zdGVhZCBvZiBoYXJkY29kZWQgY2hlY2tzXG4gKiBcbiAqIDMuIFdoZW4gYWRkaW5nIG5ldyB0eXBlcywgb25seSB1cGRhdGUgRUxFTUVOVF9UWVBFX0NPTkZJRyBhYm92ZVxuICovIl19
@@ -3,4 +3,6 @@
3
3
  */
4
4
  export * from './constants.js';
5
5
  export * from './indicator-config.js';
6
+ export * from './element-types.js';
7
+ export * from './portfolio-constants.js';
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
@@ -3,4 +3,6 @@
3
3
  */
4
4
  export * from './constants.js';
5
5
  export * from './indicator-config.js';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDZW50cmFsIGV4cG9ydCBwb2ludCBmb3IgY29uZmlndXJhdGlvblxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW5kaWNhdG9yLWNvbmZpZy5qcyc7Il19
6
+ export * from './element-types.js';
7
+ export * from './portfolio-constants.js';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2VudHJhbCBleHBvcnQgcG9pbnQgZm9yIGNvbmZpZ3VyYXRpb25cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2luZGljYXRvci1jb25maWcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbGVtZW50LXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcG9ydGZvbGlvLWNvbnN0YW50cy5qcyc7Il19