@prompd/cli 0.3.3

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 (223) hide show
  1. package/README.md +162 -0
  2. package/bin/prompd.js +23 -0
  3. package/dist/commands/cache.d.ts +3 -0
  4. package/dist/commands/cache.d.ts.map +1 -0
  5. package/dist/commands/cache.js +199 -0
  6. package/dist/commands/cache.js.map +1 -0
  7. package/dist/commands/compile.d.ts +9 -0
  8. package/dist/commands/compile.d.ts.map +1 -0
  9. package/dist/commands/compile.js +104 -0
  10. package/dist/commands/compile.js.map +1 -0
  11. package/dist/commands/config.d.ts +7 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +212 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/create.d.ts +3 -0
  16. package/dist/commands/create.d.ts.map +1 -0
  17. package/dist/commands/create.js +183 -0
  18. package/dist/commands/create.js.map +1 -0
  19. package/dist/commands/deps.d.ts +3 -0
  20. package/dist/commands/deps.d.ts.map +1 -0
  21. package/dist/commands/deps.js +192 -0
  22. package/dist/commands/deps.js.map +1 -0
  23. package/dist/commands/explain.d.ts +3 -0
  24. package/dist/commands/explain.d.ts.map +1 -0
  25. package/dist/commands/explain.js +227 -0
  26. package/dist/commands/explain.js.map +1 -0
  27. package/dist/commands/git.d.ts +3 -0
  28. package/dist/commands/git.d.ts.map +1 -0
  29. package/dist/commands/git.js +306 -0
  30. package/dist/commands/git.js.map +1 -0
  31. package/dist/commands/init.d.ts +3 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +177 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/list.d.ts +3 -0
  36. package/dist/commands/list.d.ts.map +1 -0
  37. package/dist/commands/list.js +126 -0
  38. package/dist/commands/list.js.map +1 -0
  39. package/dist/commands/mcp.d.ts +3 -0
  40. package/dist/commands/mcp.d.ts.map +1 -0
  41. package/dist/commands/mcp.js +326 -0
  42. package/dist/commands/mcp.js.map +1 -0
  43. package/dist/commands/namespace.d.ts +3 -0
  44. package/dist/commands/namespace.d.ts.map +1 -0
  45. package/dist/commands/namespace.js +113 -0
  46. package/dist/commands/namespace.js.map +1 -0
  47. package/dist/commands/package.d.ts +23 -0
  48. package/dist/commands/package.d.ts.map +1 -0
  49. package/dist/commands/package.js +746 -0
  50. package/dist/commands/package.js.map +1 -0
  51. package/dist/commands/provider.d.ts +3 -0
  52. package/dist/commands/provider.d.ts.map +1 -0
  53. package/dist/commands/provider.js +285 -0
  54. package/dist/commands/provider.js.map +1 -0
  55. package/dist/commands/registry.d.ts +9 -0
  56. package/dist/commands/registry.d.ts.map +1 -0
  57. package/dist/commands/registry.js +361 -0
  58. package/dist/commands/registry.js.map +1 -0
  59. package/dist/commands/run.d.ts +3 -0
  60. package/dist/commands/run.d.ts.map +1 -0
  61. package/dist/commands/run.js +157 -0
  62. package/dist/commands/run.js.map +1 -0
  63. package/dist/commands/show.d.ts +3 -0
  64. package/dist/commands/show.d.ts.map +1 -0
  65. package/dist/commands/show.js +90 -0
  66. package/dist/commands/show.js.map +1 -0
  67. package/dist/commands/uninstall.d.ts +3 -0
  68. package/dist/commands/uninstall.d.ts.map +1 -0
  69. package/dist/commands/uninstall.js +95 -0
  70. package/dist/commands/uninstall.js.map +1 -0
  71. package/dist/commands/validate.d.ts +3 -0
  72. package/dist/commands/validate.d.ts.map +1 -0
  73. package/dist/commands/validate.js +57 -0
  74. package/dist/commands/validate.js.map +1 -0
  75. package/dist/commands/version.d.ts +3 -0
  76. package/dist/commands/version.d.ts.map +1 -0
  77. package/dist/commands/version.js +166 -0
  78. package/dist/commands/version.js.map +1 -0
  79. package/dist/index.d.ts +5 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +388 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/lib/auth.d.ts +164 -0
  84. package/dist/lib/auth.d.ts.map +1 -0
  85. package/dist/lib/auth.js +388 -0
  86. package/dist/lib/auth.js.map +1 -0
  87. package/dist/lib/compiler/file-system.d.ts +178 -0
  88. package/dist/lib/compiler/file-system.d.ts.map +1 -0
  89. package/dist/lib/compiler/file-system.js +440 -0
  90. package/dist/lib/compiler/file-system.js.map +1 -0
  91. package/dist/lib/compiler/formatters/anthropic.d.ts +21 -0
  92. package/dist/lib/compiler/formatters/anthropic.d.ts.map +1 -0
  93. package/dist/lib/compiler/formatters/anthropic.js +95 -0
  94. package/dist/lib/compiler/formatters/anthropic.js.map +1 -0
  95. package/dist/lib/compiler/formatters/markdown.d.ts +17 -0
  96. package/dist/lib/compiler/formatters/markdown.d.ts.map +1 -0
  97. package/dist/lib/compiler/formatters/markdown.js +114 -0
  98. package/dist/lib/compiler/formatters/markdown.js.map +1 -0
  99. package/dist/lib/compiler/formatters/openai.d.ts +21 -0
  100. package/dist/lib/compiler/formatters/openai.d.ts.map +1 -0
  101. package/dist/lib/compiler/formatters/openai.js +98 -0
  102. package/dist/lib/compiler/formatters/openai.js.map +1 -0
  103. package/dist/lib/compiler/index.d.ts +56 -0
  104. package/dist/lib/compiler/index.d.ts.map +1 -0
  105. package/dist/lib/compiler/index.js +165 -0
  106. package/dist/lib/compiler/index.js.map +1 -0
  107. package/dist/lib/compiler/language-map.d.ts +31 -0
  108. package/dist/lib/compiler/language-map.d.ts.map +1 -0
  109. package/dist/lib/compiler/language-map.js +156 -0
  110. package/dist/lib/compiler/language-map.js.map +1 -0
  111. package/dist/lib/compiler/package-resolver.d.ts +68 -0
  112. package/dist/lib/compiler/package-resolver.d.ts.map +1 -0
  113. package/dist/lib/compiler/package-resolver.js +254 -0
  114. package/dist/lib/compiler/package-resolver.js.map +1 -0
  115. package/dist/lib/compiler/pipeline.d.ts +53 -0
  116. package/dist/lib/compiler/pipeline.d.ts.map +1 -0
  117. package/dist/lib/compiler/pipeline.js +209 -0
  118. package/dist/lib/compiler/pipeline.js.map +1 -0
  119. package/dist/lib/compiler/prompd-loader.d.ts +108 -0
  120. package/dist/lib/compiler/prompd-loader.d.ts.map +1 -0
  121. package/dist/lib/compiler/prompd-loader.js +270 -0
  122. package/dist/lib/compiler/prompd-loader.js.map +1 -0
  123. package/dist/lib/compiler/section-override.d.ts +40 -0
  124. package/dist/lib/compiler/section-override.d.ts.map +1 -0
  125. package/dist/lib/compiler/section-override.js +296 -0
  126. package/dist/lib/compiler/section-override.js.map +1 -0
  127. package/dist/lib/compiler/stages/assets.d.ts +71 -0
  128. package/dist/lib/compiler/stages/assets.d.ts.map +1 -0
  129. package/dist/lib/compiler/stages/assets.js +456 -0
  130. package/dist/lib/compiler/stages/assets.js.map +1 -0
  131. package/dist/lib/compiler/stages/codegen.d.ts +17 -0
  132. package/dist/lib/compiler/stages/codegen.d.ts.map +1 -0
  133. package/dist/lib/compiler/stages/codegen.js +64 -0
  134. package/dist/lib/compiler/stages/codegen.js.map +1 -0
  135. package/dist/lib/compiler/stages/dependency.d.ts +38 -0
  136. package/dist/lib/compiler/stages/dependency.d.ts.map +1 -0
  137. package/dist/lib/compiler/stages/dependency.js +307 -0
  138. package/dist/lib/compiler/stages/dependency.js.map +1 -0
  139. package/dist/lib/compiler/stages/lexical.d.ts +19 -0
  140. package/dist/lib/compiler/stages/lexical.d.ts.map +1 -0
  141. package/dist/lib/compiler/stages/lexical.js +92 -0
  142. package/dist/lib/compiler/stages/lexical.js.map +1 -0
  143. package/dist/lib/compiler/stages/semantic.d.ts +20 -0
  144. package/dist/lib/compiler/stages/semantic.d.ts.map +1 -0
  145. package/dist/lib/compiler/stages/semantic.js +166 -0
  146. package/dist/lib/compiler/stages/semantic.js.map +1 -0
  147. package/dist/lib/compiler/stages/template.d.ts +94 -0
  148. package/dist/lib/compiler/stages/template.d.ts.map +1 -0
  149. package/dist/lib/compiler/stages/template.js +1044 -0
  150. package/dist/lib/compiler/stages/template.js.map +1 -0
  151. package/dist/lib/compiler/types.d.ts +200 -0
  152. package/dist/lib/compiler/types.d.ts.map +1 -0
  153. package/dist/lib/compiler/types.js +137 -0
  154. package/dist/lib/compiler/types.js.map +1 -0
  155. package/dist/lib/config.d.ts +29 -0
  156. package/dist/lib/config.d.ts.map +1 -0
  157. package/dist/lib/config.js +375 -0
  158. package/dist/lib/config.js.map +1 -0
  159. package/dist/lib/errors.d.ts +19 -0
  160. package/dist/lib/errors.d.ts.map +1 -0
  161. package/dist/lib/errors.js +47 -0
  162. package/dist/lib/errors.js.map +1 -0
  163. package/dist/lib/executor.d.ts +18 -0
  164. package/dist/lib/executor.d.ts.map +1 -0
  165. package/dist/lib/executor.js +372 -0
  166. package/dist/lib/executor.js.map +1 -0
  167. package/dist/lib/git.d.ts +74 -0
  168. package/dist/lib/git.d.ts.map +1 -0
  169. package/dist/lib/git.js +254 -0
  170. package/dist/lib/git.js.map +1 -0
  171. package/dist/lib/index.d.ts +43 -0
  172. package/dist/lib/index.d.ts.map +1 -0
  173. package/dist/lib/index.js +108 -0
  174. package/dist/lib/index.js.map +1 -0
  175. package/dist/lib/mcp.d.ts +42 -0
  176. package/dist/lib/mcp.d.ts.map +1 -0
  177. package/dist/lib/mcp.js +477 -0
  178. package/dist/lib/mcp.js.map +1 -0
  179. package/dist/lib/model-updater.d.ts +51 -0
  180. package/dist/lib/model-updater.d.ts.map +1 -0
  181. package/dist/lib/model-updater.js +275 -0
  182. package/dist/lib/model-updater.js.map +1 -0
  183. package/dist/lib/parser.d.ts +9 -0
  184. package/dist/lib/parser.d.ts.map +1 -0
  185. package/dist/lib/parser.js +197 -0
  186. package/dist/lib/parser.js.map +1 -0
  187. package/dist/lib/registry.d.ts +183 -0
  188. package/dist/lib/registry.d.ts.map +1 -0
  189. package/dist/lib/registry.js +786 -0
  190. package/dist/lib/registry.js.map +1 -0
  191. package/dist/lib/rpc-server.d.ts +78 -0
  192. package/dist/lib/rpc-server.d.ts.map +1 -0
  193. package/dist/lib/rpc-server.js +404 -0
  194. package/dist/lib/rpc-server.js.map +1 -0
  195. package/dist/lib/security.d.ts +120 -0
  196. package/dist/lib/security.d.ts.map +1 -0
  197. package/dist/lib/security.js +478 -0
  198. package/dist/lib/security.js.map +1 -0
  199. package/dist/lib/validation.d.ts +106 -0
  200. package/dist/lib/validation.d.ts.map +1 -0
  201. package/dist/lib/validation.js +398 -0
  202. package/dist/lib/validation.js.map +1 -0
  203. package/dist/lib/version.d.ts +29 -0
  204. package/dist/lib/version.d.ts.map +1 -0
  205. package/dist/lib/version.js +202 -0
  206. package/dist/lib/version.js.map +1 -0
  207. package/dist/lib/workflow-engine.d.ts +161 -0
  208. package/dist/lib/workflow-engine.d.ts.map +1 -0
  209. package/dist/lib/workflow-engine.js +422 -0
  210. package/dist/lib/workflow-engine.js.map +1 -0
  211. package/dist/lib/workflow.d.ts +102 -0
  212. package/dist/lib/workflow.d.ts.map +1 -0
  213. package/dist/lib/workflow.js +228 -0
  214. package/dist/lib/workflow.js.map +1 -0
  215. package/dist/server.d.ts +8 -0
  216. package/dist/server.d.ts.map +1 -0
  217. package/dist/server.js +134 -0
  218. package/dist/server.js.map +1 -0
  219. package/dist/types/index.d.ts +116 -0
  220. package/dist/types/index.d.ts.map +1 -0
  221. package/dist/types/index.js +144 -0
  222. package/dist/types/index.js.map +1 -0
  223. package/package.json +104 -0
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Security utilities for Prompd CLI
3
+ * Implements least privilege and security boundaries
4
+ */
5
+ export declare class SecurityManager {
6
+ static initialize(): void;
7
+ private static readonly MAX_FILE_SIZE;
8
+ private static readonly MAX_WORKFLOW_NODES;
9
+ private static readonly ALLOWED_TEMP_DIR;
10
+ private static readonly BLOCKED_PATHS;
11
+ /**
12
+ * Validates and sanitizes file paths to prevent directory traversal
13
+ */
14
+ static validateFilePath(filePath: string, allowedExtensions?: string[]): string;
15
+ /**
16
+ * Sanitizes tool/workflow names to prevent injection
17
+ */
18
+ static sanitizeToolName(name: string): string;
19
+ /**
20
+ * Creates a secure temporary file path
21
+ */
22
+ static createSecureTempPath(prefix?: string, extension?: string): string;
23
+ /**
24
+ * Validates file size before processing
25
+ */
26
+ static validateFileSize(filePath: string): Promise<void>;
27
+ /**
28
+ * Validates workflow complexity to prevent DoS
29
+ */
30
+ static validateWorkflowComplexity(workflow: any): void;
31
+ /**
32
+ * Validates API endpoints (whitelist approach)
33
+ */
34
+ private static isAllowedApiEndpoint;
35
+ /**
36
+ * Sanitizes user input parameters
37
+ */
38
+ static sanitizeParameters(params: Record<string, any>, maxDepth?: number): Record<string, any>;
39
+ private static sanitizeParameterKey;
40
+ private static sanitizeStringValue;
41
+ private static sanitizeNumberValue;
42
+ private static sanitizeArrayValue;
43
+ /**
44
+ * Creates a secure execution environment
45
+ */
46
+ static createSecureExecutionContext(): Promise<{
47
+ tempDir: string;
48
+ cleanup: () => Promise<void>;
49
+ }>;
50
+ /**
51
+ * Validates registry URL for security
52
+ * Only HTTPS allowed except for localhost
53
+ */
54
+ static validateRegistryUrl(url: string): boolean;
55
+ /**
56
+ * Scans content for potential secrets
57
+ * Returns true if secrets detected
58
+ */
59
+ static scanForSecrets(content: string): Promise<{
60
+ hasSecrets: boolean;
61
+ secrets: Array<{
62
+ type: string;
63
+ line: number;
64
+ }>;
65
+ }>;
66
+ /**
67
+ * Scans a file for potential secrets before packaging/publishing
68
+ */
69
+ static scanFileForSecrets(filePath: string): Promise<{
70
+ hasSecrets: boolean;
71
+ secrets: Array<{
72
+ type: string;
73
+ line: number;
74
+ }>;
75
+ }>;
76
+ /**
77
+ * Sanitizes environment variables (clear sensitive data after reading)
78
+ */
79
+ static sanitizeEnvironment(): void;
80
+ }
81
+ /**
82
+ * Git-specific security validation functions
83
+ * Ported from Python CLI security.py
84
+ */
85
+ export declare class GitSecurityError extends Error {
86
+ constructor(message: string);
87
+ }
88
+ /**
89
+ * Validates file paths specifically for Git operations.
90
+ * Prevents command injection and path traversal attacks.
91
+ */
92
+ export declare function validateGitFilePath(filePath: string): string;
93
+ /**
94
+ * Validates Git commit messages for safety.
95
+ * Prevents command injection in commit messages.
96
+ */
97
+ export declare function validateGitMessage(message: string): string;
98
+ /**
99
+ * Validates semantic version strings.
100
+ */
101
+ export declare function validateVersionString(version: string): string;
102
+ /**
103
+ * Security middleware for MCP requests
104
+ */
105
+ export declare class MCPSecurityMiddleware {
106
+ private static readonly MAX_REQUEST_SIZE;
107
+ private static readonly RATE_LIMIT_WINDOW;
108
+ private static readonly RATE_LIMIT_MAX_REQUESTS;
109
+ private requestCounts;
110
+ /**
111
+ * Validates incoming MCP request
112
+ */
113
+ validateRequest(request: any, clientId?: string): void;
114
+ private enforceRateLimit;
115
+ /**
116
+ * Cleans up old rate limit data
117
+ */
118
+ cleanup(): void;
119
+ }
120
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,qBAAa,eAAe;IAC1B,MAAM,CAAC,UAAU,IAAI,IAAI;IAKzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAoB;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAA2E;IAEhH;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,GAAE,MAAM,EAAO,GAAG,MAAM;IA0BnF;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAmB7C;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,GAAE,MAAiB,EAAE,SAAS,GAAE,MAAe,GAAG,MAAM;IAS1F;;OAEG;WACU,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9D;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAyBtD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAyBnC;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA6BjG,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAenC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAclC,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAalC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA4BjC;;OAEG;WACU,4BAA4B,IAAI,OAAO,CAAC;QACnD,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC9B,CAAC;IAuBF;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhD;;;OAGG;WACU,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;IAUF;;OAEG;WACU,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD,CAAC;IAUF;;OAEG;IACH,MAAM,CAAC,mBAAmB,IAAI,IAAI;CAcnC;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkC5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmB1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsB7D;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAc;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAO;IAEtD,OAAO,CAAC,aAAa,CAA2D;IAEhF;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAE,MAAkB,GAAG,IAAI;IAgBjE,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAQhB"}
@@ -0,0 +1,478 @@
1
+ "use strict";
2
+ /**
3
+ * Security utilities for Prompd CLI
4
+ * Implements least privilege and security boundaries
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.MCPSecurityMiddleware = exports.GitSecurityError = exports.SecurityManager = void 0;
41
+ exports.validateGitFilePath = validateGitFilePath;
42
+ exports.validateGitMessage = validateGitMessage;
43
+ exports.validateVersionString = validateVersionString;
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs-extra"));
46
+ const validation_1 = require("./validation");
47
+ class SecurityManager {
48
+ static initialize() {
49
+ // Initialize security settings if needed
50
+ console.log('Security Manager initialized');
51
+ }
52
+ /**
53
+ * Validates and sanitizes file paths to prevent directory traversal
54
+ */
55
+ static validateFilePath(filePath, allowedExtensions = []) {
56
+ if (!filePath || typeof filePath !== 'string') {
57
+ throw new Error('Invalid file path');
58
+ }
59
+ // Normalize and resolve path
60
+ const normalized = path.normalize(path.resolve(filePath));
61
+ // Check for directory traversal attempts
62
+ for (const blockedPath of this.BLOCKED_PATHS) {
63
+ if (normalized.toLowerCase().includes(blockedPath.toLowerCase())) {
64
+ throw new Error(`Access denied: Path contains blocked directory: ${blockedPath}`);
65
+ }
66
+ }
67
+ // Validate extension if specified
68
+ if (allowedExtensions.length > 0) {
69
+ const ext = path.extname(normalized).toLowerCase();
70
+ if (!allowedExtensions.includes(ext)) {
71
+ throw new Error(`Invalid file extension. Allowed: ${allowedExtensions.join(', ')}`);
72
+ }
73
+ }
74
+ return normalized;
75
+ }
76
+ /**
77
+ * Sanitizes tool/workflow names to prevent injection
78
+ */
79
+ static sanitizeToolName(name) {
80
+ if (!name || typeof name !== 'string') {
81
+ throw new Error('Tool name is required');
82
+ }
83
+ // Only allow alphanumeric, hyphens, underscores
84
+ const sanitized = name.replace(/[^a-zA-Z0-9\-_]/g, '');
85
+ if (sanitized.length === 0) {
86
+ throw new Error('Tool name must contain valid characters (a-z, A-Z, 0-9, -, _)');
87
+ }
88
+ if (sanitized.length > 64) {
89
+ throw new Error('Tool name too long (max 64 characters)');
90
+ }
91
+ return sanitized;
92
+ }
93
+ /**
94
+ * Creates a secure temporary file path
95
+ */
96
+ static createSecureTempPath(prefix = 'prompd', extension = '.tmp') {
97
+ const sanitizedPrefix = this.sanitizeToolName(prefix);
98
+ const timestamp = Date.now();
99
+ const random = Math.random().toString(36).substring(2);
100
+ const filename = `${sanitizedPrefix}-${timestamp}-${random}${extension}`;
101
+ return path.join(this.ALLOWED_TEMP_DIR, 'temp', filename);
102
+ }
103
+ /**
104
+ * Validates file size before processing
105
+ */
106
+ static async validateFileSize(filePath) {
107
+ try {
108
+ const stats = await fs.stat(filePath);
109
+ if (stats.size > this.MAX_FILE_SIZE) {
110
+ throw new Error(`File too large: ${Math.round(stats.size / 1024 / 1024)}MB (max: ${this.MAX_FILE_SIZE / 1024 / 1024}MB)`);
111
+ }
112
+ }
113
+ catch (error) {
114
+ if (error instanceof Error && error.message.includes('File too large')) {
115
+ throw error;
116
+ }
117
+ throw new Error(`Cannot access file: ${filePath}`);
118
+ }
119
+ }
120
+ /**
121
+ * Validates workflow complexity to prevent DoS
122
+ */
123
+ static validateWorkflowComplexity(workflow) {
124
+ if (!workflow || typeof workflow !== 'object') {
125
+ throw new Error('Invalid workflow format');
126
+ }
127
+ // Check node count
128
+ if (workflow.nodes && workflow.nodes.length > this.MAX_WORKFLOW_NODES) {
129
+ throw new Error(`Workflow too complex: ${workflow.nodes.length} nodes (max: ${this.MAX_WORKFLOW_NODES})`);
130
+ }
131
+ // Check for potentially dangerous node types
132
+ if (workflow.nodes) {
133
+ for (const node of workflow.nodes) {
134
+ if (node.type === 'transformer' && node.data?.config?.transformationType === 'javascript') {
135
+ throw new Error('JavaScript transformation nodes are disabled for security');
136
+ }
137
+ // Block external API calls without explicit permission
138
+ if (node.type === 'api' && !this.isAllowedApiEndpoint(node.data?.config?.endpoint)) {
139
+ throw new Error(`API endpoint not allowed: ${node.data?.config?.endpoint}`);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Validates API endpoints (whitelist approach)
146
+ */
147
+ static isAllowedApiEndpoint(endpoint) {
148
+ if (!endpoint)
149
+ return false;
150
+ // Only allow HTTPS endpoints
151
+ if (!endpoint.startsWith('https://')) {
152
+ return false;
153
+ }
154
+ // Simple whitelist - in production this would be configurable
155
+ const allowedDomains = [
156
+ 'api.openai.com',
157
+ 'api.anthropic.com',
158
+ 'localhost' // For development
159
+ ];
160
+ try {
161
+ const url = new URL(endpoint);
162
+ return allowedDomains.some(domain => url.hostname === domain || url.hostname.endsWith(`.${domain}`));
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ /**
169
+ * Sanitizes user input parameters
170
+ */
171
+ static sanitizeParameters(params, maxDepth = 3) {
172
+ if (!params || typeof params !== 'object') {
173
+ return {};
174
+ }
175
+ const sanitized = {};
176
+ for (const [key, value] of Object.entries(params)) {
177
+ // Validate key
178
+ const cleanKey = this.sanitizeParameterKey(key);
179
+ // Sanitize value based on type
180
+ if (typeof value === 'string') {
181
+ sanitized[cleanKey] = this.sanitizeStringValue(value);
182
+ }
183
+ else if (typeof value === 'number') {
184
+ sanitized[cleanKey] = this.sanitizeNumberValue(value);
185
+ }
186
+ else if (typeof value === 'boolean') {
187
+ sanitized[cleanKey] = Boolean(value);
188
+ }
189
+ else if (Array.isArray(value)) {
190
+ sanitized[cleanKey] = this.sanitizeArrayValue(value, maxDepth - 1);
191
+ }
192
+ else if (typeof value === 'object' && value !== null && maxDepth > 0) {
193
+ sanitized[cleanKey] = this.sanitizeParameters(value, maxDepth - 1);
194
+ }
195
+ // Drop functions, undefined, symbols, etc.
196
+ }
197
+ return sanitized;
198
+ }
199
+ static sanitizeParameterKey(key) {
200
+ if (typeof key !== 'string') {
201
+ throw new Error('Parameter key must be string');
202
+ }
203
+ // Remove potentially dangerous characters
204
+ const sanitized = key.replace(/[^a-zA-Z0-9_]/g, '_');
205
+ if (sanitized.length === 0 || sanitized.length > 128) {
206
+ throw new Error('Invalid parameter key length');
207
+ }
208
+ return sanitized;
209
+ }
210
+ static sanitizeStringValue(value) {
211
+ if (typeof value !== 'string') {
212
+ return '';
213
+ }
214
+ // Limit string length to prevent memory exhaustion
215
+ if (value.length > 10000) {
216
+ throw new Error('Parameter value too long (max 10000 characters)');
217
+ }
218
+ // Remove null bytes and control characters (except common whitespace)
219
+ return value.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
220
+ }
221
+ static sanitizeNumberValue(value) {
222
+ if (typeof value !== 'number' || !isFinite(value)) {
223
+ throw new Error('Invalid number value');
224
+ }
225
+ // Prevent extreme values
226
+ if (Math.abs(value) > Number.MAX_SAFE_INTEGER) {
227
+ throw new Error('Number value out of safe range');
228
+ }
229
+ return value;
230
+ }
231
+ static sanitizeArrayValue(value, maxDepth) {
232
+ if (!Array.isArray(value)) {
233
+ return [];
234
+ }
235
+ // Limit array size
236
+ if (value.length > 1000) {
237
+ throw new Error('Array too large (max 1000 items)');
238
+ }
239
+ if (maxDepth <= 0) {
240
+ return []; // Prevent deep nesting
241
+ }
242
+ return value.slice(0, 100).map(item => {
243
+ if (typeof item === 'string') {
244
+ return this.sanitizeStringValue(item);
245
+ }
246
+ else if (typeof item === 'number') {
247
+ return this.sanitizeNumberValue(item);
248
+ }
249
+ else if (typeof item === 'boolean') {
250
+ return Boolean(item);
251
+ }
252
+ else if (typeof item === 'object' && item !== null) {
253
+ return this.sanitizeParameters(item, maxDepth - 1);
254
+ }
255
+ return item;
256
+ });
257
+ }
258
+ /**
259
+ * Creates a secure execution environment
260
+ */
261
+ static async createSecureExecutionContext() {
262
+ const tempDir = path.join(this.ALLOWED_TEMP_DIR, 'temp', `execution-${Date.now()}-${Math.random().toString(36)}`);
263
+ await fs.ensureDir(tempDir);
264
+ // Set restrictive permissions if on Unix-like system
265
+ try {
266
+ await fs.chmod(tempDir, 0o700); // Owner read/write/execute only
267
+ }
268
+ catch {
269
+ // Windows doesn't support chmod, ignore
270
+ }
271
+ const cleanup = async () => {
272
+ try {
273
+ await fs.remove(tempDir);
274
+ }
275
+ catch (error) {
276
+ console.warn(`Failed to cleanup temp directory: ${tempDir}`, error);
277
+ }
278
+ };
279
+ return { tempDir, cleanup };
280
+ }
281
+ /**
282
+ * Validates registry URL for security
283
+ * Only HTTPS allowed except for localhost
284
+ */
285
+ static validateRegistryUrl(url) {
286
+ return (0, validation_1.validateRegistryUrl)(url);
287
+ }
288
+ /**
289
+ * Scans content for potential secrets
290
+ * Returns true if secrets detected
291
+ */
292
+ static async scanForSecrets(content) {
293
+ const { detectSecrets } = await Promise.resolve().then(() => __importStar(require('./validation')));
294
+ const detected = detectSecrets(content);
295
+ return {
296
+ hasSecrets: detected.length > 0,
297
+ secrets: detected.map(s => ({ type: s.type, line: s.line }))
298
+ };
299
+ }
300
+ /**
301
+ * Scans a file for potential secrets before packaging/publishing
302
+ */
303
+ static async scanFileForSecrets(filePath) {
304
+ try {
305
+ const content = await fs.readFile(filePath, 'utf-8');
306
+ return this.scanForSecrets(content);
307
+ }
308
+ catch (error) {
309
+ // If we can't read the file, assume no secrets (might be binary)
310
+ return { hasSecrets: false, secrets: [] };
311
+ }
312
+ }
313
+ /**
314
+ * Sanitizes environment variables (clear sensitive data after reading)
315
+ */
316
+ static sanitizeEnvironment() {
317
+ // Clear any temporary sensitive environment variables
318
+ const sensitiveVars = [
319
+ 'TEMP_API_KEY',
320
+ 'TEMP_TOKEN',
321
+ 'TEMP_PASSWORD'
322
+ ];
323
+ sensitiveVars.forEach(varName => {
324
+ if (process.env[varName]) {
325
+ delete process.env[varName];
326
+ }
327
+ });
328
+ }
329
+ }
330
+ exports.SecurityManager = SecurityManager;
331
+ SecurityManager.MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
332
+ SecurityManager.MAX_WORKFLOW_NODES = 1000;
333
+ SecurityManager.ALLOWED_TEMP_DIR = process.cwd();
334
+ SecurityManager.BLOCKED_PATHS = ['..', '~', '/etc', '/usr', '/var', 'C:\\Windows', 'C:\\Program Files'];
335
+ /**
336
+ * Git-specific security validation functions
337
+ * Ported from Python CLI security.py
338
+ */
339
+ class GitSecurityError extends Error {
340
+ constructor(message) {
341
+ super(message);
342
+ this.name = 'GitSecurityError';
343
+ }
344
+ }
345
+ exports.GitSecurityError = GitSecurityError;
346
+ /**
347
+ * Validates file paths specifically for Git operations.
348
+ * Prevents command injection and path traversal attacks.
349
+ */
350
+ function validateGitFilePath(filePath) {
351
+ if (!filePath || typeof filePath !== 'string') {
352
+ throw new GitSecurityError('File path is required');
353
+ }
354
+ // Normalize the path
355
+ const normalized = path.normalize(filePath);
356
+ // Check for path traversal attempts
357
+ const dangerousPatterns = ['..', '~', '$'];
358
+ for (const pattern of dangerousPatterns) {
359
+ if (normalized.includes(pattern)) {
360
+ throw new GitSecurityError(`Potentially dangerous path component '${pattern}' found in: ${normalized}`);
361
+ }
362
+ }
363
+ // Prevent command injection through filenames
364
+ const dangerousChars = [';', '&', '|', '`', '$', '(', ')', '<', '>', '"', "'"];
365
+ for (const char of dangerousChars) {
366
+ if (normalized.includes(char)) {
367
+ throw new GitSecurityError(`Potentially dangerous character '${char}' in filename: ${normalized}`);
368
+ }
369
+ }
370
+ // Check for absolute paths outside current directory
371
+ if (path.isAbsolute(normalized)) {
372
+ const cwd = process.cwd();
373
+ const resolved = path.resolve(normalized);
374
+ if (!resolved.startsWith(cwd)) {
375
+ throw new GitSecurityError(`Absolute path outside current directory not allowed: ${resolved}`);
376
+ }
377
+ }
378
+ return normalized;
379
+ }
380
+ /**
381
+ * Validates Git commit messages for safety.
382
+ * Prevents command injection in commit messages.
383
+ */
384
+ function validateGitMessage(message) {
385
+ if (!message || !message.trim()) {
386
+ throw new GitSecurityError('Commit message cannot be empty');
387
+ }
388
+ // Check message length (Git has practical limits)
389
+ if (message.length > 2000) {
390
+ throw new GitSecurityError('Commit message too long (max 2000 characters)');
391
+ }
392
+ // Check for command injection attempts in commit message
393
+ const dangerousPatterns = ['$(', '`', '${', '#!/', '&>', '|>', '<(', '>('];
394
+ for (const pattern of dangerousPatterns) {
395
+ if (message.includes(pattern)) {
396
+ throw new GitSecurityError(`Potentially dangerous pattern '${pattern}' in commit message`);
397
+ }
398
+ }
399
+ return message.trim();
400
+ }
401
+ /**
402
+ * Validates semantic version strings.
403
+ */
404
+ function validateVersionString(version) {
405
+ if (!version || typeof version !== 'string') {
406
+ throw new GitSecurityError('Version string is required');
407
+ }
408
+ // Semantic version pattern (major.minor.patch with optional pre-release/build)
409
+ const versionPattern = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/;
410
+ if (!versionPattern.test(version)) {
411
+ throw new GitSecurityError(`Invalid semantic version format: ${version}`);
412
+ }
413
+ // Check for reasonable version numbers
414
+ const parts = version.split('.', 3);
415
+ for (let i = 0; i < 3; i++) {
416
+ const num = parseInt(parts[i], 10);
417
+ if (num < 0 || num > 999) {
418
+ throw new GitSecurityError(`Version component out of range (0-999): ${num}`);
419
+ }
420
+ }
421
+ return version;
422
+ }
423
+ /**
424
+ * Security middleware for MCP requests
425
+ */
426
+ class MCPSecurityMiddleware {
427
+ constructor() {
428
+ this.requestCounts = new Map();
429
+ }
430
+ /**
431
+ * Validates incoming MCP request
432
+ */
433
+ validateRequest(request, clientId = 'default') {
434
+ // Size validation
435
+ const requestSize = JSON.stringify(request).length;
436
+ if (requestSize > MCPSecurityMiddleware.MAX_REQUEST_SIZE) {
437
+ throw new Error(`Request too large: ${requestSize} bytes (max: ${MCPSecurityMiddleware.MAX_REQUEST_SIZE})`);
438
+ }
439
+ // Rate limiting
440
+ this.enforceRateLimit(clientId);
441
+ // Parameter validation
442
+ if (request.params?.arguments) {
443
+ request.params.arguments = SecurityManager.sanitizeParameters(request.params.arguments);
444
+ }
445
+ }
446
+ enforceRateLimit(clientId) {
447
+ const now = Date.now();
448
+ const clientData = this.requestCounts.get(clientId);
449
+ if (!clientData || now > clientData.resetTime) {
450
+ // Reset or initialize
451
+ this.requestCounts.set(clientId, {
452
+ count: 1,
453
+ resetTime: now + MCPSecurityMiddleware.RATE_LIMIT_WINDOW
454
+ });
455
+ return;
456
+ }
457
+ if (clientData.count >= MCPSecurityMiddleware.RATE_LIMIT_MAX_REQUESTS) {
458
+ throw new Error(`Rate limit exceeded. Try again in ${Math.ceil((clientData.resetTime - now) / 1000)} seconds`);
459
+ }
460
+ clientData.count++;
461
+ }
462
+ /**
463
+ * Cleans up old rate limit data
464
+ */
465
+ cleanup() {
466
+ const now = Date.now();
467
+ for (const [clientId, data] of this.requestCounts.entries()) {
468
+ if (now > data.resetTime) {
469
+ this.requestCounts.delete(clientId);
470
+ }
471
+ }
472
+ }
473
+ }
474
+ exports.MCPSecurityMiddleware = MCPSecurityMiddleware;
475
+ MCPSecurityMiddleware.MAX_REQUEST_SIZE = 100 * 1024; // 100KB
476
+ MCPSecurityMiddleware.RATE_LIMIT_WINDOW = 60 * 1000; // 1 minute
477
+ MCPSecurityMiddleware.RATE_LIMIT_MAX_REQUESTS = 100;
478
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/lib/security.ts"],"names":[],"mappings":"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"}