@skrr-ai/cli 0.1.47 → 0.1.48
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/README.md +1 -1
- package/dist/base-command.d.ts +18 -0
- package/dist/base-command.js +61 -1
- package/dist/commands/agents/chat.d.ts +21 -0
- package/dist/commands/agents/chat.js +26 -9
- package/dist/commands/balance/usage/breakdown.d.ts +14 -0
- package/dist/commands/balance/usage/breakdown.js +68 -0
- package/dist/commands/balance/usage.js +24 -0
- package/dist/commands/commerce/entitlements/explain.d.ts +22 -0
- package/dist/commands/commerce/entitlements/explain.js +40 -0
- package/dist/commands/commerce/incidents/audit.d.ts +20 -0
- package/dist/commands/commerce/incidents/audit.js +37 -0
- package/dist/commands/commerce/incidents/list.d.ts +22 -0
- package/dist/commands/commerce/incidents/list.js +49 -0
- package/dist/commands/commerce/incidents/resolve.d.ts +23 -0
- package/dist/commands/commerce/incidents/resolve.js +45 -0
- package/dist/commands/commerce/incidents/retry.d.ts +22 -0
- package/dist/commands/commerce/incidents/retry.js +45 -0
- package/dist/commands/commerce/incidents/show.d.ts +13 -0
- package/dist/commands/commerce/incidents/show.js +30 -0
- package/dist/commands/commerce/offers/approve.d.ts +17 -0
- package/dist/commands/commerce/offers/approve.js +33 -0
- package/dist/commands/commerce/offers/create.d.ts +18 -0
- package/dist/commands/commerce/offers/create.js +34 -0
- package/dist/commands/commerce/offers/publish.d.ts +13 -0
- package/dist/commands/commerce/offers/publish.js +28 -0
- package/dist/commands/commerce/offers/retire.d.ts +17 -0
- package/dist/commands/commerce/offers/retire.js +32 -0
- package/dist/commands/commerce/offers/validate.d.ts +18 -0
- package/dist/commands/commerce/offers/validate.js +33 -0
- package/dist/commands/commerce/products/create.d.ts +10 -0
- package/dist/commands/commerce/products/create.js +25 -0
- package/dist/commands/commerce/promotions/redeem.d.ts +13 -0
- package/dist/commands/commerce/promotions/redeem.js +32 -0
- package/dist/commands/commerce/terms/accept.d.ts +18 -0
- package/dist/commands/commerce/terms/accept.js +39 -0
- package/dist/commands/commerce/terms/show.d.ts +10 -0
- package/dist/commands/commerce/terms/show.js +34 -0
- package/dist/commands/commerce/trials/conversion-preview.d.ts +18 -0
- package/dist/commands/commerce/trials/conversion-preview.js +39 -0
- package/dist/commands/commerce/trials/start.d.ts +23 -0
- package/dist/commands/commerce/trials/start.js +58 -0
- package/dist/commands/commitments/accounting.d.ts +39 -0
- package/dist/commands/commitments/accounting.js +116 -0
- package/dist/commands/commitments/action-history.d.ts +1 -0
- package/dist/commands/commitments/action-history.js +8 -1
- package/dist/commands/commitments/case.d.ts +1 -0
- package/dist/commands/commitments/case.js +19 -3
- package/dist/commands/commitments/cases.d.ts +1 -0
- package/dist/commands/commitments/cases.js +11 -1
- package/dist/commands/commitments/checks.d.ts +1 -0
- package/dist/commands/commitments/checks.js +5 -1
- package/dist/commands/commitments/cost.d.ts +62 -0
- package/dist/commands/commitments/cost.js +130 -0
- package/dist/commands/commitments/create.js +1 -1
- package/dist/commands/commitments/delete.d.ts +1 -0
- package/dist/commands/commitments/delete.js +56 -6
- package/dist/commands/commitments/feedback.js +9 -1
- package/dist/commands/commitments/handover.js +16 -0
- package/dist/commands/commitments/hypotheses.d.ts +1 -0
- package/dist/commands/commitments/hypotheses.js +17 -2
- package/dist/commands/commitments/links/list.js +4 -1
- package/dist/commands/commitments/liveness.d.ts +18 -0
- package/dist/commands/commitments/liveness.js +80 -0
- package/dist/commands/commitments/metrics.d.ts +1 -0
- package/dist/commands/commitments/metrics.js +8 -1
- package/dist/commands/commitments/next-tick.d.ts +39 -0
- package/dist/commands/commitments/next-tick.js +122 -0
- package/dist/commands/commitments/observations.d.ts +1 -0
- package/dist/commands/commitments/observations.js +19 -2
- package/dist/commands/commitments/pause.js +12 -0
- package/dist/commands/commitments/receipt.d.ts +2 -0
- package/dist/commands/commitments/receipt.js +16 -2
- package/dist/commands/commitments/remediation-proposal.js +6 -2
- package/dist/commands/commitments/remediation-proposals.js +5 -1
- package/dist/commands/commitments/restore.d.ts +25 -0
- package/dist/commands/commitments/restore.js +46 -0
- package/dist/commands/commitments/show.js +32 -0
- package/dist/commands/commitments/trigger-status.js +33 -0
- package/dist/commands/commitments/update.d.ts +1 -0
- package/dist/commands/commitments/update.js +31 -5
- package/dist/commands/commitments/wake-capabilities.d.ts +0 -1
- package/dist/commands/commitments/wake-capabilities.js +8 -4
- package/dist/commands/enterprise/budgets/create.d.ts +11 -0
- package/dist/commands/enterprise/budgets/create.js +27 -0
- package/dist/commands/enterprise/budgets/evaluate.d.ts +17 -0
- package/dist/commands/enterprise/budgets/evaluate.js +32 -0
- package/dist/commands/enterprise/budgets/publish.d.ts +14 -0
- package/dist/commands/enterprise/budgets/publish.js +30 -0
- package/dist/commands/enterprise/contracts/activate.d.ts +14 -0
- package/dist/commands/enterprise/contracts/activate.js +30 -0
- package/dist/commands/enterprise/contracts/create.d.ts +14 -0
- package/dist/commands/enterprise/contracts/create.js +32 -0
- package/dist/commands/enterprise/contracts/issue.d.ts +18 -0
- package/dist/commands/enterprise/contracts/issue.js +34 -0
- package/dist/commands/enterprise/domains/begin.d.ts +20 -0
- package/dist/commands/enterprise/domains/begin.js +39 -0
- package/dist/commands/enterprise/domains/verify.d.ts +14 -0
- package/dist/commands/enterprise/domains/verify.js +32 -0
- package/dist/commands/enterprise/external-config/activate.d.ts +22 -0
- package/dist/commands/enterprise/external-config/activate.js +49 -0
- package/dist/commands/enterprise/external-config/set.d.ts +25 -0
- package/dist/commands/enterprise/external-config/set.js +123 -0
- package/dist/commands/enterprise/external-config/show.d.ts +12 -0
- package/dist/commands/enterprise/external-config/show.js +39 -0
- package/dist/commands/enterprise/external-config/suspend.d.ts +13 -0
- package/dist/commands/enterprise/external-config/suspend.js +41 -0
- package/dist/commands/enterprise/finance/close-snapshot.d.ts +11 -0
- package/dist/commands/enterprise/finance/close-snapshot.js +28 -0
- package/dist/commands/enterprise/finance/record-document.d.ts +18 -0
- package/dist/commands/enterprise/finance/record-document.js +35 -0
- package/dist/commands/enterprise/profile.d.ts +20 -0
- package/dist/commands/enterprise/profile.js +38 -0
- package/dist/commands/login.d.ts +13 -0
- package/dist/commands/login.js +77 -0
- package/dist/commands/machines/dedicated/index.js +3 -0
- package/dist/commands/machines/dedicated/service/apply.d.ts +23 -0
- package/dist/commands/machines/dedicated/service/apply.js +99 -0
- package/dist/commands/machines/dedicated/service/approve.d.ts +23 -0
- package/dist/commands/machines/dedicated/service/approve.js +52 -0
- package/dist/commands/machines/dedicated/service/create.d.ts +55 -0
- package/dist/commands/machines/dedicated/service/create.js +222 -0
- package/dist/commands/machines/dedicated/service/edit.d.ts +30 -0
- package/dist/commands/machines/dedicated/service/edit.js +146 -0
- package/dist/commands/machines/dedicated/service/exec.d.ts +26 -0
- package/dist/commands/machines/dedicated/service/exec.js +92 -0
- package/dist/commands/machines/dedicated/service/export.d.ts +29 -0
- package/dist/commands/machines/dedicated/service/export.js +106 -0
- package/dist/commands/machines/dedicated/service/index.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/index.js +49 -0
- package/dist/commands/machines/dedicated/service/logs.d.ts +33 -0
- package/dist/commands/machines/dedicated/service/logs.js +148 -0
- package/dist/commands/machines/dedicated/service/ls.d.ts +20 -0
- package/dist/commands/machines/dedicated/service/ls.js +80 -0
- package/dist/commands/machines/dedicated/service/restart.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/restart.js +29 -0
- package/dist/commands/machines/dedicated/service/rm.d.ts +20 -0
- package/dist/commands/machines/dedicated/service/rm.js +33 -0
- package/dist/commands/machines/dedicated/service/secret/index.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/secret/index.js +25 -0
- package/dist/commands/machines/dedicated/service/secret/rm.d.ts +22 -0
- package/dist/commands/machines/dedicated/service/secret/rm.js +54 -0
- package/dist/commands/machines/dedicated/service/secret/set.d.ts +22 -0
- package/dist/commands/machines/dedicated/service/secret/set.js +93 -0
- package/dist/commands/machines/dedicated/service/start.d.ts +14 -0
- package/dist/commands/machines/dedicated/service/start.js +29 -0
- package/dist/commands/machines/dedicated/service/status.d.ts +21 -0
- package/dist/commands/machines/dedicated/service/status.js +85 -0
- package/dist/commands/machines/dedicated/service/stop.d.ts +20 -0
- package/dist/commands/machines/dedicated/service/stop.js +35 -0
- package/dist/commands/machines/dedicated/service/top.d.ts +22 -0
- package/dist/commands/machines/dedicated/service/top.js +120 -0
- package/dist/commands/machines/dedicated/sign-in-status.d.ts +22 -0
- package/dist/commands/machines/dedicated/sign-in-status.js +79 -0
- package/dist/commands/machines/dedicated/ssh-config.d.ts +28 -0
- package/dist/commands/machines/dedicated/ssh-config.js +66 -0
- package/dist/commands/machines/dedicated/ssh-proxy.d.ts +22 -0
- package/dist/commands/machines/dedicated/ssh-proxy.js +62 -0
- package/dist/commands/machines/dedicated/ssh.d.ts +29 -0
- package/dist/commands/machines/dedicated/ssh.js +121 -0
- package/dist/commands/native/allow-all.d.ts +14 -0
- package/dist/commands/native/allow-all.js +25 -0
- package/dist/commands/native/allow.d.ts +24 -0
- package/dist/commands/native/allow.js +45 -0
- package/dist/commands/native/deny.d.ts +24 -0
- package/dist/commands/native/deny.js +43 -0
- package/dist/commands/native/disable.d.ts +17 -0
- package/dist/commands/native/disable.js +28 -0
- package/dist/commands/native/enable.d.ts +12 -0
- package/dist/commands/native/enable.js +29 -0
- package/dist/commands/native/list-apps.d.ts +19 -0
- package/dist/commands/native/list-apps.js +30 -0
- package/dist/commands/native/restrict-to.d.ts +22 -0
- package/dist/commands/native/restrict-to.js +41 -0
- package/dist/commands/native/status.d.ts +19 -0
- package/dist/commands/native/status.js +33 -0
- package/dist/commands/native.d.ts +39 -0
- package/dist/commands/native.js +76 -0
- package/dist/commands/service/index.d.ts +14 -0
- package/dist/commands/service/index.js +31 -0
- package/dist/commands/service/logs.d.ts +18 -0
- package/dist/commands/service/logs.js +53 -0
- package/dist/commands/service/ls.d.ts +13 -0
- package/dist/commands/service/ls.js +48 -0
- package/dist/commands/service/propose.d.ts +34 -0
- package/dist/commands/service/propose.js +113 -0
- package/dist/commands/service/status.d.ts +17 -0
- package/dist/commands/service/status.js +56 -0
- package/dist/commands/spaces/auto-executor/runs.d.ts +13 -0
- package/dist/commands/spaces/auto-executor/runs.js +56 -0
- package/dist/commands/store/governance/artifacts.d.ts +25 -0
- package/dist/commands/store/governance/artifacts.js +55 -0
- package/dist/commands/store/governance/assign.d.ts +16 -0
- package/dist/commands/store/governance/assign.js +54 -0
- package/dist/commands/store/governance/create-license.d.ts +18 -0
- package/dist/commands/store/governance/create-license.js +35 -0
- package/dist/commands/store/governance/install-plan.d.ts +25 -0
- package/dist/commands/store/governance/install-plan.js +56 -0
- package/dist/commands/store/governance/license-policy.d.ts +30 -0
- package/dist/commands/store/governance/license-policy.js +69 -0
- package/dist/commands/store/governance/policy.d.ts +25 -0
- package/dist/commands/store/governance/policy.js +65 -0
- package/dist/commands/store/governance/publish-release.d.ts +17 -0
- package/dist/commands/store/governance/publish-release.js +34 -0
- package/dist/commands/tasks/deliverable/add.d.ts +15 -0
- package/dist/commands/tasks/deliverable/add.js +174 -0
- package/dist/commands/tasks/deliverable/archive.d.ts +35 -0
- package/dist/commands/tasks/deliverable/archive.js +205 -0
- package/dist/commands/tasks/labels/detach.js +3 -0
- package/dist/commands/tasks/labels/suggest.d.ts +24 -0
- package/dist/commands/tasks/labels/suggest.js +69 -0
- package/dist/commands/tasks/list.d.ts +16 -2
- package/dist/commands/tasks/list.js +100 -24
- package/dist/commands/tasks/show.d.ts +23 -0
- package/dist/commands/tasks/show.js +51 -1
- package/dist/commands/wiki/rm.d.ts +22 -1
- package/dist/commands/wiki/rm.js +52 -3
- package/dist/lib/agentic-stream.js +10 -2
- package/dist/lib/balance.d.ts +6 -1
- package/dist/lib/balance.js +15 -0
- package/dist/lib/commerce-command.d.ts +48 -0
- package/dist/lib/commerce-command.js +70 -0
- package/dist/lib/commerce.d.ts +93 -0
- package/dist/lib/commerce.js +129 -0
- package/dist/lib/commitment-product.js +1 -1
- package/dist/lib/commitments.d.ts +202 -29
- package/dist/lib/commitments.js +300 -33
- package/dist/lib/dedicated-lease-command.js +10 -0
- package/dist/lib/dedicated-machines.d.ts +37 -0
- package/dist/lib/dedicated-machines.js +47 -0
- package/dist/lib/dedicated-service-command.d.ts +60 -0
- package/dist/lib/dedicated-service-command.js +182 -0
- package/dist/lib/dedicated-service.d.ts +342 -0
- package/dist/lib/dedicated-service.js +741 -0
- package/dist/lib/dedicated-ssh.d.ts +136 -0
- package/dist/lib/dedicated-ssh.js +387 -0
- package/dist/lib/delegated-cli.js +51 -13
- package/dist/lib/enterprise-commerce.d.ts +67 -0
- package/dist/lib/enterprise-commerce.js +112 -0
- package/dist/lib/enterprise-external-configuration.d.ts +60 -0
- package/dist/lib/enterprise-external-configuration.js +58 -0
- package/dist/lib/first-party-harness.js +17 -3
- package/dist/lib/governed-store.d.ts +110 -0
- package/dist/lib/governed-store.js +79 -0
- package/dist/lib/guest-service-command.d.ts +16 -0
- package/dist/lib/guest-service-command.js +32 -0
- package/dist/lib/guest-service.d.ts +67 -0
- package/dist/lib/guest-service.js +112 -0
- package/dist/lib/prompt.d.ts +1 -0
- package/dist/lib/prompt.js +1 -0
- package/dist/lib/task-asset-upload.d.ts +20 -0
- package/dist/lib/task-asset-upload.js +30 -8
- package/dist/lib/task-extras.d.ts +23 -0
- package/dist/lib/task-extras.js +6 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.d.ts +9 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonScopes.js +10 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +6 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.d.ts +16 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/messages.js +21 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/spawnEnv.js +24 -2
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.d.ts +9 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonScopes.js +10 -3
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.d.ts +16 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/messages.js +20 -4
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.d.ts +1 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/spawnEnv.js +24 -2
- package/dist/node_modules/@skrr-ai/auth-core/package.json +1 -1
- package/dist/node_modules/@skrr-ai/data-provider/index.js +5060 -4827
- package/oclif.manifest.json +37416 -31416
- package/package.json +43 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr machines dedicated service exec` — a one-off command inside a
|
|
4
|
+
* service's context (phase 2).
|
|
5
|
+
*
|
|
6
|
+
* The spawn carries the service's cwd, env and cgroup scope, so it lands in
|
|
7
|
+
* the service's process tree and shares its fate — the honest way to debug a
|
|
8
|
+
* service whose environment the daemon holds. A daemon that predates the
|
|
9
|
+
* extension refuses cleanly; `machines dedicated exec` is the always-there
|
|
10
|
+
* fallback for ad-hoc commands.
|
|
11
|
+
*/
|
|
12
|
+
export default class DedicatedServiceExec extends DedicatedServiceCommand {
|
|
13
|
+
static summary: string;
|
|
14
|
+
static examples: string[];
|
|
15
|
+
static usage: string;
|
|
16
|
+
static args: {
|
|
17
|
+
lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
18
|
+
name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
19
|
+
command: import("@oclif/core/lib/interfaces").Arg<string[] | undefined, Record<string, unknown>>;
|
|
20
|
+
};
|
|
21
|
+
static flags: {
|
|
22
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
23
|
+
timeout: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
24
|
+
};
|
|
25
|
+
run(): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
|
|
5
|
+
const exec_1 = require("../../hosted/exec");
|
|
6
|
+
/**
|
|
7
|
+
* `skrr machines dedicated service exec` — a one-off command inside a
|
|
8
|
+
* service's context (phase 2).
|
|
9
|
+
*
|
|
10
|
+
* The spawn carries the service's cwd, env and cgroup scope, so it lands in
|
|
11
|
+
* the service's process tree and shares its fate — the honest way to debug a
|
|
12
|
+
* service whose environment the daemon holds. A daemon that predates the
|
|
13
|
+
* extension refuses cleanly; `machines dedicated exec` is the always-there
|
|
14
|
+
* fallback for ad-hoc commands.
|
|
15
|
+
*/
|
|
16
|
+
class DedicatedServiceExec extends dedicated_service_command_1.DedicatedServiceCommand {
|
|
17
|
+
static summary = 'Run a one-off command in a service’s context (phase 2)';
|
|
18
|
+
static examples = [
|
|
19
|
+
'<%= config.bin %> machines dedicated service exec <lease-id> <name> -- printenv',
|
|
20
|
+
'<%= config.bin %> machines dedicated service exec <lease-id> <name> -- cat /workspace/services/name/state.json',
|
|
21
|
+
];
|
|
22
|
+
static usage = 'machines dedicated service exec <lease-id> <name> -- <command...>';
|
|
23
|
+
static args = {
|
|
24
|
+
lease: core_1.Args.string({
|
|
25
|
+
description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
|
|
26
|
+
required: true,
|
|
27
|
+
ignoreStdin: true,
|
|
28
|
+
}),
|
|
29
|
+
name: core_1.Args.string({ description: 'Service name', required: true, ignoreStdin: true }),
|
|
30
|
+
command: core_1.Args.string({
|
|
31
|
+
description: 'The command and its arguments, after --',
|
|
32
|
+
multiple: true,
|
|
33
|
+
required: false,
|
|
34
|
+
ignoreStdin: true,
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
static flags = {
|
|
38
|
+
json: core_1.Flags.boolean({ description: 'Output the result as JSON' }),
|
|
39
|
+
timeout: core_1.Flags.integer({
|
|
40
|
+
description: 'Seconds the command may run on the machine (1-600, default 300)',
|
|
41
|
+
min: 1,
|
|
42
|
+
max: 600,
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
async run() {
|
|
46
|
+
this.requireAuth();
|
|
47
|
+
const { head, tail } = (0, exec_1.splitExecArgv)(this.argv);
|
|
48
|
+
const { args, flags } = await this.parse(DedicatedServiceExec, head);
|
|
49
|
+
const argv = tail ?? args.command ?? [];
|
|
50
|
+
if (argv.length === 0) {
|
|
51
|
+
this.error('Command is required — pass it after --.', { exit: 2 });
|
|
52
|
+
}
|
|
53
|
+
const leaseId = await this.resolveLeaseArg(args.lease);
|
|
54
|
+
// Phase-2 verb: `dedicated:service:exec {leaseId, name, argv}`. A daemon
|
|
55
|
+
// without the extension answers with the unsupported path — the command
|
|
56
|
+
// degrades, it does not improvise.
|
|
57
|
+
const timeoutSeconds = flags.timeout ?? 300;
|
|
58
|
+
const result = await this.callService('exec', {
|
|
59
|
+
leaseId,
|
|
60
|
+
name: args.name,
|
|
61
|
+
argv,
|
|
62
|
+
timeoutSeconds,
|
|
63
|
+
...this.scopeFrom(flags),
|
|
64
|
+
},
|
|
65
|
+
// The relay waits timeoutSeconds+30s; the caller must outlive that or a
|
|
66
|
+
// legitimately long exec reports a false connectivity failure.
|
|
67
|
+
(timeoutSeconds + 45) * 1000);
|
|
68
|
+
this.closeServiceChannel();
|
|
69
|
+
if (flags.json) {
|
|
70
|
+
this.log(JSON.stringify(result ?? {}, null, 2));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Binary-safe: the wire contract is base64 — write the decoded bytes
|
|
74
|
+
// verbatim; a debug verb that utf8-mangles or appends newlines lies
|
|
75
|
+
// about what the service emitted.
|
|
76
|
+
const stdout = result?.stdoutBase64
|
|
77
|
+
? Buffer.from(result.stdoutBase64, 'base64')
|
|
78
|
+
: Buffer.from(result?.stdout ?? '', 'utf8');
|
|
79
|
+
const stderr = result?.stderrBase64
|
|
80
|
+
? Buffer.from(result.stderrBase64, 'base64')
|
|
81
|
+
: Buffer.from(result?.stderr ?? '', 'utf8');
|
|
82
|
+
if (stdout.length > 0)
|
|
83
|
+
process.stdout.write(stdout);
|
|
84
|
+
if (stderr.length > 0)
|
|
85
|
+
process.stderr.write(stderr);
|
|
86
|
+
}
|
|
87
|
+
const exitCode = typeof result?.exitCode === 'number' ? result.exitCode : 0;
|
|
88
|
+
if (exitCode !== 0)
|
|
89
|
+
this.exit(exitCode);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.default = DedicatedServiceExec;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
|
|
2
|
+
/** Shape written by `service export` and accepted by `service apply --file`. */
|
|
3
|
+
export declare const SERVICE_SPEC_EXPORT_VERSION = 1;
|
|
4
|
+
/**
|
|
5
|
+
* `skrr machines dedicated service export` — the stored spec as a repo
|
|
6
|
+
* `service.json` (phase 2).
|
|
7
|
+
*
|
|
8
|
+
* The artifact is the apply-able document: the daemon's bookkeeping
|
|
9
|
+
* (`revision`, `createdBy`, timestamps) is stripped, forward fields are kept
|
|
10
|
+
* verbatim, so `--output service.json` is exactly what
|
|
11
|
+
* `service apply --file service.json` takes on this machine or another one.
|
|
12
|
+
* Like every export verb it asks for a destination — `--summary`,
|
|
13
|
+
* `--output <path>` or `--output -` for deliberate stdout — rather than
|
|
14
|
+
* spilling a spec onto the terminal because a flag was forgotten.
|
|
15
|
+
*/
|
|
16
|
+
export default class DedicatedServiceExport extends DedicatedServiceCommand {
|
|
17
|
+
static summary: string;
|
|
18
|
+
static examples: string[];
|
|
19
|
+
static args: {
|
|
20
|
+
lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
21
|
+
name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
22
|
+
};
|
|
23
|
+
static flags: {
|
|
24
|
+
summary: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
output: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
26
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
27
|
+
};
|
|
28
|
+
run(): Promise<void>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SERVICE_SPEC_EXPORT_VERSION = void 0;
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
|
|
6
|
+
const dedicated_service_1 = require("../../../../lib/dedicated-service");
|
|
7
|
+
const artifact_export_1 = require("../../../../lib/artifact-export");
|
|
8
|
+
/** Shape written by `service export` and accepted by `service apply --file`. */
|
|
9
|
+
exports.SERVICE_SPEC_EXPORT_VERSION = 1;
|
|
10
|
+
/**
|
|
11
|
+
* `skrr machines dedicated service export` — the stored spec as a repo
|
|
12
|
+
* `service.json` (phase 2).
|
|
13
|
+
*
|
|
14
|
+
* The artifact is the apply-able document: the daemon's bookkeeping
|
|
15
|
+
* (`revision`, `createdBy`, timestamps) is stripped, forward fields are kept
|
|
16
|
+
* verbatim, so `--output service.json` is exactly what
|
|
17
|
+
* `service apply --file service.json` takes on this machine or another one.
|
|
18
|
+
* Like every export verb it asks for a destination — `--summary`,
|
|
19
|
+
* `--output <path>` or `--output -` for deliberate stdout — rather than
|
|
20
|
+
* spilling a spec onto the terminal because a flag was forgotten.
|
|
21
|
+
*/
|
|
22
|
+
class DedicatedServiceExport extends dedicated_service_command_1.DedicatedServiceCommand {
|
|
23
|
+
static summary = 'Export a stored spec in the repo service.json form';
|
|
24
|
+
static examples = [
|
|
25
|
+
'<%= config.bin %> machines dedicated service export <lease-id> <name> --output service.json',
|
|
26
|
+
'<%= config.bin %> machines dedicated service export <lease-id> <name> --output - | jq .',
|
|
27
|
+
'<%= config.bin %> machines dedicated service export <lease-id> <name> --summary',
|
|
28
|
+
];
|
|
29
|
+
static args = {
|
|
30
|
+
lease: core_1.Args.string({
|
|
31
|
+
description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
|
|
32
|
+
required: true,
|
|
33
|
+
ignoreStdin: true,
|
|
34
|
+
}),
|
|
35
|
+
name: core_1.Args.string({ description: 'Service name', required: true, ignoreStdin: true }),
|
|
36
|
+
};
|
|
37
|
+
static flags = {
|
|
38
|
+
...(0, artifact_export_1.standardExportFlags)(),
|
|
39
|
+
};
|
|
40
|
+
async run() {
|
|
41
|
+
this.requireAuth();
|
|
42
|
+
const { args, flags } = await this.parse(DedicatedServiceExport);
|
|
43
|
+
let selection;
|
|
44
|
+
try {
|
|
45
|
+
selection = (0, artifact_export_1.resolveExportSelection)(flags);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err instanceof artifact_export_1.ExportContractError) {
|
|
49
|
+
this.failWithCliError({
|
|
50
|
+
message: err.message,
|
|
51
|
+
code: err.code,
|
|
52
|
+
exit: 2,
|
|
53
|
+
retryable: false,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
const leaseId = await this.resolveLeaseArg(args.lease);
|
|
59
|
+
const result = await this.callService('get', {
|
|
60
|
+
leaseId,
|
|
61
|
+
name: args.name,
|
|
62
|
+
...this.scopeFrom(flags),
|
|
63
|
+
});
|
|
64
|
+
this.closeServiceChannel();
|
|
65
|
+
if (!result?.spec) {
|
|
66
|
+
this.error(`No service named ${args.name} on ${leaseId}.`, { exit: 1 });
|
|
67
|
+
}
|
|
68
|
+
if (selection.summary) {
|
|
69
|
+
const summary = (0, artifact_export_1.contentFreeSummary)({
|
|
70
|
+
command: 'machines dedicated service export',
|
|
71
|
+
artifactSchemaVersion: exports.SERVICE_SPEC_EXPORT_VERSION,
|
|
72
|
+
itemCount: 1,
|
|
73
|
+
counts: { services: 1 },
|
|
74
|
+
});
|
|
75
|
+
this.log(selection.json ? JSON.stringify(summary, null, 2) : (0, artifact_export_1.humanExportSummary)(summary));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const serialized = (0, artifact_export_1.serializedArtifact)((0, dedicated_service_1.specExportDocument)(result.spec));
|
|
79
|
+
if (selection.output === '-') {
|
|
80
|
+
this.log(serialized.trimEnd());
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
let receipt;
|
|
84
|
+
try {
|
|
85
|
+
receipt = await (0, artifact_export_1.writeExportArtifact)({
|
|
86
|
+
command: 'machines dedicated service export',
|
|
87
|
+
artifactSchemaVersion: exports.SERVICE_SPEC_EXPORT_VERSION,
|
|
88
|
+
format: 'json',
|
|
89
|
+
output: selection.output,
|
|
90
|
+
content: serialized,
|
|
91
|
+
itemCount: 1,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
this.failWithCliError({
|
|
96
|
+
message: `Could not write ${selection.output}: ${err.message}`,
|
|
97
|
+
code: 'SERVICE_SPEC_EXPORT_WRITE_FAILED',
|
|
98
|
+
exit: 1,
|
|
99
|
+
retryable: false,
|
|
100
|
+
details: { path: selection.output },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
this.log(selection.json ? JSON.stringify(receipt, null, 2) : (0, artifact_export_1.humanExportReceipt)(receipt));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.default = DedicatedServiceExport;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr machines dedicated service` — declared, always-on workloads.
|
|
4
|
+
*
|
|
5
|
+
* A detached process dies at every machine boundary; a declared service is
|
|
6
|
+
* restarted by the machine's daemon across crashes, daemon restarts,
|
|
7
|
+
* checkpoints, stop→start and instance replacement. This topic is how the
|
|
8
|
+
* owner declares them.
|
|
9
|
+
*/
|
|
10
|
+
export default class DedicatedMachinesService extends Command {
|
|
11
|
+
static description: string;
|
|
12
|
+
static examples: string[];
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
/**
|
|
5
|
+
* `skrr machines dedicated service` — declared, always-on workloads.
|
|
6
|
+
*
|
|
7
|
+
* A detached process dies at every machine boundary; a declared service is
|
|
8
|
+
* restarted by the machine's daemon across crashes, daemon restarts,
|
|
9
|
+
* checkpoints, stop→start and instance replacement. This topic is how the
|
|
10
|
+
* owner declares them.
|
|
11
|
+
*/
|
|
12
|
+
class DedicatedMachinesService extends core_1.Command {
|
|
13
|
+
static description = 'Declared services on a Dedicated Runtime — workloads the machine keeps running across restarts, checkpoints and replacements';
|
|
14
|
+
static examples = [
|
|
15
|
+
'<%= config.bin %> machines dedicated service create <lease-id> --name worker --cwd /workspace/repos/app -- node dist/worker.js',
|
|
16
|
+
'<%= config.bin %> machines dedicated service apply <lease-id> --file service.json',
|
|
17
|
+
'<%= config.bin %> machines dedicated service ls <lease-id>',
|
|
18
|
+
'<%= config.bin %> machines dedicated service status <lease-id> <name>',
|
|
19
|
+
'<%= config.bin %> machines dedicated service logs <lease-id> <name> -f',
|
|
20
|
+
'<%= config.bin %> machines dedicated service approve <lease-id> <name>',
|
|
21
|
+
];
|
|
22
|
+
async run() {
|
|
23
|
+
const rows = [
|
|
24
|
+
['create', 'declare a service (argv after --, or --file service.json)'],
|
|
25
|
+
['apply', 'create or update a service from a spec file, idempotently'],
|
|
26
|
+
['ls', 'list services and pending agent proposals'],
|
|
27
|
+
['status', 'one service: spec, computed status and recent exits'],
|
|
28
|
+
['edit', 'edit the spec in $EDITOR and apply it (CAS update)'],
|
|
29
|
+
['logs', 'print a service log; -f follows'],
|
|
30
|
+
['start', 'set desired state to running'],
|
|
31
|
+
['stop', 'set desired state to stopped; survives machine restarts'],
|
|
32
|
+
['restart', 'restart the service now'],
|
|
33
|
+
['rm', 'remove the declaration'],
|
|
34
|
+
['approve', 'approve (--reject to refuse) an agent-proposed service'],
|
|
35
|
+
['exec', 'run a one-off command inside a service’s context (phase 2)'],
|
|
36
|
+
['top', 'per-service cpu/mem/pids (phase 2)'],
|
|
37
|
+
['export', 'print the repo service.json form of a stored spec'],
|
|
38
|
+
['secret', 'set or remove a secret a spec can reference (phase 2)'],
|
|
39
|
+
];
|
|
40
|
+
this.log('skrr machines dedicated service commands:');
|
|
41
|
+
for (const [name, summary] of rows) {
|
|
42
|
+
this.log(` skrr machines dedicated service ${name.padEnd(8)} ${summary}`);
|
|
43
|
+
}
|
|
44
|
+
this.log('');
|
|
45
|
+
this.log('Every command takes a lease id (or `self` on the machine) and --json. ' +
|
|
46
|
+
'Agents on the machine propose services instead: `skrr service propose`.');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.default = DedicatedMachinesService;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr machines dedicated service logs` — tail the service's log, or follow it.
|
|
4
|
+
*
|
|
5
|
+
* The daemon rotates a bounded `current` log per service; `logs` replays a
|
|
6
|
+
* byte tail of it and `-f` keeps the stream open on live
|
|
7
|
+
* `dedicated:service:log` frames. Ctrl-C ends the follow cleanly — the
|
|
8
|
+
* stream is closed with `logs:stop`, the service keeps running.
|
|
9
|
+
*
|
|
10
|
+
* While a follow is open, an agent proposal arriving on the same channel is
|
|
11
|
+
* surfaced on stderr: the owner watching logs is exactly the owner who can
|
|
12
|
+
* approve it.
|
|
13
|
+
*/
|
|
14
|
+
export default class DedicatedServiceLogs extends DedicatedServiceCommand {
|
|
15
|
+
static summary: string;
|
|
16
|
+
static examples: string[];
|
|
17
|
+
static args: {
|
|
18
|
+
lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
19
|
+
name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
20
|
+
};
|
|
21
|
+
static flags: {
|
|
22
|
+
follow: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
23
|
+
tail: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
24
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
};
|
|
26
|
+
run(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* The machine-readable follow: each log frame is one JSON line. An ack's
|
|
29
|
+
* refusal surfaces through the same channel.call error path as every other
|
|
30
|
+
* verb (a `--json` caller reads the CLI error envelope).
|
|
31
|
+
*/
|
|
32
|
+
private followJson;
|
|
33
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
|
|
5
|
+
const dedicated_service_1 = require("../../../../lib/dedicated-service");
|
|
6
|
+
/**
|
|
7
|
+
* `skrr machines dedicated service logs` — tail the service's log, or follow it.
|
|
8
|
+
*
|
|
9
|
+
* The daemon rotates a bounded `current` log per service; `logs` replays a
|
|
10
|
+
* byte tail of it and `-f` keeps the stream open on live
|
|
11
|
+
* `dedicated:service:log` frames. Ctrl-C ends the follow cleanly — the
|
|
12
|
+
* stream is closed with `logs:stop`, the service keeps running.
|
|
13
|
+
*
|
|
14
|
+
* While a follow is open, an agent proposal arriving on the same channel is
|
|
15
|
+
* surfaced on stderr: the owner watching logs is exactly the owner who can
|
|
16
|
+
* approve it.
|
|
17
|
+
*/
|
|
18
|
+
class DedicatedServiceLogs extends dedicated_service_command_1.DedicatedServiceCommand {
|
|
19
|
+
static summary = 'Print a service’s log; -f follows live output';
|
|
20
|
+
static examples = [
|
|
21
|
+
'<%= config.bin %> machines dedicated service logs <lease-id> <name>',
|
|
22
|
+
'<%= config.bin %> machines dedicated service logs <lease-id> <name> -f',
|
|
23
|
+
'<%= config.bin %> machines dedicated service logs <lease-id> <name> --tail 65536',
|
|
24
|
+
];
|
|
25
|
+
static args = {
|
|
26
|
+
lease: core_1.Args.string({
|
|
27
|
+
description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
|
|
28
|
+
required: true,
|
|
29
|
+
ignoreStdin: true,
|
|
30
|
+
}),
|
|
31
|
+
name: core_1.Args.string({ description: 'Service name', required: true, ignoreStdin: true }),
|
|
32
|
+
};
|
|
33
|
+
static flags = {
|
|
34
|
+
follow: core_1.Flags.boolean({
|
|
35
|
+
description: 'Keep the stream open on live log frames (Ctrl-C ends the follow, not the service)',
|
|
36
|
+
char: 'f',
|
|
37
|
+
}),
|
|
38
|
+
tail: core_1.Flags.integer({
|
|
39
|
+
description: 'Bytes from the end of the stored log to print first (daemon rotates at 8 MiB)',
|
|
40
|
+
min: 0,
|
|
41
|
+
}),
|
|
42
|
+
json: core_1.Flags.boolean({ description: 'Emit log frames as JSON objects' }),
|
|
43
|
+
};
|
|
44
|
+
async run() {
|
|
45
|
+
this.requireAuth();
|
|
46
|
+
const { args, flags } = await this.parse(DedicatedServiceLogs);
|
|
47
|
+
const leaseId = await this.resolveLeaseArg(args.lease);
|
|
48
|
+
if (flags.json) {
|
|
49
|
+
// --json emits one frame per line — a follow a program can consume.
|
|
50
|
+
// Proposals surface as frames too rather than stderr prose.
|
|
51
|
+
const code = await this.followJson(leaseId, args.name, flags);
|
|
52
|
+
if (code !== 0)
|
|
53
|
+
this.exit(code);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let code;
|
|
57
|
+
try {
|
|
58
|
+
code = await (0, dedicated_service_1.streamServiceLogs)({
|
|
59
|
+
baseURL: this.cliConfig.baseURL,
|
|
60
|
+
token: this.resolvedCredential.token,
|
|
61
|
+
leaseId,
|
|
62
|
+
name: args.name,
|
|
63
|
+
follow: flags.follow,
|
|
64
|
+
tailBytes: flags.tail,
|
|
65
|
+
output: process.stdout,
|
|
66
|
+
errorOutput: process.stderr,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
this.reportServiceError(err);
|
|
71
|
+
}
|
|
72
|
+
if (code !== 0)
|
|
73
|
+
this.exit(code);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The machine-readable follow: each log frame is one JSON line. An ack's
|
|
77
|
+
* refusal surfaces through the same channel.call error path as every other
|
|
78
|
+
* verb (a `--json` caller reads the CLI error envelope).
|
|
79
|
+
*/
|
|
80
|
+
async followJson(leaseId, name, flags) {
|
|
81
|
+
const channel = new dedicated_service_1.DedicatedServiceChannel({
|
|
82
|
+
baseURL: this.cliConfig.baseURL,
|
|
83
|
+
token: this.resolvedCredential.token,
|
|
84
|
+
});
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
let streamId = null;
|
|
87
|
+
let finished = false;
|
|
88
|
+
let closedByServer = false;
|
|
89
|
+
const onSigint = () => finish(0);
|
|
90
|
+
const finish = (code) => {
|
|
91
|
+
if (finished)
|
|
92
|
+
return;
|
|
93
|
+
finished = true;
|
|
94
|
+
process.off('SIGINT', onSigint);
|
|
95
|
+
if (streamId && flags.follow && !closedByServer) {
|
|
96
|
+
channel.send(dedicated_service_1.DEDICATED_SERVICE_EVENTS.logsStop, { leaseId, name, streamId });
|
|
97
|
+
}
|
|
98
|
+
channel.close();
|
|
99
|
+
resolve(code);
|
|
100
|
+
};
|
|
101
|
+
channel.setOnDead(() => finish(1));
|
|
102
|
+
channel
|
|
103
|
+
.open()
|
|
104
|
+
.then(async () => {
|
|
105
|
+
process.on('SIGINT', onSigint);
|
|
106
|
+
channel.on(dedicated_service_1.DEDICATED_SERVICE_EVENTS.log, (frame) => {
|
|
107
|
+
if (streamId && frame.streamId && frame.streamId !== streamId)
|
|
108
|
+
return;
|
|
109
|
+
if (frame.name && frame.name !== name)
|
|
110
|
+
return;
|
|
111
|
+
this.log(JSON.stringify({ type: 'log', ...frame }));
|
|
112
|
+
});
|
|
113
|
+
channel.on(dedicated_service_1.DEDICATED_SERVICE_EVENTS.logClosed, (frame) => {
|
|
114
|
+
if (streamId && frame.streamId && frame.streamId !== streamId)
|
|
115
|
+
return;
|
|
116
|
+
closedByServer = true;
|
|
117
|
+
this.log(JSON.stringify({ type: 'closed', ...frame }));
|
|
118
|
+
finish(0);
|
|
119
|
+
});
|
|
120
|
+
channel.on(dedicated_service_1.DEDICATED_SERVICE_EVENTS.proposed, (frame) => {
|
|
121
|
+
this.log(JSON.stringify({ type: 'proposed', ...frame }));
|
|
122
|
+
});
|
|
123
|
+
const { result } = await channel.call('logs', {
|
|
124
|
+
leaseId,
|
|
125
|
+
name,
|
|
126
|
+
follow: flags.follow,
|
|
127
|
+
...(flags.tail !== undefined ? { tailBytes: flags.tail } : {}),
|
|
128
|
+
...this.scopeFrom(flags),
|
|
129
|
+
});
|
|
130
|
+
streamId = typeof result?.streamId === 'string' ? result.streamId : null;
|
|
131
|
+
if (typeof result?.data === 'string' && result.data.length > 0) {
|
|
132
|
+
this.log(JSON.stringify({ type: 'tail', name, data: result.data }));
|
|
133
|
+
}
|
|
134
|
+
if (!flags.follow)
|
|
135
|
+
finish(0);
|
|
136
|
+
})
|
|
137
|
+
.catch((err) => {
|
|
138
|
+
// Reject BEFORE closing — disconnect() fires onDead → finish(1),
|
|
139
|
+
// which would otherwise win the settlement race and mask the refusal.
|
|
140
|
+
finished = true;
|
|
141
|
+
process.off('SIGINT', onSigint);
|
|
142
|
+
reject(err);
|
|
143
|
+
channel.close();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.default = DedicatedServiceLogs;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
|
|
2
|
+
/**
|
|
3
|
+
* `skrr machines dedicated service ls` — what the machine is keeping alive,
|
|
4
|
+
* and what agents have asked it to keep alive.
|
|
5
|
+
*
|
|
6
|
+
* Agent proposals are printed as their own section rather than as ordinary
|
|
7
|
+
* rows: a proposed service runs nothing until the owner approves it, and a
|
|
8
|
+
* table that listed it beside running work would lie by adjacency.
|
|
9
|
+
*/
|
|
10
|
+
export default class DedicatedServiceLs extends DedicatedServiceCommand {
|
|
11
|
+
static summary: string;
|
|
12
|
+
static examples: string[];
|
|
13
|
+
static args: {
|
|
14
|
+
lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
15
|
+
};
|
|
16
|
+
static flags: {
|
|
17
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
};
|
|
19
|
+
run(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
|
|
5
|
+
const format_1 = require("../../../../lib/format");
|
|
6
|
+
/**
|
|
7
|
+
* `skrr machines dedicated service ls` — what the machine is keeping alive,
|
|
8
|
+
* and what agents have asked it to keep alive.
|
|
9
|
+
*
|
|
10
|
+
* Agent proposals are printed as their own section rather than as ordinary
|
|
11
|
+
* rows: a proposed service runs nothing until the owner approves it, and a
|
|
12
|
+
* table that listed it beside running work would lie by adjacency.
|
|
13
|
+
*/
|
|
14
|
+
class DedicatedServiceLs extends dedicated_service_command_1.DedicatedServiceCommand {
|
|
15
|
+
static summary = 'List declared services and pending agent proposals';
|
|
16
|
+
static examples = [
|
|
17
|
+
'<%= config.bin %> machines dedicated service ls <lease-id>',
|
|
18
|
+
'<%= config.bin %> machines dedicated service ls <lease-id> --json',
|
|
19
|
+
];
|
|
20
|
+
static args = {
|
|
21
|
+
lease: core_1.Args.string({
|
|
22
|
+
description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
|
|
23
|
+
required: true,
|
|
24
|
+
ignoreStdin: true,
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
static flags = {
|
|
28
|
+
json: core_1.Flags.boolean({ description: 'Output as JSON' }),
|
|
29
|
+
};
|
|
30
|
+
async run() {
|
|
31
|
+
this.requireAuth();
|
|
32
|
+
const { args, flags } = await this.parse(DedicatedServiceLs);
|
|
33
|
+
const leaseId = await this.resolveLeaseArg(args.lease);
|
|
34
|
+
const result = await this.callService('list', {
|
|
35
|
+
leaseId,
|
|
36
|
+
...this.scopeFrom(flags),
|
|
37
|
+
});
|
|
38
|
+
this.closeServiceChannel();
|
|
39
|
+
if (flags.json) {
|
|
40
|
+
this.log(JSON.stringify(result ?? { services: [] }, null, 2));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const services = result?.services ?? [];
|
|
44
|
+
const proposals = result?.proposals ?? [];
|
|
45
|
+
if (services.length === 0 && proposals.length === 0) {
|
|
46
|
+
this.log(`No declared services on ${leaseId}.`);
|
|
47
|
+
this.log(`Declare one with \`${this.config.bin} machines dedicated service create ${leaseId} --name <name> -- <command>\`.`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (services.length > 0) {
|
|
51
|
+
(0, format_1.renderTable)(services.map((svc) => ({
|
|
52
|
+
name: (0, format_1.formatCell)(svc.name ?? svc.spec?.name),
|
|
53
|
+
status: (0, format_1.formatCell)(svc.status ?? 'unknown'),
|
|
54
|
+
restart: (0, format_1.formatCell)(svc.restart ?? svc.spec?.restart),
|
|
55
|
+
createdBy: (0, format_1.formatCell)(svc.createdBy ?? svc.spec?.createdBy),
|
|
56
|
+
})), [
|
|
57
|
+
{ key: 'name', header: 'NAME', verbatim: true },
|
|
58
|
+
{ key: 'status', header: 'STATUS' },
|
|
59
|
+
{ key: 'restart', header: 'RESTART' },
|
|
60
|
+
{ key: 'createdBy', header: 'CREATED BY' },
|
|
61
|
+
], (line) => this.log(line));
|
|
62
|
+
}
|
|
63
|
+
if (proposals.length > 0) {
|
|
64
|
+
if (services.length > 0)
|
|
65
|
+
this.log('');
|
|
66
|
+
this.log('Pending proposals — nothing runs until you approve:');
|
|
67
|
+
(0, format_1.renderTable)(proposals.map((p) => ({
|
|
68
|
+
name: (0, format_1.formatCell)(p.name ?? p.spec?.name),
|
|
69
|
+
proposedBy: (0, format_1.formatCell)(p.createdBy),
|
|
70
|
+
command: (0, format_1.formatCell)(Array.isArray(p.spec?.command) ? p.spec.command.join(' ') : (p.spec?.shell ?? ''), '-'),
|
|
71
|
+
})), [
|
|
72
|
+
{ key: 'name', header: 'NAME', verbatim: true },
|
|
73
|
+
{ key: 'proposedBy', header: 'PROPOSED BY' },
|
|
74
|
+
{ key: 'command', header: 'COMMAND', maxWidth: 60 },
|
|
75
|
+
], (line) => this.log(line));
|
|
76
|
+
this.log(`Approve with \`${this.config.bin} machines dedicated service approve ${leaseId} <name>\` (add --reject to refuse).`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.default = DedicatedServiceLs;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DedicatedServiceCommand } from '../../../../lib/dedicated-service-command';
|
|
2
|
+
/** `skrr machines dedicated service restart` — bounce it now; also re-arms a `failed` service. */
|
|
3
|
+
export default class DedicatedServiceRestart extends DedicatedServiceCommand {
|
|
4
|
+
static summary: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static args: {
|
|
7
|
+
lease: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
8
|
+
name: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
|
|
9
|
+
};
|
|
10
|
+
static flags: {
|
|
11
|
+
json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("@oclif/core");
|
|
4
|
+
const dedicated_service_command_1 = require("../../../../lib/dedicated-service-command");
|
|
5
|
+
/** `skrr machines dedicated service restart` — bounce it now; also re-arms a `failed` service. */
|
|
6
|
+
class DedicatedServiceRestart extends dedicated_service_command_1.DedicatedServiceCommand {
|
|
7
|
+
static summary = 'Restart a service now (re-arms a failed one)';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> machines dedicated service restart <lease-id> <name>',
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
lease: core_1.Args.string({
|
|
13
|
+
description: dedicated_service_command_1.SERVICE_LEASE_ARG_DESCRIPTION,
|
|
14
|
+
required: true,
|
|
15
|
+
ignoreStdin: true,
|
|
16
|
+
}),
|
|
17
|
+
name: core_1.Args.string({ description: 'Service name', required: true, ignoreStdin: true }),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
json: core_1.Flags.boolean({ description: 'Output the result as JSON' }),
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
this.requireAuth();
|
|
24
|
+
const { args, flags } = await this.parse(DedicatedServiceRestart);
|
|
25
|
+
const leaseId = await this.resolveLeaseArg(args.lease);
|
|
26
|
+
await this.runServiceAction(leaseId, args.name, 'restart', flags);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.default = DedicatedServiceRestart;
|