@vm0/cli 9.70.3 → 9.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +83 -46
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -45,7 +45,7 @@ if (DSN) {
45
45
  Sentry.init({
46
46
  dsn: DSN,
47
47
  environment: process.env.SENTRY_ENVIRONMENT ?? "production",
48
- release: "9.70.3",
48
+ release: "9.71.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.70.3",
67
+ version: "9.71.0",
68
68
  command: process.argv.slice(2).join(" ")
69
69
  });
70
70
  Sentry.setContext("runtime", {
@@ -675,7 +675,7 @@ function getConfigPath() {
675
675
  return join2(homedir2(), ".vm0", "config.json");
676
676
  }
677
677
  var infoCommand = new Command6().name("info").description("Display environment and debug information").action(async () => {
678
- console.log(chalk4.bold(`VM0 CLI v${"9.70.3"}`));
678
+ console.log(chalk4.bold(`VM0 CLI v${"9.71.0"}`));
679
679
  console.log();
680
680
  const config = await loadConfig();
681
681
  const hasEnvToken = !!process.env.VM0_TOKEN;
@@ -1162,7 +1162,7 @@ var logDetailSchema = z5.object({
1162
1162
  var logsListContract = c2.router({
1163
1163
  list: {
1164
1164
  method: "GET",
1165
- path: "/api/app/logs",
1165
+ path: "/api/zero/logs",
1166
1166
  query: listQuerySchema.extend({
1167
1167
  search: z5.string().optional(),
1168
1168
  agent: z5.string().optional(),
@@ -1180,7 +1180,7 @@ var logsListContract = c2.router({
1180
1180
  var logsByIdContract = c2.router({
1181
1181
  getById: {
1182
1182
  method: "GET",
1183
- path: "/api/app/logs/:id",
1183
+ path: "/api/zero/logs/:id",
1184
1184
  headers: authHeadersSchema,
1185
1185
  pathParams: z5.object({
1186
1186
  id: z5.string().uuid("Invalid log ID")
@@ -1373,14 +1373,14 @@ var orgContract = c4.router({
1373
1373
  });
1374
1374
  var orgDefaultAgentContract = c4.router({
1375
1375
  /**
1376
- * PUT /api/orgs/default-agent?org={slug}
1376
+ * PUT /api/zero/default-agent?org={slug}
1377
1377
  * Set or unset the default agent for an org.
1378
1378
  * Only org admins can perform this action.
1379
1379
  * The agent must belong to the same org.
1380
1380
  */
1381
1381
  setDefaultAgent: {
1382
1382
  method: "PUT",
1383
- path: "/api/orgs/default-agent",
1383
+ path: "/api/zero/default-agent",
1384
1384
  headers: authHeadersSchema,
1385
1385
  query: z7.object({
1386
1386
  org: z7.string().optional()
@@ -1654,17 +1654,21 @@ var agentEventsResponseSchema = z8.object({
1654
1654
  });
1655
1655
  var networkLogEntrySchema = z8.object({
1656
1656
  timestamp: z8.string(),
1657
- mode: z8.literal("mitm").optional(),
1658
- action: z8.enum(["ALLOW", "DENY"]).optional(),
1657
+ action: z8.enum(["ALLOW", "DENY", "ERROR"]).optional(),
1659
1658
  host: z8.string().optional(),
1660
1659
  port: z8.number().optional(),
1661
- rule_matched: z8.string().nullable().optional(),
1662
1660
  method: z8.string().optional(),
1663
1661
  url: z8.string().optional(),
1664
1662
  status: z8.number().optional(),
1665
1663
  latency_ms: z8.number().optional(),
1666
1664
  request_size: z8.number().optional(),
1667
- response_size: z8.number().optional()
1665
+ response_size: z8.number().optional(),
1666
+ firewall_base: z8.string().optional(),
1667
+ firewall_name: z8.string().optional(),
1668
+ firewall_ref: z8.string().optional(),
1669
+ firewall_permission: z8.string().optional(),
1670
+ firewall_rule_match: z8.string().optional(),
1671
+ firewall_params: z8.record(z8.string(), z8.string()).optional()
1668
1672
  });
1669
1673
  var networkLogsResponseSchema = z8.object({
1670
1674
  networkLogs: z8.array(networkLogEntrySchema),
@@ -3393,7 +3397,7 @@ var chatThreadDetailSchema = z18.object({
3393
3397
  var chatThreadsContract = c14.router({
3394
3398
  create: {
3395
3399
  method: "POST",
3396
- path: "/api/chat-threads",
3400
+ path: "/api/zero/chat-threads",
3397
3401
  headers: authHeadersSchema,
3398
3402
  body: z18.object({
3399
3403
  agentComposeId: z18.string().min(1),
@@ -3407,7 +3411,7 @@ var chatThreadsContract = c14.router({
3407
3411
  },
3408
3412
  list: {
3409
3413
  method: "GET",
3410
- path: "/api/chat-threads",
3414
+ path: "/api/zero/chat-threads",
3411
3415
  headers: authHeadersSchema,
3412
3416
  query: z18.object({
3413
3417
  agentComposeId: z18.string().min(1, "agentComposeId is required")
@@ -3422,7 +3426,7 @@ var chatThreadsContract = c14.router({
3422
3426
  var chatThreadByIdContract = c14.router({
3423
3427
  get: {
3424
3428
  method: "GET",
3425
- path: "/api/chat-threads/:id",
3429
+ path: "/api/zero/chat-threads/:id",
3426
3430
  headers: authHeadersSchema,
3427
3431
  pathParams: z18.object({ id: z18.string() }),
3428
3432
  responses: {
@@ -3436,7 +3440,7 @@ var chatThreadByIdContract = c14.router({
3436
3440
  var chatThreadRunsContract = c14.router({
3437
3441
  addRun: {
3438
3442
  method: "POST",
3439
- path: "/api/chat-threads/:id/runs",
3443
+ path: "/api/zero/chat-threads/:id/runs",
3440
3444
  headers: authHeadersSchema,
3441
3445
  pathParams: z18.object({ id: z18.string() }),
3442
3446
  body: z18.object({
@@ -7768,7 +7772,7 @@ var onboardingStatusResponseSchema = z25.object({
7768
7772
  var onboardingStatusContract = c21.router({
7769
7773
  getStatus: {
7770
7774
  method: "GET",
7771
- path: "/api/onboarding/status",
7775
+ path: "/api/zero/onboarding/status",
7772
7776
  headers: authHeadersSchema,
7773
7777
  responses: {
7774
7778
  200: onboardingStatusResponseSchema,
@@ -8551,6 +8555,27 @@ var zeroVariablesContract = c34.router({
8551
8555
  }
8552
8556
  });
8553
8557
 
8558
+ // ../../packages/core/src/contracts/zero-sessions.ts
8559
+ import { z as z36 } from "zod";
8560
+ var c35 = initContract();
8561
+ var zeroSessionsByIdContract = c35.router({
8562
+ getById: {
8563
+ method: "GET",
8564
+ path: "/api/zero/sessions/:id",
8565
+ headers: authHeadersSchema,
8566
+ pathParams: z36.object({
8567
+ id: z36.string().min(1, "Session ID is required")
8568
+ }),
8569
+ responses: {
8570
+ 200: sessionResponseSchema,
8571
+ 401: apiErrorSchema,
8572
+ 403: apiErrorSchema,
8573
+ 404: apiErrorSchema
8574
+ },
8575
+ summary: "Get session by ID (zero proxy)"
8576
+ }
8577
+ });
8578
+
8554
8579
  // ../../packages/core/src/storage-names.ts
8555
8580
  function getInstructionsStorageName(agentName) {
8556
8581
  return `agent-instructions@${agentName}`;
@@ -9602,8 +9627,8 @@ async function resolveSkills(skillUrls) {
9602
9627
  }
9603
9628
 
9604
9629
  // src/lib/domain/yaml-validator.ts
9605
- import { z as z36 } from "zod";
9606
- var cliAgentNameSchema = z36.string().min(3, "Agent name must be at least 3 characters").max(64, "Agent name must be 64 characters or less").regex(
9630
+ import { z as z37 } from "zod";
9631
+ var cliAgentNameSchema = z37.string().min(3, "Agent name must be at least 3 characters").max(64, "Agent name must be 64 characters or less").regex(
9607
9632
  /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$/,
9608
9633
  "Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens"
9609
9634
  );
@@ -9617,7 +9642,7 @@ var cliAgentDefinitionSchema = agentDefinitionSchema.superRefine(
9617
9642
  resolveSkillRef(skillRef);
9618
9643
  } catch (error) {
9619
9644
  ctx.addIssue({
9620
- code: z36.ZodIssueCode.custom,
9645
+ code: z37.ZodIssueCode.custom,
9621
9646
  message: error instanceof Error ? error.message : `Invalid skill reference: ${skillRef}`,
9622
9647
  path: ["skills", i]
9623
9648
  });
@@ -9627,15 +9652,15 @@ var cliAgentDefinitionSchema = agentDefinitionSchema.superRefine(
9627
9652
  }
9628
9653
  }
9629
9654
  );
9630
- var cliComposeSchema = z36.object({
9631
- version: z36.string().min(1, "Missing config.version"),
9632
- agents: z36.record(cliAgentNameSchema, cliAgentDefinitionSchema),
9633
- volumes: z36.record(z36.string(), volumeConfigSchema).optional()
9655
+ var cliComposeSchema = z37.object({
9656
+ version: z37.string().min(1, "Missing config.version"),
9657
+ agents: z37.record(cliAgentNameSchema, cliAgentDefinitionSchema),
9658
+ volumes: z37.record(z37.string(), volumeConfigSchema).optional()
9634
9659
  }).superRefine((config, ctx) => {
9635
9660
  const agentKeys = Object.keys(config.agents);
9636
9661
  if (agentKeys.length === 0) {
9637
9662
  ctx.addIssue({
9638
- code: z36.ZodIssueCode.custom,
9663
+ code: z37.ZodIssueCode.custom,
9639
9664
  message: "agents must have at least one agent defined",
9640
9665
  path: ["agents"]
9641
9666
  });
@@ -9643,7 +9668,7 @@ var cliComposeSchema = z36.object({
9643
9668
  }
9644
9669
  if (agentKeys.length > 1) {
9645
9670
  ctx.addIssue({
9646
- code: z36.ZodIssueCode.custom,
9671
+ code: z37.ZodIssueCode.custom,
9647
9672
  message: "Multiple agents not supported yet. Only one agent allowed.",
9648
9673
  path: ["agents"]
9649
9674
  });
@@ -9655,7 +9680,7 @@ var cliComposeSchema = z36.object({
9655
9680
  if (agentVolumes && agentVolumes.length > 0) {
9656
9681
  if (!config.volumes) {
9657
9682
  ctx.addIssue({
9658
- code: z36.ZodIssueCode.custom,
9683
+ code: z37.ZodIssueCode.custom,
9659
9684
  message: "Agent references volumes but no volumes section defined. Each volume must have explicit name and version.",
9660
9685
  path: ["volumes"]
9661
9686
  });
@@ -9665,7 +9690,7 @@ var cliComposeSchema = z36.object({
9665
9690
  const parts = volDeclaration.split(":");
9666
9691
  if (parts.length !== 2) {
9667
9692
  ctx.addIssue({
9668
- code: z36.ZodIssueCode.custom,
9693
+ code: z37.ZodIssueCode.custom,
9669
9694
  message: `Invalid volume declaration: ${volDeclaration}. Expected format: volume-key:/mount/path`,
9670
9695
  path: ["agents", agentName, "volumes"]
9671
9696
  });
@@ -9674,7 +9699,7 @@ var cliComposeSchema = z36.object({
9674
9699
  const volumeKey = parts[0].trim();
9675
9700
  if (!config.volumes[volumeKey]) {
9676
9701
  ctx.addIssue({
9677
- code: z36.ZodIssueCode.custom,
9702
+ code: z37.ZodIssueCode.custom,
9678
9703
  message: `Volume "${volumeKey}" is not defined in volumes section. Each volume must have explicit name and version.`,
9679
9704
  path: ["volumes", volumeKey]
9680
9705
  });
@@ -10873,7 +10898,7 @@ var composeCommand = new Command7().name("compose").description("Create or updat
10873
10898
  options.autoUpdate = false;
10874
10899
  }
10875
10900
  if (options.autoUpdate !== false) {
10876
- await startSilentUpgrade("9.70.3");
10901
+ await startSilentUpgrade("9.71.0");
10877
10902
  }
10878
10903
  try {
10879
10904
  let result;
@@ -11698,7 +11723,7 @@ var mainRunCommand = new Command8().name("run").description("Run an agent").argu
11698
11723
  withErrorHandler(
11699
11724
  async (identifier, prompt, options) => {
11700
11725
  if (options.autoUpdate !== false) {
11701
- await startSilentUpgrade("9.70.3");
11726
+ await startSilentUpgrade("9.71.0");
11702
11727
  }
11703
11728
  const { org, name, version } = parseIdentifier(identifier);
11704
11729
  let composeId;
@@ -13436,7 +13461,7 @@ var cookAction = new Command35().name("cook").description("Quick start: prepare,
13436
13461
  withErrorHandler(
13437
13462
  async (prompt, options) => {
13438
13463
  if (options.autoUpdate !== false) {
13439
- const shouldExit = await checkAndUpgrade("9.70.3", prompt);
13464
+ const shouldExit = await checkAndUpgrade("9.71.0", prompt);
13440
13465
  if (shouldExit) {
13441
13466
  process.exit(0);
13442
13467
  }
@@ -14414,7 +14439,13 @@ function formatMetric(metric) {
14414
14439
  const diskPercent = (metric.disk_used / metric.disk_total * 100).toFixed(1);
14415
14440
  return `[${metric.ts}] CPU: ${metric.cpu.toFixed(1)}% | Mem: ${formatBytes(metric.mem_used)}/${formatBytes(metric.mem_total)} (${memPercent}%) | Disk: ${formatBytes(metric.disk_used)}/${formatBytes(metric.disk_total)} (${diskPercent}%)`;
14416
14441
  }
14417
- function formatNetworkLog(entry) {
14442
+ function formatNetworkDeny(entry) {
14443
+ const method = entry.method || "???";
14444
+ const url = entry.url || entry.host || "unknown";
14445
+ const firewall = entry.firewall_name ? ` ${chalk36.cyan(`[${entry.firewall_name}]`)}` : "";
14446
+ return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk36.red.bold("DENY")} ${chalk36.dim(url)}${firewall}`;
14447
+ }
14448
+ function formatNetworkRequest(entry) {
14418
14449
  let statusColor;
14419
14450
  const status = entry.status || 0;
14420
14451
  if (status >= 200 && status < 300) {
@@ -14439,7 +14470,13 @@ function formatNetworkLog(entry) {
14439
14470
  const requestSize = entry.request_size || 0;
14440
14471
  const responseSize = entry.response_size || 0;
14441
14472
  const url = entry.url || entry.host || "unknown";
14442
- return `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + "ms")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk36.dim(url)}`;
14473
+ const firewall = entry.firewall_name ? ` ${chalk36.cyan(`[${entry.firewall_name}]`)}` : "";
14474
+ const error = entry.action === "ERROR" ? ` ${chalk36.red("auth failed")}` : "";
14475
+ return `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + "ms")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk36.dim(url)}${firewall}${error}`;
14476
+ }
14477
+ function formatNetworkLog(entry) {
14478
+ if (entry.action === "DENY") return formatNetworkDeny(entry);
14479
+ return formatNetworkRequest(entry);
14443
14480
  }
14444
14481
  function createLogRenderer(verbose) {
14445
14482
  return new EventRenderer({
@@ -15788,7 +15825,7 @@ var listCommand9 = new Command65().name("list").alias("ls").description("List al
15788
15825
  );
15789
15826
  return;
15790
15827
  }
15791
- const nameWidth = Math.max(4, ...data.composes.map((c35) => c35.name.length));
15828
+ const nameWidth = Math.max(4, ...data.composes.map((c36) => c36.name.length));
15792
15829
  const header = ["NAME".padEnd(nameWidth), "VERSION", "UPDATED"].join(
15793
15830
  " "
15794
15831
  );
@@ -16389,7 +16426,7 @@ async function gatherFrequency(optionFrequency, existingFrequency) {
16389
16426
  if (!isInteractive()) {
16390
16427
  throw new Error("--frequency is required (daily|weekly|monthly|once|loop)");
16391
16428
  }
16392
- const defaultIndex = existingFrequency ? FREQUENCY_CHOICES.findIndex((c35) => c35.value === existingFrequency) : 0;
16429
+ const defaultIndex = existingFrequency ? FREQUENCY_CHOICES.findIndex((c36) => c36.value === existingFrequency) : 0;
16393
16430
  frequency = await promptSelect(
16394
16431
  "Schedule frequency",
16395
16432
  FREQUENCY_CHOICES,
@@ -16414,7 +16451,7 @@ async function gatherDay(frequency, optionDay, existingDay) {
16414
16451
  throw new Error("--day is required for weekly/monthly");
16415
16452
  }
16416
16453
  if (frequency === "weekly") {
16417
- const defaultDayIndex = existingDay !== void 0 ? DAY_OF_WEEK_CHOICES.findIndex((c35) => c35.value === existingDay) : 0;
16454
+ const defaultDayIndex = existingDay !== void 0 ? DAY_OF_WEEK_CHOICES.findIndex((c36) => c36.value === existingDay) : 0;
16418
16455
  const day2 = await promptSelect(
16419
16456
  "Day of week",
16420
16457
  DAY_OF_WEEK_CHOICES,
@@ -17864,7 +17901,7 @@ import chalk76 from "chalk";
17864
17901
  var listCommand13 = new Command86().name("list").alias("ls").description("List all connectors and their status").action(
17865
17902
  withErrorHandler(async () => {
17866
17903
  const result = await listConnectors();
17867
- const connectedMap = new Map(result.connectors.map((c35) => [c35.type, c35]));
17904
+ const connectedMap = new Map(result.connectors.map((c36) => [c36.type, c36]));
17868
17905
  const allTypesRaw = Object.keys(CONNECTOR_TYPES);
17869
17906
  const allTypes = [];
17870
17907
  for (const type2 of allTypesRaw) {
@@ -18425,16 +18462,16 @@ async function handleModelProvider(ctx) {
18425
18462
  const providerType = await step.prompt(
18426
18463
  () => promptSelect(
18427
18464
  "Select provider type:",
18428
- choices.map((c35) => ({
18429
- title: c35.label,
18430
- value: c35.type
18465
+ choices.map((c36) => ({
18466
+ title: c36.label,
18467
+ value: c36.type
18431
18468
  }))
18432
18469
  )
18433
18470
  );
18434
18471
  if (!providerType) {
18435
18472
  process.exit(0);
18436
18473
  }
18437
- const selectedChoice = choices.find((c35) => c35.type === providerType);
18474
+ const selectedChoice = choices.find((c36) => c36.type === providerType);
18438
18475
  if (selectedChoice?.helpText) {
18439
18476
  for (const line of selectedChoice.helpText.split("\n")) {
18440
18477
  step.detail(chalk82.dim(line));
@@ -18788,13 +18825,13 @@ var upgradeCommand = new Command94().name("upgrade").description("Upgrade vm0 CL
18788
18825
  if (latestVersion === null) {
18789
18826
  throw new Error("Could not check for updates. Please try again later.");
18790
18827
  }
18791
- if (latestVersion === "9.70.3") {
18792
- console.log(chalk86.green(`\u2713 Already up to date (${"9.70.3"})`));
18828
+ if (latestVersion === "9.71.0") {
18829
+ console.log(chalk86.green(`\u2713 Already up to date (${"9.71.0"})`));
18793
18830
  return;
18794
18831
  }
18795
18832
  console.log(
18796
18833
  chalk86.yellow(
18797
- `Current version: ${"9.70.3"} -> Latest version: ${latestVersion}`
18834
+ `Current version: ${"9.71.0"} -> Latest version: ${latestVersion}`
18798
18835
  )
18799
18836
  );
18800
18837
  console.log();
@@ -18821,7 +18858,7 @@ var upgradeCommand = new Command94().name("upgrade").description("Upgrade vm0 CL
18821
18858
  const success = await performUpgrade(packageManager);
18822
18859
  if (success) {
18823
18860
  console.log(
18824
- chalk86.green(`\u2713 Upgraded from ${"9.70.3"} to ${latestVersion}`)
18861
+ chalk86.green(`\u2713 Upgraded from ${"9.71.0"} to ${latestVersion}`)
18825
18862
  );
18826
18863
  return;
18827
18864
  }
@@ -18895,7 +18932,7 @@ var whoamiCommand = new Command95().name("whoami").description("Show current ide
18895
18932
 
18896
18933
  // src/index.ts
18897
18934
  var program = new Command96();
18898
- program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.70.3");
18935
+ program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.71.0");
18899
18936
  program.addCommand(authCommand);
18900
18937
  program.addCommand(infoCommand);
18901
18938
  program.addCommand(composeCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "9.70.3",
3
+ "version": "9.71.0",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",