@vm0/cli 9.58.0 → 9.59.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 +745 -720
- package/package.json +2 -2
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.59.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.59.0",
|
|
68
68
|
command: process.argv.slice(2).join(" ")
|
|
69
69
|
});
|
|
70
70
|
Sentry.setContext("runtime", {
|
|
@@ -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.59.0"}`));
|
|
677
677
|
console.log();
|
|
678
678
|
const config = await loadConfig();
|
|
679
679
|
const hasEnvToken = !!process.env.VM0_TOKEN;
|
|
@@ -704,7 +704,7 @@ var infoCommand = new Command6().name("info").description("Display environment a
|
|
|
704
704
|
|
|
705
705
|
// src/commands/compose/index.ts
|
|
706
706
|
import { Command as Command7, Option } from "commander";
|
|
707
|
-
import
|
|
707
|
+
import chalk6 from "chalk";
|
|
708
708
|
import { readFile as readFile4, rm as rm3 } from "fs/promises";
|
|
709
709
|
import { existsSync as existsSync5 } from "fs";
|
|
710
710
|
import { dirname as dirname2, join as join8 } from "path";
|
|
@@ -871,6 +871,8 @@ var storedExecutionContextSchema = z3.object({
|
|
|
871
871
|
resumeSession: resumeSessionSchema.nullable(),
|
|
872
872
|
encryptedSecrets: z3.string().nullable(),
|
|
873
873
|
// AES-256-GCM encrypted Record<string, string> (secret name → value)
|
|
874
|
+
// Maps secret names to OAuth connector types for runtime token refresh (e.g. { "GMAIL_ACCESS_TOKEN": "gmail" })
|
|
875
|
+
secretConnectorMap: z3.record(z3.string(), z3.string()).nullable().optional(),
|
|
874
876
|
cliAgentType: z3.string(),
|
|
875
877
|
experimentalFirewall: experimentalFirewallSchema.optional(),
|
|
876
878
|
// Debug flag to force real Claude in mock environments (internal use only)
|
|
@@ -902,6 +904,8 @@ var executionContextSchema = z3.object({
|
|
|
902
904
|
secretValues: z3.array(z3.string()).nullable(),
|
|
903
905
|
// AES-256-GCM encrypted Record<string, string> — passed through to mitm-addon for auth resolution
|
|
904
906
|
encryptedSecrets: z3.string().nullable(),
|
|
907
|
+
// Maps secret names to OAuth connector types for runtime token refresh
|
|
908
|
+
secretConnectorMap: z3.record(z3.string(), z3.string()).nullable().optional(),
|
|
905
909
|
cliAgentType: z3.string(),
|
|
906
910
|
// Experimental firewall configuration
|
|
907
911
|
experimentalFirewall: experimentalFirewallSchema.optional(),
|
|
@@ -6448,11 +6452,12 @@ var computerConnectorContract = c18.router({
|
|
|
6448
6452
|
function bearerAuth(secretName) {
|
|
6449
6453
|
return { headers: { Authorization: `Bearer \${secrets.${secretName}}` } };
|
|
6450
6454
|
}
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
}
|
|
6454
|
-
|
|
6455
|
-
|
|
6455
|
+
var FULL_ACCESS_PERMISSION = {
|
|
6456
|
+
name: "full-access",
|
|
6457
|
+
rules: ["ANY /{path+}"]
|
|
6458
|
+
};
|
|
6459
|
+
function api(base, auth) {
|
|
6460
|
+
return { base, auth, permissions: [FULL_ACCESS_PERMISSION] };
|
|
6456
6461
|
}
|
|
6457
6462
|
var SERVICE_CONFIGS = {
|
|
6458
6463
|
ahrefs: {
|
|
@@ -6655,16 +6660,8 @@ var SERVICE_CONFIGS = {
|
|
|
6655
6660
|
},
|
|
6656
6661
|
slack: {
|
|
6657
6662
|
apis: [
|
|
6658
|
-
api(
|
|
6659
|
-
|
|
6660
|
-
bearerAuth("SLACK_TOKEN"),
|
|
6661
|
-
"api-full-access"
|
|
6662
|
-
),
|
|
6663
|
-
api(
|
|
6664
|
-
"https://files.slack.com",
|
|
6665
|
-
bearerAuth("SLACK_TOKEN"),
|
|
6666
|
-
"files-full-access"
|
|
6667
|
-
)
|
|
6663
|
+
api("https://slack.com/api", bearerAuth("SLACK_TOKEN")),
|
|
6664
|
+
api("https://files.slack.com", bearerAuth("SLACK_TOKEN"))
|
|
6668
6665
|
],
|
|
6669
6666
|
placeholders: {
|
|
6670
6667
|
SLACK_TOKEN: "xoxb-0000-0000-vm0placeholder"
|
|
@@ -6672,30 +6669,14 @@ var SERVICE_CONFIGS = {
|
|
|
6672
6669
|
},
|
|
6673
6670
|
docusign: {
|
|
6674
6671
|
apis: [
|
|
6675
|
-
api(
|
|
6676
|
-
|
|
6677
|
-
bearerAuth("DOCUSIGN_TOKEN"),
|
|
6678
|
-
"demo-full-access"
|
|
6679
|
-
),
|
|
6680
|
-
api(
|
|
6681
|
-
"https://na1.docusign.net/restapi",
|
|
6682
|
-
bearerAuth("DOCUSIGN_TOKEN"),
|
|
6683
|
-
"na1-full-access"
|
|
6684
|
-
)
|
|
6672
|
+
api("https://demo.docusign.net/restapi", bearerAuth("DOCUSIGN_TOKEN")),
|
|
6673
|
+
api("https://na1.docusign.net/restapi", bearerAuth("DOCUSIGN_TOKEN"))
|
|
6685
6674
|
]
|
|
6686
6675
|
},
|
|
6687
6676
|
dropbox: {
|
|
6688
6677
|
apis: [
|
|
6689
|
-
api(
|
|
6690
|
-
|
|
6691
|
-
bearerAuth("DROPBOX_TOKEN"),
|
|
6692
|
-
"api-full-access"
|
|
6693
|
-
),
|
|
6694
|
-
api(
|
|
6695
|
-
"https://content.dropboxapi.com/2",
|
|
6696
|
-
bearerAuth("DROPBOX_TOKEN"),
|
|
6697
|
-
"content-full-access"
|
|
6698
|
-
)
|
|
6678
|
+
api("https://api.dropboxapi.com/2", bearerAuth("DROPBOX_TOKEN")),
|
|
6679
|
+
api("https://content.dropboxapi.com/2", bearerAuth("DROPBOX_TOKEN"))
|
|
6699
6680
|
]
|
|
6700
6681
|
},
|
|
6701
6682
|
linear: {
|
|
@@ -6703,21 +6684,9 @@ var SERVICE_CONFIGS = {
|
|
|
6703
6684
|
},
|
|
6704
6685
|
intercom: {
|
|
6705
6686
|
apis: [
|
|
6706
|
-
api(
|
|
6707
|
-
|
|
6708
|
-
|
|
6709
|
-
"us-full-access"
|
|
6710
|
-
),
|
|
6711
|
-
api(
|
|
6712
|
-
"https://api.eu.intercom.io",
|
|
6713
|
-
bearerAuth("INTERCOM_TOKEN"),
|
|
6714
|
-
"eu-full-access"
|
|
6715
|
-
),
|
|
6716
|
-
api(
|
|
6717
|
-
"https://api.au.intercom.io",
|
|
6718
|
-
bearerAuth("INTERCOM_TOKEN"),
|
|
6719
|
-
"au-full-access"
|
|
6720
|
-
)
|
|
6687
|
+
api("https://api.intercom.io", bearerAuth("INTERCOM_TOKEN")),
|
|
6688
|
+
api("https://api.eu.intercom.io", bearerAuth("INTERCOM_TOKEN")),
|
|
6689
|
+
api("https://api.au.intercom.io", bearerAuth("INTERCOM_TOKEN"))
|
|
6721
6690
|
]
|
|
6722
6691
|
},
|
|
6723
6692
|
jam: {
|
|
@@ -6725,24 +6694,16 @@ var SERVICE_CONFIGS = {
|
|
|
6725
6694
|
},
|
|
6726
6695
|
jotform: {
|
|
6727
6696
|
apis: [
|
|
6728
|
-
api(
|
|
6729
|
-
|
|
6730
|
-
|
|
6731
|
-
|
|
6732
|
-
|
|
6733
|
-
|
|
6734
|
-
|
|
6735
|
-
|
|
6736
|
-
|
|
6737
|
-
|
|
6738
|
-
"https://eu-api.jotform.com",
|
|
6739
|
-
{
|
|
6740
|
-
headers: {
|
|
6741
|
-
APIKEY: "${secrets.JOTFORM_TOKEN}"
|
|
6742
|
-
}
|
|
6743
|
-
},
|
|
6744
|
-
"eu-full-access"
|
|
6745
|
-
)
|
|
6697
|
+
api("https://api.jotform.com", {
|
|
6698
|
+
headers: {
|
|
6699
|
+
APIKEY: "${secrets.JOTFORM_TOKEN}"
|
|
6700
|
+
}
|
|
6701
|
+
}),
|
|
6702
|
+
api("https://eu-api.jotform.com", {
|
|
6703
|
+
headers: {
|
|
6704
|
+
APIKEY: "${secrets.JOTFORM_TOKEN}"
|
|
6705
|
+
}
|
|
6706
|
+
})
|
|
6746
6707
|
]
|
|
6747
6708
|
},
|
|
6748
6709
|
line: {
|
|
@@ -6750,42 +6711,26 @@ var SERVICE_CONFIGS = {
|
|
|
6750
6711
|
},
|
|
6751
6712
|
make: {
|
|
6752
6713
|
apis: [
|
|
6753
|
-
api(
|
|
6754
|
-
|
|
6755
|
-
|
|
6756
|
-
|
|
6757
|
-
|
|
6758
|
-
|
|
6759
|
-
|
|
6760
|
-
|
|
6761
|
-
|
|
6762
|
-
|
|
6763
|
-
|
|
6764
|
-
{
|
|
6765
|
-
|
|
6766
|
-
|
|
6767
|
-
|
|
6768
|
-
|
|
6769
|
-
|
|
6770
|
-
|
|
6771
|
-
|
|
6772
|
-
|
|
6773
|
-
{
|
|
6774
|
-
headers: {
|
|
6775
|
-
Authorization: "Token ${secrets.MAKE_TOKEN}"
|
|
6776
|
-
}
|
|
6777
|
-
},
|
|
6778
|
-
"us1-full-access"
|
|
6779
|
-
),
|
|
6780
|
-
api(
|
|
6781
|
-
"https://us2.make.com/api/v2",
|
|
6782
|
-
{
|
|
6783
|
-
headers: {
|
|
6784
|
-
Authorization: "Token ${secrets.MAKE_TOKEN}"
|
|
6785
|
-
}
|
|
6786
|
-
},
|
|
6787
|
-
"us2-full-access"
|
|
6788
|
-
)
|
|
6714
|
+
api("https://eu1.make.com/api/v2", {
|
|
6715
|
+
headers: {
|
|
6716
|
+
Authorization: "Token ${secrets.MAKE_TOKEN}"
|
|
6717
|
+
}
|
|
6718
|
+
}),
|
|
6719
|
+
api("https://eu2.make.com/api/v2", {
|
|
6720
|
+
headers: {
|
|
6721
|
+
Authorization: "Token ${secrets.MAKE_TOKEN}"
|
|
6722
|
+
}
|
|
6723
|
+
}),
|
|
6724
|
+
api("https://us1.make.com/api/v2", {
|
|
6725
|
+
headers: {
|
|
6726
|
+
Authorization: "Token ${secrets.MAKE_TOKEN}"
|
|
6727
|
+
}
|
|
6728
|
+
}),
|
|
6729
|
+
api("https://us2.make.com/api/v2", {
|
|
6730
|
+
headers: {
|
|
6731
|
+
Authorization: "Token ${secrets.MAKE_TOKEN}"
|
|
6732
|
+
}
|
|
6733
|
+
})
|
|
6789
6734
|
]
|
|
6790
6735
|
},
|
|
6791
6736
|
metabase: {
|
|
@@ -6870,16 +6815,8 @@ var SERVICE_CONFIGS = {
|
|
|
6870
6815
|
},
|
|
6871
6816
|
posthog: {
|
|
6872
6817
|
apis: [
|
|
6873
|
-
api(
|
|
6874
|
-
|
|
6875
|
-
bearerAuth("POSTHOG_ACCESS_TOKEN"),
|
|
6876
|
-
"us-full-access"
|
|
6877
|
-
),
|
|
6878
|
-
api(
|
|
6879
|
-
"https://app.posthog.com/api",
|
|
6880
|
-
bearerAuth("POSTHOG_ACCESS_TOKEN"),
|
|
6881
|
-
"cloud-full-access"
|
|
6882
|
-
)
|
|
6818
|
+
api("https://us.posthog.com/api", bearerAuth("POSTHOG_ACCESS_TOKEN")),
|
|
6819
|
+
api("https://app.posthog.com/api", bearerAuth("POSTHOG_ACCESS_TOKEN"))
|
|
6883
6820
|
]
|
|
6884
6821
|
},
|
|
6885
6822
|
stripe: {
|
|
@@ -6911,8 +6848,7 @@ var SERVICE_CONFIGS = {
|
|
|
6911
6848
|
{ length: 21 },
|
|
6912
6849
|
(_, i) => api(
|
|
6913
6850
|
`https://us${i + 1}.api.mailchimp.com/3.0`,
|
|
6914
|
-
bearerAuth("MAILCHIMP_TOKEN")
|
|
6915
|
-
`us${i + 1}-full-access`
|
|
6851
|
+
bearerAuth("MAILCHIMP_TOKEN")
|
|
6916
6852
|
)
|
|
6917
6853
|
)
|
|
6918
6854
|
},
|
|
@@ -7281,6 +7217,40 @@ var onboardingStatusContract = c22.router({
|
|
|
7281
7217
|
}
|
|
7282
7218
|
});
|
|
7283
7219
|
|
|
7220
|
+
// ../../packages/core/src/contracts/skills.ts
|
|
7221
|
+
import { z as z25 } from "zod";
|
|
7222
|
+
var c23 = initContract();
|
|
7223
|
+
var skillFrontmatterSchema = z25.object({
|
|
7224
|
+
name: z25.string().optional(),
|
|
7225
|
+
description: z25.string().optional(),
|
|
7226
|
+
vm0_secrets: z25.array(z25.string()).optional(),
|
|
7227
|
+
vm0_vars: z25.array(z25.string()).optional()
|
|
7228
|
+
});
|
|
7229
|
+
var resolvedSkillSchema = z25.object({
|
|
7230
|
+
storageName: z25.string(),
|
|
7231
|
+
versionHash: z25.string(),
|
|
7232
|
+
frontmatter: skillFrontmatterSchema
|
|
7233
|
+
});
|
|
7234
|
+
var skillsResolveContract = c23.router({
|
|
7235
|
+
resolve: {
|
|
7236
|
+
method: "POST",
|
|
7237
|
+
path: "/api/skills/resolve",
|
|
7238
|
+
headers: authHeadersSchema,
|
|
7239
|
+
body: z25.object({
|
|
7240
|
+
skills: z25.array(z25.string().url()).min(1).max(100)
|
|
7241
|
+
}),
|
|
7242
|
+
responses: {
|
|
7243
|
+
200: z25.object({
|
|
7244
|
+
resolved: z25.record(z25.string(), resolvedSkillSchema),
|
|
7245
|
+
unresolved: z25.array(z25.string())
|
|
7246
|
+
}),
|
|
7247
|
+
400: apiErrorSchema,
|
|
7248
|
+
401: apiErrorSchema
|
|
7249
|
+
},
|
|
7250
|
+
summary: "Batch resolve skill URLs to cached version info"
|
|
7251
|
+
}
|
|
7252
|
+
});
|
|
7253
|
+
|
|
7284
7254
|
// ../../packages/core/src/org-reference.ts
|
|
7285
7255
|
function isLegacySystemTemplate(reference) {
|
|
7286
7256
|
return reference.startsWith("vm0-");
|
|
@@ -8416,9 +8386,45 @@ async function updateUserPreferences(body) {
|
|
|
8416
8386
|
handleError(result, "Failed to update user preferences");
|
|
8417
8387
|
}
|
|
8418
8388
|
|
|
8389
|
+
// src/lib/api/domains/skills.ts
|
|
8390
|
+
import chalk5 from "chalk";
|
|
8391
|
+
function isResolveSkillsResponse(value) {
|
|
8392
|
+
if (typeof value !== "object" || value === null) return false;
|
|
8393
|
+
const obj = value;
|
|
8394
|
+
return typeof obj.resolved === "object" && obj.resolved !== null && Array.isArray(obj.unresolved);
|
|
8395
|
+
}
|
|
8396
|
+
async function resolveSkills(skillUrls) {
|
|
8397
|
+
try {
|
|
8398
|
+
const response = await httpPost("/api/skills/resolve", {
|
|
8399
|
+
skills: skillUrls
|
|
8400
|
+
});
|
|
8401
|
+
if (!response.ok) {
|
|
8402
|
+
console.error(
|
|
8403
|
+
chalk5.dim(" Skill resolve unavailable, downloading all skills")
|
|
8404
|
+
);
|
|
8405
|
+
return { resolved: {}, unresolved: skillUrls };
|
|
8406
|
+
}
|
|
8407
|
+
const body = await response.json();
|
|
8408
|
+
if (!isResolveSkillsResponse(body)) {
|
|
8409
|
+
console.error(
|
|
8410
|
+
chalk5.dim(
|
|
8411
|
+
" Skill resolve returned unexpected format, downloading all skills"
|
|
8412
|
+
)
|
|
8413
|
+
);
|
|
8414
|
+
return { resolved: {}, unresolved: skillUrls };
|
|
8415
|
+
}
|
|
8416
|
+
return body;
|
|
8417
|
+
} catch {
|
|
8418
|
+
console.error(
|
|
8419
|
+
chalk5.dim(" Skill resolve unavailable, downloading all skills")
|
|
8420
|
+
);
|
|
8421
|
+
return { resolved: {}, unresolved: skillUrls };
|
|
8422
|
+
}
|
|
8423
|
+
}
|
|
8424
|
+
|
|
8419
8425
|
// src/lib/domain/yaml-validator.ts
|
|
8420
|
-
import { z as
|
|
8421
|
-
var cliAgentNameSchema =
|
|
8426
|
+
import { z as z26 } from "zod";
|
|
8427
|
+
var cliAgentNameSchema = z26.string().min(3, "Agent name must be at least 3 characters").max(64, "Agent name must be 64 characters or less").regex(
|
|
8422
8428
|
/^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$/,
|
|
8423
8429
|
"Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens"
|
|
8424
8430
|
);
|
|
@@ -8432,7 +8438,7 @@ var cliAgentDefinitionSchema = agentDefinitionSchema.superRefine(
|
|
|
8432
8438
|
resolveSkillRef(skillRef);
|
|
8433
8439
|
} catch (error) {
|
|
8434
8440
|
ctx.addIssue({
|
|
8435
|
-
code:
|
|
8441
|
+
code: z26.ZodIssueCode.custom,
|
|
8436
8442
|
message: error instanceof Error ? error.message : `Invalid skill reference: ${skillRef}`,
|
|
8437
8443
|
path: ["skills", i]
|
|
8438
8444
|
});
|
|
@@ -8442,15 +8448,15 @@ var cliAgentDefinitionSchema = agentDefinitionSchema.superRefine(
|
|
|
8442
8448
|
}
|
|
8443
8449
|
}
|
|
8444
8450
|
);
|
|
8445
|
-
var cliComposeSchema =
|
|
8446
|
-
version:
|
|
8447
|
-
agents:
|
|
8448
|
-
volumes:
|
|
8451
|
+
var cliComposeSchema = z26.object({
|
|
8452
|
+
version: z26.string().min(1, "Missing config.version"),
|
|
8453
|
+
agents: z26.record(cliAgentNameSchema, cliAgentDefinitionSchema),
|
|
8454
|
+
volumes: z26.record(z26.string(), volumeConfigSchema).optional()
|
|
8449
8455
|
}).superRefine((config, ctx) => {
|
|
8450
8456
|
const agentKeys = Object.keys(config.agents);
|
|
8451
8457
|
if (agentKeys.length === 0) {
|
|
8452
8458
|
ctx.addIssue({
|
|
8453
|
-
code:
|
|
8459
|
+
code: z26.ZodIssueCode.custom,
|
|
8454
8460
|
message: "agents must have at least one agent defined",
|
|
8455
8461
|
path: ["agents"]
|
|
8456
8462
|
});
|
|
@@ -8458,7 +8464,7 @@ var cliComposeSchema = z25.object({
|
|
|
8458
8464
|
}
|
|
8459
8465
|
if (agentKeys.length > 1) {
|
|
8460
8466
|
ctx.addIssue({
|
|
8461
|
-
code:
|
|
8467
|
+
code: z26.ZodIssueCode.custom,
|
|
8462
8468
|
message: "Multiple agents not supported yet. Only one agent allowed.",
|
|
8463
8469
|
path: ["agents"]
|
|
8464
8470
|
});
|
|
@@ -8470,7 +8476,7 @@ var cliComposeSchema = z25.object({
|
|
|
8470
8476
|
if (agentVolumes && agentVolumes.length > 0) {
|
|
8471
8477
|
if (!config.volumes) {
|
|
8472
8478
|
ctx.addIssue({
|
|
8473
|
-
code:
|
|
8479
|
+
code: z26.ZodIssueCode.custom,
|
|
8474
8480
|
message: "Agent references volumes but no volumes section defined. Each volume must have explicit name and version.",
|
|
8475
8481
|
path: ["volumes"]
|
|
8476
8482
|
});
|
|
@@ -8480,7 +8486,7 @@ var cliComposeSchema = z25.object({
|
|
|
8480
8486
|
const parts = volDeclaration.split(":");
|
|
8481
8487
|
if (parts.length !== 2) {
|
|
8482
8488
|
ctx.addIssue({
|
|
8483
|
-
code:
|
|
8489
|
+
code: z26.ZodIssueCode.custom,
|
|
8484
8490
|
message: `Invalid volume declaration: ${volDeclaration}. Expected format: volume-key:/mount/path`,
|
|
8485
8491
|
path: ["agents", agentName, "volumes"]
|
|
8486
8492
|
});
|
|
@@ -8489,7 +8495,7 @@ var cliComposeSchema = z25.object({
|
|
|
8489
8495
|
const volumeKey = parts[0].trim();
|
|
8490
8496
|
if (!config.volumes[volumeKey]) {
|
|
8491
8497
|
ctx.addIssue({
|
|
8492
|
-
code:
|
|
8498
|
+
code: z26.ZodIssueCode.custom,
|
|
8493
8499
|
message: `Volume "${volumeKey}" is not defined in volumes section. Each volume must have explicit name and version.`,
|
|
8494
8500
|
path: ["volumes", volumeKey]
|
|
8495
8501
|
});
|
|
@@ -9316,13 +9322,13 @@ function checkLegacyImageFormat(config) {
|
|
|
9316
9322
|
const image = agentConfig.image;
|
|
9317
9323
|
if (image) {
|
|
9318
9324
|
console.log(
|
|
9319
|
-
|
|
9325
|
+
chalk6.yellow(
|
|
9320
9326
|
`\u26A0 Agent "${name}": 'image' field is deprecated and will be ignored. The server resolves the image based on the framework.`
|
|
9321
9327
|
)
|
|
9322
9328
|
);
|
|
9323
9329
|
const warning = getLegacySystemTemplateWarning(image);
|
|
9324
9330
|
if (warning) {
|
|
9325
|
-
console.log(
|
|
9331
|
+
console.log(chalk6.yellow(` ${warning}`));
|
|
9326
9332
|
}
|
|
9327
9333
|
}
|
|
9328
9334
|
}
|
|
@@ -9341,7 +9347,7 @@ async function uploadAssets(agentName, agent, basePath, jsonMode) {
|
|
|
9341
9347
|
);
|
|
9342
9348
|
if (!jsonMode) {
|
|
9343
9349
|
console.log(
|
|
9344
|
-
|
|
9350
|
+
chalk6.green(
|
|
9345
9351
|
`\u2713 Instructions ${result.action === "deduplicated" ? "(unchanged)" : "uploaded"}: ${result.versionId.slice(0, 8)}`
|
|
9346
9352
|
)
|
|
9347
9353
|
);
|
|
@@ -9353,15 +9359,32 @@ async function uploadAssets(agentName, agent, basePath, jsonMode) {
|
|
|
9353
9359
|
if (!jsonMode) {
|
|
9354
9360
|
console.log(`Uploading ${agent.skills.length} skill(s)...`);
|
|
9355
9361
|
}
|
|
9362
|
+
const { resolved, unresolved } = await resolveSkills(agent.skills);
|
|
9356
9363
|
for (const skillUrl of agent.skills) {
|
|
9364
|
+
const skill = resolved[skillUrl];
|
|
9365
|
+
if (skill) {
|
|
9366
|
+
const parsed = parseGitHubTreeUrl2(skillUrl);
|
|
9367
|
+
skillResults.push({
|
|
9368
|
+
name: skill.storageName,
|
|
9369
|
+
versionId: skill.versionHash,
|
|
9370
|
+
action: "resolved",
|
|
9371
|
+
skillName: parsed.skillName,
|
|
9372
|
+
frontmatter: skill.frontmatter
|
|
9373
|
+
});
|
|
9374
|
+
if (!jsonMode) {
|
|
9375
|
+
console.log(chalk6.green(` \u2713 ${parsed.skillName} (cached)`));
|
|
9376
|
+
}
|
|
9377
|
+
}
|
|
9378
|
+
}
|
|
9379
|
+
for (const skillUrl of unresolved) {
|
|
9357
9380
|
if (!jsonMode) {
|
|
9358
|
-
console.log(
|
|
9381
|
+
console.log(chalk6.dim(` Downloading: ${skillUrl}`));
|
|
9359
9382
|
}
|
|
9360
9383
|
const result = await uploadSkill(skillUrl);
|
|
9361
9384
|
skillResults.push(result);
|
|
9362
9385
|
if (!jsonMode) {
|
|
9363
9386
|
console.log(
|
|
9364
|
-
|
|
9387
|
+
chalk6.green(
|
|
9365
9388
|
` \u2713 Skill ${result.action === "deduplicated" ? "(unchanged)" : "uploaded"}: ${result.skillName} (${result.versionId.slice(0, 8)})`
|
|
9366
9389
|
)
|
|
9367
9390
|
);
|
|
@@ -9414,21 +9437,21 @@ async function displayAndConfirmVariables(variables, options) {
|
|
|
9414
9437
|
if (!options.json) {
|
|
9415
9438
|
console.log();
|
|
9416
9439
|
console.log(
|
|
9417
|
-
|
|
9440
|
+
chalk6.bold("Skills require the following environment variables:")
|
|
9418
9441
|
);
|
|
9419
9442
|
console.log();
|
|
9420
9443
|
if (newSecrets.length > 0) {
|
|
9421
|
-
console.log(
|
|
9444
|
+
console.log(chalk6.cyan(" Secrets:"));
|
|
9422
9445
|
for (const [name, skills] of newSecrets) {
|
|
9423
9446
|
const isNew = trulyNewSecrets.includes(name);
|
|
9424
|
-
const newMarker = isNew ?
|
|
9447
|
+
const newMarker = isNew ? chalk6.yellow(" (new)") : "";
|
|
9425
9448
|
console.log(
|
|
9426
9449
|
` ${name.padEnd(24)}${newMarker} <- ${skills.join(", ")}`
|
|
9427
9450
|
);
|
|
9428
9451
|
}
|
|
9429
9452
|
}
|
|
9430
9453
|
if (newVars.length > 0) {
|
|
9431
|
-
console.log(
|
|
9454
|
+
console.log(chalk6.cyan(" Vars:"));
|
|
9432
9455
|
for (const [name, skills] of newVars) {
|
|
9433
9456
|
console.log(` ${name.padEnd(24)} <- ${skills.join(", ")}`);
|
|
9434
9457
|
}
|
|
@@ -9449,7 +9472,7 @@ async function displayAndConfirmVariables(variables, options) {
|
|
|
9449
9472
|
);
|
|
9450
9473
|
if (!confirmed) {
|
|
9451
9474
|
if (!options.json) {
|
|
9452
|
-
console.log(
|
|
9475
|
+
console.log(chalk6.yellow("Compose cancelled"));
|
|
9453
9476
|
}
|
|
9454
9477
|
return false;
|
|
9455
9478
|
}
|
|
@@ -9580,6 +9603,7 @@ function collectAndValidatePermissions(ref, serviceConfig) {
|
|
|
9580
9603
|
`API entry "${api2.base}" in service "${serviceConfig.name}" (ref "${ref}") has no permissions`
|
|
9581
9604
|
);
|
|
9582
9605
|
}
|
|
9606
|
+
const seen = /* @__PURE__ */ new Set();
|
|
9583
9607
|
for (const perm of api2.permissions) {
|
|
9584
9608
|
if (!perm.name) {
|
|
9585
9609
|
throw new Error(
|
|
@@ -9591,9 +9615,9 @@ function collectAndValidatePermissions(ref, serviceConfig) {
|
|
|
9591
9615
|
`Service "${serviceConfig.name}" (ref "${ref}") has a permission named "all", which is a reserved keyword`
|
|
9592
9616
|
);
|
|
9593
9617
|
}
|
|
9594
|
-
if (
|
|
9618
|
+
if (seen.has(perm.name)) {
|
|
9595
9619
|
throw new Error(
|
|
9596
|
-
`Duplicate permission name "${perm.name}" in service "${serviceConfig.name}" (ref "${ref}")`
|
|
9620
|
+
`Duplicate permission name "${perm.name}" in API entry "${api2.base}" of service "${serviceConfig.name}" (ref "${ref}")`
|
|
9597
9621
|
);
|
|
9598
9622
|
}
|
|
9599
9623
|
if (perm.rules.length === 0) {
|
|
@@ -9604,6 +9628,7 @@ function collectAndValidatePermissions(ref, serviceConfig) {
|
|
|
9604
9628
|
for (const rule of perm.rules) {
|
|
9605
9629
|
validateRule(rule, perm.name, serviceConfig.name);
|
|
9606
9630
|
}
|
|
9631
|
+
seen.add(perm.name);
|
|
9607
9632
|
available.add(perm.name);
|
|
9608
9633
|
}
|
|
9609
9634
|
}
|
|
@@ -9700,11 +9725,11 @@ async function checkAndPromptMissingItems(config, options) {
|
|
|
9700
9725
|
if (!options.json) {
|
|
9701
9726
|
console.log();
|
|
9702
9727
|
console.log(
|
|
9703
|
-
|
|
9728
|
+
chalk6.yellow(
|
|
9704
9729
|
"\u26A0 Missing secrets/variables detected. Set them up before running your agent:"
|
|
9705
9730
|
)
|
|
9706
9731
|
);
|
|
9707
|
-
console.log(
|
|
9732
|
+
console.log(chalk6.cyan(` ${setupUrl}`));
|
|
9708
9733
|
console.log();
|
|
9709
9734
|
}
|
|
9710
9735
|
return { missingSecrets, missingVars, setupUrl };
|
|
@@ -9738,15 +9763,15 @@ async function finalizeCompose(config, agent, variables, options) {
|
|
|
9738
9763
|
}
|
|
9739
9764
|
if (!options.json) {
|
|
9740
9765
|
if (response.action === "created") {
|
|
9741
|
-
console.log(
|
|
9766
|
+
console.log(chalk6.green(`\u2713 Compose created: ${displayName}`));
|
|
9742
9767
|
} else {
|
|
9743
|
-
console.log(
|
|
9768
|
+
console.log(chalk6.green(`\u2713 Compose version exists: ${displayName}`));
|
|
9744
9769
|
}
|
|
9745
|
-
console.log(
|
|
9770
|
+
console.log(chalk6.dim(` Version: ${shortVersionId}`));
|
|
9746
9771
|
console.log();
|
|
9747
9772
|
console.log(" Run your agent:");
|
|
9748
9773
|
console.log(
|
|
9749
|
-
|
|
9774
|
+
chalk6.cyan(
|
|
9750
9775
|
` vm0 run ${displayName}:${shortVersionId} --artifact-name <artifact> "your prompt"`
|
|
9751
9776
|
)
|
|
9752
9777
|
);
|
|
@@ -9774,7 +9799,7 @@ async function handleGitHubCompose(url, options) {
|
|
|
9774
9799
|
if (!options.json) {
|
|
9775
9800
|
console.log();
|
|
9776
9801
|
console.log(
|
|
9777
|
-
|
|
9802
|
+
chalk6.yellow(`\u26A0 An agent named "${agentName}" already exists.`)
|
|
9778
9803
|
);
|
|
9779
9804
|
}
|
|
9780
9805
|
if (!isInteractive()) {
|
|
@@ -9795,7 +9820,7 @@ async function handleGitHubCompose(url, options) {
|
|
|
9795
9820
|
);
|
|
9796
9821
|
if (!confirmed) {
|
|
9797
9822
|
if (!options.json) {
|
|
9798
|
-
console.log(
|
|
9823
|
+
console.log(chalk6.yellow("Compose cancelled."));
|
|
9799
9824
|
}
|
|
9800
9825
|
process.exit(0);
|
|
9801
9826
|
}
|
|
@@ -9844,7 +9869,7 @@ var composeCommand = new Command7().name("compose").description("Create or updat
|
|
|
9844
9869
|
const resolvedConfigFile = configFile ?? DEFAULT_CONFIG_FILE;
|
|
9845
9870
|
if (options.porcelain && !options.json) {
|
|
9846
9871
|
console.error(
|
|
9847
|
-
|
|
9872
|
+
chalk6.yellow("\u26A0 --porcelain is deprecated, use --json instead")
|
|
9848
9873
|
);
|
|
9849
9874
|
options.json = true;
|
|
9850
9875
|
}
|
|
@@ -9853,7 +9878,7 @@ var composeCommand = new Command7().name("compose").description("Create or updat
|
|
|
9853
9878
|
options.autoUpdate = false;
|
|
9854
9879
|
}
|
|
9855
9880
|
if (options.autoUpdate !== false) {
|
|
9856
|
-
await startSilentUpgrade("9.
|
|
9881
|
+
await startSilentUpgrade("9.59.0");
|
|
9857
9882
|
}
|
|
9858
9883
|
try {
|
|
9859
9884
|
let result;
|
|
@@ -9897,7 +9922,7 @@ var composeCommand = new Command7().name("compose").description("Create or updat
|
|
|
9897
9922
|
import { Command as Command8, Option as Option2 } from "commander";
|
|
9898
9923
|
|
|
9899
9924
|
// src/commands/run/shared.ts
|
|
9900
|
-
import
|
|
9925
|
+
import chalk10 from "chalk";
|
|
9901
9926
|
import * as fs6 from "fs";
|
|
9902
9927
|
import { config as dotenvConfig } from "dotenv";
|
|
9903
9928
|
|
|
@@ -10185,9 +10210,9 @@ var CodexEventParser = class {
|
|
|
10185
10210
|
if (!item.changes || item.changes.length === 0) {
|
|
10186
10211
|
return null;
|
|
10187
10212
|
}
|
|
10188
|
-
const changes = item.changes.map((
|
|
10189
|
-
const action =
|
|
10190
|
-
return `${action}: ${
|
|
10213
|
+
const changes = item.changes.map((c24) => {
|
|
10214
|
+
const action = c24.kind === "add" ? "Created" : c24.kind === "modify" ? "Modified" : "Deleted";
|
|
10215
|
+
return `${action}: ${c24.path}`;
|
|
10191
10216
|
}).join("\n");
|
|
10192
10217
|
return {
|
|
10193
10218
|
type: "text",
|
|
@@ -10239,10 +10264,10 @@ function parseEvent(rawEvent, framework) {
|
|
|
10239
10264
|
}
|
|
10240
10265
|
|
|
10241
10266
|
// src/lib/events/event-renderer.ts
|
|
10242
|
-
import
|
|
10267
|
+
import chalk8 from "chalk";
|
|
10243
10268
|
|
|
10244
10269
|
// src/lib/events/tool-formatters.ts
|
|
10245
|
-
import
|
|
10270
|
+
import chalk7 from "chalk";
|
|
10246
10271
|
function pluralize(count, singular, plural) {
|
|
10247
10272
|
return count === 1 ? singular : plural;
|
|
10248
10273
|
}
|
|
@@ -10256,15 +10281,15 @@ function formatToolHeader(data) {
|
|
|
10256
10281
|
return [headline];
|
|
10257
10282
|
}
|
|
10258
10283
|
var toolHeadlineFormatters = {
|
|
10259
|
-
Read: (input) => `Read${
|
|
10260
|
-
Edit: (input) => `Edit${
|
|
10261
|
-
Write: (input) => `Write${
|
|
10262
|
-
Bash: (input) => `Bash${
|
|
10263
|
-
Glob: (input) => `Glob${
|
|
10264
|
-
Grep: (input) => `Grep${
|
|
10265
|
-
Task: (input) => `Task${
|
|
10266
|
-
WebFetch: (input) => `WebFetch${
|
|
10267
|
-
WebSearch: (input) => `WebSearch${
|
|
10284
|
+
Read: (input) => `Read${chalk7.dim(`(${String(input.file_path || "")})`)}`,
|
|
10285
|
+
Edit: (input) => `Edit${chalk7.dim(`(${String(input.file_path || "")})`)}`,
|
|
10286
|
+
Write: (input) => `Write${chalk7.dim(`(${String(input.file_path || "")})`)}`,
|
|
10287
|
+
Bash: (input) => `Bash${chalk7.dim(`(${truncate(String(input.command || ""), 60)})`)}`,
|
|
10288
|
+
Glob: (input) => `Glob${chalk7.dim(`(${String(input.pattern || "")})`)}`,
|
|
10289
|
+
Grep: (input) => `Grep${chalk7.dim(`(${String(input.pattern || "")})`)}`,
|
|
10290
|
+
Task: (input) => `Task${chalk7.dim(`(${truncate(String(input.description || ""), 60)})`)}`,
|
|
10291
|
+
WebFetch: (input) => `WebFetch${chalk7.dim(`(${truncate(String(input.url || ""), 60)})`)}`,
|
|
10292
|
+
WebSearch: (input) => `WebSearch${chalk7.dim(`(${truncate(String(input.query || ""), 60)})`)}`,
|
|
10268
10293
|
TodoWrite: () => "TodoWrite"
|
|
10269
10294
|
};
|
|
10270
10295
|
function getToolHeadline(tool, input) {
|
|
@@ -10297,7 +10322,7 @@ function formatToolResult(toolUse, result, verbose) {
|
|
|
10297
10322
|
}
|
|
10298
10323
|
if (isError) {
|
|
10299
10324
|
const errorMsg = resultText ? truncate(resultText, 80) : "Error";
|
|
10300
|
-
lines.push(`\u2514 \u2717 ${
|
|
10325
|
+
lines.push(`\u2514 \u2717 ${chalk7.dim(errorMsg)}`);
|
|
10301
10326
|
return lines;
|
|
10302
10327
|
}
|
|
10303
10328
|
if (resultText) {
|
|
@@ -10305,23 +10330,23 @@ function formatToolResult(toolUse, result, verbose) {
|
|
|
10305
10330
|
if (verbose) {
|
|
10306
10331
|
for (let i = 0; i < resultLines.length; i++) {
|
|
10307
10332
|
const prefix = i === 0 ? "\u2514 " : " ";
|
|
10308
|
-
lines.push(`${prefix}${
|
|
10333
|
+
lines.push(`${prefix}${chalk7.dim(resultLines[i])}`);
|
|
10309
10334
|
}
|
|
10310
10335
|
} else if (resultLines.length > 0) {
|
|
10311
10336
|
const previewCount = Math.min(3, resultLines.length);
|
|
10312
10337
|
for (let i = 0; i < previewCount; i++) {
|
|
10313
10338
|
const prefix = i === 0 ? "\u2514 " : " ";
|
|
10314
|
-
lines.push(`${prefix}${
|
|
10339
|
+
lines.push(`${prefix}${chalk7.dim(resultLines[i])}`);
|
|
10315
10340
|
}
|
|
10316
10341
|
const remaining = resultLines.length - previewCount;
|
|
10317
10342
|
if (remaining > 0) {
|
|
10318
10343
|
lines.push(
|
|
10319
|
-
` ${
|
|
10344
|
+
` ${chalk7.dim(`\u2026 +${remaining} ${pluralize(remaining, "line", "lines")} (vm0 logs <runId> to see all)`)}`
|
|
10320
10345
|
);
|
|
10321
10346
|
}
|
|
10322
10347
|
}
|
|
10323
10348
|
} else {
|
|
10324
|
-
lines.push(`\u2514 \u2713 ${
|
|
10349
|
+
lines.push(`\u2514 \u2713 ${chalk7.dim("Done")}`);
|
|
10325
10350
|
}
|
|
10326
10351
|
return lines;
|
|
10327
10352
|
}
|
|
@@ -10339,24 +10364,24 @@ function formatReadContent(resultText, verbose) {
|
|
|
10339
10364
|
const displayLines = contentLines.length > 0 ? contentLines : rawLines.filter((line) => line.trim().length > 0);
|
|
10340
10365
|
const totalLines = displayLines.length;
|
|
10341
10366
|
if (totalLines === 0) {
|
|
10342
|
-
lines.push(`\u2514 \u2713 ${
|
|
10367
|
+
lines.push(`\u2514 \u2713 ${chalk7.dim("(empty)")}`);
|
|
10343
10368
|
return lines;
|
|
10344
10369
|
}
|
|
10345
10370
|
if (verbose) {
|
|
10346
10371
|
for (let i = 0; i < displayLines.length; i++) {
|
|
10347
10372
|
const prefix = i === 0 ? "\u2514 " : " ";
|
|
10348
|
-
lines.push(`${prefix}${
|
|
10373
|
+
lines.push(`${prefix}${chalk7.dim(displayLines[i] ?? "")}`);
|
|
10349
10374
|
}
|
|
10350
10375
|
} else {
|
|
10351
10376
|
const previewCount = Math.min(3, totalLines);
|
|
10352
10377
|
for (let i = 0; i < previewCount; i++) {
|
|
10353
10378
|
const prefix = i === 0 ? "\u2514 " : " ";
|
|
10354
|
-
lines.push(`${prefix}${
|
|
10379
|
+
lines.push(`${prefix}${chalk7.dim(displayLines[i] ?? "")}`);
|
|
10355
10380
|
}
|
|
10356
10381
|
const remaining = totalLines - previewCount;
|
|
10357
10382
|
if (remaining > 0) {
|
|
10358
10383
|
lines.push(
|
|
10359
|
-
` ${
|
|
10384
|
+
` ${chalk7.dim(`\u2026 +${remaining} ${pluralize(remaining, "line", "lines")} (vm0 logs <runId> to see all)`)}`
|
|
10360
10385
|
);
|
|
10361
10386
|
}
|
|
10362
10387
|
}
|
|
@@ -10370,18 +10395,18 @@ function formatWritePreview(input, verbose) {
|
|
|
10370
10395
|
if (verbose) {
|
|
10371
10396
|
for (let i = 0; i < contentLines.length; i++) {
|
|
10372
10397
|
const prefix = i === 0 ? "\u23BF " : " ";
|
|
10373
|
-
lines.push(`${prefix}${
|
|
10398
|
+
lines.push(`${prefix}${chalk7.dim(contentLines[i] ?? "")}`);
|
|
10374
10399
|
}
|
|
10375
10400
|
} else {
|
|
10376
10401
|
const previewCount = Math.min(3, totalLines);
|
|
10377
10402
|
for (let i = 0; i < previewCount; i++) {
|
|
10378
10403
|
const prefix = i === 0 ? "\u23BF " : " ";
|
|
10379
|
-
lines.push(`${prefix}${
|
|
10404
|
+
lines.push(`${prefix}${chalk7.dim(contentLines[i] ?? "")}`);
|
|
10380
10405
|
}
|
|
10381
10406
|
const remaining = totalLines - previewCount;
|
|
10382
10407
|
if (remaining > 0) {
|
|
10383
10408
|
lines.push(
|
|
10384
|
-
` ${
|
|
10409
|
+
` ${chalk7.dim(`\u2026 +${remaining} ${pluralize(remaining, "line", "lines")} (vm0 logs <runId> to see all)`)}`
|
|
10385
10410
|
);
|
|
10386
10411
|
}
|
|
10387
10412
|
}
|
|
@@ -10396,34 +10421,34 @@ function formatEditDiff(input, verbose) {
|
|
|
10396
10421
|
const removed = oldLines.length;
|
|
10397
10422
|
const added = newLines.length;
|
|
10398
10423
|
const summary = `Added ${added} ${pluralize(added, "line", "lines")}, removed ${removed} ${pluralize(removed, "line", "lines")}`;
|
|
10399
|
-
lines.push(`\u23BF ${
|
|
10424
|
+
lines.push(`\u23BF ${chalk7.dim(summary)}`);
|
|
10400
10425
|
if (verbose) {
|
|
10401
10426
|
for (const line of oldLines) {
|
|
10402
|
-
lines.push(` - ${
|
|
10427
|
+
lines.push(` - ${chalk7.dim(line)}`);
|
|
10403
10428
|
}
|
|
10404
10429
|
for (const line of newLines) {
|
|
10405
|
-
lines.push(` + ${
|
|
10430
|
+
lines.push(` + ${chalk7.dim(line)}`);
|
|
10406
10431
|
}
|
|
10407
10432
|
} else {
|
|
10408
10433
|
const previewLimit = 3;
|
|
10409
10434
|
const showOld = Math.min(previewLimit, oldLines.length);
|
|
10410
10435
|
const showNew = Math.min(previewLimit, newLines.length);
|
|
10411
10436
|
for (let i = 0; i < showOld; i++) {
|
|
10412
|
-
lines.push(` - ${
|
|
10437
|
+
lines.push(` - ${chalk7.dim(truncate(oldLines[i] ?? "", 60))}`);
|
|
10413
10438
|
}
|
|
10414
10439
|
const remainingOld = oldLines.length - previewLimit;
|
|
10415
10440
|
if (remainingOld > 0) {
|
|
10416
10441
|
lines.push(
|
|
10417
|
-
` ${
|
|
10442
|
+
` ${chalk7.dim(`\u2026 +${remainingOld} ${pluralize(remainingOld, "line", "lines")} (vm0 logs <runId> to see all)`)}`
|
|
10418
10443
|
);
|
|
10419
10444
|
}
|
|
10420
10445
|
for (let i = 0; i < showNew; i++) {
|
|
10421
|
-
lines.push(` + ${
|
|
10446
|
+
lines.push(` + ${chalk7.dim(truncate(newLines[i] ?? "", 60))}`);
|
|
10422
10447
|
}
|
|
10423
10448
|
const remainingNew = newLines.length - previewLimit;
|
|
10424
10449
|
if (remainingNew > 0) {
|
|
10425
10450
|
lines.push(
|
|
10426
|
-
` ${
|
|
10451
|
+
` ${chalk7.dim(`\u2026 +${remainingNew} ${pluralize(remainingNew, "line", "lines")} (vm0 logs <runId> to see all)`)}`
|
|
10427
10452
|
);
|
|
10428
10453
|
}
|
|
10429
10454
|
}
|
|
@@ -10461,12 +10486,12 @@ function getTodoStatusIcon(status) {
|
|
|
10461
10486
|
function formatTodoContent(content, status) {
|
|
10462
10487
|
switch (status) {
|
|
10463
10488
|
case "completed":
|
|
10464
|
-
return
|
|
10489
|
+
return chalk7.dim.strikethrough(content);
|
|
10465
10490
|
case "in_progress":
|
|
10466
10491
|
return content;
|
|
10467
10492
|
case "pending":
|
|
10468
10493
|
default:
|
|
10469
|
-
return
|
|
10494
|
+
return chalk7.dim(content);
|
|
10470
10495
|
}
|
|
10471
10496
|
}
|
|
10472
10497
|
|
|
@@ -10484,12 +10509,12 @@ var EventRenderer = class _EventRenderer {
|
|
|
10484
10509
|
* Called immediately after run is created, before polling events
|
|
10485
10510
|
*/
|
|
10486
10511
|
static renderRunStarted(info) {
|
|
10487
|
-
console.log(
|
|
10488
|
-
console.log(` Run ID: ${
|
|
10512
|
+
console.log(chalk8.bold("\u25B6 Run started"));
|
|
10513
|
+
console.log(` Run ID: ${chalk8.dim(info.runId)}`);
|
|
10489
10514
|
if (info.sandboxId) {
|
|
10490
|
-
console.log(` Sandbox: ${
|
|
10515
|
+
console.log(` Sandbox: ${chalk8.dim(info.sandboxId)}`);
|
|
10491
10516
|
}
|
|
10492
|
-
console.log(
|
|
10517
|
+
console.log(chalk8.dim(` (use "vm0 logs ${info.runId}" to view logs)`));
|
|
10493
10518
|
console.log();
|
|
10494
10519
|
}
|
|
10495
10520
|
/**
|
|
@@ -10527,16 +10552,16 @@ var EventRenderer = class _EventRenderer {
|
|
|
10527
10552
|
*/
|
|
10528
10553
|
static renderRunCompleted(result) {
|
|
10529
10554
|
console.log("");
|
|
10530
|
-
console.log(
|
|
10555
|
+
console.log(chalk8.green("\u2713 Run completed successfully"));
|
|
10531
10556
|
if (result) {
|
|
10532
|
-
console.log(` Checkpoint: ${
|
|
10533
|
-
console.log(` Session: ${
|
|
10534
|
-
console.log(` Conversation: ${
|
|
10557
|
+
console.log(` Checkpoint: ${chalk8.dim(result.checkpointId)}`);
|
|
10558
|
+
console.log(` Session: ${chalk8.dim(result.agentSessionId)}`);
|
|
10559
|
+
console.log(` Conversation: ${chalk8.dim(result.conversationId)}`);
|
|
10535
10560
|
if (result.artifact && Object.keys(result.artifact).length > 0) {
|
|
10536
10561
|
console.log(` Artifact:`);
|
|
10537
10562
|
for (const [name, version] of Object.entries(result.artifact)) {
|
|
10538
10563
|
console.log(
|
|
10539
|
-
` ${name}: ${
|
|
10564
|
+
` ${name}: ${chalk8.dim(_EventRenderer.formatVersion(version))}`
|
|
10540
10565
|
);
|
|
10541
10566
|
}
|
|
10542
10567
|
}
|
|
@@ -10544,7 +10569,7 @@ var EventRenderer = class _EventRenderer {
|
|
|
10544
10569
|
console.log(` Volumes:`);
|
|
10545
10570
|
for (const [name, version] of Object.entries(result.volumes)) {
|
|
10546
10571
|
console.log(
|
|
10547
|
-
` ${name}: ${
|
|
10572
|
+
` ${name}: ${chalk8.dim(_EventRenderer.formatVersion(version))}`
|
|
10548
10573
|
);
|
|
10549
10574
|
}
|
|
10550
10575
|
}
|
|
@@ -10556,10 +10581,10 @@ var EventRenderer = class _EventRenderer {
|
|
|
10556
10581
|
*/
|
|
10557
10582
|
static renderRunFailed(error, runId) {
|
|
10558
10583
|
console.error("");
|
|
10559
|
-
console.error(
|
|
10560
|
-
console.error(` Error: ${
|
|
10584
|
+
console.error(chalk8.red("\u2717 Run failed"));
|
|
10585
|
+
console.error(` Error: ${chalk8.red(error || "Unknown error")}`);
|
|
10561
10586
|
console.error(
|
|
10562
|
-
|
|
10587
|
+
chalk8.dim(` (use "vm0 logs ${runId} --system" to view system logs)`)
|
|
10563
10588
|
);
|
|
10564
10589
|
}
|
|
10565
10590
|
/**
|
|
@@ -10643,13 +10668,13 @@ var EventRenderer = class _EventRenderer {
|
|
|
10643
10668
|
const frameworkStr = String(event.data.framework || "claude-code");
|
|
10644
10669
|
const displayName = isSupportedFramework(frameworkStr) ? getFrameworkDisplayName(frameworkStr) : frameworkStr;
|
|
10645
10670
|
this.frameworkDisplayName = displayName;
|
|
10646
|
-
console.log(prefix +
|
|
10647
|
-
console.log(` Session: ${
|
|
10671
|
+
console.log(prefix + chalk8.bold(`\u25B7 ${displayName} Started`));
|
|
10672
|
+
console.log(` Session: ${chalk8.dim(String(event.data.sessionId || ""))}`);
|
|
10648
10673
|
if (event.data.model) {
|
|
10649
|
-
console.log(` Model: ${
|
|
10674
|
+
console.log(` Model: ${chalk8.dim(String(event.data.model))}`);
|
|
10650
10675
|
}
|
|
10651
10676
|
console.log(
|
|
10652
|
-
` Tools: ${
|
|
10677
|
+
` Tools: ${chalk8.dim(
|
|
10653
10678
|
Array.isArray(event.data.tools) ? event.data.tools.join(", ") : String(event.data.tools || "")
|
|
10654
10679
|
)}`
|
|
10655
10680
|
);
|
|
@@ -10666,16 +10691,16 @@ var EventRenderer = class _EventRenderer {
|
|
|
10666
10691
|
const success = Boolean(event.data.success);
|
|
10667
10692
|
if (success) {
|
|
10668
10693
|
console.log(
|
|
10669
|
-
prefix +
|
|
10694
|
+
prefix + chalk8.bold(`\u25C6 ${this.frameworkDisplayName} Completed`)
|
|
10670
10695
|
);
|
|
10671
10696
|
} else {
|
|
10672
|
-
console.log(prefix +
|
|
10697
|
+
console.log(prefix + chalk8.bold(`\u25C6 ${this.frameworkDisplayName} Failed`));
|
|
10673
10698
|
}
|
|
10674
10699
|
const durationMs = Number(event.data.durationMs || 0);
|
|
10675
10700
|
const durationSec = (durationMs / 1e3).toFixed(1);
|
|
10676
|
-
console.log(` Duration: ${
|
|
10701
|
+
console.log(` Duration: ${chalk8.dim(durationSec + "s")}`);
|
|
10677
10702
|
const numTurns = Number(event.data.numTurns || 0);
|
|
10678
|
-
console.log(` Turns: ${
|
|
10703
|
+
console.log(` Turns: ${chalk8.dim(String(numTurns))}`);
|
|
10679
10704
|
const usage = event.data.usage;
|
|
10680
10705
|
if (usage && typeof usage === "object") {
|
|
10681
10706
|
const inputTokens = Number(usage.input_tokens || 0);
|
|
@@ -10687,7 +10712,7 @@ var EventRenderer = class _EventRenderer {
|
|
|
10687
10712
|
return String(count);
|
|
10688
10713
|
};
|
|
10689
10714
|
console.log(
|
|
10690
|
-
` Tokens: ${
|
|
10715
|
+
` Tokens: ${chalk8.dim(
|
|
10691
10716
|
`input=${formatTokens(inputTokens)} output=${formatTokens(outputTokens)}`
|
|
10692
10717
|
)}`
|
|
10693
10718
|
);
|
|
@@ -10706,7 +10731,7 @@ var EventRenderer = class _EventRenderer {
|
|
|
10706
10731
|
};
|
|
10707
10732
|
|
|
10708
10733
|
// src/lib/events/codex-event-renderer.ts
|
|
10709
|
-
import
|
|
10734
|
+
import chalk9 from "chalk";
|
|
10710
10735
|
var CodexEventRenderer = class {
|
|
10711
10736
|
/**
|
|
10712
10737
|
* Check if an event is a Codex event
|
|
@@ -10753,13 +10778,13 @@ var CodexEventRenderer = class {
|
|
|
10753
10778
|
const cached = event.usage.cached_input_tokens || 0;
|
|
10754
10779
|
const cachedStr = cached ? ` (${cached} cached)` : "";
|
|
10755
10780
|
console.log(
|
|
10756
|
-
"[turn.completed]" +
|
|
10781
|
+
"[turn.completed]" + chalk9.dim(` ${input} in / ${output} out${cachedStr}`)
|
|
10757
10782
|
);
|
|
10758
10783
|
}
|
|
10759
10784
|
}
|
|
10760
10785
|
static renderTurnFailed(event) {
|
|
10761
10786
|
console.log(
|
|
10762
|
-
|
|
10787
|
+
chalk9.red("[turn.failed]") + (event.error ? ` ${event.error}` : "")
|
|
10763
10788
|
);
|
|
10764
10789
|
}
|
|
10765
10790
|
static renderItem(event) {
|
|
@@ -10788,25 +10813,25 @@ var CodexEventRenderer = class {
|
|
|
10788
10813
|
if (output) {
|
|
10789
10814
|
const lines = output.split("\n").filter((l) => l.trim());
|
|
10790
10815
|
const preview = lines.slice(0, 3).join("\n ");
|
|
10791
|
-
const more = lines.length > 3 ?
|
|
10816
|
+
const more = lines.length > 3 ? chalk9.dim(` ... (${lines.length - 3} more lines)`) : "";
|
|
10792
10817
|
console.log(
|
|
10793
|
-
"[output]" + (exitCode !== 0 ?
|
|
10818
|
+
"[output]" + (exitCode !== 0 ? chalk9.red(` exit=${exitCode}`) : "")
|
|
10794
10819
|
);
|
|
10795
10820
|
if (preview) {
|
|
10796
10821
|
console.log(" " + preview + more);
|
|
10797
10822
|
}
|
|
10798
10823
|
} else if (exitCode !== 0) {
|
|
10799
|
-
console.log(
|
|
10824
|
+
console.log(chalk9.red("[output]") + chalk9.red(` exit=${exitCode}`));
|
|
10800
10825
|
}
|
|
10801
10826
|
}
|
|
10802
10827
|
}
|
|
10803
10828
|
static renderFileChange(item) {
|
|
10804
10829
|
if (item.changes && item.changes.length > 0) {
|
|
10805
|
-
const summary = item.changes.map((
|
|
10806
|
-
const icon =
|
|
10807
|
-
return `${icon}${
|
|
10830
|
+
const summary = item.changes.map((c24) => {
|
|
10831
|
+
const icon = c24.kind === "add" ? "+" : c24.kind === "delete" ? "-" : "~";
|
|
10832
|
+
return `${icon}${c24.path}`;
|
|
10808
10833
|
}).join(", ");
|
|
10809
|
-
console.log(
|
|
10834
|
+
console.log(chalk9.green("[files]") + ` ${summary}`);
|
|
10810
10835
|
}
|
|
10811
10836
|
}
|
|
10812
10837
|
static renderFileOperation(item, eventType) {
|
|
@@ -10817,7 +10842,7 @@ var CodexEventRenderer = class {
|
|
|
10817
10842
|
}
|
|
10818
10843
|
static renderError(event) {
|
|
10819
10844
|
console.log(
|
|
10820
|
-
|
|
10845
|
+
chalk9.red("[error]") + ` ${event.message || event.error || "Unknown error"}`
|
|
10821
10846
|
);
|
|
10822
10847
|
}
|
|
10823
10848
|
};
|
|
@@ -10904,10 +10929,10 @@ function parseIdentifier(identifier) {
|
|
|
10904
10929
|
}
|
|
10905
10930
|
function renderRunCreated(response) {
|
|
10906
10931
|
if (response.status === "queued") {
|
|
10907
|
-
console.log(
|
|
10908
|
-
console.log(` Run ID: ${
|
|
10932
|
+
console.log(chalk10.yellow("\u26A0 Run queued \u2014 concurrency limit reached"));
|
|
10933
|
+
console.log(` Run ID: ${chalk10.dim(response.runId)}`);
|
|
10909
10934
|
console.log(
|
|
10910
|
-
|
|
10935
|
+
chalk10.dim(" Will start automatically when a slot is available")
|
|
10911
10936
|
);
|
|
10912
10937
|
console.log();
|
|
10913
10938
|
} else {
|
|
@@ -10955,9 +10980,9 @@ async function pollEvents(runId, options) {
|
|
|
10955
10980
|
result = { succeeded: false, runId };
|
|
10956
10981
|
} else if (runStatus === "timeout") {
|
|
10957
10982
|
complete = true;
|
|
10958
|
-
console.error(
|
|
10983
|
+
console.error(chalk10.red("\n\u2717 Run timed out"));
|
|
10959
10984
|
console.error(
|
|
10960
|
-
|
|
10985
|
+
chalk10.dim(` (use "vm0 logs ${runId} --system" to view system logs)`)
|
|
10961
10986
|
);
|
|
10962
10987
|
result = { succeeded: false, runId };
|
|
10963
10988
|
}
|
|
@@ -10971,11 +10996,11 @@ function showNextSteps(result) {
|
|
|
10971
10996
|
const { runId, sessionId, checkpointId } = result;
|
|
10972
10997
|
console.log();
|
|
10973
10998
|
console.log(" View agent logs:");
|
|
10974
|
-
console.log(
|
|
10999
|
+
console.log(chalk10.cyan(` vm0 logs ${runId}`));
|
|
10975
11000
|
if (sessionId) {
|
|
10976
11001
|
console.log(" Continue with session (latest conversation and artifact):");
|
|
10977
11002
|
console.log(
|
|
10978
|
-
|
|
11003
|
+
chalk10.cyan(` vm0 run continue ${sessionId} "your next prompt"`)
|
|
10979
11004
|
);
|
|
10980
11005
|
}
|
|
10981
11006
|
if (checkpointId) {
|
|
@@ -10983,7 +11008,7 @@ function showNextSteps(result) {
|
|
|
10983
11008
|
" Resume from checkpoint (snapshotted conversation and artifact):"
|
|
10984
11009
|
);
|
|
10985
11010
|
console.log(
|
|
10986
|
-
|
|
11011
|
+
chalk10.cyan(` vm0 run resume ${checkpointId} "your next prompt"`)
|
|
10987
11012
|
);
|
|
10988
11013
|
}
|
|
10989
11014
|
}
|
|
@@ -11026,7 +11051,7 @@ var mainRunCommand = new Command8().name("run").description("Run an agent").argu
|
|
|
11026
11051
|
withErrorHandler(
|
|
11027
11052
|
async (identifier, prompt, options) => {
|
|
11028
11053
|
if (options.autoUpdate !== false) {
|
|
11029
|
-
await startSilentUpgrade("9.
|
|
11054
|
+
await startSilentUpgrade("9.59.0");
|
|
11030
11055
|
}
|
|
11031
11056
|
const { org, name, version } = parseIdentifier(identifier);
|
|
11032
11057
|
if (org && !options.experimentalSharedAgent) {
|
|
@@ -11245,7 +11270,7 @@ var continueCommand = new Command10().name("continue").description(
|
|
|
11245
11270
|
|
|
11246
11271
|
// src/commands/run/list.ts
|
|
11247
11272
|
import { Command as Command11 } from "commander";
|
|
11248
|
-
import
|
|
11273
|
+
import chalk11 from "chalk";
|
|
11249
11274
|
|
|
11250
11275
|
// src/lib/utils/time-parser.ts
|
|
11251
11276
|
function parseTime(timeStr) {
|
|
@@ -11298,16 +11323,16 @@ function formatRunStatus(status, width) {
|
|
|
11298
11323
|
const paddedStatus = width ? status.padEnd(width) : status;
|
|
11299
11324
|
switch (status) {
|
|
11300
11325
|
case "queued":
|
|
11301
|
-
return
|
|
11326
|
+
return chalk11.blue(paddedStatus);
|
|
11302
11327
|
case "running":
|
|
11303
|
-
return
|
|
11328
|
+
return chalk11.green(paddedStatus);
|
|
11304
11329
|
case "pending":
|
|
11305
|
-
return
|
|
11330
|
+
return chalk11.yellow(paddedStatus);
|
|
11306
11331
|
case "completed":
|
|
11307
|
-
return
|
|
11332
|
+
return chalk11.dim(paddedStatus);
|
|
11308
11333
|
case "failed":
|
|
11309
11334
|
case "timeout":
|
|
11310
|
-
return
|
|
11335
|
+
return chalk11.red(paddedStatus);
|
|
11311
11336
|
default:
|
|
11312
11337
|
return paddedStatus;
|
|
11313
11338
|
}
|
|
@@ -11358,7 +11383,7 @@ function displayRuns(runs) {
|
|
|
11358
11383
|
"STATUS".padEnd(statusWidth),
|
|
11359
11384
|
"CREATED"
|
|
11360
11385
|
].join(" ");
|
|
11361
|
-
console.log(
|
|
11386
|
+
console.log(chalk11.dim(header));
|
|
11362
11387
|
for (const run of runs) {
|
|
11363
11388
|
const row = [
|
|
11364
11389
|
run.id.padEnd(UUID_LENGTH),
|
|
@@ -11371,10 +11396,10 @@ function displayRuns(runs) {
|
|
|
11371
11396
|
}
|
|
11372
11397
|
function displayEmptyState(hasFilters) {
|
|
11373
11398
|
if (hasFilters) {
|
|
11374
|
-
console.log(
|
|
11399
|
+
console.log(chalk11.dim("No runs found matching filters"));
|
|
11375
11400
|
} else {
|
|
11376
|
-
console.log(
|
|
11377
|
-
console.log(
|
|
11401
|
+
console.log(chalk11.dim("No active runs"));
|
|
11402
|
+
console.log(chalk11.dim(' Run: vm0 run <agent> "<prompt>"'));
|
|
11378
11403
|
}
|
|
11379
11404
|
}
|
|
11380
11405
|
var listCommand = new Command11().name("list").alias("ls").description("List runs").option(
|
|
@@ -11411,11 +11436,11 @@ var listCommand = new Command11().name("list").alias("ls").description("List run
|
|
|
11411
11436
|
|
|
11412
11437
|
// src/commands/run/kill.ts
|
|
11413
11438
|
import { Command as Command12 } from "commander";
|
|
11414
|
-
import
|
|
11439
|
+
import chalk12 from "chalk";
|
|
11415
11440
|
var killCommand = new Command12().name("kill").description("Kill (cancel) a pending or running run").argument("<run-id>", "Run ID to kill").action(
|
|
11416
11441
|
withErrorHandler(async (runId) => {
|
|
11417
11442
|
await cancelRun(runId);
|
|
11418
|
-
console.log(
|
|
11443
|
+
console.log(chalk12.green(`\u2713 Run ${runId} cancelled`));
|
|
11419
11444
|
})
|
|
11420
11445
|
);
|
|
11421
11446
|
|
|
@@ -11431,7 +11456,7 @@ import { Command as Command19 } from "commander";
|
|
|
11431
11456
|
|
|
11432
11457
|
// src/commands/volume/init.ts
|
|
11433
11458
|
import { Command as Command13 } from "commander";
|
|
11434
|
-
import
|
|
11459
|
+
import chalk13 from "chalk";
|
|
11435
11460
|
import path7 from "path";
|
|
11436
11461
|
|
|
11437
11462
|
// src/lib/storage/storage-utils.ts
|
|
@@ -11489,10 +11514,10 @@ var initCommand = new Command13().name("init").description("Initialize a volume
|
|
|
11489
11514
|
const existingConfig = await readStorageConfig(cwd);
|
|
11490
11515
|
if (existingConfig) {
|
|
11491
11516
|
console.log(
|
|
11492
|
-
|
|
11517
|
+
chalk13.yellow(`Volume already initialized: ${existingConfig.name}`)
|
|
11493
11518
|
);
|
|
11494
11519
|
console.log(
|
|
11495
|
-
|
|
11520
|
+
chalk13.dim(`Config file: ${path7.join(cwd, ".vm0", "storage.yaml")}`)
|
|
11496
11521
|
);
|
|
11497
11522
|
return;
|
|
11498
11523
|
}
|
|
@@ -11516,7 +11541,7 @@ var initCommand = new Command13().name("init").description("Initialize a volume
|
|
|
11516
11541
|
}
|
|
11517
11542
|
);
|
|
11518
11543
|
if (name === void 0) {
|
|
11519
|
-
console.log(
|
|
11544
|
+
console.log(chalk13.dim("Cancelled"));
|
|
11520
11545
|
return;
|
|
11521
11546
|
}
|
|
11522
11547
|
volumeName = name;
|
|
@@ -11529,9 +11554,9 @@ var initCommand = new Command13().name("init").description("Initialize a volume
|
|
|
11529
11554
|
});
|
|
11530
11555
|
}
|
|
11531
11556
|
await writeStorageConfig(volumeName, cwd);
|
|
11532
|
-
console.log(
|
|
11557
|
+
console.log(chalk13.green(`\u2713 Initialized volume: ${volumeName}`));
|
|
11533
11558
|
console.log(
|
|
11534
|
-
|
|
11559
|
+
chalk13.dim(
|
|
11535
11560
|
` Config saved to ${path7.join(cwd, ".vm0", "storage.yaml")}`
|
|
11536
11561
|
)
|
|
11537
11562
|
);
|
|
@@ -11540,7 +11565,7 @@ var initCommand = new Command13().name("init").description("Initialize a volume
|
|
|
11540
11565
|
|
|
11541
11566
|
// src/commands/volume/push.ts
|
|
11542
11567
|
import { Command as Command14 } from "commander";
|
|
11543
|
-
import
|
|
11568
|
+
import chalk14 from "chalk";
|
|
11544
11569
|
var pushCommand = new Command14().name("push").description("Push local files to cloud volume").option(
|
|
11545
11570
|
"-f, --force",
|
|
11546
11571
|
"Force upload even if content unchanged (recreate archive)"
|
|
@@ -11556,41 +11581,41 @@ var pushCommand = new Command14().name("push").description("Push local files to
|
|
|
11556
11581
|
console.log(`Pushing volume: ${config.name}`);
|
|
11557
11582
|
const result = await directUpload(config.name, "volume", cwd, {
|
|
11558
11583
|
onProgress: (message) => {
|
|
11559
|
-
console.log(
|
|
11584
|
+
console.log(chalk14.dim(message));
|
|
11560
11585
|
},
|
|
11561
11586
|
force: options.force
|
|
11562
11587
|
});
|
|
11563
11588
|
const shortVersion = result.versionId.slice(0, 8);
|
|
11564
11589
|
if (result.empty) {
|
|
11565
|
-
console.log(
|
|
11590
|
+
console.log(chalk14.dim("No files found (empty volume)"));
|
|
11566
11591
|
} else if (result.deduplicated) {
|
|
11567
|
-
console.log(
|
|
11592
|
+
console.log(chalk14.green("\u2713 Content unchanged (deduplicated)"));
|
|
11568
11593
|
} else {
|
|
11569
|
-
console.log(
|
|
11594
|
+
console.log(chalk14.green("\u2713 Upload complete"));
|
|
11570
11595
|
}
|
|
11571
|
-
console.log(
|
|
11572
|
-
console.log(
|
|
11573
|
-
console.log(
|
|
11596
|
+
console.log(chalk14.dim(` Version: ${shortVersion}`));
|
|
11597
|
+
console.log(chalk14.dim(` Files: ${result.fileCount.toLocaleString()}`));
|
|
11598
|
+
console.log(chalk14.dim(` Size: ${formatBytes(result.size)}`));
|
|
11574
11599
|
})
|
|
11575
11600
|
);
|
|
11576
11601
|
|
|
11577
11602
|
// src/commands/volume/pull.ts
|
|
11578
11603
|
import { Command as Command15 } from "commander";
|
|
11579
|
-
import
|
|
11604
|
+
import chalk16 from "chalk";
|
|
11580
11605
|
import path8 from "path";
|
|
11581
11606
|
import * as fs7 from "fs";
|
|
11582
11607
|
import * as os5 from "os";
|
|
11583
11608
|
import * as tar3 from "tar";
|
|
11584
11609
|
|
|
11585
11610
|
// src/lib/storage/pull-utils.ts
|
|
11586
|
-
import
|
|
11611
|
+
import chalk15 from "chalk";
|
|
11587
11612
|
async function handleEmptyStorageResponse(cwd) {
|
|
11588
|
-
console.log(
|
|
11613
|
+
console.log(chalk15.dim("Syncing local files..."));
|
|
11589
11614
|
const removedCount = await removeExtraFiles(cwd, /* @__PURE__ */ new Set());
|
|
11590
11615
|
if (removedCount > 0) {
|
|
11591
|
-
console.log(
|
|
11616
|
+
console.log(chalk15.green(`\u2713 Removed ${removedCount} files not in remote`));
|
|
11592
11617
|
}
|
|
11593
|
-
console.log(
|
|
11618
|
+
console.log(chalk15.green("\u2713 Synced (0 files)"));
|
|
11594
11619
|
return { removedCount };
|
|
11595
11620
|
}
|
|
11596
11621
|
|
|
@@ -11609,7 +11634,7 @@ var pullCommand = new Command15().name("pull").description("Pull cloud files to
|
|
|
11609
11634
|
} else {
|
|
11610
11635
|
console.log(`Pulling volume: ${config.name}`);
|
|
11611
11636
|
}
|
|
11612
|
-
console.log(
|
|
11637
|
+
console.log(chalk16.dim("Getting download URL..."));
|
|
11613
11638
|
const downloadInfo = await getStorageDownload({
|
|
11614
11639
|
name: config.name,
|
|
11615
11640
|
type: "volume",
|
|
@@ -11623,18 +11648,18 @@ var pullCommand = new Command15().name("pull").description("Pull cloud files to
|
|
|
11623
11648
|
if (!downloadUrl) {
|
|
11624
11649
|
throw new Error("No download URL returned");
|
|
11625
11650
|
}
|
|
11626
|
-
console.log(
|
|
11651
|
+
console.log(chalk16.dim("Downloading from S3..."));
|
|
11627
11652
|
const s3Response = await fetch(downloadUrl);
|
|
11628
11653
|
if (!s3Response.ok) {
|
|
11629
11654
|
throw new Error(`S3 download failed: ${s3Response.status}`);
|
|
11630
11655
|
}
|
|
11631
11656
|
const arrayBuffer = await s3Response.arrayBuffer();
|
|
11632
11657
|
const tarBuffer = Buffer.from(arrayBuffer);
|
|
11633
|
-
console.log(
|
|
11658
|
+
console.log(chalk16.green(`\u2713 Downloaded ${formatBytes(tarBuffer.length)}`));
|
|
11634
11659
|
const tmpDir = fs7.mkdtempSync(path8.join(os5.tmpdir(), "vm0-"));
|
|
11635
11660
|
const tarPath = path8.join(tmpDir, "volume.tar.gz");
|
|
11636
11661
|
await fs7.promises.writeFile(tarPath, tarBuffer);
|
|
11637
|
-
console.log(
|
|
11662
|
+
console.log(chalk16.dim("Syncing local files..."));
|
|
11638
11663
|
const remoteFiles = await listTarFiles(tarPath);
|
|
11639
11664
|
const remoteFilesSet = new Set(
|
|
11640
11665
|
remoteFiles.map((f) => f.replace(/\\/g, "/"))
|
|
@@ -11642,10 +11667,10 @@ var pullCommand = new Command15().name("pull").description("Pull cloud files to
|
|
|
11642
11667
|
const removedCount = await removeExtraFiles(cwd, remoteFilesSet);
|
|
11643
11668
|
if (removedCount > 0) {
|
|
11644
11669
|
console.log(
|
|
11645
|
-
|
|
11670
|
+
chalk16.green(`\u2713 Removed ${removedCount} files not in remote`)
|
|
11646
11671
|
);
|
|
11647
11672
|
}
|
|
11648
|
-
console.log(
|
|
11673
|
+
console.log(chalk16.dim("Extracting files..."));
|
|
11649
11674
|
await tar3.extract({
|
|
11650
11675
|
file: tarPath,
|
|
11651
11676
|
cwd,
|
|
@@ -11653,13 +11678,13 @@ var pullCommand = new Command15().name("pull").description("Pull cloud files to
|
|
|
11653
11678
|
});
|
|
11654
11679
|
await fs7.promises.unlink(tarPath);
|
|
11655
11680
|
await fs7.promises.rmdir(tmpDir);
|
|
11656
|
-
console.log(
|
|
11681
|
+
console.log(chalk16.green(`\u2713 Extracted ${remoteFiles.length} files`));
|
|
11657
11682
|
})
|
|
11658
11683
|
);
|
|
11659
11684
|
|
|
11660
11685
|
// src/commands/volume/status.ts
|
|
11661
11686
|
import { Command as Command16 } from "commander";
|
|
11662
|
-
import
|
|
11687
|
+
import chalk17 from "chalk";
|
|
11663
11688
|
var statusCommand2 = new Command16().name("status").description("Show status of cloud volume").action(
|
|
11664
11689
|
withErrorHandler(async () => {
|
|
11665
11690
|
const cwd = process.cwd();
|
|
@@ -11683,13 +11708,13 @@ var statusCommand2 = new Command16().name("status").description("Show status of
|
|
|
11683
11708
|
});
|
|
11684
11709
|
const shortVersion = info.versionId.slice(0, 8);
|
|
11685
11710
|
if ("empty" in info) {
|
|
11686
|
-
console.log(
|
|
11687
|
-
console.log(
|
|
11711
|
+
console.log(chalk17.green("\u2713 Found (empty)"));
|
|
11712
|
+
console.log(chalk17.dim(` Version: ${shortVersion}`));
|
|
11688
11713
|
} else {
|
|
11689
|
-
console.log(
|
|
11690
|
-
console.log(
|
|
11691
|
-
console.log(
|
|
11692
|
-
console.log(
|
|
11714
|
+
console.log(chalk17.green("\u2713 Found"));
|
|
11715
|
+
console.log(chalk17.dim(` Version: ${shortVersion}`));
|
|
11716
|
+
console.log(chalk17.dim(` Files: ${info.fileCount.toLocaleString()}`));
|
|
11717
|
+
console.log(chalk17.dim(` Size: ${formatBytes(info.size)}`));
|
|
11693
11718
|
}
|
|
11694
11719
|
} catch (error) {
|
|
11695
11720
|
if (error instanceof ApiRequestError && error.status === 404) {
|
|
@@ -11704,14 +11729,14 @@ var statusCommand2 = new Command16().name("status").description("Show status of
|
|
|
11704
11729
|
|
|
11705
11730
|
// src/commands/volume/list.ts
|
|
11706
11731
|
import { Command as Command17 } from "commander";
|
|
11707
|
-
import
|
|
11732
|
+
import chalk18 from "chalk";
|
|
11708
11733
|
var listCommand2 = new Command17().name("list").alias("ls").description("List all remote volumes").action(
|
|
11709
11734
|
withErrorHandler(async () => {
|
|
11710
11735
|
const items = await listStorages({ type: "volume" });
|
|
11711
11736
|
if (items.length === 0) {
|
|
11712
|
-
console.log(
|
|
11737
|
+
console.log(chalk18.dim("No volumes found"));
|
|
11713
11738
|
console.log(
|
|
11714
|
-
|
|
11739
|
+
chalk18.dim(" Create one with: vm0 volume init && vm0 volume push")
|
|
11715
11740
|
);
|
|
11716
11741
|
return;
|
|
11717
11742
|
}
|
|
@@ -11730,7 +11755,7 @@ var listCommand2 = new Command17().name("list").alias("ls").description("List al
|
|
|
11730
11755
|
"FILES".padStart(filesWidth),
|
|
11731
11756
|
"UPDATED"
|
|
11732
11757
|
].join(" ");
|
|
11733
|
-
console.log(
|
|
11758
|
+
console.log(chalk18.dim(header));
|
|
11734
11759
|
for (const item of items) {
|
|
11735
11760
|
const row = [
|
|
11736
11761
|
item.name.padEnd(nameWidth),
|
|
@@ -11745,10 +11770,10 @@ var listCommand2 = new Command17().name("list").alias("ls").description("List al
|
|
|
11745
11770
|
|
|
11746
11771
|
// src/commands/volume/clone.ts
|
|
11747
11772
|
import { Command as Command18 } from "commander";
|
|
11748
|
-
import
|
|
11773
|
+
import chalk20 from "chalk";
|
|
11749
11774
|
|
|
11750
11775
|
// src/lib/storage/clone-utils.ts
|
|
11751
|
-
import
|
|
11776
|
+
import chalk19 from "chalk";
|
|
11752
11777
|
import path9 from "path";
|
|
11753
11778
|
import * as fs8 from "fs";
|
|
11754
11779
|
import * as os6 from "os";
|
|
@@ -11759,18 +11784,18 @@ async function cloneStorage(name, type2, destination, options = {}) {
|
|
|
11759
11784
|
if (dirStatus.exists && !dirStatus.empty) {
|
|
11760
11785
|
throw new Error(`Directory "${destination}" is not empty`);
|
|
11761
11786
|
}
|
|
11762
|
-
console.log(
|
|
11787
|
+
console.log(chalk19.dim(`Checking remote ${typeLabel}...`));
|
|
11763
11788
|
const downloadInfo = await getStorageDownload({
|
|
11764
11789
|
name,
|
|
11765
11790
|
type: type2,
|
|
11766
11791
|
version: options.version
|
|
11767
11792
|
});
|
|
11768
|
-
console.log(
|
|
11793
|
+
console.log(chalk19.dim(`Creating directory: ${destination}/`));
|
|
11769
11794
|
await fs8.promises.mkdir(destination, { recursive: true });
|
|
11770
11795
|
if ("empty" in downloadInfo) {
|
|
11771
11796
|
await writeStorageConfig(name, destination, type2);
|
|
11772
|
-
console.log(
|
|
11773
|
-
console.log(
|
|
11797
|
+
console.log(chalk19.green(`\u2713 Cloned empty ${typeLabel}: ${name}`));
|
|
11798
|
+
console.log(chalk19.dim(`\u2713 Initialized .vm0/storage.yaml`));
|
|
11774
11799
|
return {
|
|
11775
11800
|
success: true,
|
|
11776
11801
|
fileCount: 0,
|
|
@@ -11782,7 +11807,7 @@ async function cloneStorage(name, type2, destination, options = {}) {
|
|
|
11782
11807
|
if (!downloadUrl) {
|
|
11783
11808
|
throw new Error("No download URL returned");
|
|
11784
11809
|
}
|
|
11785
|
-
console.log(
|
|
11810
|
+
console.log(chalk19.dim("Downloading from S3..."));
|
|
11786
11811
|
const s3Response = await fetch(downloadUrl);
|
|
11787
11812
|
if (!s3Response.ok) {
|
|
11788
11813
|
await fs8.promises.rm(destination, { recursive: true, force: true });
|
|
@@ -11790,12 +11815,12 @@ async function cloneStorage(name, type2, destination, options = {}) {
|
|
|
11790
11815
|
}
|
|
11791
11816
|
const arrayBuffer = await s3Response.arrayBuffer();
|
|
11792
11817
|
const tarBuffer = Buffer.from(arrayBuffer);
|
|
11793
|
-
console.log(
|
|
11818
|
+
console.log(chalk19.green(`\u2713 Downloaded ${formatBytes(tarBuffer.length)}`));
|
|
11794
11819
|
const tmpDir = fs8.mkdtempSync(path9.join(os6.tmpdir(), "vm0-clone-"));
|
|
11795
11820
|
const tarPath = path9.join(tmpDir, "archive.tar.gz");
|
|
11796
11821
|
await fs8.promises.writeFile(tarPath, tarBuffer);
|
|
11797
11822
|
const files = await listTarFiles(tarPath);
|
|
11798
|
-
console.log(
|
|
11823
|
+
console.log(chalk19.dim("Extracting files..."));
|
|
11799
11824
|
await tar4.extract({
|
|
11800
11825
|
file: tarPath,
|
|
11801
11826
|
cwd: destination,
|
|
@@ -11803,9 +11828,9 @@ async function cloneStorage(name, type2, destination, options = {}) {
|
|
|
11803
11828
|
});
|
|
11804
11829
|
await fs8.promises.unlink(tarPath);
|
|
11805
11830
|
await fs8.promises.rmdir(tmpDir);
|
|
11806
|
-
console.log(
|
|
11831
|
+
console.log(chalk19.green(`\u2713 Extracted ${files.length} files`));
|
|
11807
11832
|
await writeStorageConfig(name, destination, type2);
|
|
11808
|
-
console.log(
|
|
11833
|
+
console.log(chalk19.green(`\u2713 Initialized .vm0/storage.yaml`));
|
|
11809
11834
|
return {
|
|
11810
11835
|
success: true,
|
|
11811
11836
|
fileCount: downloadInfo.fileCount,
|
|
@@ -11820,10 +11845,10 @@ var cloneCommand = new Command18().name("clone").description("Clone a remote vol
|
|
|
11820
11845
|
const targetDir = destination || name;
|
|
11821
11846
|
console.log(`Cloning volume: ${name}`);
|
|
11822
11847
|
const result = await cloneStorage(name, "volume", targetDir);
|
|
11823
|
-
console.log(
|
|
11848
|
+
console.log(chalk20.green(`
|
|
11824
11849
|
\u2713 Successfully cloned volume: ${name}`));
|
|
11825
|
-
console.log(
|
|
11826
|
-
console.log(
|
|
11850
|
+
console.log(chalk20.dim(` Location: ${targetDir}/`));
|
|
11851
|
+
console.log(chalk20.dim(` Version: ${result.versionId.slice(0, 8)}`));
|
|
11827
11852
|
})
|
|
11828
11853
|
);
|
|
11829
11854
|
|
|
@@ -11835,7 +11860,7 @@ import { Command as Command26 } from "commander";
|
|
|
11835
11860
|
|
|
11836
11861
|
// src/commands/artifact/init.ts
|
|
11837
11862
|
import { Command as Command20 } from "commander";
|
|
11838
|
-
import
|
|
11863
|
+
import chalk21 from "chalk";
|
|
11839
11864
|
import path10 from "path";
|
|
11840
11865
|
var initCommand2 = new Command20().name("init").description("Initialize an artifact in the current directory").option(
|
|
11841
11866
|
"-n, --name <name>",
|
|
@@ -11848,24 +11873,24 @@ var initCommand2 = new Command20().name("init").description("Initialize an artif
|
|
|
11848
11873
|
if (existingConfig) {
|
|
11849
11874
|
if (existingConfig.type === "artifact") {
|
|
11850
11875
|
console.log(
|
|
11851
|
-
|
|
11876
|
+
chalk21.yellow(
|
|
11852
11877
|
`Artifact already initialized: ${existingConfig.name}`
|
|
11853
11878
|
)
|
|
11854
11879
|
);
|
|
11855
11880
|
} else {
|
|
11856
11881
|
console.log(
|
|
11857
|
-
|
|
11882
|
+
chalk21.yellow(
|
|
11858
11883
|
`Directory already initialized as volume: ${existingConfig.name}`
|
|
11859
11884
|
)
|
|
11860
11885
|
);
|
|
11861
11886
|
console.log(
|
|
11862
|
-
|
|
11887
|
+
chalk21.dim(
|
|
11863
11888
|
" To change type, delete .vm0/storage.yaml and reinitialize"
|
|
11864
11889
|
)
|
|
11865
11890
|
);
|
|
11866
11891
|
}
|
|
11867
11892
|
console.log(
|
|
11868
|
-
|
|
11893
|
+
chalk21.dim(`Config file: ${path10.join(cwd, ".vm0", "storage.yaml")}`)
|
|
11869
11894
|
);
|
|
11870
11895
|
return;
|
|
11871
11896
|
}
|
|
@@ -11889,7 +11914,7 @@ var initCommand2 = new Command20().name("init").description("Initialize an artif
|
|
|
11889
11914
|
}
|
|
11890
11915
|
);
|
|
11891
11916
|
if (name === void 0) {
|
|
11892
|
-
console.log(
|
|
11917
|
+
console.log(chalk21.dim("Cancelled"));
|
|
11893
11918
|
return;
|
|
11894
11919
|
}
|
|
11895
11920
|
artifactName = name;
|
|
@@ -11902,9 +11927,9 @@ var initCommand2 = new Command20().name("init").description("Initialize an artif
|
|
|
11902
11927
|
});
|
|
11903
11928
|
}
|
|
11904
11929
|
await writeStorageConfig(artifactName, cwd, "artifact");
|
|
11905
|
-
console.log(
|
|
11930
|
+
console.log(chalk21.green(`\u2713 Initialized artifact: ${artifactName}`));
|
|
11906
11931
|
console.log(
|
|
11907
|
-
|
|
11932
|
+
chalk21.dim(
|
|
11908
11933
|
` Config saved to ${path10.join(cwd, ".vm0", "storage.yaml")}`
|
|
11909
11934
|
)
|
|
11910
11935
|
);
|
|
@@ -11913,7 +11938,7 @@ var initCommand2 = new Command20().name("init").description("Initialize an artif
|
|
|
11913
11938
|
|
|
11914
11939
|
// src/commands/artifact/push.ts
|
|
11915
11940
|
import { Command as Command21 } from "commander";
|
|
11916
|
-
import
|
|
11941
|
+
import chalk22 from "chalk";
|
|
11917
11942
|
var pushCommand2 = new Command21().name("push").description("Push local files to cloud artifact").option(
|
|
11918
11943
|
"-f, --force",
|
|
11919
11944
|
"Force upload even if content unchanged (recreate archive)"
|
|
@@ -11935,27 +11960,27 @@ var pushCommand2 = new Command21().name("push").description("Push local files to
|
|
|
11935
11960
|
console.log(`Pushing artifact: ${config.name}`);
|
|
11936
11961
|
const result = await directUpload(config.name, "artifact", cwd, {
|
|
11937
11962
|
onProgress: (message) => {
|
|
11938
|
-
console.log(
|
|
11963
|
+
console.log(chalk22.dim(message));
|
|
11939
11964
|
},
|
|
11940
11965
|
force: options.force
|
|
11941
11966
|
});
|
|
11942
11967
|
const shortVersion = result.versionId.slice(0, 8);
|
|
11943
11968
|
if (result.empty) {
|
|
11944
|
-
console.log(
|
|
11969
|
+
console.log(chalk22.dim("No files found (empty artifact)"));
|
|
11945
11970
|
} else if (result.deduplicated) {
|
|
11946
|
-
console.log(
|
|
11971
|
+
console.log(chalk22.green("\u2713 Content unchanged (deduplicated)"));
|
|
11947
11972
|
} else {
|
|
11948
|
-
console.log(
|
|
11973
|
+
console.log(chalk22.green("\u2713 Upload complete"));
|
|
11949
11974
|
}
|
|
11950
|
-
console.log(
|
|
11951
|
-
console.log(
|
|
11952
|
-
console.log(
|
|
11975
|
+
console.log(chalk22.dim(` Version: ${shortVersion}`));
|
|
11976
|
+
console.log(chalk22.dim(` Files: ${result.fileCount.toLocaleString()}`));
|
|
11977
|
+
console.log(chalk22.dim(` Size: ${formatBytes(result.size)}`));
|
|
11953
11978
|
})
|
|
11954
11979
|
);
|
|
11955
11980
|
|
|
11956
11981
|
// src/commands/artifact/pull.ts
|
|
11957
11982
|
import { Command as Command22 } from "commander";
|
|
11958
|
-
import
|
|
11983
|
+
import chalk23 from "chalk";
|
|
11959
11984
|
import path11 from "path";
|
|
11960
11985
|
import * as fs9 from "fs";
|
|
11961
11986
|
import * as os7 from "os";
|
|
@@ -11980,7 +12005,7 @@ var pullCommand2 = new Command22().name("pull").description("Pull cloud artifact
|
|
|
11980
12005
|
} else {
|
|
11981
12006
|
console.log(`Pulling artifact: ${config.name}`);
|
|
11982
12007
|
}
|
|
11983
|
-
console.log(
|
|
12008
|
+
console.log(chalk23.dim("Getting download URL..."));
|
|
11984
12009
|
const downloadInfo = await getStorageDownload({
|
|
11985
12010
|
name: config.name,
|
|
11986
12011
|
type: "artifact",
|
|
@@ -11994,18 +12019,18 @@ var pullCommand2 = new Command22().name("pull").description("Pull cloud artifact
|
|
|
11994
12019
|
if (!downloadUrl) {
|
|
11995
12020
|
throw new Error("No download URL returned");
|
|
11996
12021
|
}
|
|
11997
|
-
console.log(
|
|
12022
|
+
console.log(chalk23.dim("Downloading from S3..."));
|
|
11998
12023
|
const s3Response = await fetch(downloadUrl);
|
|
11999
12024
|
if (!s3Response.ok) {
|
|
12000
12025
|
throw new Error(`S3 download failed: ${s3Response.status}`);
|
|
12001
12026
|
}
|
|
12002
12027
|
const arrayBuffer = await s3Response.arrayBuffer();
|
|
12003
12028
|
const tarBuffer = Buffer.from(arrayBuffer);
|
|
12004
|
-
console.log(
|
|
12029
|
+
console.log(chalk23.green(`\u2713 Downloaded ${formatBytes(tarBuffer.length)}`));
|
|
12005
12030
|
const tmpDir = fs9.mkdtempSync(path11.join(os7.tmpdir(), "vm0-"));
|
|
12006
12031
|
const tarPath = path11.join(tmpDir, "artifact.tar.gz");
|
|
12007
12032
|
await fs9.promises.writeFile(tarPath, tarBuffer);
|
|
12008
|
-
console.log(
|
|
12033
|
+
console.log(chalk23.dim("Syncing local files..."));
|
|
12009
12034
|
const remoteFiles = await listTarFiles(tarPath);
|
|
12010
12035
|
const remoteFilesSet = new Set(
|
|
12011
12036
|
remoteFiles.map((f) => f.replace(/\\/g, "/"))
|
|
@@ -12013,10 +12038,10 @@ var pullCommand2 = new Command22().name("pull").description("Pull cloud artifact
|
|
|
12013
12038
|
const removedCount = await removeExtraFiles(cwd, remoteFilesSet);
|
|
12014
12039
|
if (removedCount > 0) {
|
|
12015
12040
|
console.log(
|
|
12016
|
-
|
|
12041
|
+
chalk23.green(`\u2713 Removed ${removedCount} files not in remote`)
|
|
12017
12042
|
);
|
|
12018
12043
|
}
|
|
12019
|
-
console.log(
|
|
12044
|
+
console.log(chalk23.dim("Extracting files..."));
|
|
12020
12045
|
await tar5.extract({
|
|
12021
12046
|
file: tarPath,
|
|
12022
12047
|
cwd,
|
|
@@ -12024,13 +12049,13 @@ var pullCommand2 = new Command22().name("pull").description("Pull cloud artifact
|
|
|
12024
12049
|
});
|
|
12025
12050
|
await fs9.promises.unlink(tarPath);
|
|
12026
12051
|
await fs9.promises.rmdir(tmpDir);
|
|
12027
|
-
console.log(
|
|
12052
|
+
console.log(chalk23.green(`\u2713 Extracted ${remoteFiles.length} files`));
|
|
12028
12053
|
})
|
|
12029
12054
|
);
|
|
12030
12055
|
|
|
12031
12056
|
// src/commands/artifact/status.ts
|
|
12032
12057
|
import { Command as Command23 } from "commander";
|
|
12033
|
-
import
|
|
12058
|
+
import chalk24 from "chalk";
|
|
12034
12059
|
var statusCommand3 = new Command23().name("status").description("Show status of cloud artifact").action(
|
|
12035
12060
|
withErrorHandler(async () => {
|
|
12036
12061
|
const cwd = process.cwd();
|
|
@@ -12054,13 +12079,13 @@ var statusCommand3 = new Command23().name("status").description("Show status of
|
|
|
12054
12079
|
});
|
|
12055
12080
|
const shortVersion = info.versionId.slice(0, 8);
|
|
12056
12081
|
if ("empty" in info) {
|
|
12057
|
-
console.log(
|
|
12058
|
-
console.log(
|
|
12082
|
+
console.log(chalk24.green("\u2713 Found (empty)"));
|
|
12083
|
+
console.log(chalk24.dim(` Version: ${shortVersion}`));
|
|
12059
12084
|
} else {
|
|
12060
|
-
console.log(
|
|
12061
|
-
console.log(
|
|
12062
|
-
console.log(
|
|
12063
|
-
console.log(
|
|
12085
|
+
console.log(chalk24.green("\u2713 Found"));
|
|
12086
|
+
console.log(chalk24.dim(` Version: ${shortVersion}`));
|
|
12087
|
+
console.log(chalk24.dim(` Files: ${info.fileCount.toLocaleString()}`));
|
|
12088
|
+
console.log(chalk24.dim(` Size: ${formatBytes(info.size)}`));
|
|
12064
12089
|
}
|
|
12065
12090
|
} catch (error) {
|
|
12066
12091
|
if (error instanceof ApiRequestError && error.status === 404) {
|
|
@@ -12075,14 +12100,14 @@ var statusCommand3 = new Command23().name("status").description("Show status of
|
|
|
12075
12100
|
|
|
12076
12101
|
// src/commands/artifact/list.ts
|
|
12077
12102
|
import { Command as Command24 } from "commander";
|
|
12078
|
-
import
|
|
12103
|
+
import chalk25 from "chalk";
|
|
12079
12104
|
var listCommand3 = new Command24().name("list").alias("ls").description("List all remote artifacts").action(
|
|
12080
12105
|
withErrorHandler(async () => {
|
|
12081
12106
|
const items = await listStorages({ type: "artifact" });
|
|
12082
12107
|
if (items.length === 0) {
|
|
12083
|
-
console.log(
|
|
12108
|
+
console.log(chalk25.dim("No artifacts found"));
|
|
12084
12109
|
console.log(
|
|
12085
|
-
|
|
12110
|
+
chalk25.dim(
|
|
12086
12111
|
" Create one with: vm0 artifact init && vm0 artifact push"
|
|
12087
12112
|
)
|
|
12088
12113
|
);
|
|
@@ -12103,7 +12128,7 @@ var listCommand3 = new Command24().name("list").alias("ls").description("List al
|
|
|
12103
12128
|
"FILES".padStart(filesWidth),
|
|
12104
12129
|
"UPDATED"
|
|
12105
12130
|
].join(" ");
|
|
12106
|
-
console.log(
|
|
12131
|
+
console.log(chalk25.dim(header));
|
|
12107
12132
|
for (const item of items) {
|
|
12108
12133
|
const row = [
|
|
12109
12134
|
item.name.padEnd(nameWidth),
|
|
@@ -12118,16 +12143,16 @@ var listCommand3 = new Command24().name("list").alias("ls").description("List al
|
|
|
12118
12143
|
|
|
12119
12144
|
// src/commands/artifact/clone.ts
|
|
12120
12145
|
import { Command as Command25 } from "commander";
|
|
12121
|
-
import
|
|
12146
|
+
import chalk26 from "chalk";
|
|
12122
12147
|
var cloneCommand2 = new Command25().name("clone").description("Clone a remote artifact to local directory (latest version)").argument("<name>", "Artifact name to clone").argument("[destination]", "Destination directory (default: artifact name)").action(
|
|
12123
12148
|
withErrorHandler(async (name, destination) => {
|
|
12124
12149
|
const targetDir = destination || name;
|
|
12125
12150
|
console.log(`Cloning artifact: ${name}`);
|
|
12126
12151
|
const result = await cloneStorage(name, "artifact", targetDir);
|
|
12127
|
-
console.log(
|
|
12152
|
+
console.log(chalk26.green(`
|
|
12128
12153
|
\u2713 Successfully cloned artifact: ${name}`));
|
|
12129
|
-
console.log(
|
|
12130
|
-
console.log(
|
|
12154
|
+
console.log(chalk26.dim(` Location: ${targetDir}/`));
|
|
12155
|
+
console.log(chalk26.dim(` Version: ${result.versionId.slice(0, 8)}`));
|
|
12131
12156
|
})
|
|
12132
12157
|
);
|
|
12133
12158
|
|
|
@@ -12139,7 +12164,7 @@ import { Command as Command33 } from "commander";
|
|
|
12139
12164
|
|
|
12140
12165
|
// src/commands/memory/init.ts
|
|
12141
12166
|
import { Command as Command27 } from "commander";
|
|
12142
|
-
import
|
|
12167
|
+
import chalk27 from "chalk";
|
|
12143
12168
|
import path12 from "path";
|
|
12144
12169
|
var initCommand3 = new Command27().name("init").description("Initialize a memory in the current directory").option("-n, --name <name>", "Memory name (required in non-interactive mode)").action(
|
|
12145
12170
|
withErrorHandler(async (options) => {
|
|
@@ -12149,22 +12174,22 @@ var initCommand3 = new Command27().name("init").description("Initialize a memory
|
|
|
12149
12174
|
if (existingConfig) {
|
|
12150
12175
|
if (existingConfig.type === "memory") {
|
|
12151
12176
|
console.log(
|
|
12152
|
-
|
|
12177
|
+
chalk27.yellow(`Memory already initialized: ${existingConfig.name}`)
|
|
12153
12178
|
);
|
|
12154
12179
|
} else {
|
|
12155
12180
|
console.log(
|
|
12156
|
-
|
|
12181
|
+
chalk27.yellow(
|
|
12157
12182
|
`Directory already initialized as ${existingConfig.type}: ${existingConfig.name}`
|
|
12158
12183
|
)
|
|
12159
12184
|
);
|
|
12160
12185
|
console.log(
|
|
12161
|
-
|
|
12186
|
+
chalk27.dim(
|
|
12162
12187
|
" To change type, delete .vm0/storage.yaml and reinitialize"
|
|
12163
12188
|
)
|
|
12164
12189
|
);
|
|
12165
12190
|
}
|
|
12166
12191
|
console.log(
|
|
12167
|
-
|
|
12192
|
+
chalk27.dim(`Config file: ${path12.join(cwd, ".vm0", "storage.yaml")}`)
|
|
12168
12193
|
);
|
|
12169
12194
|
return;
|
|
12170
12195
|
}
|
|
@@ -12188,7 +12213,7 @@ var initCommand3 = new Command27().name("init").description("Initialize a memory
|
|
|
12188
12213
|
}
|
|
12189
12214
|
);
|
|
12190
12215
|
if (name === void 0) {
|
|
12191
|
-
console.log(
|
|
12216
|
+
console.log(chalk27.dim("Cancelled"));
|
|
12192
12217
|
return;
|
|
12193
12218
|
}
|
|
12194
12219
|
memoryName = name;
|
|
@@ -12201,9 +12226,9 @@ var initCommand3 = new Command27().name("init").description("Initialize a memory
|
|
|
12201
12226
|
});
|
|
12202
12227
|
}
|
|
12203
12228
|
await writeStorageConfig(memoryName, cwd, "memory");
|
|
12204
|
-
console.log(
|
|
12229
|
+
console.log(chalk27.green(`\u2713 Initialized memory: ${memoryName}`));
|
|
12205
12230
|
console.log(
|
|
12206
|
-
|
|
12231
|
+
chalk27.dim(
|
|
12207
12232
|
` Config saved to ${path12.join(cwd, ".vm0", "storage.yaml")}`
|
|
12208
12233
|
)
|
|
12209
12234
|
);
|
|
@@ -12212,7 +12237,7 @@ var initCommand3 = new Command27().name("init").description("Initialize a memory
|
|
|
12212
12237
|
|
|
12213
12238
|
// src/commands/memory/push.ts
|
|
12214
12239
|
import { Command as Command28 } from "commander";
|
|
12215
|
-
import
|
|
12240
|
+
import chalk28 from "chalk";
|
|
12216
12241
|
var pushCommand3 = new Command28().name("push").description("Push local files to cloud memory").option(
|
|
12217
12242
|
"-f, --force",
|
|
12218
12243
|
"Force upload even if content unchanged (recreate archive)"
|
|
@@ -12234,42 +12259,42 @@ var pushCommand3 = new Command28().name("push").description("Push local files to
|
|
|
12234
12259
|
console.log(`Pushing memory: ${config.name}`);
|
|
12235
12260
|
const result = await directUpload(config.name, "memory", cwd, {
|
|
12236
12261
|
onProgress: (message) => {
|
|
12237
|
-
console.log(
|
|
12262
|
+
console.log(chalk28.dim(message));
|
|
12238
12263
|
},
|
|
12239
12264
|
force: options.force
|
|
12240
12265
|
});
|
|
12241
12266
|
const shortVersion = result.versionId.slice(0, 8);
|
|
12242
12267
|
if (result.empty) {
|
|
12243
|
-
console.log(
|
|
12268
|
+
console.log(chalk28.dim("No files found (empty memory)"));
|
|
12244
12269
|
} else if (result.deduplicated) {
|
|
12245
|
-
console.log(
|
|
12270
|
+
console.log(chalk28.green("\u2713 Content unchanged (deduplicated)"));
|
|
12246
12271
|
} else {
|
|
12247
|
-
console.log(
|
|
12272
|
+
console.log(chalk28.green("\u2713 Upload complete"));
|
|
12248
12273
|
}
|
|
12249
|
-
console.log(
|
|
12250
|
-
console.log(
|
|
12251
|
-
console.log(
|
|
12274
|
+
console.log(chalk28.dim(` Version: ${shortVersion}`));
|
|
12275
|
+
console.log(chalk28.dim(` Files: ${result.fileCount.toLocaleString()}`));
|
|
12276
|
+
console.log(chalk28.dim(` Size: ${formatBytes(result.size)}`));
|
|
12252
12277
|
})
|
|
12253
12278
|
);
|
|
12254
12279
|
|
|
12255
12280
|
// src/commands/memory/pull.ts
|
|
12256
12281
|
import { Command as Command29 } from "commander";
|
|
12257
|
-
import
|
|
12282
|
+
import chalk29 from "chalk";
|
|
12258
12283
|
var pullCommand3 = new Command29().name("pull").description("Pull remote memory to local directory (latest version)").argument("[name]", "Memory name to pull", "memory").argument("[destination]", "Destination directory (default: memory name)").action(
|
|
12259
12284
|
withErrorHandler(async (name, destination) => {
|
|
12260
12285
|
const targetDir = destination || name;
|
|
12261
12286
|
console.log(`Pulling memory: ${name}`);
|
|
12262
12287
|
const result = await cloneStorage(name, "memory", targetDir);
|
|
12263
|
-
console.log(
|
|
12288
|
+
console.log(chalk29.green(`
|
|
12264
12289
|
\u2713 Successfully pulled memory: ${name}`));
|
|
12265
|
-
console.log(
|
|
12266
|
-
console.log(
|
|
12290
|
+
console.log(chalk29.dim(` Location: ${targetDir}/`));
|
|
12291
|
+
console.log(chalk29.dim(` Version: ${result.versionId.slice(0, 8)}`));
|
|
12267
12292
|
})
|
|
12268
12293
|
);
|
|
12269
12294
|
|
|
12270
12295
|
// src/commands/memory/status.ts
|
|
12271
12296
|
import { Command as Command30 } from "commander";
|
|
12272
|
-
import
|
|
12297
|
+
import chalk30 from "chalk";
|
|
12273
12298
|
var statusCommand4 = new Command30().name("status").description("Show status of cloud memory").action(
|
|
12274
12299
|
withErrorHandler(async () => {
|
|
12275
12300
|
const cwd = process.cwd();
|
|
@@ -12293,13 +12318,13 @@ var statusCommand4 = new Command30().name("status").description("Show status of
|
|
|
12293
12318
|
});
|
|
12294
12319
|
const shortVersion = info.versionId.slice(0, 8);
|
|
12295
12320
|
if ("empty" in info) {
|
|
12296
|
-
console.log(
|
|
12297
|
-
console.log(
|
|
12321
|
+
console.log(chalk30.green("\u2713 Found (empty)"));
|
|
12322
|
+
console.log(chalk30.dim(` Version: ${shortVersion}`));
|
|
12298
12323
|
} else {
|
|
12299
|
-
console.log(
|
|
12300
|
-
console.log(
|
|
12301
|
-
console.log(
|
|
12302
|
-
console.log(
|
|
12324
|
+
console.log(chalk30.green("\u2713 Found"));
|
|
12325
|
+
console.log(chalk30.dim(` Version: ${shortVersion}`));
|
|
12326
|
+
console.log(chalk30.dim(` Files: ${info.fileCount.toLocaleString()}`));
|
|
12327
|
+
console.log(chalk30.dim(` Size: ${formatBytes(info.size)}`));
|
|
12303
12328
|
}
|
|
12304
12329
|
} catch (error) {
|
|
12305
12330
|
if (error instanceof ApiRequestError && error.status === 404) {
|
|
@@ -12314,14 +12339,14 @@ var statusCommand4 = new Command30().name("status").description("Show status of
|
|
|
12314
12339
|
|
|
12315
12340
|
// src/commands/memory/list.ts
|
|
12316
12341
|
import { Command as Command31 } from "commander";
|
|
12317
|
-
import
|
|
12342
|
+
import chalk31 from "chalk";
|
|
12318
12343
|
var listCommand4 = new Command31().name("list").alias("ls").description("List all remote memory storages").action(
|
|
12319
12344
|
withErrorHandler(async () => {
|
|
12320
12345
|
const items = await listStorages({ type: "memory" });
|
|
12321
12346
|
if (items.length === 0) {
|
|
12322
|
-
console.log(
|
|
12347
|
+
console.log(chalk31.dim("No memory storages found"));
|
|
12323
12348
|
console.log(
|
|
12324
|
-
|
|
12349
|
+
chalk31.dim(" Memory is created automatically on first agent run")
|
|
12325
12350
|
);
|
|
12326
12351
|
return;
|
|
12327
12352
|
}
|
|
@@ -12340,7 +12365,7 @@ var listCommand4 = new Command31().name("list").alias("ls").description("List al
|
|
|
12340
12365
|
"FILES".padStart(filesWidth),
|
|
12341
12366
|
"UPDATED"
|
|
12342
12367
|
].join(" ");
|
|
12343
|
-
console.log(
|
|
12368
|
+
console.log(chalk31.dim(header));
|
|
12344
12369
|
for (const item of items) {
|
|
12345
12370
|
const row = [
|
|
12346
12371
|
item.name.padEnd(nameWidth),
|
|
@@ -12355,16 +12380,16 @@ var listCommand4 = new Command31().name("list").alias("ls").description("List al
|
|
|
12355
12380
|
|
|
12356
12381
|
// src/commands/memory/clone.ts
|
|
12357
12382
|
import { Command as Command32 } from "commander";
|
|
12358
|
-
import
|
|
12383
|
+
import chalk32 from "chalk";
|
|
12359
12384
|
var cloneCommand3 = new Command32().name("clone").description("Clone a remote memory to local directory (latest version)").argument("<name>", "Memory name to clone").argument("[destination]", "Destination directory (default: memory name)").action(
|
|
12360
12385
|
withErrorHandler(async (name, destination) => {
|
|
12361
12386
|
const targetDir = destination || name;
|
|
12362
12387
|
console.log(`Cloning memory: ${name}`);
|
|
12363
12388
|
const result = await cloneStorage(name, "memory", targetDir);
|
|
12364
|
-
console.log(
|
|
12389
|
+
console.log(chalk32.green(`
|
|
12365
12390
|
\u2713 Successfully cloned memory: ${name}`));
|
|
12366
|
-
console.log(
|
|
12367
|
-
console.log(
|
|
12391
|
+
console.log(chalk32.dim(` Location: ${targetDir}/`));
|
|
12392
|
+
console.log(chalk32.dim(` Version: ${result.versionId.slice(0, 8)}`));
|
|
12368
12393
|
})
|
|
12369
12394
|
);
|
|
12370
12395
|
|
|
@@ -12373,7 +12398,7 @@ var memoryCommand = new Command33().name("memory").description("Manage agent lon
|
|
|
12373
12398
|
|
|
12374
12399
|
// src/commands/cook/cook.ts
|
|
12375
12400
|
import { Command as Command34, Option as Option5 } from "commander";
|
|
12376
|
-
import
|
|
12401
|
+
import chalk34 from "chalk";
|
|
12377
12402
|
import { readFile as readFile7, mkdir as mkdir6 } from "fs/promises";
|
|
12378
12403
|
import { existsSync as existsSync10 } from "fs";
|
|
12379
12404
|
import path13 from "path";
|
|
@@ -12445,12 +12470,12 @@ async function saveCookState(state) {
|
|
|
12445
12470
|
}
|
|
12446
12471
|
|
|
12447
12472
|
// src/commands/cook/utils.ts
|
|
12448
|
-
import
|
|
12473
|
+
import chalk33 from "chalk";
|
|
12449
12474
|
import { existsSync as existsSync9 } from "fs";
|
|
12450
12475
|
var CONFIG_FILE2 = "vm0.yaml";
|
|
12451
12476
|
var ARTIFACT_DIR = "artifact";
|
|
12452
12477
|
function printCommand(cmd) {
|
|
12453
|
-
console.log(
|
|
12478
|
+
console.log(chalk33.dim(`> ${cmd}`));
|
|
12454
12479
|
}
|
|
12455
12480
|
function execVm0Command(args, options = {}) {
|
|
12456
12481
|
return new Promise((resolve2, reject) => {
|
|
@@ -12549,7 +12574,7 @@ async function autoPullArtifact(runOutput, artifactDir) {
|
|
|
12549
12574
|
);
|
|
12550
12575
|
if (serverVersion && existsSync9(artifactDir)) {
|
|
12551
12576
|
console.log();
|
|
12552
|
-
console.log(
|
|
12577
|
+
console.log(chalk33.bold("Pulling updated artifact:"));
|
|
12553
12578
|
printCommand(`cd ${ARTIFACT_DIR}`);
|
|
12554
12579
|
printCommand(`vm0 artifact pull ${serverVersion}`);
|
|
12555
12580
|
try {
|
|
@@ -12559,9 +12584,9 @@ async function autoPullArtifact(runOutput, artifactDir) {
|
|
|
12559
12584
|
});
|
|
12560
12585
|
printCommand("cd ..");
|
|
12561
12586
|
} catch (error) {
|
|
12562
|
-
console.error(
|
|
12587
|
+
console.error(chalk33.red(`\u2717 Artifact pull failed`));
|
|
12563
12588
|
if (error instanceof Error) {
|
|
12564
|
-
console.error(
|
|
12589
|
+
console.error(chalk33.dim(` ${error.message}`));
|
|
12565
12590
|
}
|
|
12566
12591
|
}
|
|
12567
12592
|
}
|
|
@@ -12569,7 +12594,7 @@ async function autoPullArtifact(runOutput, artifactDir) {
|
|
|
12569
12594
|
|
|
12570
12595
|
// src/commands/cook/cook.ts
|
|
12571
12596
|
async function loadAndValidateConfig2() {
|
|
12572
|
-
console.log(
|
|
12597
|
+
console.log(chalk34.bold(`Reading config: ${CONFIG_FILE2}`));
|
|
12573
12598
|
if (!existsSync10(CONFIG_FILE2)) {
|
|
12574
12599
|
throw new Error(`Config file not found: ${CONFIG_FILE2}`);
|
|
12575
12600
|
}
|
|
@@ -12591,7 +12616,7 @@ async function loadAndValidateConfig2() {
|
|
|
12591
12616
|
const agentName = agentNames[0];
|
|
12592
12617
|
const volumeCount = config.volumes ? Object.keys(config.volumes).length : 0;
|
|
12593
12618
|
console.log(
|
|
12594
|
-
|
|
12619
|
+
chalk34.green(`\u2713 Config validated: 1 agent, ${volumeCount} volume(s)`)
|
|
12595
12620
|
);
|
|
12596
12621
|
return { config, agentName, volumeCount };
|
|
12597
12622
|
}
|
|
@@ -12600,7 +12625,7 @@ async function processVolumes(config, cwd) {
|
|
|
12600
12625
|
return;
|
|
12601
12626
|
}
|
|
12602
12627
|
console.log();
|
|
12603
|
-
console.log(
|
|
12628
|
+
console.log(chalk34.bold("Processing volumes:"));
|
|
12604
12629
|
for (const volumeConfig of Object.values(config.volumes)) {
|
|
12605
12630
|
const volumeDir = path13.join(cwd, volumeConfig.name);
|
|
12606
12631
|
if (!existsSync10(volumeDir)) {
|
|
@@ -12634,7 +12659,7 @@ async function processVolumes(config, cwd) {
|
|
|
12634
12659
|
}
|
|
12635
12660
|
async function processArtifact(cwd) {
|
|
12636
12661
|
console.log();
|
|
12637
|
-
console.log(
|
|
12662
|
+
console.log(chalk34.bold("Processing artifact:"));
|
|
12638
12663
|
const artifactDir = path13.join(cwd, ARTIFACT_DIR);
|
|
12639
12664
|
try {
|
|
12640
12665
|
if (!existsSync10(artifactDir)) {
|
|
@@ -12666,7 +12691,7 @@ async function processArtifact(cwd) {
|
|
|
12666
12691
|
}
|
|
12667
12692
|
async function composeAgent(cwd, skipConfirm) {
|
|
12668
12693
|
console.log();
|
|
12669
|
-
console.log(
|
|
12694
|
+
console.log(chalk34.bold("Composing agent:"));
|
|
12670
12695
|
const composeArgs = skipConfirm ? ["compose", "--yes", CONFIG_FILE2] : ["compose", CONFIG_FILE2];
|
|
12671
12696
|
printCommand(`vm0 ${composeArgs.join(" ")}`);
|
|
12672
12697
|
try {
|
|
@@ -12680,7 +12705,7 @@ async function composeAgent(cwd, skipConfirm) {
|
|
|
12680
12705
|
}
|
|
12681
12706
|
async function runAgent(agentName, artifactDir, prompt, cwd, options) {
|
|
12682
12707
|
console.log();
|
|
12683
|
-
console.log(
|
|
12708
|
+
console.log(chalk34.bold("Running agent:"));
|
|
12684
12709
|
printCommand(
|
|
12685
12710
|
`vm0 run ${agentName} --artifact-name ${ARTIFACT_DIR} "${prompt}"`
|
|
12686
12711
|
);
|
|
@@ -12713,7 +12738,7 @@ var cookAction = new Command34().name("cook").description("Quick start: prepare,
|
|
|
12713
12738
|
withErrorHandler(
|
|
12714
12739
|
async (prompt, options) => {
|
|
12715
12740
|
if (options.autoUpdate !== false) {
|
|
12716
|
-
const shouldExit = await checkAndUpgrade("9.
|
|
12741
|
+
const shouldExit = await checkAndUpgrade("9.59.0", prompt);
|
|
12717
12742
|
if (shouldExit) {
|
|
12718
12743
|
process.exit(0);
|
|
12719
12744
|
}
|
|
@@ -12896,7 +12921,7 @@ var cookCommand = cookAction;
|
|
|
12896
12921
|
|
|
12897
12922
|
// src/commands/logs/index.ts
|
|
12898
12923
|
import { Command as Command39 } from "commander";
|
|
12899
|
-
import
|
|
12924
|
+
import chalk36 from "chalk";
|
|
12900
12925
|
|
|
12901
12926
|
// src/lib/api/api-client.ts
|
|
12902
12927
|
import { initClient as initClient12 } from "@ts-rest/core";
|
|
@@ -13594,7 +13619,7 @@ async function paginate(options) {
|
|
|
13594
13619
|
|
|
13595
13620
|
// src/commands/logs/search.ts
|
|
13596
13621
|
import { Command as Command38 } from "commander";
|
|
13597
|
-
import
|
|
13622
|
+
import chalk35 from "chalk";
|
|
13598
13623
|
var SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
13599
13624
|
function renderEvent(event, renderer) {
|
|
13600
13625
|
const eventData = event.eventData;
|
|
@@ -13650,7 +13675,7 @@ function renderResults(response) {
|
|
|
13650
13675
|
isFirstGroup = false;
|
|
13651
13676
|
const firstTimestamp = group.results[0].matchedEvent.createdAt;
|
|
13652
13677
|
console.log(
|
|
13653
|
-
|
|
13678
|
+
chalk35.bold(formatRunHeader(runId, group.agentName, firstTimestamp))
|
|
13654
13679
|
);
|
|
13655
13680
|
for (const result of group.results) {
|
|
13656
13681
|
const renderer = new EventRenderer({
|
|
@@ -13670,7 +13695,7 @@ function renderResults(response) {
|
|
|
13670
13695
|
if (response.hasMore) {
|
|
13671
13696
|
console.log();
|
|
13672
13697
|
console.log(
|
|
13673
|
-
|
|
13698
|
+
chalk35.dim(
|
|
13674
13699
|
` Showing first ${response.results.length} matches. Use --limit to see more.`
|
|
13675
13700
|
)
|
|
13676
13701
|
);
|
|
@@ -13691,9 +13716,9 @@ var searchCommand = new Command38().name("search").description("Search agent eve
|
|
|
13691
13716
|
after
|
|
13692
13717
|
});
|
|
13693
13718
|
if (response.results.length === 0) {
|
|
13694
|
-
console.log(
|
|
13719
|
+
console.log(chalk35.dim("No matches found"));
|
|
13695
13720
|
console.log(
|
|
13696
|
-
|
|
13721
|
+
chalk35.dim(
|
|
13697
13722
|
" Try a broader search with --since 30d or a different keyword"
|
|
13698
13723
|
)
|
|
13699
13724
|
);
|
|
@@ -13730,28 +13755,28 @@ function formatNetworkLog(entry) {
|
|
|
13730
13755
|
let statusColor;
|
|
13731
13756
|
const status = entry.status || 0;
|
|
13732
13757
|
if (status >= 200 && status < 300) {
|
|
13733
|
-
statusColor =
|
|
13758
|
+
statusColor = chalk36.green;
|
|
13734
13759
|
} else if (status >= 300 && status < 400) {
|
|
13735
|
-
statusColor =
|
|
13760
|
+
statusColor = chalk36.yellow;
|
|
13736
13761
|
} else if (status >= 400) {
|
|
13737
|
-
statusColor =
|
|
13762
|
+
statusColor = chalk36.red;
|
|
13738
13763
|
} else {
|
|
13739
|
-
statusColor =
|
|
13764
|
+
statusColor = chalk36.gray;
|
|
13740
13765
|
}
|
|
13741
13766
|
let latencyColor;
|
|
13742
13767
|
const latencyMs = entry.latency_ms || 0;
|
|
13743
13768
|
if (latencyMs < 500) {
|
|
13744
|
-
latencyColor =
|
|
13769
|
+
latencyColor = chalk36.green;
|
|
13745
13770
|
} else if (latencyMs < 2e3) {
|
|
13746
|
-
latencyColor =
|
|
13771
|
+
latencyColor = chalk36.yellow;
|
|
13747
13772
|
} else {
|
|
13748
|
-
latencyColor =
|
|
13773
|
+
latencyColor = chalk36.red;
|
|
13749
13774
|
}
|
|
13750
13775
|
const method = entry.method || "???";
|
|
13751
13776
|
const requestSize = entry.request_size || 0;
|
|
13752
13777
|
const responseSize = entry.response_size || 0;
|
|
13753
13778
|
const url = entry.url || entry.host || "unknown";
|
|
13754
|
-
return `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + "ms")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${
|
|
13779
|
+
return `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + "ms")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk36.dim(url)}`;
|
|
13755
13780
|
}
|
|
13756
13781
|
function createLogRenderer(verbose) {
|
|
13757
13782
|
return new EventRenderer({
|
|
@@ -13857,7 +13882,7 @@ async function showAgentEvents(runId, options, platformUrl) {
|
|
|
13857
13882
|
order: options.order
|
|
13858
13883
|
});
|
|
13859
13884
|
if (firstResponse.events.length === 0) {
|
|
13860
|
-
console.log(
|
|
13885
|
+
console.log(chalk36.yellow("No agent events found for this run"));
|
|
13861
13886
|
return;
|
|
13862
13887
|
}
|
|
13863
13888
|
const framework = firstResponse.framework;
|
|
@@ -13890,7 +13915,7 @@ async function showAgentEvents(runId, options, platformUrl) {
|
|
|
13890
13915
|
for (const event of events) {
|
|
13891
13916
|
renderAgentEvent(event, framework, renderer);
|
|
13892
13917
|
}
|
|
13893
|
-
console.log(
|
|
13918
|
+
console.log(chalk36.dim(`View on platform: ${platformUrl}`));
|
|
13894
13919
|
}
|
|
13895
13920
|
async function showSystemLog(runId, options) {
|
|
13896
13921
|
const limit = options.targetCount === "all" ? PAGE_LIMIT : Math.min(options.targetCount, PAGE_LIMIT);
|
|
@@ -13900,7 +13925,7 @@ async function showSystemLog(runId, options) {
|
|
|
13900
13925
|
order: options.order
|
|
13901
13926
|
});
|
|
13902
13927
|
if (!response.systemLog) {
|
|
13903
|
-
console.log(
|
|
13928
|
+
console.log(chalk36.yellow("No system log found for this run"));
|
|
13904
13929
|
return;
|
|
13905
13930
|
}
|
|
13906
13931
|
console.log(response.systemLog);
|
|
@@ -13912,7 +13937,7 @@ async function showMetrics(runId, options) {
|
|
|
13912
13937
|
order: options.order
|
|
13913
13938
|
});
|
|
13914
13939
|
if (firstResponse.metrics.length === 0) {
|
|
13915
|
-
console.log(
|
|
13940
|
+
console.log(chalk36.yellow("No metrics found for this run"));
|
|
13916
13941
|
return;
|
|
13917
13942
|
}
|
|
13918
13943
|
let allMetrics;
|
|
@@ -13952,7 +13977,7 @@ async function showNetworkLogs(runId, options) {
|
|
|
13952
13977
|
});
|
|
13953
13978
|
if (firstResponse.networkLogs.length === 0) {
|
|
13954
13979
|
console.log(
|
|
13955
|
-
|
|
13980
|
+
chalk36.yellow(
|
|
13956
13981
|
"No network logs found for this run. Network logs are only captured when using a runner with proxy enabled"
|
|
13957
13982
|
)
|
|
13958
13983
|
);
|
|
@@ -13993,13 +14018,13 @@ import { Command as Command48 } from "commander";
|
|
|
13993
14018
|
|
|
13994
14019
|
// src/commands/org/status.ts
|
|
13995
14020
|
import { Command as Command40 } from "commander";
|
|
13996
|
-
import
|
|
14021
|
+
import chalk37 from "chalk";
|
|
13997
14022
|
var statusCommand5 = new Command40().name("status").description("View current organization status").action(
|
|
13998
14023
|
withErrorHandler(async () => {
|
|
13999
14024
|
try {
|
|
14000
14025
|
const org = await getOrg();
|
|
14001
|
-
console.log(
|
|
14002
|
-
console.log(` Slug: ${
|
|
14026
|
+
console.log(chalk37.bold("Organization Information:"));
|
|
14027
|
+
console.log(` Slug: ${chalk37.green(org.slug)}`);
|
|
14003
14028
|
} catch (error) {
|
|
14004
14029
|
if (error instanceof Error && error.message.includes("No org configured")) {
|
|
14005
14030
|
throw new Error("No organization configured", {
|
|
@@ -14013,7 +14038,7 @@ var statusCommand5 = new Command40().name("status").description("View current or
|
|
|
14013
14038
|
|
|
14014
14039
|
// src/commands/org/set.ts
|
|
14015
14040
|
import { Command as Command41 } from "commander";
|
|
14016
|
-
import
|
|
14041
|
+
import chalk38 from "chalk";
|
|
14017
14042
|
var setCommand = new Command41().name("set").description("Rename your organization slug").argument("<slug>", "The new organization slug").option(
|
|
14018
14043
|
"--force",
|
|
14019
14044
|
"Force change existing organization (may break references)"
|
|
@@ -14031,10 +14056,10 @@ var setCommand = new Command41().name("set").description("Rename your organizati
|
|
|
14031
14056
|
}
|
|
14032
14057
|
const org = await updateOrg({ slug, force: true });
|
|
14033
14058
|
await saveConfig({ activeOrg: org.slug });
|
|
14034
|
-
console.log(
|
|
14059
|
+
console.log(chalk38.green(`\u2713 Organization updated to ${org.slug}`));
|
|
14035
14060
|
console.log();
|
|
14036
14061
|
console.log("Your agents will now be namespaced as:");
|
|
14037
|
-
console.log(
|
|
14062
|
+
console.log(chalk38.cyan(` ${org.slug}/<agent-name>`));
|
|
14038
14063
|
} catch (error) {
|
|
14039
14064
|
if (error instanceof Error && error.message.includes("already exists")) {
|
|
14040
14065
|
throw new Error(
|
|
@@ -14048,17 +14073,17 @@ var setCommand = new Command41().name("set").description("Rename your organizati
|
|
|
14048
14073
|
|
|
14049
14074
|
// src/commands/org/list.ts
|
|
14050
14075
|
import { Command as Command42 } from "commander";
|
|
14051
|
-
import
|
|
14076
|
+
import chalk39 from "chalk";
|
|
14052
14077
|
var listCommand5 = new Command42().name("list").description("List all accessible organizations").action(
|
|
14053
14078
|
withErrorHandler(async () => {
|
|
14054
14079
|
const result = await listOrgs();
|
|
14055
14080
|
const activeOrg = await getActiveOrg();
|
|
14056
|
-
console.log(
|
|
14081
|
+
console.log(chalk39.bold("Available organizations:"));
|
|
14057
14082
|
for (const org of result.orgs) {
|
|
14058
14083
|
const isCurrent = org.slug === activeOrg;
|
|
14059
|
-
const marker = isCurrent ?
|
|
14084
|
+
const marker = isCurrent ? chalk39.green("* ") : " ";
|
|
14060
14085
|
const roleLabel = org.role ? ` (${org.role})` : "";
|
|
14061
|
-
const currentLabel = isCurrent ?
|
|
14086
|
+
const currentLabel = isCurrent ? chalk39.dim(" \u2190 current") : "";
|
|
14062
14087
|
console.log(`${marker}${org.slug}${roleLabel}${currentLabel}`);
|
|
14063
14088
|
}
|
|
14064
14089
|
})
|
|
@@ -14066,13 +14091,13 @@ var listCommand5 = new Command42().name("list").description("List all accessible
|
|
|
14066
14091
|
|
|
14067
14092
|
// src/commands/org/use.ts
|
|
14068
14093
|
import { Command as Command43 } from "commander";
|
|
14069
|
-
import
|
|
14094
|
+
import chalk40 from "chalk";
|
|
14070
14095
|
var useCommand = new Command43().name("use").description("Switch to a different organization").argument("[slug]", "Organization slug to switch to").option("--personal", "Switch to personal org").action(
|
|
14071
14096
|
withErrorHandler(
|
|
14072
14097
|
async (slug, options) => {
|
|
14073
14098
|
if (options.personal) {
|
|
14074
14099
|
await saveConfig({ activeOrg: void 0 });
|
|
14075
|
-
console.log(
|
|
14100
|
+
console.log(chalk40.green("\u2713 Switched to personal org."));
|
|
14076
14101
|
return;
|
|
14077
14102
|
}
|
|
14078
14103
|
if (!slug) {
|
|
@@ -14088,27 +14113,27 @@ var useCommand = new Command43().name("use").description("Switch to a different
|
|
|
14088
14113
|
);
|
|
14089
14114
|
}
|
|
14090
14115
|
await saveConfig({ activeOrg: slug });
|
|
14091
|
-
console.log(
|
|
14116
|
+
console.log(chalk40.green(`\u2713 Switched to organization: ${slug}`));
|
|
14092
14117
|
}
|
|
14093
14118
|
)
|
|
14094
14119
|
);
|
|
14095
14120
|
|
|
14096
14121
|
// src/commands/org/members.ts
|
|
14097
14122
|
import { Command as Command44 } from "commander";
|
|
14098
|
-
import
|
|
14123
|
+
import chalk41 from "chalk";
|
|
14099
14124
|
var membersCommand = new Command44().name("members").description("View organization members").action(
|
|
14100
14125
|
withErrorHandler(async () => {
|
|
14101
14126
|
try {
|
|
14102
14127
|
const status = await getOrgMembers();
|
|
14103
|
-
console.log(
|
|
14128
|
+
console.log(chalk41.bold(`Organization: ${status.slug}`));
|
|
14104
14129
|
console.log(` Role: ${status.role}`);
|
|
14105
14130
|
console.log(
|
|
14106
14131
|
` Created: ${new Date(status.createdAt).toLocaleDateString()}`
|
|
14107
14132
|
);
|
|
14108
14133
|
console.log();
|
|
14109
|
-
console.log(
|
|
14134
|
+
console.log(chalk41.bold("Members:"));
|
|
14110
14135
|
for (const member of status.members) {
|
|
14111
|
-
const roleTag = member.role === "admin" ?
|
|
14136
|
+
const roleTag = member.role === "admin" ? chalk41.yellow(` (${member.role})`) : chalk41.dim(` (${member.role})`);
|
|
14112
14137
|
console.log(` ${member.email}${roleTag}`);
|
|
14113
14138
|
}
|
|
14114
14139
|
} catch (error) {
|
|
@@ -14124,33 +14149,33 @@ var membersCommand = new Command44().name("members").description("View organizat
|
|
|
14124
14149
|
|
|
14125
14150
|
// src/commands/org/invite.ts
|
|
14126
14151
|
import { Command as Command45 } from "commander";
|
|
14127
|
-
import
|
|
14152
|
+
import chalk42 from "chalk";
|
|
14128
14153
|
var inviteCommand = new Command45().name("invite").description("Invite a member to the current organization").requiredOption("--email <email>", "Email address of the member to invite").action(
|
|
14129
14154
|
withErrorHandler(async (options) => {
|
|
14130
14155
|
await inviteOrgMember(options.email);
|
|
14131
|
-
console.log(
|
|
14156
|
+
console.log(chalk42.green(`\u2713 Invitation sent to ${options.email}`));
|
|
14132
14157
|
})
|
|
14133
14158
|
);
|
|
14134
14159
|
|
|
14135
14160
|
// src/commands/org/remove.ts
|
|
14136
14161
|
import { Command as Command46 } from "commander";
|
|
14137
|
-
import
|
|
14162
|
+
import chalk43 from "chalk";
|
|
14138
14163
|
var removeCommand = new Command46().name("remove").description("Remove a member from the current organization").argument("<email>", "Email address of the member to remove").action(
|
|
14139
14164
|
withErrorHandler(async (email) => {
|
|
14140
14165
|
await removeOrgMember(email);
|
|
14141
|
-
console.log(
|
|
14166
|
+
console.log(chalk43.green(`\u2713 Removed ${email} from organization`));
|
|
14142
14167
|
})
|
|
14143
14168
|
);
|
|
14144
14169
|
|
|
14145
14170
|
// src/commands/org/leave.ts
|
|
14146
14171
|
import { Command as Command47 } from "commander";
|
|
14147
|
-
import
|
|
14172
|
+
import chalk44 from "chalk";
|
|
14148
14173
|
var leaveCommand = new Command47().name("leave").description("Leave the current organization").action(
|
|
14149
14174
|
withErrorHandler(async () => {
|
|
14150
14175
|
await leaveOrg();
|
|
14151
14176
|
await saveConfig({ activeOrg: void 0 });
|
|
14152
14177
|
console.log(
|
|
14153
|
-
|
|
14178
|
+
chalk44.green("\u2713 Left organization. Switched to personal org.")
|
|
14154
14179
|
);
|
|
14155
14180
|
})
|
|
14156
14181
|
);
|
|
@@ -14163,7 +14188,7 @@ import { Command as Command58 } from "commander";
|
|
|
14163
14188
|
|
|
14164
14189
|
// src/commands/agent/clone.ts
|
|
14165
14190
|
import { Command as Command49 } from "commander";
|
|
14166
|
-
import
|
|
14191
|
+
import chalk45 from "chalk";
|
|
14167
14192
|
import { mkdtempSync as mkdtempSync5 } from "fs";
|
|
14168
14193
|
import { mkdir as mkdir7, writeFile as writeFile6, readdir as readdir2, copyFile, rm as rm4 } from "fs/promises";
|
|
14169
14194
|
import { join as join10, dirname as dirname3, resolve, sep } from "path";
|
|
@@ -14194,13 +14219,13 @@ async function downloadInstructions(agentName, instructionsPath, destination) {
|
|
|
14194
14219
|
throw new Error("Invalid instructions path: path traversal detected");
|
|
14195
14220
|
}
|
|
14196
14221
|
const volumeName = getInstructionsStorageName(agentName);
|
|
14197
|
-
console.log(
|
|
14222
|
+
console.log(chalk45.dim("Downloading instructions..."));
|
|
14198
14223
|
const downloadInfo = await getStorageDownload({
|
|
14199
14224
|
name: volumeName,
|
|
14200
14225
|
type: "volume"
|
|
14201
14226
|
});
|
|
14202
14227
|
if ("empty" in downloadInfo) {
|
|
14203
|
-
console.log(
|
|
14228
|
+
console.log(chalk45.yellow("\u26A0 Instructions volume is empty"));
|
|
14204
14229
|
return false;
|
|
14205
14230
|
}
|
|
14206
14231
|
const response = await fetch(downloadInfo.url);
|
|
@@ -14215,7 +14240,7 @@ async function downloadInstructions(agentName, instructionsPath, destination) {
|
|
|
14215
14240
|
const files = await readdir2(tmpDir);
|
|
14216
14241
|
const mdFile = files.find((f) => f === "CLAUDE.md" || f === "AGENTS.md");
|
|
14217
14242
|
if (!mdFile) {
|
|
14218
|
-
console.log(
|
|
14243
|
+
console.log(chalk45.yellow("\u26A0 No instructions file found in volume"));
|
|
14219
14244
|
await rm4(tmpDir, { recursive: true, force: true });
|
|
14220
14245
|
return false;
|
|
14221
14246
|
}
|
|
@@ -14245,7 +14270,7 @@ var cloneCommand4 = new Command49().name("clone").description("Clone agent compo
|
|
|
14245
14270
|
await mkdir7(targetDir, { recursive: true });
|
|
14246
14271
|
const yamlPath = join10(targetDir, "vm0.yaml");
|
|
14247
14272
|
await writeFile6(yamlPath, yamlContent, "utf8");
|
|
14248
|
-
console.log(
|
|
14273
|
+
console.log(chalk45.green("\u2713 Created vm0.yaml"));
|
|
14249
14274
|
const agentKey = Object.keys(content.agents)[0];
|
|
14250
14275
|
const agent = agentKey ? content.agents[agentKey] : void 0;
|
|
14251
14276
|
if (agent?.instructions) {
|
|
@@ -14256,26 +14281,26 @@ var cloneCommand4 = new Command49().name("clone").description("Clone agent compo
|
|
|
14256
14281
|
targetDir
|
|
14257
14282
|
);
|
|
14258
14283
|
if (instructionsDownloaded) {
|
|
14259
|
-
console.log(
|
|
14284
|
+
console.log(chalk45.green(`\u2713 Downloaded ${agent.instructions}`));
|
|
14260
14285
|
}
|
|
14261
14286
|
} catch (error) {
|
|
14262
14287
|
console.log(
|
|
14263
|
-
|
|
14288
|
+
chalk45.yellow(
|
|
14264
14289
|
`\u26A0 Could not download instructions: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
14265
14290
|
)
|
|
14266
14291
|
);
|
|
14267
14292
|
}
|
|
14268
14293
|
}
|
|
14269
14294
|
console.log();
|
|
14270
|
-
console.log(
|
|
14271
|
-
console.log(
|
|
14272
|
-
console.log(
|
|
14295
|
+
console.log(chalk45.green(`\u2713 Successfully cloned agent: ${name}`));
|
|
14296
|
+
console.log(chalk45.dim(` Location: ${targetDir}/`));
|
|
14297
|
+
console.log(chalk45.dim(` Version: ${compose.headVersionId.slice(0, 8)}`));
|
|
14273
14298
|
})
|
|
14274
14299
|
);
|
|
14275
14300
|
|
|
14276
14301
|
// src/commands/agent/delete.ts
|
|
14277
14302
|
import { Command as Command50 } from "commander";
|
|
14278
|
-
import
|
|
14303
|
+
import chalk46 from "chalk";
|
|
14279
14304
|
var deleteCommand = new Command50().name("delete").alias("rm").description("Delete an agent").argument("<name>", "Agent name to delete").option("-y, --yes", "Skip confirmation prompt").action(
|
|
14280
14305
|
withErrorHandler(async (name, options) => {
|
|
14281
14306
|
const compose = await getComposeByName(name);
|
|
@@ -14290,7 +14315,7 @@ var deleteCommand = new Command50().name("delete").alias("rm").description("Dele
|
|
|
14290
14315
|
}
|
|
14291
14316
|
const confirmed = await promptConfirm(`Delete agent '${name}'?`, false);
|
|
14292
14317
|
if (!confirmed) {
|
|
14293
|
-
console.log(
|
|
14318
|
+
console.log(chalk46.dim("Cancelled"));
|
|
14294
14319
|
return;
|
|
14295
14320
|
}
|
|
14296
14321
|
}
|
|
@@ -14304,13 +14329,13 @@ var deleteCommand = new Command50().name("delete").alias("rm").description("Dele
|
|
|
14304
14329
|
}
|
|
14305
14330
|
throw error;
|
|
14306
14331
|
}
|
|
14307
|
-
console.log(
|
|
14332
|
+
console.log(chalk46.green(`\u2713 Agent '${name}' deleted`));
|
|
14308
14333
|
})
|
|
14309
14334
|
);
|
|
14310
14335
|
|
|
14311
14336
|
// src/commands/agent/list.ts
|
|
14312
14337
|
import { Command as Command51 } from "commander";
|
|
14313
|
-
import
|
|
14338
|
+
import chalk47 from "chalk";
|
|
14314
14339
|
var listCommand6 = new Command51().name("list").alias("ls").description("List all agent composes").action(
|
|
14315
14340
|
withErrorHandler(async () => {
|
|
14316
14341
|
const response = await httpGet("/api/agent/composes/list");
|
|
@@ -14320,19 +14345,19 @@ var listCommand6 = new Command51().name("list").alias("ls").description("List al
|
|
|
14320
14345
|
}
|
|
14321
14346
|
const data = await response.json();
|
|
14322
14347
|
if (data.composes.length === 0) {
|
|
14323
|
-
console.log(
|
|
14348
|
+
console.log(chalk47.dim("No agent composes found"));
|
|
14324
14349
|
console.log(
|
|
14325
|
-
|
|
14350
|
+
chalk47.dim(" Create one with: vm0 compose <agent-compose.yaml>")
|
|
14326
14351
|
);
|
|
14327
14352
|
return;
|
|
14328
14353
|
}
|
|
14329
|
-
const nameWidth = Math.max(4, ...data.composes.map((
|
|
14354
|
+
const nameWidth = Math.max(4, ...data.composes.map((c24) => c24.name.length));
|
|
14330
14355
|
const header = ["NAME".padEnd(nameWidth), "VERSION", "UPDATED"].join(
|
|
14331
14356
|
" "
|
|
14332
14357
|
);
|
|
14333
|
-
console.log(
|
|
14358
|
+
console.log(chalk47.dim(header));
|
|
14334
14359
|
for (const compose of data.composes) {
|
|
14335
|
-
const versionShort = compose.headVersionId ? compose.headVersionId.slice(0, 8) :
|
|
14360
|
+
const versionShort = compose.headVersionId ? compose.headVersionId.slice(0, 8) : chalk47.dim("-");
|
|
14336
14361
|
const row = [
|
|
14337
14362
|
compose.name.padEnd(nameWidth),
|
|
14338
14363
|
versionShort,
|
|
@@ -14345,7 +14370,7 @@ var listCommand6 = new Command51().name("list").alias("ls").description("List al
|
|
|
14345
14370
|
|
|
14346
14371
|
// src/commands/agent/status.ts
|
|
14347
14372
|
import { Command as Command52 } from "commander";
|
|
14348
|
-
import
|
|
14373
|
+
import chalk48 from "chalk";
|
|
14349
14374
|
|
|
14350
14375
|
// src/lib/domain/source-derivation.ts
|
|
14351
14376
|
import * as fs10 from "fs/promises";
|
|
@@ -14459,20 +14484,20 @@ function formatVariableSources(sources) {
|
|
|
14459
14484
|
if (sources.secrets.length > 0) {
|
|
14460
14485
|
console.log(` Secrets:`);
|
|
14461
14486
|
for (const secret of sources.secrets) {
|
|
14462
|
-
const sourceInfo =
|
|
14487
|
+
const sourceInfo = chalk48.dim(`(${secret.source})`);
|
|
14463
14488
|
console.log(` - ${secret.name.padEnd(20)} ${sourceInfo}`);
|
|
14464
14489
|
}
|
|
14465
14490
|
}
|
|
14466
14491
|
if (sources.vars.length > 0) {
|
|
14467
14492
|
console.log(` Vars:`);
|
|
14468
14493
|
for (const v of sources.vars) {
|
|
14469
|
-
const sourceInfo =
|
|
14494
|
+
const sourceInfo = chalk48.dim(`(${v.source})`);
|
|
14470
14495
|
console.log(` - ${v.name.padEnd(20)} ${sourceInfo}`);
|
|
14471
14496
|
}
|
|
14472
14497
|
}
|
|
14473
14498
|
}
|
|
14474
14499
|
function formatAgentDetails(agentName, agent, agentSources, volumeConfigs) {
|
|
14475
|
-
console.log(` ${
|
|
14500
|
+
console.log(` ${chalk48.cyan(agentName)}:`);
|
|
14476
14501
|
console.log(` Framework: ${agent.framework}`);
|
|
14477
14502
|
if (agent.image) {
|
|
14478
14503
|
console.log(` Image: ${agent.image}`);
|
|
@@ -14490,10 +14515,10 @@ function formatAgentDetails(agentName, agent, agentSources, volumeConfigs) {
|
|
|
14490
14515
|
}
|
|
14491
14516
|
}
|
|
14492
14517
|
function formatComposeOutput(name, versionId, content, variableSources) {
|
|
14493
|
-
console.log(
|
|
14494
|
-
console.log(
|
|
14518
|
+
console.log(chalk48.bold("Name:") + ` ${name}`);
|
|
14519
|
+
console.log(chalk48.bold("Version:") + ` ${versionId}`);
|
|
14495
14520
|
console.log();
|
|
14496
|
-
console.log(
|
|
14521
|
+
console.log(chalk48.bold("Agents:"));
|
|
14497
14522
|
for (const [agentName, agent] of Object.entries(content.agents)) {
|
|
14498
14523
|
const agentSources = variableSources?.get(agentName);
|
|
14499
14524
|
formatAgentDetails(agentName, agent, agentSources, content.volumes);
|
|
@@ -14552,7 +14577,7 @@ var statusCommand6 = new Command52().name("status").description("Show status of
|
|
|
14552
14577
|
});
|
|
14553
14578
|
} catch {
|
|
14554
14579
|
console.error(
|
|
14555
|
-
|
|
14580
|
+
chalk48.yellow(
|
|
14556
14581
|
"\u26A0 Warning: Failed to fetch skill sources, showing basic info"
|
|
14557
14582
|
)
|
|
14558
14583
|
);
|
|
@@ -14569,7 +14594,7 @@ var statusCommand6 = new Command52().name("status").description("Show status of
|
|
|
14569
14594
|
|
|
14570
14595
|
// src/commands/agent/public.ts
|
|
14571
14596
|
import { Command as Command53 } from "commander";
|
|
14572
|
-
import
|
|
14597
|
+
import chalk49 from "chalk";
|
|
14573
14598
|
var publicCommand = new Command53().name("public").description("Make an agent public (accessible to all authenticated users)").argument("<name>", "Agent name").option(
|
|
14574
14599
|
"--experimental-shared-agent",
|
|
14575
14600
|
"Enable experimental agent sharing feature"
|
|
@@ -14598,7 +14623,7 @@ var publicCommand = new Command53().name("public").description("Make an agent pu
|
|
|
14598
14623
|
if (!response.ok) {
|
|
14599
14624
|
const error = await response.json();
|
|
14600
14625
|
if (response.status === 409) {
|
|
14601
|
-
console.log(
|
|
14626
|
+
console.log(chalk49.yellow(`Agent "${name}" is already public`));
|
|
14602
14627
|
return;
|
|
14603
14628
|
}
|
|
14604
14629
|
throw new Error(
|
|
@@ -14606,11 +14631,11 @@ var publicCommand = new Command53().name("public").description("Make an agent pu
|
|
|
14606
14631
|
);
|
|
14607
14632
|
}
|
|
14608
14633
|
const fullName = `${org.slug}/${name}`;
|
|
14609
|
-
console.log(
|
|
14634
|
+
console.log(chalk49.green(`\u2713 Agent "${name}" is now public`));
|
|
14610
14635
|
console.log();
|
|
14611
14636
|
console.log("Others can now run your agent with:");
|
|
14612
14637
|
console.log(
|
|
14613
|
-
|
|
14638
|
+
chalk49.cyan(
|
|
14614
14639
|
` vm0 run ${fullName} --experimental-shared-agent "your prompt"`
|
|
14615
14640
|
)
|
|
14616
14641
|
);
|
|
@@ -14620,7 +14645,7 @@ var publicCommand = new Command53().name("public").description("Make an agent pu
|
|
|
14620
14645
|
|
|
14621
14646
|
// src/commands/agent/private.ts
|
|
14622
14647
|
import { Command as Command54 } from "commander";
|
|
14623
|
-
import
|
|
14648
|
+
import chalk50 from "chalk";
|
|
14624
14649
|
var privateCommand = new Command54().name("private").description("Make an agent private (remove public access)").argument("<name>", "Agent name").option(
|
|
14625
14650
|
"--experimental-shared-agent",
|
|
14626
14651
|
"Enable experimental agent sharing feature"
|
|
@@ -14647,21 +14672,21 @@ var privateCommand = new Command54().name("private").description("Make an agent
|
|
|
14647
14672
|
if (!response.ok) {
|
|
14648
14673
|
const error = await response.json();
|
|
14649
14674
|
if (response.status === 404) {
|
|
14650
|
-
console.log(
|
|
14675
|
+
console.log(chalk50.yellow(`Agent "${name}" is already private`));
|
|
14651
14676
|
return;
|
|
14652
14677
|
}
|
|
14653
14678
|
throw new Error(
|
|
14654
14679
|
error.error?.message || "Failed to make agent private"
|
|
14655
14680
|
);
|
|
14656
14681
|
}
|
|
14657
|
-
console.log(
|
|
14682
|
+
console.log(chalk50.green(`\u2713 Agent "${name}" is now private`));
|
|
14658
14683
|
}
|
|
14659
14684
|
)
|
|
14660
14685
|
);
|
|
14661
14686
|
|
|
14662
14687
|
// src/commands/agent/share.ts
|
|
14663
14688
|
import { Command as Command55 } from "commander";
|
|
14664
|
-
import
|
|
14689
|
+
import chalk51 from "chalk";
|
|
14665
14690
|
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(
|
|
14666
14691
|
"--experimental-shared-agent",
|
|
14667
14692
|
"Enable experimental agent sharing feature"
|
|
@@ -14691,7 +14716,7 @@ var shareCommand = new Command55().name("share").description("Share an agent wit
|
|
|
14691
14716
|
const error = await response.json();
|
|
14692
14717
|
if (response.status === 409) {
|
|
14693
14718
|
console.log(
|
|
14694
|
-
|
|
14719
|
+
chalk51.yellow(
|
|
14695
14720
|
`Agent "${name}" is already shared with ${options.email}`
|
|
14696
14721
|
)
|
|
14697
14722
|
);
|
|
@@ -14701,12 +14726,12 @@ var shareCommand = new Command55().name("share").description("Share an agent wit
|
|
|
14701
14726
|
}
|
|
14702
14727
|
const fullName = `${org.slug}/${name}`;
|
|
14703
14728
|
console.log(
|
|
14704
|
-
|
|
14729
|
+
chalk51.green(`\u2713 Agent "${name}" shared with ${options.email}`)
|
|
14705
14730
|
);
|
|
14706
14731
|
console.log();
|
|
14707
14732
|
console.log("They can now run your agent with:");
|
|
14708
14733
|
console.log(
|
|
14709
|
-
|
|
14734
|
+
chalk51.cyan(
|
|
14710
14735
|
` vm0 run ${fullName} --experimental-shared-agent "your prompt"`
|
|
14711
14736
|
)
|
|
14712
14737
|
);
|
|
@@ -14716,7 +14741,7 @@ var shareCommand = new Command55().name("share").description("Share an agent wit
|
|
|
14716
14741
|
|
|
14717
14742
|
// src/commands/agent/unshare.ts
|
|
14718
14743
|
import { Command as Command56 } from "commander";
|
|
14719
|
-
import
|
|
14744
|
+
import chalk52 from "chalk";
|
|
14720
14745
|
var unshareCommand = new Command56().name("unshare").description("Remove sharing from a user").argument("<name>", "Agent name").requiredOption("--email <email>", "Email address to unshare").option(
|
|
14721
14746
|
"--experimental-shared-agent",
|
|
14722
14747
|
"Enable experimental agent sharing feature"
|
|
@@ -14744,7 +14769,7 @@ var unshareCommand = new Command56().name("unshare").description("Remove sharing
|
|
|
14744
14769
|
const error = await response.json();
|
|
14745
14770
|
if (response.status === 404) {
|
|
14746
14771
|
console.log(
|
|
14747
|
-
|
|
14772
|
+
chalk52.yellow(
|
|
14748
14773
|
`Agent "${name}" is not shared with ${options.email}`
|
|
14749
14774
|
)
|
|
14750
14775
|
);
|
|
@@ -14753,7 +14778,7 @@ var unshareCommand = new Command56().name("unshare").description("Remove sharing
|
|
|
14753
14778
|
throw new Error(error.error?.message || "Failed to unshare agent");
|
|
14754
14779
|
}
|
|
14755
14780
|
console.log(
|
|
14756
|
-
|
|
14781
|
+
chalk52.green(`\u2713 Removed sharing of "${name}" from ${options.email}`)
|
|
14757
14782
|
);
|
|
14758
14783
|
}
|
|
14759
14784
|
)
|
|
@@ -14761,7 +14786,7 @@ var unshareCommand = new Command56().name("unshare").description("Remove sharing
|
|
|
14761
14786
|
|
|
14762
14787
|
// src/commands/agent/permission.ts
|
|
14763
14788
|
import { Command as Command57 } from "commander";
|
|
14764
|
-
import
|
|
14789
|
+
import chalk53 from "chalk";
|
|
14765
14790
|
var permissionCommand = new Command57().name("permission").description("List all permissions for an agent").argument("<name>", "Agent name").option(
|
|
14766
14791
|
"--experimental-shared-agent",
|
|
14767
14792
|
"Enable experimental agent sharing feature"
|
|
@@ -14791,16 +14816,16 @@ var permissionCommand = new Command57().name("permission").description("List all
|
|
|
14791
14816
|
}
|
|
14792
14817
|
const data = await response.json();
|
|
14793
14818
|
if (data.permissions.length === 0) {
|
|
14794
|
-
console.log(
|
|
14819
|
+
console.log(chalk53.dim("No permissions set (private agent)"));
|
|
14795
14820
|
return;
|
|
14796
14821
|
}
|
|
14797
14822
|
console.log(
|
|
14798
|
-
|
|
14823
|
+
chalk53.dim(
|
|
14799
14824
|
"TYPE EMAIL PERMISSION GRANTED"
|
|
14800
14825
|
)
|
|
14801
14826
|
);
|
|
14802
14827
|
console.log(
|
|
14803
|
-
|
|
14828
|
+
chalk53.dim(
|
|
14804
14829
|
"------- ----------------------------- ---------- ----------"
|
|
14805
14830
|
)
|
|
14806
14831
|
);
|
|
@@ -14820,7 +14845,7 @@ var agentCommand = new Command58().name("agent").description("Manage agent compo
|
|
|
14820
14845
|
|
|
14821
14846
|
// src/commands/init/index.ts
|
|
14822
14847
|
import { Command as Command59 } from "commander";
|
|
14823
|
-
import
|
|
14848
|
+
import chalk54 from "chalk";
|
|
14824
14849
|
import path17 from "path";
|
|
14825
14850
|
import { existsSync as existsSync11 } from "fs";
|
|
14826
14851
|
import { writeFile as writeFile7 } from "fs/promises";
|
|
@@ -14887,7 +14912,7 @@ var initCommand4 = new Command59().name("init").description("Initialize a new VM
|
|
|
14887
14912
|
}
|
|
14888
14913
|
);
|
|
14889
14914
|
if (name === void 0) {
|
|
14890
|
-
console.log(
|
|
14915
|
+
console.log(chalk54.dim("Cancelled"));
|
|
14891
14916
|
return;
|
|
14892
14917
|
}
|
|
14893
14918
|
agentName = name;
|
|
@@ -14901,23 +14926,23 @@ var initCommand4 = new Command59().name("init").description("Initialize a new VM
|
|
|
14901
14926
|
}
|
|
14902
14927
|
await writeFile7(VM0_YAML_FILE, generateVm0Yaml(agentName));
|
|
14903
14928
|
const vm0Status = existingFiles.includes(VM0_YAML_FILE) ? " (overwritten)" : "";
|
|
14904
|
-
console.log(
|
|
14929
|
+
console.log(chalk54.green(`\u2713 Created ${VM0_YAML_FILE}${vm0Status}`));
|
|
14905
14930
|
await writeFile7(AGENTS_MD_FILE, generateAgentsMd());
|
|
14906
14931
|
const agentsStatus = existingFiles.includes(AGENTS_MD_FILE) ? " (overwritten)" : "";
|
|
14907
|
-
console.log(
|
|
14932
|
+
console.log(chalk54.green(`\u2713 Created ${AGENTS_MD_FILE}${agentsStatus}`));
|
|
14908
14933
|
console.log();
|
|
14909
14934
|
console.log("Next steps:");
|
|
14910
14935
|
console.log(
|
|
14911
|
-
` 1. Set up model provider (one-time): ${
|
|
14936
|
+
` 1. Set up model provider (one-time): ${chalk54.cyan("vm0 model-provider setup")}`
|
|
14912
14937
|
);
|
|
14913
14938
|
console.log(
|
|
14914
|
-
` 2. Edit ${
|
|
14939
|
+
` 2. Edit ${chalk54.cyan("AGENTS.md")} to customize your agent's workflow`
|
|
14915
14940
|
);
|
|
14916
14941
|
console.log(
|
|
14917
|
-
` Or install Claude plugin: ${
|
|
14942
|
+
` Or install Claude plugin: ${chalk54.cyan(`vm0 setup-claude && claude "/vm0-agent let's build an agent"`)}`
|
|
14918
14943
|
);
|
|
14919
14944
|
console.log(
|
|
14920
|
-
` 3. Run your agent: ${
|
|
14945
|
+
` 3. Run your agent: ${chalk54.cyan(`vm0 cook "let's start working"`)}`
|
|
14921
14946
|
);
|
|
14922
14947
|
})
|
|
14923
14948
|
);
|
|
@@ -14927,7 +14952,7 @@ import { Command as Command66 } from "commander";
|
|
|
14927
14952
|
|
|
14928
14953
|
// src/commands/schedule/setup.ts
|
|
14929
14954
|
import { Command as Command60 } from "commander";
|
|
14930
|
-
import
|
|
14955
|
+
import chalk55 from "chalk";
|
|
14931
14956
|
|
|
14932
14957
|
// src/lib/domain/schedule-utils.ts
|
|
14933
14958
|
import { parse as parseYaml5 } from "yaml";
|
|
@@ -15178,7 +15203,7 @@ async function gatherFrequency(optionFrequency, existingFrequency) {
|
|
|
15178
15203
|
if (!isInteractive()) {
|
|
15179
15204
|
throw new Error("--frequency is required (daily|weekly|monthly|once|loop)");
|
|
15180
15205
|
}
|
|
15181
|
-
const defaultIndex = existingFrequency ? FREQUENCY_CHOICES.findIndex((
|
|
15206
|
+
const defaultIndex = existingFrequency ? FREQUENCY_CHOICES.findIndex((c24) => c24.value === existingFrequency) : 0;
|
|
15182
15207
|
frequency = await promptSelect(
|
|
15183
15208
|
"Schedule frequency",
|
|
15184
15209
|
FREQUENCY_CHOICES,
|
|
@@ -15203,7 +15228,7 @@ async function gatherDay(frequency, optionDay, existingDay) {
|
|
|
15203
15228
|
throw new Error("--day is required for weekly/monthly");
|
|
15204
15229
|
}
|
|
15205
15230
|
if (frequency === "weekly") {
|
|
15206
|
-
const defaultDayIndex = existingDay !== void 0 ? DAY_OF_WEEK_CHOICES.findIndex((
|
|
15231
|
+
const defaultDayIndex = existingDay !== void 0 ? DAY_OF_WEEK_CHOICES.findIndex((c24) => c24.value === existingDay) : 0;
|
|
15207
15232
|
const day2 = await promptSelect(
|
|
15208
15233
|
"Day of week",
|
|
15209
15234
|
DAY_OF_WEEK_CHOICES,
|
|
@@ -15394,7 +15419,7 @@ async function buildAndDeploy(params) {
|
|
|
15394
15419
|
}
|
|
15395
15420
|
console.log(
|
|
15396
15421
|
`
|
|
15397
|
-
Deploying schedule for agent ${
|
|
15422
|
+
Deploying schedule for agent ${chalk55.cyan(params.agentName)}...`
|
|
15398
15423
|
);
|
|
15399
15424
|
const deployResult = await deploySchedule({
|
|
15400
15425
|
name: params.scheduleName,
|
|
@@ -15411,62 +15436,62 @@ Deploying schedule for agent ${chalk54.cyan(params.agentName)}...`
|
|
|
15411
15436
|
function displayDeployResult(agentName, deployResult) {
|
|
15412
15437
|
if (deployResult.created) {
|
|
15413
15438
|
console.log(
|
|
15414
|
-
|
|
15439
|
+
chalk55.green(`\u2713 Created schedule for agent ${chalk55.cyan(agentName)}`)
|
|
15415
15440
|
);
|
|
15416
15441
|
} else {
|
|
15417
15442
|
console.log(
|
|
15418
|
-
|
|
15443
|
+
chalk55.green(`\u2713 Updated schedule for agent ${chalk55.cyan(agentName)}`)
|
|
15419
15444
|
);
|
|
15420
15445
|
}
|
|
15421
|
-
console.log(
|
|
15446
|
+
console.log(chalk55.dim(` Timezone: ${deployResult.schedule.timezone}`));
|
|
15422
15447
|
if (deployResult.schedule.triggerType === "loop" && deployResult.schedule.intervalSeconds != null) {
|
|
15423
15448
|
console.log(
|
|
15424
|
-
|
|
15449
|
+
chalk55.dim(
|
|
15425
15450
|
` Mode: Loop (interval ${deployResult.schedule.intervalSeconds}s)`
|
|
15426
15451
|
)
|
|
15427
15452
|
);
|
|
15428
15453
|
} else if (deployResult.schedule.cronExpression) {
|
|
15429
|
-
console.log(
|
|
15454
|
+
console.log(chalk55.dim(` Cron: ${deployResult.schedule.cronExpression}`));
|
|
15430
15455
|
if (deployResult.schedule.nextRunAt) {
|
|
15431
15456
|
const nextRun = formatInTimezone(
|
|
15432
15457
|
deployResult.schedule.nextRunAt,
|
|
15433
15458
|
deployResult.schedule.timezone
|
|
15434
15459
|
);
|
|
15435
|
-
console.log(
|
|
15460
|
+
console.log(chalk55.dim(` Next run: ${nextRun}`));
|
|
15436
15461
|
}
|
|
15437
15462
|
} else if (deployResult.schedule.atTime) {
|
|
15438
15463
|
const atTimeFormatted = formatInTimezone(
|
|
15439
15464
|
deployResult.schedule.atTime,
|
|
15440
15465
|
deployResult.schedule.timezone
|
|
15441
15466
|
);
|
|
15442
|
-
console.log(
|
|
15467
|
+
console.log(chalk55.dim(` At: ${atTimeFormatted}`));
|
|
15443
15468
|
}
|
|
15444
15469
|
}
|
|
15445
15470
|
async function tryEnableSchedule(scheduleName, composeId, agentName) {
|
|
15446
15471
|
try {
|
|
15447
15472
|
await enableSchedule({ name: scheduleName, composeId });
|
|
15448
15473
|
console.log(
|
|
15449
|
-
|
|
15474
|
+
chalk55.green(`\u2713 Enabled schedule for agent ${chalk55.cyan(agentName)}`)
|
|
15450
15475
|
);
|
|
15451
15476
|
} catch (error) {
|
|
15452
|
-
console.error(
|
|
15477
|
+
console.error(chalk55.yellow("\u26A0 Failed to enable schedule"));
|
|
15453
15478
|
if (error instanceof ApiRequestError) {
|
|
15454
15479
|
if (error.code === "SCHEDULE_PAST") {
|
|
15455
|
-
console.error(
|
|
15480
|
+
console.error(chalk55.dim(" Scheduled time has already passed"));
|
|
15456
15481
|
} else {
|
|
15457
|
-
console.error(
|
|
15482
|
+
console.error(chalk55.dim(` ${error.message}`));
|
|
15458
15483
|
}
|
|
15459
15484
|
} else if (error instanceof Error) {
|
|
15460
|
-
console.error(
|
|
15485
|
+
console.error(chalk55.dim(` ${error.message}`));
|
|
15461
15486
|
}
|
|
15462
15487
|
console.log(
|
|
15463
|
-
` To enable manually: ${
|
|
15488
|
+
` To enable manually: ${chalk55.cyan(`vm0 schedule enable ${agentName}`)}`
|
|
15464
15489
|
);
|
|
15465
15490
|
}
|
|
15466
15491
|
}
|
|
15467
15492
|
function showEnableHint(agentName) {
|
|
15468
15493
|
console.log();
|
|
15469
|
-
console.log(` To enable: ${
|
|
15494
|
+
console.log(` To enable: ${chalk55.cyan(`vm0 schedule enable ${agentName}`)}`);
|
|
15470
15495
|
}
|
|
15471
15496
|
async function handleScheduleEnabling(params) {
|
|
15472
15497
|
const { scheduleName, composeId, agentName, enableFlag, shouldPromptEnable } = params;
|
|
@@ -15498,7 +15523,7 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15498
15523
|
scheduleName
|
|
15499
15524
|
);
|
|
15500
15525
|
console.log(
|
|
15501
|
-
|
|
15526
|
+
chalk55.dim(
|
|
15502
15527
|
existingSchedule ? `Editing existing schedule for agent ${agentName}` : `Creating new schedule for agent ${agentName}`
|
|
15503
15528
|
)
|
|
15504
15529
|
);
|
|
@@ -15508,12 +15533,12 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15508
15533
|
defaults.frequency
|
|
15509
15534
|
);
|
|
15510
15535
|
if (!frequency) {
|
|
15511
|
-
console.log(
|
|
15536
|
+
console.log(chalk55.dim("Cancelled"));
|
|
15512
15537
|
return;
|
|
15513
15538
|
}
|
|
15514
15539
|
const timing = await gatherTiming(frequency, options, defaults);
|
|
15515
15540
|
if (!timing) {
|
|
15516
|
-
console.log(
|
|
15541
|
+
console.log(chalk55.dim("Cancelled"));
|
|
15517
15542
|
return;
|
|
15518
15543
|
}
|
|
15519
15544
|
const { day, time, atTime, intervalSeconds } = timing;
|
|
@@ -15522,7 +15547,7 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15522
15547
|
existingSchedule?.timezone
|
|
15523
15548
|
);
|
|
15524
15549
|
if (!timezone) {
|
|
15525
|
-
console.log(
|
|
15550
|
+
console.log(chalk55.dim("Cancelled"));
|
|
15526
15551
|
return;
|
|
15527
15552
|
}
|
|
15528
15553
|
const promptText_ = await gatherPromptText(
|
|
@@ -15530,7 +15555,7 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15530
15555
|
existingSchedule?.prompt
|
|
15531
15556
|
);
|
|
15532
15557
|
if (!promptText_) {
|
|
15533
|
-
console.log(
|
|
15558
|
+
console.log(chalk55.dim("Cancelled"));
|
|
15534
15559
|
return;
|
|
15535
15560
|
}
|
|
15536
15561
|
const deployResult = await buildAndDeploy({
|
|
@@ -15560,14 +15585,14 @@ var setupCommand = new Command60().name("setup").description("Create or edit a s
|
|
|
15560
15585
|
|
|
15561
15586
|
// src/commands/schedule/list.ts
|
|
15562
15587
|
import { Command as Command61 } from "commander";
|
|
15563
|
-
import
|
|
15588
|
+
import chalk56 from "chalk";
|
|
15564
15589
|
var listCommand7 = new Command61().name("list").alias("ls").description("List all schedules").action(
|
|
15565
15590
|
withErrorHandler(async () => {
|
|
15566
15591
|
const result = await listSchedules();
|
|
15567
15592
|
if (result.schedules.length === 0) {
|
|
15568
|
-
console.log(
|
|
15593
|
+
console.log(chalk56.dim("No schedules found"));
|
|
15569
15594
|
console.log(
|
|
15570
|
-
|
|
15595
|
+
chalk56.dim(" Create one with: vm0 schedule setup <agent-name>")
|
|
15571
15596
|
);
|
|
15572
15597
|
return;
|
|
15573
15598
|
}
|
|
@@ -15592,10 +15617,10 @@ var listCommand7 = new Command61().name("list").alias("ls").description("List al
|
|
|
15592
15617
|
"STATUS".padEnd(8),
|
|
15593
15618
|
"NEXT RUN"
|
|
15594
15619
|
].join(" ");
|
|
15595
|
-
console.log(
|
|
15620
|
+
console.log(chalk56.dim(header));
|
|
15596
15621
|
for (const schedule of result.schedules) {
|
|
15597
15622
|
const trigger = schedule.cronExpression ? `${schedule.cronExpression} (${schedule.timezone})` : schedule.atTime || "-";
|
|
15598
|
-
const status = schedule.enabled ?
|
|
15623
|
+
const status = schedule.enabled ? chalk56.green("enabled") : chalk56.yellow("disabled");
|
|
15599
15624
|
const nextRun = schedule.enabled ? formatRelativeTime2(schedule.nextRunAt) : "-";
|
|
15600
15625
|
const row = [
|
|
15601
15626
|
schedule.composeName.padEnd(agentWidth),
|
|
@@ -15612,47 +15637,47 @@ var listCommand7 = new Command61().name("list").alias("ls").description("List al
|
|
|
15612
15637
|
|
|
15613
15638
|
// src/commands/schedule/status.ts
|
|
15614
15639
|
import { Command as Command62 } from "commander";
|
|
15615
|
-
import
|
|
15640
|
+
import chalk57 from "chalk";
|
|
15616
15641
|
function formatDateTimeStyled(dateStr) {
|
|
15617
|
-
if (!dateStr) return
|
|
15642
|
+
if (!dateStr) return chalk57.dim("-");
|
|
15618
15643
|
const formatted = formatDateTime(dateStr);
|
|
15619
|
-
return formatted.replace(/\(([^)]+)\)$/,
|
|
15644
|
+
return formatted.replace(/\(([^)]+)\)$/, chalk57.dim("($1)"));
|
|
15620
15645
|
}
|
|
15621
15646
|
function formatTrigger(schedule) {
|
|
15622
15647
|
if (schedule.triggerType === "loop" && schedule.intervalSeconds !== null) {
|
|
15623
|
-
return `interval ${schedule.intervalSeconds}s ${
|
|
15648
|
+
return `interval ${schedule.intervalSeconds}s ${chalk57.dim("(loop)")}`;
|
|
15624
15649
|
}
|
|
15625
15650
|
if (schedule.cronExpression) {
|
|
15626
15651
|
return schedule.cronExpression;
|
|
15627
15652
|
}
|
|
15628
15653
|
if (schedule.atTime) {
|
|
15629
|
-
return `${schedule.atTime} ${
|
|
15654
|
+
return `${schedule.atTime} ${chalk57.dim("(one-time)")}`;
|
|
15630
15655
|
}
|
|
15631
|
-
return
|
|
15656
|
+
return chalk57.dim("-");
|
|
15632
15657
|
}
|
|
15633
15658
|
function formatRunStatus2(status) {
|
|
15634
15659
|
switch (status) {
|
|
15635
15660
|
case "completed":
|
|
15636
|
-
return
|
|
15661
|
+
return chalk57.green(status);
|
|
15637
15662
|
case "failed":
|
|
15638
15663
|
case "timeout":
|
|
15639
|
-
return
|
|
15664
|
+
return chalk57.red(status);
|
|
15640
15665
|
case "running":
|
|
15641
|
-
return
|
|
15666
|
+
return chalk57.cyan(status);
|
|
15642
15667
|
case "pending":
|
|
15643
|
-
return
|
|
15668
|
+
return chalk57.yellow(status);
|
|
15644
15669
|
default:
|
|
15645
15670
|
return status;
|
|
15646
15671
|
}
|
|
15647
15672
|
}
|
|
15648
15673
|
function printRunConfiguration(schedule) {
|
|
15649
|
-
const statusText = schedule.enabled ?
|
|
15674
|
+
const statusText = schedule.enabled ? chalk57.green("enabled") : chalk57.yellow("disabled");
|
|
15650
15675
|
console.log(`${"Status:".padEnd(16)}${statusText}`);
|
|
15651
15676
|
console.log(
|
|
15652
|
-
`${"Agent:".padEnd(16)}${schedule.composeName} ${
|
|
15677
|
+
`${"Agent:".padEnd(16)}${schedule.composeName} ${chalk57.dim(`(${schedule.orgSlug})`)}`
|
|
15653
15678
|
);
|
|
15654
15679
|
const promptPreview = schedule.prompt.length > 60 ? schedule.prompt.slice(0, 57) + "..." : schedule.prompt;
|
|
15655
|
-
console.log(`${"Prompt:".padEnd(16)}${
|
|
15680
|
+
console.log(`${"Prompt:".padEnd(16)}${chalk57.dim(promptPreview)}`);
|
|
15656
15681
|
if (schedule.vars && Object.keys(schedule.vars).length > 0) {
|
|
15657
15682
|
console.log(
|
|
15658
15683
|
`${"Variables:".padEnd(16)}${Object.keys(schedule.vars).join(", ")}`
|
|
@@ -15681,7 +15706,7 @@ function printTimeSchedule(schedule) {
|
|
|
15681
15706
|
);
|
|
15682
15707
|
}
|
|
15683
15708
|
if (schedule.triggerType === "loop") {
|
|
15684
|
-
const failureText = schedule.consecutiveFailures > 0 ?
|
|
15709
|
+
const failureText = schedule.consecutiveFailures > 0 ? chalk57.yellow(`${schedule.consecutiveFailures}/3`) : chalk57.dim("0/3");
|
|
15685
15710
|
console.log(`${"Failures:".padEnd(16)}${failureText}`);
|
|
15686
15711
|
}
|
|
15687
15712
|
}
|
|
@@ -15697,7 +15722,7 @@ async function printRecentRuns(name, composeId, limit) {
|
|
|
15697
15722
|
console.log();
|
|
15698
15723
|
console.log("Recent Runs:");
|
|
15699
15724
|
console.log(
|
|
15700
|
-
|
|
15725
|
+
chalk57.dim("RUN ID STATUS CREATED")
|
|
15701
15726
|
);
|
|
15702
15727
|
for (const run of runs) {
|
|
15703
15728
|
const id = run.id;
|
|
@@ -15708,7 +15733,7 @@ async function printRecentRuns(name, composeId, limit) {
|
|
|
15708
15733
|
}
|
|
15709
15734
|
} catch {
|
|
15710
15735
|
console.log();
|
|
15711
|
-
console.log(
|
|
15736
|
+
console.log(chalk57.dim("Recent Runs: (unable to fetch)"));
|
|
15712
15737
|
}
|
|
15713
15738
|
}
|
|
15714
15739
|
var statusCommand7 = new Command62().name("status").description("Show detailed status of a schedule").argument("<agent-name>", "Agent name").option(
|
|
@@ -15725,8 +15750,8 @@ var statusCommand7 = new Command62().name("status").description("Show detailed s
|
|
|
15725
15750
|
const { name, composeId } = resolved;
|
|
15726
15751
|
const schedule = await getScheduleByName({ name, composeId });
|
|
15727
15752
|
console.log();
|
|
15728
|
-
console.log(`Schedule for agent: ${
|
|
15729
|
-
console.log(
|
|
15753
|
+
console.log(`Schedule for agent: ${chalk57.cyan(agentName)}`);
|
|
15754
|
+
console.log(chalk57.dim("\u2501".repeat(50)));
|
|
15730
15755
|
printRunConfiguration(schedule);
|
|
15731
15756
|
printTimeSchedule(schedule);
|
|
15732
15757
|
const parsed = parseInt(options.limit, 10);
|
|
@@ -15742,7 +15767,7 @@ var statusCommand7 = new Command62().name("status").description("Show detailed s
|
|
|
15742
15767
|
|
|
15743
15768
|
// src/commands/schedule/delete.ts
|
|
15744
15769
|
import { Command as Command63 } from "commander";
|
|
15745
|
-
import
|
|
15770
|
+
import chalk58 from "chalk";
|
|
15746
15771
|
var deleteCommand2 = new Command63().name("delete").alias("rm").description("Delete a schedule").argument("<agent-name>", "Agent name").option(
|
|
15747
15772
|
"-n, --name <schedule-name>",
|
|
15748
15773
|
"Schedule name (required when agent has multiple schedules)"
|
|
@@ -15755,11 +15780,11 @@ var deleteCommand2 = new Command63().name("delete").alias("rm").description("Del
|
|
|
15755
15780
|
throw new Error("--yes flag is required in non-interactive mode");
|
|
15756
15781
|
}
|
|
15757
15782
|
const confirmed = await promptConfirm(
|
|
15758
|
-
`Delete schedule for agent ${
|
|
15783
|
+
`Delete schedule for agent ${chalk58.cyan(agentName)}?`,
|
|
15759
15784
|
false
|
|
15760
15785
|
);
|
|
15761
15786
|
if (!confirmed) {
|
|
15762
|
-
console.log(
|
|
15787
|
+
console.log(chalk58.dim("Cancelled"));
|
|
15763
15788
|
return;
|
|
15764
15789
|
}
|
|
15765
15790
|
}
|
|
@@ -15768,7 +15793,7 @@ var deleteCommand2 = new Command63().name("delete").alias("rm").description("Del
|
|
|
15768
15793
|
composeId: resolved.composeId
|
|
15769
15794
|
});
|
|
15770
15795
|
console.log(
|
|
15771
|
-
|
|
15796
|
+
chalk58.green(`\u2713 Deleted schedule for agent ${chalk58.cyan(agentName)}`)
|
|
15772
15797
|
);
|
|
15773
15798
|
}
|
|
15774
15799
|
)
|
|
@@ -15776,7 +15801,7 @@ var deleteCommand2 = new Command63().name("delete").alias("rm").description("Del
|
|
|
15776
15801
|
|
|
15777
15802
|
// src/commands/schedule/enable.ts
|
|
15778
15803
|
import { Command as Command64 } from "commander";
|
|
15779
|
-
import
|
|
15804
|
+
import chalk59 from "chalk";
|
|
15780
15805
|
var enableCommand = new Command64().name("enable").description("Enable a schedule").argument("<agent-name>", "Agent name").option(
|
|
15781
15806
|
"-n, --name <schedule-name>",
|
|
15782
15807
|
"Schedule name (required when agent has multiple schedules)"
|
|
@@ -15788,14 +15813,14 @@ var enableCommand = new Command64().name("enable").description("Enable a schedul
|
|
|
15788
15813
|
composeId: resolved.composeId
|
|
15789
15814
|
});
|
|
15790
15815
|
console.log(
|
|
15791
|
-
|
|
15816
|
+
chalk59.green(`\u2713 Enabled schedule for agent ${chalk59.cyan(agentName)}`)
|
|
15792
15817
|
);
|
|
15793
15818
|
})
|
|
15794
15819
|
);
|
|
15795
15820
|
|
|
15796
15821
|
// src/commands/schedule/disable.ts
|
|
15797
15822
|
import { Command as Command65 } from "commander";
|
|
15798
|
-
import
|
|
15823
|
+
import chalk60 from "chalk";
|
|
15799
15824
|
var disableCommand = new Command65().name("disable").description("Disable a schedule").argument("<agent-name>", "Agent name").option(
|
|
15800
15825
|
"-n, --name <schedule-name>",
|
|
15801
15826
|
"Schedule name (required when agent has multiple schedules)"
|
|
@@ -15807,7 +15832,7 @@ var disableCommand = new Command65().name("disable").description("Disable a sche
|
|
|
15807
15832
|
composeId: resolved.composeId
|
|
15808
15833
|
});
|
|
15809
15834
|
console.log(
|
|
15810
|
-
|
|
15835
|
+
chalk60.green(`\u2713 Disabled schedule for agent ${chalk60.cyan(agentName)}`)
|
|
15811
15836
|
);
|
|
15812
15837
|
})
|
|
15813
15838
|
);
|
|
@@ -15817,7 +15842,7 @@ var scheduleCommand = new Command66().name("schedule").description("Manage agent
|
|
|
15817
15842
|
|
|
15818
15843
|
// src/commands/usage/index.ts
|
|
15819
15844
|
import { Command as Command67 } from "commander";
|
|
15820
|
-
import
|
|
15845
|
+
import chalk61 from "chalk";
|
|
15821
15846
|
|
|
15822
15847
|
// src/lib/utils/duration-formatter.ts
|
|
15823
15848
|
function formatDuration(ms) {
|
|
@@ -15942,19 +15967,19 @@ var usageCommand = new Command67().name("usage").description("View usage statist
|
|
|
15942
15967
|
);
|
|
15943
15968
|
console.log();
|
|
15944
15969
|
console.log(
|
|
15945
|
-
|
|
15970
|
+
chalk61.bold(
|
|
15946
15971
|
`Usage Summary (${formatDateRange(usage.period.start, usage.period.end)})`
|
|
15947
15972
|
)
|
|
15948
15973
|
);
|
|
15949
15974
|
console.log();
|
|
15950
|
-
console.log(
|
|
15975
|
+
console.log(chalk61.dim("DATE RUNS RUN TIME"));
|
|
15951
15976
|
for (const day of filledDaily) {
|
|
15952
15977
|
const dateDisplay = formatDateDisplay(day.date).padEnd(10);
|
|
15953
15978
|
const runsDisplay = String(day.run_count).padStart(6);
|
|
15954
15979
|
const timeDisplay = formatDuration(day.run_time_ms);
|
|
15955
15980
|
console.log(`${dateDisplay}${runsDisplay} ${timeDisplay}`);
|
|
15956
15981
|
}
|
|
15957
|
-
console.log(
|
|
15982
|
+
console.log(chalk61.dim("\u2500".repeat(29)));
|
|
15958
15983
|
const totalRunsDisplay = String(usage.summary.total_runs).padStart(6);
|
|
15959
15984
|
const totalTimeDisplay = formatDuration(usage.summary.total_run_time_ms);
|
|
15960
15985
|
console.log(
|
|
@@ -15969,62 +15994,62 @@ import { Command as Command71 } from "commander";
|
|
|
15969
15994
|
|
|
15970
15995
|
// src/commands/secret/list.ts
|
|
15971
15996
|
import { Command as Command68 } from "commander";
|
|
15972
|
-
import
|
|
15997
|
+
import chalk62 from "chalk";
|
|
15973
15998
|
var listCommand8 = new Command68().name("list").alias("ls").description("List all secrets").action(
|
|
15974
15999
|
withErrorHandler(async () => {
|
|
15975
16000
|
const result = await listSecrets();
|
|
15976
16001
|
if (result.secrets.length === 0) {
|
|
15977
|
-
console.log(
|
|
16002
|
+
console.log(chalk62.dim("No secrets found"));
|
|
15978
16003
|
console.log();
|
|
15979
16004
|
console.log("To add a secret:");
|
|
15980
|
-
console.log(
|
|
16005
|
+
console.log(chalk62.cyan(" vm0 secret set MY_API_KEY --body <value>"));
|
|
15981
16006
|
return;
|
|
15982
16007
|
}
|
|
15983
|
-
console.log(
|
|
16008
|
+
console.log(chalk62.bold("Secrets:"));
|
|
15984
16009
|
console.log();
|
|
15985
16010
|
for (const secret of result.secrets) {
|
|
15986
16011
|
let typeIndicator = "";
|
|
15987
16012
|
let derivedLine = null;
|
|
15988
16013
|
if (secret.type === "model-provider") {
|
|
15989
|
-
typeIndicator =
|
|
16014
|
+
typeIndicator = chalk62.dim(" [model-provider]");
|
|
15990
16015
|
} else if (secret.type === "connector") {
|
|
15991
16016
|
const derived = getConnectorDerivedNames(secret.name);
|
|
15992
16017
|
if (derived) {
|
|
15993
|
-
typeIndicator =
|
|
15994
|
-
derivedLine =
|
|
16018
|
+
typeIndicator = chalk62.dim(` [${derived.connectorLabel} connector]`);
|
|
16019
|
+
derivedLine = chalk62.dim(
|
|
15995
16020
|
`Available as: ${derived.envVarNames.join(", ")}`
|
|
15996
16021
|
);
|
|
15997
16022
|
} else {
|
|
15998
|
-
typeIndicator =
|
|
16023
|
+
typeIndicator = chalk62.dim(" [connector]");
|
|
15999
16024
|
}
|
|
16000
16025
|
} else if (secret.type === "user") {
|
|
16001
16026
|
const derived = getConnectorDerivedNames(secret.name);
|
|
16002
16027
|
if (derived) {
|
|
16003
|
-
typeIndicator =
|
|
16004
|
-
derivedLine =
|
|
16028
|
+
typeIndicator = chalk62.dim(` [${derived.connectorLabel} connector]`);
|
|
16029
|
+
derivedLine = chalk62.dim(
|
|
16005
16030
|
`Available as: ${derived.envVarNames.join(", ")}`
|
|
16006
16031
|
);
|
|
16007
16032
|
}
|
|
16008
16033
|
}
|
|
16009
|
-
console.log(` ${
|
|
16034
|
+
console.log(` ${chalk62.cyan(secret.name)}${typeIndicator}`);
|
|
16010
16035
|
if (derivedLine) {
|
|
16011
16036
|
console.log(` ${derivedLine}`);
|
|
16012
16037
|
}
|
|
16013
16038
|
if (secret.description) {
|
|
16014
|
-
console.log(` ${
|
|
16039
|
+
console.log(` ${chalk62.dim(secret.description)}`);
|
|
16015
16040
|
}
|
|
16016
16041
|
console.log(
|
|
16017
|
-
` ${
|
|
16042
|
+
` ${chalk62.dim(`Updated: ${new Date(secret.updatedAt).toLocaleString()}`)}`
|
|
16018
16043
|
);
|
|
16019
16044
|
console.log();
|
|
16020
16045
|
}
|
|
16021
|
-
console.log(
|
|
16046
|
+
console.log(chalk62.dim(`Total: ${result.secrets.length} secret(s)`));
|
|
16022
16047
|
})
|
|
16023
16048
|
);
|
|
16024
16049
|
|
|
16025
16050
|
// src/commands/secret/set.ts
|
|
16026
16051
|
import { Command as Command69 } from "commander";
|
|
16027
|
-
import
|
|
16052
|
+
import chalk63 from "chalk";
|
|
16028
16053
|
var setCommand2 = new Command69().name("set").description("Create or update a secret").argument("<name>", "Secret name (uppercase, e.g., MY_API_KEY)").option(
|
|
16029
16054
|
"-b, --body <value>",
|
|
16030
16055
|
"Secret value (required in non-interactive mode)"
|
|
@@ -16064,18 +16089,18 @@ var setCommand2 = new Command69().name("set").description("Create or update a se
|
|
|
16064
16089
|
}
|
|
16065
16090
|
throw error;
|
|
16066
16091
|
}
|
|
16067
|
-
console.log(
|
|
16092
|
+
console.log(chalk63.green(`\u2713 Secret "${secret.name}" saved`));
|
|
16068
16093
|
console.log();
|
|
16069
16094
|
console.log("Use in vm0.yaml:");
|
|
16070
|
-
console.log(
|
|
16071
|
-
console.log(
|
|
16095
|
+
console.log(chalk63.cyan(` environment:`));
|
|
16096
|
+
console.log(chalk63.cyan(` ${name}: \${{ secrets.${name} }}`));
|
|
16072
16097
|
}
|
|
16073
16098
|
)
|
|
16074
16099
|
);
|
|
16075
16100
|
|
|
16076
16101
|
// src/commands/secret/delete.ts
|
|
16077
16102
|
import { Command as Command70 } from "commander";
|
|
16078
|
-
import
|
|
16103
|
+
import chalk64 from "chalk";
|
|
16079
16104
|
var deleteCommand3 = new Command70().name("delete").description("Delete a secret").argument("<name>", "Secret name to delete").option("-y, --yes", "Skip confirmation prompt").action(
|
|
16080
16105
|
withErrorHandler(async (name, options) => {
|
|
16081
16106
|
try {
|
|
@@ -16095,12 +16120,12 @@ var deleteCommand3 = new Command70().name("delete").description("Delete a secret
|
|
|
16095
16120
|
false
|
|
16096
16121
|
);
|
|
16097
16122
|
if (!confirmed) {
|
|
16098
|
-
console.log(
|
|
16123
|
+
console.log(chalk64.dim("Cancelled"));
|
|
16099
16124
|
return;
|
|
16100
16125
|
}
|
|
16101
16126
|
}
|
|
16102
16127
|
await deleteSecret(name);
|
|
16103
|
-
console.log(
|
|
16128
|
+
console.log(chalk64.green(`\u2713 Secret "${name}" deleted`));
|
|
16104
16129
|
})
|
|
16105
16130
|
);
|
|
16106
16131
|
|
|
@@ -16112,7 +16137,7 @@ import { Command as Command75 } from "commander";
|
|
|
16112
16137
|
|
|
16113
16138
|
// src/commands/variable/list.ts
|
|
16114
16139
|
import { Command as Command72 } from "commander";
|
|
16115
|
-
import
|
|
16140
|
+
import chalk65 from "chalk";
|
|
16116
16141
|
function truncateValue(value, maxLength = 60) {
|
|
16117
16142
|
if (value.length <= maxLength) {
|
|
16118
16143
|
return value;
|
|
@@ -16123,32 +16148,32 @@ var listCommand9 = new Command72().name("list").alias("ls").description("List al
|
|
|
16123
16148
|
withErrorHandler(async () => {
|
|
16124
16149
|
const result = await listVariables();
|
|
16125
16150
|
if (result.variables.length === 0) {
|
|
16126
|
-
console.log(
|
|
16151
|
+
console.log(chalk65.dim("No variables found"));
|
|
16127
16152
|
console.log();
|
|
16128
16153
|
console.log("To add a variable:");
|
|
16129
|
-
console.log(
|
|
16154
|
+
console.log(chalk65.cyan(" vm0 variable set MY_VAR <value>"));
|
|
16130
16155
|
return;
|
|
16131
16156
|
}
|
|
16132
|
-
console.log(
|
|
16157
|
+
console.log(chalk65.bold("Variables:"));
|
|
16133
16158
|
console.log();
|
|
16134
16159
|
for (const variable of result.variables) {
|
|
16135
16160
|
const displayValue = truncateValue(variable.value);
|
|
16136
|
-
console.log(` ${
|
|
16161
|
+
console.log(` ${chalk65.cyan(variable.name)} = ${displayValue}`);
|
|
16137
16162
|
if (variable.description) {
|
|
16138
|
-
console.log(` ${
|
|
16163
|
+
console.log(` ${chalk65.dim(variable.description)}`);
|
|
16139
16164
|
}
|
|
16140
16165
|
console.log(
|
|
16141
|
-
` ${
|
|
16166
|
+
` ${chalk65.dim(`Updated: ${new Date(variable.updatedAt).toLocaleString()}`)}`
|
|
16142
16167
|
);
|
|
16143
16168
|
console.log();
|
|
16144
16169
|
}
|
|
16145
|
-
console.log(
|
|
16170
|
+
console.log(chalk65.dim(`Total: ${result.variables.length} variable(s)`));
|
|
16146
16171
|
})
|
|
16147
16172
|
);
|
|
16148
16173
|
|
|
16149
16174
|
// src/commands/variable/set.ts
|
|
16150
16175
|
import { Command as Command73 } from "commander";
|
|
16151
|
-
import
|
|
16176
|
+
import chalk66 from "chalk";
|
|
16152
16177
|
var setCommand3 = new Command73().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(
|
|
16153
16178
|
withErrorHandler(
|
|
16154
16179
|
async (name, value, options) => {
|
|
@@ -16169,18 +16194,18 @@ var setCommand3 = new Command73().name("set").description("Create or update a va
|
|
|
16169
16194
|
}
|
|
16170
16195
|
throw error;
|
|
16171
16196
|
}
|
|
16172
|
-
console.log(
|
|
16197
|
+
console.log(chalk66.green(`\u2713 Variable "${variable.name}" saved`));
|
|
16173
16198
|
console.log();
|
|
16174
16199
|
console.log("Use in vm0.yaml:");
|
|
16175
|
-
console.log(
|
|
16176
|
-
console.log(
|
|
16200
|
+
console.log(chalk66.cyan(` environment:`));
|
|
16201
|
+
console.log(chalk66.cyan(` ${name}: \${{ vars.${name} }}`));
|
|
16177
16202
|
}
|
|
16178
16203
|
)
|
|
16179
16204
|
);
|
|
16180
16205
|
|
|
16181
16206
|
// src/commands/variable/delete.ts
|
|
16182
16207
|
import { Command as Command74 } from "commander";
|
|
16183
|
-
import
|
|
16208
|
+
import chalk67 from "chalk";
|
|
16184
16209
|
var deleteCommand4 = new Command74().name("delete").description("Delete a variable").argument("<name>", "Variable name to delete").option("-y, --yes", "Skip confirmation prompt").action(
|
|
16185
16210
|
withErrorHandler(async (name, options) => {
|
|
16186
16211
|
try {
|
|
@@ -16200,12 +16225,12 @@ var deleteCommand4 = new Command74().name("delete").description("Delete a variab
|
|
|
16200
16225
|
false
|
|
16201
16226
|
);
|
|
16202
16227
|
if (!confirmed) {
|
|
16203
|
-
console.log(
|
|
16228
|
+
console.log(chalk67.dim("Cancelled"));
|
|
16204
16229
|
return;
|
|
16205
16230
|
}
|
|
16206
16231
|
}
|
|
16207
16232
|
await deleteVariable(name);
|
|
16208
|
-
console.log(
|
|
16233
|
+
console.log(chalk67.green(`\u2713 Variable "${name}" deleted`));
|
|
16209
16234
|
})
|
|
16210
16235
|
);
|
|
16211
16236
|
|
|
@@ -16217,15 +16242,15 @@ import { Command as Command80 } from "commander";
|
|
|
16217
16242
|
|
|
16218
16243
|
// src/commands/model-provider/list.ts
|
|
16219
16244
|
import { Command as Command76 } from "commander";
|
|
16220
|
-
import
|
|
16245
|
+
import chalk68 from "chalk";
|
|
16221
16246
|
var listCommand10 = new Command76().name("list").alias("ls").description("List all model providers").action(
|
|
16222
16247
|
withErrorHandler(async () => {
|
|
16223
16248
|
const result = await listModelProviders();
|
|
16224
16249
|
if (result.modelProviders.length === 0) {
|
|
16225
|
-
console.log(
|
|
16250
|
+
console.log(chalk68.dim("No model providers configured"));
|
|
16226
16251
|
console.log();
|
|
16227
16252
|
console.log("To add a model provider:");
|
|
16228
|
-
console.log(
|
|
16253
|
+
console.log(chalk68.cyan(" vm0 model-provider setup"));
|
|
16229
16254
|
return;
|
|
16230
16255
|
}
|
|
16231
16256
|
const byFramework = result.modelProviders.reduce(
|
|
@@ -16239,16 +16264,16 @@ var listCommand10 = new Command76().name("list").alias("ls").description("List a
|
|
|
16239
16264
|
},
|
|
16240
16265
|
{}
|
|
16241
16266
|
);
|
|
16242
|
-
console.log(
|
|
16267
|
+
console.log(chalk68.bold("Model Providers:"));
|
|
16243
16268
|
console.log();
|
|
16244
16269
|
for (const [framework, providers] of Object.entries(byFramework)) {
|
|
16245
|
-
console.log(` ${
|
|
16270
|
+
console.log(` ${chalk68.cyan(framework)}:`);
|
|
16246
16271
|
for (const provider of providers) {
|
|
16247
|
-
const defaultTag = provider.isDefault ?
|
|
16248
|
-
const modelTag = provider.selectedModel ?
|
|
16272
|
+
const defaultTag = provider.isDefault ? chalk68.green(" (default)") : "";
|
|
16273
|
+
const modelTag = provider.selectedModel ? chalk68.dim(` [${provider.selectedModel}]`) : "";
|
|
16249
16274
|
console.log(` ${provider.type}${defaultTag}${modelTag}`);
|
|
16250
16275
|
console.log(
|
|
16251
|
-
|
|
16276
|
+
chalk68.dim(
|
|
16252
16277
|
` Updated: ${new Date(provider.updatedAt).toLocaleString()}`
|
|
16253
16278
|
)
|
|
16254
16279
|
);
|
|
@@ -16256,14 +16281,14 @@ var listCommand10 = new Command76().name("list").alias("ls").description("List a
|
|
|
16256
16281
|
console.log();
|
|
16257
16282
|
}
|
|
16258
16283
|
console.log(
|
|
16259
|
-
|
|
16284
|
+
chalk68.dim(`Total: ${result.modelProviders.length} provider(s)`)
|
|
16260
16285
|
);
|
|
16261
16286
|
})
|
|
16262
16287
|
);
|
|
16263
16288
|
|
|
16264
16289
|
// src/commands/model-provider/setup.ts
|
|
16265
16290
|
import { Command as Command77 } from "commander";
|
|
16266
|
-
import
|
|
16291
|
+
import chalk69 from "chalk";
|
|
16267
16292
|
import prompts2 from "prompts";
|
|
16268
16293
|
function validateProviderType(typeStr) {
|
|
16269
16294
|
if (!Object.keys(MODEL_PROVIDER_TYPES).includes(typeStr)) {
|
|
@@ -16447,7 +16472,7 @@ async function promptForModelSelection(type2) {
|
|
|
16447
16472
|
if (selected === "__custom__") {
|
|
16448
16473
|
const placeholder = getCustomModelPlaceholder(type2);
|
|
16449
16474
|
if (placeholder) {
|
|
16450
|
-
console.log(
|
|
16475
|
+
console.log(chalk69.dim(`Example: ${placeholder}`));
|
|
16451
16476
|
}
|
|
16452
16477
|
const customResponse = await prompts2(
|
|
16453
16478
|
{
|
|
@@ -16497,7 +16522,7 @@ async function promptForSecrets(type2, authMethod) {
|
|
|
16497
16522
|
const secrets = {};
|
|
16498
16523
|
for (const [name, fieldConfig] of Object.entries(secretsConfig)) {
|
|
16499
16524
|
if (fieldConfig.helpText) {
|
|
16500
|
-
console.log(
|
|
16525
|
+
console.log(chalk69.dim(fieldConfig.helpText));
|
|
16501
16526
|
}
|
|
16502
16527
|
const isSensitive = isSensitiveSecret(name);
|
|
16503
16528
|
const placeholder = "placeholder" in fieldConfig ? fieldConfig.placeholder : "";
|
|
@@ -16549,7 +16574,7 @@ async function handleInteractiveMode() {
|
|
|
16549
16574
|
title = `${title} \u2713`;
|
|
16550
16575
|
}
|
|
16551
16576
|
if (isExperimental) {
|
|
16552
|
-
title = `${title} ${
|
|
16577
|
+
title = `${title} ${chalk69.dim("(experimental)")}`;
|
|
16553
16578
|
}
|
|
16554
16579
|
return {
|
|
16555
16580
|
title,
|
|
@@ -16596,7 +16621,7 @@ async function handleInteractiveMode() {
|
|
|
16596
16621
|
}
|
|
16597
16622
|
const config = MODEL_PROVIDER_TYPES[type2];
|
|
16598
16623
|
console.log();
|
|
16599
|
-
console.log(
|
|
16624
|
+
console.log(chalk69.dim(config.helpText));
|
|
16600
16625
|
console.log();
|
|
16601
16626
|
if (hasAuthMethods(type2)) {
|
|
16602
16627
|
const authMethod = await promptForAuthMethod(type2);
|
|
@@ -16637,7 +16662,7 @@ async function promptSetAsDefault(type2, framework, isDefault) {
|
|
|
16637
16662
|
);
|
|
16638
16663
|
if (response.setDefault) {
|
|
16639
16664
|
await setModelProviderDefault(type2);
|
|
16640
|
-
console.log(
|
|
16665
|
+
console.log(chalk69.green(`\u2713 Default for ${framework} set to "${type2}"`));
|
|
16641
16666
|
}
|
|
16642
16667
|
}
|
|
16643
16668
|
function collectSecrets(value, previous) {
|
|
@@ -16681,11 +16706,11 @@ var setupCommand2 = new Command77().name("setup").description("Configure a model
|
|
|
16681
16706
|
const modelNote2 = provider2.selectedModel ? ` with model: ${provider2.selectedModel}` : "";
|
|
16682
16707
|
if (!hasModelSelection(input.type)) {
|
|
16683
16708
|
console.log(
|
|
16684
|
-
|
|
16709
|
+
chalk69.green(`\u2713 Model provider "${input.type}" unchanged`)
|
|
16685
16710
|
);
|
|
16686
16711
|
} else {
|
|
16687
16712
|
console.log(
|
|
16688
|
-
|
|
16713
|
+
chalk69.green(
|
|
16689
16714
|
`\u2713 Model provider "${input.type}" updated${defaultNote2}${modelNote2}`
|
|
16690
16715
|
)
|
|
16691
16716
|
);
|
|
@@ -16710,7 +16735,7 @@ var setupCommand2 = new Command77().name("setup").description("Configure a model
|
|
|
16710
16735
|
const defaultNote = provider.isDefault ? ` (default for ${provider.framework})` : "";
|
|
16711
16736
|
const modelNote = provider.selectedModel ? ` with model: ${provider.selectedModel}` : "";
|
|
16712
16737
|
console.log(
|
|
16713
|
-
|
|
16738
|
+
chalk69.green(
|
|
16714
16739
|
`\u2713 Model provider "${input.type}" ${action}${defaultNote}${modelNote}`
|
|
16715
16740
|
)
|
|
16716
16741
|
);
|
|
@@ -16727,7 +16752,7 @@ var setupCommand2 = new Command77().name("setup").description("Configure a model
|
|
|
16727
16752
|
|
|
16728
16753
|
// src/commands/model-provider/delete.ts
|
|
16729
16754
|
import { Command as Command78 } from "commander";
|
|
16730
|
-
import
|
|
16755
|
+
import chalk70 from "chalk";
|
|
16731
16756
|
var deleteCommand5 = new Command78().name("delete").description("Delete a model provider").argument("<type>", "Model provider type to delete").action(
|
|
16732
16757
|
withErrorHandler(async (type2) => {
|
|
16733
16758
|
if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type2)) {
|
|
@@ -16737,13 +16762,13 @@ var deleteCommand5 = new Command78().name("delete").description("Delete a model
|
|
|
16737
16762
|
});
|
|
16738
16763
|
}
|
|
16739
16764
|
await deleteModelProvider(type2);
|
|
16740
|
-
console.log(
|
|
16765
|
+
console.log(chalk70.green(`\u2713 Model provider "${type2}" deleted`));
|
|
16741
16766
|
})
|
|
16742
16767
|
);
|
|
16743
16768
|
|
|
16744
16769
|
// src/commands/model-provider/set-default.ts
|
|
16745
16770
|
import { Command as Command79 } from "commander";
|
|
16746
|
-
import
|
|
16771
|
+
import chalk71 from "chalk";
|
|
16747
16772
|
var setDefaultCommand = new Command79().name("set-default").description("Set a model provider as default for its framework").argument("<type>", "Model provider type to set as default").action(
|
|
16748
16773
|
withErrorHandler(async (type2) => {
|
|
16749
16774
|
if (!Object.keys(MODEL_PROVIDER_TYPES).includes(type2)) {
|
|
@@ -16754,7 +16779,7 @@ var setDefaultCommand = new Command79().name("set-default").description("Set a m
|
|
|
16754
16779
|
}
|
|
16755
16780
|
const provider = await setModelProviderDefault(type2);
|
|
16756
16781
|
console.log(
|
|
16757
|
-
|
|
16782
|
+
chalk71.green(
|
|
16758
16783
|
`\u2713 Default for ${provider.framework} set to "${provider.type}"`
|
|
16759
16784
|
)
|
|
16760
16785
|
);
|
|
@@ -16769,7 +16794,7 @@ import { Command as Command85 } from "commander";
|
|
|
16769
16794
|
|
|
16770
16795
|
// src/commands/connector/connect.ts
|
|
16771
16796
|
import { Command as Command81 } from "commander";
|
|
16772
|
-
import
|
|
16797
|
+
import chalk73 from "chalk";
|
|
16773
16798
|
import { initClient as initClient13 } from "@ts-rest/core";
|
|
16774
16799
|
|
|
16775
16800
|
// src/commands/connector/lib/computer/start-services.ts
|
|
@@ -16778,7 +16803,7 @@ import { access as access2, constants } from "fs/promises";
|
|
|
16778
16803
|
import { createServer } from "net";
|
|
16779
16804
|
import { homedir as homedir4 } from "os";
|
|
16780
16805
|
import { join as join12 } from "path";
|
|
16781
|
-
import
|
|
16806
|
+
import chalk72 from "chalk";
|
|
16782
16807
|
|
|
16783
16808
|
// src/commands/connector/lib/computer/ngrok.ts
|
|
16784
16809
|
import ngrok from "@ngrok/ngrok";
|
|
@@ -16852,7 +16877,7 @@ async function checkComputerDependencies() {
|
|
|
16852
16877
|
}
|
|
16853
16878
|
}
|
|
16854
16879
|
async function startComputerServices(credentials) {
|
|
16855
|
-
console.log(
|
|
16880
|
+
console.log(chalk72.cyan("Starting computer connector services..."));
|
|
16856
16881
|
const wsgidavBinary = await findBinary("wsgidav");
|
|
16857
16882
|
if (!wsgidavBinary) {
|
|
16858
16883
|
throw new Error(
|
|
@@ -16879,7 +16904,7 @@ async function startComputerServices(credentials) {
|
|
|
16879
16904
|
);
|
|
16880
16905
|
wsgidav.stdout?.on("data", (data) => process.stdout.write(data));
|
|
16881
16906
|
wsgidav.stderr?.on("data", (data) => process.stderr.write(data));
|
|
16882
|
-
console.log(
|
|
16907
|
+
console.log(chalk72.green("\u2713 WebDAV server started"));
|
|
16883
16908
|
const chrome = spawn2(
|
|
16884
16909
|
chromeBinary,
|
|
16885
16910
|
[
|
|
@@ -16893,7 +16918,7 @@ async function startComputerServices(credentials) {
|
|
|
16893
16918
|
);
|
|
16894
16919
|
chrome.stdout?.on("data", (data) => process.stdout.write(data));
|
|
16895
16920
|
chrome.stderr?.on("data", (data) => process.stderr.write(data));
|
|
16896
|
-
console.log(
|
|
16921
|
+
console.log(chalk72.green("\u2713 Chrome started"));
|
|
16897
16922
|
try {
|
|
16898
16923
|
await startNgrokTunnels(
|
|
16899
16924
|
credentials.ngrokToken,
|
|
@@ -16902,18 +16927,18 @@ async function startComputerServices(credentials) {
|
|
|
16902
16927
|
cdpPort
|
|
16903
16928
|
);
|
|
16904
16929
|
console.log(
|
|
16905
|
-
|
|
16930
|
+
chalk72.green(
|
|
16906
16931
|
`\u2713 ngrok tunnels: webdav.${credentials.domain}, chrome.${credentials.domain}`
|
|
16907
16932
|
)
|
|
16908
16933
|
);
|
|
16909
16934
|
console.log();
|
|
16910
|
-
console.log(
|
|
16935
|
+
console.log(chalk72.green("\u2713 Computer connector active"));
|
|
16911
16936
|
console.log(` WebDAV: ~/Downloads \u2192 webdav.${credentials.domain}`);
|
|
16912
16937
|
console.log(
|
|
16913
16938
|
` Chrome CDP: port ${cdpPort} \u2192 chrome.${credentials.domain}`
|
|
16914
16939
|
);
|
|
16915
16940
|
console.log();
|
|
16916
|
-
console.log(
|
|
16941
|
+
console.log(chalk72.dim("Press ^C twice to disconnect"));
|
|
16917
16942
|
console.log();
|
|
16918
16943
|
let sigintCount = 0;
|
|
16919
16944
|
await new Promise((resolve2) => {
|
|
@@ -16927,7 +16952,7 @@ async function startComputerServices(credentials) {
|
|
|
16927
16952
|
const onSigint = () => {
|
|
16928
16953
|
sigintCount++;
|
|
16929
16954
|
if (sigintCount === 1) {
|
|
16930
|
-
console.log(
|
|
16955
|
+
console.log(chalk72.dim("\nPress ^C again to disconnect and exit..."));
|
|
16931
16956
|
} else {
|
|
16932
16957
|
done();
|
|
16933
16958
|
}
|
|
@@ -16937,11 +16962,11 @@ async function startComputerServices(credentials) {
|
|
|
16937
16962
|
});
|
|
16938
16963
|
} finally {
|
|
16939
16964
|
console.log();
|
|
16940
|
-
console.log(
|
|
16965
|
+
console.log(chalk72.cyan("Stopping services..."));
|
|
16941
16966
|
wsgidav.kill("SIGTERM");
|
|
16942
16967
|
chrome.kill("SIGTERM");
|
|
16943
16968
|
await stopNgrokTunnels();
|
|
16944
|
-
console.log(
|
|
16969
|
+
console.log(chalk72.green("\u2713 Services stopped"));
|
|
16945
16970
|
}
|
|
16946
16971
|
}
|
|
16947
16972
|
|
|
@@ -16966,10 +16991,10 @@ async function getHeaders2() {
|
|
|
16966
16991
|
function renderHelpText(text) {
|
|
16967
16992
|
return text.replace(
|
|
16968
16993
|
/\[([^\]]+)\]\(([^)]+)\)/g,
|
|
16969
|
-
(_m, label, url) => `${label} (${
|
|
16970
|
-
).replace(/\*\*([^*]+)\*\*/g, (_m, content) =>
|
|
16994
|
+
(_m, label, url) => `${label} (${chalk73.cyan(url)})`
|
|
16995
|
+
).replace(/\*\*([^*]+)\*\*/g, (_m, content) => chalk73.bold(content)).replace(
|
|
16971
16996
|
/^> (.+)$/gm,
|
|
16972
|
-
(_m, content) =>
|
|
16997
|
+
(_m, content) => chalk73.yellow(` ${content}`)
|
|
16973
16998
|
);
|
|
16974
16999
|
}
|
|
16975
17000
|
async function connectViaApiToken(connectorType, tokenValue) {
|
|
@@ -16994,7 +17019,7 @@ async function connectViaApiToken(connectorType, tokenValue) {
|
|
|
16994
17019
|
for (const [secretName, secretConfig] of secretEntries) {
|
|
16995
17020
|
if (!secretConfig.required) continue;
|
|
16996
17021
|
const value = await promptPassword(
|
|
16997
|
-
`${secretConfig.label}${secretConfig.placeholder ?
|
|
17022
|
+
`${secretConfig.label}${secretConfig.placeholder ? chalk73.dim(` (${secretConfig.placeholder})`) : ""}:`
|
|
16998
17023
|
);
|
|
16999
17024
|
if (!value) {
|
|
17000
17025
|
throw new Error("Cancelled");
|
|
@@ -17010,13 +17035,13 @@ async function connectViaApiToken(connectorType, tokenValue) {
|
|
|
17010
17035
|
});
|
|
17011
17036
|
}
|
|
17012
17037
|
console.log(
|
|
17013
|
-
|
|
17038
|
+
chalk73.green(`
|
|
17014
17039
|
\u2713 ${config.label} connected successfully via API token!`)
|
|
17015
17040
|
);
|
|
17016
17041
|
}
|
|
17017
17042
|
async function connectComputer(apiUrl, headers) {
|
|
17018
17043
|
await checkComputerDependencies();
|
|
17019
|
-
console.log(
|
|
17044
|
+
console.log(chalk73.cyan("Setting up computer connector..."));
|
|
17020
17045
|
const computerClient = initClient13(computerConnectorContract, {
|
|
17021
17046
|
baseUrl: apiUrl,
|
|
17022
17047
|
baseHeaders: headers,
|
|
@@ -17031,9 +17056,9 @@ async function connectComputer(apiUrl, headers) {
|
|
|
17031
17056
|
}
|
|
17032
17057
|
const credentials = createResult.body;
|
|
17033
17058
|
await startComputerServices(credentials);
|
|
17034
|
-
console.log(
|
|
17059
|
+
console.log(chalk73.cyan("Disconnecting computer connector..."));
|
|
17035
17060
|
await deleteConnector("computer");
|
|
17036
|
-
console.log(
|
|
17061
|
+
console.log(chalk73.green("\u2713 Disconnected computer"));
|
|
17037
17062
|
process.exit(0);
|
|
17038
17063
|
}
|
|
17039
17064
|
async function resolveAuthMethod(connectorType, tokenFlag) {
|
|
@@ -17072,7 +17097,7 @@ async function resolveAuthMethod(connectorType, tokenFlag) {
|
|
|
17072
17097
|
);
|
|
17073
17098
|
}
|
|
17074
17099
|
async function connectViaOAuth(connectorType, apiUrl, headers) {
|
|
17075
|
-
console.log(`Connecting ${
|
|
17100
|
+
console.log(`Connecting ${chalk73.cyan(connectorType)}...`);
|
|
17076
17101
|
const sessionsClient = initClient13(connectorSessionsContract, {
|
|
17077
17102
|
baseUrl: apiUrl,
|
|
17078
17103
|
baseHeaders: headers,
|
|
@@ -17088,8 +17113,8 @@ async function connectViaOAuth(connectorType, apiUrl, headers) {
|
|
|
17088
17113
|
}
|
|
17089
17114
|
const session = createResult.body;
|
|
17090
17115
|
const verificationUrl = `${apiUrl}${session.verificationUrl}`;
|
|
17091
|
-
console.log(
|
|
17092
|
-
console.log(
|
|
17116
|
+
console.log(chalk73.green("\nSession created"));
|
|
17117
|
+
console.log(chalk73.cyan(`
|
|
17093
17118
|
To connect, visit: ${verificationUrl}`));
|
|
17094
17119
|
console.log(
|
|
17095
17120
|
`
|
|
@@ -17121,7 +17146,7 @@ The session expires in ${Math.floor(session.expiresIn / 60)} minutes.`
|
|
|
17121
17146
|
switch (status.status) {
|
|
17122
17147
|
case "complete":
|
|
17123
17148
|
console.log(
|
|
17124
|
-
|
|
17149
|
+
chalk73.green(`
|
|
17125
17150
|
|
|
17126
17151
|
${connectorType} connected successfully!`)
|
|
17127
17152
|
);
|
|
@@ -17133,7 +17158,7 @@ ${connectorType} connected successfully!`)
|
|
|
17133
17158
|
`Connection failed: ${status.errorMessage || "Unknown error"}`
|
|
17134
17159
|
);
|
|
17135
17160
|
case "pending":
|
|
17136
|
-
process.stdout.write(
|
|
17161
|
+
process.stdout.write(chalk73.dim("."));
|
|
17137
17162
|
break;
|
|
17138
17163
|
}
|
|
17139
17164
|
}
|
|
@@ -17165,11 +17190,11 @@ var connectCommand = new Command81().name("connect").description("Connect a thir
|
|
|
17165
17190
|
|
|
17166
17191
|
// src/commands/connector/list.ts
|
|
17167
17192
|
import { Command as Command82 } from "commander";
|
|
17168
|
-
import
|
|
17193
|
+
import chalk74 from "chalk";
|
|
17169
17194
|
var listCommand11 = new Command82().name("list").alias("ls").description("List all connectors and their status").action(
|
|
17170
17195
|
withErrorHandler(async () => {
|
|
17171
17196
|
const result = await listConnectors();
|
|
17172
|
-
const connectedMap = new Map(result.connectors.map((
|
|
17197
|
+
const connectedMap = new Map(result.connectors.map((c24) => [c24.type, c24]));
|
|
17173
17198
|
const allTypesRaw = Object.keys(CONNECTOR_TYPES);
|
|
17174
17199
|
const allTypes = [];
|
|
17175
17200
|
for (const type2 of allTypesRaw) {
|
|
@@ -17188,23 +17213,23 @@ var listCommand11 = new Command82().name("list").alias("ls").description("List a
|
|
|
17188
17213
|
statusText.padEnd(statusWidth),
|
|
17189
17214
|
"ACCOUNT"
|
|
17190
17215
|
].join(" ");
|
|
17191
|
-
console.log(
|
|
17216
|
+
console.log(chalk74.dim(header));
|
|
17192
17217
|
for (const type2 of allTypes) {
|
|
17193
17218
|
const connector = connectedMap.get(type2);
|
|
17194
|
-
const status = connector ?
|
|
17195
|
-
const account = connector?.externalUsername ? `@${connector.externalUsername}` :
|
|
17219
|
+
const status = connector ? chalk74.green("\u2713".padEnd(statusWidth)) : chalk74.dim("-".padEnd(statusWidth));
|
|
17220
|
+
const account = connector?.externalUsername ? `@${connector.externalUsername}` : chalk74.dim("-");
|
|
17196
17221
|
const row = [type2.padEnd(typeWidth), status, account].join(" ");
|
|
17197
17222
|
console.log(row);
|
|
17198
17223
|
}
|
|
17199
17224
|
console.log();
|
|
17200
|
-
console.log(
|
|
17201
|
-
console.log(
|
|
17225
|
+
console.log(chalk74.dim("To connect a service:"));
|
|
17226
|
+
console.log(chalk74.dim(" vm0 connector connect <type>"));
|
|
17202
17227
|
})
|
|
17203
17228
|
);
|
|
17204
17229
|
|
|
17205
17230
|
// src/commands/connector/status.ts
|
|
17206
17231
|
import { Command as Command83 } from "commander";
|
|
17207
|
-
import
|
|
17232
|
+
import chalk75 from "chalk";
|
|
17208
17233
|
var LABEL_WIDTH = 16;
|
|
17209
17234
|
var statusCommand8 = new Command83().name("status").description("Show detailed status of a connector").argument("<type>", "Connector type (e.g., github)").action(
|
|
17210
17235
|
withErrorHandler(async (type2) => {
|
|
@@ -17216,11 +17241,11 @@ var statusCommand8 = new Command83().name("status").description("Show detailed s
|
|
|
17216
17241
|
});
|
|
17217
17242
|
}
|
|
17218
17243
|
const connector = await getConnector(parseResult.data);
|
|
17219
|
-
console.log(`Connector: ${
|
|
17244
|
+
console.log(`Connector: ${chalk75.cyan(type2)}`);
|
|
17220
17245
|
console.log();
|
|
17221
17246
|
if (connector) {
|
|
17222
17247
|
console.log(
|
|
17223
|
-
`${"Status:".padEnd(LABEL_WIDTH)}${
|
|
17248
|
+
`${"Status:".padEnd(LABEL_WIDTH)}${chalk75.green("connected")}`
|
|
17224
17249
|
);
|
|
17225
17250
|
console.log(
|
|
17226
17251
|
`${"Account:".padEnd(LABEL_WIDTH)}@${connector.externalUsername}`
|
|
@@ -17242,22 +17267,22 @@ var statusCommand8 = new Command83().name("status").description("Show detailed s
|
|
|
17242
17267
|
);
|
|
17243
17268
|
}
|
|
17244
17269
|
console.log();
|
|
17245
|
-
console.log(
|
|
17246
|
-
console.log(
|
|
17270
|
+
console.log(chalk75.dim("To disconnect:"));
|
|
17271
|
+
console.log(chalk75.dim(` vm0 connector disconnect ${type2}`));
|
|
17247
17272
|
} else {
|
|
17248
17273
|
console.log(
|
|
17249
|
-
`${"Status:".padEnd(LABEL_WIDTH)}${
|
|
17274
|
+
`${"Status:".padEnd(LABEL_WIDTH)}${chalk75.dim("not connected")}`
|
|
17250
17275
|
);
|
|
17251
17276
|
console.log();
|
|
17252
|
-
console.log(
|
|
17253
|
-
console.log(
|
|
17277
|
+
console.log(chalk75.dim("To connect:"));
|
|
17278
|
+
console.log(chalk75.dim(` vm0 connector connect ${type2}`));
|
|
17254
17279
|
}
|
|
17255
17280
|
})
|
|
17256
17281
|
);
|
|
17257
17282
|
|
|
17258
17283
|
// src/commands/connector/disconnect.ts
|
|
17259
17284
|
import { Command as Command84 } from "commander";
|
|
17260
|
-
import
|
|
17285
|
+
import chalk76 from "chalk";
|
|
17261
17286
|
var disconnectCommand = new Command84().name("disconnect").description("Disconnect a third-party service").argument("<type>", "Connector type to disconnect (e.g., github)").action(
|
|
17262
17287
|
withErrorHandler(async (type2) => {
|
|
17263
17288
|
const parseResult = connectorTypeSchema.safeParse(type2);
|
|
@@ -17269,7 +17294,7 @@ var disconnectCommand = new Command84().name("disconnect").description("Disconne
|
|
|
17269
17294
|
}
|
|
17270
17295
|
const connectorType = parseResult.data;
|
|
17271
17296
|
await deleteConnector(connectorType);
|
|
17272
|
-
console.log(
|
|
17297
|
+
console.log(chalk76.green(`\u2713 Disconnected ${type2}`));
|
|
17273
17298
|
})
|
|
17274
17299
|
);
|
|
17275
17300
|
|
|
@@ -17278,24 +17303,24 @@ var connectorCommand = new Command85().name("connector").description("Manage thi
|
|
|
17278
17303
|
|
|
17279
17304
|
// src/commands/onboard/index.ts
|
|
17280
17305
|
import { Command as Command86 } from "commander";
|
|
17281
|
-
import
|
|
17306
|
+
import chalk80 from "chalk";
|
|
17282
17307
|
import { mkdir as mkdir8 } from "fs/promises";
|
|
17283
17308
|
import { existsSync as existsSync12 } from "fs";
|
|
17284
17309
|
|
|
17285
17310
|
// src/lib/ui/welcome-box.ts
|
|
17286
|
-
import
|
|
17311
|
+
import chalk77 from "chalk";
|
|
17287
17312
|
var gradientColors = [
|
|
17288
|
-
|
|
17313
|
+
chalk77.hex("#FFAB5E"),
|
|
17289
17314
|
// Line 1 - lightest
|
|
17290
|
-
|
|
17315
|
+
chalk77.hex("#FF9642"),
|
|
17291
17316
|
// Line 2
|
|
17292
|
-
|
|
17317
|
+
chalk77.hex("#FF8228"),
|
|
17293
17318
|
// Line 3
|
|
17294
|
-
|
|
17319
|
+
chalk77.hex("#FF6D0A"),
|
|
17295
17320
|
// Line 4
|
|
17296
|
-
|
|
17321
|
+
chalk77.hex("#E85D00"),
|
|
17297
17322
|
// Line 5
|
|
17298
|
-
|
|
17323
|
+
chalk77.hex("#CC4E00")
|
|
17299
17324
|
// Line 6 - darkest
|
|
17300
17325
|
];
|
|
17301
17326
|
var vm0LogoLines = [
|
|
@@ -17317,15 +17342,15 @@ function renderVm0Banner() {
|
|
|
17317
17342
|
function renderOnboardWelcome() {
|
|
17318
17343
|
renderVm0Banner();
|
|
17319
17344
|
console.log(` Build agentic workflows using natural language.`);
|
|
17320
|
-
console.log(` ${
|
|
17345
|
+
console.log(` ${chalk77.dim("Currently in beta, enjoy it free")}`);
|
|
17321
17346
|
console.log(
|
|
17322
|
-
` ${
|
|
17347
|
+
` ${chalk77.dim("Star us on GitHub: https://github.com/vm0-ai/vm0")}`
|
|
17323
17348
|
);
|
|
17324
17349
|
console.log();
|
|
17325
17350
|
}
|
|
17326
17351
|
|
|
17327
17352
|
// src/lib/ui/step-runner.ts
|
|
17328
|
-
import
|
|
17353
|
+
import chalk78 from "chalk";
|
|
17329
17354
|
function createStepRunner(options = true) {
|
|
17330
17355
|
const opts = typeof options === "boolean" ? { interactive: options } : options;
|
|
17331
17356
|
const interactive = opts.interactive ?? true;
|
|
@@ -17340,25 +17365,25 @@ function createStepRunner(options = true) {
|
|
|
17340
17365
|
}
|
|
17341
17366
|
for (const [i, step] of completedSteps.entries()) {
|
|
17342
17367
|
if (step.failed) {
|
|
17343
|
-
console.log(
|
|
17368
|
+
console.log(chalk78.red(`\u2717 ${step.label}`));
|
|
17344
17369
|
} else {
|
|
17345
|
-
console.log(
|
|
17370
|
+
console.log(chalk78.green(`\u25CF ${step.label}`));
|
|
17346
17371
|
}
|
|
17347
17372
|
const isLastStep = i === completedSteps.length - 1;
|
|
17348
17373
|
if (!isLastStep || !isFinal) {
|
|
17349
|
-
console.log(
|
|
17374
|
+
console.log(chalk78.dim("\u2502"));
|
|
17350
17375
|
}
|
|
17351
17376
|
}
|
|
17352
17377
|
}
|
|
17353
17378
|
async function executeStep(label, fn, isFinal) {
|
|
17354
17379
|
let stepFailed = false;
|
|
17355
|
-
console.log(
|
|
17380
|
+
console.log(chalk78.yellow(`\u25CB ${label}`));
|
|
17356
17381
|
const ctx = {
|
|
17357
17382
|
connector() {
|
|
17358
|
-
console.log(
|
|
17383
|
+
console.log(chalk78.dim("\u2502"));
|
|
17359
17384
|
},
|
|
17360
17385
|
detail(message) {
|
|
17361
|
-
console.log(`${
|
|
17386
|
+
console.log(`${chalk78.dim("\u2502")} ${message}`);
|
|
17362
17387
|
},
|
|
17363
17388
|
async prompt(promptFn) {
|
|
17364
17389
|
return await promptFn();
|
|
@@ -17375,12 +17400,12 @@ function createStepRunner(options = true) {
|
|
|
17375
17400
|
redrawCompletedSteps(isFinal);
|
|
17376
17401
|
} else {
|
|
17377
17402
|
if (stepFailed) {
|
|
17378
|
-
console.log(
|
|
17403
|
+
console.log(chalk78.red(`\u2717 ${label}`));
|
|
17379
17404
|
} else {
|
|
17380
|
-
console.log(
|
|
17405
|
+
console.log(chalk78.green(`\u25CF ${label}`));
|
|
17381
17406
|
}
|
|
17382
17407
|
if (!isFinal) {
|
|
17383
|
-
console.log(
|
|
17408
|
+
console.log(chalk78.dim("\u2502"));
|
|
17384
17409
|
}
|
|
17385
17410
|
}
|
|
17386
17411
|
}
|
|
@@ -17540,7 +17565,7 @@ async function setupModelProvider(type2, secret, options) {
|
|
|
17540
17565
|
|
|
17541
17566
|
// src/lib/domain/onboard/claude-setup.ts
|
|
17542
17567
|
import { spawn as spawn3 } from "child_process";
|
|
17543
|
-
import
|
|
17568
|
+
import chalk79 from "chalk";
|
|
17544
17569
|
var MARKETPLACE_NAME = "vm0-skills";
|
|
17545
17570
|
var MARKETPLACE_REPO = "vm0-ai/vm0-skills";
|
|
17546
17571
|
var PLUGIN_ID = "vm0@vm0-skills";
|
|
@@ -17577,12 +17602,12 @@ async function runClaudeCommand(args, cwd) {
|
|
|
17577
17602
|
}
|
|
17578
17603
|
function handlePluginError(error, context) {
|
|
17579
17604
|
const displayContext = context ?? "Claude plugin";
|
|
17580
|
-
console.error(
|
|
17605
|
+
console.error(chalk79.red(`\u2717 Failed to install ${displayContext}`));
|
|
17581
17606
|
if (error instanceof Error) {
|
|
17582
|
-
console.error(
|
|
17607
|
+
console.error(chalk79.red(`\u2717 ${error.message}`));
|
|
17583
17608
|
}
|
|
17584
17609
|
console.error(
|
|
17585
|
-
|
|
17610
|
+
chalk79.dim("Please ensure Claude CLI is installed and accessible.")
|
|
17586
17611
|
);
|
|
17587
17612
|
process.exit(1);
|
|
17588
17613
|
}
|
|
@@ -17625,7 +17650,7 @@ async function updateMarketplace() {
|
|
|
17625
17650
|
]);
|
|
17626
17651
|
if (!result.success) {
|
|
17627
17652
|
console.warn(
|
|
17628
|
-
|
|
17653
|
+
chalk79.yellow(
|
|
17629
17654
|
`Warning: Could not update marketplace: ${result.error ?? "unknown error"}`
|
|
17630
17655
|
)
|
|
17631
17656
|
);
|
|
@@ -17671,9 +17696,9 @@ async function handleAuthentication(ctx) {
|
|
|
17671
17696
|
onInitiating: () => {
|
|
17672
17697
|
},
|
|
17673
17698
|
onDeviceCodeReady: (url, code, expiresIn) => {
|
|
17674
|
-
step.detail(`Copy code: ${
|
|
17675
|
-
step.detail(`Open: ${
|
|
17676
|
-
step.detail(
|
|
17699
|
+
step.detail(`Copy code: ${chalk80.cyan.bold(code)}`);
|
|
17700
|
+
step.detail(`Open: ${chalk80.cyan(url)}`);
|
|
17701
|
+
step.detail(chalk80.dim(`Expires in ${expiresIn} minutes`));
|
|
17677
17702
|
},
|
|
17678
17703
|
onPolling: () => {
|
|
17679
17704
|
},
|
|
@@ -17701,26 +17726,26 @@ async function handleModelProvider(ctx) {
|
|
|
17701
17726
|
const providerType = await step.prompt(
|
|
17702
17727
|
() => promptSelect(
|
|
17703
17728
|
"Select provider type:",
|
|
17704
|
-
choices.map((
|
|
17705
|
-
title:
|
|
17706
|
-
value:
|
|
17729
|
+
choices.map((c24) => ({
|
|
17730
|
+
title: c24.label,
|
|
17731
|
+
value: c24.type
|
|
17707
17732
|
}))
|
|
17708
17733
|
)
|
|
17709
17734
|
);
|
|
17710
17735
|
if (!providerType) {
|
|
17711
17736
|
process.exit(0);
|
|
17712
17737
|
}
|
|
17713
|
-
const selectedChoice = choices.find((
|
|
17738
|
+
const selectedChoice = choices.find((c24) => c24.type === providerType);
|
|
17714
17739
|
if (selectedChoice?.helpText) {
|
|
17715
17740
|
for (const line of selectedChoice.helpText.split("\n")) {
|
|
17716
|
-
step.detail(
|
|
17741
|
+
step.detail(chalk80.dim(line));
|
|
17717
17742
|
}
|
|
17718
17743
|
}
|
|
17719
17744
|
const secret = await step.prompt(
|
|
17720
17745
|
() => promptPassword(`Enter your ${selectedChoice?.secretLabel ?? "secret"}:`)
|
|
17721
17746
|
);
|
|
17722
17747
|
if (!secret) {
|
|
17723
|
-
console.log(
|
|
17748
|
+
console.log(chalk80.dim("Cancelled"));
|
|
17724
17749
|
process.exit(0);
|
|
17725
17750
|
}
|
|
17726
17751
|
let selectedModel;
|
|
@@ -17739,7 +17764,7 @@ async function handleModelProvider(ctx) {
|
|
|
17739
17764
|
() => promptSelect("Select model:", modelChoices)
|
|
17740
17765
|
);
|
|
17741
17766
|
if (modelSelection === void 0) {
|
|
17742
|
-
console.log(
|
|
17767
|
+
console.log(chalk80.dim("Cancelled"));
|
|
17743
17768
|
process.exit(0);
|
|
17744
17769
|
}
|
|
17745
17770
|
selectedModel = modelSelection === "" ? void 0 : modelSelection;
|
|
@@ -17749,7 +17774,7 @@ async function handleModelProvider(ctx) {
|
|
|
17749
17774
|
});
|
|
17750
17775
|
const modelNote = result.provider.selectedModel ? ` with model: ${result.provider.selectedModel}` : "";
|
|
17751
17776
|
step.detail(
|
|
17752
|
-
|
|
17777
|
+
chalk80.green(
|
|
17753
17778
|
`${providerType} ${result.created ? "created" : "updated"}${result.isDefault ? ` (default for ${result.framework})` : ""}${modelNote}`
|
|
17754
17779
|
)
|
|
17755
17780
|
);
|
|
@@ -17780,7 +17805,7 @@ async function handleAgentCreation(ctx) {
|
|
|
17780
17805
|
agentName = inputName;
|
|
17781
17806
|
if (existsSync12(agentName)) {
|
|
17782
17807
|
step.detail(
|
|
17783
|
-
|
|
17808
|
+
chalk80.yellow(`${agentName}/ already exists, choose another name`)
|
|
17784
17809
|
);
|
|
17785
17810
|
} else {
|
|
17786
17811
|
folderExists = false;
|
|
@@ -17801,7 +17826,7 @@ async function handleAgentCreation(ctx) {
|
|
|
17801
17826
|
}
|
|
17802
17827
|
}
|
|
17803
17828
|
await mkdir8(agentName, { recursive: true });
|
|
17804
|
-
step.detail(
|
|
17829
|
+
step.detail(chalk80.green(`Created ${agentName}/`));
|
|
17805
17830
|
});
|
|
17806
17831
|
return agentName;
|
|
17807
17832
|
}
|
|
@@ -17817,7 +17842,7 @@ async function handlePluginInstallation(ctx, agentName) {
|
|
|
17817
17842
|
shouldInstall = confirmed ?? true;
|
|
17818
17843
|
}
|
|
17819
17844
|
if (!shouldInstall) {
|
|
17820
|
-
step.detail(
|
|
17845
|
+
step.detail(chalk80.dim("Skipped"));
|
|
17821
17846
|
return;
|
|
17822
17847
|
}
|
|
17823
17848
|
const scope = "project";
|
|
@@ -17825,7 +17850,7 @@ async function handlePluginInstallation(ctx, agentName) {
|
|
|
17825
17850
|
const agentDir = `${process.cwd()}/${agentName}`;
|
|
17826
17851
|
const result = await installVm0Plugin(scope, agentDir);
|
|
17827
17852
|
step.detail(
|
|
17828
|
-
|
|
17853
|
+
chalk80.green(`Installed ${result.pluginId} (scope: ${result.scope})`)
|
|
17829
17854
|
);
|
|
17830
17855
|
pluginInstalled = true;
|
|
17831
17856
|
} catch (error) {
|
|
@@ -17836,14 +17861,14 @@ async function handlePluginInstallation(ctx, agentName) {
|
|
|
17836
17861
|
}
|
|
17837
17862
|
function printNextSteps(agentName, pluginInstalled) {
|
|
17838
17863
|
console.log();
|
|
17839
|
-
console.log(
|
|
17864
|
+
console.log(chalk80.bold("Next step:"));
|
|
17840
17865
|
console.log();
|
|
17841
17866
|
if (pluginInstalled) {
|
|
17842
17867
|
console.log(
|
|
17843
|
-
` ${
|
|
17868
|
+
` ${chalk80.cyan(`cd ${agentName} && claude "/${PRIMARY_SKILL_NAME} let's build an agent"`)}`
|
|
17844
17869
|
);
|
|
17845
17870
|
} else {
|
|
17846
|
-
console.log(` ${
|
|
17871
|
+
console.log(` ${chalk80.cyan(`cd ${agentName} && vm0 init`)}`);
|
|
17847
17872
|
}
|
|
17848
17873
|
console.log();
|
|
17849
17874
|
}
|
|
@@ -17873,20 +17898,20 @@ var onboardCommand = new Command86().name("onboard").description("Guided setup f
|
|
|
17873
17898
|
|
|
17874
17899
|
// src/commands/setup-claude/index.ts
|
|
17875
17900
|
import { Command as Command87 } from "commander";
|
|
17876
|
-
import
|
|
17901
|
+
import chalk81 from "chalk";
|
|
17877
17902
|
var setupClaudeCommand = new Command87().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(
|
|
17878
17903
|
withErrorHandler(async (options) => {
|
|
17879
|
-
console.log(
|
|
17904
|
+
console.log(chalk81.dim("Installing VM0 Claude Plugin..."));
|
|
17880
17905
|
const scope = options.scope === "user" ? "user" : "project";
|
|
17881
17906
|
const result = await installVm0Plugin(scope, options.agentDir);
|
|
17882
17907
|
console.log(
|
|
17883
|
-
|
|
17908
|
+
chalk81.green(`\u2713 Installed ${result.pluginId} (scope: ${result.scope})`)
|
|
17884
17909
|
);
|
|
17885
17910
|
console.log();
|
|
17886
17911
|
console.log("Next step:");
|
|
17887
17912
|
const cdPrefix = options.agentDir ? `cd ${options.agentDir} && ` : "";
|
|
17888
17913
|
console.log(
|
|
17889
|
-
|
|
17914
|
+
chalk81.cyan(
|
|
17890
17915
|
` ${cdPrefix}claude "/${PRIMARY_SKILL_NAME} let's build a workflow"`
|
|
17891
17916
|
)
|
|
17892
17917
|
);
|
|
@@ -17895,35 +17920,35 @@ var setupClaudeCommand = new Command87().name("setup-claude").description("Insta
|
|
|
17895
17920
|
|
|
17896
17921
|
// src/commands/dashboard/index.ts
|
|
17897
17922
|
import { Command as Command88 } from "commander";
|
|
17898
|
-
import
|
|
17923
|
+
import chalk82 from "chalk";
|
|
17899
17924
|
var dashboardCommand = new Command88().name("dashboard").description("Quick reference for common query commands").action(() => {
|
|
17900
17925
|
console.log();
|
|
17901
|
-
console.log(
|
|
17926
|
+
console.log(chalk82.bold("VM0 Dashboard"));
|
|
17902
17927
|
console.log();
|
|
17903
|
-
console.log(
|
|
17904
|
-
console.log(
|
|
17928
|
+
console.log(chalk82.bold("Agents"));
|
|
17929
|
+
console.log(chalk82.dim(" List agents: ") + "vm0 agent list");
|
|
17905
17930
|
console.log();
|
|
17906
|
-
console.log(
|
|
17907
|
-
console.log(
|
|
17908
|
-
console.log(
|
|
17931
|
+
console.log(chalk82.bold("Runs"));
|
|
17932
|
+
console.log(chalk82.dim(" Recent runs: ") + "vm0 run list");
|
|
17933
|
+
console.log(chalk82.dim(" View run logs: ") + "vm0 logs <run-id>");
|
|
17909
17934
|
console.log();
|
|
17910
|
-
console.log(
|
|
17911
|
-
console.log(
|
|
17935
|
+
console.log(chalk82.bold("Schedules"));
|
|
17936
|
+
console.log(chalk82.dim(" List schedules: ") + "vm0 schedule list");
|
|
17912
17937
|
console.log();
|
|
17913
|
-
console.log(
|
|
17914
|
-
console.log(
|
|
17915
|
-
console.log(
|
|
17916
|
-
console.log(
|
|
17938
|
+
console.log(chalk82.bold("Account"));
|
|
17939
|
+
console.log(chalk82.dim(" Usage stats: ") + "vm0 usage");
|
|
17940
|
+
console.log(chalk82.dim(" List secrets: ") + "vm0 secret list");
|
|
17941
|
+
console.log(chalk82.dim(" List variables: ") + "vm0 variable list");
|
|
17917
17942
|
console.log();
|
|
17918
17943
|
console.log(
|
|
17919
|
-
|
|
17944
|
+
chalk82.dim("Not logged in? Run: ") + chalk82.cyan("vm0 auth login")
|
|
17920
17945
|
);
|
|
17921
17946
|
console.log();
|
|
17922
17947
|
});
|
|
17923
17948
|
|
|
17924
17949
|
// src/commands/preference/index.ts
|
|
17925
17950
|
import { Command as Command89 } from "commander";
|
|
17926
|
-
import
|
|
17951
|
+
import chalk83 from "chalk";
|
|
17927
17952
|
function detectTimezone2() {
|
|
17928
17953
|
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
17929
17954
|
}
|
|
@@ -17944,15 +17969,15 @@ function parseOnOff(flag, value) {
|
|
|
17944
17969
|
);
|
|
17945
17970
|
}
|
|
17946
17971
|
function displayPreferences(prefs) {
|
|
17947
|
-
console.log(
|
|
17972
|
+
console.log(chalk83.bold("Current preferences:"));
|
|
17948
17973
|
console.log(
|
|
17949
|
-
` Timezone: ${prefs.timezone ?
|
|
17974
|
+
` Timezone: ${prefs.timezone ? chalk83.cyan(prefs.timezone) : chalk83.dim("not set")}`
|
|
17950
17975
|
);
|
|
17951
17976
|
console.log(
|
|
17952
|
-
` Email notify: ${prefs.notifyEmail ?
|
|
17977
|
+
` Email notify: ${prefs.notifyEmail ? chalk83.green("on") : chalk83.dim("off")}`
|
|
17953
17978
|
);
|
|
17954
17979
|
console.log(
|
|
17955
|
-
` Slack notify: ${prefs.notifySlack ?
|
|
17980
|
+
` Slack notify: ${prefs.notifySlack ? chalk83.green("on") : chalk83.dim("off")}`
|
|
17956
17981
|
);
|
|
17957
17982
|
}
|
|
17958
17983
|
function buildUpdates(opts) {
|
|
@@ -17982,21 +18007,21 @@ function buildUpdates(opts) {
|
|
|
17982
18007
|
function printUpdateResult(updates, result) {
|
|
17983
18008
|
if (updates.timezone !== void 0) {
|
|
17984
18009
|
console.log(
|
|
17985
|
-
|
|
17986
|
-
`Timezone set to ${
|
|
18010
|
+
chalk83.green(
|
|
18011
|
+
`Timezone set to ${chalk83.cyan(result.timezone ?? updates.timezone)}`
|
|
17987
18012
|
)
|
|
17988
18013
|
);
|
|
17989
18014
|
}
|
|
17990
18015
|
if (updates.notifyEmail !== void 0) {
|
|
17991
18016
|
console.log(
|
|
17992
|
-
|
|
18017
|
+
chalk83.green(
|
|
17993
18018
|
`Email notifications ${result.notifyEmail ? "enabled" : "disabled"}`
|
|
17994
18019
|
)
|
|
17995
18020
|
);
|
|
17996
18021
|
}
|
|
17997
18022
|
if (updates.notifySlack !== void 0) {
|
|
17998
18023
|
console.log(
|
|
17999
|
-
|
|
18024
|
+
chalk83.green(
|
|
18000
18025
|
`Slack notifications ${result.notifySlack ? "enabled" : "disabled"}`
|
|
18001
18026
|
)
|
|
18002
18027
|
);
|
|
@@ -18005,7 +18030,7 @@ function printUpdateResult(updates, result) {
|
|
|
18005
18030
|
async function interactiveSetup(prefs) {
|
|
18006
18031
|
if (!prefs.timezone) {
|
|
18007
18032
|
const detectedTz = detectTimezone2();
|
|
18008
|
-
console.log(
|
|
18033
|
+
console.log(chalk83.dim(`
|
|
18009
18034
|
System timezone detected: ${detectedTz}`));
|
|
18010
18035
|
const tz = await promptText(
|
|
18011
18036
|
"Set timezone? (enter timezone or leave empty to skip)",
|
|
@@ -18016,7 +18041,7 @@ System timezone detected: ${detectedTz}`));
|
|
|
18016
18041
|
throw new Error(`Invalid timezone: ${tz.trim()}`);
|
|
18017
18042
|
}
|
|
18018
18043
|
await updateUserPreferences({ timezone: tz.trim() });
|
|
18019
|
-
console.log(
|
|
18044
|
+
console.log(chalk83.green(`Timezone set to ${chalk83.cyan(tz.trim())}`));
|
|
18020
18045
|
}
|
|
18021
18046
|
}
|
|
18022
18047
|
if (!prefs.notifyEmail) {
|
|
@@ -18026,7 +18051,7 @@ System timezone detected: ${detectedTz}`));
|
|
|
18026
18051
|
);
|
|
18027
18052
|
if (enable) {
|
|
18028
18053
|
await updateUserPreferences({ notifyEmail: true });
|
|
18029
|
-
console.log(
|
|
18054
|
+
console.log(chalk83.green("Email notifications enabled"));
|
|
18030
18055
|
}
|
|
18031
18056
|
}
|
|
18032
18057
|
}
|
|
@@ -18045,10 +18070,10 @@ var preferenceCommand = new Command89().name("preference").description("View or
|
|
|
18045
18070
|
} else if (!prefs.timezone) {
|
|
18046
18071
|
console.log();
|
|
18047
18072
|
console.log(
|
|
18048
|
-
`To set timezone: ${
|
|
18073
|
+
`To set timezone: ${chalk83.cyan("vm0 preference --timezone <timezone>")}`
|
|
18049
18074
|
);
|
|
18050
18075
|
console.log(
|
|
18051
|
-
|
|
18076
|
+
chalk83.dim("Example: vm0 preference --timezone America/New_York")
|
|
18052
18077
|
);
|
|
18053
18078
|
}
|
|
18054
18079
|
})
|
|
@@ -18056,7 +18081,7 @@ var preferenceCommand = new Command89().name("preference").description("View or
|
|
|
18056
18081
|
|
|
18057
18082
|
// src/commands/upgrade/index.ts
|
|
18058
18083
|
import { Command as Command90 } from "commander";
|
|
18059
|
-
import
|
|
18084
|
+
import chalk84 from "chalk";
|
|
18060
18085
|
var upgradeCommand = new Command90().name("upgrade").description("Upgrade vm0 CLI to the latest version").action(
|
|
18061
18086
|
withErrorHandler(async () => {
|
|
18062
18087
|
console.log("Checking for updates...");
|
|
@@ -18064,13 +18089,13 @@ var upgradeCommand = new Command90().name("upgrade").description("Upgrade vm0 CL
|
|
|
18064
18089
|
if (latestVersion === null) {
|
|
18065
18090
|
throw new Error("Could not check for updates. Please try again later.");
|
|
18066
18091
|
}
|
|
18067
|
-
if (latestVersion === "9.
|
|
18068
|
-
console.log(
|
|
18092
|
+
if (latestVersion === "9.59.0") {
|
|
18093
|
+
console.log(chalk84.green(`\u2713 Already up to date (${"9.59.0"})`));
|
|
18069
18094
|
return;
|
|
18070
18095
|
}
|
|
18071
18096
|
console.log(
|
|
18072
|
-
|
|
18073
|
-
`Current version: ${"9.
|
|
18097
|
+
chalk84.yellow(
|
|
18098
|
+
`Current version: ${"9.59.0"} -> Latest version: ${latestVersion}`
|
|
18074
18099
|
)
|
|
18075
18100
|
);
|
|
18076
18101
|
console.log();
|
|
@@ -18078,26 +18103,26 @@ var upgradeCommand = new Command90().name("upgrade").description("Upgrade vm0 CL
|
|
|
18078
18103
|
if (!isAutoUpgradeSupported(packageManager)) {
|
|
18079
18104
|
if (packageManager === "unknown") {
|
|
18080
18105
|
console.log(
|
|
18081
|
-
|
|
18106
|
+
chalk84.yellow(
|
|
18082
18107
|
"Could not detect your package manager for auto-upgrade."
|
|
18083
18108
|
)
|
|
18084
18109
|
);
|
|
18085
18110
|
} else {
|
|
18086
18111
|
console.log(
|
|
18087
|
-
|
|
18112
|
+
chalk84.yellow(
|
|
18088
18113
|
`Auto-upgrade is not supported for ${packageManager}.`
|
|
18089
18114
|
)
|
|
18090
18115
|
);
|
|
18091
18116
|
}
|
|
18092
|
-
console.log(
|
|
18093
|
-
console.log(
|
|
18117
|
+
console.log(chalk84.yellow("Please upgrade manually:"));
|
|
18118
|
+
console.log(chalk84.cyan(` ${getManualUpgradeCommand(packageManager)}`));
|
|
18094
18119
|
return;
|
|
18095
18120
|
}
|
|
18096
18121
|
console.log(`Upgrading via ${packageManager}...`);
|
|
18097
18122
|
const success = await performUpgrade(packageManager);
|
|
18098
18123
|
if (success) {
|
|
18099
18124
|
console.log(
|
|
18100
|
-
|
|
18125
|
+
chalk84.green(`\u2713 Upgraded from ${"9.59.0"} to ${latestVersion}`)
|
|
18101
18126
|
);
|
|
18102
18127
|
return;
|
|
18103
18128
|
}
|
|
@@ -18111,7 +18136,7 @@ var upgradeCommand = new Command90().name("upgrade").description("Upgrade vm0 CL
|
|
|
18111
18136
|
|
|
18112
18137
|
// src/index.ts
|
|
18113
18138
|
var program = new Command91();
|
|
18114
|
-
program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.
|
|
18139
|
+
program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.59.0");
|
|
18115
18140
|
program.addCommand(authCommand);
|
|
18116
18141
|
program.addCommand(infoCommand);
|
|
18117
18142
|
program.addCommand(composeCommand);
|