@vm0/cli 9.59.6 → 9.60.1
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/index.js +364 -598
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -45,7 +45,7 @@ if (DSN) {
|
|
|
45
45
|
Sentry.init({
|
|
46
46
|
dsn: DSN,
|
|
47
47
|
environment: process.env.SENTRY_ENVIRONMENT ?? "production",
|
|
48
|
-
release: "9.
|
|
48
|
+
release: "9.60.1",
|
|
49
49
|
sendDefaultPii: false,
|
|
50
50
|
tracesSampleRate: 0,
|
|
51
51
|
shutdownTimeout: 500,
|
|
@@ -64,7 +64,7 @@ if (DSN) {
|
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
66
|
Sentry.setContext("cli", {
|
|
67
|
-
version: "9.
|
|
67
|
+
version: "9.60.1",
|
|
68
68
|
command: process.argv.slice(2).join(" ")
|
|
69
69
|
});
|
|
70
70
|
Sentry.setContext("runtime", {
|
|
@@ -83,7 +83,7 @@ process.stdout.on("error", handleEpipe);
|
|
|
83
83
|
process.stderr.on("error", handleEpipe);
|
|
84
84
|
|
|
85
85
|
// src/index.ts
|
|
86
|
-
import { Command as
|
|
86
|
+
import { Command as Command86 } from "commander";
|
|
87
87
|
|
|
88
88
|
// src/lib/network/proxy.ts
|
|
89
89
|
import { EnvHttpProxyAgent, setGlobalDispatcher } from "undici";
|
|
@@ -673,7 +673,7 @@ function getConfigPath() {
|
|
|
673
673
|
return join2(homedir2(), ".vm0", "config.json");
|
|
674
674
|
}
|
|
675
675
|
var infoCommand = new Command6().name("info").description("Display environment and debug information").action(async () => {
|
|
676
|
-
console.log(chalk4.bold(`VM0 CLI v${"9.
|
|
676
|
+
console.log(chalk4.bold(`VM0 CLI v${"9.60.1"}`));
|
|
677
677
|
console.log();
|
|
678
678
|
const config = await loadConfig();
|
|
679
679
|
const hasEnvToken = !!process.env.VM0_TOKEN;
|
|
@@ -1044,8 +1044,7 @@ var composeListItemSchema = z3.object({
|
|
|
1044
1044
|
displayName: z3.string().nullable().optional(),
|
|
1045
1045
|
description: z3.string().nullable().optional(),
|
|
1046
1046
|
headVersionId: z3.string().nullable(),
|
|
1047
|
-
updatedAt: z3.string()
|
|
1048
|
-
isOwner: z3.boolean()
|
|
1047
|
+
updatedAt: z3.string()
|
|
1049
1048
|
});
|
|
1050
1049
|
var composesListContract = c.router({
|
|
1051
1050
|
/**
|
|
@@ -3198,7 +3197,10 @@ var deployScheduleRequestSchema = z16.object({
|
|
|
3198
3197
|
// Resolved agent compose ID (CLI resolves org/name:version → composeId)
|
|
3199
3198
|
composeId: z16.string().uuid("Invalid compose ID"),
|
|
3200
3199
|
// Enable schedule immediately upon creation
|
|
3201
|
-
enabled: z16.boolean().optional()
|
|
3200
|
+
enabled: z16.boolean().optional(),
|
|
3201
|
+
// Per-schedule notification control (AND'd with user global preferences)
|
|
3202
|
+
notifyEmail: z16.boolean().optional(),
|
|
3203
|
+
notifySlack: z16.boolean().optional()
|
|
3202
3204
|
}).refine(
|
|
3203
3205
|
(data) => {
|
|
3204
3206
|
const triggers = [
|
|
@@ -3232,6 +3234,8 @@ var scheduleResponseSchema = z16.object({
|
|
|
3232
3234
|
artifactVersion: z16.string().nullable(),
|
|
3233
3235
|
volumeVersions: z16.record(z16.string(), z16.string()).nullable(),
|
|
3234
3236
|
enabled: z16.boolean(),
|
|
3237
|
+
notifyEmail: z16.boolean(),
|
|
3238
|
+
notifySlack: z16.boolean(),
|
|
3235
3239
|
nextRunAt: z16.string().nullable(),
|
|
3236
3240
|
lastRunAt: z16.string().nullable(),
|
|
3237
3241
|
retryStartedAt: z16.string().nullable(),
|
|
@@ -8001,15 +8005,6 @@ async function httpPost(path18, body) {
|
|
|
8001
8005
|
body: JSON.stringify(body)
|
|
8002
8006
|
});
|
|
8003
8007
|
}
|
|
8004
|
-
async function httpDelete(path18) {
|
|
8005
|
-
const baseUrl = await getBaseUrl();
|
|
8006
|
-
const headers = await getRawHeaders();
|
|
8007
|
-
const orgPath = await appendOrgParam(path18);
|
|
8008
|
-
return fetch(`${baseUrl}${orgPath}`, {
|
|
8009
|
-
method: "DELETE",
|
|
8010
|
-
headers
|
|
8011
|
-
});
|
|
8012
|
-
}
|
|
8013
8008
|
|
|
8014
8009
|
// src/lib/api/domains/composes.ts
|
|
8015
8010
|
import { initClient } from "@ts-rest/core";
|
|
@@ -9948,7 +9943,7 @@ var composeCommand = new Command7().name("compose").description("Create or updat
|
|
|
9948
9943
|
options.autoUpdate = false;
|
|
9949
9944
|
}
|
|
9950
9945
|
if (options.autoUpdate !== false) {
|
|
9951
|
-
await startSilentUpgrade("9.
|
|
9946
|
+
await startSilentUpgrade("9.60.1");
|
|
9952
9947
|
}
|
|
9953
9948
|
try {
|
|
9954
9949
|
let result;
|
|
@@ -11115,30 +11110,13 @@ var mainRunCommand = new Command8().name("run").description("Run an agent").argu
|
|
|
11115
11110
|
).option(
|
|
11116
11111
|
"--model-provider <type>",
|
|
11117
11112
|
"Override model provider (e.g., anthropic-api-key)"
|
|
11118
|
-
).option("--verbose", "Show full tool inputs and outputs").option(
|
|
11119
|
-
"--experimental-shared-agent",
|
|
11120
|
-
"Allow running agents shared by other users (required when running org/agent format)"
|
|
11121
|
-
).option("--check-env", "Validate secrets and vars before running").addOption(new Option2("--debug-no-mock-claude").hideHelp()).addOption(new Option2("--no-auto-update").hideHelp()).action(
|
|
11113
|
+
).option("--verbose", "Show full tool inputs and outputs").option("--check-env", "Validate secrets and vars before running").addOption(new Option2("--debug-no-mock-claude").hideHelp()).addOption(new Option2("--no-auto-update").hideHelp()).action(
|
|
11122
11114
|
withErrorHandler(
|
|
11123
11115
|
async (identifier, prompt, options) => {
|
|
11124
11116
|
if (options.autoUpdate !== false) {
|
|
11125
|
-
await startSilentUpgrade("9.
|
|
11117
|
+
await startSilentUpgrade("9.60.1");
|
|
11126
11118
|
}
|
|
11127
11119
|
const { org, name, version } = parseIdentifier(identifier);
|
|
11128
|
-
if (org && !options.experimentalSharedAgent) {
|
|
11129
|
-
const defaultOrg = await getOrg();
|
|
11130
|
-
const isOwnOrg = defaultOrg.slug === org;
|
|
11131
|
-
if (!isOwnOrg) {
|
|
11132
|
-
throw new Error(
|
|
11133
|
-
"Running shared agents requires --experimental-shared-agent flag",
|
|
11134
|
-
{
|
|
11135
|
-
cause: new Error(
|
|
11136
|
-
`Use: vm0 run ${identifier} --experimental-shared-agent "your prompt"`
|
|
11137
|
-
)
|
|
11138
|
-
}
|
|
11139
|
-
);
|
|
11140
|
-
}
|
|
11141
|
-
}
|
|
11142
11120
|
let composeId;
|
|
11143
11121
|
let composeContent;
|
|
11144
11122
|
if (isUUID(name)) {
|
|
@@ -12809,7 +12787,7 @@ var cookAction = new Command34().name("cook").description("Quick start: prepare,
|
|
|
12809
12787
|
withErrorHandler(
|
|
12810
12788
|
async (prompt, options) => {
|
|
12811
12789
|
if (options.autoUpdate !== false) {
|
|
12812
|
-
const shouldExit = await checkAndUpgrade("9.
|
|
12790
|
+
const shouldExit = await checkAndUpgrade("9.60.1", prompt);
|
|
12813
12791
|
if (shouldExit) {
|
|
12814
12792
|
process.exit(0);
|
|
12815
12793
|
}
|
|
@@ -14255,7 +14233,7 @@ var leaveCommand = new Command47().name("leave").description("Leave the current
|
|
|
14255
14233
|
var orgCommand = new Command48().name("org").description("Manage your organization (namespace for agents)").addCommand(statusCommand5).addCommand(setCommand).addCommand(listCommand5).addCommand(useCommand).addCommand(membersCommand).addCommand(inviteCommand).addCommand(removeCommand).addCommand(leaveCommand);
|
|
14256
14234
|
|
|
14257
14235
|
// src/commands/agent/index.ts
|
|
14258
|
-
import { Command as
|
|
14236
|
+
import { Command as Command53 } from "commander";
|
|
14259
14237
|
|
|
14260
14238
|
// src/commands/agent/clone.ts
|
|
14261
14239
|
import { Command as Command49 } from "commander";
|
|
@@ -14663,260 +14641,12 @@ var statusCommand6 = new Command52().name("status").description("Show status of
|
|
|
14663
14641
|
)
|
|
14664
14642
|
);
|
|
14665
14643
|
|
|
14666
|
-
// src/commands/agent/public.ts
|
|
14667
|
-
import { Command as Command53 } from "commander";
|
|
14668
|
-
import chalk49 from "chalk";
|
|
14669
|
-
var publicCommand = new Command53().name("public").description("Make an agent public (accessible to all authenticated users)").argument("<name>", "Agent name").option(
|
|
14670
|
-
"--experimental-shared-agent",
|
|
14671
|
-
"Enable experimental agent sharing feature"
|
|
14672
|
-
).action(
|
|
14673
|
-
withErrorHandler(
|
|
14674
|
-
async (name, options) => {
|
|
14675
|
-
if (!options.experimentalSharedAgent) {
|
|
14676
|
-
throw new Error(
|
|
14677
|
-
"This command requires --experimental-shared-agent flag",
|
|
14678
|
-
{
|
|
14679
|
-
cause: new Error(
|
|
14680
|
-
`Use: vm0 agent public ${name} --experimental-shared-agent`
|
|
14681
|
-
)
|
|
14682
|
-
}
|
|
14683
|
-
);
|
|
14684
|
-
}
|
|
14685
|
-
const compose = await getComposeByName(name);
|
|
14686
|
-
if (!compose) {
|
|
14687
|
-
throw new Error(`Agent not found: ${name}`);
|
|
14688
|
-
}
|
|
14689
|
-
const org = await getOrg();
|
|
14690
|
-
const response = await httpPost(
|
|
14691
|
-
`/api/agent/composes/${compose.id}/permissions`,
|
|
14692
|
-
{ granteeType: "public" }
|
|
14693
|
-
);
|
|
14694
|
-
if (!response.ok) {
|
|
14695
|
-
const error = await response.json();
|
|
14696
|
-
if (response.status === 409) {
|
|
14697
|
-
console.log(chalk49.yellow(`Agent "${name}" is already public`));
|
|
14698
|
-
return;
|
|
14699
|
-
}
|
|
14700
|
-
throw new Error(
|
|
14701
|
-
error.error?.message || "Failed to make agent public"
|
|
14702
|
-
);
|
|
14703
|
-
}
|
|
14704
|
-
const fullName = `${org.slug}/${name}`;
|
|
14705
|
-
console.log(chalk49.green(`\u2713 Agent "${name}" is now public`));
|
|
14706
|
-
console.log();
|
|
14707
|
-
console.log("Others can now run your agent with:");
|
|
14708
|
-
console.log(
|
|
14709
|
-
chalk49.cyan(
|
|
14710
|
-
` vm0 run ${fullName} --experimental-shared-agent "your prompt"`
|
|
14711
|
-
)
|
|
14712
|
-
);
|
|
14713
|
-
}
|
|
14714
|
-
)
|
|
14715
|
-
);
|
|
14716
|
-
|
|
14717
|
-
// src/commands/agent/private.ts
|
|
14718
|
-
import { Command as Command54 } from "commander";
|
|
14719
|
-
import chalk50 from "chalk";
|
|
14720
|
-
var privateCommand = new Command54().name("private").description("Make an agent private (remove public access)").argument("<name>", "Agent name").option(
|
|
14721
|
-
"--experimental-shared-agent",
|
|
14722
|
-
"Enable experimental agent sharing feature"
|
|
14723
|
-
).action(
|
|
14724
|
-
withErrorHandler(
|
|
14725
|
-
async (name, options) => {
|
|
14726
|
-
if (!options.experimentalSharedAgent) {
|
|
14727
|
-
throw new Error(
|
|
14728
|
-
"This command requires --experimental-shared-agent flag",
|
|
14729
|
-
{
|
|
14730
|
-
cause: new Error(
|
|
14731
|
-
`Use: vm0 agent private ${name} --experimental-shared-agent`
|
|
14732
|
-
)
|
|
14733
|
-
}
|
|
14734
|
-
);
|
|
14735
|
-
}
|
|
14736
|
-
const compose = await getComposeByName(name);
|
|
14737
|
-
if (!compose) {
|
|
14738
|
-
throw new Error(`Agent not found: ${name}`);
|
|
14739
|
-
}
|
|
14740
|
-
const response = await httpDelete(
|
|
14741
|
-
`/api/agent/composes/${compose.id}/permissions?type=public`
|
|
14742
|
-
);
|
|
14743
|
-
if (!response.ok) {
|
|
14744
|
-
const error = await response.json();
|
|
14745
|
-
if (response.status === 404) {
|
|
14746
|
-
console.log(chalk50.yellow(`Agent "${name}" is already private`));
|
|
14747
|
-
return;
|
|
14748
|
-
}
|
|
14749
|
-
throw new Error(
|
|
14750
|
-
error.error?.message || "Failed to make agent private"
|
|
14751
|
-
);
|
|
14752
|
-
}
|
|
14753
|
-
console.log(chalk50.green(`\u2713 Agent "${name}" is now private`));
|
|
14754
|
-
}
|
|
14755
|
-
)
|
|
14756
|
-
);
|
|
14757
|
-
|
|
14758
|
-
// src/commands/agent/share.ts
|
|
14759
|
-
import { Command as Command55 } from "commander";
|
|
14760
|
-
import chalk51 from "chalk";
|
|
14761
|
-
var shareCommand = new Command55().name("share").description("Share an agent with a user by email").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to share with").option(
|
|
14762
|
-
"--experimental-shared-agent",
|
|
14763
|
-
"Enable experimental agent sharing feature"
|
|
14764
|
-
).action(
|
|
14765
|
-
withErrorHandler(
|
|
14766
|
-
async (name, options) => {
|
|
14767
|
-
if (!options.experimentalSharedAgent) {
|
|
14768
|
-
throw new Error(
|
|
14769
|
-
"This command requires --experimental-shared-agent flag",
|
|
14770
|
-
{
|
|
14771
|
-
cause: new Error(
|
|
14772
|
-
`Use: vm0 agent share ${name} --email ${options.email} --experimental-shared-agent`
|
|
14773
|
-
)
|
|
14774
|
-
}
|
|
14775
|
-
);
|
|
14776
|
-
}
|
|
14777
|
-
const compose = await getComposeByName(name);
|
|
14778
|
-
if (!compose) {
|
|
14779
|
-
throw new Error(`Agent not found: ${name}`);
|
|
14780
|
-
}
|
|
14781
|
-
const org = await getOrg();
|
|
14782
|
-
const response = await httpPost(
|
|
14783
|
-
`/api/agent/composes/${compose.id}/permissions`,
|
|
14784
|
-
{ granteeType: "email", granteeEmail: options.email }
|
|
14785
|
-
);
|
|
14786
|
-
if (!response.ok) {
|
|
14787
|
-
const error = await response.json();
|
|
14788
|
-
if (response.status === 409) {
|
|
14789
|
-
console.log(
|
|
14790
|
-
chalk51.yellow(
|
|
14791
|
-
`Agent "${name}" is already shared with ${options.email}`
|
|
14792
|
-
)
|
|
14793
|
-
);
|
|
14794
|
-
return;
|
|
14795
|
-
}
|
|
14796
|
-
throw new Error(error.error?.message || "Failed to share agent");
|
|
14797
|
-
}
|
|
14798
|
-
const fullName = `${org.slug}/${name}`;
|
|
14799
|
-
console.log(
|
|
14800
|
-
chalk51.green(`\u2713 Agent "${name}" shared with ${options.email}`)
|
|
14801
|
-
);
|
|
14802
|
-
console.log();
|
|
14803
|
-
console.log("They can now run your agent with:");
|
|
14804
|
-
console.log(
|
|
14805
|
-
chalk51.cyan(
|
|
14806
|
-
` vm0 run ${fullName} --experimental-shared-agent "your prompt"`
|
|
14807
|
-
)
|
|
14808
|
-
);
|
|
14809
|
-
}
|
|
14810
|
-
)
|
|
14811
|
-
);
|
|
14812
|
-
|
|
14813
|
-
// src/commands/agent/unshare.ts
|
|
14814
|
-
import { Command as Command56 } from "commander";
|
|
14815
|
-
import chalk52 from "chalk";
|
|
14816
|
-
var unshareCommand = new Command56().name("unshare").description("Remove sharing from a user").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to unshare").option(
|
|
14817
|
-
"--experimental-shared-agent",
|
|
14818
|
-
"Enable experimental agent sharing feature"
|
|
14819
|
-
).action(
|
|
14820
|
-
withErrorHandler(
|
|
14821
|
-
async (name, options) => {
|
|
14822
|
-
if (!options.experimentalSharedAgent) {
|
|
14823
|
-
throw new Error(
|
|
14824
|
-
"This command requires --experimental-shared-agent flag",
|
|
14825
|
-
{
|
|
14826
|
-
cause: new Error(
|
|
14827
|
-
`Use: vm0 agent unshare ${name} --email ${options.email} --experimental-shared-agent`
|
|
14828
|
-
)
|
|
14829
|
-
}
|
|
14830
|
-
);
|
|
14831
|
-
}
|
|
14832
|
-
const compose = await getComposeByName(name);
|
|
14833
|
-
if (!compose) {
|
|
14834
|
-
throw new Error(`Agent not found: ${name}`);
|
|
14835
|
-
}
|
|
14836
|
-
const response = await httpDelete(
|
|
14837
|
-
`/api/agent/composes/${compose.id}/permissions?type=email&email=${encodeURIComponent(options.email)}`
|
|
14838
|
-
);
|
|
14839
|
-
if (!response.ok) {
|
|
14840
|
-
const error = await response.json();
|
|
14841
|
-
if (response.status === 404) {
|
|
14842
|
-
console.log(
|
|
14843
|
-
chalk52.yellow(
|
|
14844
|
-
`Agent "${name}" is not shared with ${options.email}`
|
|
14845
|
-
)
|
|
14846
|
-
);
|
|
14847
|
-
return;
|
|
14848
|
-
}
|
|
14849
|
-
throw new Error(error.error?.message || "Failed to unshare agent");
|
|
14850
|
-
}
|
|
14851
|
-
console.log(
|
|
14852
|
-
chalk52.green(`\u2713 Removed sharing of "${name}" from ${options.email}`)
|
|
14853
|
-
);
|
|
14854
|
-
}
|
|
14855
|
-
)
|
|
14856
|
-
);
|
|
14857
|
-
|
|
14858
|
-
// src/commands/agent/permission.ts
|
|
14859
|
-
import { Command as Command57 } from "commander";
|
|
14860
|
-
import chalk53 from "chalk";
|
|
14861
|
-
var permissionCommand = new Command57().name("permission").description("List all permissions for an agent").argument("<name>", "Agent name").option(
|
|
14862
|
-
"--experimental-shared-agent",
|
|
14863
|
-
"Enable experimental agent sharing feature"
|
|
14864
|
-
).action(
|
|
14865
|
-
withErrorHandler(
|
|
14866
|
-
async (name, options) => {
|
|
14867
|
-
if (!options.experimentalSharedAgent) {
|
|
14868
|
-
throw new Error(
|
|
14869
|
-
"This command requires --experimental-shared-agent flag",
|
|
14870
|
-
{
|
|
14871
|
-
cause: new Error(
|
|
14872
|
-
`Use: vm0 agent permission ${name} --experimental-shared-agent`
|
|
14873
|
-
)
|
|
14874
|
-
}
|
|
14875
|
-
);
|
|
14876
|
-
}
|
|
14877
|
-
const compose = await getComposeByName(name);
|
|
14878
|
-
if (!compose) {
|
|
14879
|
-
throw new Error(`Agent not found: ${name}`);
|
|
14880
|
-
}
|
|
14881
|
-
const response = await httpGet(
|
|
14882
|
-
`/api/agent/composes/${compose.id}/permissions`
|
|
14883
|
-
);
|
|
14884
|
-
if (!response.ok) {
|
|
14885
|
-
const error = await response.json();
|
|
14886
|
-
throw new Error(error.error?.message || "Failed to list permissions");
|
|
14887
|
-
}
|
|
14888
|
-
const data = await response.json();
|
|
14889
|
-
if (data.permissions.length === 0) {
|
|
14890
|
-
console.log(chalk53.dim("No permissions set (private agent)"));
|
|
14891
|
-
return;
|
|
14892
|
-
}
|
|
14893
|
-
console.log(
|
|
14894
|
-
chalk53.dim(
|
|
14895
|
-
"TYPE EMAIL PERMISSION GRANTED"
|
|
14896
|
-
)
|
|
14897
|
-
);
|
|
14898
|
-
console.log(
|
|
14899
|
-
chalk53.dim(
|
|
14900
|
-
"------- ----------------------------- ---------- ----------"
|
|
14901
|
-
)
|
|
14902
|
-
);
|
|
14903
|
-
for (const p of data.permissions) {
|
|
14904
|
-
const type2 = p.granteeType.padEnd(7);
|
|
14905
|
-
const email = (p.granteeEmail ?? "-").padEnd(29);
|
|
14906
|
-
const permission = p.permission.padEnd(10);
|
|
14907
|
-
const granted = formatRelativeTime(p.createdAt);
|
|
14908
|
-
console.log(`${type2} ${email} ${permission} ${granted}`);
|
|
14909
|
-
}
|
|
14910
|
-
}
|
|
14911
|
-
)
|
|
14912
|
-
);
|
|
14913
|
-
|
|
14914
14644
|
// src/commands/agent/index.ts
|
|
14915
|
-
var agentCommand = new
|
|
14645
|
+
var agentCommand = new Command53().name("agent").description("Manage agent composes").addCommand(cloneCommand4).addCommand(deleteCommand).addCommand(listCommand6).addCommand(statusCommand6);
|
|
14916
14646
|
|
|
14917
14647
|
// src/commands/init/index.ts
|
|
14918
|
-
import { Command as
|
|
14919
|
-
import
|
|
14648
|
+
import { Command as Command54 } from "commander";
|
|
14649
|
+
import chalk49 from "chalk";
|
|
14920
14650
|
import path17 from "path";
|
|
14921
14651
|
import { existsSync as existsSync11 } from "fs";
|
|
14922
14652
|
import { writeFile as writeFile7 } from "fs/promises";
|
|
@@ -14954,7 +14684,7 @@ function checkExistingFiles() {
|
|
|
14954
14684
|
if (existsSync11(AGENTS_MD_FILE)) existingFiles.push(AGENTS_MD_FILE);
|
|
14955
14685
|
return existingFiles;
|
|
14956
14686
|
}
|
|
14957
|
-
var initCommand4 = new
|
|
14687
|
+
var initCommand4 = new Command54().name("init").description("Initialize a new VM0 project in the current directory").option("-f, --force", "Overwrite existing files").option("-n, --name <name>", "Agent name (required in non-interactive mode)").action(
|
|
14958
14688
|
withErrorHandler(async (options) => {
|
|
14959
14689
|
const existingFiles = checkExistingFiles();
|
|
14960
14690
|
if (existingFiles.length > 0 && !options.force) {
|
|
@@ -14983,7 +14713,7 @@ var initCommand4 = new Command59().name("init").description("Initialize a new VM
|
|
|
14983
14713
|
}
|
|
14984
14714
|
);
|
|
14985
14715
|
if (name === void 0) {
|
|
14986
|
-
console.log(
|
|
14716
|
+
console.log(chalk49.dim("Cancelled"));
|
|
14987
14717
|
return;
|
|
14988
14718
|
}
|
|
14989
14719
|
agentName = name;
|
|
@@ -14997,33 +14727,33 @@ var initCommand4 = new Command59().name("init").description("Initialize a new VM
|
|
|
14997
14727
|
}
|
|
14998
14728
|
await writeFile7(VM0_YAML_FILE, generateVm0Yaml(agentName));
|
|
14999
14729
|
const vm0Status = existingFiles.includes(VM0_YAML_FILE) ? " (overwritten)" : "";
|
|
15000
|
-
console.log(
|
|
14730
|
+
console.log(chalk49.green(`\u2713 Created ${VM0_YAML_FILE}${vm0Status}`));
|
|
15001
14731
|
await writeFile7(AGENTS_MD_FILE, generateAgentsMd());
|
|
15002
14732
|
const agentsStatus = existingFiles.includes(AGENTS_MD_FILE) ? " (overwritten)" : "";
|
|
15003
|
-
console.log(
|
|
14733
|
+
console.log(chalk49.green(`\u2713 Created ${AGENTS_MD_FILE}${agentsStatus}`));
|
|
15004
14734
|
console.log();
|
|
15005
14735
|
console.log("Next steps:");
|
|
15006
14736
|
console.log(
|
|
15007
|
-
` 1. Set up model provider (one-time): ${
|
|
14737
|
+
` 1. Set up model provider (one-time): ${chalk49.cyan("vm0 model-provider setup")}`
|
|
15008
14738
|
);
|
|
15009
14739
|
console.log(
|
|
15010
|
-
` 2. Edit ${
|
|
14740
|
+
` 2. Edit ${chalk49.cyan("AGENTS.md")} to customize your agent's workflow`
|
|
15011
14741
|
);
|
|
15012
14742
|
console.log(
|
|
15013
|
-
` Or install Claude plugin: ${
|
|
14743
|
+
` Or install Claude plugin: ${chalk49.cyan(`vm0 setup-claude && claude "/vm0-agent let's build an agent"`)}`
|
|
15014
14744
|
);
|
|
15015
14745
|
console.log(
|
|
15016
|
-
` 3. Run your agent: ${
|
|
14746
|
+
` 3. Run your agent: ${chalk49.cyan(`vm0 cook "let's start working"`)}`
|
|
15017
14747
|
);
|
|
15018
14748
|
})
|
|
15019
14749
|
);
|
|
15020
14750
|
|
|
15021
14751
|
// src/commands/schedule/index.ts
|
|
15022
|
-
import { Command as
|
|
14752
|
+
import { Command as Command61 } from "commander";
|
|
15023
14753
|
|
|
15024
14754
|
// src/commands/schedule/setup.ts
|
|
15025
|
-
import { Command as
|
|
15026
|
-
import
|
|
14755
|
+
import { Command as Command55 } from "commander";
|
|
14756
|
+
import chalk50 from "chalk";
|
|
15027
14757
|
|
|
15028
14758
|
// src/lib/domain/schedule-utils.ts
|
|
15029
14759
|
import { parse as parseYaml5 } from "yaml";
|
|
@@ -15394,6 +15124,29 @@ async function gatherPromptText(optionPrompt, existingPrompt) {
|
|
|
15394
15124
|
existingPrompt || "let's start working."
|
|
15395
15125
|
);
|
|
15396
15126
|
}
|
|
15127
|
+
async function gatherNotificationPreferences(optionNotifyEmail, optionNotifySlack, existingSchedule) {
|
|
15128
|
+
if (optionNotifyEmail !== void 0 && optionNotifySlack !== void 0) {
|
|
15129
|
+
return {
|
|
15130
|
+
notifyEmail: optionNotifyEmail,
|
|
15131
|
+
notifySlack: optionNotifySlack
|
|
15132
|
+
};
|
|
15133
|
+
}
|
|
15134
|
+
if (!isInteractive()) {
|
|
15135
|
+
return {
|
|
15136
|
+
notifyEmail: optionNotifyEmail,
|
|
15137
|
+
notifySlack: optionNotifySlack
|
|
15138
|
+
};
|
|
15139
|
+
}
|
|
15140
|
+
const notifyEmail = optionNotifyEmail ?? await promptConfirm(
|
|
15141
|
+
"Enable email notifications?",
|
|
15142
|
+
existingSchedule?.notifyEmail ?? true
|
|
15143
|
+
);
|
|
15144
|
+
const notifySlack = optionNotifySlack ?? await promptConfirm(
|
|
15145
|
+
"Enable Slack notifications?",
|
|
15146
|
+
existingSchedule?.notifySlack ?? true
|
|
15147
|
+
);
|
|
15148
|
+
return { notifyEmail, notifySlack };
|
|
15149
|
+
}
|
|
15397
15150
|
async function resolveAgent(agentName, scheduleName) {
|
|
15398
15151
|
const compose = await getComposeByName(agentName);
|
|
15399
15152
|
if (!compose) {
|
|
@@ -15490,7 +15243,7 @@ async function buildAndDeploy(params) {
|
|
|
15490
15243
|
}
|
|
15491
15244
|
console.log(
|
|
15492
15245
|
`
|
|
15493
|
-
Deploying schedule for agent ${
|
|
15246
|
+
Deploying schedule for agent ${chalk50.cyan(params.agentName)}...`
|
|
15494
15247
|
);
|
|
15495
15248
|
const deployResult = await deploySchedule({
|
|
15496
15249
|
name: params.scheduleName,
|
|
@@ -15500,69 +15253,75 @@ Deploying schedule for agent ${chalk55.cyan(params.agentName)}...`
|
|
|
15500
15253
|
intervalSeconds: params.intervalSeconds,
|
|
15501
15254
|
timezone: params.timezone,
|
|
15502
15255
|
prompt: params.prompt,
|
|
15503
|
-
artifactName: params.artifactName
|
|
15256
|
+
artifactName: params.artifactName,
|
|
15257
|
+
...params.notifyEmail !== void 0 && {
|
|
15258
|
+
notifyEmail: params.notifyEmail
|
|
15259
|
+
},
|
|
15260
|
+
...params.notifySlack !== void 0 && {
|
|
15261
|
+
notifySlack: params.notifySlack
|
|
15262
|
+
}
|
|
15504
15263
|
});
|
|
15505
15264
|
return deployResult;
|
|
15506
15265
|
}
|
|
15507
15266
|
function displayDeployResult(agentName, deployResult) {
|
|
15508
15267
|
if (deployResult.created) {
|
|
15509
15268
|
console.log(
|
|
15510
|
-
|
|
15269
|
+
chalk50.green(`\u2713 Created schedule for agent ${chalk50.cyan(agentName)}`)
|
|
15511
15270
|
);
|
|
15512
15271
|
} else {
|
|
15513
15272
|
console.log(
|
|
15514
|
-
|
|
15273
|
+
chalk50.green(`\u2713 Updated schedule for agent ${chalk50.cyan(agentName)}`)
|
|
15515
15274
|
);
|
|
15516
15275
|
}
|
|
15517
|
-
console.log(
|
|
15276
|
+
console.log(chalk50.dim(` Timezone: ${deployResult.schedule.timezone}`));
|
|
15518
15277
|
if (deployResult.schedule.triggerType === "loop" && deployResult.schedule.intervalSeconds != null) {
|
|
15519
15278
|
console.log(
|
|
15520
|
-
|
|
15279
|
+
chalk50.dim(
|
|
15521
15280
|
` Mode: Loop (interval ${deployResult.schedule.intervalSeconds}s)`
|
|
15522
15281
|
)
|
|
15523
15282
|
);
|
|
15524
15283
|
} else if (deployResult.schedule.cronExpression) {
|
|
15525
|
-
console.log(
|
|
15284
|
+
console.log(chalk50.dim(` Cron: ${deployResult.schedule.cronExpression}`));
|
|
15526
15285
|
if (deployResult.schedule.nextRunAt) {
|
|
15527
15286
|
const nextRun = formatInTimezone(
|
|
15528
15287
|
deployResult.schedule.nextRunAt,
|
|
15529
15288
|
deployResult.schedule.timezone
|
|
15530
15289
|
);
|
|
15531
|
-
console.log(
|
|
15290
|
+
console.log(chalk50.dim(` Next run: ${nextRun}`));
|
|
15532
15291
|
}
|
|
15533
15292
|
} else if (deployResult.schedule.atTime) {
|
|
15534
15293
|
const atTimeFormatted = formatInTimezone(
|
|
15535
15294
|
deployResult.schedule.atTime,
|
|
15536
15295
|
deployResult.schedule.timezone
|
|
15537
15296
|
);
|
|
15538
|
-
console.log(
|
|
15297
|
+
console.log(chalk50.dim(` At: ${atTimeFormatted}`));
|
|
15539
15298
|
}
|
|
15540
15299
|
}
|
|
15541
15300
|
async function tryEnableSchedule(scheduleName, composeId, agentName) {
|
|
15542
15301
|
try {
|
|
15543
15302
|
await enableSchedule({ name: scheduleName, composeId });
|
|
15544
15303
|
console.log(
|
|
15545
|
-
|
|
15304
|
+
chalk50.green(`\u2713 Enabled schedule for agent ${chalk50.cyan(agentName)}`)
|
|
15546
15305
|
);
|
|
15547
15306
|
} catch (error) {
|
|
15548
|
-
console.error(
|
|
15307
|
+
console.error(chalk50.yellow("\u26A0 Failed to enable schedule"));
|
|
15549
15308
|
if (error instanceof ApiRequestError) {
|
|
15550
15309
|
if (error.code === "SCHEDULE_PAST") {
|
|
15551
|
-
console.error(
|
|
15310
|
+
console.error(chalk50.dim(" Scheduled time has already passed"));
|
|
15552
15311
|
} else {
|
|
15553
|
-
console.error(
|
|
15312
|
+
console.error(chalk50.dim(` ${error.message}`));
|
|
15554
15313
|
}
|
|
15555
15314
|
} else if (error instanceof Error) {
|
|
15556
|
-
console.error(
|
|
15315
|
+
console.error(chalk50.dim(` ${error.message}`));
|
|
15557
15316
|
}
|
|
15558
15317
|
console.log(
|
|
15559
|
-
` To enable manually: ${
|
|
15318
|
+
` To enable manually: ${chalk50.cyan(`vm0 schedule enable ${agentName}`)}`
|
|
15560
15319
|
);
|
|
15561
15320
|
}
|
|
15562
15321
|
}
|
|
15563
15322
|
function showEnableHint(agentName) {
|
|
15564
15323
|
console.log();
|
|
15565
|
-
console.log(` To enable: ${
|
|
15324
|
+
console.log(` To enable: ${chalk50.cyan(`vm0 schedule enable ${agentName}`)}`);
|
|
15566
15325
|
}
|
|
15567
15326
|
async function handleScheduleEnabling(params) {
|
|
15568
15327
|
const { scheduleName, composeId, agentName, enableFlag, shouldPromptEnable } = params;
|
|
@@ -15583,7 +15342,7 @@ async function handleScheduleEnabling(params) {
|
|
|
15583
15342
|
showEnableHint(agentName);
|
|
15584
15343
|
}
|
|
15585
15344
|
}
|
|
15586
|
-
var setupCommand = new
|
|
15345
|
+
var setupCommand = new Command55().name("setup").description("Create or edit a schedule for an agent").argument("<agent-name>", "Agent name to configure schedule for").option("-n, --name <schedule-name>", 'Schedule name (default: "default")').option("-f, --frequency <type>", "Frequency: daily|weekly|monthly|once|loop").option("-t, --time <HH:MM>", "Time to run (24-hour format)").option("-d, --day <day>", "Day of week (mon-sun) or day of month (1-31)").option("-i, --interval <seconds>", "Interval in seconds for loop mode").option("-z, --timezone <tz>", "IANA timezone").option("-p, --prompt <text>", "Prompt to run").option("--artifact-name <name>", "Artifact name", "artifact").option("-e, --enable", "Enable schedule immediately after creation").option("--notify-email", "Enable email notifications (default: true)").option("--no-notify-email", "Disable email notifications").option("--notify-slack", "Enable Slack notifications (default: true)").option("--no-notify-slack", "Disable Slack notifications").action(
|
|
15587
15346
|
withErrorHandler(async (agentName, options) => {
|
|
15588
15347
|
const { composeId, scheduleName } = await resolveAgent(
|
|
15589
15348
|
agentName,
|
|
@@ -15594,7 +15353,7 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15594
15353
|
scheduleName
|
|
15595
15354
|
);
|
|
15596
15355
|
console.log(
|
|
15597
|
-
|
|
15356
|
+
chalk50.dim(
|
|
15598
15357
|
existingSchedule ? `Editing existing schedule for agent ${agentName}` : `Creating new schedule for agent ${agentName}`
|
|
15599
15358
|
)
|
|
15600
15359
|
);
|
|
@@ -15604,12 +15363,12 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15604
15363
|
defaults.frequency
|
|
15605
15364
|
);
|
|
15606
15365
|
if (!frequency) {
|
|
15607
|
-
console.log(
|
|
15366
|
+
console.log(chalk50.dim("Cancelled"));
|
|
15608
15367
|
return;
|
|
15609
15368
|
}
|
|
15610
15369
|
const timing = await gatherTiming(frequency, options, defaults);
|
|
15611
15370
|
if (!timing) {
|
|
15612
|
-
console.log(
|
|
15371
|
+
console.log(chalk50.dim("Cancelled"));
|
|
15613
15372
|
return;
|
|
15614
15373
|
}
|
|
15615
15374
|
const { day, time, atTime, intervalSeconds } = timing;
|
|
@@ -15618,7 +15377,7 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15618
15377
|
existingSchedule?.timezone
|
|
15619
15378
|
);
|
|
15620
15379
|
if (!timezone) {
|
|
15621
|
-
console.log(
|
|
15380
|
+
console.log(chalk50.dim("Cancelled"));
|
|
15622
15381
|
return;
|
|
15623
15382
|
}
|
|
15624
15383
|
const promptText_ = await gatherPromptText(
|
|
@@ -15626,9 +15385,14 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15626
15385
|
existingSchedule?.prompt
|
|
15627
15386
|
);
|
|
15628
15387
|
if (!promptText_) {
|
|
15629
|
-
console.log(
|
|
15388
|
+
console.log(chalk50.dim("Cancelled"));
|
|
15630
15389
|
return;
|
|
15631
15390
|
}
|
|
15391
|
+
const { notifyEmail, notifySlack } = await gatherNotificationPreferences(
|
|
15392
|
+
options.notifyEmail,
|
|
15393
|
+
options.notifySlack,
|
|
15394
|
+
existingSchedule
|
|
15395
|
+
);
|
|
15632
15396
|
const deployResult = await buildAndDeploy({
|
|
15633
15397
|
scheduleName,
|
|
15634
15398
|
composeId,
|
|
@@ -15640,7 +15404,9 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15640
15404
|
intervalSeconds,
|
|
15641
15405
|
timezone,
|
|
15642
15406
|
prompt: promptText_,
|
|
15643
|
-
artifactName: options.artifactName
|
|
15407
|
+
artifactName: options.artifactName,
|
|
15408
|
+
notifyEmail,
|
|
15409
|
+
notifySlack
|
|
15644
15410
|
});
|
|
15645
15411
|
displayDeployResult(agentName, deployResult);
|
|
15646
15412
|
const shouldPromptEnable = deployResult.created || existingSchedule !== void 0 && !existingSchedule.enabled;
|
|
@@ -15655,15 +15421,15 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15655
15421
|
);
|
|
15656
15422
|
|
|
15657
15423
|
// src/commands/schedule/list.ts
|
|
15658
|
-
import { Command as
|
|
15659
|
-
import
|
|
15660
|
-
var listCommand7 = new
|
|
15424
|
+
import { Command as Command56 } from "commander";
|
|
15425
|
+
import chalk51 from "chalk";
|
|
15426
|
+
var listCommand7 = new Command56().name("list").alias("ls").description("List all schedules").action(
|
|
15661
15427
|
withErrorHandler(async () => {
|
|
15662
15428
|
const result = await listSchedules();
|
|
15663
15429
|
if (result.schedules.length === 0) {
|
|
15664
|
-
console.log(
|
|
15430
|
+
console.log(chalk51.dim("No schedules found"));
|
|
15665
15431
|
console.log(
|
|
15666
|
-
|
|
15432
|
+
chalk51.dim(" Create one with: vm0 schedule setup <agent-name>")
|
|
15667
15433
|
);
|
|
15668
15434
|
return;
|
|
15669
15435
|
}
|
|
@@ -15688,10 +15454,10 @@ var listCommand7 = new Command61().name("list").alias("ls").description("List al
|
|
|
15688
15454
|
"STATUS".padEnd(8),
|
|
15689
15455
|
"NEXT RUN"
|
|
15690
15456
|
].join(" ");
|
|
15691
|
-
console.log(
|
|
15457
|
+
console.log(chalk51.dim(header));
|
|
15692
15458
|
for (const schedule of result.schedules) {
|
|
15693
15459
|
const trigger = schedule.cronExpression ? `${schedule.cronExpression} (${schedule.timezone})` : schedule.atTime || "-";
|
|
15694
|
-
const status = schedule.enabled ?
|
|
15460
|
+
const status = schedule.enabled ? chalk51.green("enabled") : chalk51.yellow("disabled");
|
|
15695
15461
|
const nextRun = schedule.enabled ? formatRelativeTime2(schedule.nextRunAt) : "-";
|
|
15696
15462
|
const row = [
|
|
15697
15463
|
schedule.composeName.padEnd(agentWidth),
|
|
@@ -15707,48 +15473,48 @@ var listCommand7 = new Command61().name("list").alias("ls").description("List al
|
|
|
15707
15473
|
);
|
|
15708
15474
|
|
|
15709
15475
|
// src/commands/schedule/status.ts
|
|
15710
|
-
import { Command as
|
|
15711
|
-
import
|
|
15476
|
+
import { Command as Command57 } from "commander";
|
|
15477
|
+
import chalk52 from "chalk";
|
|
15712
15478
|
function formatDateTimeStyled(dateStr) {
|
|
15713
|
-
if (!dateStr) return
|
|
15479
|
+
if (!dateStr) return chalk52.dim("-");
|
|
15714
15480
|
const formatted = formatDateTime(dateStr);
|
|
15715
|
-
return formatted.replace(/\(([^)]+)\)$/,
|
|
15481
|
+
return formatted.replace(/\(([^)]+)\)$/, chalk52.dim("($1)"));
|
|
15716
15482
|
}
|
|
15717
15483
|
function formatTrigger(schedule) {
|
|
15718
15484
|
if (schedule.triggerType === "loop" && schedule.intervalSeconds !== null) {
|
|
15719
|
-
return `interval ${schedule.intervalSeconds}s ${
|
|
15485
|
+
return `interval ${schedule.intervalSeconds}s ${chalk52.dim("(loop)")}`;
|
|
15720
15486
|
}
|
|
15721
15487
|
if (schedule.cronExpression) {
|
|
15722
15488
|
return schedule.cronExpression;
|
|
15723
15489
|
}
|
|
15724
15490
|
if (schedule.atTime) {
|
|
15725
|
-
return `${schedule.atTime} ${
|
|
15491
|
+
return `${schedule.atTime} ${chalk52.dim("(one-time)")}`;
|
|
15726
15492
|
}
|
|
15727
|
-
return
|
|
15493
|
+
return chalk52.dim("-");
|
|
15728
15494
|
}
|
|
15729
15495
|
function formatRunStatus2(status) {
|
|
15730
15496
|
switch (status) {
|
|
15731
15497
|
case "completed":
|
|
15732
|
-
return
|
|
15498
|
+
return chalk52.green(status);
|
|
15733
15499
|
case "failed":
|
|
15734
15500
|
case "timeout":
|
|
15735
|
-
return
|
|
15501
|
+
return chalk52.red(status);
|
|
15736
15502
|
case "running":
|
|
15737
|
-
return
|
|
15503
|
+
return chalk52.cyan(status);
|
|
15738
15504
|
case "pending":
|
|
15739
|
-
return
|
|
15505
|
+
return chalk52.yellow(status);
|
|
15740
15506
|
default:
|
|
15741
15507
|
return status;
|
|
15742
15508
|
}
|
|
15743
15509
|
}
|
|
15744
15510
|
function printRunConfiguration(schedule) {
|
|
15745
|
-
const statusText = schedule.enabled ?
|
|
15511
|
+
const statusText = schedule.enabled ? chalk52.green("enabled") : chalk52.yellow("disabled");
|
|
15746
15512
|
console.log(`${"Status:".padEnd(16)}${statusText}`);
|
|
15747
15513
|
console.log(
|
|
15748
|
-
`${"Agent:".padEnd(16)}${schedule.composeName} ${
|
|
15514
|
+
`${"Agent:".padEnd(16)}${schedule.composeName} ${chalk52.dim(`(${schedule.orgSlug})`)}`
|
|
15749
15515
|
);
|
|
15750
15516
|
const promptPreview = schedule.prompt.length > 60 ? schedule.prompt.slice(0, 57) + "..." : schedule.prompt;
|
|
15751
|
-
console.log(`${"Prompt:".padEnd(16)}${
|
|
15517
|
+
console.log(`${"Prompt:".padEnd(16)}${chalk52.dim(promptPreview)}`);
|
|
15752
15518
|
if (schedule.vars && Object.keys(schedule.vars).length > 0) {
|
|
15753
15519
|
console.log(
|
|
15754
15520
|
`${"Variables:".padEnd(16)}${Object.keys(schedule.vars).join(", ")}`
|
|
@@ -15777,7 +15543,7 @@ function printTimeSchedule(schedule) {
|
|
|
15777
15543
|
);
|
|
15778
15544
|
}
|
|
15779
15545
|
if (schedule.triggerType === "loop") {
|
|
15780
|
-
const failureText = schedule.consecutiveFailures > 0 ?
|
|
15546
|
+
const failureText = schedule.consecutiveFailures > 0 ? chalk52.yellow(`${schedule.consecutiveFailures}/3`) : chalk52.dim("0/3");
|
|
15781
15547
|
console.log(`${"Failures:".padEnd(16)}${failureText}`);
|
|
15782
15548
|
}
|
|
15783
15549
|
}
|
|
@@ -15793,7 +15559,7 @@ async function printRecentRuns(name, composeId, limit) {
|
|
|
15793
15559
|
console.log();
|
|
15794
15560
|
console.log("Recent Runs:");
|
|
15795
15561
|
console.log(
|
|
15796
|
-
|
|
15562
|
+
chalk52.dim("RUN ID STATUS CREATED")
|
|
15797
15563
|
);
|
|
15798
15564
|
for (const run of runs) {
|
|
15799
15565
|
const id = run.id;
|
|
@@ -15804,10 +15570,10 @@ async function printRecentRuns(name, composeId, limit) {
|
|
|
15804
15570
|
}
|
|
15805
15571
|
} catch {
|
|
15806
15572
|
console.log();
|
|
15807
|
-
console.log(
|
|
15573
|
+
console.log(chalk52.dim("Recent Runs: (unable to fetch)"));
|
|
15808
15574
|
}
|
|
15809
15575
|
}
|
|
15810
|
-
var statusCommand7 = new
|
|
15576
|
+
var statusCommand7 = new Command57().name("status").description("Show detailed status of a schedule").argument("<agent-name>", "Agent name").option(
|
|
15811
15577
|
"-n, --name <schedule-name>",
|
|
15812
15578
|
"Schedule name (required when agent has multiple schedules)"
|
|
15813
15579
|
).option(
|
|
@@ -15821,8 +15587,8 @@ var statusCommand7 = new Command62().name("status").description("Show detailed s
|
|
|
15821
15587
|
const { name, composeId } = resolved;
|
|
15822
15588
|
const schedule = await getScheduleByName({ name, composeId });
|
|
15823
15589
|
console.log();
|
|
15824
|
-
console.log(`Schedule for agent: ${
|
|
15825
|
-
console.log(
|
|
15590
|
+
console.log(`Schedule for agent: ${chalk52.cyan(agentName)}`);
|
|
15591
|
+
console.log(chalk52.dim("\u2501".repeat(50)));
|
|
15826
15592
|
printRunConfiguration(schedule);
|
|
15827
15593
|
printTimeSchedule(schedule);
|
|
15828
15594
|
const parsed = parseInt(options.limit, 10);
|
|
@@ -15837,9 +15603,9 @@ var statusCommand7 = new Command62().name("status").description("Show detailed s
|
|
|
15837
15603
|
);
|
|
15838
15604
|
|
|
15839
15605
|
// src/commands/schedule/delete.ts
|
|
15840
|
-
import { Command as
|
|
15841
|
-
import
|
|
15842
|
-
var deleteCommand2 = new
|
|
15606
|
+
import { Command as Command58 } from "commander";
|
|
15607
|
+
import chalk53 from "chalk";
|
|
15608
|
+
var deleteCommand2 = new Command58().name("delete").alias("rm").description("Delete a schedule").argument("<agent-name>", "Agent name").option(
|
|
15843
15609
|
"-n, --name <schedule-name>",
|
|
15844
15610
|
"Schedule name (required when agent has multiple schedules)"
|
|
15845
15611
|
).option("-y, --yes", "Skip confirmation prompt").action(
|
|
@@ -15851,11 +15617,11 @@ var deleteCommand2 = new Command63().name("delete").alias("rm").description("Del
|
|
|
15851
15617
|
throw new Error("--yes flag is required in non-interactive mode");
|
|
15852
15618
|
}
|
|
15853
15619
|
const confirmed = await promptConfirm(
|
|
15854
|
-
`Delete schedule for agent ${
|
|
15620
|
+
`Delete schedule for agent ${chalk53.cyan(agentName)}?`,
|
|
15855
15621
|
false
|
|
15856
15622
|
);
|
|
15857
15623
|
if (!confirmed) {
|
|
15858
|
-
console.log(
|
|
15624
|
+
console.log(chalk53.dim("Cancelled"));
|
|
15859
15625
|
return;
|
|
15860
15626
|
}
|
|
15861
15627
|
}
|
|
@@ -15864,16 +15630,16 @@ var deleteCommand2 = new Command63().name("delete").alias("rm").description("Del
|
|
|
15864
15630
|
composeId: resolved.composeId
|
|
15865
15631
|
});
|
|
15866
15632
|
console.log(
|
|
15867
|
-
|
|
15633
|
+
chalk53.green(`\u2713 Deleted schedule for agent ${chalk53.cyan(agentName)}`)
|
|
15868
15634
|
);
|
|
15869
15635
|
}
|
|
15870
15636
|
)
|
|
15871
15637
|
);
|
|
15872
15638
|
|
|
15873
15639
|
// src/commands/schedule/enable.ts
|
|
15874
|
-
import { Command as
|
|
15875
|
-
import
|
|
15876
|
-
var enableCommand = new
|
|
15640
|
+
import { Command as Command59 } from "commander";
|
|
15641
|
+
import chalk54 from "chalk";
|
|
15642
|
+
var enableCommand = new Command59().name("enable").description("Enable a schedule").argument("<agent-name>", "Agent name").option(
|
|
15877
15643
|
"-n, --name <schedule-name>",
|
|
15878
15644
|
"Schedule name (required when agent has multiple schedules)"
|
|
15879
15645
|
).action(
|
|
@@ -15884,15 +15650,15 @@ var enableCommand = new Command64().name("enable").description("Enable a schedul
|
|
|
15884
15650
|
composeId: resolved.composeId
|
|
15885
15651
|
});
|
|
15886
15652
|
console.log(
|
|
15887
|
-
|
|
15653
|
+
chalk54.green(`\u2713 Enabled schedule for agent ${chalk54.cyan(agentName)}`)
|
|
15888
15654
|
);
|
|
15889
15655
|
})
|
|
15890
15656
|
);
|
|
15891
15657
|
|
|
15892
15658
|
// src/commands/schedule/disable.ts
|
|
15893
|
-
import { Command as
|
|
15894
|
-
import
|
|
15895
|
-
var disableCommand = new
|
|
15659
|
+
import { Command as Command60 } from "commander";
|
|
15660
|
+
import chalk55 from "chalk";
|
|
15661
|
+
var disableCommand = new Command60().name("disable").description("Disable a schedule").argument("<agent-name>", "Agent name").option(
|
|
15896
15662
|
"-n, --name <schedule-name>",
|
|
15897
15663
|
"Schedule name (required when agent has multiple schedules)"
|
|
15898
15664
|
).action(
|
|
@@ -15903,17 +15669,17 @@ var disableCommand = new Command65().name("disable").description("Disable a sche
|
|
|
15903
15669
|
composeId: resolved.composeId
|
|
15904
15670
|
});
|
|
15905
15671
|
console.log(
|
|
15906
|
-
|
|
15672
|
+
chalk55.green(`\u2713 Disabled schedule for agent ${chalk55.cyan(agentName)}`)
|
|
15907
15673
|
);
|
|
15908
15674
|
})
|
|
15909
15675
|
);
|
|
15910
15676
|
|
|
15911
15677
|
// src/commands/schedule/index.ts
|
|
15912
|
-
var scheduleCommand = new
|
|
15678
|
+
var scheduleCommand = new Command61().name("schedule").description("Manage agent schedules").addCommand(setupCommand).addCommand(listCommand7).addCommand(statusCommand7).addCommand(deleteCommand2).addCommand(enableCommand).addCommand(disableCommand);
|
|
15913
15679
|
|
|
15914
15680
|
// src/commands/usage/index.ts
|
|
15915
|
-
import { Command as
|
|
15916
|
-
import
|
|
15681
|
+
import { Command as Command62 } from "commander";
|
|
15682
|
+
import chalk56 from "chalk";
|
|
15917
15683
|
|
|
15918
15684
|
// src/lib/utils/duration-formatter.ts
|
|
15919
15685
|
function formatDuration(ms) {
|
|
@@ -15986,7 +15752,7 @@ function fillMissingDates(daily, startDate, endDate) {
|
|
|
15986
15752
|
result.sort((a, b) => b.date.localeCompare(a.date));
|
|
15987
15753
|
return result;
|
|
15988
15754
|
}
|
|
15989
|
-
var usageCommand = new
|
|
15755
|
+
var usageCommand = new Command62().name("usage").description("View usage statistics").option("--since <date>", "Start date (ISO format or relative: 7d, 30d)").option(
|
|
15990
15756
|
"--until <date>",
|
|
15991
15757
|
"End date (ISO format or relative, defaults to now)"
|
|
15992
15758
|
).action(
|
|
@@ -16038,19 +15804,19 @@ var usageCommand = new Command67().name("usage").description("View usage statist
|
|
|
16038
15804
|
);
|
|
16039
15805
|
console.log();
|
|
16040
15806
|
console.log(
|
|
16041
|
-
|
|
15807
|
+
chalk56.bold(
|
|
16042
15808
|
`Usage Summary (${formatDateRange(usage.period.start, usage.period.end)})`
|
|
16043
15809
|
)
|
|
16044
15810
|
);
|
|
16045
15811
|
console.log();
|
|
16046
|
-
console.log(
|
|
15812
|
+
console.log(chalk56.dim("DATE RUNS RUN TIME"));
|
|
16047
15813
|
for (const day of filledDaily) {
|
|
16048
15814
|
const dateDisplay = formatDateDisplay(day.date).padEnd(10);
|
|
16049
15815
|
const runsDisplay = String(day.run_count).padStart(6);
|
|
16050
15816
|
const timeDisplay = formatDuration(day.run_time_ms);
|
|
16051
15817
|
console.log(`${dateDisplay}${runsDisplay} ${timeDisplay}`);
|
|
16052
15818
|
}
|
|
16053
|
-
console.log(
|
|
15819
|
+
console.log(chalk56.dim("\u2500".repeat(29)));
|
|
16054
15820
|
const totalRunsDisplay = String(usage.summary.total_runs).padStart(6);
|
|
16055
15821
|
const totalTimeDisplay = formatDuration(usage.summary.total_run_time_ms);
|
|
16056
15822
|
console.log(
|
|
@@ -16061,67 +15827,67 @@ var usageCommand = new Command67().name("usage").description("View usage statist
|
|
|
16061
15827
|
);
|
|
16062
15828
|
|
|
16063
15829
|
// src/commands/secret/index.ts
|
|
16064
|
-
import { Command as
|
|
15830
|
+
import { Command as Command66 } from "commander";
|
|
16065
15831
|
|
|
16066
15832
|
// src/commands/secret/list.ts
|
|
16067
|
-
import { Command as
|
|
16068
|
-
import
|
|
16069
|
-
var listCommand8 = new
|
|
15833
|
+
import { Command as Command63 } from "commander";
|
|
15834
|
+
import chalk57 from "chalk";
|
|
15835
|
+
var listCommand8 = new Command63().name("list").alias("ls").description("List all secrets").action(
|
|
16070
15836
|
withErrorHandler(async () => {
|
|
16071
15837
|
const result = await listSecrets();
|
|
16072
15838
|
if (result.secrets.length === 0) {
|
|
16073
|
-
console.log(
|
|
15839
|
+
console.log(chalk57.dim("No secrets found"));
|
|
16074
15840
|
console.log();
|
|
16075
15841
|
console.log("To add a secret:");
|
|
16076
|
-
console.log(
|
|
15842
|
+
console.log(chalk57.cyan(" vm0 secret set MY_API_KEY --body <value>"));
|
|
16077
15843
|
return;
|
|
16078
15844
|
}
|
|
16079
|
-
console.log(
|
|
15845
|
+
console.log(chalk57.bold("Secrets:"));
|
|
16080
15846
|
console.log();
|
|
16081
15847
|
for (const secret of result.secrets) {
|
|
16082
15848
|
let typeIndicator = "";
|
|
16083
15849
|
let derivedLine = null;
|
|
16084
15850
|
if (secret.type === "model-provider") {
|
|
16085
|
-
typeIndicator =
|
|
15851
|
+
typeIndicator = chalk57.dim(" [model-provider]");
|
|
16086
15852
|
} else if (secret.type === "connector") {
|
|
16087
15853
|
const derived = getConnectorDerivedNames(secret.name);
|
|
16088
15854
|
if (derived) {
|
|
16089
|
-
typeIndicator =
|
|
16090
|
-
derivedLine =
|
|
15855
|
+
typeIndicator = chalk57.dim(` [${derived.connectorLabel} connector]`);
|
|
15856
|
+
derivedLine = chalk57.dim(
|
|
16091
15857
|
`Available as: ${derived.envVarNames.join(", ")}`
|
|
16092
15858
|
);
|
|
16093
15859
|
} else {
|
|
16094
|
-
typeIndicator =
|
|
15860
|
+
typeIndicator = chalk57.dim(" [connector]");
|
|
16095
15861
|
}
|
|
16096
15862
|
} else if (secret.type === "user") {
|
|
16097
15863
|
const derived = getConnectorDerivedNames(secret.name);
|
|
16098
15864
|
if (derived) {
|
|
16099
|
-
typeIndicator =
|
|
16100
|
-
derivedLine =
|
|
15865
|
+
typeIndicator = chalk57.dim(` [${derived.connectorLabel} connector]`);
|
|
15866
|
+
derivedLine = chalk57.dim(
|
|
16101
15867
|
`Available as: ${derived.envVarNames.join(", ")}`
|
|
16102
15868
|
);
|
|
16103
15869
|
}
|
|
16104
15870
|
}
|
|
16105
|
-
console.log(` ${
|
|
15871
|
+
console.log(` ${chalk57.cyan(secret.name)}${typeIndicator}`);
|
|
16106
15872
|
if (derivedLine) {
|
|
16107
15873
|
console.log(` ${derivedLine}`);
|
|
16108
15874
|
}
|
|
16109
15875
|
if (secret.description) {
|
|
16110
|
-
console.log(` ${
|
|
15876
|
+
console.log(` ${chalk57.dim(secret.description)}`);
|
|
16111
15877
|
}
|
|
16112
15878
|
console.log(
|
|
16113
|
-
` ${
|
|
15879
|
+
` ${chalk57.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`
|
|
16114
15880
|
);
|
|
16115
15881
|
console.log();
|
|
16116
15882
|
}
|
|
16117
|
-
console.log(
|
|
15883
|
+
console.log(chalk57.dim(`Total: ${result.secrets.length} secret(s)`));
|
|
16118
15884
|
})
|
|
16119
15885
|
);
|
|
16120
15886
|
|
|
16121
15887
|
// src/commands/secret/set.ts
|
|
16122
|
-
import { Command as
|
|
16123
|
-
import
|
|
16124
|
-
var setCommand2 = new
|
|
15888
|
+
import { Command as Command64 } from "commander";
|
|
15889
|
+
import chalk58 from "chalk";
|
|
15890
|
+
var setCommand2 = new Command64().name("set").description("Create or update a secret").argument("<name>", "Secret name (uppercase, e.g., MY_API_KEY)").option(
|
|
16125
15891
|
"-b, --body <value>",
|
|
16126
15892
|
"Secret value (required in non-interactive mode)"
|
|
16127
15893
|
).option("-d, --description <description>", "Optional description").action(
|
|
@@ -16160,19 +15926,19 @@ var setCommand2 = new Command69().name("set").description("Create or update a se
|
|
|
16160
15926
|
}
|
|
16161
15927
|
throw error;
|
|
16162
15928
|
}
|
|
16163
|
-
console.log(
|
|
15929
|
+
console.log(chalk58.green(`\u2713 Secret "${secret.name}" saved`));
|
|
16164
15930
|
console.log();
|
|
16165
15931
|
console.log("Use in vm0.yaml:");
|
|
16166
|
-
console.log(
|
|
16167
|
-
console.log(
|
|
15932
|
+
console.log(chalk58.cyan(` environment:`));
|
|
15933
|
+
console.log(chalk58.cyan(` ${name}: \${{ secrets.${name} }}`));
|
|
16168
15934
|
}
|
|
16169
15935
|
)
|
|
16170
15936
|
);
|
|
16171
15937
|
|
|
16172
15938
|
// src/commands/secret/delete.ts
|
|
16173
|
-
import { Command as
|
|
16174
|
-
import
|
|
16175
|
-
var deleteCommand3 = new
|
|
15939
|
+
import { Command as Command65 } from "commander";
|
|
15940
|
+
import chalk59 from "chalk";
|
|
15941
|
+
var deleteCommand3 = new Command65().name("delete").description("Delete a secret").argument("<name>", "Secret name to delete").option("-y, --yes", "Skip confirmation prompt").action(
|
|
16176
15942
|
withErrorHandler(async (name, options) => {
|
|
16177
15943
|
try {
|
|
16178
15944
|
await getSecret(name);
|
|
@@ -16191,61 +15957,61 @@ var deleteCommand3 = new Command70().name("delete").description("Delete a secret
|
|
|
16191
15957
|
false
|
|
16192
15958
|
);
|
|
16193
15959
|
if (!confirmed) {
|
|
16194
|
-
console.log(
|
|
15960
|
+
console.log(chalk59.dim("Cancelled"));
|
|
16195
15961
|
return;
|
|
16196
15962
|
}
|
|
16197
15963
|
}
|
|
16198
15964
|
await deleteSecret(name);
|
|
16199
|
-
console.log(
|
|
15965
|
+
console.log(chalk59.green(`\u2713 Secret "${name}" deleted`));
|
|
16200
15966
|
})
|
|
16201
15967
|
);
|
|
16202
15968
|
|
|
16203
15969
|
// src/commands/secret/index.ts
|
|
16204
|
-
var secretCommand = new
|
|
15970
|
+
var secretCommand = new Command66().name("secret").description("Manage stored secrets for agent runs").addCommand(listCommand8).addCommand(setCommand2).addCommand(deleteCommand3);
|
|
16205
15971
|
|
|
16206
15972
|
// src/commands/variable/index.ts
|
|
16207
|
-
import { Command as
|
|
15973
|
+
import { Command as Command70 } from "commander";
|
|
16208
15974
|
|
|
16209
15975
|
// src/commands/variable/list.ts
|
|
16210
|
-
import { Command as
|
|
16211
|
-
import
|
|
15976
|
+
import { Command as Command67 } from "commander";
|
|
15977
|
+
import chalk60 from "chalk";
|
|
16212
15978
|
function truncateValue(value, maxLength = 60) {
|
|
16213
15979
|
if (value.length <= maxLength) {
|
|
16214
15980
|
return value;
|
|
16215
15981
|
}
|
|
16216
15982
|
return value.slice(0, maxLength - 15) + "... [truncated]";
|
|
16217
15983
|
}
|
|
16218
|
-
var listCommand9 = new
|
|
15984
|
+
var listCommand9 = new Command67().name("list").alias("ls").description("List all variables").action(
|
|
16219
15985
|
withErrorHandler(async () => {
|
|
16220
15986
|
const result = await listVariables();
|
|
16221
15987
|
if (result.variables.length === 0) {
|
|
16222
|
-
console.log(
|
|
15988
|
+
console.log(chalk60.dim("No variables found"));
|
|
16223
15989
|
console.log();
|
|
16224
15990
|
console.log("To add a variable:");
|
|
16225
|
-
console.log(
|
|
15991
|
+
console.log(chalk60.cyan(" vm0 variable set MY_VAR <value>"));
|
|
16226
15992
|
return;
|
|
16227
15993
|
}
|
|
16228
|
-
console.log(
|
|
15994
|
+
console.log(chalk60.bold("Variables:"));
|
|
16229
15995
|
console.log();
|
|
16230
15996
|
for (const variable of result.variables) {
|
|
16231
15997
|
const displayValue = truncateValue(variable.value);
|
|
16232
|
-
console.log(` ${
|
|
15998
|
+
console.log(` ${chalk60.cyan(variable.name)} = ${displayValue}`);
|
|
16233
15999
|
if (variable.description) {
|
|
16234
|
-
console.log(` ${
|
|
16000
|
+
console.log(` ${chalk60.dim(variable.description)}`);
|
|
16235
16001
|
}
|
|
16236
16002
|
console.log(
|
|
16237
|
-
` ${
|
|
16003
|
+
` ${chalk60.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`
|
|
16238
16004
|
);
|
|
16239
16005
|
console.log();
|
|
16240
16006
|
}
|
|
16241
|
-
console.log(
|
|
16007
|
+
console.log(chalk60.dim(`Total: ${result.variables.length} variable(s)`));
|
|
16242
16008
|
})
|
|
16243
16009
|
);
|
|
16244
16010
|
|
|
16245
16011
|
// src/commands/variable/set.ts
|
|
16246
|
-
import { Command as
|
|
16247
|
-
import
|
|
16248
|
-
var setCommand3 = new
|
|
16012
|
+
import { Command as Command68 } from "commander";
|
|
16013
|
+
import chalk61 from "chalk";
|
|
16014
|
+
var setCommand3 = new Command68().name("set").description("Create or update a variable").argument("<name>", "Variable name (uppercase, e.g., MY_VAR)").argument("<value>", "Variable value").option("-d, --description <description>", "Optional description").action(
|
|
16249
16015
|
withErrorHandler(
|
|
16250
16016
|
async (name, value, options) => {
|
|
16251
16017
|
let variable;
|
|
@@ -16265,19 +16031,19 @@ var setCommand3 = new Command73().name("set").description("Create or update a va
|
|
|
16265
16031
|
}
|
|
16266
16032
|
throw error;
|
|
16267
16033
|
}
|
|
16268
|
-
console.log(
|
|
16034
|
+
console.log(chalk61.green(`\u2713 Variable "${variable.name}" saved`));
|
|
16269
16035
|
console.log();
|
|
16270
16036
|
console.log("Use in vm0.yaml:");
|
|
16271
|
-
console.log(
|
|
16272
|
-
console.log(
|
|
16037
|
+
console.log(chalk61.cyan(` environment:`));
|
|
16038
|
+
console.log(chalk61.cyan(` ${name}: \${{ vars.${name} }}`));
|
|
16273
16039
|
}
|
|
16274
16040
|
)
|
|
16275
16041
|
);
|
|
16276
16042
|
|
|
16277
16043
|
// src/commands/variable/delete.ts
|
|
16278
|
-
import { Command as
|
|
16279
|
-
import
|
|
16280
|
-
var deleteCommand4 = new
|
|
16044
|
+
import { Command as Command69 } from "commander";
|
|
16045
|
+
import chalk62 from "chalk";
|
|
16046
|
+
var deleteCommand4 = new Command69().name("delete").description("Delete a variable").argument("<name>", "Variable name to delete").option("-y, --yes", "Skip confirmation prompt").action(
|
|
16281
16047
|
withErrorHandler(async (name, options) => {
|
|
16282
16048
|
try {
|
|
16283
16049
|
await getVariable(name);
|
|
@@ -16296,32 +16062,32 @@ var deleteCommand4 = new Command74().name("delete").description("Delete a variab
|
|
|
16296
16062
|
false
|
|
16297
16063
|
);
|
|
16298
16064
|
if (!confirmed) {
|
|
16299
|
-
console.log(
|
|
16065
|
+
console.log(chalk62.dim("Cancelled"));
|
|
16300
16066
|
return;
|
|
16301
16067
|
}
|
|
16302
16068
|
}
|
|
16303
16069
|
await deleteVariable(name);
|
|
16304
|
-
console.log(
|
|
16070
|
+
console.log(chalk62.green(`\u2713 Variable "${name}" deleted`));
|
|
16305
16071
|
})
|
|
16306
16072
|
);
|
|
16307
16073
|
|
|
16308
16074
|
// src/commands/variable/index.ts
|
|
16309
|
-
var variableCommand = new
|
|
16075
|
+
var variableCommand = new Command70().name("variable").description("Manage stored variables for agent runs").addCommand(listCommand9).addCommand(setCommand3).addCommand(deleteCommand4);
|
|
16310
16076
|
|
|
16311
16077
|
// src/commands/model-provider/index.ts
|
|
16312
|
-
import { Command as
|
|
16078
|
+
import { Command as Command75 } from "commander";
|
|
16313
16079
|
|
|
16314
16080
|
// src/commands/model-provider/list.ts
|
|
16315
|
-
import { Command as
|
|
16316
|
-
import
|
|
16317
|
-
var listCommand10 = new
|
|
16081
|
+
import { Command as Command71 } from "commander";
|
|
16082
|
+
import chalk63 from "chalk";
|
|
16083
|
+
var listCommand10 = new Command71().name("list").alias("ls").description("List all model providers").action(
|
|
16318
16084
|
withErrorHandler(async () => {
|
|
16319
16085
|
const result = await listModelProviders();
|
|
16320
16086
|
if (result.modelProviders.length === 0) {
|
|
16321
|
-
console.log(
|
|
16087
|
+
console.log(chalk63.dim("No model providers configured"));
|
|
16322
16088
|
console.log();
|
|
16323
16089
|
console.log("To add a model provider:");
|
|
16324
|
-
console.log(
|
|
16090
|
+
console.log(chalk63.cyan(" vm0 model-provider setup"));
|
|
16325
16091
|
return;
|
|
16326
16092
|
}
|
|
16327
16093
|
const byFramework = result.modelProviders.reduce(
|
|
@@ -16335,16 +16101,16 @@ var listCommand10 = new Command76().name("list").alias("ls").description("List a
|
|
|
16335
16101
|
},
|
|
16336
16102
|
{}
|
|
16337
16103
|
);
|
|
16338
|
-
console.log(
|
|
16104
|
+
console.log(chalk63.bold("Model Providers:"));
|
|
16339
16105
|
console.log();
|
|
16340
16106
|
for (const [framework, providers] of Object.entries(byFramework)) {
|
|
16341
|
-
console.log(` ${
|
|
16107
|
+
console.log(` ${chalk63.cyan(framework)}:`);
|
|
16342
16108
|
for (const provider of providers) {
|
|
16343
|
-
const defaultTag = provider.isDefault ?
|
|
16344
|
-
const modelTag = provider.selectedModel ?
|
|
16109
|
+
const defaultTag = provider.isDefault ? chalk63.green(" (default)") : "";
|
|
16110
|
+
const modelTag = provider.selectedModel ? chalk63.dim(` [${provider.selectedModel}]`) : "";
|
|
16345
16111
|
console.log(` ${provider.type}${defaultTag}${modelTag}`);
|
|
16346
16112
|
console.log(
|
|
16347
|
-
|
|
16113
|
+
chalk63.dim(
|
|
16348
16114
|
` Updated: ${new Date(provider.updatedAt).toLocaleString()}`
|
|
16349
16115
|
)
|
|
16350
16116
|
);
|
|
@@ -16352,14 +16118,14 @@ var listCommand10 = new Command76().name("list").alias("ls").description("List a
|
|
|
16352
16118
|
console.log();
|
|
16353
16119
|
}
|
|
16354
16120
|
console.log(
|
|
16355
|
-
|
|
16121
|
+
chalk63.dim(`Total: ${result.modelProviders.length} provider(s)`)
|
|
16356
16122
|
);
|
|
16357
16123
|
})
|
|
16358
16124
|
);
|
|
16359
16125
|
|
|
16360
16126
|
// src/commands/model-provider/setup.ts
|
|
16361
|
-
import { Command as
|
|
16362
|
-
import
|
|
16127
|
+
import { Command as Command72 } from "commander";
|
|
16128
|
+
import chalk64 from "chalk";
|
|
16363
16129
|
import prompts2 from "prompts";
|
|
16364
16130
|
function validateProviderType(typeStr) {
|
|
16365
16131
|
if (!Object.keys(MODEL_PROVIDER_TYPES).includes(typeStr)) {
|
|
@@ -16543,7 +16309,7 @@ async function promptForModelSelection(type2) {
|
|
|
16543
16309
|
if (selected === "__custom__") {
|
|
16544
16310
|
const placeholder = getCustomModelPlaceholder(type2);
|
|
16545
16311
|
if (placeholder) {
|
|
16546
|
-
console.log(
|
|
16312
|
+
console.log(chalk64.dim(`Example: ${placeholder}`));
|
|
16547
16313
|
}
|
|
16548
16314
|
const customResponse = await prompts2(
|
|
16549
16315
|
{
|
|
@@ -16593,7 +16359,7 @@ async function promptForSecrets(type2, authMethod) {
|
|
|
16593
16359
|
const secrets = {};
|
|
16594
16360
|
for (const [name, fieldConfig] of Object.entries(secretsConfig)) {
|
|
16595
16361
|
if (fieldConfig.helpText) {
|
|
16596
|
-
console.log(
|
|
16362
|
+
console.log(chalk64.dim(fieldConfig.helpText));
|
|
16597
16363
|
}
|
|
16598
16364
|
const isSensitive = isSensitiveSecret(name);
|
|
16599
16365
|
const placeholder = "placeholder" in fieldConfig ? fieldConfig.placeholder : "";
|
|
@@ -16645,7 +16411,7 @@ async function handleInteractiveMode() {
|
|
|
16645
16411
|
title = `${title} \u2713`;
|
|
16646
16412
|
}
|
|
16647
16413
|
if (isExperimental) {
|
|
16648
|
-
title = `${title} ${
|
|
16414
|
+
title = `${title} ${chalk64.dim("(experimental)")}`;
|
|
16649
16415
|
}
|
|
16650
16416
|
return {
|
|
16651
16417
|
title,
|
|
@@ -16692,7 +16458,7 @@ async function handleInteractiveMode() {
|
|
|
16692
16458
|
}
|
|
16693
16459
|
const config = MODEL_PROVIDER_TYPES[type2];
|
|
16694
16460
|
console.log();
|
|
16695
|
-
console.log(
|
|
16461
|
+
console.log(chalk64.dim(config.helpText));
|
|
16696
16462
|
console.log();
|
|
16697
16463
|
if (hasAuthMethods(type2)) {
|
|
16698
16464
|
const authMethod = await promptForAuthMethod(type2);
|
|
@@ -16733,13 +16499,13 @@ async function promptSetAsDefault(type2, framework, isDefault) {
|
|
|
16733
16499
|
);
|
|
16734
16500
|
if (response.setDefault) {
|
|
16735
16501
|
await setModelProviderDefault(type2);
|
|
16736
|
-
console.log(
|
|
16502
|
+
console.log(chalk64.green(`\u2713 Default for ${framework} set to "${type2}"`));
|
|
16737
16503
|
}
|
|
16738
16504
|
}
|
|
16739
16505
|
function collectSecrets(value, previous) {
|
|
16740
16506
|
return previous.concat([value]);
|
|
16741
16507
|
}
|
|
16742
|
-
var setupCommand2 = new
|
|
16508
|
+
var setupCommand2 = new Command72().name("setup").description("Configure a model provider").option("-t, --type <type>", "Provider type (for non-interactive mode)").option(
|
|
16743
16509
|
"-s, --secret <value>",
|
|
16744
16510
|
"Secret value (can be used multiple times, supports VALUE or KEY=VALUE format)",
|
|
16745
16511
|
collectSecrets,
|
|
@@ -16777,11 +16543,11 @@ var setupCommand2 = new Command77().name("setup").description("Configure a model
|
|
|
16777
16543
|
const modelNote2 = provider2.selectedModel ? ` with model: ${provider2.selectedModel}` : "";
|
|
16778
16544
|
if (!hasModelSelection(input.type)) {
|
|
16779
16545
|
console.log(
|
|
16780
|
-
|
|
16546
|
+
chalk64.green(`\u2713 Model provider "${input.type}" unchanged`)
|
|
16781
16547
|
);
|
|
16782
16548
|
} else {
|
|
16783
16549
|
console.log(
|
|
16784
|
-
|
|
16550
|
+
chalk64.green(
|
|
16785
16551
|
`\u2713 Model provider "${input.type}" updated${defaultNote2}${modelNote2}`
|
|
16786
16552
|
)
|
|
16787
16553
|
);
|
|
@@ -16806,7 +16572,7 @@ var setupCommand2 = new Command77().name("setup").description("Configure a model
|
|
|
16806
16572
|
const defaultNote = provider.isDefault ? ` (default for ${provider.framework})` : "";
|
|
16807
16573
|
const modelNote = provider.selectedModel ? ` with model: ${provider.selectedModel}` : "";
|
|
16808
16574
|
console.log(
|
|
16809
|
-
|
|
16575
|
+
chalk64.green(
|
|
16810
16576
|
`\u2713 Model provider "${input.type}" ${action}${defaultNote}${modelNote}`
|
|
16811
16577
|
)
|
|
16812
16578
|
);
|
|
@@ -16822,9 +16588,9 @@ var setupCommand2 = new Command77().name("setup").description("Configure a model
|
|
|
16822
16588
|
);
|
|
16823
16589
|
|
|
16824
16590
|
// src/commands/model-provider/delete.ts
|
|
16825
|
-
import { Command as
|
|
16826
|
-
import
|
|
16827
|
-
var deleteCommand5 = new
|
|
16591
|
+
import { Command as Command73 } from "commander";
|
|
16592
|
+
import chalk65 from "chalk";
|
|
16593
|
+
var deleteCommand5 = new Command73().name("delete").description("Delete a model provider").argument("<type>", "Model provider type to delete").action(
|
|
16828
16594
|
withErrorHandler(async (type2) => {
|
|
16829
16595
|
if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type2)) {
|
|
16830
16596
|
const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(", ");
|
|
@@ -16833,14 +16599,14 @@ var deleteCommand5 = new Command78().name("delete").description("Delete a model
|
|
|
16833
16599
|
});
|
|
16834
16600
|
}
|
|
16835
16601
|
await deleteModelProvider(type2);
|
|
16836
|
-
console.log(
|
|
16602
|
+
console.log(chalk65.green(`\u2713 Model provider "${type2}" deleted`));
|
|
16837
16603
|
})
|
|
16838
16604
|
);
|
|
16839
16605
|
|
|
16840
16606
|
// src/commands/model-provider/set-default.ts
|
|
16841
|
-
import { Command as
|
|
16842
|
-
import
|
|
16843
|
-
var setDefaultCommand = new
|
|
16607
|
+
import { Command as Command74 } from "commander";
|
|
16608
|
+
import chalk66 from "chalk";
|
|
16609
|
+
var setDefaultCommand = new Command74().name("set-default").description("Set a model provider as default for its framework").argument("<type>", "Model provider type to set as default").action(
|
|
16844
16610
|
withErrorHandler(async (type2) => {
|
|
16845
16611
|
if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type2)) {
|
|
16846
16612
|
const validTypes = Object.keys(MODEL_PROVIDER_TYPES).join(", ");
|
|
@@ -16850,7 +16616,7 @@ var setDefaultCommand = new Command79().name("set-default").description("Set a m
|
|
|
16850
16616
|
}
|
|
16851
16617
|
const provider = await setModelProviderDefault(type2);
|
|
16852
16618
|
console.log(
|
|
16853
|
-
|
|
16619
|
+
chalk66.green(
|
|
16854
16620
|
`\u2713 Default for ${provider.framework} set to "${provider.type}"`
|
|
16855
16621
|
)
|
|
16856
16622
|
);
|
|
@@ -16858,14 +16624,14 @@ var setDefaultCommand = new Command79().name("set-default").description("Set a m
|
|
|
16858
16624
|
);
|
|
16859
16625
|
|
|
16860
16626
|
// src/commands/model-provider/index.ts
|
|
16861
|
-
var modelProviderCommand = new
|
|
16627
|
+
var modelProviderCommand = new Command75().name("model-provider").description("Manage model providers for agent runs").addCommand(listCommand10).addCommand(setupCommand2).addCommand(deleteCommand5).addCommand(setDefaultCommand);
|
|
16862
16628
|
|
|
16863
16629
|
// src/commands/connector/index.ts
|
|
16864
|
-
import { Command as
|
|
16630
|
+
import { Command as Command80 } from "commander";
|
|
16865
16631
|
|
|
16866
16632
|
// src/commands/connector/connect.ts
|
|
16867
|
-
import { Command as
|
|
16868
|
-
import
|
|
16633
|
+
import { Command as Command76 } from "commander";
|
|
16634
|
+
import chalk68 from "chalk";
|
|
16869
16635
|
import { initClient as initClient13 } from "@ts-rest/core";
|
|
16870
16636
|
|
|
16871
16637
|
// src/commands/connector/lib/computer/start-services.ts
|
|
@@ -16874,7 +16640,7 @@ import { access as access2, constants } from "fs/promises";
|
|
|
16874
16640
|
import { createServer } from "net";
|
|
16875
16641
|
import { homedir as homedir4 } from "os";
|
|
16876
16642
|
import { join as join12 } from "path";
|
|
16877
|
-
import
|
|
16643
|
+
import chalk67 from "chalk";
|
|
16878
16644
|
|
|
16879
16645
|
// src/commands/connector/lib/computer/ngrok.ts
|
|
16880
16646
|
import ngrok from "@ngrok/ngrok";
|
|
@@ -16948,7 +16714,7 @@ async function checkComputerDependencies() {
|
|
|
16948
16714
|
}
|
|
16949
16715
|
}
|
|
16950
16716
|
async function startComputerServices(credentials) {
|
|
16951
|
-
console.log(
|
|
16717
|
+
console.log(chalk67.cyan("Starting computer connector services..."));
|
|
16952
16718
|
const wsgidavBinary = await findBinary("wsgidav");
|
|
16953
16719
|
if (!wsgidavBinary) {
|
|
16954
16720
|
throw new Error(
|
|
@@ -16975,7 +16741,7 @@ async function startComputerServices(credentials) {
|
|
|
16975
16741
|
);
|
|
16976
16742
|
wsgidav.stdout?.on("data", (data) => process.stdout.write(data));
|
|
16977
16743
|
wsgidav.stderr?.on("data", (data) => process.stderr.write(data));
|
|
16978
|
-
console.log(
|
|
16744
|
+
console.log(chalk67.green("\u2713 WebDAV server started"));
|
|
16979
16745
|
const chrome = spawn2(
|
|
16980
16746
|
chromeBinary,
|
|
16981
16747
|
[
|
|
@@ -16989,7 +16755,7 @@ async function startComputerServices(credentials) {
|
|
|
16989
16755
|
);
|
|
16990
16756
|
chrome.stdout?.on("data", (data) => process.stdout.write(data));
|
|
16991
16757
|
chrome.stderr?.on("data", (data) => process.stderr.write(data));
|
|
16992
|
-
console.log(
|
|
16758
|
+
console.log(chalk67.green("\u2713 Chrome started"));
|
|
16993
16759
|
try {
|
|
16994
16760
|
await startNgrokTunnels(
|
|
16995
16761
|
credentials.ngrokToken,
|
|
@@ -16998,18 +16764,18 @@ async function startComputerServices(credentials) {
|
|
|
16998
16764
|
cdpPort
|
|
16999
16765
|
);
|
|
17000
16766
|
console.log(
|
|
17001
|
-
|
|
16767
|
+
chalk67.green(
|
|
17002
16768
|
`\u2713 ngrok tunnels: webdav.${credentials.domain}, chrome.${credentials.domain}`
|
|
17003
16769
|
)
|
|
17004
16770
|
);
|
|
17005
16771
|
console.log();
|
|
17006
|
-
console.log(
|
|
16772
|
+
console.log(chalk67.green("\u2713 Computer connector active"));
|
|
17007
16773
|
console.log(` WebDAV: ~/Downloads \u2192 webdav.${credentials.domain}`);
|
|
17008
16774
|
console.log(
|
|
17009
16775
|
` Chrome CDP: port ${cdpPort} \u2192 chrome.${credentials.domain}`
|
|
17010
16776
|
);
|
|
17011
16777
|
console.log();
|
|
17012
|
-
console.log(
|
|
16778
|
+
console.log(chalk67.dim("Press ^C twice to disconnect"));
|
|
17013
16779
|
console.log();
|
|
17014
16780
|
let sigintCount = 0;
|
|
17015
16781
|
await new Promise((resolve2) => {
|
|
@@ -17023,7 +16789,7 @@ async function startComputerServices(credentials) {
|
|
|
17023
16789
|
const onSigint = () => {
|
|
17024
16790
|
sigintCount++;
|
|
17025
16791
|
if (sigintCount === 1) {
|
|
17026
|
-
console.log(
|
|
16792
|
+
console.log(chalk67.dim("\nPress ^C again to disconnect and exit..."));
|
|
17027
16793
|
} else {
|
|
17028
16794
|
done();
|
|
17029
16795
|
}
|
|
@@ -17033,11 +16799,11 @@ async function startComputerServices(credentials) {
|
|
|
17033
16799
|
});
|
|
17034
16800
|
} finally {
|
|
17035
16801
|
console.log();
|
|
17036
|
-
console.log(
|
|
16802
|
+
console.log(chalk67.cyan("Stopping services..."));
|
|
17037
16803
|
wsgidav.kill("SIGTERM");
|
|
17038
16804
|
chrome.kill("SIGTERM");
|
|
17039
16805
|
await stopNgrokTunnels();
|
|
17040
|
-
console.log(
|
|
16806
|
+
console.log(chalk67.green("\u2713 Services stopped"));
|
|
17041
16807
|
}
|
|
17042
16808
|
}
|
|
17043
16809
|
|
|
@@ -17062,10 +16828,10 @@ async function getHeaders2() {
|
|
|
17062
16828
|
function renderHelpText(text) {
|
|
17063
16829
|
return text.replace(
|
|
17064
16830
|
/\[([^\]]+)\]\(([^)]+)\)/g,
|
|
17065
|
-
(_m, label, url) => `${label} (${
|
|
17066
|
-
).replace(/\*\*([^*]+)\*\*/g, (_m, content) =>
|
|
16831
|
+
(_m, label, url) => `${label} (${chalk68.cyan(url)})`
|
|
16832
|
+
).replace(/\*\*([^*]+)\*\*/g, (_m, content) => chalk68.bold(content)).replace(
|
|
17067
16833
|
/^> (.+)$/gm,
|
|
17068
|
-
(_m, content) =>
|
|
16834
|
+
(_m, content) => chalk68.yellow(` ${content}`)
|
|
17069
16835
|
);
|
|
17070
16836
|
}
|
|
17071
16837
|
async function connectViaApiToken(connectorType, tokenValue) {
|
|
@@ -17090,7 +16856,7 @@ async function connectViaApiToken(connectorType, tokenValue) {
|
|
|
17090
16856
|
for (const [secretName, secretConfig] of secretEntries) {
|
|
17091
16857
|
if (!secretConfig.required) continue;
|
|
17092
16858
|
const value = await promptPassword(
|
|
17093
|
-
`${secretConfig.label}${secretConfig.placeholder ?
|
|
16859
|
+
`${secretConfig.label}${secretConfig.placeholder ? chalk68.dim(` (${secretConfig.placeholder})`) : ""}:`
|
|
17094
16860
|
);
|
|
17095
16861
|
if (!value) {
|
|
17096
16862
|
throw new Error("Cancelled");
|
|
@@ -17106,13 +16872,13 @@ async function connectViaApiToken(connectorType, tokenValue) {
|
|
|
17106
16872
|
});
|
|
17107
16873
|
}
|
|
17108
16874
|
console.log(
|
|
17109
|
-
|
|
16875
|
+
chalk68.green(`
|
|
17110
16876
|
\u2713 ${config.label} connected successfully via API token!`)
|
|
17111
16877
|
);
|
|
17112
16878
|
}
|
|
17113
16879
|
async function connectComputer(apiUrl, headers) {
|
|
17114
16880
|
await checkComputerDependencies();
|
|
17115
|
-
console.log(
|
|
16881
|
+
console.log(chalk68.cyan("Setting up computer connector..."));
|
|
17116
16882
|
const computerClient = initClient13(computerConnectorContract, {
|
|
17117
16883
|
baseUrl: apiUrl,
|
|
17118
16884
|
baseHeaders: headers,
|
|
@@ -17127,9 +16893,9 @@ async function connectComputer(apiUrl, headers) {
|
|
|
17127
16893
|
}
|
|
17128
16894
|
const credentials = createResult.body;
|
|
17129
16895
|
await startComputerServices(credentials);
|
|
17130
|
-
console.log(
|
|
16896
|
+
console.log(chalk68.cyan("Disconnecting computer connector..."));
|
|
17131
16897
|
await deleteConnector("computer");
|
|
17132
|
-
console.log(
|
|
16898
|
+
console.log(chalk68.green("\u2713 Disconnected computer"));
|
|
17133
16899
|
process.exit(0);
|
|
17134
16900
|
}
|
|
17135
16901
|
async function resolveAuthMethod(connectorType, tokenFlag) {
|
|
@@ -17168,7 +16934,7 @@ async function resolveAuthMethod(connectorType, tokenFlag) {
|
|
|
17168
16934
|
);
|
|
17169
16935
|
}
|
|
17170
16936
|
async function connectViaOAuth(connectorType, apiUrl, headers) {
|
|
17171
|
-
console.log(`Connecting ${
|
|
16937
|
+
console.log(`Connecting ${chalk68.cyan(connectorType)}...`);
|
|
17172
16938
|
const sessionsClient = initClient13(connectorSessionsContract, {
|
|
17173
16939
|
baseUrl: apiUrl,
|
|
17174
16940
|
baseHeaders: headers,
|
|
@@ -17184,8 +16950,8 @@ async function connectViaOAuth(connectorType, apiUrl, headers) {
|
|
|
17184
16950
|
}
|
|
17185
16951
|
const session = createResult.body;
|
|
17186
16952
|
const verificationUrl = `${apiUrl}${session.verificationUrl}`;
|
|
17187
|
-
console.log(
|
|
17188
|
-
console.log(
|
|
16953
|
+
console.log(chalk68.green("\nSession created"));
|
|
16954
|
+
console.log(chalk68.cyan(`
|
|
17189
16955
|
To connect, visit: ${verificationUrl}`));
|
|
17190
16956
|
console.log(
|
|
17191
16957
|
`
|
|
@@ -17217,7 +16983,7 @@ The session expires in ${Math.floor(session.expiresIn / 60)} minutes.`
|
|
|
17217
16983
|
switch (status.status) {
|
|
17218
16984
|
case "complete":
|
|
17219
16985
|
console.log(
|
|
17220
|
-
|
|
16986
|
+
chalk68.green(`
|
|
17221
16987
|
|
|
17222
16988
|
${connectorType} connected successfully!`)
|
|
17223
16989
|
);
|
|
@@ -17229,13 +16995,13 @@ ${connectorType} connected successfully!`)
|
|
|
17229
16995
|
`Connection failed: ${status.errorMessage || "Unknown error"}`
|
|
17230
16996
|
);
|
|
17231
16997
|
case "pending":
|
|
17232
|
-
process.stdout.write(
|
|
16998
|
+
process.stdout.write(chalk68.dim("."));
|
|
17233
16999
|
break;
|
|
17234
17000
|
}
|
|
17235
17001
|
}
|
|
17236
17002
|
throw new Error("Session timed out, please try again");
|
|
17237
17003
|
}
|
|
17238
|
-
var connectCommand = new
|
|
17004
|
+
var connectCommand = new Command76().name("connect").description("Connect a third-party service (e.g., GitHub)").argument("<type>", "Connector type (e.g., github)").option("--token <value>", "API token value (skip interactive prompt)").action(
|
|
17239
17005
|
withErrorHandler(async (type2, options) => {
|
|
17240
17006
|
const parseResult = connectorTypeSchema.safeParse(type2);
|
|
17241
17007
|
if (!parseResult.success) {
|
|
@@ -17260,9 +17026,9 @@ var connectCommand = new Command81().name("connect").description("Connect a thir
|
|
|
17260
17026
|
);
|
|
17261
17027
|
|
|
17262
17028
|
// src/commands/connector/list.ts
|
|
17263
|
-
import { Command as
|
|
17264
|
-
import
|
|
17265
|
-
var listCommand11 = new
|
|
17029
|
+
import { Command as Command77 } from "commander";
|
|
17030
|
+
import chalk69 from "chalk";
|
|
17031
|
+
var listCommand11 = new Command77().name("list").alias("ls").description("List all connectors and their status").action(
|
|
17266
17032
|
withErrorHandler(async () => {
|
|
17267
17033
|
const result = await listConnectors();
|
|
17268
17034
|
const connectedMap = new Map(result.connectors.map((c24) => [c24.type, c24]));
|
|
@@ -17284,25 +17050,25 @@ var listCommand11 = new Command82().name("list").alias("ls").description("List a
|
|
|
17284
17050
|
statusText.padEnd(statusWidth),
|
|
17285
17051
|
"ACCOUNT"
|
|
17286
17052
|
].join(" ");
|
|
17287
|
-
console.log(
|
|
17053
|
+
console.log(chalk69.dim(header));
|
|
17288
17054
|
for (const type2 of allTypes) {
|
|
17289
17055
|
const connector = connectedMap.get(type2);
|
|
17290
|
-
const status = connector ?
|
|
17291
|
-
const account = connector?.externalUsername ? `@${connector.externalUsername}` :
|
|
17056
|
+
const status = connector ? chalk69.green("\u2713".padEnd(statusWidth)) : chalk69.dim("-".padEnd(statusWidth));
|
|
17057
|
+
const account = connector?.externalUsername ? `@${connector.externalUsername}` : chalk69.dim("-");
|
|
17292
17058
|
const row = [type2.padEnd(typeWidth), status, account].join(" ");
|
|
17293
17059
|
console.log(row);
|
|
17294
17060
|
}
|
|
17295
17061
|
console.log();
|
|
17296
|
-
console.log(
|
|
17297
|
-
console.log(
|
|
17062
|
+
console.log(chalk69.dim("To connect a service:"));
|
|
17063
|
+
console.log(chalk69.dim(" vm0 connector connect <type>"));
|
|
17298
17064
|
})
|
|
17299
17065
|
);
|
|
17300
17066
|
|
|
17301
17067
|
// src/commands/connector/status.ts
|
|
17302
|
-
import { Command as
|
|
17303
|
-
import
|
|
17068
|
+
import { Command as Command78 } from "commander";
|
|
17069
|
+
import chalk70 from "chalk";
|
|
17304
17070
|
var LABEL_WIDTH = 16;
|
|
17305
|
-
var statusCommand8 = new
|
|
17071
|
+
var statusCommand8 = new Command78().name("status").description("Show detailed status of a connector").argument("<type>", "Connector type (e.g., github)").action(
|
|
17306
17072
|
withErrorHandler(async (type2) => {
|
|
17307
17073
|
const parseResult = connectorTypeSchema.safeParse(type2);
|
|
17308
17074
|
if (!parseResult.success) {
|
|
@@ -17312,11 +17078,11 @@ var statusCommand8 = new Command83().name("status").description("Show detailed s
|
|
|
17312
17078
|
});
|
|
17313
17079
|
}
|
|
17314
17080
|
const connector = await getConnector(parseResult.data);
|
|
17315
|
-
console.log(`Connector: ${
|
|
17081
|
+
console.log(`Connector: ${chalk70.cyan(type2)}`);
|
|
17316
17082
|
console.log();
|
|
17317
17083
|
if (connector) {
|
|
17318
17084
|
console.log(
|
|
17319
|
-
`${"Status:".padEnd(LABEL_WIDTH)}${
|
|
17085
|
+
`${"Status:".padEnd(LABEL_WIDTH)}${chalk70.green("connected")}`
|
|
17320
17086
|
);
|
|
17321
17087
|
console.log(
|
|
17322
17088
|
`${"Account:".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`
|
|
@@ -17338,23 +17104,23 @@ var statusCommand8 = new Command83().name("status").description("Show detailed s
|
|
|
17338
17104
|
);
|
|
17339
17105
|
}
|
|
17340
17106
|
console.log();
|
|
17341
|
-
console.log(
|
|
17342
|
-
console.log(
|
|
17107
|
+
console.log(chalk70.dim("To disconnect:"));
|
|
17108
|
+
console.log(chalk70.dim(` vm0 connector disconnect ${type2}`));
|
|
17343
17109
|
} else {
|
|
17344
17110
|
console.log(
|
|
17345
|
-
`${"Status:".padEnd(LABEL_WIDTH)}${
|
|
17111
|
+
`${"Status:".padEnd(LABEL_WIDTH)}${chalk70.dim("not connected")}`
|
|
17346
17112
|
);
|
|
17347
17113
|
console.log();
|
|
17348
|
-
console.log(
|
|
17349
|
-
console.log(
|
|
17114
|
+
console.log(chalk70.dim("To connect:"));
|
|
17115
|
+
console.log(chalk70.dim(` vm0 connector connect ${type2}`));
|
|
17350
17116
|
}
|
|
17351
17117
|
})
|
|
17352
17118
|
);
|
|
17353
17119
|
|
|
17354
17120
|
// src/commands/connector/disconnect.ts
|
|
17355
|
-
import { Command as
|
|
17356
|
-
import
|
|
17357
|
-
var disconnectCommand = new
|
|
17121
|
+
import { Command as Command79 } from "commander";
|
|
17122
|
+
import chalk71 from "chalk";
|
|
17123
|
+
var disconnectCommand = new Command79().name("disconnect").description("Disconnect a third-party service").argument("<type>", "Connector type to disconnect (e.g., github)").action(
|
|
17358
17124
|
withErrorHandler(async (type2) => {
|
|
17359
17125
|
const parseResult = connectorTypeSchema.safeParse(type2);
|
|
17360
17126
|
if (!parseResult.success) {
|
|
@@ -17365,33 +17131,33 @@ var disconnectCommand = new Command84().name("disconnect").description("Disconne
|
|
|
17365
17131
|
}
|
|
17366
17132
|
const connectorType = parseResult.data;
|
|
17367
17133
|
await deleteConnector(connectorType);
|
|
17368
|
-
console.log(
|
|
17134
|
+
console.log(chalk71.green(`\u2713 Disconnected ${type2}`));
|
|
17369
17135
|
})
|
|
17370
17136
|
);
|
|
17371
17137
|
|
|
17372
17138
|
// src/commands/connector/index.ts
|
|
17373
|
-
var connectorCommand = new
|
|
17139
|
+
var connectorCommand = new Command80().name("connector").description("Manage third-party service connections").addCommand(listCommand11).addCommand(statusCommand8).addCommand(connectCommand).addCommand(disconnectCommand);
|
|
17374
17140
|
|
|
17375
17141
|
// src/commands/onboard/index.ts
|
|
17376
|
-
import { Command as
|
|
17377
|
-
import
|
|
17142
|
+
import { Command as Command81 } from "commander";
|
|
17143
|
+
import chalk75 from "chalk";
|
|
17378
17144
|
import { mkdir as mkdir8 } from "fs/promises";
|
|
17379
17145
|
import { existsSync as existsSync12 } from "fs";
|
|
17380
17146
|
|
|
17381
17147
|
// src/lib/ui/welcome-box.ts
|
|
17382
|
-
import
|
|
17148
|
+
import chalk72 from "chalk";
|
|
17383
17149
|
var gradientColors = [
|
|
17384
|
-
|
|
17150
|
+
chalk72.hex("#FFAB5E"),
|
|
17385
17151
|
// Line 1 - lightest
|
|
17386
|
-
|
|
17152
|
+
chalk72.hex("#FF9642"),
|
|
17387
17153
|
// Line 2
|
|
17388
|
-
|
|
17154
|
+
chalk72.hex("#FF8228"),
|
|
17389
17155
|
// Line 3
|
|
17390
|
-
|
|
17156
|
+
chalk72.hex("#FF6D0A"),
|
|
17391
17157
|
// Line 4
|
|
17392
|
-
|
|
17158
|
+
chalk72.hex("#E85D00"),
|
|
17393
17159
|
// Line 5
|
|
17394
|
-
|
|
17160
|
+
chalk72.hex("#CC4E00")
|
|
17395
17161
|
// Line 6 - darkest
|
|
17396
17162
|
];
|
|
17397
17163
|
var vm0LogoLines = [
|
|
@@ -17413,15 +17179,15 @@ function renderVm0Banner() {
|
|
|
17413
17179
|
function renderOnboardWelcome() {
|
|
17414
17180
|
renderVm0Banner();
|
|
17415
17181
|
console.log(` Build agentic workflows using natural language.`);
|
|
17416
|
-
console.log(` ${
|
|
17182
|
+
console.log(` ${chalk72.dim("Currently in beta, enjoy it free")}`);
|
|
17417
17183
|
console.log(
|
|
17418
|
-
` ${
|
|
17184
|
+
` ${chalk72.dim("Star us on GitHub: https://github.com/vm0-ai/vm0")}`
|
|
17419
17185
|
);
|
|
17420
17186
|
console.log();
|
|
17421
17187
|
}
|
|
17422
17188
|
|
|
17423
17189
|
// src/lib/ui/step-runner.ts
|
|
17424
|
-
import
|
|
17190
|
+
import chalk73 from "chalk";
|
|
17425
17191
|
function createStepRunner(options = true) {
|
|
17426
17192
|
const opts = typeof options === "boolean" ? { interactive: options } : options;
|
|
17427
17193
|
const interactive = opts.interactive ?? true;
|
|
@@ -17436,25 +17202,25 @@ function createStepRunner(options = true) {
|
|
|
17436
17202
|
}
|
|
17437
17203
|
for (const [i, step] of completedSteps.entries()) {
|
|
17438
17204
|
if (step.failed) {
|
|
17439
|
-
console.log(
|
|
17205
|
+
console.log(chalk73.red(`\u2717 ${step.label}`));
|
|
17440
17206
|
} else {
|
|
17441
|
-
console.log(
|
|
17207
|
+
console.log(chalk73.green(`\u25CF ${step.label}`));
|
|
17442
17208
|
}
|
|
17443
17209
|
const isLastStep = i === completedSteps.length - 1;
|
|
17444
17210
|
if (!isLastStep || !isFinal) {
|
|
17445
|
-
console.log(
|
|
17211
|
+
console.log(chalk73.dim("\u2502"));
|
|
17446
17212
|
}
|
|
17447
17213
|
}
|
|
17448
17214
|
}
|
|
17449
17215
|
async function executeStep(label, fn, isFinal) {
|
|
17450
17216
|
let stepFailed = false;
|
|
17451
|
-
console.log(
|
|
17217
|
+
console.log(chalk73.yellow(`\u25CB ${label}`));
|
|
17452
17218
|
const ctx = {
|
|
17453
17219
|
connector() {
|
|
17454
|
-
console.log(
|
|
17220
|
+
console.log(chalk73.dim("\u2502"));
|
|
17455
17221
|
},
|
|
17456
17222
|
detail(message) {
|
|
17457
|
-
console.log(`${
|
|
17223
|
+
console.log(`${chalk73.dim("\u2502")} ${message}`);
|
|
17458
17224
|
},
|
|
17459
17225
|
async prompt(promptFn) {
|
|
17460
17226
|
return await promptFn();
|
|
@@ -17471,12 +17237,12 @@ function createStepRunner(options = true) {
|
|
|
17471
17237
|
redrawCompletedSteps(isFinal);
|
|
17472
17238
|
} else {
|
|
17473
17239
|
if (stepFailed) {
|
|
17474
|
-
console.log(
|
|
17240
|
+
console.log(chalk73.red(`\u2717 ${label}`));
|
|
17475
17241
|
} else {
|
|
17476
|
-
console.log(
|
|
17242
|
+
console.log(chalk73.green(`\u25CF ${label}`));
|
|
17477
17243
|
}
|
|
17478
17244
|
if (!isFinal) {
|
|
17479
|
-
console.log(
|
|
17245
|
+
console.log(chalk73.dim("\u2502"));
|
|
17480
17246
|
}
|
|
17481
17247
|
}
|
|
17482
17248
|
}
|
|
@@ -17636,7 +17402,7 @@ async function setupModelProvider(type2, secret, options) {
|
|
|
17636
17402
|
|
|
17637
17403
|
// src/lib/domain/onboard/claude-setup.ts
|
|
17638
17404
|
import { spawn as spawn3 } from "child_process";
|
|
17639
|
-
import
|
|
17405
|
+
import chalk74 from "chalk";
|
|
17640
17406
|
var MARKETPLACE_NAME = "vm0-skills";
|
|
17641
17407
|
var MARKETPLACE_REPO = "vm0-ai/vm0-skills";
|
|
17642
17408
|
var PLUGIN_ID = "vm0@vm0-skills";
|
|
@@ -17673,12 +17439,12 @@ async function runClaudeCommand(args, cwd) {
|
|
|
17673
17439
|
}
|
|
17674
17440
|
function handlePluginError(error, context) {
|
|
17675
17441
|
const displayContext = context ?? "Claude plugin";
|
|
17676
|
-
console.error(
|
|
17442
|
+
console.error(chalk74.red(`\u2717 Failed to install ${displayContext}`));
|
|
17677
17443
|
if (error instanceof Error) {
|
|
17678
|
-
console.error(
|
|
17444
|
+
console.error(chalk74.red(`\u2717 ${error.message}`));
|
|
17679
17445
|
}
|
|
17680
17446
|
console.error(
|
|
17681
|
-
|
|
17447
|
+
chalk74.dim("Please ensure Claude CLI is installed and accessible.")
|
|
17682
17448
|
);
|
|
17683
17449
|
process.exit(1);
|
|
17684
17450
|
}
|
|
@@ -17721,7 +17487,7 @@ async function updateMarketplace() {
|
|
|
17721
17487
|
]);
|
|
17722
17488
|
if (!result.success) {
|
|
17723
17489
|
console.warn(
|
|
17724
|
-
|
|
17490
|
+
chalk74.yellow(
|
|
17725
17491
|
`Warning: Could not update marketplace: ${result.error ?? "unknown error"}`
|
|
17726
17492
|
)
|
|
17727
17493
|
);
|
|
@@ -17767,9 +17533,9 @@ async function handleAuthentication(ctx) {
|
|
|
17767
17533
|
onInitiating: () => {
|
|
17768
17534
|
},
|
|
17769
17535
|
onDeviceCodeReady: (url, code, expiresIn) => {
|
|
17770
|
-
step.detail(`Copy code: ${
|
|
17771
|
-
step.detail(`Open: ${
|
|
17772
|
-
step.detail(
|
|
17536
|
+
step.detail(`Copy code: ${chalk75.cyan.bold(code)}`);
|
|
17537
|
+
step.detail(`Open: ${chalk75.cyan(url)}`);
|
|
17538
|
+
step.detail(chalk75.dim(`Expires in ${expiresIn} minutes`));
|
|
17773
17539
|
},
|
|
17774
17540
|
onPolling: () => {
|
|
17775
17541
|
},
|
|
@@ -17809,14 +17575,14 @@ async function handleModelProvider(ctx) {
|
|
|
17809
17575
|
const selectedChoice = choices.find((c24) => c24.type === providerType);
|
|
17810
17576
|
if (selectedChoice?.helpText) {
|
|
17811
17577
|
for (const line of selectedChoice.helpText.split("\n")) {
|
|
17812
|
-
step.detail(
|
|
17578
|
+
step.detail(chalk75.dim(line));
|
|
17813
17579
|
}
|
|
17814
17580
|
}
|
|
17815
17581
|
const secret = await step.prompt(
|
|
17816
17582
|
() => promptPassword(`Enter your ${selectedChoice?.secretLabel ?? "secret"}:`)
|
|
17817
17583
|
);
|
|
17818
17584
|
if (!secret) {
|
|
17819
|
-
console.log(
|
|
17585
|
+
console.log(chalk75.dim("Cancelled"));
|
|
17820
17586
|
process.exit(0);
|
|
17821
17587
|
}
|
|
17822
17588
|
let selectedModel;
|
|
@@ -17835,7 +17601,7 @@ async function handleModelProvider(ctx) {
|
|
|
17835
17601
|
() => promptSelect("Select model:", modelChoices)
|
|
17836
17602
|
);
|
|
17837
17603
|
if (modelSelection === void 0) {
|
|
17838
|
-
console.log(
|
|
17604
|
+
console.log(chalk75.dim("Cancelled"));
|
|
17839
17605
|
process.exit(0);
|
|
17840
17606
|
}
|
|
17841
17607
|
selectedModel = modelSelection === "" ? void 0 : modelSelection;
|
|
@@ -17845,7 +17611,7 @@ async function handleModelProvider(ctx) {
|
|
|
17845
17611
|
});
|
|
17846
17612
|
const modelNote = result.provider.selectedModel ? ` with model: ${result.provider.selectedModel}` : "";
|
|
17847
17613
|
step.detail(
|
|
17848
|
-
|
|
17614
|
+
chalk75.green(
|
|
17849
17615
|
`${providerType} ${result.created ? "created" : "updated"}${result.isDefault ? ` (default for ${result.framework})` : ""}${modelNote}`
|
|
17850
17616
|
)
|
|
17851
17617
|
);
|
|
@@ -17876,7 +17642,7 @@ async function handleAgentCreation(ctx) {
|
|
|
17876
17642
|
agentName = inputName;
|
|
17877
17643
|
if (existsSync12(agentName)) {
|
|
17878
17644
|
step.detail(
|
|
17879
|
-
|
|
17645
|
+
chalk75.yellow(`${agentName}/ already exists, choose another name`)
|
|
17880
17646
|
);
|
|
17881
17647
|
} else {
|
|
17882
17648
|
folderExists = false;
|
|
@@ -17897,7 +17663,7 @@ async function handleAgentCreation(ctx) {
|
|
|
17897
17663
|
}
|
|
17898
17664
|
}
|
|
17899
17665
|
await mkdir8(agentName, { recursive: true });
|
|
17900
|
-
step.detail(
|
|
17666
|
+
step.detail(chalk75.green(`Created ${agentName}/`));
|
|
17901
17667
|
});
|
|
17902
17668
|
return agentName;
|
|
17903
17669
|
}
|
|
@@ -17913,7 +17679,7 @@ async function handlePluginInstallation(ctx, agentName) {
|
|
|
17913
17679
|
shouldInstall = confirmed ?? true;
|
|
17914
17680
|
}
|
|
17915
17681
|
if (!shouldInstall) {
|
|
17916
|
-
step.detail(
|
|
17682
|
+
step.detail(chalk75.dim("Skipped"));
|
|
17917
17683
|
return;
|
|
17918
17684
|
}
|
|
17919
17685
|
const scope = "project";
|
|
@@ -17921,7 +17687,7 @@ async function handlePluginInstallation(ctx, agentName) {
|
|
|
17921
17687
|
const agentDir = `${process.cwd()}/${agentName}`;
|
|
17922
17688
|
const result = await installVm0Plugin(scope, agentDir);
|
|
17923
17689
|
step.detail(
|
|
17924
|
-
|
|
17690
|
+
chalk75.green(`Installed ${result.pluginId} (scope: ${result.scope})`)
|
|
17925
17691
|
);
|
|
17926
17692
|
pluginInstalled = true;
|
|
17927
17693
|
} catch (error) {
|
|
@@ -17932,18 +17698,18 @@ async function handlePluginInstallation(ctx, agentName) {
|
|
|
17932
17698
|
}
|
|
17933
17699
|
function printNextSteps(agentName, pluginInstalled) {
|
|
17934
17700
|
console.log();
|
|
17935
|
-
console.log(
|
|
17701
|
+
console.log(chalk75.bold("Next step:"));
|
|
17936
17702
|
console.log();
|
|
17937
17703
|
if (pluginInstalled) {
|
|
17938
17704
|
console.log(
|
|
17939
|
-
` ${
|
|
17705
|
+
` ${chalk75.cyan(`cd ${agentName} && claude "/${PRIMARY_SKILL_NAME} let's build an agent"`)}`
|
|
17940
17706
|
);
|
|
17941
17707
|
} else {
|
|
17942
|
-
console.log(` ${
|
|
17708
|
+
console.log(` ${chalk75.cyan(`cd ${agentName} && vm0 init`)}`);
|
|
17943
17709
|
}
|
|
17944
17710
|
console.log();
|
|
17945
17711
|
}
|
|
17946
|
-
var onboardCommand = new
|
|
17712
|
+
var onboardCommand = new Command81().name("onboard").description("Guided setup for new VM0 users").option("-y, --yes", "Skip confirmation prompts").option("--name <name>", `Agent name (default: ${DEFAULT_AGENT_NAME})`).action(
|
|
17947
17713
|
withErrorHandler(async (options) => {
|
|
17948
17714
|
const interactive = isInteractive();
|
|
17949
17715
|
if (interactive) {
|
|
@@ -17968,21 +17734,21 @@ var onboardCommand = new Command86().name("onboard").description("Guided setup f
|
|
|
17968
17734
|
);
|
|
17969
17735
|
|
|
17970
17736
|
// src/commands/setup-claude/index.ts
|
|
17971
|
-
import { Command as
|
|
17972
|
-
import
|
|
17973
|
-
var setupClaudeCommand = new
|
|
17737
|
+
import { Command as Command82 } from "commander";
|
|
17738
|
+
import chalk76 from "chalk";
|
|
17739
|
+
var setupClaudeCommand = new Command82().name("setup-claude").description("Install VM0 Claude Plugin").option("--agent-dir <dir>", "Agent directory to run install in").option("--scope <scope>", "Installation scope (user or project)", "project").action(
|
|
17974
17740
|
withErrorHandler(async (options) => {
|
|
17975
|
-
console.log(
|
|
17741
|
+
console.log(chalk76.dim("Installing VM0 Claude Plugin..."));
|
|
17976
17742
|
const scope = options.scope === "user" ? "user" : "project";
|
|
17977
17743
|
const result = await installVm0Plugin(scope, options.agentDir);
|
|
17978
17744
|
console.log(
|
|
17979
|
-
|
|
17745
|
+
chalk76.green(`\u2713 Installed ${result.pluginId} (scope: ${result.scope})`)
|
|
17980
17746
|
);
|
|
17981
17747
|
console.log();
|
|
17982
17748
|
console.log("Next step:");
|
|
17983
17749
|
const cdPrefix = options.agentDir ? `cd ${options.agentDir} && ` : "";
|
|
17984
17750
|
console.log(
|
|
17985
|
-
|
|
17751
|
+
chalk76.cyan(
|
|
17986
17752
|
` ${cdPrefix}claude "/${PRIMARY_SKILL_NAME} let's build a workflow"`
|
|
17987
17753
|
)
|
|
17988
17754
|
);
|
|
@@ -17990,36 +17756,36 @@ var setupClaudeCommand = new Command87().name("setup-claude").description("Insta
|
|
|
17990
17756
|
);
|
|
17991
17757
|
|
|
17992
17758
|
// src/commands/dashboard/index.ts
|
|
17993
|
-
import { Command as
|
|
17994
|
-
import
|
|
17995
|
-
var dashboardCommand = new
|
|
17759
|
+
import { Command as Command83 } from "commander";
|
|
17760
|
+
import chalk77 from "chalk";
|
|
17761
|
+
var dashboardCommand = new Command83().name("dashboard").description("Quick reference for common query commands").action(() => {
|
|
17996
17762
|
console.log();
|
|
17997
|
-
console.log(
|
|
17763
|
+
console.log(chalk77.bold("VM0 Dashboard"));
|
|
17998
17764
|
console.log();
|
|
17999
|
-
console.log(
|
|
18000
|
-
console.log(
|
|
17765
|
+
console.log(chalk77.bold("Agents"));
|
|
17766
|
+
console.log(chalk77.dim(" List agents: ") + "vm0 agent list");
|
|
18001
17767
|
console.log();
|
|
18002
|
-
console.log(
|
|
18003
|
-
console.log(
|
|
18004
|
-
console.log(
|
|
17768
|
+
console.log(chalk77.bold("Runs"));
|
|
17769
|
+
console.log(chalk77.dim(" Recent runs: ") + "vm0 run list");
|
|
17770
|
+
console.log(chalk77.dim(" View run logs: ") + "vm0 logs <run-id>");
|
|
18005
17771
|
console.log();
|
|
18006
|
-
console.log(
|
|
18007
|
-
console.log(
|
|
17772
|
+
console.log(chalk77.bold("Schedules"));
|
|
17773
|
+
console.log(chalk77.dim(" List schedules: ") + "vm0 schedule list");
|
|
18008
17774
|
console.log();
|
|
18009
|
-
console.log(
|
|
18010
|
-
console.log(
|
|
18011
|
-
console.log(
|
|
18012
|
-
console.log(
|
|
17775
|
+
console.log(chalk77.bold("Account"));
|
|
17776
|
+
console.log(chalk77.dim(" Usage stats: ") + "vm0 usage");
|
|
17777
|
+
console.log(chalk77.dim(" List secrets: ") + "vm0 secret list");
|
|
17778
|
+
console.log(chalk77.dim(" List variables: ") + "vm0 variable list");
|
|
18013
17779
|
console.log();
|
|
18014
17780
|
console.log(
|
|
18015
|
-
|
|
17781
|
+
chalk77.dim("Not logged in? Run: ") + chalk77.cyan("vm0 auth login")
|
|
18016
17782
|
);
|
|
18017
17783
|
console.log();
|
|
18018
17784
|
});
|
|
18019
17785
|
|
|
18020
17786
|
// src/commands/preference/index.ts
|
|
18021
|
-
import { Command as
|
|
18022
|
-
import
|
|
17787
|
+
import { Command as Command84 } from "commander";
|
|
17788
|
+
import chalk78 from "chalk";
|
|
18023
17789
|
function detectTimezone2() {
|
|
18024
17790
|
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
18025
17791
|
}
|
|
@@ -18040,15 +17806,15 @@ function parseOnOff(flag, value) {
|
|
|
18040
17806
|
);
|
|
18041
17807
|
}
|
|
18042
17808
|
function displayPreferences(prefs) {
|
|
18043
|
-
console.log(
|
|
17809
|
+
console.log(chalk78.bold("Current preferences:"));
|
|
18044
17810
|
console.log(
|
|
18045
|
-
` Timezone: ${prefs.timezone ?
|
|
17811
|
+
` Timezone: ${prefs.timezone ? chalk78.cyan(prefs.timezone) : chalk78.dim("not set")}`
|
|
18046
17812
|
);
|
|
18047
17813
|
console.log(
|
|
18048
|
-
` Email notify: ${prefs.notifyEmail ?
|
|
17814
|
+
` Email notify: ${prefs.notifyEmail ? chalk78.green("on") : chalk78.dim("off")}`
|
|
18049
17815
|
);
|
|
18050
17816
|
console.log(
|
|
18051
|
-
` Slack notify: ${prefs.notifySlack ?
|
|
17817
|
+
` Slack notify: ${prefs.notifySlack ? chalk78.green("on") : chalk78.dim("off")}`
|
|
18052
17818
|
);
|
|
18053
17819
|
}
|
|
18054
17820
|
function buildUpdates(opts) {
|
|
@@ -18078,21 +17844,21 @@ function buildUpdates(opts) {
|
|
|
18078
17844
|
function printUpdateResult(updates, result) {
|
|
18079
17845
|
if (updates.timezone !== void 0) {
|
|
18080
17846
|
console.log(
|
|
18081
|
-
|
|
18082
|
-
`Timezone set to ${
|
|
17847
|
+
chalk78.green(
|
|
17848
|
+
`Timezone set to ${chalk78.cyan(result.timezone ?? updates.timezone)}`
|
|
18083
17849
|
)
|
|
18084
17850
|
);
|
|
18085
17851
|
}
|
|
18086
17852
|
if (updates.notifyEmail !== void 0) {
|
|
18087
17853
|
console.log(
|
|
18088
|
-
|
|
17854
|
+
chalk78.green(
|
|
18089
17855
|
`Email notifications ${result.notifyEmail ? "enabled" : "disabled"}`
|
|
18090
17856
|
)
|
|
18091
17857
|
);
|
|
18092
17858
|
}
|
|
18093
17859
|
if (updates.notifySlack !== void 0) {
|
|
18094
17860
|
console.log(
|
|
18095
|
-
|
|
17861
|
+
chalk78.green(
|
|
18096
17862
|
`Slack notifications ${result.notifySlack ? "enabled" : "disabled"}`
|
|
18097
17863
|
)
|
|
18098
17864
|
);
|
|
@@ -18101,7 +17867,7 @@ function printUpdateResult(updates, result) {
|
|
|
18101
17867
|
async function interactiveSetup(prefs) {
|
|
18102
17868
|
if (!prefs.timezone) {
|
|
18103
17869
|
const detectedTz = detectTimezone2();
|
|
18104
|
-
console.log(
|
|
17870
|
+
console.log(chalk78.dim(`
|
|
18105
17871
|
System timezone detected: ${detectedTz}`));
|
|
18106
17872
|
const tz = await promptText(
|
|
18107
17873
|
"Set timezone? (enter timezone or leave empty to skip)",
|
|
@@ -18112,7 +17878,7 @@ System timezone detected: ${detectedTz}`));
|
|
|
18112
17878
|
throw new Error(`Invalid timezone: ${tz.trim()}`);
|
|
18113
17879
|
}
|
|
18114
17880
|
await updateUserPreferences({ timezone: tz.trim() });
|
|
18115
|
-
console.log(
|
|
17881
|
+
console.log(chalk78.green(`Timezone set to ${chalk78.cyan(tz.trim())}`));
|
|
18116
17882
|
}
|
|
18117
17883
|
}
|
|
18118
17884
|
if (!prefs.notifyEmail) {
|
|
@@ -18122,11 +17888,11 @@ System timezone detected: ${detectedTz}`));
|
|
|
18122
17888
|
);
|
|
18123
17889
|
if (enable) {
|
|
18124
17890
|
await updateUserPreferences({ notifyEmail: true });
|
|
18125
|
-
console.log(
|
|
17891
|
+
console.log(chalk78.green("Email notifications enabled"));
|
|
18126
17892
|
}
|
|
18127
17893
|
}
|
|
18128
17894
|
}
|
|
18129
|
-
var preferenceCommand = new
|
|
17895
|
+
var preferenceCommand = new Command84().name("preference").description("View or update your preferences").option("--timezone <timezone>", "IANA timezone (e.g., America/New_York)").option("--notify-email <on|off>", "Enable or disable email notifications").option("--notify-slack <on|off>", "Enable or disable Slack notifications").action(
|
|
18130
17896
|
withErrorHandler(async (opts) => {
|
|
18131
17897
|
const updates = buildUpdates(opts);
|
|
18132
17898
|
if (updates) {
|
|
@@ -18141,32 +17907,32 @@ var preferenceCommand = new Command89().name("preference").description("View or
|
|
|
18141
17907
|
} else if (!prefs.timezone) {
|
|
18142
17908
|
console.log();
|
|
18143
17909
|
console.log(
|
|
18144
|
-
`To set timezone: ${
|
|
17910
|
+
`To set timezone: ${chalk78.cyan("vm0 preference --timezone <timezone>")}`
|
|
18145
17911
|
);
|
|
18146
17912
|
console.log(
|
|
18147
|
-
|
|
17913
|
+
chalk78.dim("Example: vm0 preference --timezone America/New_York")
|
|
18148
17914
|
);
|
|
18149
17915
|
}
|
|
18150
17916
|
})
|
|
18151
17917
|
);
|
|
18152
17918
|
|
|
18153
17919
|
// src/commands/upgrade/index.ts
|
|
18154
|
-
import { Command as
|
|
18155
|
-
import
|
|
18156
|
-
var upgradeCommand = new
|
|
17920
|
+
import { Command as Command85 } from "commander";
|
|
17921
|
+
import chalk79 from "chalk";
|
|
17922
|
+
var upgradeCommand = new Command85().name("upgrade").description("Upgrade vm0 CLI to the latest version").action(
|
|
18157
17923
|
withErrorHandler(async () => {
|
|
18158
17924
|
console.log("Checking for updates...");
|
|
18159
17925
|
const latestVersion = await getLatestVersion();
|
|
18160
17926
|
if (latestVersion === null) {
|
|
18161
17927
|
throw new Error("Could not check for updates. Please try again later.");
|
|
18162
17928
|
}
|
|
18163
|
-
if (latestVersion === "9.
|
|
18164
|
-
console.log(
|
|
17929
|
+
if (latestVersion === "9.60.1") {
|
|
17930
|
+
console.log(chalk79.green(`\u2713 Already up to date (${"9.60.1"})`));
|
|
18165
17931
|
return;
|
|
18166
17932
|
}
|
|
18167
17933
|
console.log(
|
|
18168
|
-
|
|
18169
|
-
`Current version: ${"9.
|
|
17934
|
+
chalk79.yellow(
|
|
17935
|
+
`Current version: ${"9.60.1"} -> Latest version: ${latestVersion}`
|
|
18170
17936
|
)
|
|
18171
17937
|
);
|
|
18172
17938
|
console.log();
|
|
@@ -18174,26 +17940,26 @@ var upgradeCommand = new Command90().name("upgrade").description("Upgrade vm0 CL
|
|
|
18174
17940
|
if (!isAutoUpgradeSupported(packageManager)) {
|
|
18175
17941
|
if (packageManager === "unknown") {
|
|
18176
17942
|
console.log(
|
|
18177
|
-
|
|
17943
|
+
chalk79.yellow(
|
|
18178
17944
|
"Could not detect your package manager for auto-upgrade."
|
|
18179
17945
|
)
|
|
18180
17946
|
);
|
|
18181
17947
|
} else {
|
|
18182
17948
|
console.log(
|
|
18183
|
-
|
|
17949
|
+
chalk79.yellow(
|
|
18184
17950
|
`Auto-upgrade is not supported for ${packageManager}.`
|
|
18185
17951
|
)
|
|
18186
17952
|
);
|
|
18187
17953
|
}
|
|
18188
|
-
console.log(
|
|
18189
|
-
console.log(
|
|
17954
|
+
console.log(chalk79.yellow("Please upgrade manually:"));
|
|
17955
|
+
console.log(chalk79.cyan(` ${getManualUpgradeCommand(packageManager)}`));
|
|
18190
17956
|
return;
|
|
18191
17957
|
}
|
|
18192
17958
|
console.log(`Upgrading via ${packageManager}...`);
|
|
18193
17959
|
const success = await performUpgrade(packageManager);
|
|
18194
17960
|
if (success) {
|
|
18195
17961
|
console.log(
|
|
18196
|
-
|
|
17962
|
+
chalk79.green(`\u2713 Upgraded from ${"9.60.1"} to ${latestVersion}`)
|
|
18197
17963
|
);
|
|
18198
17964
|
return;
|
|
18199
17965
|
}
|
|
@@ -18206,8 +17972,8 @@ var upgradeCommand = new Command90().name("upgrade").description("Upgrade vm0 CL
|
|
|
18206
17972
|
);
|
|
18207
17973
|
|
|
18208
17974
|
// src/index.ts
|
|
18209
|
-
var program = new
|
|
18210
|
-
program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.
|
|
17975
|
+
var program = new Command86();
|
|
17976
|
+
program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.60.1");
|
|
18211
17977
|
program.addCommand(authCommand);
|
|
18212
17978
|
program.addCommand(infoCommand);
|
|
18213
17979
|
program.addCommand(composeCommand);
|