@zincapp/zn-vault-agent 1.3.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 (88) hide show
  1. package/README.md +701 -0
  2. package/deploy/logrotate.d/zn-vault-agent +14 -0
  3. package/deploy/systemd/zn-vault-agent.service +75 -0
  4. package/dist/commands/certs.d.ts +3 -0
  5. package/dist/commands/certs.d.ts.map +1 -0
  6. package/dist/commands/certs.js +369 -0
  7. package/dist/commands/certs.js.map +1 -0
  8. package/dist/commands/exec.d.ts +3 -0
  9. package/dist/commands/exec.d.ts.map +1 -0
  10. package/dist/commands/exec.js +193 -0
  11. package/dist/commands/exec.js.map +1 -0
  12. package/dist/commands/login.d.ts +3 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +234 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/secrets.d.ts +3 -0
  17. package/dist/commands/secrets.d.ts.map +1 -0
  18. package/dist/commands/secrets.js +445 -0
  19. package/dist/commands/secrets.js.map +1 -0
  20. package/dist/commands/setup.d.ts +9 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +346 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/start.d.ts +3 -0
  25. package/dist/commands/start.d.ts.map +1 -0
  26. package/dist/commands/start.js +113 -0
  27. package/dist/commands/start.js.map +1 -0
  28. package/dist/commands/status.d.ts +3 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +85 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/commands/sync.d.ts +3 -0
  33. package/dist/commands/sync.d.ts.map +1 -0
  34. package/dist/commands/sync.js +126 -0
  35. package/dist/commands/sync.js.map +1 -0
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +28 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/lib/api.d.ts +104 -0
  41. package/dist/lib/api.d.ts.map +1 -0
  42. package/dist/lib/api.js +338 -0
  43. package/dist/lib/api.js.map +1 -0
  44. package/dist/lib/config.d.ts +164 -0
  45. package/dist/lib/config.d.ts.map +1 -0
  46. package/dist/lib/config.js +299 -0
  47. package/dist/lib/config.js.map +1 -0
  48. package/dist/lib/deployer.d.ts +22 -0
  49. package/dist/lib/deployer.d.ts.map +1 -0
  50. package/dist/lib/deployer.js +407 -0
  51. package/dist/lib/deployer.js.map +1 -0
  52. package/dist/lib/health.d.ts +68 -0
  53. package/dist/lib/health.d.ts.map +1 -0
  54. package/dist/lib/health.js +216 -0
  55. package/dist/lib/health.js.map +1 -0
  56. package/dist/lib/logger.d.ts +38 -0
  57. package/dist/lib/logger.d.ts.map +1 -0
  58. package/dist/lib/logger.js +161 -0
  59. package/dist/lib/logger.js.map +1 -0
  60. package/dist/lib/metrics.d.ts +50 -0
  61. package/dist/lib/metrics.d.ts.map +1 -0
  62. package/dist/lib/metrics.js +273 -0
  63. package/dist/lib/metrics.js.map +1 -0
  64. package/dist/lib/secret-deployer.d.ts +22 -0
  65. package/dist/lib/secret-deployer.d.ts.map +1 -0
  66. package/dist/lib/secret-deployer.js +201 -0
  67. package/dist/lib/secret-deployer.js.map +1 -0
  68. package/dist/lib/validation.d.ts +25 -0
  69. package/dist/lib/validation.d.ts.map +1 -0
  70. package/dist/lib/validation.js +257 -0
  71. package/dist/lib/validation.js.map +1 -0
  72. package/dist/lib/websocket.d.ts +74 -0
  73. package/dist/lib/websocket.d.ts.map +1 -0
  74. package/dist/lib/websocket.js +441 -0
  75. package/dist/lib/websocket.js.map +1 -0
  76. package/dist/services/api-key-renewal.d.ts +13 -0
  77. package/dist/services/api-key-renewal.d.ts.map +1 -0
  78. package/dist/services/api-key-renewal.js +204 -0
  79. package/dist/services/api-key-renewal.js.map +1 -0
  80. package/dist/services/npm-auto-update.d.ts +60 -0
  81. package/dist/services/npm-auto-update.d.ts.map +1 -0
  82. package/dist/services/npm-auto-update.js +245 -0
  83. package/dist/services/npm-auto-update.js.map +1 -0
  84. package/dist/types/update.d.ts +19 -0
  85. package/dist/types/update.d.ts.map +1 -0
  86. package/dist/types/update.js +7 -0
  87. package/dist/types/update.js.map +1 -0
  88. package/package.json +74 -0
@@ -0,0 +1,273 @@
1
+ // Path: src/lib/metrics.ts
2
+ // Prometheus metrics for zn-vault-agent
3
+ import { metricsLogger as log } from './logger.js';
4
+ // Metric storage
5
+ const counters = new Map();
6
+ const gauges = new Map();
7
+ const histograms = new Map();
8
+ // Metric metadata
9
+ const metricHelp = new Map();
10
+ const metricType = new Map();
11
+ // Default histogram buckets (in seconds)
12
+ const DEFAULT_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];
13
+ /**
14
+ * Register a counter metric
15
+ */
16
+ export function registerCounter(name, help) {
17
+ if (!counters.has(name)) {
18
+ counters.set(name, []);
19
+ metricHelp.set(name, help);
20
+ metricType.set(name, 'counter');
21
+ }
22
+ }
23
+ /**
24
+ * Increment a counter
25
+ */
26
+ export function incCounter(name, labels = {}, value = 1) {
27
+ const values = counters.get(name);
28
+ if (!values) {
29
+ log.warn({ name }, 'Counter not registered');
30
+ return;
31
+ }
32
+ const labelKey = JSON.stringify(labels);
33
+ const existing = values.find((v) => JSON.stringify(v.labels) === labelKey);
34
+ if (existing) {
35
+ existing.value += value;
36
+ }
37
+ else {
38
+ values.push({ value, labels });
39
+ }
40
+ }
41
+ /**
42
+ * Register a gauge metric
43
+ */
44
+ export function registerGauge(name, help) {
45
+ if (!gauges.has(name)) {
46
+ gauges.set(name, []);
47
+ metricHelp.set(name, help);
48
+ metricType.set(name, 'gauge');
49
+ }
50
+ }
51
+ /**
52
+ * Set a gauge value
53
+ */
54
+ export function setGauge(name, value, labels = {}) {
55
+ const values = gauges.get(name);
56
+ if (!values) {
57
+ log.warn({ name }, 'Gauge not registered');
58
+ return;
59
+ }
60
+ const labelKey = JSON.stringify(labels);
61
+ const existing = values.find((v) => JSON.stringify(v.labels) === labelKey);
62
+ if (existing) {
63
+ existing.value = value;
64
+ existing.timestamp = Date.now();
65
+ }
66
+ else {
67
+ values.push({ value, labels, timestamp: Date.now() });
68
+ }
69
+ }
70
+ /**
71
+ * Register a histogram metric
72
+ */
73
+ export function registerHistogram(name, help, buckets = DEFAULT_BUCKETS) {
74
+ if (!histograms.has(name)) {
75
+ histograms.set(name, []);
76
+ metricHelp.set(name, help);
77
+ metricType.set(name, 'histogram');
78
+ // Store bucket boundaries in help text for reference
79
+ metricHelp.set(`${name}_buckets`, buckets.join(','));
80
+ }
81
+ }
82
+ /**
83
+ * Observe a histogram value
84
+ */
85
+ export function observeHistogram(name, value, labels = {}) {
86
+ const values = histograms.get(name);
87
+ if (!values) {
88
+ log.warn({ name }, 'Histogram not registered');
89
+ return;
90
+ }
91
+ const bucketBoundaries = metricHelp.get(`${name}_buckets`)?.split(',').map(Number) || DEFAULT_BUCKETS;
92
+ const labelKey = JSON.stringify(labels);
93
+ let existing = values.find((v) => JSON.stringify(v.labels) === labelKey);
94
+ if (!existing) {
95
+ existing = {
96
+ buckets: bucketBoundaries.map((le) => ({ le, count: 0 })),
97
+ sum: 0,
98
+ count: 0,
99
+ labels,
100
+ };
101
+ values.push(existing);
102
+ }
103
+ // Update buckets
104
+ for (const bucket of existing.buckets) {
105
+ if (value <= bucket.le) {
106
+ bucket.count++;
107
+ }
108
+ }
109
+ existing.sum += value;
110
+ existing.count++;
111
+ }
112
+ /**
113
+ * Format labels for Prometheus output
114
+ */
115
+ function formatLabels(labels) {
116
+ const entries = Object.entries(labels);
117
+ if (entries.length === 0)
118
+ return '';
119
+ return `{${entries.map(([k, v]) => `${k}="${v}"`).join(',')}}`;
120
+ }
121
+ /**
122
+ * Export all metrics in Prometheus text format
123
+ */
124
+ export function exportMetrics() {
125
+ const lines = [];
126
+ // Add process metrics
127
+ lines.push('# HELP process_uptime_seconds Process uptime in seconds');
128
+ lines.push('# TYPE process_uptime_seconds gauge');
129
+ lines.push(`process_uptime_seconds ${process.uptime().toFixed(3)}`);
130
+ lines.push('# HELP process_heap_bytes Process heap memory in bytes');
131
+ lines.push('# TYPE process_heap_bytes gauge');
132
+ lines.push(`process_heap_bytes ${process.memoryUsage().heapUsed}`);
133
+ lines.push('');
134
+ // Export counters
135
+ for (const [name, values] of counters) {
136
+ const help = metricHelp.get(name);
137
+ if (help)
138
+ lines.push(`# HELP ${name} ${help}`);
139
+ lines.push(`# TYPE ${name} counter`);
140
+ for (const v of values) {
141
+ lines.push(`${name}${formatLabels(v.labels)} ${v.value}`);
142
+ }
143
+ // Add total if no labels
144
+ if (values.length === 0) {
145
+ lines.push(`${name} 0`);
146
+ }
147
+ lines.push('');
148
+ }
149
+ // Export gauges
150
+ for (const [name, values] of gauges) {
151
+ const help = metricHelp.get(name);
152
+ if (help)
153
+ lines.push(`# HELP ${name} ${help}`);
154
+ lines.push(`# TYPE ${name} gauge`);
155
+ for (const v of values) {
156
+ lines.push(`${name}${formatLabels(v.labels)} ${v.value}`);
157
+ }
158
+ if (values.length === 0) {
159
+ lines.push(`${name} 0`);
160
+ }
161
+ lines.push('');
162
+ }
163
+ // Export histograms
164
+ for (const [name, values] of histograms) {
165
+ const help = metricHelp.get(name);
166
+ if (help)
167
+ lines.push(`# HELP ${name} ${help}`);
168
+ lines.push(`# TYPE ${name} histogram`);
169
+ for (const v of values) {
170
+ const labelStr = formatLabels(v.labels);
171
+ for (const bucket of v.buckets) {
172
+ const leLabel = v.labels ? { ...v.labels, le: String(bucket.le) } : { le: String(bucket.le) };
173
+ lines.push(`${name}_bucket${formatLabels(leLabel)} ${bucket.count}`);
174
+ }
175
+ const infLabel = v.labels ? { ...v.labels, le: '+Inf' } : { le: '+Inf' };
176
+ lines.push(`${name}_bucket${formatLabels(infLabel)} ${v.count}`);
177
+ lines.push(`${name}_sum${labelStr} ${v.sum.toFixed(6)}`);
178
+ lines.push(`${name}_count${labelStr} ${v.count}`);
179
+ }
180
+ lines.push('');
181
+ }
182
+ return lines.join('\n');
183
+ }
184
+ /**
185
+ * Reset all metrics (useful for testing)
186
+ */
187
+ export function resetMetrics() {
188
+ for (const values of counters.values()) {
189
+ values.length = 0;
190
+ }
191
+ for (const values of gauges.values()) {
192
+ values.length = 0;
193
+ }
194
+ for (const values of histograms.values()) {
195
+ values.length = 0;
196
+ }
197
+ }
198
+ // Register agent-specific metrics
199
+ export function initializeMetrics() {
200
+ // Counters
201
+ registerCounter('znvault_agent_sync_total', 'Total certificate sync operations');
202
+ registerCounter('znvault_agent_sync_failures_total', 'Total failed sync operations');
203
+ registerCounter('znvault_agent_secret_sync_total', 'Total secret sync operations');
204
+ registerCounter('znvault_agent_secret_sync_failures_total', 'Total failed secret sync operations');
205
+ registerCounter('znvault_agent_websocket_reconnects_total', 'Total WebSocket reconnection attempts');
206
+ registerCounter('znvault_agent_api_requests_total', 'Total API requests made');
207
+ registerCounter('znvault_agent_update_checks_total', 'Total update checks performed');
208
+ registerCounter('znvault_agent_updates_total', 'Total update installations');
209
+ // Gauges
210
+ registerGauge('znvault_agent_connected', 'WebSocket connection status (1=connected, 0=disconnected)');
211
+ registerGauge('znvault_agent_certs_tracked', 'Number of certificates being tracked');
212
+ registerGauge('znvault_agent_secrets_tracked', 'Number of secrets being tracked');
213
+ registerGauge('znvault_agent_last_sync_timestamp', 'Timestamp of last successful sync');
214
+ registerGauge('znvault_agent_cert_expiry_days', 'Days until certificate expiry');
215
+ registerGauge('znvault_agent_version_info', 'Agent version information');
216
+ // Histograms
217
+ registerHistogram('znvault_agent_sync_duration_seconds', 'Certificate sync duration in seconds');
218
+ registerHistogram('znvault_agent_secret_sync_duration_seconds', 'Secret sync duration in seconds');
219
+ registerHistogram('znvault_agent_api_request_duration_seconds', 'API request duration in seconds');
220
+ log.debug('Metrics initialized');
221
+ }
222
+ // Convenience functions for common operations
223
+ export const metrics = {
224
+ // Sync operations
225
+ syncSuccess: (certName) => {
226
+ incCounter('znvault_agent_sync_total', { status: 'success', cert_name: certName });
227
+ setGauge('znvault_agent_last_sync_timestamp', Date.now() / 1000, { cert_name: certName });
228
+ },
229
+ syncFailure: (certName, reason) => {
230
+ incCounter('znvault_agent_sync_total', { status: 'failure', cert_name: certName });
231
+ incCounter('znvault_agent_sync_failures_total', { cert_name: certName, reason });
232
+ },
233
+ syncDuration: (certName, durationMs) => {
234
+ observeHistogram('znvault_agent_sync_duration_seconds', durationMs / 1000, { cert_name: certName });
235
+ },
236
+ // WebSocket
237
+ wsConnected: () => setGauge('znvault_agent_connected', 1),
238
+ wsDisconnected: () => setGauge('znvault_agent_connected', 0),
239
+ wsReconnect: () => incCounter('znvault_agent_websocket_reconnects_total'),
240
+ // API
241
+ apiRequest: (method, status, durationMs) => {
242
+ incCounter('znvault_agent_api_requests_total', { method, status: String(status) });
243
+ observeHistogram('znvault_agent_api_request_duration_seconds', durationMs / 1000, { method });
244
+ },
245
+ // Certificate tracking
246
+ setCertsTracked: (count) => setGauge('znvault_agent_certs_tracked', count),
247
+ setCertExpiry: (certId, certName, days) => {
248
+ setGauge('znvault_agent_cert_expiry_days', days, { cert_id: certId, cert_name: certName });
249
+ },
250
+ // Secret operations
251
+ secretDeployed: (secretName, success, durationMs) => {
252
+ incCounter('znvault_agent_secret_sync_total', { status: success ? 'success' : 'failure', secret_name: secretName });
253
+ if (!success) {
254
+ incCounter('znvault_agent_secret_sync_failures_total', { secret_name: secretName });
255
+ }
256
+ observeHistogram('znvault_agent_secret_sync_duration_seconds', durationMs / 1000, { secret_name: secretName });
257
+ if (success) {
258
+ setGauge('znvault_agent_last_sync_timestamp', Date.now() / 1000, { secret_name: secretName });
259
+ }
260
+ },
261
+ setSecretsTracked: (count) => setGauge('znvault_agent_secrets_tracked', count),
262
+ // Auto-update
263
+ updateCheck: (status) => {
264
+ incCounter('znvault_agent_update_checks_total', { status });
265
+ },
266
+ updateInstall: (status) => {
267
+ incCounter('znvault_agent_updates_total', { status });
268
+ },
269
+ setVersionInfo: (version, channel) => {
270
+ setGauge('znvault_agent_version_info', 1, { version, channel });
271
+ },
272
+ };
273
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/lib/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SecretTarget } from './config.js';
2
+ export interface SecretDeployResult {
3
+ success: boolean;
4
+ secretId: string;
5
+ name: string;
6
+ message: string;
7
+ version?: number;
8
+ durationMs?: number;
9
+ }
10
+ /**
11
+ * Deploy a single secret target
12
+ */
13
+ export declare function deploySecret(target: SecretTarget, force?: boolean): Promise<SecretDeployResult>;
14
+ /**
15
+ * Deploy all configured secret targets
16
+ */
17
+ export declare function deployAllSecrets(force?: boolean): Promise<SecretDeployResult[]>;
18
+ /**
19
+ * Find secret target by ID or alias
20
+ */
21
+ export declare function findSecretTarget(secretIdOrAlias: string): SecretTarget | undefined;
22
+ //# sourceMappingURL=secret-deployer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-deployer.d.ts","sourceRoot":"","sources":["../../src/lib/secret-deployer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMhD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwGD;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,KAAK,UAAQ,GACZ,OAAO,CAAC,kBAAkB,CAAC,CAoF7B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBnF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOlF"}
@@ -0,0 +1,201 @@
1
+ // Path: src/lib/secret-deployer.ts
2
+ // Secret deployment with atomic writes
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { execSync } from 'node:child_process';
6
+ import { getSecret } from './api.js';
7
+ import { updateSecretTargetVersion, getSecretTargets, loadConfig } from './config.js';
8
+ import { deployLogger as log } from './logger.js';
9
+ import { metrics } from './metrics.js';
10
+ /**
11
+ * Format secret data according to target format
12
+ */
13
+ function formatSecretData(data, format, options) {
14
+ switch (format) {
15
+ case 'env': {
16
+ const prefix = options.envPrefix || '';
17
+ return Object.entries(data)
18
+ .map(([k, v]) => {
19
+ const key = prefix + k.toUpperCase();
20
+ const value = typeof v === 'string' ? v : JSON.stringify(v);
21
+ return `${key}="${value.replace(/"/g, '\\"')}"`;
22
+ })
23
+ .join('\n') + '\n';
24
+ }
25
+ case 'json':
26
+ return JSON.stringify(data, null, 2) + '\n';
27
+ case 'yaml': {
28
+ // Simple YAML serialization
29
+ return Object.entries(data)
30
+ .map(([k, v]) => {
31
+ if (typeof v === 'string') {
32
+ // Quote strings that might need it
33
+ if (v.includes(':') || v.includes('#') || v.includes('\n')) {
34
+ return `${k}: "${v.replace(/"/g, '\\"')}"`;
35
+ }
36
+ return `${k}: ${v}`;
37
+ }
38
+ return `${k}: ${JSON.stringify(v)}`;
39
+ })
40
+ .join('\n') + '\n';
41
+ }
42
+ case 'raw': {
43
+ if (!options.key) {
44
+ throw new Error('Key must be specified for raw format');
45
+ }
46
+ const value = data[options.key];
47
+ if (value === undefined) {
48
+ throw new Error(`Key "${options.key}" not found in secret data`);
49
+ }
50
+ return typeof value === 'string' ? value : JSON.stringify(value);
51
+ }
52
+ case 'template': {
53
+ if (!options.templatePath) {
54
+ throw new Error('Template path must be specified for template format');
55
+ }
56
+ if (!fs.existsSync(options.templatePath)) {
57
+ throw new Error(`Template file not found: ${options.templatePath}`);
58
+ }
59
+ let template = fs.readFileSync(options.templatePath, 'utf-8');
60
+ // Replace {{ key }} placeholders
61
+ for (const [k, v] of Object.entries(data)) {
62
+ const value = typeof v === 'string' ? v : JSON.stringify(v);
63
+ template = template.replace(new RegExp(`\\{\\{\\s*${k}\\s*\\}\\}`, 'g'), value);
64
+ }
65
+ return template;
66
+ }
67
+ default:
68
+ return JSON.stringify(data, null, 2) + '\n';
69
+ }
70
+ }
71
+ /**
72
+ * Write secret to file with proper permissions (atomic)
73
+ */
74
+ function writeSecretFile(filePath, content, owner, mode) {
75
+ const dir = path.dirname(filePath);
76
+ if (!fs.existsSync(dir)) {
77
+ fs.mkdirSync(dir, { recursive: true });
78
+ }
79
+ // Write to temp file first (atomic)
80
+ const tempPath = `${filePath}.tmp.${process.pid}`;
81
+ fs.writeFileSync(tempPath, content, { mode: parseInt(mode || '0600', 8) });
82
+ // Set ownership if specified and running as root
83
+ if (owner && process.getuid?.() === 0) {
84
+ try {
85
+ execSync(`chown ${owner} "${tempPath}"`, { stdio: 'ignore' });
86
+ }
87
+ catch {
88
+ // Ignore chown errors
89
+ }
90
+ }
91
+ // Atomic rename
92
+ fs.renameSync(tempPath, filePath);
93
+ }
94
+ /**
95
+ * Deploy a single secret target
96
+ */
97
+ export async function deploySecret(target, force = false) {
98
+ const startTime = Date.now();
99
+ try {
100
+ log.debug({ name: target.name, secretId: target.secretId }, 'Deploying secret');
101
+ // Fetch secret from vault
102
+ const secret = await getSecret(target.secretId);
103
+ // Check if update needed (unless forced)
104
+ if (!force && target.lastVersion === secret.version) {
105
+ return {
106
+ success: true,
107
+ secretId: target.secretId,
108
+ name: target.name,
109
+ message: 'Already up to date',
110
+ version: secret.version,
111
+ durationMs: Date.now() - startTime,
112
+ };
113
+ }
114
+ // Format the data
115
+ const content = formatSecretData(secret.data, target.format, {
116
+ key: target.key,
117
+ envPrefix: target.envPrefix,
118
+ templatePath: target.templatePath,
119
+ });
120
+ // Write to file
121
+ writeSecretFile(target.output, content, target.owner, target.mode);
122
+ // Update config with new version
123
+ updateSecretTargetVersion(target.secretId, secret.version);
124
+ // Run reload command if specified
125
+ if (target.reloadCmd) {
126
+ try {
127
+ log.debug({ cmd: target.reloadCmd }, 'Running reload command');
128
+ execSync(target.reloadCmd, { stdio: 'pipe' });
129
+ }
130
+ catch (err) {
131
+ log.warn({ err, cmd: target.reloadCmd }, 'Reload command failed');
132
+ }
133
+ }
134
+ const durationMs = Date.now() - startTime;
135
+ metrics.secretDeployed(target.name, true, durationMs);
136
+ log.info({
137
+ name: target.name,
138
+ secretId: target.secretId,
139
+ version: secret.version,
140
+ output: target.output,
141
+ durationMs,
142
+ }, 'Secret deployed successfully');
143
+ return {
144
+ success: true,
145
+ secretId: target.secretId,
146
+ name: target.name,
147
+ message: 'Deployed successfully',
148
+ version: secret.version,
149
+ durationMs,
150
+ };
151
+ }
152
+ catch (err) {
153
+ const durationMs = Date.now() - startTime;
154
+ const message = err instanceof Error ? err.message : String(err);
155
+ metrics.secretDeployed(target.name, false, durationMs);
156
+ log.error({
157
+ name: target.name,
158
+ secretId: target.secretId,
159
+ err,
160
+ durationMs,
161
+ }, 'Secret deployment failed');
162
+ return {
163
+ success: false,
164
+ secretId: target.secretId,
165
+ name: target.name,
166
+ message,
167
+ durationMs,
168
+ };
169
+ }
170
+ }
171
+ /**
172
+ * Deploy all configured secret targets
173
+ */
174
+ export async function deployAllSecrets(force = false) {
175
+ const config = loadConfig();
176
+ const targets = config.secretTargets || [];
177
+ if (targets.length === 0) {
178
+ log.debug('No secret targets configured');
179
+ return [];
180
+ }
181
+ log.info({ count: targets.length }, 'Deploying all secrets');
182
+ const results = [];
183
+ for (const target of targets) {
184
+ const result = await deploySecret(target, force);
185
+ results.push(result);
186
+ }
187
+ const successCount = results.filter(r => r.success).length;
188
+ const errorCount = results.filter(r => !r.success).length;
189
+ log.info({ total: results.length, success: successCount, errors: errorCount }, 'Secret deployment complete');
190
+ return results;
191
+ }
192
+ /**
193
+ * Find secret target by ID or alias
194
+ */
195
+ export function findSecretTarget(secretIdOrAlias) {
196
+ const targets = getSecretTargets();
197
+ return targets.find(t => t.secretId === secretIdOrAlias ||
198
+ t.secretId === `alias:${secretIdOrAlias}` ||
199
+ secretIdOrAlias.includes(t.secretId));
200
+ }
201
+ //# sourceMappingURL=secret-deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-deployer.js","sourceRoot":"","sources":["../../src/lib/secret-deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { AgentConfig } from './config.js';
2
+ export interface ValidationResult {
3
+ valid: boolean;
4
+ errors: ValidationError[];
5
+ warnings: ValidationWarning[];
6
+ }
7
+ export interface ValidationError {
8
+ field: string;
9
+ message: string;
10
+ value?: unknown;
11
+ }
12
+ export interface ValidationWarning {
13
+ field: string;
14
+ message: string;
15
+ suggestion?: string;
16
+ }
17
+ /**
18
+ * Validate the full agent configuration
19
+ */
20
+ export declare function validateConfig(config: AgentConfig): ValidationResult;
21
+ /**
22
+ * Format validation result for display
23
+ */
24
+ export declare function formatValidationResult(result: ValidationResult): string;
25
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA4HD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CA8GpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgCvE"}