replicas-cli 0.2.540 → 0.2.543

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/dist/index.cjs +113 -12
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -7630,6 +7630,7 @@ var AGENT = {
7630
7630
  CODEX: "codex",
7631
7631
  CURSOR: "cursor",
7632
7632
  DEEPSEEK: "deepseek",
7633
+ FX: "fx",
7633
7634
  OPENCODE: "opencode",
7634
7635
  PI: "pi",
7635
7636
  RELAY: "relay"
@@ -7666,6 +7667,11 @@ var AGENT_PROVIDER_OPTIONS = [
7666
7667
  label: "DeepSeek Harness",
7667
7668
  description: "Use DeepSeek Harness for tasks"
7668
7669
  },
7670
+ {
7671
+ value: "fx",
7672
+ label: "fx",
7673
+ description: "Use fx for tasks"
7674
+ },
7669
7675
  {
7670
7676
  value: "opencode",
7671
7677
  label: "Opencode",
@@ -7689,6 +7695,7 @@ var THINKING_LEVELS_BY_AGENT = {
7689
7695
  codex: [...STANDARD_THINKING_LEVELS, "ultra"],
7690
7696
  cursor: STANDARD_THINKING_LEVELS,
7691
7697
  deepseek: STANDARD_THINKING_LEVELS,
7698
+ fx: STANDARD_THINKING_LEVELS,
7692
7699
  opencode: STANDARD_THINKING_LEVELS,
7693
7700
  pi: STANDARD_THINKING_LEVELS,
7694
7701
  relay: [...STANDARD_THINKING_LEVELS, "ultracode"]
@@ -7710,6 +7717,8 @@ function getProviderDisplayName(provider, variant = "short") {
7710
7717
  return "Cursor";
7711
7718
  case "deepseek":
7712
7719
  return variant === "long" ? "DeepSeek Harness" : "DeepSeek";
7720
+ case "fx":
7721
+ return "fx";
7713
7722
  case "opencode":
7714
7723
  return "Opencode";
7715
7724
  case "pi":
@@ -7740,7 +7749,8 @@ var CREDENTIAL_METHOD = {
7740
7749
  BEDROCK: "bedrock",
7741
7750
  OPENCODE_GO: "opencode-go",
7742
7751
  ASTER: "aster",
7743
- OPENROUTER: "openrouter"
7752
+ OPENROUTER: "openrouter",
7753
+ AI_GATEWAY: "ai-gateway"
7744
7754
  };
7745
7755
  var CREDENTIAL_TYPE = {
7746
7756
  CLAUDE_OAUTH: "claude",
@@ -7753,7 +7763,8 @@ var CREDENTIAL_TYPE = {
7753
7763
  CURSOR_API_KEY: "cursor_api_key",
7754
7764
  OPENCODE_GO_API_KEY: "opencode_go_api_key",
7755
7765
  ASTER_API_KEY: "aster_api_key",
7756
- OPENROUTER_API_KEY: "openrouter_api_key"
7766
+ OPENROUTER_API_KEY: "openrouter_api_key",
7767
+ AI_GATEWAY_API_KEY: "ai_gateway_api_key"
7757
7768
  };
7758
7769
  var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
7759
7770
  [AGENT.CLAUDE]: [
@@ -7773,6 +7784,9 @@ var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
7773
7784
  [AGENT.DEEPSEEK]: [
7774
7785
  { method: CREDENTIAL_METHOD.OPENROUTER, credentialType: CREDENTIAL_TYPE.OPENROUTER_API_KEY }
7775
7786
  ],
7787
+ [AGENT.FX]: [
7788
+ { method: CREDENTIAL_METHOD.AI_GATEWAY, credentialType: CREDENTIAL_TYPE.AI_GATEWAY_API_KEY }
7789
+ ],
7776
7790
  [AGENT.OPENCODE]: [
7777
7791
  { method: CREDENTIAL_METHOD.OPENCODE_GO, credentialType: CREDENTIAL_TYPE.OPENCODE_GO_API_KEY },
7778
7792
  { method: CREDENTIAL_METHOD.ASTER, credentialType: CREDENTIAL_TYPE.ASTER_API_KEY },
@@ -22384,14 +22398,23 @@ var GPT_5_6_TERRA_MODEL = "gpt-5.6-terra";
22384
22398
  var GPT_5_6_LUNA_MODEL = "gpt-5.6-luna";
22385
22399
  var DEFAULT_CODEX_MODEL = GPT_5_6_SOL_MODEL;
22386
22400
  var DEFAULT_OPENCODE_MODEL = "z-ai/glm-5.2";
22401
+ var DEEPSEEK_V4_PRO_MODEL = "deepseek/deepseek-v4-pro-0813";
22402
+ var DEEPSEEK_V4_FLASH_MODEL = "deepseek/deepseek-v4-flash-0731";
22403
+ var DEFAULT_FX_MODEL = "zai/glm-5.2";
22387
22404
  var OPENROUTER_MODELS = [
22388
22405
  DEFAULT_OPENCODE_MODEL,
22389
- "deepseek/deepseek-v4-pro",
22390
- "deepseek/deepseek-v4-flash",
22406
+ DEEPSEEK_V4_PRO_MODEL,
22407
+ DEEPSEEK_V4_FLASH_MODEL,
22391
22408
  "minimax/minimax-m3",
22392
22409
  "xiaomi/mimo-v2.5-pro",
22393
22410
  "moonshotai/kimi-k2.6"
22394
22411
  ];
22412
+ function prioritizeDeepseekModels(models) {
22413
+ return [
22414
+ ...models.filter((model) => model.startsWith("deepseek/")),
22415
+ ...models.filter((model) => !model.startsWith("deepseek/"))
22416
+ ];
22417
+ }
22395
22418
  function normalizeClaudeModel(model) {
22396
22419
  if (model === "opus" || model === CLAUDE_OPUS_1M_MODEL || model === LEGACY_CLAUDE_OPUS_1M_MODEL) {
22397
22420
  return DEFAULT_CLAUDE_MODEL;
@@ -22462,7 +22485,8 @@ var AGENT_MODELS = {
22462
22485
  CLAUDE_HAIKU_4_5_MODEL,
22463
22486
  "kimi-k2.5"
22464
22487
  ],
22465
- deepseek: [...OPENROUTER_MODELS],
22488
+ deepseek: prioritizeDeepseekModels(OPENROUTER_MODELS),
22489
+ fx: [DEFAULT_FX_MODEL],
22466
22490
  opencode: [...OPENROUTER_MODELS, ...ASTER_MODELS],
22467
22491
  pi: [...OPENROUTER_MODELS, ...ASTER_MODELS],
22468
22492
  relay: [CLAUDE_FABLE_5_MODEL, CLAUDE_OPUS_5_MODEL, CLAUDE_OPUS_4_8_MODEL, CLAUDE_SONNET_5_MODEL]
@@ -22482,8 +22506,8 @@ var MODEL_LABELS = {
22482
22506
  [GPT_5_6_LUNA_MODEL]: "GPT-5.6 Luna",
22483
22507
  "gpt-5.5": "GPT-5.5",
22484
22508
  [DEFAULT_OPENCODE_MODEL]: "GLM 5.2 via OpenRouter",
22485
- "deepseek/deepseek-v4-pro": "DeepSeek V4 Pro via OpenRouter",
22486
- "deepseek/deepseek-v4-flash": "DeepSeek V4 Flash via OpenRouter",
22509
+ [DEEPSEEK_V4_PRO_MODEL]: "DeepSeek V4 Pro via OpenRouter",
22510
+ [DEEPSEEK_V4_FLASH_MODEL]: "DeepSeek V4 Flash via OpenRouter",
22487
22511
  "minimax/minimax-m3": "MiniMax M3 via OpenRouter",
22488
22512
  "xiaomi/mimo-v2.5-pro": "MiMo V2.5 Pro via OpenRouter",
22489
22513
  "moonshotai/kimi-k2.6": "Kimi K2.6 via OpenRouter",
@@ -24354,7 +24378,7 @@ var headlessFilesystemAgentResultSchema = external_exports.object({
24354
24378
  });
24355
24379
 
24356
24380
  // ../shared/src/cli-version.ts
24357
- var CLI_VERSION = "0.2.540";
24381
+ var CLI_VERSION = "0.2.543";
24358
24382
 
24359
24383
  // ../shared/src/version.ts
24360
24384
  function compareVersions(v1, v2) {
@@ -24877,6 +24901,15 @@ function areUserMessagesWithinMatchWindow(a, b) {
24877
24901
  return a.content === b.content && Math.abs(parseTimestampMs(a.timestamp) - parseTimestampMs(b.timestamp)) <= USER_MESSAGE_MATCH_GRACE_PERIOD_MS;
24878
24902
  }
24879
24903
 
24904
+ // ../shared/src/agent-event-utils.ts
24905
+ function getUserMessage(event) {
24906
+ return event.type === "event_msg" && event.payload.type === "user_message" && typeof event.payload.message === "string" ? event.payload.message : null;
24907
+ }
24908
+ function getUserMessageId(event) {
24909
+ const messageId = event.payload[USER_MESSAGE_ID_PAYLOAD_KEY];
24910
+ return typeof messageId === "string" ? messageId : null;
24911
+ }
24912
+
24880
24913
  // ../shared/src/display-message/parsers/codex-parser.ts
24881
24914
  function getStatusFromExitCode(exitCode) {
24882
24915
  return exitCode === 0 ? "completed" : "failed";
@@ -25461,6 +25494,71 @@ function parseDeepseekEvents(events) {
25461
25494
  return messages;
25462
25495
  }
25463
25496
 
25497
+ // ../shared/src/display-message/parsers/fx-parser.ts
25498
+ function getFxTextChunk(update, kind) {
25499
+ if (!isRecord(update) || update.sessionUpdate !== kind || !isRecord(update.content) || update.content.type !== "text") return null;
25500
+ return typeof update.content.text === "string" && update.content.text ? update.content.text : null;
25501
+ }
25502
+ function parseFxEvents(events) {
25503
+ const messages = [];
25504
+ for (const event of events) {
25505
+ const content = getUserMessage(event);
25506
+ if (content !== null) {
25507
+ if (content.trim()) {
25508
+ messages.push({
25509
+ id: getUserMessageId(event) ?? `fx-user-${event.timestamp}`,
25510
+ type: "user",
25511
+ content,
25512
+ timestamp: event.timestamp
25513
+ });
25514
+ }
25515
+ continue;
25516
+ }
25517
+ if (event.type === "fx-error") {
25518
+ messages.push({
25519
+ id: `fx-error-${event.timestamp}`,
25520
+ type: "error",
25521
+ message: typeof event.payload.message === "string" ? event.payload.message : "fx failed",
25522
+ timestamp: event.timestamp
25523
+ });
25524
+ continue;
25525
+ }
25526
+ if (event.type === "fx-turn-complete") {
25527
+ for (const message of messages) {
25528
+ if (message.type === "reasoning" && message.status === "in_progress") message.status = "completed";
25529
+ }
25530
+ continue;
25531
+ }
25532
+ if (event.type !== "fx-session-update" || !isRecord(event.payload.update)) continue;
25533
+ const update = event.payload.update;
25534
+ const kind = update.sessionUpdate;
25535
+ if (kind === "agent_message_chunk" || kind === "agent_thought_chunk") {
25536
+ const content2 = getFxTextChunk(update, kind);
25537
+ if (!content2) continue;
25538
+ const id = typeof update.messageId === "string" ? `fx-${update.messageId}` : `fx-${kind}-${event.timestamp}`;
25539
+ const existing = messages.find((message) => message.id === id);
25540
+ const text = `${existing && "content" in existing && typeof existing.content === "string" ? existing.content : ""}${content2}`;
25541
+ upsertDisplayMessage(messages, kind === "agent_thought_chunk" ? { id, type: "reasoning", content: text, status: "in_progress", timestamp: existing?.timestamp ?? event.timestamp } : { id, type: "agent", content: text, timestamp: existing?.timestamp ?? event.timestamp });
25542
+ continue;
25543
+ }
25544
+ if ((kind === "tool_call" || kind === "tool_call_update") && typeof update.toolCallId === "string") {
25545
+ const id = `fx-tool-${update.toolCallId}`;
25546
+ const existing = messages.find((message) => message.id === id && message.type === "tool_call");
25547
+ const status = update.status === "completed" || update.status === "failed" ? update.status === "failed" ? "failed" : "completed" : "in_progress";
25548
+ upsertDisplayMessage(messages, createCallDisplayMessage({
25549
+ id,
25550
+ server: "fx",
25551
+ tool: typeof update.name === "string" ? update.name : typeof update.title === "string" ? update.title : existing?.tool ?? "tool",
25552
+ input: update.rawInput === void 0 ? existing?.input : isRecord(update.rawInput) ? update.rawInput : stringifyDisplayValue(update.rawInput),
25553
+ output: update.rawOutput === void 0 ? existing?.output : stringifyDisplayValue(update.rawOutput),
25554
+ status,
25555
+ timestamp: event.timestamp
25556
+ }));
25557
+ }
25558
+ }
25559
+ return messages;
25560
+ }
25561
+
25464
25562
  // ../shared/src/display-message/parsers/opencode-parser.ts
25465
25563
  function timestampFromMs(value, fallback) {
25466
25564
  return typeof value === "number" && Number.isFinite(value) ? new Date(value).toISOString() : fallback;
@@ -26625,6 +26723,9 @@ function parseAgentEvents(events, agentType) {
26625
26723
  if (agentType === "deepseek") {
26626
26724
  return parseDeepseekEvents(events);
26627
26725
  }
26726
+ if (agentType === "fx") {
26727
+ return parseFxEvents(events);
26728
+ }
26628
26729
  if (agentType === "opencode") {
26629
26730
  return parseOpencodeEvents(events);
26630
26731
  }
@@ -30866,9 +30967,9 @@ org.action(async () => {
30866
30967
  process.exit(1);
30867
30968
  }
30868
30969
  });
30869
- program.command("connect <workspace-name>").description("Connect to a workspace via SSH").action(async (workspaceName) => {
30970
+ program.command("connect <workspace-name...>").description("Connect to a workspace via SSH").action(async (workspaceName) => {
30870
30971
  try {
30871
- await connectCommand(workspaceName);
30972
+ await connectCommand(workspaceName.join(" "));
30872
30973
  } catch (error51) {
30873
30974
  if (error51 instanceof Error) {
30874
30975
  console.error(import_chalk22.default.red(`
@@ -30878,9 +30979,9 @@ program.command("connect <workspace-name>").description("Connect to a workspace
30878
30979
  process.exit(1);
30879
30980
  }
30880
30981
  });
30881
- program.command("code <workspace-name>").description("Open a workspace in VSCode/Cursor via Remote SSH").action(async (workspaceName) => {
30982
+ program.command("code <workspace-name...>").description("Open a workspace in VSCode/Cursor via Remote SSH").action(async (workspaceName) => {
30882
30983
  try {
30883
- await codeCommand(workspaceName);
30984
+ await codeCommand(workspaceName.join(" "));
30884
30985
  } catch (error51) {
30885
30986
  if (error51 instanceof Error) {
30886
30987
  console.error(import_chalk22.default.red(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.540",
3
+ "version": "0.2.543",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {