@celilo/cli 0.1.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 (267) hide show
  1. package/README.md +1566 -0
  2. package/bin/celilo +16 -0
  3. package/drizzle/0000_complex_puma.sql +179 -0
  4. package/drizzle/0001_dizzy_wolfpack.sql +2 -0
  5. package/drizzle/0002_web_routes.sql +16 -0
  6. package/drizzle/0003_backup_storage.sql +32 -0
  7. package/drizzle/meta/0000_snapshot.json +1151 -0
  8. package/drizzle/meta/0001_snapshot.json +1167 -0
  9. package/drizzle/meta/0002_snapshot.json +1257 -0
  10. package/drizzle/meta/_journal.json +27 -0
  11. package/package.json +64 -0
  12. package/schemas/system_config.json +106 -0
  13. package/src/__integration__/container-services-cli.integration.test.ts +246 -0
  14. package/src/ansible/dependencies.test.ts +309 -0
  15. package/src/ansible/dependencies.ts +896 -0
  16. package/src/ansible/inventory.test.ts +463 -0
  17. package/src/ansible/inventory.ts +445 -0
  18. package/src/ansible/secrets.ts +222 -0
  19. package/src/ansible/validation.test.ts +92 -0
  20. package/src/ansible/validation.ts +272 -0
  21. package/src/api-clients/digitalocean.ts +94 -0
  22. package/src/api-clients/proxmox.ts +655 -0
  23. package/src/capabilities/logging-wrapper.test.ts +217 -0
  24. package/src/capabilities/lookup.test.ts +149 -0
  25. package/src/capabilities/lookup.ts +89 -0
  26. package/src/capabilities/public-web-helpers.test.ts +198 -0
  27. package/src/capabilities/public-web-publish.test.ts +458 -0
  28. package/src/capabilities/registration.test.ts +395 -0
  29. package/src/capabilities/registration.ts +200 -0
  30. package/src/capabilities/route-validation.test.ts +121 -0
  31. package/src/capabilities/route-validation.ts +96 -0
  32. package/src/capabilities/secret-ref.test.ts +313 -0
  33. package/src/capabilities/secret-validation.ts +157 -0
  34. package/src/capabilities/secrets.test.ts +750 -0
  35. package/src/capabilities/secrets.ts +244 -0
  36. package/src/capabilities/validation.test.ts +613 -0
  37. package/src/capabilities/validation.ts +160 -0
  38. package/src/capabilities/well-known.test.ts +238 -0
  39. package/src/capabilities/well-known.ts +222 -0
  40. package/src/cli/cli.test.ts +654 -0
  41. package/src/cli/command-registry.ts +742 -0
  42. package/src/cli/command-tree-parser.test.ts +180 -0
  43. package/src/cli/command-tree-parser.ts +193 -0
  44. package/src/cli/commands/backup-create.ts +137 -0
  45. package/src/cli/commands/backup-delete.ts +74 -0
  46. package/src/cli/commands/backup-import.ts +97 -0
  47. package/src/cli/commands/backup-list.ts +132 -0
  48. package/src/cli/commands/backup-name.ts +73 -0
  49. package/src/cli/commands/backup-prune.ts +98 -0
  50. package/src/cli/commands/backup-restore.ts +122 -0
  51. package/src/cli/commands/capability-info.ts +121 -0
  52. package/src/cli/commands/capability-list.ts +47 -0
  53. package/src/cli/commands/completion.ts +87 -0
  54. package/src/cli/commands/hook-run.ts +176 -0
  55. package/src/cli/commands/ipam.ts +607 -0
  56. package/src/cli/commands/machine-add.ts +235 -0
  57. package/src/cli/commands/machine-earmark.ts +82 -0
  58. package/src/cli/commands/machine-list.ts +77 -0
  59. package/src/cli/commands/machine-remove.ts +90 -0
  60. package/src/cli/commands/machine-status.ts +131 -0
  61. package/src/cli/commands/module-audit.ts +51 -0
  62. package/src/cli/commands/module-build.ts +60 -0
  63. package/src/cli/commands/module-config.ts +170 -0
  64. package/src/cli/commands/module-deploy.ts +71 -0
  65. package/src/cli/commands/module-generate.ts +236 -0
  66. package/src/cli/commands/module-health.ts +108 -0
  67. package/src/cli/commands/module-import.ts +80 -0
  68. package/src/cli/commands/module-list.ts +43 -0
  69. package/src/cli/commands/module-logs.ts +73 -0
  70. package/src/cli/commands/module-remove.ts +162 -0
  71. package/src/cli/commands/module-show.ts +208 -0
  72. package/src/cli/commands/module-status.ts +131 -0
  73. package/src/cli/commands/module-types.ts +189 -0
  74. package/src/cli/commands/module-upgrade.ts +192 -0
  75. package/src/cli/commands/package.ts +68 -0
  76. package/src/cli/commands/secret-list.ts +99 -0
  77. package/src/cli/commands/secret-set.ts +134 -0
  78. package/src/cli/commands/service-add-digitalocean.ts +133 -0
  79. package/src/cli/commands/service-add-proxmox.ts +342 -0
  80. package/src/cli/commands/service-config-get.ts +83 -0
  81. package/src/cli/commands/service-config-set.ts +145 -0
  82. package/src/cli/commands/service-list.ts +74 -0
  83. package/src/cli/commands/service-reconfigure.ts +230 -0
  84. package/src/cli/commands/service-remove.ts +103 -0
  85. package/src/cli/commands/service-verify.ts +240 -0
  86. package/src/cli/commands/status.ts +216 -0
  87. package/src/cli/commands/storage-add-local.ts +106 -0
  88. package/src/cli/commands/storage-add-s3.ts +114 -0
  89. package/src/cli/commands/storage-list.ts +72 -0
  90. package/src/cli/commands/storage-remove.ts +54 -0
  91. package/src/cli/commands/storage-set-default.ts +44 -0
  92. package/src/cli/commands/storage-verify.ts +54 -0
  93. package/src/cli/commands/system-config.ts +168 -0
  94. package/src/cli/commands/system-init.ts +314 -0
  95. package/src/cli/commands/system-secret-get.ts +98 -0
  96. package/src/cli/commands/system-secret-set.ts +76 -0
  97. package/src/cli/commands/system-vault-password.ts +34 -0
  98. package/src/cli/completion.test.ts +37 -0
  99. package/src/cli/completion.ts +482 -0
  100. package/src/cli/fuel-gauge.test.ts +208 -0
  101. package/src/cli/fuel-gauge.ts +405 -0
  102. package/src/cli/generate-zsh-completion.test.ts +95 -0
  103. package/src/cli/generate-zsh-completion.ts +497 -0
  104. package/src/cli/index.ts +1583 -0
  105. package/src/cli/interactive-config.test.ts +201 -0
  106. package/src/cli/interactive-config.ts +62 -0
  107. package/src/cli/parser.test.ts +227 -0
  108. package/src/cli/parser.ts +244 -0
  109. package/src/cli/prompts.test.ts +33 -0
  110. package/src/cli/prompts.ts +121 -0
  111. package/src/cli/types.ts +38 -0
  112. package/src/cli/validators.test.ts +235 -0
  113. package/src/cli/validators.ts +188 -0
  114. package/src/config/env.ts +41 -0
  115. package/src/config/paths.test.ts +172 -0
  116. package/src/config/paths.ts +108 -0
  117. package/src/db/client.ts +190 -0
  118. package/src/db/migrate.ts +30 -0
  119. package/src/db/schema.test.ts +221 -0
  120. package/src/db/schema.ts +434 -0
  121. package/src/hooks/capability-loader-firewall.test.ts +246 -0
  122. package/src/hooks/capability-loader.test.ts +100 -0
  123. package/src/hooks/capability-loader.ts +520 -0
  124. package/src/hooks/define-hook.test.ts +488 -0
  125. package/src/hooks/executor.test.ts +462 -0
  126. package/src/hooks/executor.ts +469 -0
  127. package/src/hooks/logger.test.ts +54 -0
  128. package/src/hooks/logger.ts +95 -0
  129. package/src/hooks/test-fixtures/failing-hook.ts +13 -0
  130. package/src/hooks/test-fixtures/no-default-hook.ts +6 -0
  131. package/src/hooks/test-fixtures/success-hook.ts +20 -0
  132. package/src/hooks/test-fixtures/unbranded-hook.ts +11 -0
  133. package/src/hooks/test-fixtures/void-hook.ts +13 -0
  134. package/src/hooks/types.ts +89 -0
  135. package/src/infrastructure/property-extractor.test.ts +194 -0
  136. package/src/infrastructure/property-extractor.ts +151 -0
  137. package/src/ipam/allocator.test.ts +442 -0
  138. package/src/ipam/allocator.ts +369 -0
  139. package/src/ipam/auto-allocator.test.ts +247 -0
  140. package/src/ipam/auto-allocator.ts +270 -0
  141. package/src/ipam/subnet-parser.test.ts +107 -0
  142. package/src/ipam/subnet-parser.ts +136 -0
  143. package/src/manifest/contracts/index.ts +61 -0
  144. package/src/manifest/contracts/v1.ts +118 -0
  145. package/src/manifest/json-schema-roundtrip.test.ts +99 -0
  146. package/src/manifest/schema.ts +367 -0
  147. package/src/manifest/template-validator.test.ts +231 -0
  148. package/src/manifest/template-validator.ts +322 -0
  149. package/src/manifest/validate.test.ts +1180 -0
  150. package/src/manifest/validate.ts +415 -0
  151. package/src/module/import.test.ts +355 -0
  152. package/src/module/import.ts +676 -0
  153. package/src/module/packaging/audit.ts +169 -0
  154. package/src/module/packaging/build.ts +228 -0
  155. package/src/module/packaging/checksum.ts +41 -0
  156. package/src/module/packaging/extract.ts +234 -0
  157. package/src/module/packaging/signature.ts +47 -0
  158. package/src/secrets/encryption.test.ts +284 -0
  159. package/src/secrets/encryption.ts +162 -0
  160. package/src/secrets/generators.test.ts +112 -0
  161. package/src/secrets/generators.ts +127 -0
  162. package/src/secrets/master-key.test.ts +159 -0
  163. package/src/secrets/master-key.ts +114 -0
  164. package/src/secrets/storage.test.ts +115 -0
  165. package/src/secrets/storage.ts +106 -0
  166. package/src/secrets/vault.test.ts +35 -0
  167. package/src/secrets/vault.ts +42 -0
  168. package/src/services/backup-create.ts +532 -0
  169. package/src/services/backup-metadata.ts +198 -0
  170. package/src/services/backup-restore.ts +229 -0
  171. package/src/services/backup-retention.ts +84 -0
  172. package/src/services/backup-storage.ts +281 -0
  173. package/src/services/build-stream.test.ts +122 -0
  174. package/src/services/build-stream.ts +201 -0
  175. package/src/services/config-interview.ts +694 -0
  176. package/src/services/container-service.test.ts +298 -0
  177. package/src/services/container-service.ts +401 -0
  178. package/src/services/cross-module-data-manager.test.ts +405 -0
  179. package/src/services/cross-module-data-manager.ts +412 -0
  180. package/src/services/deploy-ansible.ts +88 -0
  181. package/src/services/deploy-planner.ts +153 -0
  182. package/src/services/deploy-preflight.ts +274 -0
  183. package/src/services/deploy-ssh.ts +131 -0
  184. package/src/services/deploy-terraform.test.ts +55 -0
  185. package/src/services/deploy-terraform.ts +445 -0
  186. package/src/services/deploy-validation.ts +311 -0
  187. package/src/services/dns-auto-register.ts +211 -0
  188. package/src/services/health-runner.ts +184 -0
  189. package/src/services/infrastructure-selector.test.ts +485 -0
  190. package/src/services/infrastructure-selector.ts +245 -0
  191. package/src/services/infrastructure-variable-resolver.test.ts +751 -0
  192. package/src/services/infrastructure-variable-resolver.ts +234 -0
  193. package/src/services/machine-detector.ts +328 -0
  194. package/src/services/machine-pool.test.ts +405 -0
  195. package/src/services/machine-pool.ts +316 -0
  196. package/src/services/manifest-validation.ts +120 -0
  197. package/src/services/module-build.test.ts +290 -0
  198. package/src/services/module-build.ts +431 -0
  199. package/src/services/module-config.test.ts +237 -0
  200. package/src/services/module-config.ts +298 -0
  201. package/src/services/module-deploy.ts +862 -0
  202. package/src/services/module-types-drift.test.ts +73 -0
  203. package/src/services/module-types-generator.test.ts +288 -0
  204. package/src/services/module-types-generator.ts +189 -0
  205. package/src/services/proxmox-state-recovery.ts +140 -0
  206. package/src/services/schema-validation.ts +155 -0
  207. package/src/services/secret-schema-loader.test.ts +311 -0
  208. package/src/services/secret-schema-loader.ts +239 -0
  209. package/src/services/ssh-key-manager.test.ts +283 -0
  210. package/src/services/ssh-key-manager.ts +193 -0
  211. package/src/services/storage-providers/local.ts +105 -0
  212. package/src/services/storage-providers/s3.ts +182 -0
  213. package/src/services/storage-providers/types.ts +24 -0
  214. package/src/services/system-config-schema-types.ts +25 -0
  215. package/src/services/system-config-validator.test.ts +160 -0
  216. package/src/services/system-config-validator.ts +74 -0
  217. package/src/services/system-init.test.ts +153 -0
  218. package/src/services/system-init.ts +253 -0
  219. package/src/services/terraform-safety.ts +174 -0
  220. package/src/services/zone-detector.test.ts +110 -0
  221. package/src/services/zone-detector.ts +102 -0
  222. package/src/services/zone-policy.test.ts +97 -0
  223. package/src/services/zone-policy.ts +126 -0
  224. package/src/templates/generator.test.ts +645 -0
  225. package/src/templates/generator.ts +1119 -0
  226. package/src/templates/types.ts +62 -0
  227. package/src/test-utils/INTERACTIVE_PROMPTS.md +167 -0
  228. package/src/test-utils/cli-context-interactive.test.ts +152 -0
  229. package/src/test-utils/cli-context-server.test.ts +66 -0
  230. package/src/test-utils/cli-context.test.ts +273 -0
  231. package/src/test-utils/cli-context.ts +677 -0
  232. package/src/test-utils/cli-result.test.ts +282 -0
  233. package/src/test-utils/cli-result.ts +241 -0
  234. package/src/test-utils/cli.ts +55 -0
  235. package/src/test-utils/completion-harness.test.ts +126 -0
  236. package/src/test-utils/completion-harness.ts +82 -0
  237. package/src/test-utils/database.test.ts +182 -0
  238. package/src/test-utils/database.ts +126 -0
  239. package/src/test-utils/filesystem.test.ts +208 -0
  240. package/src/test-utils/filesystem.ts +142 -0
  241. package/src/test-utils/fixtures.test.ts +123 -0
  242. package/src/test-utils/fixtures.ts +160 -0
  243. package/src/test-utils/golden-diff.ts +197 -0
  244. package/src/test-utils/index.ts +77 -0
  245. package/src/test-utils/integration.ts +81 -0
  246. package/src/test-utils/module-fixtures.ts +468 -0
  247. package/src/test-utils/modules.test.ts +144 -0
  248. package/src/test-utils/modules.ts +183 -0
  249. package/src/test-utils/setup-test-db.ts +90 -0
  250. package/src/test-utils/value-extractor.test.ts +231 -0
  251. package/src/test-utils/value-extractor.ts +228 -0
  252. package/src/types/infrastructure.ts +157 -0
  253. package/src/utils/shell.test.ts +365 -0
  254. package/src/utils/shell.ts +159 -0
  255. package/src/validation/schemas.ts +166 -0
  256. package/src/variables/ansible-resolver.test.ts +142 -0
  257. package/src/variables/ansible-resolver.ts +69 -0
  258. package/src/variables/capability-self-ref.test.ts +220 -0
  259. package/src/variables/context.test.ts +1265 -0
  260. package/src/variables/context.ts +624 -0
  261. package/src/variables/declarative-derivation.test.ts +743 -0
  262. package/src/variables/declarative-derivation.ts +200 -0
  263. package/src/variables/parser.test.ts +231 -0
  264. package/src/variables/parser.ts +76 -0
  265. package/src/variables/resolver.test.ts +458 -0
  266. package/src/variables/resolver.ts +282 -0
  267. package/src/variables/types.ts +59 -0
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Capability Secret Access Helpers
3
+ * Functions for checking if fields are secrets and retrieving secret values
4
+ */
5
+
6
+ import type { Database } from 'bun:sqlite';
7
+ import type { ModuleManifest } from '../manifest/schema';
8
+ import { decryptSecret } from '../secrets/encryption';
9
+ import { getOrCreateMasterKey } from '../secrets/master-key';
10
+ import { checkAllowlist, getProviderManifest } from './validation';
11
+
12
+ /**
13
+ * Check if a capability field is marked as secret in the provider manifest
14
+ *
15
+ * Execution function (Rule 10.1) - performs database query
16
+ *
17
+ * @param capabilityName - Name of the capability (e.g., dns_registrar)
18
+ * @param fieldPath - Path to the field (e.g., tsig or server.ip.primary)
19
+ * @param db - Database connection
20
+ * @returns True if field is a secret
21
+ */
22
+ export function isCapabilityFieldSecret(
23
+ capabilityName: string,
24
+ fieldPath: string,
25
+ db: Database,
26
+ ): boolean {
27
+ const providerManifest = getProviderManifest(capabilityName, db);
28
+
29
+ if (!providerManifest) {
30
+ return false;
31
+ }
32
+
33
+ const capabilityDef = providerManifest.provides?.capabilities?.find(
34
+ (cap) => cap.name === capabilityName,
35
+ );
36
+
37
+ if (!capabilityDef?.secrets) {
38
+ return false;
39
+ }
40
+
41
+ // Check if fieldPath matches any secret name
42
+ return capabilityDef.secrets.some((secret) => secret.name === fieldPath);
43
+ }
44
+
45
+ /**
46
+ * Check if consumer module can access a capability secret
47
+ *
48
+ * Execution function (Rule 10.1) - performs database queries
49
+ *
50
+ * @param consumerModuleId - Module ID requesting access
51
+ * @param capabilityName - Name of the capability
52
+ * @param secretName - Name of the secret
53
+ * @param db - Database connection
54
+ * @returns True if access is allowed
55
+ */
56
+ export function checkCapabilitySecretAccess(
57
+ consumerModuleId: string,
58
+ capabilityName: string,
59
+ secretName: string,
60
+ db: Database,
61
+ ): boolean {
62
+ // Get provider manifest
63
+ const providerManifest = getProviderManifest(capabilityName, db);
64
+
65
+ if (!providerManifest) {
66
+ return false;
67
+ }
68
+
69
+ // Get consumer manifest
70
+ const consumerResult = db
71
+ .prepare('SELECT manifest_data FROM modules WHERE id = ?')
72
+ .get(consumerModuleId) as { manifest_data: string } | undefined;
73
+
74
+ if (!consumerResult) {
75
+ return false;
76
+ }
77
+
78
+ let consumerManifest: ModuleManifest;
79
+ try {
80
+ consumerManifest = JSON.parse(consumerResult.manifest_data) as ModuleManifest;
81
+ } catch (error) {
82
+ throw new Error(
83
+ `Failed to parse manifest for ${consumerModuleId}: ${error instanceof Error ? error.message : 'Invalid JSON'}`,
84
+ );
85
+ }
86
+
87
+ // Get list of capabilities provided by consumer
88
+ const consumerCapabilities = (consumerManifest.provides?.capabilities || []).map(
89
+ (cap) => cap.name,
90
+ );
91
+
92
+ // Find secret definition in provider manifest
93
+ const capabilityDef = providerManifest.provides?.capabilities?.find(
94
+ (cap) => cap.name === capabilityName,
95
+ );
96
+
97
+ if (!capabilityDef?.secrets) {
98
+ return false;
99
+ }
100
+
101
+ const secret = capabilityDef.secrets.find((s) => s.name === secretName);
102
+
103
+ if (!secret) {
104
+ return false;
105
+ }
106
+
107
+ // Check if secret has readable_by restriction
108
+ if (!secret.readable_by || secret.readable_by.length === 0) {
109
+ // No restriction - accessible to all
110
+ return true;
111
+ }
112
+
113
+ // Check if consumer provides any capability in the allowlist
114
+ return checkAllowlist(consumerCapabilities, secret.readable_by);
115
+ }
116
+
117
+ /**
118
+ * Get and decrypt capability secret
119
+ *
120
+ * Execution function (Rule 10.1) - performs database query and decryption
121
+ *
122
+ * @param capabilityName - Name of the capability
123
+ * @param secretName - Name of the secret
124
+ * @param db - Database connection
125
+ * @returns Decrypted secret value
126
+ * @throws Error if secret not found or decryption fails
127
+ */
128
+ export async function getCapabilitySecret(
129
+ capabilityName: string,
130
+ secretName: string,
131
+ db: Database,
132
+ ): Promise<string> {
133
+ // Get provider manifest to check for secret_ref
134
+ const providerManifest = getProviderManifest(capabilityName, db);
135
+
136
+ if (!providerManifest) {
137
+ throw new Error(`Provider manifest not found for capability '${capabilityName}'`);
138
+ }
139
+
140
+ // Find capability and secret definition
141
+ const capabilityDef = providerManifest.provides?.capabilities?.find(
142
+ (cap) => cap.name === capabilityName,
143
+ );
144
+
145
+ if (!capabilityDef?.secrets) {
146
+ throw new Error(`No secrets defined in capability '${capabilityName}'`);
147
+ }
148
+
149
+ const secretDef = capabilityDef.secrets.find((s) => s.name === secretName);
150
+
151
+ if (!secretDef) {
152
+ throw new Error(`Secret '${secretName}' not defined in capability '${capabilityName}'`);
153
+ }
154
+
155
+ // Check if secret uses secret_ref (reference to provider module's own secret)
156
+ if (secretDef.secret_ref) {
157
+ // Parse secret_ref (format: $secret:secret_name)
158
+ const match = secretDef.secret_ref.match(/^\$secret:(.+)$/);
159
+ if (!match) {
160
+ throw new Error(
161
+ `Invalid secret_ref format in capability '${capabilityName}': ${secretDef.secret_ref}`,
162
+ );
163
+ }
164
+
165
+ const moduleSecretName = match[1];
166
+
167
+ // Get provider module ID
168
+ const moduleResult = db
169
+ .prepare(
170
+ `SELECT p.id FROM modules p
171
+ JOIN capabilities c ON p.id = c.module_id
172
+ WHERE c.capability_name = ?
173
+ LIMIT 1`,
174
+ )
175
+ .get(capabilityName) as { id: string } | undefined;
176
+
177
+ if (!moduleResult) {
178
+ throw new Error(`Provider module not found for capability '${capabilityName}'`);
179
+ }
180
+
181
+ // Get module secret
182
+ const secretResult = db
183
+ .prepare('SELECT encrypted_value, iv, auth_tag FROM secrets WHERE module_id = ? AND name = ?')
184
+ .get(moduleResult.id, moduleSecretName) as
185
+ | { encrypted_value: string; iv: string; auth_tag: string }
186
+ | undefined;
187
+
188
+ if (!secretResult) {
189
+ throw new Error(
190
+ `Module secret '${moduleSecretName}' not found for capability '${capabilityName}' (referenced by secret_ref)`,
191
+ );
192
+ }
193
+
194
+ // Decrypt and return module secret
195
+ const masterKey = await getOrCreateMasterKey();
196
+ return decryptSecret(
197
+ {
198
+ encryptedValue: secretResult.encrypted_value,
199
+ iv: secretResult.iv,
200
+ authTag: secretResult.auth_tag,
201
+ },
202
+ masterKey,
203
+ );
204
+ }
205
+
206
+ // No secret_ref - read directly from capability_secrets table
207
+ const capabilityResult = db
208
+ .prepare('SELECT id FROM capabilities WHERE capability_name = ? LIMIT 1')
209
+ .get(capabilityName) as { id: number } | undefined;
210
+
211
+ if (!capabilityResult) {
212
+ throw new Error(`Capability '${capabilityName}' not found`);
213
+ }
214
+
215
+ const secretResult = db
216
+ .prepare(
217
+ 'SELECT encrypted_value, iv, auth_tag FROM capability_secrets WHERE capability_id = ? AND name = ?',
218
+ )
219
+ .get(capabilityResult.id, secretName) as
220
+ | { encrypted_value: string; iv: string; auth_tag: string }
221
+ | undefined;
222
+
223
+ if (!secretResult) {
224
+ throw new Error(`Secret '${secretName}' not found in capability '${capabilityName}'`);
225
+ }
226
+
227
+ if (!secretResult.encrypted_value || !secretResult.iv || !secretResult.auth_tag) {
228
+ throw new Error(
229
+ `Secret '${secretName}' in capability '${capabilityName}' has not been set. Run module configuration to set this secret.`,
230
+ );
231
+ }
232
+
233
+ // Decrypt secret
234
+ const masterKey = await getOrCreateMasterKey();
235
+
236
+ return decryptSecret(
237
+ {
238
+ encryptedValue: secretResult.encrypted_value,
239
+ iv: secretResult.iv,
240
+ authTag: secretResult.auth_tag,
241
+ },
242
+ masterKey,
243
+ );
244
+ }