@inquir/compute-cli 0.3.0 → 0.4.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 +223 -114
  2. package/dist/commands/admin-tenants.d.ts +11 -0
  3. package/dist/commands/admin-tenants.d.ts.map +1 -0
  4. package/dist/commands/admin-tenants.js +318 -0
  5. package/dist/commands/admin-tenants.js.map +1 -0
  6. package/dist/commands/admin.d.ts +2 -0
  7. package/dist/commands/admin.d.ts.map +1 -0
  8. package/dist/commands/admin.js +445 -0
  9. package/dist/commands/admin.js.map +1 -0
  10. package/dist/commands/apps-describe.d.ts +9 -0
  11. package/dist/commands/apps-describe.d.ts.map +1 -0
  12. package/dist/commands/apps-describe.js +118 -0
  13. package/dist/commands/apps-describe.js.map +1 -0
  14. package/dist/commands/apps-observability.d.ts +9 -0
  15. package/dist/commands/apps-observability.d.ts.map +1 -0
  16. package/dist/commands/apps-observability.js +281 -0
  17. package/dist/commands/apps-observability.js.map +1 -0
  18. package/dist/commands/apps-promote.d.ts +31 -0
  19. package/dist/commands/apps-promote.d.ts.map +1 -0
  20. package/dist/commands/apps-promote.js +115 -0
  21. package/dist/commands/apps-promote.js.map +1 -0
  22. package/dist/commands/apps-resources.d.ts +6 -0
  23. package/dist/commands/apps-resources.d.ts.map +1 -0
  24. package/dist/commands/apps-resources.js +107 -0
  25. package/dist/commands/apps-resources.js.map +1 -0
  26. package/dist/commands/apps.d.ts +25 -2
  27. package/dist/commands/apps.d.ts.map +1 -1
  28. package/dist/commands/apps.js +434 -66
  29. package/dist/commands/apps.js.map +1 -1
  30. package/dist/commands/config.d.ts.map +1 -1
  31. package/dist/commands/config.js +7 -3
  32. package/dist/commands/config.js.map +1 -1
  33. package/dist/commands/delete.d.ts.map +1 -1
  34. package/dist/commands/delete.js +10 -2
  35. package/dist/commands/delete.js.map +1 -1
  36. package/dist/commands/login.d.ts.map +1 -1
  37. package/dist/commands/login.js +78 -33
  38. package/dist/commands/login.js.map +1 -1
  39. package/dist/commands/logout.d.ts.map +1 -1
  40. package/dist/commands/logout.js +37 -5
  41. package/dist/commands/logout.js.map +1 -1
  42. package/dist/commands/mcp.d.ts +13 -0
  43. package/dist/commands/mcp.d.ts.map +1 -1
  44. package/dist/commands/mcp.js +184 -77
  45. package/dist/commands/mcp.js.map +1 -1
  46. package/dist/commands/projects.d.ts.map +1 -1
  47. package/dist/commands/projects.js +107 -11
  48. package/dist/commands/projects.js.map +1 -1
  49. package/dist/index.js +9 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/finite-source-command-client.d.ts +3 -0
  52. package/dist/lib/finite-source-command-client.d.ts.map +1 -0
  53. package/dist/lib/finite-source-command-client.js +3 -0
  54. package/dist/lib/finite-source-command-client.js.map +1 -0
  55. package/dist/lib/mcp-io.d.ts +23 -0
  56. package/dist/lib/mcp-io.d.ts.map +1 -0
  57. package/dist/lib/mcp-io.js +185 -0
  58. package/dist/lib/mcp-io.js.map +1 -0
  59. package/dist/lib/mcp-source-commands.d.ts +17 -0
  60. package/dist/lib/mcp-source-commands.d.ts.map +1 -0
  61. package/dist/lib/mcp-source-commands.js +345 -0
  62. package/dist/lib/mcp-source-commands.js.map +1 -0
  63. package/dist/utils/api.d.ts +19 -10
  64. package/dist/utils/api.d.ts.map +1 -1
  65. package/dist/utils/api.js +22 -4
  66. package/dist/utils/api.js.map +1 -1
  67. package/dist/utils/apps-presentation.d.ts +1 -1
  68. package/dist/utils/apps-presentation.d.ts.map +1 -1
  69. package/dist/utils/apps-presentation.js +10 -0
  70. package/dist/utils/apps-presentation.js.map +1 -1
  71. package/dist/utils/auth.d.ts +21 -1
  72. package/dist/utils/auth.d.ts.map +1 -1
  73. package/dist/utils/auth.js +119 -22
  74. package/dist/utils/auth.js.map +1 -1
  75. package/dist/utils/browser.d.ts +12 -0
  76. package/dist/utils/browser.d.ts.map +1 -1
  77. package/dist/utils/browser.js +37 -16
  78. package/dist/utils/browser.js.map +1 -1
  79. package/dist/utils/package-metadata.js +1 -1
  80. package/dist/utils/project-context.d.ts.map +1 -1
  81. package/dist/utils/project-context.js +7 -5
  82. package/dist/utils/project-context.js.map +1 -1
  83. package/dist/utils/project-lookup.d.ts +10 -0
  84. package/dist/utils/project-lookup.d.ts.map +1 -0
  85. package/dist/utils/project-lookup.js +52 -0
  86. package/dist/utils/project-lookup.js.map +1 -0
  87. package/package.json +10 -10
  88. package/skill/SKILL.md +9 -3
@@ -0,0 +1,445 @@
1
+ /**
2
+ * `inquir admin cluster ...`: the owner's control-plane commands
3
+ * (docs/roadmap/R4_MULTI_MASTER.md §6.2 "CLI"). They call /admin/v1/cluster
4
+ * with the platform admin token from INQUIR_ADMIN_TOKEN, never from a flag,
5
+ * so it stays out of shell history and process lists. Reads accept any admin
6
+ * token; changes need the full one, and the server audits every change.
7
+ *
8
+ * `inquir admin allocations relocate|relocation ...`: move one replica
9
+ * make-before-break (POST /v1/compute/allocations/:id/relocate) and follow it
10
+ * (GET /v1/compute/relocations/:operationId), with the same admin token.
11
+ *
12
+ * `inquir admin tenants ...` and `inquir admin containerd-tenants ...`: the
13
+ * automated tenant fabric migration and the containerd tenant allowlist
14
+ * (admin-tenants.ts).
15
+ *
16
+ * `inquir admin functions status|migrate|cool ...`: where a workspace's
17
+ * functions execute, moving them between the local pool and the allocation
18
+ * plane (a dry run unless --apply), and cooling one for a cold-start
19
+ * measurement (/admin/functions/execution, docs/COMPUTE_CONTROL_PLANE.md).
20
+ */
21
+ import os from 'node:os';
22
+ import { hasFlag, readFlagValue, readJsonFlag, readMultiFlag, readPositionalArgs } from '../utils/args.js';
23
+ import { resolveAuthConfig } from '../utils/auth.js';
24
+ import { buildApiOptions } from '../utils/context.js';
25
+ import { CliError, ExitCode, usageError } from '../utils/errors.js';
26
+ import { bold, dim, formatTable, printCommandHelp, printLine, printSuccess } from '../utils/output.js';
27
+ import { registerSecret } from '../utils/redact.js';
28
+ import { TENANT_HELP, TENANT_USAGE, TENANT_VALUE_FLAGS, containerdTenantsCommand, tenantsCommand } from './admin-tenants.js';
29
+ const VALUE_FLAGS = [
30
+ '--reason', '--host-id', '--machine-id', '--wg-address', '--legacy-runner-id', '--embedded-runner-id', '--target', '--to', '--function', '--limit',
31
+ ...TENANT_VALUE_FLAGS,
32
+ ];
33
+ const USAGE = [
34
+ 'admin cluster status [--json]',
35
+ 'admin cluster hold [--reason <text>]',
36
+ 'admin cluster release [--reason <text>]',
37
+ 'admin cluster move <memberId> [--reason <text>]',
38
+ 'admin cluster host register --host-id <id> --machine-id <id> --wg-address <ip> [--legacy-runner-id <id>] [--embedded-runner-id <id>]',
39
+ 'admin cluster grant <hostId> <capability>',
40
+ 'admin cluster revoke <hostId> <capability>',
41
+ 'admin allocations relocate <allocationId> --reason <text> [--target <runnerId>] [--json]',
42
+ 'admin allocations relocation <operationId> [--json]',
43
+ 'admin functions status <tenantId> [--json]',
44
+ 'admin functions migrate <tenantId> --to <distributed|pool> [--function <id>]... [--limit <n>] [--apply --reason <text>] [--json]',
45
+ 'admin functions cool <functionId> [--reason <text>] [--json]',
46
+ ...TENANT_USAGE,
47
+ ];
48
+ function printAdminHelp() {
49
+ printCommandHelp('admin', 'admin <cluster|allocations|functions|tenants|containerd-tenants> <command> [options]', [
50
+ 'cluster status Members, the controllers lease, hosts and grants (GET /admin/v1/cluster)',
51
+ 'cluster hold Set controllers_hold: the holder releases and nobody acquires',
52
+ 'cluster release Lift controllers_hold',
53
+ 'cluster move <member> Hand the controllers lease to a live, eligible member',
54
+ 'cluster host register Register (or re-register) a host and its /etc/machine-id',
55
+ 'cluster grant <h> <c> Grant a host capability (takes effect when that member restarts)',
56
+ 'cluster revoke <h> <c> Revoke a host capability',
57
+ 'allocations relocate <allocationId>',
58
+ ' Move one serving replica make-before-break: its replacement starts,',
59
+ ' takes the traffic, then the replica stops. --target names the runner',
60
+ ' (checked against every placement filter); without it placement chooses',
61
+ 'allocations relocation <operationId>',
62
+ ' Where that relocation is: placing, starting, ready, draining_source, completed',
63
+ 'functions status <tenantId>',
64
+ ' Each function: where it runs (pool or compute plane), why, its shadow app',
65
+ 'functions migrate <tenantId> --to <distributed|pool>',
66
+ ' Move a workspace\'s functions (or --function <id>, repeatable) between the local',
67
+ ' pool and the allocation plane, --limit at a time (default 5). A dry run unless',
68
+ ' --apply, which needs --reason; repeat until nothing remains',
69
+ 'functions cool <functionId>',
70
+ ' Scale it to zero now (compute plane) or drain its pool containers: the next',
71
+ ' invocation is a cold start (the latency harness uses this)',
72
+ ...TENANT_HELP,
73
+ '--reason <text> Why; recorded in the admin audit log (required to relocate or migrate)',
74
+ '--target <runnerId> The runner to relocate to',
75
+ '--json Machine-readable output',
76
+ '--api-url <url> The control plane, e.g. http://127.0.0.1:3000 on the host',
77
+ '',
78
+ 'Needs INQUIR_ADMIN_TOKEN (the ADMIN_TOKEN of the control plane; a read-only token can only read).',
79
+ ...USAGE.map((line) => ` inquir ${line}`),
80
+ ], [
81
+ 'INQUIR_ADMIN_TOKEN=... inquir admin cluster status --api-url http://127.0.0.1:3000',
82
+ 'inquir admin cluster hold --reason "switchover drill"',
83
+ 'inquir admin cluster host register --host-id vps3 --machine-id $(cat /etc/machine-id) --wg-address 10.44.0.5',
84
+ 'inquir admin cluster grant vps1 function-runtime',
85
+ 'inquir admin allocations relocate 0a44b8f1-... --target 1a0c2ff0-... --reason "etiquette replica to containerd"',
86
+ 'inquir admin allocations relocation 776ca0a6-...',
87
+ 'inquir admin functions migrate 1b720b64-... --to distributed',
88
+ 'inquir admin functions migrate 1b720b64-... --to distributed --apply --reason "move to runners"',
89
+ 'inquir admin functions migrate 1b720b64-... --to pool --function 0a44b8f1-... --apply --reason "rollback"',
90
+ 'inquir admin tenants migrate-fabric --batch --dry-run',
91
+ 'inquir admin tenants migrate-fabric 1b720b64-... --execute --allow-restarts --window-start 2026-09-29T21:00:00+03:00 --window-end 2026-09-30T01:00:00+03:00 --reason "wave 2"',
92
+ 'inquir admin containerd-tenants add 1b720b64-... --reason "FABRIC since 2026-09-27"',
93
+ ]);
94
+ }
95
+ async function callAdmin(args, request) {
96
+ const token = process.env.INQUIR_ADMIN_TOKEN?.trim();
97
+ if (!token) {
98
+ throw new CliError('INQUIR_ADMIN_TOKEN is not set', {
99
+ code: 'AUTH_REQUIRED',
100
+ exitCode: ExitCode.AUTH,
101
+ explanation: 'Cluster administration uses the platform admin token, not your login.',
102
+ fix: 'Export INQUIR_ADMIN_TOKEN with the control plane\'s ADMIN_TOKEN (or ADMIN_READONLY_TOKEN for status).',
103
+ });
104
+ }
105
+ registerSecret(token);
106
+ const { apiUrl } = await resolveAuthConfig(buildApiOptions(args));
107
+ const url = new URL(request.path, apiUrl.endsWith('/') ? apiUrl : `${apiUrl}/`);
108
+ const response = await fetch(url, {
109
+ method: request.method,
110
+ headers: {
111
+ 'X-Admin-Token': token,
112
+ Accept: 'application/json',
113
+ ...(request.body ? { 'Content-Type': 'application/json' } : {}),
114
+ },
115
+ ...(request.body ? { body: JSON.stringify(request.body) } : {}),
116
+ // The admin token must never follow a redirect to another origin.
117
+ redirect: 'error',
118
+ });
119
+ const text = await response.text();
120
+ let payload = {};
121
+ try {
122
+ payload = text ? JSON.parse(text) : {};
123
+ }
124
+ catch {
125
+ // Not JSON (a proxy's error page): reported below by status.
126
+ }
127
+ if (!response.ok) {
128
+ const error = (payload.error ?? {});
129
+ throw new CliError(error.message ?? `The control plane answered ${response.status}`, {
130
+ code: error.code ?? `HTTP_${response.status}`,
131
+ exitCode: response.status === 401 || response.status === 403 ? ExitCode.AUTH : ExitCode.ERROR,
132
+ ...(error.code === 'OWNER_ONLY' ? { fix: 'Use the full ADMIN_TOKEN; read-only and support tokens cannot change the cluster.' } : {}),
133
+ });
134
+ }
135
+ return payload;
136
+ }
137
+ function actor() {
138
+ let user = 'unknown';
139
+ try {
140
+ user = os.userInfo().username;
141
+ }
142
+ catch {
143
+ // no passwd entry
144
+ }
145
+ return `${user}@${os.hostname()}`.replace(/[^\w.@-]/g, '_').slice(0, 128);
146
+ }
147
+ function reasonOf(args) {
148
+ const reason = readFlagValue(args, '--reason');
149
+ return reason ? { reason } : {};
150
+ }
151
+ function secondsLeft(ms) {
152
+ return typeof ms === 'number' ? `${(ms / 1000).toFixed(1)} s left` : 'expired';
153
+ }
154
+ function printStatus(body) {
155
+ const self = body.self;
156
+ const lease = body.lease;
157
+ const settings = body.settings;
158
+ const database = body.database;
159
+ const members = (body.members ?? []);
160
+ const hosts = (body.hosts ?? []);
161
+ printLine(`${bold('Cluster')} ${body.clusterId ?? dim('(no identity row)')} ` +
162
+ dim(`database timeline ${database.timeline ?? '?'}${database.inRecovery ? ' (in recovery)' : ''}, now ${database.now}`));
163
+ const holding = self.holding;
164
+ printLine(`${bold('This process:')} ${self.mode} mode, ${self.memberId} on ${self.hostId}` +
165
+ (self.mode === 'cluster'
166
+ ? `, ${self.state}${holding ? `, holding ${holding.timeline}/${holding.token}` : ''}` +
167
+ `${Array.isArray(self.reasons) && self.reasons.length > 0 ? ` (${self.reasons.join(', ')})` : ''}`
168
+ : ''));
169
+ if (lease && lease.holderMember && Number(lease.validForMs) > 0) {
170
+ printLine(`${bold('Controllers:')} ${lease.holderMember} holds ${lease.tokenTimeline}/${lease.token}, ${secondsLeft(lease.validForMs)}` +
171
+ (lease.parkedSession ? ' (parked for its next session)' : ''));
172
+ }
173
+ else {
174
+ printLine(`${bold('Controllers:')} ${dim('not held')}${lease?.holderMember ? dim(` (last ${lease.holderMember}, ${lease.tokenTimeline}/${lease.token})`) : ''}`);
175
+ }
176
+ printLine(`${bold('Hold:')} ${settings.controllersHold ? 'ON (nobody acquires)' : 'off'}` +
177
+ (settings.move ? ` ${bold('Move:')} to ${settings.move.target} until ${settings.move.until}` : ''));
178
+ printLine('');
179
+ if (members.length === 0) {
180
+ printLine(dim('No members registered (every host runs CONTROL_PLANE_MODE=single).'));
181
+ }
182
+ else {
183
+ printLine(formatTable(members.map((m) => ({
184
+ MEMBER: String(m.memberId),
185
+ HOST: String(m.hostId),
186
+ LIVE: m.live ? 'yes' : 'no',
187
+ READY: m.ready ? 'yes' : 'no',
188
+ ELIGIBLE: m.eligible ? 'yes' : 'no',
189
+ NEAR: m.near ? 'yes' : 'no',
190
+ 'RTT ms': m.dbRttUs === null ? '' : (Number(m.dbRttUs) / 1000).toFixed(1),
191
+ 'SKEW ms': m.clockSkewMs === null ? '' : String(m.clockSkewMs),
192
+ 'LAG ms': m.loopLagMs === null ? '' : String(m.loopLagMs),
193
+ TIMELINE: m.timeline === null ? '' : String(m.timeline),
194
+ REASONS: Array.isArray(m.reasons) ? m.reasons.join(',') : '',
195
+ })), ['MEMBER', 'HOST', 'LIVE', 'READY', 'ELIGIBLE', 'NEAR', 'RTT ms', 'SKEW ms', 'LAG ms', 'TIMELINE', 'REASONS']));
196
+ }
197
+ printLine('');
198
+ if (hosts.length === 0) {
199
+ printLine(dim('No hosts registered: inquir admin cluster host register ...'));
200
+ }
201
+ else {
202
+ printLine(formatTable(hosts.map((h) => ({ HOST: h.hostId, 'MACHINE ID': h.machineId, WG: h.wgAddress, GRANTS: h.grants.map((g) => g.capability).join(',') })), ['HOST', 'MACHINE ID', 'WG', 'GRANTS']));
203
+ }
204
+ }
205
+ function describeRelocation(operation) {
206
+ const where = operation.replacement.runnerId ?? operation.replacement.targetRunnerId ?? 'a runner placement chooses';
207
+ const why = operation.replacement.failure ?? operation.replacement.abandonedBecause;
208
+ return `Relocation ${operation.operationId} of ${operation.sourceAllocationId}: ${operation.phase}` +
209
+ ` (replacement ${operation.replacement.observedState.toLowerCase()} on ${where}` +
210
+ `${operation.source ? `, source ${operation.source.observedState.toLowerCase()} on ${operation.source.runnerId ?? 'no runner'}` : ''})` +
211
+ `${why ? `: ${why}` : ''}${operation.done ? '' : dim(' - follow it with `inquir admin allocations relocation ' + operation.operationId + '`')}`;
212
+ }
213
+ async function allocationsCommand(args, action, rest, json) {
214
+ switch (action) {
215
+ case 'relocate': {
216
+ const [allocationId] = rest;
217
+ const reason = readFlagValue(args, '--reason')?.trim();
218
+ if (!allocationId || !reason)
219
+ throw usageError('relocate needs <allocationId> and --reason', `inquir ${USAGE[7]}`);
220
+ const target = readFlagValue(args, '--target')?.trim();
221
+ const body = await callAdmin(args, {
222
+ method: 'POST',
223
+ path: `v1/compute/allocations/${encodeURIComponent(allocationId)}/relocate`,
224
+ body: { reason, ...(target ? { targetRunnerId: target } : {}) },
225
+ });
226
+ if (json)
227
+ printLine(JSON.stringify(body, null, 2));
228
+ else
229
+ printSuccess(describeRelocation(body.operation));
230
+ return;
231
+ }
232
+ case 'relocation': {
233
+ const [operationId] = rest;
234
+ if (!operationId)
235
+ throw usageError('Missing <operationId>', `inquir ${USAGE[8]}`);
236
+ const body = await callAdmin(args, { method: 'GET', path: `v1/compute/relocations/${encodeURIComponent(operationId)}` });
237
+ if (json)
238
+ printLine(JSON.stringify(body, null, 2));
239
+ else
240
+ printLine(describeRelocation(body.operation));
241
+ return;
242
+ }
243
+ default:
244
+ throw usageError(`Unknown allocations subcommand: ${action ?? ''}`.trim(), 'inquir admin --help');
245
+ }
246
+ }
247
+ function routeLabel(route) {
248
+ if (route.target === 'pool')
249
+ return `pool (${route.reason ?? ''})`;
250
+ return route.legacy ? 'compute plane (FUNCTIONS_DISTRIBUTED)' : `compute plane${route.fallback === 'pre-dispatch' ? ' + pool fallback' : ''}`;
251
+ }
252
+ async function functionsCommand(args, action, rest, json) {
253
+ switch (action) {
254
+ case 'status': {
255
+ const [tenantId] = rest;
256
+ if (!tenantId)
257
+ throw usageError('Missing <tenantId>', `inquir ${USAGE[9]}`);
258
+ const body = await callAdmin(args, { method: 'GET', path: `admin/functions/execution?tenantId=${encodeURIComponent(tenantId)}` });
259
+ if (json) {
260
+ printLine(JSON.stringify(body, null, 2));
261
+ return;
262
+ }
263
+ const config = body.config;
264
+ printLine(`${bold('FUNCTIONS_EXECUTION')} ${config.mode} ${dim(`idle TTL ${config.idleTtlSeconds} s, max ${config.maxReplicas} replicas, fallback ${config.localFallback}`)}`);
265
+ const rows = (body.functions ?? []);
266
+ if (rows.length === 0) {
267
+ printLine(dim('No functions in this workspace.'));
268
+ return;
269
+ }
270
+ printLine(formatTable(rows.map((row) => ({
271
+ NAME: row.name,
272
+ RUNTIME: row.runtime,
273
+ MODE: row.executionMode ?? '-',
274
+ ROUTE: routeLabel(row.route),
275
+ REPLICAS: row.shadowApp ? `${row.shadowApp.servingReplicas}/${row.shadowApp.desiredReplicas}` : '',
276
+ DIGEST: row.shadowApp?.servingDigest
277
+ ? `${row.shadowApp.servingDigest.slice(0, 12)}${row.shadowApp.servingDigest === row.committedDigest ? '' : ' (stale)'}`
278
+ : '',
279
+ BLOCKERS: row.blockers.map((b) => b.code).join(','),
280
+ })), ['NAME', 'RUNTIME', 'MODE', 'ROUTE', 'REPLICAS', 'DIGEST', 'BLOCKERS']));
281
+ return;
282
+ }
283
+ case 'migrate': {
284
+ const [tenantId] = rest;
285
+ const to = readFlagValue(args, '--to');
286
+ if (!tenantId || (to !== 'distributed' && to !== 'pool')) {
287
+ throw usageError('migrate needs <tenantId> and --to distributed|pool', `inquir ${USAGE[10]}`);
288
+ }
289
+ const apply = hasFlag(args, '--apply');
290
+ const reason = readFlagValue(args, '--reason')?.trim();
291
+ if (apply && !reason)
292
+ throw usageError('--apply needs --reason', `inquir ${USAGE[10]}`);
293
+ const functionIds = readMultiFlag(args, '--function');
294
+ const limitRaw = readFlagValue(args, '--limit');
295
+ const limit = limitRaw === undefined ? undefined : Number(limitRaw);
296
+ if (limit !== undefined && (!Number.isInteger(limit) || limit < 1 || limit > 50)) {
297
+ throw usageError('--limit must be an integer from 1 to 50', `inquir ${USAGE[10]}`);
298
+ }
299
+ const body = await callAdmin(args, {
300
+ method: 'POST',
301
+ path: 'admin/functions/execution/migrate',
302
+ body: {
303
+ tenantId,
304
+ to,
305
+ dryRun: !apply,
306
+ ...(functionIds.length > 0 ? { functionIds } : {}),
307
+ ...(limit !== undefined ? { limit } : {}),
308
+ ...(reason ? { reason } : {}),
309
+ },
310
+ });
311
+ if (json) {
312
+ printLine(JSON.stringify(body, null, 2));
313
+ return;
314
+ }
315
+ const outcomes = (body.outcomes ?? []);
316
+ printLine(formatTable(outcomes.map((row) => ({
317
+ NAME: row.name || row.functionId,
318
+ ACTION: row.action,
319
+ DETAIL: row.reason ?? (row.releaseId ? `release ${row.releaseId.slice(0, 8)}` : ''),
320
+ 'TOOK ms': row.durationMs === undefined ? '' : String(row.durationMs),
321
+ })), ['NAME', 'ACTION', 'DETAIL', 'TOOK ms']));
322
+ const remaining = Number(body.remaining ?? 0);
323
+ if (!apply)
324
+ printLine(dim('Dry run: nothing changed. Add --apply --reason <text> to move them.'));
325
+ else if (remaining > 0)
326
+ printLine(`${remaining} more to move: run the same command again.`);
327
+ else
328
+ printSuccess(`Done: the workspace's functions are on ${to === 'distributed' ? 'the compute plane' : 'the local pool'} (skipped ones stay where they are)`);
329
+ return;
330
+ }
331
+ case 'cool': {
332
+ const [functionId] = rest;
333
+ if (!functionId)
334
+ throw usageError('Missing <functionId>', `inquir ${USAGE[11]}`);
335
+ const body = await callAdmin(args, {
336
+ method: 'POST',
337
+ path: `admin/functions/${encodeURIComponent(functionId)}/execution/cool`,
338
+ body: { ...reasonOf(args) },
339
+ });
340
+ if (json)
341
+ printLine(JSON.stringify(body, null, 2));
342
+ else
343
+ printSuccess(`${functionId} cooled on the ${body.executor === 'pool' ? 'local pool' : 'compute plane'}: the next invocation is a cold start`);
344
+ return;
345
+ }
346
+ default:
347
+ throw usageError(`Unknown functions subcommand: ${action ?? ''}`.trim(), 'inquir admin --help');
348
+ }
349
+ }
350
+ export async function adminCommand(args) {
351
+ const positionals = readPositionalArgs(args, { valueFlags: VALUE_FLAGS });
352
+ const [area, action, ...rest] = positionals;
353
+ if (hasFlag(args, '--help') || hasFlag(args, '-h') || !area) {
354
+ printAdminHelp();
355
+ return;
356
+ }
357
+ if (area === 'allocations')
358
+ return allocationsCommand(args, action, rest, readJsonFlag(args));
359
+ if (area === 'tenants')
360
+ return tenantsCommand(args, action, rest, readJsonFlag(args), callAdmin);
361
+ if (area === 'containerd-tenants')
362
+ return containerdTenantsCommand(args, action, rest, readJsonFlag(args), callAdmin);
363
+ if (area === 'functions')
364
+ return functionsCommand(args, action, rest, readJsonFlag(args));
365
+ if (area !== 'cluster')
366
+ throw usageError(`Unknown admin area: ${area}`, 'inquir admin --help');
367
+ const json = readJsonFlag(args);
368
+ const done = (body, message) => {
369
+ if (json)
370
+ printLine(JSON.stringify(body, null, 2));
371
+ else
372
+ printSuccess(message);
373
+ };
374
+ switch (action) {
375
+ case undefined:
376
+ case 'status': {
377
+ const body = await callAdmin(args, { method: 'GET', path: 'admin/v1/cluster' });
378
+ if (json)
379
+ printLine(JSON.stringify(body, null, 2));
380
+ else
381
+ printStatus(body);
382
+ return;
383
+ }
384
+ case 'hold': {
385
+ const body = await callAdmin(args, { method: 'POST', path: 'admin/v1/cluster/hold', body: { ...reasonOf(args), actor: actor() } });
386
+ done(body, 'controllers_hold is set: the holder releases and nobody acquires until `inquir admin cluster release`');
387
+ return;
388
+ }
389
+ case 'release': {
390
+ const body = await callAdmin(args, { method: 'POST', path: 'admin/v1/cluster/release', body: { ...reasonOf(args), actor: actor() } });
391
+ done(body, body.wasHeld ? 'controllers_hold lifted' : 'controllers_hold was not set');
392
+ return;
393
+ }
394
+ case 'move': {
395
+ const [memberId] = rest;
396
+ if (!memberId)
397
+ throw usageError('Missing <memberId>', `inquir ${USAGE[3]}`);
398
+ const body = await callAdmin(args, { method: 'POST', path: 'admin/v1/cluster/move', body: { memberId, ...reasonOf(args), actor: actor() } });
399
+ done(body, `The controllers lease moves to ${memberId} (the request lasts until ${body.until})`);
400
+ return;
401
+ }
402
+ case 'host': {
403
+ if (rest[0] !== 'register')
404
+ throw usageError(`Unknown host subcommand: ${rest[0] ?? ''}`.trim(), `inquir ${USAGE[4]}`);
405
+ const hostId = readFlagValue(args, '--host-id');
406
+ const machineId = readFlagValue(args, '--machine-id');
407
+ const wgAddress = readFlagValue(args, '--wg-address');
408
+ if (!hostId || !machineId || !wgAddress) {
409
+ throw usageError('host register needs --host-id, --machine-id and --wg-address', `inquir ${USAGE[4]}`);
410
+ }
411
+ const legacyRunnerId = readFlagValue(args, '--legacy-runner-id');
412
+ const embeddedRunnerId = readFlagValue(args, '--embedded-runner-id');
413
+ const body = await callAdmin(args, {
414
+ method: 'POST',
415
+ path: 'admin/v1/cluster/hosts',
416
+ body: {
417
+ hostId,
418
+ machineId: machineId.trim().toLowerCase(),
419
+ wgAddress,
420
+ ...(legacyRunnerId ? { legacyRunnerId } : {}),
421
+ ...(embeddedRunnerId ? { embeddedRunnerId } : {}),
422
+ actor: actor(),
423
+ },
424
+ });
425
+ done(body, `Host ${hostId} ${body.created ? 'registered' : 're-registered'}`);
426
+ return;
427
+ }
428
+ case 'grant':
429
+ case 'revoke': {
430
+ const [hostId, capability] = rest;
431
+ if (!hostId || !capability)
432
+ throw usageError(`Missing <hostId> or <capability>`, `inquir ${action === 'grant' ? USAGE[5] : USAGE[6]}`);
433
+ const body = action === 'grant'
434
+ ? await callAdmin(args, { method: 'POST', path: `admin/v1/cluster/hosts/${encodeURIComponent(hostId)}/grants`, body: { capability, actor: actor() } })
435
+ : await callAdmin(args, { method: 'DELETE', path: `admin/v1/cluster/hosts/${encodeURIComponent(hostId)}/grants/${encodeURIComponent(capability)}` });
436
+ const changed = action === 'grant' ? body.granted : body.revoked;
437
+ done(body, `${capability} ${action === 'grant' ? (changed ? 'granted to' : 'was already granted to') : (changed ? 'revoked from' : 'was not granted to')} ${hostId}; ` +
438
+ 'it takes effect when that host\'s member restarts');
439
+ return;
440
+ }
441
+ default:
442
+ throw usageError(`Unknown cluster subcommand: ${action}`, 'inquir admin cluster --help');
443
+ }
444
+ }
445
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/commands/admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type AppCondition, type AppDescribeResponse } from '../sdk.js';
2
+ import { type ApiRequestOptions } from '../utils/api.js';
3
+ export declare const DESCRIBE_HELP: Record<string, string[]>;
4
+ /** A condition worth a line: not in the state a healthy, settled object reports. */
5
+ export declare function notable(condition: AppCondition): boolean;
6
+ /** `apps describe <app>`: the K4 conditions view. */
7
+ export declare function describeSubcommand(args: string[], positionals: string[], options: ApiRequestOptions): Promise<void>;
8
+ export declare function printDescription(result: AppDescribeResponse): void;
9
+ //# sourceMappingURL=apps-describe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps-describe.d.ts","sourceRoot":"","sources":["../../src/commands/apps-describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAAoD,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAK3G,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAUlD,CAAC;AAEF,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAUxD;AA2BD,qDAAqD;AACrD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CASzH;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CA2DlE"}
@@ -0,0 +1,118 @@
1
+ import { describeApp } from '../sdk.js';
2
+ import { createApiClient, requireAuth, resolveApplication } from '../utils/api.js';
3
+ import { readJsonFlag } from '../utils/args.js';
4
+ import { usageError } from '../utils/errors.js';
5
+ import { formatTable, printInfo, printLine } from '../utils/output.js';
6
+ export const DESCRIBE_HELP = {
7
+ describe: [
8
+ 'Usage: inquir apps describe <app> [--json]',
9
+ ' Why the application is (not) running, without reading logs: conditions',
10
+ ' (Scheduled, Ready, Progressing, Degraded, Cordoned) of the application, of its',
11
+ ' releases and replica attempts that need attention, and of the runners they are',
12
+ ' on; placement refusals with the runners\' reasons, failed health checks, pending',
13
+ ' cleanup, plan-capacity refusals and the recent events. Read-only.',
14
+ ' --json Everything, including the healthy releases and attempts',
15
+ ],
16
+ };
17
+ /** A condition worth a line: not in the state a healthy, settled object reports. */
18
+ export function notable(condition) {
19
+ switch (condition.type) {
20
+ case 'Scheduled':
21
+ case 'Ready':
22
+ return condition.status !== 'True';
23
+ case 'Progressing':
24
+ case 'Degraded':
25
+ case 'Cordoned':
26
+ return condition.status !== 'False';
27
+ }
28
+ }
29
+ const short = (id) => (id ? id.slice(0, 8) : '-');
30
+ function conditionRows(conditions) {
31
+ return conditions.map((condition) => ({
32
+ condition: condition.type,
33
+ status: condition.status,
34
+ reason: condition.reason,
35
+ message: condition.message,
36
+ }));
37
+ }
38
+ /** The notable conditions of one object, as `Reason: message` lines. */
39
+ function why(conditions) {
40
+ const lines = conditions.filter(notable).map((condition) => `${condition.type}=${condition.status} ${condition.reason}: ${condition.message}`);
41
+ return lines.length ? lines.join('; ') : 'ok';
42
+ }
43
+ function eventText(event) {
44
+ const payload = event.payload ?? {};
45
+ const message = typeof payload.message === 'string' ? payload.message
46
+ : typeof payload.status === 'string' ? `${String(payload.releaseId ?? '').slice(0, 8)} -> ${payload.status}`
47
+ : '';
48
+ return message;
49
+ }
50
+ /** `apps describe <app>`: the K4 conditions view. */
51
+ export async function describeSubcommand(args, positionals, options) {
52
+ const [identifier, ...extra] = positionals;
53
+ if (!identifier || extra.length > 0)
54
+ throw usageError('Specify one application', 'inquir apps describe <app>');
55
+ await requireAuth(options);
56
+ const app = await resolveApplication(identifier, options);
57
+ const client = await createApiClient(options);
58
+ const result = await describeApp(client, app.id);
59
+ if (readJsonFlag(args))
60
+ return printLine(JSON.stringify(result, null, 2));
61
+ printDescription(result);
62
+ }
63
+ export function printDescription(result) {
64
+ const { application } = result;
65
+ const replicas = application.replicas;
66
+ const ready = replicas.ready === null ? '?' : String(replicas.ready);
67
+ printInfo(`${application.name} (${application.id}): ${ready} of ${application.desiredReplicas} replicas ready, ` +
68
+ `production release ${short(application.productionReleaseId)}`);
69
+ printLine(formatTable(conditionRows(application.conditions), ['condition', 'status', 'reason', 'message']));
70
+ const releases = result.releases.filter((release) => release.production || release.conditions.some(notable));
71
+ if (releases.length > 0) {
72
+ printInfo('Releases:');
73
+ printLine(formatTable(releases.map((release) => ({
74
+ release: `${short(release.id)}${release.production ? ' (production)' : ''}`,
75
+ status: release.status,
76
+ why: why(release.conditions),
77
+ })), ['release', 'status', 'why']));
78
+ }
79
+ const attempts = result.allocations.filter((allocation) => allocation.conditions.some(notable));
80
+ if (attempts.length > 0) {
81
+ printInfo('Replica attempts that need attention:');
82
+ printLine(formatTable(attempts.map((allocation) => ({
83
+ attempt: short(allocation.id),
84
+ release: short(allocation.releaseId),
85
+ replica: `${allocation.replicaIndex}#${allocation.incarnation}`,
86
+ state: allocation.observedState,
87
+ runner: allocation.runnerId ?? '-',
88
+ why: why(allocation.conditions),
89
+ })), ['attempt', 'release', 'replica', 'state', 'runner', 'why']));
90
+ }
91
+ if (result.runners.length > 0) {
92
+ printInfo('Runners:');
93
+ printLine(formatTable(result.runners.map((runner) => ({
94
+ runner: runner.id,
95
+ engine: runner.provider,
96
+ state: `${runner.desiredState}/${runner.observedState}`,
97
+ why: why(runner.conditions),
98
+ })), ['runner', 'engine', 'state', 'why']));
99
+ }
100
+ const plan = result.workspace.planCapacity;
101
+ if (plan?.pool) {
102
+ const usage = plan.usage;
103
+ const used = usage
104
+ ? `${usage.cpuMillis}/${plan.pool.cpuMillis} mCPU, ${usage.memoryMb}/${plan.pool.memoryMb} MB, ${usage.replicas}/${plan.pool.replicas} replicas`
105
+ : `${plan.pool.cpuMillis} mCPU, ${plan.pool.memoryMb} MB, ${plan.pool.replicas} replicas`;
106
+ const full = plan.exhausted.length ? `; full: ${plan.exhausted.join(', ')}` : '';
107
+ printInfo(`Plan capacity (${plan.pool.planCode}, ${plan.mode}): ${used}${full}`);
108
+ }
109
+ if (result.events.length > 0) {
110
+ printInfo('Recent events:');
111
+ printLine(formatTable(result.events.slice(0, 10).map((event) => ({
112
+ time: event.createdAt,
113
+ event: event.type,
114
+ detail: eventText(event),
115
+ })), ['time', 'event', 'detail']));
116
+ }
117
+ }
118
+ //# sourceMappingURL=apps-describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps-describe.js","sourceRoot":"","sources":["../../src/commands/apps-describe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type AppObservationRange } from '../sdk.js';
2
+ import { type ApiRequestOptions } from '../utils/api.js';
3
+ export declare const OBSERVATION_VALUE_FLAGS: string[];
4
+ export declare const OBSERVATION_HELP: Record<string, string[]>;
5
+ export declare function observationRange(args: string[], retentionDays?: number, now?: number): Required<AppObservationRange>;
6
+ export declare function metricsSubcommand(args: string[], positionals: string[], options: ApiRequestOptions): Promise<void>;
7
+ export declare function logHistorySubcommand(args: string[], positionals: string[], options: ApiRequestOptions): Promise<void>;
8
+ export declare function alertsSubcommand(args: string[], positionals: string[], options: ApiRequestOptions): Promise<void>;
9
+ //# sourceMappingURL=apps-observability.d.ts.map