@vm0/cli 9.169.2 → 9.170.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -69,7 +69,7 @@ import {
69
69
  source_default,
70
70
  volumeConfigSchema,
71
71
  withErrorHandler
72
- } from "./chunk-CZICABIP.js";
72
+ } from "./chunk-32G2S2HY.js";
73
73
  import {
74
74
  __toESM,
75
75
  init_esm_shims
@@ -388,7 +388,7 @@ function getConfigPath() {
388
388
  return join(os.homedir(), ".vm0", "config.json");
389
389
  }
390
390
  var infoCommand = new Command().name("info").description("Display environment and debug information").action(async () => {
391
- console.log(source_default.bold(`VM0 CLI v${"9.169.2"}`));
391
+ console.log(source_default.bold(`VM0 CLI v${"9.170.1"}`));
392
392
  console.log();
393
393
  const config = await loadConfig();
394
394
  const hasEnvToken = !!process.env.VM0_TOKEN;
@@ -4281,7 +4281,7 @@ var composeCommand = new Command().name("compose").description("Create or update
4281
4281
  options.autoUpdate = false;
4282
4282
  }
4283
4283
  if (options.autoUpdate !== false) {
4284
- await startSilentUpgrade("9.169.2");
4284
+ await startSilentUpgrade("9.170.1");
4285
4285
  }
4286
4286
  try {
4287
4287
  let result;
@@ -4383,7 +4383,7 @@ var mainRunCommand = new Command().name("run").description("Run an agent").argum
4383
4383
  withErrorHandler(
4384
4384
  async (identifier, prompt, options) => {
4385
4385
  if (options.autoUpdate !== false) {
4386
- await startSilentUpgrade("9.169.2");
4386
+ await startSilentUpgrade("9.170.1");
4387
4387
  }
4388
4388
  const { name, version } = parseIdentifier(identifier);
4389
4389
  let composeId;
@@ -6177,13 +6177,13 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
6177
6177
  if (latestVersion === null) {
6178
6178
  throw new Error("Could not check for updates. Please try again later.");
6179
6179
  }
6180
- if (latestVersion === "9.169.2") {
6181
- console.log(source_default.green(`\u2713 Already up to date (${"9.169.2"})`));
6180
+ if (latestVersion === "9.170.1") {
6181
+ console.log(source_default.green(`\u2713 Already up to date (${"9.170.1"})`));
6182
6182
  return;
6183
6183
  }
6184
6184
  console.log(
6185
6185
  source_default.yellow(
6186
- `Current version: ${"9.169.2"} -> Latest version: ${latestVersion}`
6186
+ `Current version: ${"9.170.1"} -> Latest version: ${latestVersion}`
6187
6187
  )
6188
6188
  );
6189
6189
  console.log();
@@ -6210,7 +6210,7 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
6210
6210
  const success = await performUpgrade(packageManager);
6211
6211
  if (success) {
6212
6212
  console.log(
6213
- source_default.green(`\u2713 Upgraded from ${"9.169.2"} to ${latestVersion}`)
6213
+ source_default.green(`\u2713 Upgraded from ${"9.170.1"} to ${latestVersion}`)
6214
6214
  );
6215
6215
  return;
6216
6216
  }
@@ -6277,7 +6277,7 @@ var whoamiCommand = new Command().name("whoami").description("Show current ident
6277
6277
 
6278
6278
  // src/index.ts
6279
6279
  var program = new Command();
6280
- program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.169.2");
6280
+ program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.170.1");
6281
6281
  program.addCommand(authCommand);
6282
6282
  program.addCommand(infoCommand);
6283
6283
  program.addCommand(composeCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "9.169.2",
3
+ "version": "9.170.1",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",
package/zero.js CHANGED
@@ -126,7 +126,6 @@ import {
126
126
  resolveFirewallPolicies,
127
127
  resolveZeroScheduleByAgent,
128
128
  saveConfig,
129
- searchConnectors,
130
129
  searchZeroChat,
131
130
  searchZeroConnectors,
132
131
  searchZeroLogs,
@@ -153,7 +152,7 @@ import {
153
152
  zeroAgentCustomSkillNameSchema,
154
153
  zeroLocalAgentCommand,
155
154
  zeroTokenAllowsFeatureSwitch
156
- } from "./chunk-CZICABIP.js";
155
+ } from "./chunk-32G2S2HY.js";
157
156
  import {
158
157
  __toESM,
159
158
  init_esm_shims
@@ -1874,6 +1873,162 @@ var listCommand6 = new Command().name("list").alias("ls").description("List all
1874
1873
 
1875
1874
  // src/commands/zero/connector/search.ts
1876
1875
  init_esm_shims();
1876
+
1877
+ // ../../packages/connectors/src/connector-search.ts
1878
+ init_esm_shims();
1879
+ var TOKEN_BOUNDARY = /[_\-\s]+/;
1880
+ var CASE_BOUNDARY = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/;
1881
+ var MIN_SCORE = 10;
1882
+ function tokenize(input) {
1883
+ const tokens = /* @__PURE__ */ new Set();
1884
+ for (const chunk of input.split(TOKEN_BOUNDARY)) {
1885
+ if (!chunk) continue;
1886
+ for (const sub of chunk.split(CASE_BOUNDARY)) {
1887
+ const lower = sub.toLowerCase();
1888
+ if (lower) tokens.add(lower);
1889
+ }
1890
+ }
1891
+ return tokens;
1892
+ }
1893
+ function connectorAccessEnvBindings(access) {
1894
+ switch (access.kind) {
1895
+ case "static":
1896
+ case "refresh-token":
1897
+ return access.envBindings;
1898
+ case "none":
1899
+ return {};
1900
+ }
1901
+ }
1902
+ function getManualGrantFields(method) {
1903
+ return method.grant.kind === "manual" ? method.grant.fields : void 0;
1904
+ }
1905
+ function listSecretNames(config) {
1906
+ const names = [];
1907
+ for (const method of Object.values(config.authMethods)) {
1908
+ for (const name of Object.keys(getManualGrantFields(method) ?? {})) {
1909
+ names.push(name);
1910
+ }
1911
+ for (const valueRef of Object.values(
1912
+ connectorAccessEnvBindings(method.access)
1913
+ )) {
1914
+ if (valueRef.startsWith("$secrets.")) {
1915
+ names.push(valueRef.slice("$secrets.".length));
1916
+ }
1917
+ }
1918
+ }
1919
+ return names;
1920
+ }
1921
+ function findExactMatch(keywordLower, type, config) {
1922
+ if (type.toLowerCase() === keywordLower) {
1923
+ return { score: 100, matchedField: "type" };
1924
+ }
1925
+ for (const envName of Object.keys(getConnectorEnvBindings(type))) {
1926
+ if (envName.toLowerCase() === keywordLower) {
1927
+ return { score: 90, matchedField: `env:${envName}` };
1928
+ }
1929
+ }
1930
+ if (config.label.toLowerCase() === keywordLower) {
1931
+ return { score: 80, matchedField: "label" };
1932
+ }
1933
+ const tags = config.tags ?? [];
1934
+ for (const tag of tags) {
1935
+ if (tag === keywordLower) {
1936
+ return { score: 70, matchedField: `tag:${tag}` };
1937
+ }
1938
+ }
1939
+ return null;
1940
+ }
1941
+ function findSubstringMatch(keywordLower, type, config) {
1942
+ if (type.toLowerCase().includes(keywordLower)) {
1943
+ return { score: 50, matchedField: "type" };
1944
+ }
1945
+ if (config.label.toLowerCase().includes(keywordLower)) {
1946
+ return { score: 50, matchedField: "label" };
1947
+ }
1948
+ for (const envName of Object.keys(getConnectorEnvBindings(type))) {
1949
+ if (envName.toLowerCase().includes(keywordLower)) {
1950
+ return { score: 40, matchedField: `env:${envName}` };
1951
+ }
1952
+ }
1953
+ for (const name of listSecretNames(config)) {
1954
+ if (name.toLowerCase().includes(keywordLower)) {
1955
+ return { score: 30, matchedField: `secret:${name}` };
1956
+ }
1957
+ }
1958
+ const tags = config.tags ?? [];
1959
+ for (const tag of tags) {
1960
+ if (tag.includes(keywordLower)) {
1961
+ return { score: 25, matchedField: `tag:${tag}` };
1962
+ }
1963
+ }
1964
+ return null;
1965
+ }
1966
+ function collectCandidateTokens(type, config) {
1967
+ const tokens = /* @__PURE__ */ new Set();
1968
+ const sources = [
1969
+ type,
1970
+ config.label,
1971
+ ...Object.keys(getConnectorEnvBindings(type)),
1972
+ ...listSecretNames(config),
1973
+ ...config.tags ?? []
1974
+ ];
1975
+ for (const source of sources) {
1976
+ for (const token of tokenize(source)) {
1977
+ tokens.add(token);
1978
+ }
1979
+ }
1980
+ return tokens;
1981
+ }
1982
+ function findTokenIntersection(keywordTokens, type, config) {
1983
+ const candidateTokens = collectCandidateTokens(type, config);
1984
+ let intersection = 0;
1985
+ let firstCommon = "";
1986
+ for (const token of keywordTokens) {
1987
+ if (candidateTokens.has(token)) {
1988
+ intersection++;
1989
+ if (!firstCommon) firstCommon = token;
1990
+ }
1991
+ }
1992
+ if (intersection === 0) return null;
1993
+ return { score: 10 * intersection, matchedField: `token:${firstCommon}` };
1994
+ }
1995
+ function scoreConnector(keywordLower, keywordTokens, type, config) {
1996
+ const exact = findExactMatch(keywordLower, type, config);
1997
+ if (exact) return exact;
1998
+ const candidates = [];
1999
+ const substring = findSubstringMatch(keywordLower, type, config);
2000
+ if (substring) candidates.push(substring);
2001
+ const token = findTokenIntersection(keywordTokens, type, config);
2002
+ if (token) candidates.push(token);
2003
+ if (candidates.length === 0) return null;
2004
+ const best = candidates.reduce((a, b) => {
2005
+ return a.score >= b.score ? a : b;
2006
+ });
2007
+ if (best.score < MIN_SCORE) return null;
2008
+ return best;
2009
+ }
2010
+ function searchConnectors(keyword, limit, filter) {
2011
+ const trimmed = keyword.trim();
2012
+ if (!trimmed) return { results: [], total: 0 };
2013
+ const keywordLower = trimmed.toLowerCase();
2014
+ const keywordTokens = tokenize(trimmed);
2015
+ const hits = [];
2016
+ for (const type of CONNECTOR_TYPE_KEYS) {
2017
+ if (filter && !filter(type)) continue;
2018
+ const config = CONNECTOR_TYPES[type];
2019
+ const hit = scoreConnector(keywordLower, keywordTokens, type, config);
2020
+ if (!hit) continue;
2021
+ hits.push({ type, score: hit.score, matchedField: hit.matchedField });
2022
+ }
2023
+ hits.sort((a, b) => {
2024
+ if (b.score !== a.score) return b.score - a.score;
2025
+ return a.type.localeCompare(b.type);
2026
+ });
2027
+ const capped = limit > 0 ? hits.slice(0, limit) : hits;
2028
+ return { results: capped, total: hits.length };
2029
+ }
2030
+
2031
+ // src/commands/zero/connector/search.ts
1877
2032
  var DEFAULT_LIMIT = 5;
1878
2033
  var EXACT_MATCH_THRESHOLD = 80;
1879
2034
  function isConnectorType2(type) {
@@ -6755,8 +6910,8 @@ init_esm_shims();
6755
6910
 
6756
6911
  // src/commands/zero/shared/open-design-registry.ts
6757
6912
  init_esm_shims();
6758
- var OPEN_DESIGN_REPO = "vm0-ai/open-design";
6759
- var OPEN_DESIGN_COMMIT = "d021b04720ace133f1d6133d1487326f5fc28f07";
6913
+ var OPEN_DESIGN_REPO = "nexu-io/open-design";
6914
+ var OPEN_DESIGN_COMMIT = "3fb620af423534643677c7c6fae76be088fa770a";
6760
6915
  var VM0_SKILLS_REPO = "vm0-ai/vm0-skills";
6761
6916
  var VM0_SKILLS_REF = "main";
6762
6917
  var OPEN_DESIGN_REGISTRY_VERSION = `federated:${OPEN_DESIGN_REPO}@${OPEN_DESIGN_COMMIT}`;
@@ -9147,7 +9302,11 @@ var OPEN_DESIGN_REGISTRY = [
9147
9302
  name: "Notion Illustration",
9148
9303
  description: "Zero-native illustration style for hand-drawn product spot illustrations with simple ink contours and soft backgrounds.",
9149
9304
  desc: 'Notion-editorial-style hand-drawn spot illustration. Black brush-pen ink on white, tapered confident strokes, solid-black curly hair, solid-black pants/shoes, 3/4 face turned toward viewer with closed-eye smile and soft nose hint, open breathing body outlines, and 1-3 supporting scene props + ambient marks that frame the moment. Trigger when user says /notion-illustration, asks for a "Notion-style illustration", "Notion spot illustration", or a new piece in this hand-drawn brush-pen Notion editorial style.',
9150
- source: { path: "illustration-template/notion-illustration" }
9305
+ source: {
9306
+ repo: VM0_SKILLS_REPO,
9307
+ ref: VM0_SKILLS_REF,
9308
+ path: "illustration-template/notion-illustration"
9309
+ }
9151
9310
  },
9152
9311
  {
9153
9312
  id: "vm0:image-style:vm0-illustration",
@@ -9155,7 +9314,11 @@ var OPEN_DESIGN_REGISTRY = [
9155
9314
  name: "vm0 Illustration",
9156
9315
  description: "vm0 in-app spot illustration style with bold hand-drawn ink line art, white-filled interiors, and a soft rounded color backdrop.",
9157
9316
  desc: "Generate vm0-style vm0 in-app spot illustrations: bold hand-drawn ink line art with white-filled interiors, a soft rounded color backdrop, transparent output, and simple iconic metaphors for product states.",
9158
- source: { path: "illustration-template/vm0-illustration" }
9317
+ source: {
9318
+ repo: VM0_SKILLS_REPO,
9319
+ ref: VM0_SKILLS_REF,
9320
+ path: "illustration-template/vm0-illustration"
9321
+ }
9159
9322
  },
9160
9323
  {
9161
9324
  id: "vm0:image-style:postcard-illustration",
@@ -9163,7 +9326,11 @@ var OPEN_DESIGN_REGISTRY = [
9163
9326
  name: "Postcard Illustration",
9164
9327
  description: "Hand-drawn editorial postcard / travel-journal illustration with fine black ink linework, flat saturated gouache fills, sharp edges, dense small repeated ink patterns, paper-grain texture, sparse white speckles, and a tall portrait composition.",
9165
9328
  desc: 'Hand-drawn editorial postcard illustration style. Fine black marker/pen ink linework over flat saturated gouache color fills with sharp edges, dense small repeated ink patterns on surfaces (rows of windows, shingle curves, hatching, stippling), subtle paper-grain background texture, tiny scattered white speckles (snow / petals / sparkle), and a tall portrait composition with a layered foreground-midground-background. Travel-journal / urban-sketcher aesthetic. Trigger when the user says /postcard-illustration, asks for a "postcard illustration", "travel illustration", "urban sketcher style", or briefs a palette + scene archetype + complexity.',
9166
- source: { path: "illustration-template/postcard-illustration" }
9329
+ source: {
9330
+ repo: VM0_SKILLS_REPO,
9331
+ ref: VM0_SKILLS_REF,
9332
+ path: "illustration-template/postcard-illustration"
9333
+ }
9167
9334
  },
9168
9335
  {
9169
9336
  id: "vm0:image-style:folk-storybook",
@@ -9171,7 +9338,11 @@ var OPEN_DESIGN_REGISTRY = [
9171
9338
  name: "Folk Storybook Illustration",
9172
9339
  description: "Folk-art children's picture-book illustration \u2014 hand-painted gouache and watercolor scenes with anthropomorphic animal characters, closed-crescent-eye smiles, dusty muted folk palette, and decorative pattern surfaces.",
9173
9340
  desc: "Folk-art children's picture-book illustration style \u2014 hand-painted gouache/watercolor scene on aged paper, anthropomorphic animal characters with closed-crescent-eye smiles, dusty muted folk palette, decorative pattern surfaces (wallpaper, rugs, textiles), and a hushed lullaby mood. Trigger when users ask for a folk-art illustration, storybook scene, cozy animal illustration, or any new piece in this Eastern European picture-book style.",
9174
- source: { path: "illustration-template/folk-storybook" }
9341
+ source: {
9342
+ repo: VM0_SKILLS_REPO,
9343
+ ref: VM0_SKILLS_REF,
9344
+ path: "illustration-template/folk-storybook"
9345
+ }
9175
9346
  },
9176
9347
  {
9177
9348
  id: "vm0:image-style:papernook",
@@ -9179,7 +9350,11 @@ var OPEN_DESIGN_REGISTRY = [
9179
9350
  name: "Papernook",
9180
9351
  description: "Hand-drawn editorial illustration set in a cozy cluttered personal-studio scene with warm cream paper, scratchy ink, painterly gouache fills, dot-eye character face, and dense edge-to-edge thematic props.",
9181
9352
  desc: 'Hand-drawn editorial illustration in the spirit of a cluttered personal-studio scene. Loose scratchy black ink outlines that wobble, textured gouache fills with visible brush marks, warm cream paper background, simplified dot-eye character face, and a DENSE edge-to-edge composition where a centered character is orbited by thematic props that visually act out the scene metaphor. Default palette: dusty cornflower blue, soft coral pink, fresh sage green, charcoal, warm cream \u2014 no mustard, no burnt-orange. Trigger when user says /papernook, asks for a "papernook illustration", a "cozy cluttered editorial scene", a "warm-cream desk scene", or a new piece in this hand-drawn studio-clutter editorial style.',
9182
- source: { path: "illustration-template/papernook" }
9353
+ source: {
9354
+ repo: VM0_SKILLS_REPO,
9355
+ ref: VM0_SKILLS_REF,
9356
+ path: "illustration-template/papernook"
9357
+ }
9183
9358
  },
9184
9359
  {
9185
9360
  id: "vm0:image-style:painterly-botanical",
@@ -9187,7 +9362,11 @@ var OPEN_DESIGN_REGISTRY = [
9187
9362
  name: "Painterly Botanical",
9188
9363
  description: "Painterly watercolor + gouache portrait illustration with a single figure embraced by lush botanicals, closed-eye introspective expression, and a softly tinted paper-wash background.",
9189
9364
  desc: 'Painterly watercolor + gouache portrait illustration. Single figure (closed eyes, contemplative) embraced by botanicals \u2014 leaves, blossoms, grasses. Translucent washes with visible pigment bleeds, sparse crisp ink line accents on key edges, tiny handwritten cursive signature in an upper corner, and a tinted paper-wash background (never pure white). Eight user axes drive composition: subject, hair, pose, botanicals, palette, background wash, complexity (L1/L2/L3), and format. Trigger when a brief describes a contemplative figure with foliage, a "watercolor portrait", a "botanical embrace", or asks for a piece in this painterly editorial style.',
9190
- source: { path: "illustration-template/painterly-botanical" }
9365
+ source: {
9366
+ repo: VM0_SKILLS_REPO,
9367
+ ref: VM0_SKILLS_REF,
9368
+ path: "illustration-template/painterly-botanical"
9369
+ }
9191
9370
  },
9192
9371
  {
9193
9372
  id: "vm0:image-style:iso-scene",
@@ -9195,7 +9374,11 @@ var OPEN_DESIGN_REGISTRY = [
9195
9374
  name: "Isometric Editorial Scene",
9196
9375
  description: "Isometric editorial-magazine scene illustration with ultra-fine hairline outlines, flat fills, a saturated monochromatic background, and a scene-as-metaphor composition built from theme-native props.",
9197
9376
  desc: 'Isometric editorial-magazine scene illustration in a locked flat-vector style \u2014 ultra-fine hairline outlines, monochromatic saturated background filling the canvas, and a single composed scene whose props themselves embody the theme. Trigger when users say /iso-scene, ask for an "isometric editorial illustration", a "scene illustration in the editorial machine style", or brief with palette + scene archetype + complexity.',
9198
- source: { path: "illustration-template/iso-scene" }
9377
+ source: {
9378
+ repo: VM0_SKILLS_REPO,
9379
+ ref: VM0_SKILLS_REF,
9380
+ path: "illustration-template/iso-scene"
9381
+ }
9199
9382
  },
9200
9383
  {
9201
9384
  id: "vm0:image-style:inkdab",
@@ -9203,7 +9386,11 @@ var OPEN_DESIGN_REGISTRY = [
9203
9386
  name: "Inkdab Illustration",
9204
9387
  description: "Brush-pen editorial illustration where a free-floating color dab is painted first, then loose black ink linework is drawn freely on top \u2014 never as an outline around the color. Scribbled hatched hair, open-outline bodies, pure white background.",
9205
9388
  desc: 'Brush-pen editorial illustration style \u2014 a flat accent-color "dab" painted first, then loose black ink drawn freely on top. ONE flat accent-color shape per prop (painted-first, never outlined in black), black hand-wobbled ink on pure white background, scribbled hatched hair, open-outline bodies with zero fill, and one small solid-accent triangle floating freely as a recurring motif. Trigger when user says /inkdab, asks for an "inkdab illustration", a "brush-pen illustration with a single accent color", a "free-floating color block illustration", or briefs in the style of the included reference images.',
9206
- source: { path: "illustration-template/inkdab" }
9389
+ source: {
9390
+ repo: VM0_SKILLS_REPO,
9391
+ ref: VM0_SKILLS_REF,
9392
+ path: "illustration-template/inkdab"
9393
+ }
9207
9394
  },
9208
9395
  {
9209
9396
  id: "vm0:image-style:riso-relic",
@@ -9211,7 +9398,11 @@ var OPEN_DESIGN_REGISTRY = [
9211
9398
  name: "Riso Relic",
9212
9399
  description: 'Pop-art retro risograph poster of a single nostalgic everyday object on a saturated single-hue field \u2014 bold black ink outlines, halftone grain, hand-drawn doodle accents, tiny "SMALL OBJECTS IN TIME" banner up top, chunky retro headline with offset drop-shadow at the bottom.',
9213
9400
  desc: 'Pop-art retro risograph poster of a single nostalgic everyday object \u2014 saturated single-color background, bold black ink outlines, halftone/riso grain, hand-drawn doodle accents (sparkles, squiggles, dots, music notes, lightning), tiny white "SMALL OBJECTS IN TIME" banner at top, chunky retro display headline at bottom with offset black drop-shadow. Trigger when user says /riso-relic, asks for a "riso poster", a "small objects in time" illustration, or any new piece in this nostalgic pop-art relic-object style.',
9214
- source: { path: "illustration-template/riso-relic" }
9401
+ source: {
9402
+ repo: VM0_SKILLS_REPO,
9403
+ ref: VM0_SKILLS_REF,
9404
+ path: "illustration-template/riso-relic"
9405
+ }
9215
9406
  },
9216
9407
  {
9217
9408
  id: "vm0:image-style:inkstomp",
@@ -9219,7 +9410,11 @@ var OPEN_DESIGN_REGISTRY = [
9219
9410
  name: "Inkstomp",
9220
9411
  description: "Loud indie-packaging poster style \u2014 full-bleed saturated flat color, a two-line hand-lettered headline, and one weird-cute black brush-ink character.",
9221
9412
  desc: 'Inkstomp \u2014 a loud, hand-screened indie-packaging poster style. Full-bleed saturated flat color filling the entire canvas, a two-line hand-lettered headline (thin arched caps over chunky drop-shadowed display), and one weird-cute character drawn in thick uniform black brush ink. Trigger when the user says /inkstomp, asks for an "inkstomp poster", a "Ray Fenwick / Hattie Stewart packaging poster", an "indie brush-ink flavor card", or briefs in a "palette + headline + character" shape.',
9222
- source: { path: "illustration-template/inkstomp" }
9413
+ source: {
9414
+ repo: VM0_SKILLS_REPO,
9415
+ ref: VM0_SKILLS_REF,
9416
+ path: "illustration-template/inkstomp"
9417
+ }
9223
9418
  },
9224
9419
  {
9225
9420
  id: "vm0:image-style:folk-muse",
@@ -9227,7 +9422,11 @@ var OPEN_DESIGN_REGISTRY = [
9227
9422
  name: "Folk Muse",
9228
9423
  description: "Flat folk-art gouache portrait style \u2014 a single contemplative chest-up figure framed by an asymmetric botanical surround, with painted irises, smooth flat hair, a hand against the cheek, and a patterned robe.",
9229
9424
  desc: 'Flat folk-art gouache portrait illustration in the contemporary editorial style of Carson Ellis, Maja Tomljanovic, and Bodil Jane. A single chest-up figure with an elongated mannerist oval face, tiny almond half-lidded eyes, smooth flat hair, one hand pressed against the face, a patterned robe filling the lower frame, and an asymmetric botanical surround filling the background edge-to-edge. Hand-painted matte gouache texture, flat color blocks, no harsh outlines, no photorealism. Calm, slightly melancholic, contemplative mood. Trigger when the user says /folk-muse, asks for a "folk-art portrait", "gouache portrait", "Carson Ellis style portrait", or any new piece in this contemplative folk-portrait style.',
9230
- source: { path: "illustration-template/folk-muse" }
9425
+ source: {
9426
+ repo: VM0_SKILLS_REPO,
9427
+ ref: VM0_SKILLS_REF,
9428
+ path: "illustration-template/folk-muse"
9429
+ }
9231
9430
  },
9232
9431
  {
9233
9432
  id: "vm0:image-style:sunlit-gouache",
@@ -9235,7 +9434,11 @@ var OPEN_DESIGN_REGISTRY = [
9235
9434
  name: "Sunlit Gouache",
9236
9435
  description: "Bright pastel travel-painting illustration in opaque gouache on textured paper with chunky flat brushstrokes, vertical one-point perspective, and figures walking into warm sunlight.",
9237
9436
  desc: 'Sunlit Gouache travel-painting illustration. Opaque gouache on textured paper, visible chunky flat brushstrokes with dry-brush highlights, locked six-color palette (cream, butter-yellow, sky-blue, sage-green, terracotta, one small red accent), vertical 2:3 one-point-perspective composition drawing the eye into a bright sunlit focal point, figures seen from behind walking into the scene, an overhead band of hanging elements (awning, prayer flags, catenary, bunting, lanterns) creating depth, dappled painterly reflections on the ground, airy optimistic warm mood. Trigger when user says /sunlit-gouache, asks for a "sunlit gouache illustration", "painterly travel scene", "gouache caf\xE9/market/temple/station scene", or a new piece in this bright pastel painted-light style.',
9238
- source: { path: "illustration-template/sunlit-gouache" }
9437
+ source: {
9438
+ repo: VM0_SKILLS_REPO,
9439
+ ref: VM0_SKILLS_REF,
9440
+ path: "illustration-template/sunlit-gouache"
9441
+ }
9239
9442
  },
9240
9443
  {
9241
9444
  id: "vm0:image-style:mosaic-still-life",
@@ -9243,7 +9446,11 @@ var OPEN_DESIGN_REGISTRY = [
9243
9446
  name: "Mosaic Still Life",
9244
9447
  description: "Editorial still-life illustration in a mosaic-tile + painterly hybrid style \u2014 tessellated ground/sky/wall surfaces with crisp painterly objects, an animal companion, and a patterned textile peeking through.",
9245
9448
  desc: 'Mosaic-tile + painterly hybrid editorial illustration. Tessellated/pointillist mosaic surfaces (grass, sky, sand, walls, floors) anchor the scene, with crisp painterly still-life objects rendered ON TOP. Always features a still-life centerpiece on a table, an animal companion at the heart of the scene, and at least one patterned textile peeking through. Cozy, nostalgic, bucolic mood. Trigger when user says /mosaic-still-life, asks for a "mosaic illustration", "mosaic-tile editorial illustration", "tessellated still life", or briefs with a palette + scene + animal in this style.',
9246
- source: { path: "illustration-template/mosaic-still-life" }
9449
+ source: {
9450
+ repo: VM0_SKILLS_REPO,
9451
+ ref: VM0_SKILLS_REF,
9452
+ path: "illustration-template/mosaic-still-life"
9453
+ }
9247
9454
  },
9248
9455
  {
9249
9456
  id: "vm0:image-style:ink-mascot",
@@ -9251,7 +9458,11 @@ var OPEN_DESIGN_REGISTRY = [
9251
9458
  name: "Ink Mascot",
9252
9459
  description: "Vintage editorial marketing card. Bold serif headline and short serif descriptor over a hand-drawn black-ink anthropomorphic mascot (stick limbs, chunky white sneakers) on a single solid saturated flat color background.",
9253
9460
  desc: 'Generate a 3:5 portrait editorial marketing card in a locked vintage-textbook style. Bold serif headline plus an optional short serif descriptor sit on a single solid saturated flat color background (no gradient, no divider, no ground line). A hand-drawn black-ink anthropomorphic hero object \u2014 paint bucket, magnifying glass, envelope, notebook, funnel, megaphone, rocket, seedling, gift box, compass, etc. \u2014 stands with two thin stick arms, two stick legs, and chunky white sneakers with black laces (the signature detail). Crosshatch and stipple shading on rounded surfaces; floating ink doodles (sparkles, arrows, hearts, percent or dollar signs, motion lines) at the requested density. Dialable along six axes: concept, palette, hero object, action, doodle density (L1 minimal, L2 balanced, L3 packed), and type layout (A title-top, B headline-bottom, C headline-only, D big-word + tiny-descriptor). Trigger when user says /ink-mascot, asks for a "marketing card illustration", a "retro editorial mascot poster", or briefs with a marketing concept plus palette plus character.',
9254
- source: { path: "illustration-template/ink-mascot" }
9461
+ source: {
9462
+ repo: VM0_SKILLS_REPO,
9463
+ ref: VM0_SKILLS_REF,
9464
+ path: "illustration-template/ink-mascot"
9465
+ }
9255
9466
  },
9256
9467
  {
9257
9468
  id: "vm0:image-style:sticker-sheet",
@@ -9259,7 +9470,11 @@ var OPEN_DESIGN_REGISTRY = [
9259
9470
  name: "Sticker Sheet",
9260
9471
  description: "Hand-painted gouache sticker-sheet illustration with ~20 themed objects floating on white, punchy saturated palette, wobbly hand-drawn ink overlay, and tiny decorative marks on every item.",
9261
9472
  desc: 'Sticker Sheet \u2014 hand-painted gouache sticker-sheet illustration. ~20 small floating themed objects on pure white, punchy saturated palette (coral, mustard, sage, dusty pink, navy, cream, warm brown), flat brushy gouache fills with wobbly hand-drawn ink linework and tiny decorative marks (dots, hatches, squiggles) on every object. Each object slightly tilted, no drop shadows, cheerful cozy lifestyle journal mood. Trigger when user says /sticker-sheet, asks for a "sticker sheet illustration", "hand-painted gouache sticker pack", "themed object sheet", or briefs with a scene theme + object count in this house style.',
9262
- source: { path: "illustration-template/sticker-sheet" }
9473
+ source: {
9474
+ repo: VM0_SKILLS_REPO,
9475
+ ref: VM0_SKILLS_REF,
9476
+ path: "illustration-template/sticker-sheet"
9477
+ }
9263
9478
  },
9264
9479
  {
9265
9480
  id: "vm0:image-style:flat-poster",
@@ -9267,7 +9482,11 @@ var OPEN_DESIGN_REGISTRY = [
9267
9482
  name: "Flat Poster",
9268
9483
  description: "Vertical flat-color editorial poster style \u2014 saturated solid background, one centered hand-drawn vector subject in bold deep-navy outlines with strict two-tone fill, headline pinned top-left, wordmark pinned bottom-right.",
9269
9484
  desc: 'Flat Poster \u2014 a vertical flat-color editorial poster style for brand benefit cards, marketing posters, and in-app campaign visuals. Portrait 2:3 canvas filled edge-to-edge with one saturated hue; a single centered hand-drawn vector subject in deep-navy outlines with strict two-tone fill (pure white plus one darker bg-tint accent); a bold rounded sans-serif headline pinned top-left; a short wordmark (default VM0) pinned bottom-right; small floating accent marks around the subject; no body copy. Six creative dials: palette, subject archetype, composition preset, accent marks, headline voice, mood. Trigger when the user says /flat-poster, asks for a "flat-color editorial poster", a "brand benefit card", a "marketing card in the bold outline + flat color style", or briefs with a palette + subject + headline shape.',
9270
- source: { path: "illustration-template/flat-poster" }
9485
+ source: {
9486
+ repo: VM0_SKILLS_REPO,
9487
+ ref: VM0_SKILLS_REF,
9488
+ path: "illustration-template/flat-poster"
9489
+ }
9271
9490
  },
9272
9491
  {
9273
9492
  id: "vm0:image-style:mellow-pop",
@@ -9275,7 +9494,11 @@ var OPEN_DESIGN_REGISTRY = [
9275
9494
  name: "Mellow Pop",
9276
9495
  description: "Chill flat-vector editorial poster of a serene recurring character on a fully saturated solid color background, with a signature pop of bright leaf-green and a scene-as-metaphor composition.",
9277
9496
  desc: 'Mellow-pop flat-vector editorial illustration: a recurring chill character with closed-eye smile, tiny nose hint, and short dark bobbed hair, posed inside a scene-as-metaphor composition on a single fully saturated solid color background, with a signature pop of bright leaf-green woven into every piece (hero prop, plants, motifs, or sweater). Thin uniform black outlines, flat solid fills only, no gradients or texture. Five dials per brief: palette, scene metaphor, complexity (L1/L2/L3), pose, outfit accent. Trigger when user says /mellow-pop, asks for a "mellow-pop illustration", "chill flat-vector poster", or briefs with a scene metaphor + palette + complexity.',
9278
- source: { path: "illustration-template/mellow-pop" }
9497
+ source: {
9498
+ repo: VM0_SKILLS_REPO,
9499
+ ref: VM0_SKILLS_REF,
9500
+ path: "illustration-template/mellow-pop"
9501
+ }
9279
9502
  }
9280
9503
  ];
9281
9504
  function filterByKind(kind) {
@@ -9308,16 +9531,16 @@ function selectOpenDesignCandidates() {
9308
9531
  registryVersion: OPEN_DESIGN_REGISTRY_VERSION,
9309
9532
  source: {
9310
9533
  repo: OPEN_DESIGN_REPO,
9311
- commit: OPEN_DESIGN_COMMIT
9534
+ ref: OPEN_DESIGN_COMMIT
9312
9535
  },
9313
9536
  sources: [
9314
9537
  {
9315
9538
  repo: OPEN_DESIGN_REPO,
9316
- commit: OPEN_DESIGN_COMMIT
9539
+ ref: OPEN_DESIGN_COMMIT
9317
9540
  },
9318
9541
  {
9319
9542
  repo: VM0_SKILLS_REPO,
9320
- commit: VM0_SKILLS_REF
9543
+ ref: VM0_SKILLS_REF
9321
9544
  }
9322
9545
  ],
9323
9546
  candidates: {
@@ -9395,7 +9618,7 @@ function createStyledImageAuthoringPacket(options) {
9395
9618
  `Registry: \`${candidateSlice.registryVersion}\``,
9396
9619
  "Sources:",
9397
9620
  ...candidateSlice.sources.map((src) => {
9398
- return `- \`${src.repo}@${src.commit}\``;
9621
+ return `- \`${src.repo}@${src.ref}\``;
9399
9622
  }),
9400
9623
  "",
9401
9624
  "```json",
@@ -9404,7 +9627,7 @@ function createStyledImageAuthoringPacket(options) {
9404
9627
  "",
9405
9628
  "## Stage 2: Resolve Selected Resources",
9406
9629
  "- Fetch or read the selected resource source before generation.",
9407
- "- Source refs are pinned as `repo@commit:path`; use the commit in the packet for reproducibility.",
9630
+ "- Each candidate carries a `source` object with `path` and optional `repo`/`ref`; when `repo`/`ref` are omitted, fall back to the registry-level source above.",
9408
9631
  "- For directory refs, inspect the most relevant files such as `SKILL.md`, references, examples, and templates.",
9409
9632
  "- If a source file cannot be fetched, state that limitation and fall back to the registry metadata for that resource.",
9410
9633
  "",
@@ -9574,6 +9797,12 @@ var BUILT_IN_GENERATION_PROVIDERS = {
9574
9797
  model: "fal-ai/bytedance/seedream/v4/text-to-image",
9575
9798
  command: "zero generate image --provider built-in --model seedream4 -h",
9576
9799
  reason: "available without connector setup"
9800
+ },
9801
+ {
9802
+ label: "Built-in fal.ai",
9803
+ model: "fal-ai/nano-banana-2",
9804
+ command: "zero generate image --provider built-in --model nano-banana-2 -h",
9805
+ reason: "available without connector setup"
9577
9806
  }
9578
9807
  ],
9579
9808
  presentation: [
@@ -9677,7 +9906,7 @@ var BUILT_IN_GENERATION_COMMANDS = {
9677
9906
  image: {
9678
9907
  label: "Built-in image generation",
9679
9908
  command: "zero generate image --provider built-in -h",
9680
- models: "fal.ai: gpt-image-1 (default), gpt-image-2, gpt-image-1.5, gpt-image-1-mini, flux-pro-1.1, flux-pro-1.1-ultra, qwen-image, seedream4"
9909
+ models: "fal.ai: gpt-image-1 (default), gpt-image-2, gpt-image-1.5, gpt-image-1-mini, flux-pro-1.1, flux-pro-1.1-ultra, qwen-image, seedream4, nano-banana-2"
9681
9910
  },
9682
9911
  video: {
9683
9912
  label: "Built-in video generation",
@@ -10196,7 +10425,7 @@ function createImageGenerateCommand(config) {
10196
10425
  "When listing providers (no --prompt given), include unavailable or not-yet-authorized connectors"
10197
10426
  ).option(
10198
10427
  "--model <model>",
10199
- "Model: gpt-image-1 (default), gpt-image-2, gpt-image-1.5, gpt-image-1-mini, flux-pro-1.1, flux-pro-1.1-ultra, qwen-image, or seedream4",
10428
+ "Model: gpt-image-1 (default), gpt-image-2, gpt-image-1.5, gpt-image-1-mini, flux-pro-1.1, flux-pro-1.1-ultra, qwen-image, seedream4, or nano-banana-2",
10200
10429
  "gpt-image-1"
10201
10430
  ).option(
10202
10431
  "--size <size>",
@@ -10253,7 +10482,7 @@ Notes:
10253
10482
  Models:
10254
10483
  - fal.ai: gpt-image-1 (default), gpt-image-2, gpt-image-1.5,
10255
10484
  gpt-image-1-mini, flux-pro-1.1, flux-pro-1.1-ultra, qwen-image,
10256
- seedream4.
10485
+ seedream4, nano-banana-2.
10257
10486
  GPT Image models bill by fal output image quality and size.
10258
10487
  Other fal generations bill by output image or rounded-up output
10259
10488
  megapixel, depending on the model.
@@ -10272,15 +10501,15 @@ Options:
10272
10501
  - Quality: low, medium, high, or auto. Low is fastest for drafts.
10273
10502
  - Background: auto, opaque, or transparent when supported. gpt-image-2,
10274
10503
  Flux, Qwen, and Seedream do not support transparent backgrounds.
10275
- - Format: png, jpeg, or webp for GPT Image models; png or jpeg for the
10276
- other fal models.
10277
- - fal-only controls: --seed, --safety-tolerance for Flux, and
10504
+ - Format: png, jpeg, or webp for GPT Image and Nano Banana 2 models; png or
10505
+ jpeg for the other fal models.
10506
+ - fal-only controls: --seed and --safety-tolerance for supported fal models;
10278
10507
  --enhance-prompt for flux-pro-1.1. --compression and --moderation low are
10279
10508
  not supported on the fal-backed image path.
10280
10509
  - Image-to-image: pass --image-url to use the model's fal edit/redux endpoint.
10281
- Flux Redux accepts --image-prompt-strength to override the provider
10282
- default; GPT edit models accept --input-fidelity and supported models
10283
- accept --mask-image-url.
10510
+ Nano Banana 2 accepts up to 14 source images. Flux Redux accepts
10511
+ --image-prompt-strength to override the provider default; GPT edit models
10512
+ accept --input-fidelity and supported models accept --mask-image-url.
10284
10513
 
10285
10514
  Image Styles:
10286
10515
  ${formatStyleListing(styles)}`;
@@ -10390,6 +10619,7 @@ var imageCommand = createImageGenerateCommand({
10390
10619
  Pipe prompt: cat prompt.txt | zero generate image --skip-style
10391
10620
  GPT Image model: zero generate image --skip-style --model gpt-image-1.5 --prompt "A poster" --size 1024x1536 --quality high
10392
10621
  Flux model: zero generate image --skip-style --model flux-pro-1.1 --prompt "A product hero shot" --seed 42
10622
+ Nano Banana 2: zero generate image --skip-style --model nano-banana-2 --prompt "A crisp launch poster with readable typography"
10393
10623
  Image-to-image: zero generate image --skip-style --model flux-pro-1.1 --image-url https://example.com/mockup.png --prompt "Turn this mockup into a polished product shot"
10394
10624
  List providers: zero generate image
10395
10625
  Use a connector: zero generate image --provider replicate`
@@ -10496,7 +10726,7 @@ function createHtmlArtifactAuthoringPacket(options) {
10496
10726
  `Registry: \`${candidateSlice.registryVersion}\``,
10497
10727
  "Sources:",
10498
10728
  ...candidateSlice.sources.map((src) => {
10499
- return `- \`${src.repo}@${src.commit}\``;
10729
+ return `- \`${src.repo}@${src.ref}\``;
10500
10730
  }),
10501
10731
  "",
10502
10732
  "```json",
@@ -10505,7 +10735,7 @@ function createHtmlArtifactAuthoringPacket(options) {
10505
10735
  "",
10506
10736
  "## Stage 2: Resolve Selected Resources",
10507
10737
  "- For every selected resource, fetch or read the referenced source before authoring.",
10508
- "- Source refs are pinned as `repo@commit:path`; use the commit in the packet for reproducibility.",
10738
+ "- Each candidate carries a `source` object with `path` and optional `repo`/`ref`; when `repo`/`ref` are omitted, fall back to the registry-level source above.",
10509
10739
  "- For directory refs, inspect the most relevant files such as `SKILL.md`, `DESIGN.md`, `README.md`, tokens, examples, and templates.",
10510
10740
  "- If a source file cannot be fetched, state that limitation and fall back to the registry metadata for that resource.",
10511
10741
  "",
@@ -12566,7 +12796,7 @@ function registerZeroCommands(prog, commands) {
12566
12796
  var program = new Command();
12567
12797
  program.name("zero").description(
12568
12798
  "Zero CLI \u2014 interact with the zero platform from inside the sandbox"
12569
- ).version("9.169.2").addHelpText("after", () => {
12799
+ ).version("9.170.1").addHelpText("after", () => {
12570
12800
  return buildZeroHelpText();
12571
12801
  });
12572
12802
  if (process.argv[1]?.endsWith("zero.js") || process.argv[1]?.endsWith("zero.ts") || process.argv[1]?.endsWith("zero")) {