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