ninedeploy 0.3.4 → 0.5.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.
- package/dist/commands/branding.d.ts +31 -0
- package/dist/commands/branding.d.ts.map +1 -0
- package/dist/commands/branding.js +48 -0
- package/dist/commands/branding.js.map +1 -0
- package/dist/commands/buildCache.d.ts +27 -0
- package/dist/commands/buildCache.d.ts.map +1 -0
- package/dist/commands/buildCache.js +46 -0
- package/dist/commands/buildCache.js.map +1 -0
- package/dist/commands/certificates.d.ts +15 -0
- package/dist/commands/certificates.d.ts.map +1 -0
- package/dist/commands/certificates.js +57 -0
- package/dist/commands/certificates.js.map +1 -0
- package/dist/commands/communityTemplates.d.ts +24 -0
- package/dist/commands/communityTemplates.d.ts.map +1 -0
- package/dist/commands/communityTemplates.js +79 -0
- package/dist/commands/communityTemplates.js.map +1 -0
- package/dist/commands/configPresets.d.ts +51 -0
- package/dist/commands/configPresets.d.ts.map +1 -0
- package/dist/commands/configPresets.js +166 -0
- package/dist/commands/configPresets.js.map +1 -0
- package/dist/commands/domains.d.ts +70 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +97 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/egress.d.ts +43 -0
- package/dist/commands/egress.d.ts.map +1 -0
- package/dist/commands/egress.js +80 -0
- package/dist/commands/egress.js.map +1 -0
- package/dist/commands/emailTemplates.d.ts +19 -0
- package/dist/commands/emailTemplates.d.ts.map +1 -0
- package/dist/commands/emailTemplates.js +86 -0
- package/dist/commands/emailTemplates.js.map +1 -0
- package/dist/commands/housekeeping.d.ts +24 -0
- package/dist/commands/housekeeping.d.ts.map +1 -1
- package/dist/commands/housekeeping.js +62 -1
- package/dist/commands/housekeeping.js.map +1 -1
- package/dist/commands/logs.d.ts +15 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +58 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/manage.d.ts +45 -0
- package/dist/commands/manage.d.ts.map +1 -1
- package/dist/commands/manage.js +153 -0
- package/dist/commands/manage.js.map +1 -1
- package/dist/commands/manifest.d.ts +12 -6
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +87 -12
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/metrics.d.ts +37 -0
- package/dist/commands/metrics.d.ts.map +1 -0
- package/dist/commands/metrics.js +43 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/commands/misc.d.ts +35 -0
- package/dist/commands/misc.d.ts.map +1 -1
- package/dist/commands/misc.js +135 -1
- package/dist/commands/misc.js.map +1 -1
- package/dist/commands/notifications.d.ts +59 -0
- package/dist/commands/notifications.d.ts.map +1 -0
- package/dist/commands/notifications.js +157 -0
- package/dist/commands/notifications.js.map +1 -0
- package/dist/commands/pgbouncer.d.ts +17 -0
- package/dist/commands/pgbouncer.d.ts.map +1 -0
- package/dist/commands/pgbouncer.js +46 -0
- package/dist/commands/pgbouncer.js.map +1 -0
- package/dist/commands/plugins.d.ts +3 -0
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +20 -1
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/services.d.ts +14 -0
- package/dist/commands/services.d.ts.map +1 -1
- package/dist/commands/services.js +29 -0
- package/dist/commands/services.js.map +1 -1
- package/dist/commands/sso.d.ts +31 -0
- package/dist/commands/sso.d.ts.map +1 -0
- package/dist/commands/sso.js +77 -0
- package/dist/commands/sso.js.map +1 -0
- package/dist/commands/templates.d.ts +22 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +122 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/token.d.ts +10 -0
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/commands/token.js +24 -1
- package/dist/commands/token.js.map +1 -1
- package/dist/index.js +292 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +18 -3
- package/dist/lib/format.js.map +1 -1
- package/package.json +3 -3
package/dist/commands/misc.d.ts
CHANGED
|
@@ -9,8 +9,33 @@ export declare function tplList(client: NineDeployClient): Promise<void>;
|
|
|
9
9
|
export declare function tplDeploy(client: NineDeployClient, id: string): Promise<void>;
|
|
10
10
|
/** `ninedeploy deploys list <serviceId>` */
|
|
11
11
|
export declare function deploysList(client: NineDeployClient, svcIdStr: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* `ninedeploy deploys queue`
|
|
14
|
+
*
|
|
15
|
+
* Global queue view: every in-flight (queued / building / deploying) deploy
|
|
16
|
+
* across every service the caller can see. The same data the web panel's
|
|
17
|
+
* `/deploys` page renders, so an operator can audit the build pipeline
|
|
18
|
+
* without leaving the terminal or opening a browser tab.
|
|
19
|
+
*/
|
|
20
|
+
export declare function deploysQueue(client: NineDeployClient): Promise<void>;
|
|
12
21
|
/** `ninedeploy deploys rollback <serviceId> <deployId>` */
|
|
13
22
|
export declare function deploysRollback(client: NineDeployClient, svcIdStr: string, depIdStr: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* `ninedeploy deploys cancel <serviceId> <deployId>`
|
|
25
|
+
*
|
|
26
|
+
* The route, the SDK method and the panel button all existed; the CLI was the
|
|
27
|
+
* one surface without it, so a deploy started from CI could only be stopped
|
|
28
|
+
* from a browser.
|
|
29
|
+
*/
|
|
30
|
+
export declare function deploysCancel(client: NineDeployClient, svcIdStr: string, depIdStr: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* `ninedeploy deploys rm <serviceId> <deployId>`
|
|
33
|
+
*
|
|
34
|
+
* Removes a finished deployment from history, with its build log. Refused for
|
|
35
|
+
* an in-flight deployment (cancel it first) and for the one currently serving
|
|
36
|
+
* traffic — that row carries the digest a rollback re-deploys.
|
|
37
|
+
*/
|
|
38
|
+
export declare function deploysRemove(client: NineDeployClient, svcIdStr: string, depIdStr: string, yes?: boolean): Promise<void>;
|
|
14
39
|
/** `ninedeploy token create` */
|
|
15
40
|
export declare function tokenCreate(client: NineDeployClient): Promise<void>;
|
|
16
41
|
/** `ninedeploy token list` */
|
|
@@ -21,4 +46,14 @@ export declare function systemInfo(client: NineDeployClient): Promise<void>;
|
|
|
21
46
|
export declare function systemUpdateCheck(client: NineDeployClient, force: boolean): Promise<void>;
|
|
22
47
|
/** `ninedeploy system dashboard` */
|
|
23
48
|
export declare function systemDashboard(client: NineDeployClient): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* `ninedeploy system rotate-keys`
|
|
51
|
+
*
|
|
52
|
+
* The command `.env.example` has told operators to run since the key-ring
|
|
53
|
+
* landed. It did not exist: `lib/keyRotation.rotateSecrets` was implemented and
|
|
54
|
+
* tested but had no caller anywhere in the product, so anyone who followed the
|
|
55
|
+
* documented rotation procedure and then dropped the retired key version was
|
|
56
|
+
* left holding ciphertext they could no longer decrypt.
|
|
57
|
+
*/
|
|
58
|
+
export declare function systemRotateKeys(client: NineDeployClient): Promise<void>;
|
|
24
59
|
//# sourceMappingURL=misc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKrD,kCAAkC;AAClC,wBAAsB,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED,oCAAoC;AACpC,wBAAsB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;AAED,kCAAkC;AAClC,wBAAsB,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrE;AAED,yCAAyC;AACzC,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnF;AAED,4CAA4C;AAC5C,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3F;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC1E;AAED,2DAA2D;AAC3D,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQjH;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/G;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5H;AAED,gCAAgC;AAChC,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzE;AAED,8BAA8B;AAC9B,wBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvE;AAED,+BAA+B;AAC/B,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxE;AAED,uCAAuC;AACvC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;AAED,oCAAoC;AACpC,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7E;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9E"}
|
package/dist/commands/misc.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { c, error, fmtTime, header, info, kv, spinner, success, table, banner } from '../lib/format.js';
|
|
2
2
|
import { prompt } from '../prompts.js';
|
|
3
|
+
import { parseScopes } from './token.js';
|
|
3
4
|
/** `ninedeploy databases list` */
|
|
4
5
|
export async function dbList(client) {
|
|
5
6
|
header('Databases');
|
|
@@ -73,6 +74,54 @@ export async function deploysList(client, svcIdStr) {
|
|
|
73
74
|
table(deps.map((d) => ({ id: d.id, status: d.status, commit: d.commitSha?.slice(0, 7) ?? '—', trigger: d.trigger, time: fmtTime(d.createdAt) })), ['id', 'status', 'commit', 'trigger', 'time']);
|
|
74
75
|
});
|
|
75
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* `ninedeploy deploys queue`
|
|
79
|
+
*
|
|
80
|
+
* Global queue view: every in-flight (queued / building / deploying) deploy
|
|
81
|
+
* across every service the caller can see. The same data the web panel's
|
|
82
|
+
* `/deploys` page renders, so an operator can audit the build pipeline
|
|
83
|
+
* without leaving the terminal or opening a browser tab.
|
|
84
|
+
*/
|
|
85
|
+
export async function deploysQueue(client) {
|
|
86
|
+
header('Global deploy queue');
|
|
87
|
+
const data = await spinner('Fetching', () => client.deploys.queue());
|
|
88
|
+
const counts = data.byStatus ?? { queued: 0, building: 0, deploying: 0 };
|
|
89
|
+
const inFlight = data.items ?? [];
|
|
90
|
+
if (inFlight.length === 0) {
|
|
91
|
+
info('No in-flight deploys.');
|
|
92
|
+
kv('queued', counts.queued ?? 0);
|
|
93
|
+
kv('building', counts.building ?? 0);
|
|
94
|
+
kv('deploying', counts.deploying ?? 0);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// The server returns items ordered claimed-first (building, then
|
|
98
|
+
// deploying, then queued). Per-service queue position is the 1-based
|
|
99
|
+
// index of this row among the `queued` siblings for the same
|
|
100
|
+
// service. In-flight rows (building / deploying) get a dash — the
|
|
101
|
+
// position number is only meaningful for rows waiting to start.
|
|
102
|
+
const queuedByService = new Map();
|
|
103
|
+
table(inFlight.map((row) => {
|
|
104
|
+
let pos;
|
|
105
|
+
if (row.status === 'queued') {
|
|
106
|
+
pos = (queuedByService.get(row.serviceId) ?? 0) + 1;
|
|
107
|
+
queuedByService.set(row.serviceId, pos);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
pos = 0;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
service: row.serviceName || `service:${row.serviceId}`,
|
|
114
|
+
serviceId: row.serviceId,
|
|
115
|
+
deploy: row.id,
|
|
116
|
+
status: row.status,
|
|
117
|
+
pos: pos > 0 ? `${pos}` : '—',
|
|
118
|
+
time: fmtTime(row.createdAt),
|
|
119
|
+
};
|
|
120
|
+
}), ['service', 'serviceId', 'deploy', 'status', 'pos', 'time']);
|
|
121
|
+
kv('queued', counts.queued ?? 0);
|
|
122
|
+
kv('building', counts.building ?? 0);
|
|
123
|
+
kv('deploying', counts.deploying ?? 0);
|
|
124
|
+
}
|
|
76
125
|
/** `ninedeploy deploys rollback <serviceId> <deployId>` */
|
|
77
126
|
export async function deploysRollback(client, svcIdStr, depIdStr) {
|
|
78
127
|
const svcId = Number(svcIdStr);
|
|
@@ -87,12 +136,68 @@ export async function deploysRollback(client, svcIdStr, depIdStr) {
|
|
|
87
136
|
error(err instanceof Error ? err.message : String(err));
|
|
88
137
|
}
|
|
89
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* `ninedeploy deploys cancel <serviceId> <deployId>`
|
|
141
|
+
*
|
|
142
|
+
* The route, the SDK method and the panel button all existed; the CLI was the
|
|
143
|
+
* one surface without it, so a deploy started from CI could only be stopped
|
|
144
|
+
* from a browser.
|
|
145
|
+
*/
|
|
146
|
+
export async function deploysCancel(client, svcIdStr, depIdStr) {
|
|
147
|
+
const svcId = Number(svcIdStr);
|
|
148
|
+
const depId = Number(depIdStr);
|
|
149
|
+
if (!svcId || !depId)
|
|
150
|
+
return error('Usage: ninedeploy deploys cancel <serviceId> <deployId>');
|
|
151
|
+
try {
|
|
152
|
+
await spinner('Cancelling', () => client.deploys.cancel(svcId, depId));
|
|
153
|
+
// A queued deploy stops here; an in-flight one stops at the pipeline's next
|
|
154
|
+
// step boundary, with the previous version still serving.
|
|
155
|
+
success(`Deployment #${depId} cancelled.`);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
error(err instanceof Error ? err.message : String(err));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* `ninedeploy deploys rm <serviceId> <deployId>`
|
|
163
|
+
*
|
|
164
|
+
* Removes a finished deployment from history, with its build log. Refused for
|
|
165
|
+
* an in-flight deployment (cancel it first) and for the one currently serving
|
|
166
|
+
* traffic — that row carries the digest a rollback re-deploys.
|
|
167
|
+
*/
|
|
168
|
+
export async function deploysRemove(client, svcIdStr, depIdStr, yes = false) {
|
|
169
|
+
const svcId = Number(svcIdStr);
|
|
170
|
+
const depId = Number(depIdStr);
|
|
171
|
+
if (!svcId || !depId)
|
|
172
|
+
return error('Usage: ninedeploy deploys rm <serviceId> <deployId>');
|
|
173
|
+
if (!yes) {
|
|
174
|
+
const confirm = await prompt(`Permanently remove deployment #${depId} and its build log? (yes/no)`, 'no');
|
|
175
|
+
if (confirm.toLowerCase() !== 'yes')
|
|
176
|
+
return info('Aborted.');
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
await spinner('Removing', () => client.deploys.remove(svcId, depId));
|
|
180
|
+
success(`Deployment #${depId} removed.`);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
error(err instanceof Error ? err.message : String(err));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
90
186
|
/** `ninedeploy token create` */
|
|
91
187
|
export async function tokenCreate(client) {
|
|
92
188
|
const name = await prompt('Token name', 'ci');
|
|
189
|
+
// read = safe methods only · write = mutate as a non-operator ·
|
|
190
|
+
// operator = no extra restriction. Blank = unrestricted (legacy tokens).
|
|
191
|
+
// G-08 fine-grained: also accept
|
|
192
|
+
// 'nd://scope/(read|write|admin)/<resource>' for per-resource
|
|
193
|
+
// restriction; the server's scopeCovers() expands the legacy
|
|
194
|
+
// shorthand against the URI form so a `write` token still
|
|
195
|
+
// covers every `nd://scope/write/<r>`.
|
|
196
|
+
const scopes = parseScopes(await prompt('Scopes (read,write,operator or nd://scope/(read|write|admin)/<resource> — blank = unrestricted)', 'write'));
|
|
93
197
|
try {
|
|
94
|
-
const tok = await spinner('Creating token', () => client.auth.tokens.create({ name }));
|
|
198
|
+
const tok = await spinner('Creating token', () => client.auth.tokens.create({ name, scopes }));
|
|
95
199
|
success(`Token created: ${c.cyan(tok.token)}`);
|
|
200
|
+
info(`Scopes: ${tok.scopes.length ? tok.scopes.join(', ') : 'unrestricted (legacy)'}`);
|
|
96
201
|
info('Store this securely — it won\'t be shown again.');
|
|
97
202
|
}
|
|
98
203
|
catch (err) {
|
|
@@ -180,4 +285,33 @@ export async function systemDashboard(client) {
|
|
|
180
285
|
table(dash.recentDeploys.map((d) => ({ id: d.id, service: d.serviceName, status: d.status, time: fmtTime(d.createdAt) })), ['id', 'service', 'status', 'time']);
|
|
181
286
|
});
|
|
182
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* `ninedeploy system rotate-keys`
|
|
290
|
+
*
|
|
291
|
+
* The command `.env.example` has told operators to run since the key-ring
|
|
292
|
+
* landed. It did not exist: `lib/keyRotation.rotateSecrets` was implemented and
|
|
293
|
+
* tested but had no caller anywhere in the product, so anyone who followed the
|
|
294
|
+
* documented rotation procedure and then dropped the retired key version was
|
|
295
|
+
* left holding ciphertext they could no longer decrypt.
|
|
296
|
+
*/
|
|
297
|
+
export async function systemRotateKeys(client) {
|
|
298
|
+
header('Rotate master key');
|
|
299
|
+
const status = await spinner('Reading key ring', () => client.settings.masterKey.get());
|
|
300
|
+
kv('Active version', c.bold(`v${status.activeVersion}`));
|
|
301
|
+
kv('Ring', status.knownVersions.map((v) => `v${v}`).join(', '));
|
|
302
|
+
if (!status.rotatable) {
|
|
303
|
+
return error('Only one key version is loaded — there is nothing to rotate onto. Add a new 32-byte key under a higher version in NINEDEPLOY_MASTER_KEYS, restart, then run this again.');
|
|
304
|
+
}
|
|
305
|
+
const confirm = await prompt(`Re-encrypt every stored secret onto v${status.activeVersion}? (yes/no)`, 'no');
|
|
306
|
+
if (confirm.toLowerCase() !== 'yes')
|
|
307
|
+
return info('Aborted.');
|
|
308
|
+
const res = await spinner('Re-encrypting', () => client.settings.masterKey.rotate());
|
|
309
|
+
success(`${res.rotated} secret value(s) re-encrypted under v${res.activeVersion}.`);
|
|
310
|
+
if (res.warning) {
|
|
311
|
+
info(res.warning);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
info('No stored backups reference an older key version — the retired key can be removed from NINEDEPLOY_MASTER_KEYS.');
|
|
315
|
+
}
|
|
316
|
+
}
|
|
183
317
|
//# sourceMappingURL=misc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAwB;IACnD,MAAM,CAAC,WAAW,CAAC,CAAC;IACpB,MAAM,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACxD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5K,CAAC,CAAC,CAAC;AACL,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAwB;IACrD,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,eAAe,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,oHAAoH,CAAC,CAAC;IAClI,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,CAAU,CAAC;IAC/H,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,kBAAkB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAClF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC;AAC5E,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAwB;IACpD,MAAM,CAAC,cAAc,CAAC,CAAC;IACvB,MAAM,OAAO,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9D,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACrL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAwB,EAAE,EAAU;IAClE,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,yBAAyB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,mCAAmC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC;AAC5E,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAwB,EAAE,QAAgB;IAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACvE,MAAM,CAAC,aAAa,CAAC,CAAC;IACtB,MAAM,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACnM,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAwB,EAAE,QAAgB,EAAE,QAAgB;IAChG,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,gBAAgB,KAAK,yBAAyB,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC;AAC5E,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAwB;IACxD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC;AAC5E,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAwB;IACtD,MAAM,CAAC,YAAY,CAAC,CAAC;IACrB,MAAM,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACxD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAClK,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAwB;IACvD,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjB,MAAM,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,EAAE,CAAC;QACT,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3C,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,CAAC;QAC7C,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,IAAI,GAAG,CAAC,CAAC;QAC/C,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC;QACvC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,YAAY,CAAC,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAwB,EAAE,KAAc;IAC9E,MAAM,CAAC,cAAc,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1F,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,IAAI,GAAG,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IACxE,CAAC;SAAM,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QAC/B,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,gCAAgC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,yDAAyD,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACzI,IAAI,CAAC,oGAAoG,CAAC,CAAC;IAC7G,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAwB;IAC5D,MAAM,CAAC,WAAW,CAAC,CAAC;IACpB,MAAM,OAAO,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,kCAAkC,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC;QAC7D,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC;QACjE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC/B,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACzB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3B,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjN,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAClK,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/commands/misc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ninedeploy notifications {list,create-webhook,test,rm}` — operator
|
|
3
|
+
* UI for the notification channel registry. PR #49 (G-06) adds
|
|
4
|
+
* the HMAC + body-template fields for the `webhook` channel type;
|
|
5
|
+
* the other types (slack, discord, telegram, ntfy, email) keep
|
|
6
|
+
* their existing surface and accept an opaque `configJson` blob.
|
|
7
|
+
*/
|
|
8
|
+
import type { NineDeployClient } from '../client.js';
|
|
9
|
+
/** `ninedeploy notifications list` */
|
|
10
|
+
export declare function notificationsList(client: NineDeployClient): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* `ninedeploy notifications create-webhook <name> <url> [--secret s]
|
|
13
|
+
* [--header h] [--algo sha256|sha1]
|
|
14
|
+
* [--template k=v ...]`
|
|
15
|
+
*
|
|
16
|
+
* The `webhook` channel type is the G-06 outbound integration
|
|
17
|
+
* (HMAC-signed POST). The CLI builds a `configJson` blob from
|
|
18
|
+
* the flags and sends it through the existing channel create
|
|
19
|
+
* endpoint. `--template` accepts a flat key=value list (e.g.
|
|
20
|
+
* `--template title=Deploy message='${event} done'`) and
|
|
21
|
+
* assembles a JSON object that the server's `renderWebhookBody`
|
|
22
|
+
* expands at send time.
|
|
23
|
+
*/
|
|
24
|
+
export declare function notificationsCreateWebhook(client: NineDeployClient, name: string, url: string, opts?: {
|
|
25
|
+
secret?: string;
|
|
26
|
+
header?: string;
|
|
27
|
+
algo?: 'sha256' | 'sha1';
|
|
28
|
+
eventFilter?: string;
|
|
29
|
+
template?: string[];
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* `ninedeploy notifications create-fcm <name> <deviceToken>
|
|
33
|
+
* --service-account <file>`
|
|
34
|
+
*
|
|
35
|
+
* The `fcm` channel type is the G-22 push-notification
|
|
36
|
+
* integration (Firebase Cloud Messaging HTTP v1). The
|
|
37
|
+
* device token is the FCM registration token of a
|
|
38
|
+
* target device; the service account JSON is the file
|
|
39
|
+
* Firebase issues when the operator creates a project
|
|
40
|
+
* service account with the `Firebase Cloud Messaging
|
|
41
|
+
* API` role. The CLI reads the file from disk so the
|
|
42
|
+
* service account never lands on the operator's shell
|
|
43
|
+
* history.
|
|
44
|
+
*
|
|
45
|
+
* Caveat: the service account's `private_key` is a PEM
|
|
46
|
+
* block; the SDK will store the rendered `configJson`
|
|
47
|
+
* encrypted at rest by `notificationChannels`. Treat
|
|
48
|
+
* the service account JSON as a secret — same posture
|
|
49
|
+
* as an SMTP password.
|
|
50
|
+
*/
|
|
51
|
+
export declare function notificationsCreateFcm(client: NineDeployClient, name: string, deviceToken: string, opts: {
|
|
52
|
+
serviceAccount: string;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
/** `ninedeploy notifications test <id>` — fire a test event
|
|
55
|
+
* through the channel so the operator can verify wiring. */
|
|
56
|
+
export declare function notificationsTest(client: NineDeployClient, idStr: string): Promise<void>;
|
|
57
|
+
/** `ninedeploy notifications rm <id>` */
|
|
58
|
+
export declare function notificationsRemove(client: NineDeployClient, idStr: string): Promise<void>;
|
|
59
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAgBrD,sCAAsC;AACtC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,GACL,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;6DAC6D;AAC7D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9F;AAED,yCAAyC;AACzC,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhG"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { c, error, header, info, spinner, success, table } from '../lib/format.js';
|
|
2
|
+
const num = (v, usage) => {
|
|
3
|
+
const n = Number(v);
|
|
4
|
+
if (!n) {
|
|
5
|
+
error(usage);
|
|
6
|
+
throw new Error(usage);
|
|
7
|
+
}
|
|
8
|
+
return n;
|
|
9
|
+
};
|
|
10
|
+
const fail = (err) => {
|
|
11
|
+
error(err instanceof Error ? err.message : String(err));
|
|
12
|
+
};
|
|
13
|
+
/** `ninedeploy notifications list` */
|
|
14
|
+
export async function notificationsList(client) {
|
|
15
|
+
header('Notification Channels');
|
|
16
|
+
const rows = await spinner('Fetching', () => client.notifications.listChannels());
|
|
17
|
+
if (rows.length === 0) {
|
|
18
|
+
info('No notification channels configured.');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
table(rows.map((r) => ({
|
|
22
|
+
id: r.id,
|
|
23
|
+
name: r.name,
|
|
24
|
+
type: r.type,
|
|
25
|
+
events: r.eventFilter || c.dim('(all)'),
|
|
26
|
+
active: r.active ? 'yes' : 'no',
|
|
27
|
+
})), ['id', 'name', 'type', 'events', 'active']);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* `ninedeploy notifications create-webhook <name> <url> [--secret s]
|
|
31
|
+
* [--header h] [--algo sha256|sha1]
|
|
32
|
+
* [--template k=v ...]`
|
|
33
|
+
*
|
|
34
|
+
* The `webhook` channel type is the G-06 outbound integration
|
|
35
|
+
* (HMAC-signed POST). The CLI builds a `configJson` blob from
|
|
36
|
+
* the flags and sends it through the existing channel create
|
|
37
|
+
* endpoint. `--template` accepts a flat key=value list (e.g.
|
|
38
|
+
* `--template title=Deploy message='${event} done'`) and
|
|
39
|
+
* assembles a JSON object that the server's `renderWebhookBody`
|
|
40
|
+
* expands at send time.
|
|
41
|
+
*/
|
|
42
|
+
export async function notificationsCreateWebhook(client, name, url, opts = {}) {
|
|
43
|
+
if (!name || !url) {
|
|
44
|
+
error('Usage: ninedeploy notifications create-webhook <name> <url> [--secret s] [--header h] [--algo sha256|sha1] [--template k=v ...]');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const config = {};
|
|
48
|
+
if (opts.secret)
|
|
49
|
+
config.secret = opts.secret;
|
|
50
|
+
if (opts.header)
|
|
51
|
+
config.headerName = opts.header;
|
|
52
|
+
if (opts.algo)
|
|
53
|
+
config.algorithm = opts.algo;
|
|
54
|
+
if (opts.template && opts.template.length > 0) {
|
|
55
|
+
const tpl = {};
|
|
56
|
+
for (const raw of opts.template) {
|
|
57
|
+
const eq = raw.indexOf('=');
|
|
58
|
+
if (eq <= 0) {
|
|
59
|
+
error(`--template expects key=value pairs, got: ${raw}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
tpl[raw.slice(0, eq)] = raw.slice(eq + 1);
|
|
63
|
+
}
|
|
64
|
+
config.template = tpl;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const ch = await client.notifications.createChannel({
|
|
68
|
+
name,
|
|
69
|
+
type: 'webhook',
|
|
70
|
+
target: url,
|
|
71
|
+
eventFilter: opts.eventFilter,
|
|
72
|
+
configJson: Object.keys(config).length > 0 ? JSON.stringify(config) : undefined,
|
|
73
|
+
});
|
|
74
|
+
success(`Webhook channel "${ch.name}" created (id: ${ch.id}).`);
|
|
75
|
+
if (opts.secret) {
|
|
76
|
+
info(`HMAC signature header: ${opts.header ?? 'X-NineDeploy-Signature'} (${opts.algo ?? 'sha256'})`);
|
|
77
|
+
}
|
|
78
|
+
if (opts.template && opts.template.length > 0) {
|
|
79
|
+
info(`Custom body template: ${opts.template.length} field(s)`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
fail(err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* `ninedeploy notifications create-fcm <name> <deviceToken>
|
|
88
|
+
* --service-account <file>`
|
|
89
|
+
*
|
|
90
|
+
* The `fcm` channel type is the G-22 push-notification
|
|
91
|
+
* integration (Firebase Cloud Messaging HTTP v1). The
|
|
92
|
+
* device token is the FCM registration token of a
|
|
93
|
+
* target device; the service account JSON is the file
|
|
94
|
+
* Firebase issues when the operator creates a project
|
|
95
|
+
* service account with the `Firebase Cloud Messaging
|
|
96
|
+
* API` role. The CLI reads the file from disk so the
|
|
97
|
+
* service account never lands on the operator's shell
|
|
98
|
+
* history.
|
|
99
|
+
*
|
|
100
|
+
* Caveat: the service account's `private_key` is a PEM
|
|
101
|
+
* block; the SDK will store the rendered `configJson`
|
|
102
|
+
* encrypted at rest by `notificationChannels`. Treat
|
|
103
|
+
* the service account JSON as a secret — same posture
|
|
104
|
+
* as an SMTP password.
|
|
105
|
+
*/
|
|
106
|
+
export async function notificationsCreateFcm(client, name, deviceToken, opts) {
|
|
107
|
+
if (!name || !deviceToken || !opts.serviceAccount) {
|
|
108
|
+
error('Usage: ninedeploy notifications create-fcm <name> <deviceToken> --service-account <file.json>');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const fs = await import('node:fs/promises');
|
|
112
|
+
let sa;
|
|
113
|
+
try {
|
|
114
|
+
sa = await fs.readFile(opts.serviceAccount, 'utf8');
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
error(`Failed to read service account JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const ch = await client.notifications.createChannel({
|
|
122
|
+
name,
|
|
123
|
+
type: 'fcm',
|
|
124
|
+
target: deviceToken,
|
|
125
|
+
configJson: sa,
|
|
126
|
+
});
|
|
127
|
+
success(`FCM channel "${ch.name}" created (id: ${ch.id}).`);
|
|
128
|
+
info('Send a test event with `ninedeploy notifications test <id>` to verify wiring.');
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
fail(err);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** `ninedeploy notifications test <id>` — fire a test event
|
|
135
|
+
* through the channel so the operator can verify wiring. */
|
|
136
|
+
export async function notificationsTest(client, idStr) {
|
|
137
|
+
const id = num(idStr, 'Usage: ninedeploy notifications test <id>');
|
|
138
|
+
try {
|
|
139
|
+
await client.notifications.testChannel(id);
|
|
140
|
+
success(`Test event fired through channel #${id}.`);
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
fail(err);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** `ninedeploy notifications rm <id>` */
|
|
147
|
+
export async function notificationsRemove(client, idStr) {
|
|
148
|
+
const id = num(idStr, 'Usage: ninedeploy notifications rm <id>');
|
|
149
|
+
try {
|
|
150
|
+
await client.notifications.removeChannel(id);
|
|
151
|
+
success(`Channel #${id} removed.`);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
fail(err);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ninedeploy databases pgbouncer <dbId> <action>` — G-32
|
|
3
|
+
* PgBouncer sidecar. Only the `postgres` engine is
|
|
4
|
+
* supported; the server returns 422 for any other engine.
|
|
5
|
+
*
|
|
6
|
+
* Actions:
|
|
7
|
+
* - enable : start a co-located pgbouncer container and
|
|
8
|
+
* stamp the row.
|
|
9
|
+
* - disable : stop + remove the sidecar, clear the row.
|
|
10
|
+
* - status : print the current sidecar state and the
|
|
11
|
+
* pooled connection string.
|
|
12
|
+
*/
|
|
13
|
+
import type { NineDeployClient } from '../client.js';
|
|
14
|
+
export declare function databasePgbouncer(client: NineDeployClient, dbIdStr: string, action: string, opts?: {
|
|
15
|
+
port?: number;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=pgbouncer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgbouncer.d.ts","sourceRoot":"","sources":["../../src/commands/pgbouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAYrD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { c, error, header, info, spinner, success } from '../lib/format.js';
|
|
2
|
+
const num = (v, usage) => {
|
|
3
|
+
const n = Number(v);
|
|
4
|
+
if (!n) {
|
|
5
|
+
error(usage);
|
|
6
|
+
throw new Error(usage);
|
|
7
|
+
}
|
|
8
|
+
return n;
|
|
9
|
+
};
|
|
10
|
+
export async function databasePgbouncer(client, dbIdStr, action, opts = {}) {
|
|
11
|
+
const dbId = num(dbIdStr, 'Usage: ninedeploy databases pgbouncer <dbId> <enable|disable|status>');
|
|
12
|
+
const normalized = action.toLowerCase();
|
|
13
|
+
if (!['enable', 'disable', 'status'].includes(normalized)) {
|
|
14
|
+
error('Action must be one of: enable, disable, status');
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (normalized === 'enable') {
|
|
19
|
+
const res = await spinner('Starting PgBouncer sidecar', () => client.databases.enablePgbouncer(dbId, opts.port ? { port: opts.port } : {}));
|
|
20
|
+
success(`PgBouncer sidecar started on port ${res.port}.`);
|
|
21
|
+
info(`Connection URL: ${res.pooledConnectionString ?? '(pending)'}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (normalized === 'disable') {
|
|
25
|
+
const res = await spinner('Stopping PgBouncer sidecar', () => client.databases.disablePgbouncer(dbId));
|
|
26
|
+
success('PgBouncer sidecar stopped.');
|
|
27
|
+
if (res.enabled)
|
|
28
|
+
info(`Sidecar still reporting enabled: ${res.containerName ?? '(unknown)'}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// status
|
|
32
|
+
const res = await spinner('Reading sidecar status', () => client.databases.pgbouncerStatus(dbId));
|
|
33
|
+
header('PgBouncer sidecar');
|
|
34
|
+
info(`Enabled: ${res.enabled ? 'yes' : 'no'}`);
|
|
35
|
+
info(`Container: ${res.containerName ?? c.dim('(none)')}`);
|
|
36
|
+
info(`Port: ${res.port}`);
|
|
37
|
+
info(`Running: ${res.running ? 'yes' : c.yellow('no — enabled but container is down')}`);
|
|
38
|
+
if (res.poolMode)
|
|
39
|
+
info(`Pool mode: ${res.poolMode}`);
|
|
40
|
+
if (res.pooledConnectionString) {
|
|
41
|
+
console.log();
|
|
42
|
+
info(`Pooled URL (use this for new attachments):`);
|
|
43
|
+
console.log(` ${c.cyan(res.pooledConnectionString)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=pgbouncer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgbouncer.js","sourceRoot":"","sources":["../../src/commands/pgbouncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { NineDeployClient } from '@ninedeploy/sdk';
|
|
2
2
|
export declare function pluginsList(client: NineDeployClient): Promise<void>;
|
|
3
3
|
export declare function pluginsMarketplace(client: NineDeployClient): Promise<void>;
|
|
4
|
+
/** `ninedeploy plugins marketplace refresh` — bypass the
|
|
5
|
+
* 5-minute cache and re-fetch the live signed index. */
|
|
6
|
+
export declare function pluginsMarketplaceRefresh(client: NineDeployClient): Promise<void>;
|
|
4
7
|
export declare function pluginsInstall(client: NineDeployClient, target: string, opts: {
|
|
5
8
|
source?: 'marketplace' | 'npm' | 'git' | 'local';
|
|
6
9
|
name?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/commands/plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,wBAAsB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChF;AAED;yDACyD;AACzD,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvF;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzG,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1F;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxF;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF"}
|
package/dist/commands/plugins.js
CHANGED
|
@@ -14,11 +14,24 @@ export async function pluginsList(client) {
|
|
|
14
14
|
})), ['id', 'name', 'version', 'type', 'status']);
|
|
15
15
|
}
|
|
16
16
|
export async function pluginsMarketplace(client) {
|
|
17
|
-
const { catalog } = await client.plugins.marketplace();
|
|
17
|
+
const { catalog, live, keyId, fetchedAt } = await client.plugins.marketplace();
|
|
18
18
|
if (catalog.length === 0) {
|
|
19
19
|
console.log(' Marketplace catalog is currently empty.');
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
|
+
// Surface the source (live signed index vs. static
|
|
23
|
+
// fallback) so the operator knows whether a planned
|
|
24
|
+
// install was discovered automatically or is a
|
|
25
|
+
// roadmap item.
|
|
26
|
+
const source = live
|
|
27
|
+
? `live signed index (key=${keyId ?? 'unknown'})`
|
|
28
|
+
: 'static fallback (upstream unreachable or NINEDEPLOY_MARKETPLACE_URL not set)';
|
|
29
|
+
console.log(` Source: ${source}`);
|
|
30
|
+
if (fetchedAt) {
|
|
31
|
+
const ageMin = Math.max(0, Math.round((Date.now() - fetchedAt) / 60_000));
|
|
32
|
+
console.log(` Fetched: ${ageMin} min ago`);
|
|
33
|
+
}
|
|
34
|
+
console.log();
|
|
22
35
|
table(catalog.map((c) => ({
|
|
23
36
|
id: c.id,
|
|
24
37
|
name: c.name,
|
|
@@ -28,6 +41,12 @@ export async function pluginsMarketplace(client) {
|
|
|
28
41
|
status: c.isInstalled ? '✓ Installed' : 'Available',
|
|
29
42
|
})), ['id', 'name', 'category', 'version', 'type', 'status']);
|
|
30
43
|
}
|
|
44
|
+
/** `ninedeploy plugins marketplace refresh` — bypass the
|
|
45
|
+
* 5-minute cache and re-fetch the live signed index. */
|
|
46
|
+
export async function pluginsMarketplaceRefresh(client) {
|
|
47
|
+
const res = await client.plugins.marketplace({ refresh: true });
|
|
48
|
+
console.log(` ✓ Refreshed (${res.catalog.length} entries, live=${res.live}, keyId=${res.keyId ?? 'n/a'}).`);
|
|
49
|
+
}
|
|
31
50
|
export async function pluginsInstall(client, target, opts) {
|
|
32
51
|
const source = opts.source ?? 'marketplace';
|
|
33
52
|
const res = await client.plugins.install({
|