@vm0/cli 9.107.2 → 9.110.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
@@ -70,7 +70,7 @@ import {
70
70
  source_default,
71
71
  volumeConfigSchema,
72
72
  withErrorHandler
73
- } from "./chunk-AJN5ZMHZ.js";
73
+ } from "./chunk-XBIXXD2C.js";
74
74
 
75
75
  // src/index.ts
76
76
  init_esm_shims();
@@ -463,7 +463,7 @@ function getConfigPath() {
463
463
  return join(homedir(), ".vm0", "config.json");
464
464
  }
465
465
  var infoCommand = new Command().name("info").description("Display environment and debug information").action(async () => {
466
- console.log(source_default.bold(`VM0 CLI v${"9.107.2"}`));
466
+ console.log(source_default.bold(`VM0 CLI v${"9.110.0"}`));
467
467
  console.log();
468
468
  const config = await loadConfig();
469
469
  const hasEnvToken = !!process.env.VM0_TOKEN;
@@ -4492,7 +4492,7 @@ var composeCommand = new Command().name("compose").description("Create or update
4492
4492
  options.autoUpdate = false;
4493
4493
  }
4494
4494
  if (options.autoUpdate !== false) {
4495
- await startSilentUpgrade("9.107.2");
4495
+ await startSilentUpgrade("9.110.0");
4496
4496
  }
4497
4497
  try {
4498
4498
  let result;
@@ -4572,7 +4572,7 @@ var mainRunCommand = new Command().name("run").description("Run an agent").argum
4572
4572
  withErrorHandler(
4573
4573
  async (identifier, prompt, options) => {
4574
4574
  if (options.autoUpdate !== false) {
4575
- await startSilentUpgrade("9.107.2");
4575
+ await startSilentUpgrade("9.110.0");
4576
4576
  }
4577
4577
  const { name, version } = parseIdentifier(identifier);
4578
4578
  let composeId;
@@ -6313,7 +6313,7 @@ var cookAction = new Command().name("cook").description("Quick start: prepare, c
6313
6313
  withErrorHandler(
6314
6314
  async (prompt, options) => {
6315
6315
  if (options.autoUpdate !== false) {
6316
- const shouldExit = await checkAndUpgrade("9.107.2", prompt);
6316
+ const shouldExit = await checkAndUpgrade("9.110.0", prompt);
6317
6317
  if (shouldExit) {
6318
6318
  process.exit(0);
6319
6319
  }
@@ -7080,13 +7080,13 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
7080
7080
  if (latestVersion === null) {
7081
7081
  throw new Error("Could not check for updates. Please try again later.");
7082
7082
  }
7083
- if (latestVersion === "9.107.2") {
7084
- console.log(source_default.green(`\u2713 Already up to date (${"9.107.2"})`));
7083
+ if (latestVersion === "9.110.0") {
7084
+ console.log(source_default.green(`\u2713 Already up to date (${"9.110.0"})`));
7085
7085
  return;
7086
7086
  }
7087
7087
  console.log(
7088
7088
  source_default.yellow(
7089
- `Current version: ${"9.107.2"} -> Latest version: ${latestVersion}`
7089
+ `Current version: ${"9.110.0"} -> Latest version: ${latestVersion}`
7090
7090
  )
7091
7091
  );
7092
7092
  console.log();
@@ -7113,7 +7113,7 @@ var upgradeCommand = new Command().name("upgrade").description("Upgrade vm0 CLI
7113
7113
  const success = await performUpgrade(packageManager);
7114
7114
  if (success) {
7115
7115
  console.log(
7116
- source_default.green(`\u2713 Upgraded from ${"9.107.2"} to ${latestVersion}`)
7116
+ source_default.green(`\u2713 Upgraded from ${"9.110.0"} to ${latestVersion}`)
7117
7117
  );
7118
7118
  return;
7119
7119
  }
@@ -7180,7 +7180,7 @@ var whoamiCommand = new Command().name("whoami").description("Show current ident
7180
7180
 
7181
7181
  // src/index.ts
7182
7182
  var program = new Command();
7183
- program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.107.2");
7183
+ program.name("vm0").description("VM0 CLI - Build and run agents with natural language").version("9.110.0");
7184
7184
  program.addCommand(authCommand);
7185
7185
  program.addCommand(infoCommand);
7186
7186
  program.addCommand(composeCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vm0/cli",
3
- "version": "9.107.2",
3
+ "version": "9.110.0",
4
4
  "description": "CLI application",
5
5
  "repository": {
6
6
  "type": "git",
package/zero.js CHANGED
@@ -11,9 +11,11 @@ import {
11
11
  Option,
12
12
  __toESM,
13
13
  allowsCustomModel,
14
+ appendVoiceChatContextEvent,
14
15
  completeSlackFileUpload,
15
16
  configureGlobalProxyFromEnv,
16
17
  connectorTypeSchema,
18
+ createPhoneCall,
17
19
  createSkill,
18
20
  createZeroAgent,
19
21
  createZeroComputerConnector,
@@ -49,11 +51,13 @@ import {
49
51
  getDefaultAuthMethod,
50
52
  getDefaultModel,
51
53
  getModels,
54
+ getPhoneCallDetail,
52
55
  getScopeDiff,
53
56
  getSecretsForAuthMethod,
54
57
  getSelectableProviderTypes,
55
58
  getSkill,
56
59
  getToken,
60
+ getVoiceChatContextEvents,
57
61
  getZeroAgent,
58
62
  getZeroAgentInstructions,
59
63
  getZeroAgentUserConnectors,
@@ -75,6 +79,7 @@ import {
75
79
  isInteractive,
76
80
  isUUID,
77
81
  leaveZeroOrg,
82
+ listPhoneCalls,
78
83
  listSkills,
79
84
  listZeroAgents,
80
85
  listZeroConnectors,
@@ -123,7 +128,7 @@ import {
123
128
  upsertZeroOrgModelProvider,
124
129
  withErrorHandler,
125
130
  zeroAgentCustomSkillNameSchema
126
- } from "./chunk-AJN5ZMHZ.js";
131
+ } from "./chunk-XBIXXD2C.js";
127
132
 
128
133
  // src/zero.ts
129
134
  init_esm_shims();
@@ -5751,6 +5756,246 @@ Examples:
5751
5756
  );
5752
5757
  var zeroComputerUseCommand = new Command().name("computer-use").description("Remote desktop control for cloud agents").addCommand(hostCommand).addCommand(clientCommand);
5753
5758
 
5759
+ // src/commands/zero/phone/index.ts
5760
+ init_esm_shims();
5761
+
5762
+ // src/commands/zero/phone/call.ts
5763
+ init_esm_shims();
5764
+ import * as fs from "fs";
5765
+ function isErrnoException(err) {
5766
+ return err instanceof Error && "code" in err;
5767
+ }
5768
+ var callCommand = new Command().name("call").description("Initiate an outbound phone call").argument(
5769
+ "<to-number>",
5770
+ "Phone number to call (E.164 format, e.g. +14155551234)"
5771
+ ).option("--greeting <message>", "Initial greeting when the recipient answers").option(
5772
+ "--greeting-file <path>",
5773
+ "Read greeting from a file (use instead of --greeting)"
5774
+ ).option(
5775
+ "--system-prompt <prompt>",
5776
+ "Override the agent's system prompt for this call"
5777
+ ).option(
5778
+ "--prompt-file <path>",
5779
+ "Read system prompt from a file (use instead of --system-prompt)"
5780
+ ).action(
5781
+ withErrorHandler(
5782
+ async (toNumber, options) => {
5783
+ if (!/^\+[1-9]\d{1,14}$/.test(toNumber)) {
5784
+ console.error(
5785
+ source_default.red(
5786
+ "Invalid phone number format. Use E.164 (e.g. +14155551234)"
5787
+ )
5788
+ );
5789
+ process.exit(1);
5790
+ }
5791
+ if (options.systemPrompt && options.promptFile) {
5792
+ console.error(
5793
+ source_default.red("Cannot use both --system-prompt and --prompt-file")
5794
+ );
5795
+ process.exit(1);
5796
+ }
5797
+ if (options.greeting && options.greetingFile) {
5798
+ console.error(
5799
+ source_default.red("Cannot use both --greeting and --greeting-file")
5800
+ );
5801
+ process.exit(1);
5802
+ }
5803
+ let systemPrompt = options.systemPrompt;
5804
+ if (options.promptFile) {
5805
+ try {
5806
+ systemPrompt = fs.readFileSync(options.promptFile, "utf-8");
5807
+ } catch (err) {
5808
+ if (isErrnoException(err) && err.code === "ENOENT") {
5809
+ console.error(source_default.red(`File not found: ${options.promptFile}`));
5810
+ process.exit(1);
5811
+ }
5812
+ throw err;
5813
+ }
5814
+ }
5815
+ let greeting = options.greeting;
5816
+ if (options.greetingFile) {
5817
+ try {
5818
+ greeting = fs.readFileSync(options.greetingFile, "utf-8");
5819
+ } catch (err) {
5820
+ if (isErrnoException(err) && err.code === "ENOENT") {
5821
+ console.error(
5822
+ source_default.red(`File not found: ${options.greetingFile}`)
5823
+ );
5824
+ process.exit(1);
5825
+ }
5826
+ throw err;
5827
+ }
5828
+ }
5829
+ const result = await createPhoneCall({
5830
+ toNumber,
5831
+ greeting,
5832
+ systemPrompt
5833
+ });
5834
+ console.log(source_default.green("Call initiated"));
5835
+ console.log(` ${"Call ID:".padEnd(12)}${source_default.cyan(result.callId)}`);
5836
+ console.log(` ${"Status:".padEnd(12)}${result.status}`);
5837
+ }
5838
+ )
5839
+ );
5840
+
5841
+ // src/commands/zero/phone/record.ts
5842
+ init_esm_shims();
5843
+ function printTranscript(transcript) {
5844
+ if (Array.isArray(transcript)) {
5845
+ for (const entry of transcript) {
5846
+ if (typeof entry === "string") {
5847
+ console.log(` ${entry}`);
5848
+ } else if (typeof entry === "object" && entry !== null) {
5849
+ const e = entry;
5850
+ const role = e.role ?? e.speaker ?? "Unknown";
5851
+ const text = e.text ?? e.content ?? e.body ?? "";
5852
+ console.log(` ${source_default.dim(`[${role}]`)} ${text}`);
5853
+ }
5854
+ }
5855
+ } else if (typeof transcript === "string") {
5856
+ console.log(` ${transcript}`);
5857
+ } else {
5858
+ console.log(` ${JSON.stringify(transcript, null, 2)}`);
5859
+ }
5860
+ }
5861
+ function printCallInfo(call, callId) {
5862
+ console.log(
5863
+ ` ${"Call ID:".padEnd(16)}${source_default.cyan(String(call.id ?? callId))}`
5864
+ );
5865
+ console.log(
5866
+ ` ${"From:".padEnd(16)}${String(call.fromNumber ?? call.from_number ?? "")}`
5867
+ );
5868
+ console.log(
5869
+ ` ${"To:".padEnd(16)}${String(call.toNumber ?? call.to_number ?? "")}`
5870
+ );
5871
+ console.log(` ${"Status:".padEnd(16)}${String(call.status ?? "")}`);
5872
+ console.log(
5873
+ ` ${"Duration:".padEnd(16)}${String(call.durationSeconds ?? call.duration_seconds ?? "N/A")}s`
5874
+ );
5875
+ console.log(
5876
+ ` ${"Started:".padEnd(16)}${String(call.startedAt ?? call.started_at ?? "")}`
5877
+ );
5878
+ }
5879
+ async function showCallDetail(callId) {
5880
+ const result = await getPhoneCallDetail(callId);
5881
+ console.log(source_default.bold("Call Detail"));
5882
+ console.log();
5883
+ printCallInfo(result.call, callId);
5884
+ console.log();
5885
+ console.log(source_default.bold("Transcript"));
5886
+ console.log();
5887
+ printTranscript(result.transcript);
5888
+ }
5889
+ async function showCallList(limit) {
5890
+ const result = await listPhoneCalls({ limit });
5891
+ if (result.data.length === 0) {
5892
+ console.log(source_default.dim("No phone calls found"));
5893
+ return;
5894
+ }
5895
+ console.log(source_default.bold("Recent Calls"));
5896
+ console.log();
5897
+ for (const call of result.data) {
5898
+ const id = String(call.id ?? "");
5899
+ const from = String(call.fromNumber ?? call.from_number ?? "");
5900
+ const to = String(call.toNumber ?? call.to_number ?? "");
5901
+ const status = String(call.status ?? "");
5902
+ const duration = call.durationSeconds ?? call.duration_seconds;
5903
+ const snippet = String(
5904
+ call.lastTranscriptSnippet ?? call.last_transcript_snippet ?? ""
5905
+ );
5906
+ console.log(` ${source_default.cyan(id)}`);
5907
+ console.log(
5908
+ ` ${from} \u2192 ${to} ${source_default.dim(status)}${duration != null ? ` ${duration}s` : ""}`
5909
+ );
5910
+ if (snippet) {
5911
+ console.log(` ${source_default.dim(snippet.slice(0, 80))}`);
5912
+ }
5913
+ console.log();
5914
+ }
5915
+ console.log(
5916
+ source_default.dim(`Showing ${result.data.length} of ${result.total} call(s)`)
5917
+ );
5918
+ }
5919
+ var recordCommand = new Command().name("record").description("View phone call history and transcripts").argument("[call-id]", "Call ID to view details (omit to list recent calls)").option("-n, --limit <number>", "Number of calls to show", "10").action(
5920
+ withErrorHandler(
5921
+ async (callId, options) => {
5922
+ if (callId) {
5923
+ await showCallDetail(callId);
5924
+ } else {
5925
+ const limit = parseInt(options.limit, 10) || 10;
5926
+ await showCallList(limit);
5927
+ }
5928
+ }
5929
+ )
5930
+ );
5931
+
5932
+ // src/commands/zero/phone/index.ts
5933
+ var zeroPhoneCommand = new Command().name("phone").description("Make and manage phone calls").addCommand(callCommand).addCommand(recordCommand);
5934
+
5935
+ // src/commands/zero/voice-chat/index.ts
5936
+ init_esm_shims();
5937
+
5938
+ // src/commands/zero/voice-chat/context/index.ts
5939
+ init_esm_shims();
5940
+
5941
+ // src/commands/zero/voice-chat/context/get.ts
5942
+ init_esm_shims();
5943
+ var voiceChatContextGetCommand = new Command().name("get").description("Read shared context events for a voice-chat session").argument("<session-id>", "Voice-chat session ID").option(
5944
+ "--after <seq>",
5945
+ "Only return events after this sequence number",
5946
+ parseInt
5947
+ ).action(
5948
+ withErrorHandler(async (sessionId, options) => {
5949
+ const data = await getVoiceChatContextEvents(sessionId, options.after);
5950
+ console.log(JSON.stringify(data, null, 2));
5951
+ })
5952
+ );
5953
+
5954
+ // src/commands/zero/voice-chat/context/append.ts
5955
+ init_esm_shims();
5956
+ import { readFileSync as readFileSync7 } from "fs";
5957
+ var voiceChatContextAppendCommand = new Command().name("append").description("Append an event to voice-chat shared context").argument("<session-id>", "Voice-chat session ID").requiredOption(
5958
+ "--source <source>",
5959
+ "Event source (system|user|talker|worker)"
5960
+ ).requiredOption("--type <type>", "Event type").option(
5961
+ "--content <content>",
5962
+ "Event content (reads from stdin if not provided)"
5963
+ ).addHelpText(
5964
+ "after",
5965
+ `
5966
+ Examples:
5967
+ Append with content: zero voice-chat context append <session-id> --source worker --type result --content "Done"
5968
+ Pipe from stdin: echo "Done" | zero voice-chat context append <session-id> --source worker --type result`
5969
+ ).action(
5970
+ withErrorHandler(
5971
+ async (sessionId, options) => {
5972
+ let content = options.content;
5973
+ if (!content && process.stdin.isTTY === false) {
5974
+ content = readFileSync7("/dev/stdin", "utf8").trim();
5975
+ }
5976
+ const data = await appendVoiceChatContextEvent(sessionId, {
5977
+ source: options.source,
5978
+ type: options.type,
5979
+ content
5980
+ });
5981
+ console.log(JSON.stringify(data, null, 2));
5982
+ }
5983
+ )
5984
+ );
5985
+
5986
+ // src/commands/zero/voice-chat/context/index.ts
5987
+ var voiceChatContextCommand = new Command().name("context").description("Read and write voice-chat shared context").addCommand(voiceChatContextGetCommand).addCommand(voiceChatContextAppendCommand);
5988
+
5989
+ // src/commands/zero/voice-chat/index.ts
5990
+ var zeroVoiceChatCommand = new Command().name("voice-chat").description("Read and write voice-chat shared context events").addCommand(voiceChatContextCommand).addHelpText(
5991
+ "after",
5992
+ `
5993
+ Examples:
5994
+ Read all events: zero voice-chat context get <session-id>
5995
+ Read new events: zero voice-chat context get <session-id> --after 5
5996
+ Append an event: zero voice-chat context append <session-id> --source worker --type result --content "Done"`
5997
+ );
5998
+
5754
5999
  // src/zero.ts
5755
6000
  var COMMAND_CAPABILITY_MAP = {
5756
6001
  agent: "agent:read",
@@ -5764,7 +6009,9 @@ var COMMAND_CAPABILITY_MAP = {
5764
6009
  whoami: null,
5765
6010
  "ask-user": null,
5766
6011
  "developer-support": null,
5767
- "computer-use": "computer-use:write"
6012
+ "computer-use": "computer-use:write",
6013
+ phone: "phone:write",
6014
+ "voice-chat": "voice-chat:write"
5768
6015
  };
5769
6016
  var DEFAULT_COMMANDS = [
5770
6017
  zeroOrgCommand,
@@ -5782,7 +6029,9 @@ var DEFAULT_COMMANDS = [
5782
6029
  zeroAskUserCommand,
5783
6030
  zeroSkillCommand,
5784
6031
  zeroDeveloperSupportCommand,
5785
- zeroComputerUseCommand
6032
+ zeroComputerUseCommand,
6033
+ zeroPhoneCommand,
6034
+ zeroVoiceChatCommand
5786
6035
  ];
5787
6036
  function shouldHideCommand(name, payload) {
5788
6037
  if (!payload) return false;
@@ -5801,7 +6050,7 @@ function registerZeroCommands(prog, commands) {
5801
6050
  var program = new Command();
5802
6051
  program.name("zero").description(
5803
6052
  "Zero CLI \u2014 interact with the zero platform from inside the sandbox"
5804
- ).version("9.107.2").addHelpText(
6053
+ ).version("9.110.0").addHelpText(
5805
6054
  "after",
5806
6055
  `
5807
6056
  Examples: