@heossi/qnsi 0.3.2

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 (268) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE.md +8 -0
  3. package/README.md +200 -0
  4. package/dist/_activation/activation-client.d.ts +65 -0
  5. package/dist/_activation/activation-client.d.ts.map +1 -0
  6. package/dist/_activation/activation-client.js +164 -0
  7. package/dist/_activation/activation-client.js.map +1 -0
  8. package/dist/_activation/index.d.ts +10 -0
  9. package/dist/_activation/index.d.ts.map +1 -0
  10. package/dist/_activation/index.js +10 -0
  11. package/dist/_activation/index.js.map +1 -0
  12. package/dist/_activation/types.d.ts +128 -0
  13. package/dist/_activation/types.d.ts.map +1 -0
  14. package/dist/_activation/types.js +94 -0
  15. package/dist/_activation/types.js.map +1 -0
  16. package/dist/_internal.d.ts +52 -0
  17. package/dist/_internal.d.ts.map +1 -0
  18. package/dist/_internal.js +235 -0
  19. package/dist/_internal.js.map +1 -0
  20. package/dist/access.d.ts +32 -0
  21. package/dist/access.d.ts.map +1 -0
  22. package/dist/access.js +33 -0
  23. package/dist/access.js.map +1 -0
  24. package/dist/ai.d.ts +51 -0
  25. package/dist/ai.d.ts.map +1 -0
  26. package/dist/ai.js +53 -0
  27. package/dist/ai.js.map +1 -0
  28. package/dist/audit.d.ts +18 -0
  29. package/dist/audit.d.ts.map +1 -0
  30. package/dist/audit.js +21 -0
  31. package/dist/audit.js.map +1 -0
  32. package/dist/auth.d.ts +31 -0
  33. package/dist/auth.d.ts.map +1 -0
  34. package/dist/auth.js +69 -0
  35. package/dist/auth.js.map +1 -0
  36. package/dist/autogen/executor.d.ts +200 -0
  37. package/dist/autogen/executor.d.ts.map +1 -0
  38. package/dist/autogen/executor.js +277 -0
  39. package/dist/autogen/executor.js.map +1 -0
  40. package/dist/autogen/index.d.ts +18 -0
  41. package/dist/autogen/index.d.ts.map +1 -0
  42. package/dist/autogen/index.js +17 -0
  43. package/dist/autogen/index.js.map +1 -0
  44. package/dist/billing.d.ts +22 -0
  45. package/dist/billing.d.ts.map +1 -0
  46. package/dist/billing.js +33 -0
  47. package/dist/billing.js.map +1 -0
  48. package/dist/browser/encrypt.d.ts +68 -0
  49. package/dist/browser/encrypt.d.ts.map +1 -0
  50. package/dist/browser/encrypt.js +191 -0
  51. package/dist/browser/encrypt.js.map +1 -0
  52. package/dist/browser/index.d.ts +39 -0
  53. package/dist/browser/index.d.ts.map +1 -0
  54. package/dist/browser/index.js +41 -0
  55. package/dist/browser/index.js.map +1 -0
  56. package/dist/browser/noble-provider.d.ts +10 -0
  57. package/dist/browser/noble-provider.d.ts.map +1 -0
  58. package/dist/browser/noble-provider.js +130 -0
  59. package/dist/browser/noble-provider.js.map +1 -0
  60. package/dist/browser/pqc-types.d.ts +40 -0
  61. package/dist/browser/pqc-types.d.ts.map +1 -0
  62. package/dist/browser/pqc-types.js +2 -0
  63. package/dist/browser/pqc-types.js.map +1 -0
  64. package/dist/browser/provider-setup.d.ts +70 -0
  65. package/dist/browser/provider-setup.d.ts.map +1 -0
  66. package/dist/browser/provider-setup.js +101 -0
  67. package/dist/browser/provider-setup.js.map +1 -0
  68. package/dist/browser/sdk-package-version.d.ts +12 -0
  69. package/dist/browser/sdk-package-version.d.ts.map +1 -0
  70. package/dist/browser/sdk-package-version.js +12 -0
  71. package/dist/browser/sdk-package-version.js.map +1 -0
  72. package/dist/browser/sign.d.ts +65 -0
  73. package/dist/browser/sign.d.ts.map +1 -0
  74. package/dist/browser/sign.js +124 -0
  75. package/dist/browser/sign.js.map +1 -0
  76. package/dist/browser/telemetry.d.ts +98 -0
  77. package/dist/browser/telemetry.d.ts.map +1 -0
  78. package/dist/browser/telemetry.js +93 -0
  79. package/dist/browser/telemetry.js.map +1 -0
  80. package/dist/cli/commands/access-control.d.ts +4 -0
  81. package/dist/cli/commands/access-control.d.ts.map +1 -0
  82. package/dist/cli/commands/access-control.js +183 -0
  83. package/dist/cli/commands/access-control.js.map +1 -0
  84. package/dist/cli/commands/audit.d.ts +4 -0
  85. package/dist/cli/commands/audit.d.ts.map +1 -0
  86. package/dist/cli/commands/audit.js +70 -0
  87. package/dist/cli/commands/audit.js.map +1 -0
  88. package/dist/cli/commands/auth.d.ts +4 -0
  89. package/dist/cli/commands/auth.d.ts.map +1 -0
  90. package/dist/cli/commands/auth.js +46 -0
  91. package/dist/cli/commands/auth.js.map +1 -0
  92. package/dist/cli/commands/billing.d.ts +4 -0
  93. package/dist/cli/commands/billing.d.ts.map +1 -0
  94. package/dist/cli/commands/billing.js +179 -0
  95. package/dist/cli/commands/billing.js.map +1 -0
  96. package/dist/cli/commands/crypto-policy.d.ts +4 -0
  97. package/dist/cli/commands/crypto-policy.d.ts.map +1 -0
  98. package/dist/cli/commands/crypto-policy.js +130 -0
  99. package/dist/cli/commands/crypto-policy.js.map +1 -0
  100. package/dist/cli/commands/kms.d.ts +4 -0
  101. package/dist/cli/commands/kms.d.ts.map +1 -0
  102. package/dist/cli/commands/kms.js +153 -0
  103. package/dist/cli/commands/kms.js.map +1 -0
  104. package/dist/cli/commands/observability.d.ts +4 -0
  105. package/dist/cli/commands/observability.d.ts.map +1 -0
  106. package/dist/cli/commands/observability.js +97 -0
  107. package/dist/cli/commands/observability.js.map +1 -0
  108. package/dist/cli/commands/search.d.ts +4 -0
  109. package/dist/cli/commands/search.d.ts.map +1 -0
  110. package/dist/cli/commands/search.js +66 -0
  111. package/dist/cli/commands/search.js.map +1 -0
  112. package/dist/cli/commands/security.d.ts +4 -0
  113. package/dist/cli/commands/security.d.ts.map +1 -0
  114. package/dist/cli/commands/security.js +136 -0
  115. package/dist/cli/commands/security.js.map +1 -0
  116. package/dist/cli/commands/storage.d.ts +4 -0
  117. package/dist/cli/commands/storage.d.ts.map +1 -0
  118. package/dist/cli/commands/storage.js +85 -0
  119. package/dist/cli/commands/storage.js.map +1 -0
  120. package/dist/cli/commands/tenant.d.ts +4 -0
  121. package/dist/cli/commands/tenant.d.ts.map +1 -0
  122. package/dist/cli/commands/tenant.js +82 -0
  123. package/dist/cli/commands/tenant.js.map +1 -0
  124. package/dist/cli/commands/test-utils.d.ts +15 -0
  125. package/dist/cli/commands/test-utils.d.ts.map +1 -0
  126. package/dist/cli/commands/test-utils.js +72 -0
  127. package/dist/cli/commands/test-utils.js.map +1 -0
  128. package/dist/cli/commands/vault.d.ts +4 -0
  129. package/dist/cli/commands/vault.d.ts.map +1 -0
  130. package/dist/cli/commands/vault.js +111 -0
  131. package/dist/cli/commands/vault.js.map +1 -0
  132. package/dist/cli/config.d.ts +32 -0
  133. package/dist/cli/config.d.ts.map +1 -0
  134. package/dist/cli/config.js +105 -0
  135. package/dist/cli/config.js.map +1 -0
  136. package/dist/cli/index.d.ts +3 -0
  137. package/dist/cli/index.d.ts.map +1 -0
  138. package/dist/cli/index.js +54 -0
  139. package/dist/cli/index.js.map +1 -0
  140. package/dist/cli/utils/audit-logger.d.ts +17 -0
  141. package/dist/cli/utils/audit-logger.d.ts.map +1 -0
  142. package/dist/cli/utils/audit-logger.js +52 -0
  143. package/dist/cli/utils/audit-logger.js.map +1 -0
  144. package/dist/cli/utils/auth.d.ts +4 -0
  145. package/dist/cli/utils/auth.d.ts.map +1 -0
  146. package/dist/cli/utils/auth.js +100 -0
  147. package/dist/cli/utils/auth.js.map +1 -0
  148. package/dist/cli/utils/backend-validator.d.ts +19 -0
  149. package/dist/cli/utils/backend-validator.d.ts.map +1 -0
  150. package/dist/cli/utils/backend-validator.js +72 -0
  151. package/dist/cli/utils/backend-validator.js.map +1 -0
  152. package/dist/cli/utils/command-config.d.ts +4 -0
  153. package/dist/cli/utils/command-config.d.ts.map +1 -0
  154. package/dist/cli/utils/command-config.js +29 -0
  155. package/dist/cli/utils/command-config.js.map +1 -0
  156. package/dist/cli/utils/fetcher.d.ts +3 -0
  157. package/dist/cli/utils/fetcher.d.ts.map +1 -0
  158. package/dist/cli/utils/fetcher.js +30 -0
  159. package/dist/cli/utils/fetcher.js.map +1 -0
  160. package/dist/cli/utils/https-validator.d.ts +9 -0
  161. package/dist/cli/utils/https-validator.d.ts.map +1 -0
  162. package/dist/cli/utils/https-validator.js +35 -0
  163. package/dist/cli/utils/https-validator.js.map +1 -0
  164. package/dist/cli/utils/output.d.ts +6 -0
  165. package/dist/cli/utils/output.d.ts.map +1 -0
  166. package/dist/cli/utils/output.js +29 -0
  167. package/dist/cli/utils/output.js.map +1 -0
  168. package/dist/cli/utils/pqc-validator.d.ts +17 -0
  169. package/dist/cli/utils/pqc-validator.d.ts.map +1 -0
  170. package/dist/cli/utils/pqc-validator.js +62 -0
  171. package/dist/cli/utils/pqc-validator.js.map +1 -0
  172. package/dist/cli/utils/prompt.d.ts +4 -0
  173. package/dist/cli/utils/prompt.d.ts.map +1 -0
  174. package/dist/cli/utils/prompt.js +30 -0
  175. package/dist/cli/utils/prompt.js.map +1 -0
  176. package/dist/cli/utils/rate-limiter.d.ts +15 -0
  177. package/dist/cli/utils/rate-limiter.d.ts.map +1 -0
  178. package/dist/cli/utils/rate-limiter.js +46 -0
  179. package/dist/cli/utils/rate-limiter.js.map +1 -0
  180. package/dist/cli/utils/sanitize.d.ts +3 -0
  181. package/dist/cli/utils/sanitize.d.ts.map +1 -0
  182. package/dist/cli/utils/sanitize.js +44 -0
  183. package/dist/cli/utils/sanitize.js.map +1 -0
  184. package/dist/cli/utils/security-headers.d.ts +18 -0
  185. package/dist/cli/utils/security-headers.d.ts.map +1 -0
  186. package/dist/cli/utils/security-headers.js +32 -0
  187. package/dist/cli/utils/security-headers.js.map +1 -0
  188. package/dist/cli/utils/token-cache.d.ts +4 -0
  189. package/dist/cli/utils/token-cache.d.ts.map +1 -0
  190. package/dist/cli/utils/token-cache.js +22 -0
  191. package/dist/cli/utils/token-cache.js.map +1 -0
  192. package/dist/client.d.ts +52 -0
  193. package/dist/client.d.ts.map +1 -0
  194. package/dist/client.js +78 -0
  195. package/dist/client.js.map +1 -0
  196. package/dist/crypto-inventory.d.ts +21 -0
  197. package/dist/crypto-inventory.d.ts.map +1 -0
  198. package/dist/crypto-inventory.js +28 -0
  199. package/dist/crypto-inventory.js.map +1 -0
  200. package/dist/errors.d.ts +35 -0
  201. package/dist/errors.d.ts.map +1 -0
  202. package/dist/errors.js +64 -0
  203. package/dist/errors.js.map +1 -0
  204. package/dist/index.d.ts +50 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +51 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/kms.d.ts +30 -0
  209. package/dist/kms.d.ts.map +1 -0
  210. package/dist/kms.js +92 -0
  211. package/dist/kms.js.map +1 -0
  212. package/dist/langchain/index.d.ts +22 -0
  213. package/dist/langchain/index.d.ts.map +1 -0
  214. package/dist/langchain/index.js +23 -0
  215. package/dist/langchain/index.js.map +1 -0
  216. package/dist/langchain/toolkit.d.ts +85 -0
  217. package/dist/langchain/toolkit.d.ts.map +1 -0
  218. package/dist/langchain/toolkit.js +146 -0
  219. package/dist/langchain/toolkit.js.map +1 -0
  220. package/dist/langchain/tools/audit.d.ts +43 -0
  221. package/dist/langchain/tools/audit.d.ts.map +1 -0
  222. package/dist/langchain/tools/audit.js +78 -0
  223. package/dist/langchain/tools/audit.js.map +1 -0
  224. package/dist/langchain/tools/kms.d.ts +62 -0
  225. package/dist/langchain/tools/kms.d.ts.map +1 -0
  226. package/dist/langchain/tools/kms.js +120 -0
  227. package/dist/langchain/tools/kms.js.map +1 -0
  228. package/dist/langchain/tools/vault.d.ts +69 -0
  229. package/dist/langchain/tools/vault.d.ts.map +1 -0
  230. package/dist/langchain/tools/vault.js +107 -0
  231. package/dist/langchain/tools/vault.js.map +1 -0
  232. package/dist/langchain/vault-client.d.ts +82 -0
  233. package/dist/langchain/vault-client.d.ts.map +1 -0
  234. package/dist/langchain/vault-client.js +133 -0
  235. package/dist/langchain/vault-client.js.map +1 -0
  236. package/dist/llamaindex/index.d.ts +16 -0
  237. package/dist/llamaindex/index.d.ts.map +1 -0
  238. package/dist/llamaindex/index.js +15 -0
  239. package/dist/llamaindex/index.js.map +1 -0
  240. package/dist/llamaindex/sse.d.ts +36 -0
  241. package/dist/llamaindex/sse.d.ts.map +1 -0
  242. package/dist/llamaindex/sse.js +151 -0
  243. package/dist/llamaindex/sse.js.map +1 -0
  244. package/dist/llamaindex/vector-store.d.ts +101 -0
  245. package/dist/llamaindex/vector-store.d.ts.map +1 -0
  246. package/dist/llamaindex/vector-store.js +348 -0
  247. package/dist/llamaindex/vector-store.js.map +1 -0
  248. package/dist/search.d.ts +32 -0
  249. package/dist/search.d.ts.map +1 -0
  250. package/dist/search.js +27 -0
  251. package/dist/search.js.map +1 -0
  252. package/dist/storage.d.ts +32 -0
  253. package/dist/storage.d.ts.map +1 -0
  254. package/dist/storage.js +58 -0
  255. package/dist/storage.js.map +1 -0
  256. package/dist/tenant.d.ts +25 -0
  257. package/dist/tenant.d.ts.map +1 -0
  258. package/dist/tenant.js +36 -0
  259. package/dist/tenant.js.map +1 -0
  260. package/dist/vault.d.ts +22 -0
  261. package/dist/vault.d.ts.map +1 -0
  262. package/dist/vault.js +43 -0
  263. package/dist/vault.js.map +1 -0
  264. package/dist/webhooks.d.ts +32 -0
  265. package/dist/webhooks.d.ts.map +1 -0
  266. package/dist/webhooks.js +77 -0
  267. package/dist/webhooks.js.map +1 -0
  268. package/package.json +118 -0
@@ -0,0 +1,72 @@
1
+ import { EXIT_CODES } from "../config.js";
2
+ import { printError } from "./output.js";
3
+ const CLOUD_PORTAL_URL = process.env["QNSP_CLOUD_PORTAL_URL"] ?? "https://cloud.qnsp.cuilabs.io";
4
+ export function handleBackendError(response, body) {
5
+ const error = body;
6
+ switch (response.status) {
7
+ case 429: // Rate Limited
8
+ printError(`🚫 Rate limit exceeded for your tier (${error.tier || "unknown"}).\n` +
9
+ `Limit: ${error.limit || "N/A"} requests per minute\n` +
10
+ `Remaining: ${error.remaining || 0}\n` +
11
+ `Retry after: ${error.retryAfter || 60}s\n\n` +
12
+ `💡 Upgrade your tier for higher limits: ${CLOUD_PORTAL_URL}/billing/upgrade`);
13
+ process.exit(EXIT_CODES.RATE_LIMITED);
14
+ return;
15
+ case 402: // Payment Required
16
+ printError(`💳 Payment required: ${error.message}\n\n` +
17
+ `This feature requires a paid tier or add-on.\n` +
18
+ `Current tier: ${error.tier || "unknown"}\n` +
19
+ `Required: ${error.requiredTier || error.requiredAddOn || "unknown"}\n\n` +
20
+ `💡 Upgrade at: ${CLOUD_PORTAL_URL}/billing`);
21
+ process.exit(EXIT_CODES.AUTHORIZATION_ERROR);
22
+ return;
23
+ case 403: // Forbidden - Feature not enabled
24
+ if (error.requiredAddOn) {
25
+ printError(`🔒 Feature not enabled: ${error.message}\n\n` +
26
+ `This requires the "${error.requiredAddOn}" add-on.\n` +
27
+ `Current tier: ${error.tier || "unknown"}\n\n` +
28
+ `💡 Enable add-ons at: ${CLOUD_PORTAL_URL}/billing/addons\n` +
29
+ `⚠️ Note: Some add-ons require sales approval for security/compliance.`);
30
+ }
31
+ else {
32
+ printError(`🔒 Access denied: ${error.message}\n\n` +
33
+ `You don't have permission for this operation.\n` +
34
+ `Current tier: ${error.tier || "unknown"}\n` +
35
+ `Required tier: ${error.requiredTier || "higher"}\n\n` +
36
+ `💡 Upgrade at: ${CLOUD_PORTAL_URL}/billing/upgrade`);
37
+ }
38
+ process.exit(EXIT_CODES.AUTHORIZATION_ERROR);
39
+ return;
40
+ case 507: // Insufficient Storage / Quota Exceeded
41
+ printError(`📊 Quota exceeded: ${error.message}\n\n` +
42
+ `You've reached your tier limit.\n` +
43
+ `Current tier: ${error.tier || "unknown"}\n\n` +
44
+ `💡 Options:\n` +
45
+ ` 1. Upgrade your tier: ${CLOUD_PORTAL_URL}/billing/upgrade\n` +
46
+ ` 2. Delete unused resources\n` +
47
+ ` 3. Purchase additional capacity: ${CLOUD_PORTAL_URL}/billing/addons`);
48
+ process.exit(EXIT_CODES.GENERAL_ERROR);
49
+ return;
50
+ default:
51
+ printError(`❌ Backend error (${response.status}): ${error.message || "Unknown error"}`);
52
+ process.exit(EXIT_CODES.GENERAL_ERROR);
53
+ return;
54
+ }
55
+ }
56
+ export function parseRateLimitHeaders(headers) {
57
+ const limitRaw = headers.get("x-ratelimit-limit");
58
+ const remainingRaw = headers.get("x-ratelimit-remaining");
59
+ const resetRaw = headers.get("x-ratelimit-reset");
60
+ return {
61
+ limit: limitRaw ? Number.parseInt(limitRaw, 10) : null,
62
+ remaining: remainingRaw ? Number.parseInt(remainingRaw, 10) : null,
63
+ reset: resetRaw ? Number.parseInt(resetRaw, 10) : null,
64
+ };
65
+ }
66
+ export function warnIfLowQuota(remaining, limit) {
67
+ if (remaining !== null && limit !== null && remaining < limit * 0.1) {
68
+ console.warn(`⚠️ Warning: Low quota remaining (${remaining}/${limit}).\n` +
69
+ `Consider upgrading your tier or purchasing add-ons to avoid service interruption.`);
70
+ }
71
+ }
72
+ //# sourceMappingURL=backend-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-validator.js","sourceRoot":"","sources":["../../../src/cli/utils/backend-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { CliConfig } from "../config.js";
3
+ export declare function getEffectiveConfig(baseConfig: CliConfig, command: Command): CliConfig;
4
+ //# sourceMappingURL=command-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-config.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/command-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,CAqCrF"}
@@ -0,0 +1,29 @@
1
+ import { loadConfig } from "../config.js";
2
+ export function getEffectiveConfig(baseConfig, command) {
3
+ const globals = command.optsWithGlobals();
4
+ return loadConfig({
5
+ ...baseConfig,
6
+ edgeGatewayUrl: globals["edgeGatewayUrl"] ?? baseConfig.edgeGatewayUrl,
7
+ cloudPortalUrl: globals["cloudPortalUrl"] ?? baseConfig.cloudPortalUrl,
8
+ authServiceUrl: globals["authServiceUrl"] ?? baseConfig.authServiceUrl,
9
+ serviceId: globals["serviceId"] ?? baseConfig.serviceId,
10
+ serviceSecret: globals["serviceSecret"] ?? baseConfig.serviceSecret,
11
+ tenantId: globals["tenantId"] ?? baseConfig.tenantId,
12
+ kmsServiceUrl: globals["kmsServiceUrl"] ?? baseConfig.kmsServiceUrl,
13
+ vaultServiceUrl: globals["vaultServiceUrl"] ?? baseConfig.vaultServiceUrl,
14
+ auditServiceUrl: globals["auditServiceUrl"] ?? baseConfig.auditServiceUrl,
15
+ tenantServiceUrl: globals["tenantServiceUrl"] ?? baseConfig.tenantServiceUrl,
16
+ billingServiceUrl: globals["billingServiceUrl"] ?? baseConfig.billingServiceUrl,
17
+ accessControlServiceUrl: globals["accessControlServiceUrl"] ??
18
+ baseConfig.accessControlServiceUrl,
19
+ securityMonitoringServiceUrl: globals["securityMonitoringServiceUrl"] ??
20
+ baseConfig.securityMonitoringServiceUrl,
21
+ storageServiceUrl: globals["storageServiceUrl"] ?? baseConfig.storageServiceUrl,
22
+ searchServiceUrl: globals["searchServiceUrl"] ?? baseConfig.searchServiceUrl,
23
+ observabilityServiceUrl: globals["observabilityServiceUrl"] ??
24
+ baseConfig.observabilityServiceUrl,
25
+ outputFormat: globals["output"] ?? baseConfig.outputFormat,
26
+ verbose: globals["verbose"] ?? baseConfig.verbose,
27
+ });
28
+ }
29
+ //# sourceMappingURL=command-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-config.js","sourceRoot":"","sources":["../../../src/cli/utils/command-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,kBAAkB,CAAC,UAAqB,EAAE,OAAgB;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,EAA6B,CAAC;IAErE,OAAO,UAAU,CAAC;QACjB,GAAG,UAAU;QACb,cAAc,EAAG,OAAO,CAAC,gBAAgB,CAAwB,IAAI,UAAU,CAAC,cAAc;QAC9F,cAAc,EAAG,OAAO,CAAC,gBAAgB,CAAwB,IAAI,UAAU,CAAC,cAAc;QAC9F,cAAc,EAAG,OAAO,CAAC,gBAAgB,CAAwB,IAAI,UAAU,CAAC,cAAc;QAC9F,SAAS,EAAG,OAAO,CAAC,WAAW,CAAwB,IAAI,UAAU,CAAC,SAAS;QAC/E,aAAa,EAAG,OAAO,CAAC,eAAe,CAAwB,IAAI,UAAU,CAAC,aAAa;QAC3F,QAAQ,EAAG,OAAO,CAAC,UAAU,CAAwB,IAAI,UAAU,CAAC,QAAQ;QAC5E,aAAa,EAAG,OAAO,CAAC,eAAe,CAAwB,IAAI,UAAU,CAAC,aAAa;QAC3F,eAAe,EACb,OAAO,CAAC,iBAAiB,CAAwB,IAAI,UAAU,CAAC,eAAe;QACjF,eAAe,EACb,OAAO,CAAC,iBAAiB,CAAwB,IAAI,UAAU,CAAC,eAAe;QACjF,gBAAgB,EACd,OAAO,CAAC,kBAAkB,CAAwB,IAAI,UAAU,CAAC,gBAAgB;QACnF,iBAAiB,EACf,OAAO,CAAC,mBAAmB,CAAwB,IAAI,UAAU,CAAC,iBAAiB;QACrF,uBAAuB,EACrB,OAAO,CAAC,yBAAyB,CAAwB;YAC1D,UAAU,CAAC,uBAAuB;QACnC,4BAA4B,EAC1B,OAAO,CAAC,8BAA8B,CAAwB;YAC/D,UAAU,CAAC,4BAA4B;QACxC,iBAAiB,EACf,OAAO,CAAC,mBAAmB,CAAwB,IAAI,UAAU,CAAC,iBAAiB;QACrF,gBAAgB,EACd,OAAO,CAAC,kBAAkB,CAAwB,IAAI,UAAU,CAAC,gBAAgB;QACnF,uBAAuB,EACrB,OAAO,CAAC,yBAAyB,CAAwB;YAC1D,UAAU,CAAC,uBAAuB;QACnC,YAAY,EACV,OAAO,CAAC,QAAQ,CAA2C,IAAI,UAAU,CAAC,YAAY;QACxF,OAAO,EAAG,OAAO,CAAC,SAAS,CAAyB,IAAI,UAAU,CAAC,OAAO;KAC1E,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliConfig } from "../config.js";
2
+ export declare function fetchWithBackendHandling(_config: CliConfig, input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Promise<Response>;
3
+ //# sourceMappingURL=fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM9C,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAClC,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAChC,OAAO,CAAC,QAAQ,CAAC,CA4BnB"}
@@ -0,0 +1,30 @@
1
+ import { handleBackendError, parseRateLimitHeaders, warnIfLowQuota } from "./backend-validator.js";
2
+ const ENFORCEMENT_STATUSES = new Set([429, 402, 403, 507]);
3
+ export async function fetchWithBackendHandling(_config, input, init) {
4
+ const response = await fetch(input, init);
5
+ if (!response.ok && ENFORCEMENT_STATUSES.has(response.status)) {
6
+ const errorText = typeof response.clone === "function"
7
+ ? await response.clone().text()
8
+ : await response.text();
9
+ let errorBody;
10
+ try {
11
+ errorBody = JSON.parse(errorText);
12
+ }
13
+ catch {
14
+ errorBody = { error: "unknown", message: errorText };
15
+ }
16
+ handleBackendError(response, errorBody);
17
+ }
18
+ try {
19
+ const headers = response.headers;
20
+ if (headers && typeof headers.get === "function") {
21
+ const rateLimits = parseRateLimitHeaders(headers);
22
+ warnIfLowQuota(rateLimits.remaining, rateLimits.limit);
23
+ }
24
+ }
25
+ catch {
26
+ // ignore non-standard/mocked responses
27
+ }
28
+ return response;
29
+ }
30
+ //# sourceMappingURL=fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../../../src/cli/utils/fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEnG,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,OAAkB,EAClB,KAAkC,EAClC,IAAkC;IAElC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE1C,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,MAAM,SAAS,GACd,OAAQ,QAAqB,CAAC,KAAK,KAAK,UAAU;YACjD,CAAC,CAAC,MAAO,QAAqB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;YAC7C,CAAC,CAAC,MAAO,QAAqB,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,SAAkB,CAAC;QACvB,IAAI,CAAC;YACJ,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACR,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACtD,CAAC;QACD,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,OAAO,GAAI,QAAkC,CAAC,OAAO,CAAC;QAC5D,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YAClD,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAClD,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function validateHttpsUrl(url: string, context: string, nodeEnv?: string): void;
2
+ export declare function isLocalhostUrl(url: string): boolean;
3
+ export declare function validateAllServiceUrls(config: {
4
+ authServiceUrl: string;
5
+ kmsServiceUrl: string;
6
+ vaultServiceUrl: string;
7
+ auditServiceUrl: string;
8
+ }): void;
9
+ //# sourceMappingURL=https-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"https-validator.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/https-validator.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,SAAe,GAAG,IAAI,CAiB3F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACxB,GAAG,IAAI,CAOP"}
@@ -0,0 +1,35 @@
1
+ import { EXIT_CODES } from "../config.js";
2
+ import { printError } from "./output.js";
3
+ export function validateHttpsUrl(url, context, nodeEnv = "production") {
4
+ if (nodeEnv === "production" && !url.startsWith("https://")) {
5
+ printError(`${context} requires an https:// URL when NODE_ENV=production. Got: ${url}\n` +
6
+ "Use --auth-service-url with https:// or set NODE_ENV=development for testing.");
7
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
8
+ return;
9
+ }
10
+ if (url.startsWith("http://") && !isLocalhostUrl(url) && nodeEnv !== "development") {
11
+ printError(`Warning: ${context} is using unencrypted HTTP. This is insecure.\n` +
12
+ `URL: ${url}\n` +
13
+ "Consider using HTTPS or set NODE_ENV=development to suppress this warning.");
14
+ }
15
+ }
16
+ export function isLocalhostUrl(url) {
17
+ try {
18
+ const parsed = new URL(url);
19
+ return (parsed.hostname === "localhost" ||
20
+ parsed.hostname === "127.0.0.1" ||
21
+ parsed.hostname === "::1" ||
22
+ parsed.hostname.endsWith(".local"));
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export function validateAllServiceUrls(config) {
29
+ const nodeEnv = process.env["NODE_ENV"] ?? "production";
30
+ validateHttpsUrl(config.authServiceUrl, "Auth service URL", nodeEnv);
31
+ validateHttpsUrl(config.kmsServiceUrl, "KMS service URL", nodeEnv);
32
+ validateHttpsUrl(config.vaultServiceUrl, "Vault service URL", nodeEnv);
33
+ validateHttpsUrl(config.auditServiceUrl, "Audit service URL", nodeEnv);
34
+ }
35
+ //# sourceMappingURL=https-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"https-validator.js","sourceRoot":"","sources":["../../../src/cli/utils/https-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAe,EAAE,OAAO,GAAG,YAAY;IACpF,IAAI,OAAO,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,UAAU,CACT,GAAG,OAAO,4DAA4D,GAAG,IAAI;YAC5E,+EAA+E,CAChF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC3C,OAAO;IACR,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QACpF,UAAU,CACT,YAAY,OAAO,iDAAiD;YACnE,QAAQ,GAAG,IAAI;YACf,4EAA4E,CAC7E,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,CACN,MAAM,CAAC,QAAQ,KAAK,WAAW;YAC/B,MAAM,CAAC,QAAQ,KAAK,WAAW;YAC/B,MAAM,CAAC,QAAQ,KAAK,KAAK;YACzB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAKtC;IACA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC;IAExD,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACrE,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACnE,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACvE,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function printJson(data: unknown): void;
2
+ export declare function printTable(data: Record<string, unknown>[] | Record<string, unknown>): void;
3
+ export declare function printError(message: string): void;
4
+ export declare function printSuccess(message: string): void;
5
+ export declare function printVerbose(message: string, verbose: boolean): void;
6
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAU1F;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAKpE"}
@@ -0,0 +1,29 @@
1
+ import { sanitizeOutput } from "./sanitize.js";
2
+ export function printJson(data) {
3
+ console.log(JSON.stringify(data, null, 2));
4
+ }
5
+ export function printTable(data) {
6
+ if (Array.isArray(data)) {
7
+ if (data.length === 0) {
8
+ console.log("No results");
9
+ return;
10
+ }
11
+ console.table(data);
12
+ }
13
+ else {
14
+ console.table([data]);
15
+ }
16
+ }
17
+ export function printError(message) {
18
+ console.error(`Error: ${message}`);
19
+ }
20
+ export function printSuccess(message) {
21
+ console.log(`✓ ${message}`);
22
+ }
23
+ export function printVerbose(message, verbose) {
24
+ if (verbose) {
25
+ const sanitized = sanitizeOutput(message);
26
+ console.log(`[DEBUG] ${sanitized}`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,UAAU,SAAS,CAAC,IAAa;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAyD;IACnF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO;QACR,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACzC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAgB;IAC7D,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const APPROVED_PQC_ALGORITHMS: {
2
+ readonly signature: readonly ["dilithium-2", "dilithium-3", "dilithium-5", "falcon-512", "falcon-1024", "sphincs-sha2-128f"];
3
+ readonly kem: readonly ["kyber-512", "kyber-768", "kyber-1024"];
4
+ };
5
+ export type ApprovedSignatureAlgorithm = (typeof APPROVED_PQC_ALGORITHMS.signature)[number];
6
+ export type ApprovedKemAlgorithm = (typeof APPROVED_PQC_ALGORITHMS.kem)[number];
7
+ export declare function validatePqcAlgorithm(algorithm: string, type: "signature" | "kem"): algorithm is ApprovedSignatureAlgorithm | ApprovedKemAlgorithm;
8
+ export declare function getRecommendedPqcAlgorithm(securityLevel: 1 | 3 | 5, type: "signature" | "kem"): string;
9
+ export interface PqcSecurityProfile {
10
+ readonly signatureAlgorithm: ApprovedSignatureAlgorithm;
11
+ readonly kemAlgorithm: ApprovedKemAlgorithm;
12
+ readonly securityLevel: 1 | 3 | 5;
13
+ readonly hybridMode: boolean;
14
+ }
15
+ export declare function getDefaultSecurityProfile(): PqcSecurityProfile;
16
+ export declare function validateSecurityProfile(profile: Partial<PqcSecurityProfile>): string[];
17
+ //# sourceMappingURL=pqc-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pqc-validator.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/pqc-validator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB;;;CAU1B,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5F,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,wBAAgB,oBAAoB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,WAAW,GAAG,KAAK,GACvB,SAAS,IAAI,0BAA0B,GAAG,oBAAoB,CAGhE;AAED,wBAAgB,0BAA0B,CACzC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EACxB,IAAI,EAAE,WAAW,GAAG,KAAK,GACvB,MAAM,CAoBR;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;IACxD,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,IAAI,kBAAkB,CAO9D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,EAAE,CAyBtF"}
@@ -0,0 +1,62 @@
1
+ export const APPROVED_PQC_ALGORITHMS = {
2
+ signature: [
3
+ "dilithium-2",
4
+ "dilithium-3",
5
+ "dilithium-5",
6
+ "falcon-512",
7
+ "falcon-1024",
8
+ "sphincs-sha2-128f",
9
+ ],
10
+ kem: ["kyber-512", "kyber-768", "kyber-1024"],
11
+ };
12
+ export function validatePqcAlgorithm(algorithm, type) {
13
+ const approved = APPROVED_PQC_ALGORITHMS[type];
14
+ return approved.includes(algorithm);
15
+ }
16
+ export function getRecommendedPqcAlgorithm(securityLevel, type) {
17
+ if (type === "signature") {
18
+ switch (securityLevel) {
19
+ case 1:
20
+ return "dilithium-2";
21
+ case 3:
22
+ return "dilithium-3";
23
+ case 5:
24
+ return "dilithium-5";
25
+ }
26
+ }
27
+ else {
28
+ switch (securityLevel) {
29
+ case 1:
30
+ return "kyber-512";
31
+ case 3:
32
+ return "kyber-768";
33
+ case 5:
34
+ return "kyber-1024";
35
+ }
36
+ }
37
+ }
38
+ export function getDefaultSecurityProfile() {
39
+ return {
40
+ signatureAlgorithm: "dilithium-2",
41
+ kemAlgorithm: "kyber-768",
42
+ securityLevel: 3,
43
+ hybridMode: true,
44
+ };
45
+ }
46
+ export function validateSecurityProfile(profile) {
47
+ const errors = [];
48
+ if (profile.signatureAlgorithm &&
49
+ !validatePqcAlgorithm(profile.signatureAlgorithm, "signature")) {
50
+ errors.push(`Invalid signature algorithm: ${profile.signatureAlgorithm}. ` +
51
+ `Approved: ${APPROVED_PQC_ALGORITHMS.signature.join(", ")}`);
52
+ }
53
+ if (profile.kemAlgorithm && !validatePqcAlgorithm(profile.kemAlgorithm, "kem")) {
54
+ errors.push(`Invalid KEM algorithm: ${profile.kemAlgorithm}. ` +
55
+ `Approved: ${APPROVED_PQC_ALGORITHMS.kem.join(", ")}`);
56
+ }
57
+ if (profile.securityLevel && ![1, 3, 5].includes(profile.securityLevel)) {
58
+ errors.push(`Invalid security level: ${profile.securityLevel}. Must be 1, 3, or 5.`);
59
+ }
60
+ return errors;
61
+ }
62
+ //# sourceMappingURL=pqc-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pqc-validator.js","sourceRoot":"","sources":["../../../src/cli/utils/pqc-validator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACtC,SAAS,EAAE;QACV,aAAa;QACb,aAAa;QACb,aAAa;QACb,YAAY;QACZ,aAAa;QACb,mBAAmB;KACnB;IACD,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC;CACpC,CAAC;AAKX,MAAM,UAAU,oBAAoB,CACnC,SAAiB,EACjB,IAAyB;IAEzB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAkB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,aAAwB,EACxB,IAAyB;IAEzB,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1B,QAAQ,aAAa,EAAE,CAAC;YACvB,KAAK,CAAC;gBACL,OAAO,aAAa,CAAC;YACtB,KAAK,CAAC;gBACL,OAAO,aAAa,CAAC;YACtB,KAAK,CAAC;gBACL,OAAO,aAAa,CAAC;QACvB,CAAC;IACF,CAAC;SAAM,CAAC;QACP,QAAQ,aAAa,EAAE,CAAC;YACvB,KAAK,CAAC;gBACL,OAAO,WAAW,CAAC;YACpB,KAAK,CAAC;gBACL,OAAO,WAAW,CAAC;YACpB,KAAK,CAAC;gBACL,OAAO,YAAY,CAAC;QACtB,CAAC;IACF,CAAC;AACF,CAAC;AASD,MAAM,UAAU,yBAAyB;IACxC,OAAO;QACN,kBAAkB,EAAE,aAAa;QACjC,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,IAAI;KAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAoC;IAC3E,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IACC,OAAO,CAAC,kBAAkB;QAC1B,CAAC,oBAAoB,CAAC,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAC7D,CAAC;QACF,MAAM,CAAC,IAAI,CACV,gCAAgC,OAAO,CAAC,kBAAkB,IAAI;YAC7D,aAAa,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5D,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;QAChF,MAAM,CAAC,IAAI,CACV,0BAA0B,OAAO,CAAC,YAAY,IAAI;YACjD,aAAa,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,aAAa,uBAAuB,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function promptForSecret(promptText?: string): Promise<string>;
2
+ export declare function promptForInput(promptText: string): Promise<string>;
3
+ export declare function promptForConfirmation(promptText: string): Promise<boolean>;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/prompt.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,UAAU,SAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYtF;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYxE;AAED,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhF"}
@@ -0,0 +1,30 @@
1
+ import { createInterface } from "node:readline";
2
+ export async function promptForSecret(promptText = "Service secret: ") {
3
+ return new Promise((resolve) => {
4
+ const rl = createInterface({
5
+ input: process.stdin,
6
+ output: process.stdout,
7
+ });
8
+ rl.question(promptText, (answer) => {
9
+ rl.close();
10
+ resolve(answer.trim());
11
+ });
12
+ });
13
+ }
14
+ export async function promptForInput(promptText) {
15
+ return new Promise((resolve) => {
16
+ const rl = createInterface({
17
+ input: process.stdin,
18
+ output: process.stdout,
19
+ });
20
+ rl.question(promptText, (answer) => {
21
+ rl.close();
22
+ resolve(answer.trim());
23
+ });
24
+ });
25
+ }
26
+ export async function promptForConfirmation(promptText) {
27
+ const answer = await promptForInput(`${promptText} (y/N): `);
28
+ return answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
29
+ }
30
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/cli/utils/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAU,GAAG,kBAAkB;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,eAAe,CAAC;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;YAClC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,EAAE,GAAG,eAAe,CAAC;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE;YAClC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,UAAU,UAAU,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AACvE,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare class RateLimiter {
2
+ private requests;
3
+ private readonly maxRequests;
4
+ private readonly windowMs;
5
+ private hasWarned;
6
+ constructor(maxRequests?: number, windowMs?: number);
7
+ checkLimit(): Promise<void>;
8
+ reset(): void;
9
+ getRemaining(): number;
10
+ }
11
+ export declare class RateLimitError extends Error {
12
+ readonly retryAfterMs: number;
13
+ constructor(message: string, retryAfterMs: number);
14
+ }
15
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,SAAM,EAAE,QAAQ,SAAQ;IAKzC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BjC,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,MAAM;CAKtB;AAED,qBAAa,cAAe,SAAQ,KAAK;aAGvB,YAAY,EAAE,MAAM;gBADpC,OAAO,EAAE,MAAM,EACC,YAAY,EAAE,MAAM;CAKrC"}
@@ -0,0 +1,46 @@
1
+ export class RateLimiter {
2
+ requests = [];
3
+ maxRequests;
4
+ windowMs;
5
+ hasWarned = false;
6
+ constructor(maxRequests = 100, windowMs = 60000) {
7
+ this.maxRequests = maxRequests;
8
+ this.windowMs = windowMs;
9
+ }
10
+ async checkLimit() {
11
+ const now = Date.now();
12
+ this.requests = this.requests.filter((timestamp) => now - timestamp < this.windowMs);
13
+ if (this.requests.length >= this.maxRequests * 0.8 && !this.hasWarned) {
14
+ console.warn(`⚠️ Warning: Approaching CLI rate limit (${this.requests.length}/${this.maxRequests} requests).\n` +
15
+ `This is a defensive limit to prevent accidental self-DoS.\n` +
16
+ `Your tier-based limits are enforced by backend services.`);
17
+ this.hasWarned = true;
18
+ }
19
+ if (this.requests.length >= this.maxRequests) {
20
+ const oldestRequest = this.requests[0];
21
+ const waitMs = this.windowMs - (now - (oldestRequest ?? now));
22
+ throw new RateLimitError(`🛡️ Defensive rate limit exceeded: ${this.maxRequests} requests per ${this.windowMs / 1000}s.\n` +
23
+ `This protects against runaway scripts and bugs.\n` +
24
+ `Your tier-based limits are enforced by backend services.\n` +
25
+ `Retry after ${Math.ceil(waitMs / 1000)}s`, waitMs);
26
+ }
27
+ this.requests.push(now);
28
+ }
29
+ reset() {
30
+ this.requests = [];
31
+ }
32
+ getRemaining() {
33
+ const now = Date.now();
34
+ this.requests = this.requests.filter((timestamp) => now - timestamp < this.windowMs);
35
+ return Math.max(0, this.maxRequests - this.requests.length);
36
+ }
37
+ }
38
+ export class RateLimitError extends Error {
39
+ retryAfterMs;
40
+ constructor(message, retryAfterMs) {
41
+ super(message);
42
+ this.retryAfterMs = retryAfterMs;
43
+ this.name = "RateLimitError";
44
+ }
45
+ }
46
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/cli/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACf,QAAQ,GAAa,EAAE,CAAC;IACf,WAAW,CAAS;IACpB,QAAQ,CAAS;IAC1B,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,WAAW,GAAG,GAAG,EAAE,QAAQ,GAAG,KAAK;QAC9C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAErF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACvE,OAAO,CAAC,IAAI,CACX,4CAA4C,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,eAAe;gBAClG,6DAA6D;gBAC7D,0DAA0D,CAC3D,CAAC;YACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,cAAc,CACvB,uCAAuC,IAAI,CAAC,WAAW,iBAAiB,IAAI,CAAC,QAAQ,GAAG,IAAI,MAAM;gBACjG,mDAAmD;gBACnD,4DAA4D;gBAC5D,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAC3C,MAAM,CACN,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,YAAY;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;CACD;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGvB;IAFjB,YACC,OAAe,EACC,YAAoB;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,iBAAY,GAAZ,YAAY,CAAQ;QAGpC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC9B,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ export declare function sanitizeOutput(message: string): string;
2
+ export declare function sanitizeHeaders(headers: Record<string, string>): Record<string, string>;
3
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/sanitize.ts"],"names":[],"mappings":"AAWA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAetD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBvF"}
@@ -0,0 +1,44 @@
1
+ const SENSITIVE_PATTERNS = [
2
+ /Bearer\s+[A-Za-z0-9._-]+/gi,
3
+ /"accessToken"\s*:\s*"[^"]+"/gi,
4
+ /"token"\s*:\s*"[^"]+"/gi,
5
+ /"secret"\s*:\s*"[^"]+"/gi,
6
+ /"password"\s*:\s*"[^"]+"/gi,
7
+ /"apiKey"\s*:\s*"[^"]+"/gi,
8
+ /Authorization:\s*Bearer\s+[A-Za-z0-9._-]+/gi,
9
+ /x-api-key:\s*[A-Za-z0-9._-]+/gi,
10
+ ];
11
+ export function sanitizeOutput(message) {
12
+ let sanitized = message;
13
+ for (const pattern of SENSITIVE_PATTERNS) {
14
+ sanitized = sanitized.replace(pattern, (match) => {
15
+ if (match.includes(":")) {
16
+ const [key] = match.split(":");
17
+ return `${key}: [REDACTED]`;
18
+ }
19
+ if (match.includes("Bearer")) {
20
+ return "Bearer [REDACTED]";
21
+ }
22
+ return match.replace(/"[^"]+"/g, '"[REDACTED]"');
23
+ });
24
+ }
25
+ return sanitized;
26
+ }
27
+ export function sanitizeHeaders(headers) {
28
+ const sanitized = {};
29
+ for (const [key, value] of Object.entries(headers)) {
30
+ const lowerKey = key.toLowerCase();
31
+ if (lowerKey.includes("authorization") ||
32
+ lowerKey.includes("token") ||
33
+ lowerKey.includes("secret") ||
34
+ lowerKey.includes("api-key") ||
35
+ lowerKey.includes("password")) {
36
+ sanitized[key] = "[REDACTED]";
37
+ }
38
+ else {
39
+ sanitized[key] = value;
40
+ }
41
+ }
42
+ return sanitized;
43
+ }
44
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/cli/utils/sanitize.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG;IAC1B,4BAA4B;IAC5B,+BAA+B;IAC/B,yBAAyB;IACzB,0BAA0B;IAC1B,4BAA4B;IAC5B,0BAA0B;IAC1B,6CAA6C;IAC7C,gCAAgC;CAChC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAC1C,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,OAAO,GAAG,GAAG,cAAc,CAAC;YAC7B,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,OAAO,mBAAmB,CAAC;YAC5B,CAAC;YACD,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC9D,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IACC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;YAClC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC1B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC5B,CAAC;YACF,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC/B,CAAC;aAAM,CAAC;YACP,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface SecurityHeaders {
2
+ readonly "Strict-Transport-Security"?: string;
3
+ readonly "X-Content-Type-Options"?: string;
4
+ readonly "X-Frame-Options"?: string;
5
+ readonly "X-XSS-Protection"?: string;
6
+ readonly "Content-Security-Policy"?: string;
7
+ readonly "Referrer-Policy"?: string;
8
+ readonly "Permissions-Policy"?: string;
9
+ }
10
+ export declare function getRecommendedSecurityHeaders(): SecurityHeaders;
11
+ export declare function validateSecurityHeaders(headers: Record<string, string>): {
12
+ missing: string[];
13
+ weak: Array<{
14
+ header: string;
15
+ issue: string;
16
+ }>;
17
+ };
18
+ //# sourceMappingURL=security-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-headers.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/security-headers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IAC9C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,wBAAgB,6BAA6B,IAAI,eAAe,CAW/D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,CAoBA"}
@@ -0,0 +1,32 @@
1
+ export function getRecommendedSecurityHeaders() {
2
+ return {
3
+ "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload",
4
+ "X-Content-Type-Options": "nosniff",
5
+ "X-Frame-Options": "DENY",
6
+ "X-XSS-Protection": "1; mode=block",
7
+ "Content-Security-Policy": "default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self';",
8
+ "Referrer-Policy": "strict-origin-when-cross-origin",
9
+ "Permissions-Policy": "geolocation=(), microphone=(), camera=()",
10
+ };
11
+ }
12
+ export function validateSecurityHeaders(headers) {
13
+ const recommended = getRecommendedSecurityHeaders();
14
+ const missing = [];
15
+ const weak = [];
16
+ for (const header of Object.keys(recommended)) {
17
+ if (!headers[header]) {
18
+ missing.push(header);
19
+ }
20
+ else {
21
+ const value = headers[header];
22
+ if (header === "Strict-Transport-Security" && !value?.includes("max-age")) {
23
+ weak.push({ header, issue: "Missing max-age directive" });
24
+ }
25
+ if (header === "Content-Security-Policy" && value === "default-src *") {
26
+ weak.push({ header, issue: "Too permissive - allows all sources" });
27
+ }
28
+ }
29
+ }
30
+ return { missing, weak };
31
+ }
32
+ //# sourceMappingURL=security-headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-headers.js","sourceRoot":"","sources":["../../../src/cli/utils/security-headers.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,6BAA6B;IAC5C,OAAO;QACN,2BAA2B,EAAE,8CAA8C;QAC3E,wBAAwB,EAAE,SAAS;QACnC,iBAAiB,EAAE,MAAM;QACzB,kBAAkB,EAAE,eAAe;QACnC,yBAAyB,EACxB,4EAA4E;QAC7E,iBAAiB,EAAE,iCAAiC;QACpD,oBAAoB,EAAE,0CAA0C;KAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA+B;IAItE,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAA6C,EAAE,CAAC;IAE1D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACP,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,2BAA2B,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3E,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,MAAM,KAAK,yBAAyB,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBACvE,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;YACrE,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function getCachedToken(serviceId: string): string | null;
2
+ export declare function setCachedToken(serviceId: string, token: string, ttlMs?: number): void;
3
+ export declare function clearTokenCache(): void;
4
+ //# sourceMappingURL=token-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-cache.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/token-cache.ts"],"names":[],"mappings":"AASA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS/D;AAED,wBAAgB,cAAc,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAuB,GAC1B,IAAI,CAKN;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}