@vm0/cli 9.209.3 → 9.210.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.
@@ -18,7 +18,7 @@ var figmaFirewall = {
18
18
  base: "https://api.figma.com",
19
19
  auth: {
20
20
  headers: {
21
- Authorization: "Bearer ${{ secrets.FIGMA_TOKEN }}"
21
+ "X-Figma-Token": "${{ secrets.FIGMA_TOKEN }}"
22
22
  }
23
23
  },
24
24
  permissions: [
@@ -190,4 +190,4 @@ var figmaFirewall = {
190
190
  export {
191
191
  figmaFirewall
192
192
  };
193
- //# sourceMappingURL=figma.generated-7FWIRN56.js.map
193
+ //# sourceMappingURL=figma.generated-EJXHASDR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/connectors/src/firewalls/figma.generated.ts"],"sourcesContent":["// Auto-generated from Figma's official OpenAPI spec.\n// Source: https://github.com/figma/rest-api-spec\n// Regenerate: cd turbo && pnpm -F @vm0/firewalls-generator generate:figma\n//\n// DO NOT EDIT THIS FILE MANUALLY.\n\nimport type { FirewallConfig } from \"../firewall-types\";\n\nexport const figmaFirewall = {\n name: \"figma\",\n description: \"Figma API\",\n placeholders: {\n FIGMA_TOKEN: \"figd_CoffeeSafeLocalCoffeeSafeLocalCoffeeSafe\",\n },\n apis: [\n {\n base: \"https://api.figma.com\",\n auth: {\n headers: {\n \"X-Figma-Token\": \"${{ secrets.FIGMA_TOKEN }}\",\n },\n },\n permissions: [\n {\n name: \"current_user:read\",\n description: \"Read your name, email, and profile image.\",\n rules: [\n \"GET /v1/me\",\n ],\n },\n {\n name: \"file_comments:read\",\n description: \"Read the comments for files.\",\n rules: [\n \"GET /v1/files/{file_key}/comments\",\n \"GET /v1/files/{file_key}/comments/{comment_id}/reactions\",\n ],\n },\n {\n name: \"file_comments:write\",\n description: \"Post and delete comments and comment reactions in files.\",\n rules: [\n \"POST /v1/files/{file_key}/comments\",\n \"DELETE /v1/files/{file_key}/comments/{comment_id}\",\n \"POST /v1/files/{file_key}/comments/{comment_id}/reactions\",\n \"DELETE /v1/files/{file_key}/comments/{comment_id}/reactions\",\n ],\n },\n {\n name: \"file_content:read\",\n description: \"Read the contents of files, such as nodes and the editor type.\",\n rules: [\n \"GET /v1/files/{file_key}\",\n \"GET /v1/files/{file_key}/images\",\n \"GET /v1/files/{file_key}/nodes\",\n \"GET /v1/images/{file_key}\",\n ],\n },\n {\n name: \"file_dev_resources:read\",\n description: \"Read dev resources in files.\",\n rules: [\n \"GET /v1/files/{file_key}/dev_resources\",\n ],\n },\n {\n name: \"file_dev_resources:write\",\n description: \"Write to dev resources in files.\",\n rules: [\n \"POST /v1/dev_resources\",\n \"PUT /v1/dev_resources\",\n \"DELETE /v1/files/{file_key}/dev_resources/{dev_resource_id}\",\n ],\n },\n {\n name: \"file_metadata:read\",\n description: \"Read metadata of files.\",\n rules: [\n \"GET /v1/files/{file_key}/meta\",\n \"GET /v1/oembed\",\n ],\n },\n {\n name: \"file_variables:read\",\n description: \"Read variables in Figma file. Note: this is only available to members in Enterprise organizations.\",\n rules: [\n \"GET /v1/files/{file_key}/variables/local\",\n \"GET /v1/files/{file_key}/variables/published\",\n ],\n },\n {\n name: \"file_variables:write\",\n description: \"Write to variables in Figma file. Note: this is only available to members in Enterprise organizations.\",\n rules: [\n \"POST /v1/files/{file_key}/variables\",\n ],\n },\n {\n name: \"file_versions:read\",\n description: \"Read the version history for files you can access.\",\n rules: [\n \"GET /v1/files/{file_key}/versions\",\n ],\n },\n {\n name: \"library_analytics:read\",\n description: \"Read library analytics data.\",\n rules: [\n \"GET /v1/analytics/libraries/{file_key}/component/actions\",\n \"GET /v1/analytics/libraries/{file_key}/component/usages\",\n \"GET /v1/analytics/libraries/{file_key}/style/actions\",\n \"GET /v1/analytics/libraries/{file_key}/style/usages\",\n \"GET /v1/analytics/libraries/{file_key}/variable/actions\",\n \"GET /v1/analytics/libraries/{file_key}/variable/usages\",\n ],\n },\n {\n name: \"library_assets:read\",\n description: \"Read data of individual published components and styles.\",\n rules: [\n \"GET /v1/component_sets/{key}\",\n \"GET /v1/components/{key}\",\n \"GET /v1/styles/{key}\",\n ],\n },\n {\n name: \"library_content:read\",\n description: \"Read published components and styles of files.\",\n rules: [\n \"GET /v1/files/{file_key}/component_sets\",\n \"GET /v1/files/{file_key}/components\",\n \"GET /v1/files/{file_key}/styles\",\n ],\n },\n {\n name: \"org:activity_log_read\",\n description: \"Read activity logs in the organization.\",\n rules: [\n \"GET /v1/activity_logs\",\n ],\n },\n {\n name: \"project_metadata:read\",\n description: \"Read metadata of projects.\",\n rules: [\n \"GET /v1/projects/{project_id}/meta\",\n ],\n },\n {\n name: \"projects:read\",\n description: \"List projects and files in projects.\",\n rules: [\n \"GET /v1/projects/{project_id}/files\",\n \"GET /v1/teams/{team_id}/projects\",\n ],\n },\n {\n name: \"team_library_content:read\",\n description: \"Read published components and styles of teams.\",\n rules: [\n \"GET /v1/teams/{team_id}/component_sets\",\n \"GET /v1/teams/{team_id}/components\",\n \"GET /v1/teams/{team_id}/styles\",\n ],\n },\n {\n name: \"webhooks:read\",\n description: \"Read metadata of webhooks.\",\n rules: [\n \"GET /v2/teams/{team_id}/webhooks\",\n \"GET /v2/webhooks\",\n \"GET /v2/webhooks/{webhook_id}\",\n \"GET /v2/webhooks/{webhook_id}/requests\",\n ],\n },\n {\n name: \"webhooks:write\",\n description: \"Create and manage webhooks.\",\n rules: [\n \"POST /v2/webhooks\",\n \"PUT /v2/webhooks/{webhook_id}\",\n \"DELETE /v2/webhooks/{webhook_id}\",\n ],\n },\n ],\n },\n ],\n} as const satisfies FirewallConfig;\n"],"mappings":"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","names":[]}
package/index.js CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  extractSecretNames,
29
29
  extractVarNames,
30
30
  formatBytes,
31
+ formatIsoTimestamp,
31
32
  formatRelativeTime,
32
33
  getActiveOrg,
33
34
  getAgentEvents,
@@ -47,6 +48,7 @@ import {
47
48
  getToken,
48
49
  guaranteedConnectorProvidedBindingNames,
49
50
  isInteractive,
51
+ isSupportedFramework,
50
52
  isUUID,
51
53
  listRuns,
52
54
  listStorages,
@@ -56,10 +58,11 @@ import {
56
58
  listZeroVariables,
57
59
  loadConfig,
58
60
  loadValues,
59
- parseEvent,
61
+ parseBoundedLogCount,
60
62
  parseIdentifier,
61
63
  parsePermissionPolicies,
62
64
  parsePositiveLogCount,
65
+ parseSearchQuery,
63
66
  parseTime,
64
67
  pollEvents,
65
68
  prepareStorage,
@@ -74,7 +77,7 @@ import {
74
77
  uo,
75
78
  volumeConfigSchema,
76
79
  withErrorHandler
77
- } from "./chunk-O6UJMPWI.js";
80
+ } from "./chunk-6EGWCGWC.js";
78
81
  import {
79
82
  external_exports
80
83
  } from "./chunk-S3DAXIKY.js";
@@ -411,7 +414,7 @@ function getConfigPath() {
411
414
  return join(os.homedir(), ".vm0", "config.json");
412
415
  }
413
416
  var infoCommand = new Command().name("info").description("Display environment and debug information").action(async () => {
414
- console.log(source_default.bold(`VM0 CLI v${"9.209.3"}`));
417
+ console.log(source_default.bold(`VM0 CLI v${"9.210.0"}`));
415
418
  console.log();
416
419
  const config = await loadConfig();
417
420
  const hasEnvToken = !!process.env.VM0_TOKEN;
@@ -1113,7 +1116,7 @@ var composeCommand = new Command().name("compose").description("Create or update
1113
1116
  options.autoUpdate = false;
1114
1117
  }
1115
1118
  if (options.autoUpdate !== false) {
1116
- await startSilentUpgrade("9.209.3");
1119
+ await startSilentUpgrade("9.210.0");
1117
1120
  }
1118
1121
  try {
1119
1122
  const { config, agentName, agent, basePath } = await loadAndValidateConfig(resolvedConfigFile);
@@ -1210,7 +1213,7 @@ var mainRunCommand = new Command().name("run").description("Run an agent").argum
1210
1213
  withErrorHandler(
1211
1214
  async (identifier, prompt, options) => {
1212
1215
  if (options.autoUpdate !== false) {
1213
- await startSilentUpgrade("9.209.3");
1216
+ await startSilentUpgrade("9.210.0");
1214
1217
  }
1215
1218
  const { name, version } = parseIdentifier(identifier);
1216
1219
  let composeId;
@@ -2418,38 +2421,40 @@ init_esm_shims();
2418
2421
  // src/commands/logs/search.ts
2419
2422
  init_esm_shims();
2420
2423
  var SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
2421
- function renderEvent(event, renderer) {
2422
- const eventData = event.eventData;
2423
- const parsed = parseEvent(eventData);
2424
- if (parsed) {
2425
- parsed.timestamp = new Date(event.createdAt);
2424
+ function supportedSearchFramework(framework) {
2425
+ const normalized = framework ?? void 0;
2426
+ return isSupportedFramework(normalized) ? normalized : void 0;
2427
+ }
2428
+ function renderSearchEvent(event, framework, renderer, normalizer) {
2429
+ const parsedEvents = normalizer.process(
2430
+ event.eventData,
2431
+ supportedSearchFramework(framework),
2432
+ new Date(event.createdAt)
2433
+ );
2434
+ for (const parsed of parsedEvents) {
2435
+ renderer.render(parsed);
2436
+ }
2437
+ }
2438
+ function flushSearchRenderer(renderer, normalizer) {
2439
+ for (const parsed of normalizer.flush()) {
2426
2440
  renderer.render(parsed);
2427
2441
  }
2442
+ renderer.flush();
2428
2443
  }
2429
2444
  function formatRunHeader(runId, agentName, timestamp) {
2430
2445
  const shortId = runId.slice(0, 8);
2431
- const time = new Date(timestamp).toISOString().replace(/\.\d{3}Z$/, "Z");
2446
+ const time = formatIsoTimestamp(timestamp);
2432
2447
  return `\u2500\u2500 Run ${shortId} (${agentName}, ${time}) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`;
2433
2448
  }
2434
2449
  function parseContextOptions(options) {
2435
- const contextN = options.context ? parseInt(options.context, 10) : 0;
2436
- const before = options.beforeContext ? parseInt(options.beforeContext, 10) : contextN;
2437
- const after = options.afterContext ? parseInt(options.afterContext, 10) : contextN;
2438
- if (isNaN(before) || before < 0 || before > 10) {
2439
- throw new Error("--before-context must be between 0 and 10");
2440
- }
2441
- if (isNaN(after) || after < 0 || after > 10) {
2442
- throw new Error("--after-context must be between 0 and 10");
2443
- }
2450
+ const contextN = options.context !== void 0 ? parseBoundedLogCount(options.context, "--context", 0, 10) : 0;
2451
+ const before = options.beforeContext !== void 0 ? parseBoundedLogCount(options.beforeContext, "--before-context", 0, 10) : contextN;
2452
+ const after = options.afterContext !== void 0 ? parseBoundedLogCount(options.afterContext, "--after-context", 0, 10) : contextN;
2444
2453
  return { before, after };
2445
2454
  }
2446
2455
  function parseLimit2(value) {
2447
- if (!value) return void 0;
2448
- const limit = parseInt(value, 10);
2449
- if (isNaN(limit) || limit < 1 || limit > 50) {
2450
- throw new Error("--limit must be between 1 and 50");
2451
- }
2452
- return limit;
2456
+ if (value === void 0) return void 0;
2457
+ return parseBoundedLogCount(value, "--limit", 1, 50);
2453
2458
  }
2454
2459
  function renderResults(response) {
2455
2460
  const grouped = /* @__PURE__ */ new Map();
@@ -2477,16 +2482,22 @@ function renderResults(response) {
2477
2482
  for (const result of group.results) {
2478
2483
  const renderer = new EventRenderer({
2479
2484
  showTimestamp: true,
2480
- verbose: false,
2481
- buffered: false
2485
+ verbose: false
2482
2486
  });
2487
+ const normalizer = new EventStreamNormalizer();
2483
2488
  for (const event of result.contextBefore) {
2484
- renderEvent(event, renderer);
2489
+ renderSearchEvent(event, result.framework, renderer, normalizer);
2485
2490
  }
2486
- renderEvent(result.matchedEvent, renderer);
2491
+ renderSearchEvent(
2492
+ result.matchedEvent,
2493
+ result.framework,
2494
+ renderer,
2495
+ normalizer
2496
+ );
2487
2497
  for (const event of result.contextAfter) {
2488
- renderEvent(event, renderer);
2498
+ renderSearchEvent(event, result.framework, renderer, normalizer);
2489
2499
  }
2500
+ flushSearchRenderer(renderer, normalizer);
2490
2501
  }
2491
2502
  }
2492
2503
  if (response.hasMore) {
@@ -2500,11 +2511,26 @@ function renderResults(response) {
2500
2511
  }
2501
2512
  var searchCommand = new Command().name("search").description("Search agent events across runs").argument("<keyword>", "Search keyword").option("-A, --after-context <n>", "Show n events after each match").option("-B, --before-context <n>", "Show n events before each match").option("-C, --context <n>", "Show n events before and after each match").option("--agent <id>", "Filter by agent ID").option("--run <id>", "Filter by specific run ID").option("--since <time>", "Search logs since (default: 7d)").option("--limit <n>", "Maximum number of matches (default: 20)").action(
2502
2513
  withErrorHandler(async (keyword, options) => {
2514
+ const searchKeyword = parseSearchQuery(keyword, "Keyword");
2515
+ if (options.agent !== void 0 && !isUUID(options.agent)) {
2516
+ console.error(
2517
+ source_default.red(`\u2717 Invalid agent ID "${options.agent}" \u2014 expected a UUID`)
2518
+ );
2519
+ console.error(source_default.dim(" Run: vm0 run list to find agent IDs"));
2520
+ process.exit(1);
2521
+ }
2522
+ if (options.run !== void 0 && !isUUID(options.run)) {
2523
+ console.error(
2524
+ source_default.red(`\u2717 Invalid run ID "${options.run}" \u2014 expected a UUID`)
2525
+ );
2526
+ console.error(source_default.dim(" Run: vm0 run list to find run IDs"));
2527
+ process.exit(1);
2528
+ }
2503
2529
  const { before, after } = parseContextOptions(options);
2504
- const since = options.since ? parseTime(options.since) : Date.now() - SEVEN_DAYS_MS;
2530
+ const since = options.since !== void 0 ? parseTime(options.since) : Date.now() - SEVEN_DAYS_MS;
2505
2531
  const limit = parseLimit2(options.limit);
2506
2532
  const response = await searchLogs({
2507
- keyword,
2533
+ keyword: searchKeyword,
2508
2534
  agentId: options.agent,
2509
2535
  runId: options.run,
2510
2536
  since,
@@ -2534,7 +2560,7 @@ function buildPlatformLogsUrl(apiUrl, runId) {
2534
2560
  return `http://${hostname}:3001/logs/${runId}`;
2535
2561
  }
2536
2562
  const parts = hostname.split(".");
2537
- if (parts[0] === "www" || parts[0] === "app" || parts[0] === "platform") {
2563
+ if (parts[0] === "www" || parts[0] === "app" || parts[0] === "platform" || parts[0] === "api") {
2538
2564
  parts[0] = "app";
2539
2565
  } else {
2540
2566
  parts.unshift("app");
@@ -2543,6 +2569,12 @@ function buildPlatformLogsUrl(apiUrl, runId) {
2543
2569
  const port = url.port ? `:${url.port}` : "";
2544
2570
  return `https://${platformHost}${port}/logs/${runId}`;
2545
2571
  }
2572
+ function supportedLogFramework(framework) {
2573
+ return isSupportedFramework(framework) ? framework : void 0;
2574
+ }
2575
+ function hasLogFramework(framework) {
2576
+ return framework !== void 0 && framework !== null;
2577
+ }
2546
2578
  function formatMetric(metric) {
2547
2579
  const memPercent = (metric.mem_used / metric.mem_total * 100).toFixed(1);
2548
2580
  const diskPercent = (metric.disk_used / metric.disk_total * 100).toFixed(1);
@@ -2742,6 +2774,13 @@ var logsCommand = new Command().name("logs").description("View and search agent
2742
2774
  logsCommand.help();
2743
2775
  return;
2744
2776
  }
2777
+ if (!isUUID(runId)) {
2778
+ console.error(
2779
+ source_default.red(`\u2717 Invalid run ID "${runId}" \u2014 expected a UUID`)
2780
+ );
2781
+ console.error(source_default.dim(" Run: vm0 run list to find run IDs"));
2782
+ process.exit(1);
2783
+ }
2745
2784
  const logType = getLogType(options);
2746
2785
  const countModes = [
2747
2786
  options.tail !== void 0,
@@ -2754,7 +2793,7 @@ var logsCommand = new Command().name("logs").description("View and search agent
2754
2793
  );
2755
2794
  }
2756
2795
  let since;
2757
- if (options.since) {
2796
+ if (options.since !== void 0) {
2758
2797
  since = parseTime(options.since);
2759
2798
  }
2760
2799
  const isAll = options.all === true;
@@ -2795,13 +2834,21 @@ var logsCommand = new Command().name("logs").description("View and search agent
2795
2834
  )
2796
2835
  );
2797
2836
  async function showAgentEvents(runId, options, platformUrl) {
2798
- let framework = "claude-code";
2799
2837
  const events = await collectLogItems({
2800
2838
  fetchPage: async (request) => {
2801
2839
  const response = await getAgentEvents(runId, request);
2802
- framework = response.framework;
2840
+ const responseFramework = response.framework;
2803
2841
  return {
2804
- items: response.events,
2842
+ items: response.events.map((event) => {
2843
+ const framework2 = supportedLogFramework(
2844
+ responseFramework ?? void 0
2845
+ );
2846
+ return {
2847
+ event,
2848
+ ...framework2 ? { framework: framework2 } : {},
2849
+ useDefaultFramework: !hasLogFramework(responseFramework)
2850
+ };
2851
+ }),
2805
2852
  hasMore: response.hasMore,
2806
2853
  nextCursor: response.nextCursor
2807
2854
  };
@@ -2815,14 +2862,23 @@ async function showAgentEvents(runId, options, platformUrl) {
2815
2862
  console.log(source_default.yellow("No agent events found for this run"));
2816
2863
  return;
2817
2864
  }
2865
+ const framework = events.find((item) => {
2866
+ return item.framework !== void 0;
2867
+ })?.framework;
2818
2868
  const renderer = createLogRenderer(true);
2819
2869
  const normalizer = new EventStreamNormalizer();
2820
- for (const event of events) {
2821
- renderAgentEvent(event, renderer, normalizer, framework);
2870
+ for (const item of events) {
2871
+ renderAgentEvent(
2872
+ item.event,
2873
+ renderer,
2874
+ normalizer,
2875
+ item.framework ?? (item.useDefaultFramework ? framework : void 0)
2876
+ );
2822
2877
  }
2823
2878
  for (const parsed of normalizer.flush()) {
2824
2879
  renderer.render(parsed);
2825
2880
  }
2881
+ renderer.flush();
2826
2882
  console.log(source_default.dim(`View on platform: ${platformUrl}`));
2827
2883
  }
2828
2884
  async function showSystemLog(runId, options) {
@@ -3016,13 +3072,13 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
3016
3072
  if (latestVersion === null) {
3017
3073
  throw new Error("Could not check for updates. Please try again later.");
3018
3074
  }
3019
- if (latestVersion === "9.209.3") {
3020
- console.log(source_default.green(`\u2713 Already up to date (${"9.209.3"})`));
3075
+ if (latestVersion === "9.210.0") {
3076
+ console.log(source_default.green(`\u2713 Already up to date (${"9.210.0"})`));
3021
3077
  return;
3022
3078
  }
3023
3079
  console.log(
3024
3080
  source_default.yellow(
3025
- `Current version: ${"9.209.3"} -> Latest version: ${latestVersion}`
3081
+ `Current version: ${"9.210.0"} -> Latest version: ${latestVersion}`
3026
3082
  )
3027
3083
  );
3028
3084
  console.log();
@@ -3049,7 +3105,7 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
3049
3105
  const success = await performUpgrade(packageManager);
3050
3106
  if (success) {
3051
3107
  console.log(
3052
- source_default.green(`\u2713 Upgraded from ${"9.209.3"} to ${latestVersion}`)
3108
+ source_default.green(`\u2713 Upgraded from ${"9.210.0"} to ${latestVersion}`)
3053
3109
  );
3054
3110
  return;
3055
3111
  }
@@ -3116,7 +3172,7 @@ var whoamiCommand = new Command().name("whoami").description("Show current ident
3116
3172
 
3117
3173
  // src/index.ts
3118
3174
  var program = new Command();
3119
- program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.209.3");
3175
+ program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.210.0");
3120
3176
  program.addCommand(authCommand);
3121
3177
  program.addCommand(infoCommand);
3122
3178
  program.addCommand(composeCommand);