@vm0/cli 9.178.0 → 9.179.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 CHANGED
@@ -67,7 +67,7 @@ import {
67
67
  source_default,
68
68
  volumeConfigSchema,
69
69
  withErrorHandler
70
- } from "./chunk-DPEOZVW6.js";
70
+ } from "./chunk-KC3JLLAV.js";
71
71
  import {
72
72
  __toESM,
73
73
  init_esm_shims
@@ -400,7 +400,7 @@ function getConfigPath() {
400
400
  return join(os.homedir(), ".vm0", "config.json");
401
401
  }
402
402
  var infoCommand = new Command().name("info").description("Display environment and debug information").action(async () => {
403
- console.log(source_default.bold(`VM0 CLI v${"9.178.0"}`));
403
+ console.log(source_default.bold(`VM0 CLI v${"9.179.0"}`));
404
404
  console.log();
405
405
  const config = await loadConfig();
406
406
  const hasEnvToken = !!process.env.VM0_TOKEN;
@@ -4293,7 +4293,7 @@ var composeCommand = new Command().name("compose").description("Create or update
4293
4293
  options.autoUpdate = false;
4294
4294
  }
4295
4295
  if (options.autoUpdate !== false) {
4296
- await startSilentUpgrade("9.178.0");
4296
+ await startSilentUpgrade("9.179.0");
4297
4297
  }
4298
4298
  try {
4299
4299
  let result;
@@ -4395,7 +4395,7 @@ var mainRunCommand = new Command().name("run").description("Run an agent").argum
4395
4395
  withErrorHandler(
4396
4396
  async (identifier, prompt, options) => {
4397
4397
  if (options.autoUpdate !== false) {
4398
- await startSilentUpgrade("9.178.0");
4398
+ await startSilentUpgrade("9.179.0");
4399
4399
  }
4400
4400
  const { name, version } = parseIdentifier(identifier);
4401
4401
  let composeId;
@@ -6192,13 +6192,13 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
6192
6192
  if (latestVersion === null) {
6193
6193
  throw new Error("Could not check for updates. Please try again later.");
6194
6194
  }
6195
- if (latestVersion === "9.178.0") {
6196
- console.log(source_default.green(`\u2713 Already up to date (${"9.178.0"})`));
6195
+ if (latestVersion === "9.179.0") {
6196
+ console.log(source_default.green(`\u2713 Already up to date (${"9.179.0"})`));
6197
6197
  return;
6198
6198
  }
6199
6199
  console.log(
6200
6200
  source_default.yellow(
6201
- `Current version: ${"9.178.0"} -> Latest version: ${latestVersion}`
6201
+ `Current version: ${"9.179.0"} -> Latest version: ${latestVersion}`
6202
6202
  )
6203
6203
  );
6204
6204
  console.log();
@@ -6225,7 +6225,7 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
6225
6225
  const success = await performUpgrade(packageManager);
6226
6226
  if (success) {
6227
6227
  console.log(
6228
- source_default.green(`\u2713 Upgraded from ${"9.178.0"} to ${latestVersion}`)
6228
+ source_default.green(`\u2713 Upgraded from ${"9.179.0"} to ${latestVersion}`)
6229
6229
  );
6230
6230
  return;
6231
6231
  }
@@ -6292,7 +6292,7 @@ var whoamiCommand = new Command().name("whoami").description("Show current ident
6292
6292
 
6293
6293
  // src/index.ts
6294
6294
  var program = new Command();
6295
- program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.178.0");
6295
+ program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.179.0");
6296
6296
  program.addCommand(authCommand);
6297
6297
  program.addCommand(infoCommand);
6298
6298
  program.addCommand(composeCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "9.178.0",
3
+ "version": "9.179.0",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",
package/zero.js CHANGED
@@ -11,6 +11,7 @@ import {
11
11
  InvalidArgumentError,
12
12
  MODEL_PROVIDER_TYPES,
13
13
  Option,
14
+ callZeroBanking,
14
15
  callZeroMaps,
15
16
  completeGithubFileUpload,
16
17
  completeHostedSite,
@@ -61,11 +62,11 @@ import {
61
62
  getConnectorAuthMethod,
62
63
  getConnectorAuthMethodScopeDiff,
63
64
  getConnectorEnvBindingEntries,
64
- getConnectorEnvNamesForSecret,
65
65
  getConnectorFirewall,
66
66
  getConnectorGenerationTypes,
67
- getConnectorTypeForSecretName,
67
+ getConnectorStoredSecretDisplayInfo,
68
68
  getDefaultAuthMethod,
69
+ getDiagnosticConnectorTypeForRuntimeEnvName,
69
70
  getGithubInstallation,
70
71
  getSecretsForAuthMethod,
71
72
  getSelectableProviderTypes,
@@ -148,7 +149,7 @@ import {
148
149
  upsertZeroOrgModelProvider,
149
150
  withErrorHandler,
150
151
  zeroAgentCustomSkillNameSchema
151
- } from "./chunk-DPEOZVW6.js";
152
+ } from "./chunk-KC3JLLAV.js";
152
153
  import {
153
154
  __toESM,
154
155
  init_esm_shims
@@ -2905,14 +2906,14 @@ How connectors work:
2905
2906
  console.log(` Relative path: ${urlLookup.relativePath}`);
2906
2907
  console.log(` Environment name: ${envName}`);
2907
2908
  } else {
2908
- connectorType = getConnectorTypeForSecretName(
2909
- envName = opts.envName
2910
- );
2911
- if (!connectorType) {
2909
+ envName = opts.envName;
2910
+ const resolvedConnectorType = getDiagnosticConnectorTypeForRuntimeEnvName(envName);
2911
+ if (!resolvedConnectorType) {
2912
2912
  throw new Error(
2913
2913
  `Unknown environment name: ${envName} \u2014 not managed by any connector`
2914
2914
  );
2915
2915
  }
2916
+ connectorType = resolvedConnectorType;
2916
2917
  console.log(
2917
2918
  `${envName} is managed by the ${CONNECTOR_TYPES[connectorType].label} connector (type: ${connectorType}).`
2918
2919
  );
@@ -4501,7 +4502,7 @@ var listCommand8 = new Command().name("list").alias("ls").description("List all
4501
4502
  if (secret.type === "model-provider") {
4502
4503
  typeIndicator = source_default.dim(" [model-provider]");
4503
4504
  } else if (secret.type === "connector") {
4504
- const derived = getConnectorEnvNamesForSecret(secret.name);
4505
+ const derived = getConnectorStoredSecretDisplayInfo(secret.name);
4505
4506
  if (derived) {
4506
4507
  typeIndicator = source_default.dim(` [${derived.connectorLabel} connector]`);
4507
4508
  derivedLine = source_default.dim(
@@ -4511,7 +4512,7 @@ var listCommand8 = new Command().name("list").alias("ls").description("List all
4511
4512
  typeIndicator = source_default.dim(" [connector]");
4512
4513
  }
4513
4514
  } else if (secret.type === "user") {
4514
- const derived = getConnectorEnvNamesForSecret(secret.name);
4515
+ const derived = getConnectorStoredSecretDisplayInfo(secret.name);
4515
4516
  if (derived) {
4516
4517
  typeIndicator = source_default.dim(` [${derived.connectorLabel} connector]`);
4517
4518
  derivedLine = source_default.dim(
@@ -10001,6 +10002,30 @@ var RESOURCE_REGISTRY = [
10001
10002
  path: "illustration-template/iberian-vignette"
10002
10003
  }
10003
10004
  },
10005
+ {
10006
+ id: "image-style:cozy-parlor",
10007
+ kind: "image-style",
10008
+ name: "Cozy Parlor",
10009
+ description: "Hand-painted watercolor + ink-line scene \u2014 one anthropomorphic animal in a quiet domestic interior, clean cool-white paper, neutral palette with one hot accent pop.",
10010
+ desc: "Hand-painted watercolor + brushy black ink line on clean cool-white paper (no amber tint). ONE anthropomorphic animal mid-quiet-activity in a domestic interior. Closed-crescent-eye smile, minimal facial features, expression through posture. At least two patterned surfaces per piece. Cool/neutral palette lead (sage, slate-blue, cornflower, lavender, mint, dove-gray) with a single hot accent pop (cherry-red, mustard, magenta-pink) on one object. Six dials per brief \u2014 cast, activity, palette family, pattern motif stack, hot accent object, and complexity (L1/L2/L3). Trigger when user says /cozy-parlor, asks for a 'cozy parlor illustration', a 'watercolor animal scene', a 'picture-book interior', or a new piece in this neutral-palette watercolor style.",
10011
+ source: {
10012
+ repo: VM0_SKILLS_REPO,
10013
+ ref: VM0_SKILLS_REF,
10014
+ path: "illustration-template/cozy-parlor"
10015
+ }
10016
+ },
10017
+ {
10018
+ id: "image-style:crowd-ink",
10019
+ kind: "image-style",
10020
+ name: "Crowd Ink",
10021
+ description: "Hand-drawn editorial crowd illustration \u2014 sketchy black ink contours over flat 3-color spot fills on pure white, scene-as-metaphor composition.",
10022
+ desc: 'Hand-drawn editorial crowd illustration style \u2014 confident sketchy black ink contour lines with slightly irregular weight, flat 3-color spot fills sitting under or beside the ink lines (edges allowed to misregister slightly), on a PURE WHITE background (never cream). Fine-line backdrop drawn lighter than the foreground figures, scattered atmospheric marks in negative space (birds / leaves / steam / confetti / dots), and a scene-as-metaphor composition with a cast that varies per piece. Six dials per brief \u2014 palette (tested families: urban editorial / cool transit / warm natural / cozy interior), scene metaphor, complexity (L2 small group of 3\u20135 / L3 full crowd of 8\u201310), cast, backdrop, atmospheric motif. Trigger when the user says /crowd-ink, asks for a "crowd-ink illustration", "editorial crowd scene", "hand-drawn ink-and-spot-color illustration", "New-Yorker-style crowd vignette", or briefs with palette + scene metaphor + complexity level.',
10023
+ source: {
10024
+ repo: VM0_SKILLS_REPO,
10025
+ ref: VM0_SKILLS_REF,
10026
+ path: "illustration-template/crowd-ink"
10027
+ }
10028
+ },
10004
10029
  {
10005
10030
  id: "image-style:ink-storefront",
10006
10031
  kind: "image-style",
@@ -13054,6 +13079,99 @@ Notes:
13054
13079
  - Use --fields essentials for place details unless pro fields are required`
13055
13080
  );
13056
13081
 
13082
+ // src/commands/zero/banking/index.ts
13083
+ init_esm_shims();
13084
+ function parseLimit5(value) {
13085
+ const parsed = Number(value);
13086
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 1e3) {
13087
+ throw new InvalidArgumentError("limit must be between 1 and 1000");
13088
+ }
13089
+ return parsed;
13090
+ }
13091
+ function parseDateOnly(value) {
13092
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
13093
+ throw new InvalidArgumentError("date must be formatted as YYYY-MM-DD");
13094
+ }
13095
+ return value;
13096
+ }
13097
+ function renderBankingResponse(label, response) {
13098
+ console.log(source_default.green(`\u2713 ${label}`));
13099
+ console.log(source_default.dim(` Provider: ${response.provider}`));
13100
+ if (response.accounts) {
13101
+ console.log(JSON.stringify(response.accounts, null, 2));
13102
+ return;
13103
+ }
13104
+ if (response.balance) {
13105
+ console.log(JSON.stringify(response.balance, null, 2));
13106
+ return;
13107
+ }
13108
+ console.log(JSON.stringify(response.transactions ?? [], null, 2));
13109
+ }
13110
+ async function runBankingRequest(label, operation, payload, options) {
13111
+ const response = await callZeroBanking(operation, payload);
13112
+ if (options.json) {
13113
+ console.log(JSON.stringify(response));
13114
+ return;
13115
+ }
13116
+ renderBankingResponse(label, response);
13117
+ }
13118
+ var accountsCommand = new Command().name("accounts").description("List enabled banking accounts").option("--json", "Print the raw banking response as JSON").action(
13119
+ withErrorHandler(async (options) => {
13120
+ await runBankingRequest(
13121
+ "Banking accounts loaded",
13122
+ "accounts",
13123
+ {},
13124
+ options
13125
+ );
13126
+ })
13127
+ );
13128
+ var balancesCommand = new Command().name("balances").description("Read an enabled account balance").requiredOption("--account-id <id>", "Enabled provider account ID").option("--json", "Print the raw banking response as JSON").action(
13129
+ withErrorHandler(async (options) => {
13130
+ await runBankingRequest(
13131
+ "Banking balance loaded",
13132
+ "balances",
13133
+ { accountId: options.accountId },
13134
+ options
13135
+ );
13136
+ })
13137
+ );
13138
+ var transactionsCommand = new Command().name("transactions").description("Read transactions for an enabled account").requiredOption("--account-id <id>", "Enabled provider account ID").requiredOption(
13139
+ "--from <date>",
13140
+ "Start date, formatted as YYYY-MM-DD",
13141
+ parseDateOnly
13142
+ ).requiredOption(
13143
+ "--to <date>",
13144
+ "End date, formatted as YYYY-MM-DD",
13145
+ parseDateOnly
13146
+ ).option("--limit <n>", "Maximum transactions to return", parseLimit5, 100).option("--json", "Print the raw banking response as JSON").action(
13147
+ withErrorHandler(async (options) => {
13148
+ await runBankingRequest(
13149
+ "Banking transactions loaded",
13150
+ "transactions",
13151
+ {
13152
+ accountId: options.accountId,
13153
+ from: options.from,
13154
+ to: options.to,
13155
+ limit: options.limit
13156
+ },
13157
+ options
13158
+ );
13159
+ })
13160
+ );
13161
+ var zeroBankingCommand = new Command().name("banking").description("Use managed zero banking services").addCommand(accountsCommand).addCommand(balancesCommand).addCommand(transactionsCommand).addHelpText(
13162
+ "after",
13163
+ `
13164
+ Examples:
13165
+ List accounts: zero banking accounts --json
13166
+ Get balance: zero banking balances --account-id <id> --json
13167
+ Get transactions: zero banking transactions --account-id <id> --from 2026-01-01 --to 2026-01-31 --json
13168
+
13169
+ Notes:
13170
+ - Authenticates via ZERO_TOKEN (requires banking:read capability)
13171
+ - Finicity credentials and app tokens stay on the vm0 API server
13172
+ - Access is limited to accounts enabled for the current agent`
13173
+ );
13174
+
13057
13175
  // src/commands/zero/model/index.ts
13058
13176
  init_esm_shims();
13059
13177
 
@@ -13213,7 +13331,8 @@ var COMMAND_CAPABILITY_MAP = {
13213
13331
  generate: null,
13214
13332
  web: null,
13215
13333
  host: "host:write",
13216
- maps: "maps:read"
13334
+ maps: "maps:read",
13335
+ banking: "banking:read"
13217
13336
  };
13218
13337
  var DEFAULT_COMMANDS = [
13219
13338
  zeroOrgCommand,
@@ -13242,7 +13361,8 @@ var DEFAULT_COMMANDS = [
13242
13361
  generateCommand,
13243
13362
  zeroWebCommand,
13244
13363
  zeroHostCommand,
13245
- zeroMapsCommand
13364
+ zeroMapsCommand,
13365
+ zeroBankingCommand
13246
13366
  ];
13247
13367
  function shouldHideCommand(name, payload) {
13248
13368
  if (!payload) return false;
@@ -13284,6 +13404,7 @@ function buildZeroHelpText(payload = decodeZeroTokenPayload()) {
13284
13404
  ...shouldHideCommand("maps", payload) ? [] : [
13285
13405
  ' Get directions? zero maps directions --origin "SFO" --destination "Mountain View" --json'
13286
13406
  ],
13407
+ ...shouldHideCommand("banking", payload) ? [] : [" Read bank data? zero banking accounts --json"],
13287
13408
  " Check your identity? zero whoami"
13288
13409
  ];
13289
13410
  return `
@@ -13301,7 +13422,7 @@ function registerZeroCommands(prog, commands) {
13301
13422
  var program = new Command();
13302
13423
  program.name("zero").description(
13303
13424
  "Zero CLI \u2014 interact with the zero platform from inside the sandbox"
13304
- ).version("9.178.0").addHelpText("after", () => {
13425
+ ).version("9.179.0").addHelpText("after", () => {
13305
13426
  return buildZeroHelpText();
13306
13427
  });
13307
13428
  if (process.argv[1]?.endsWith("zero.js") || process.argv[1]?.endsWith("zero.ts") || process.argv[1]?.endsWith("zero")) {