replicas-cli 0.2.255 → 0.2.257

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.mjs +72 -13
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -7575,6 +7575,26 @@ function getProviderDisplayName(provider) {
7575
7575
  }
7576
7576
 
7577
7577
  // ../shared/src/event.ts
7578
+ var CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE = "claude-partial-message";
7579
+ function coerceClaudePartialMessagePayload(payload) {
7580
+ const streamId = payload.streamId;
7581
+ if (typeof streamId !== "string" || !streamId) return null;
7582
+ const parentToolUseId = payload.parent_tool_use_id;
7583
+ const text = typeof payload.text === "string" && payload.text ? payload.text : void 0;
7584
+ const thinking = typeof payload.thinking === "string" && payload.thinking ? payload.thinking : void 0;
7585
+ if (!text && !thinking) return null;
7586
+ return {
7587
+ streamId,
7588
+ parent_tool_use_id: typeof parentToolUseId === "string" ? parentToolUseId : null,
7589
+ ...text ? { text } : {},
7590
+ ...thinking ? { thinking } : {},
7591
+ status: payload.status === "completed" ? "completed" : "in_progress"
7592
+ };
7593
+ }
7594
+ function getClaudePartialMessageStreamId(event) {
7595
+ if (event.type !== CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE) return null;
7596
+ return typeof event.payload.streamId === "string" && event.payload.streamId ? event.payload.streamId : null;
7597
+ }
7578
7598
  var USER_MESSAGE_ID_PAYLOAD_KEY = "replicasMessageId";
7579
7599
  var CODEX_ASP_ITEM_ID_PAYLOAD_KEY = "codexAspItemId";
7580
7600
  var CODEX_QUOTA_STATUS_EVENT_TYPE = "codex-quota-status";
@@ -9216,7 +9236,7 @@ var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
9216
9236
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
9217
9237
 
9218
9238
  // ../shared/src/cli-version.ts
9219
- var CLI_VERSION = "0.2.255";
9239
+ var CLI_VERSION = "0.2.257";
9220
9240
 
9221
9241
  // ../shared/src/engine/environment.ts
9222
9242
  var DESKTOP_NOVNC_PORT = 6080;
@@ -9253,7 +9273,7 @@ function normalizeClaudeModel(model) {
9253
9273
  }
9254
9274
  var AGENT_MODELS = {
9255
9275
  claude: [CLAUDE_OPUS_1M_MODEL, CLAUDE_FABLE_5_MODEL, "sonnet", "haiku"],
9256
- codex: [DEFAULT_CODEX_MODEL, "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex", "gpt-5.3-codex-spark", "gpt-5.2-codex", "gpt-5.2", "gpt-5.1-codex-max", "gpt-5.1-codex", "gpt-5.1", "gpt-5-codex", "gpt-5"],
9276
+ codex: [DEFAULT_CODEX_MODEL, "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex", "gpt-5.2"],
9257
9277
  relay: [CLAUDE_OPUS_1M_MODEL, CLAUDE_FABLE_5_MODEL, "sonnet"]
9258
9278
  };
9259
9279
  var MODEL_LABELS = {
@@ -9267,14 +9287,7 @@ var MODEL_LABELS = {
9267
9287
  "gpt-5.4": "GPT-5.4",
9268
9288
  "gpt-5.4-mini": "GPT-5.4 Mini",
9269
9289
  "gpt-5.3-codex": "GPT-5.3 Codex",
9270
- "gpt-5.3-codex-spark": "GPT-5.3 Codex Spark",
9271
- "gpt-5.2-codex": "GPT-5.2 Codex",
9272
- "gpt-5.2": "GPT-5.2",
9273
- "gpt-5.1-codex-max": "GPT-5.1 Codex Max",
9274
- "gpt-5.1-codex": "GPT-5.1 Codex",
9275
- "gpt-5.1": "GPT-5.1",
9276
- "gpt-5-codex": "GPT-5 Codex",
9277
- "gpt-5": "GPT-5"
9290
+ "gpt-5.2": "GPT-5.2"
9278
9291
  };
9279
9292
  var CANVAS_KIND_BY_EXTENSION = {
9280
9293
  ".md": { kind: "markdown", mimeType: "text/markdown; charset=utf-8" },
@@ -9881,6 +9894,8 @@ function parseClaudeEvents(events, parentToolUseId) {
9881
9894
  });
9882
9895
  const toolCallMap = /* @__PURE__ */ new Map();
9883
9896
  const taskMessageMap = /* @__PURE__ */ new Map();
9897
+ const partialIndexes = /* @__PURE__ */ new Map();
9898
+ const completedPartialStreamIds = /* @__PURE__ */ new Set();
9884
9899
  const taskAccumulator = new TaskAccumulator();
9885
9900
  const taskSnapshot = () => taskAccumulator.getTasks().map((task) => ({
9886
9901
  text: task.subject,
@@ -9888,6 +9903,34 @@ function parseClaudeEvents(events, parentToolUseId) {
9888
9903
  itemStatus: task.status
9889
9904
  }));
9890
9905
  filteredEvents.forEach((event) => {
9906
+ if (event.type === CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE) {
9907
+ const payload = coerceClaudePartialMessagePayload(event.payload);
9908
+ if (!payload) return;
9909
+ const existing = partialIndexes.get(payload.streamId) ?? {};
9910
+ if (payload.thinking) {
9911
+ const reasoningMessage = {
9912
+ id: `reasoning-partial:${payload.streamId}`,
9913
+ type: "reasoning",
9914
+ content: payload.thinking,
9915
+ status: payload.status,
9916
+ timestamp: event.timestamp
9917
+ };
9918
+ if (existing.reasoning !== void 0) messages[existing.reasoning] = reasoningMessage;
9919
+ else existing.reasoning = messages.push(reasoningMessage) - 1;
9920
+ }
9921
+ if (payload.text) {
9922
+ const agentMessage = {
9923
+ id: `agent-partial:${payload.streamId}`,
9924
+ type: "agent",
9925
+ content: payload.text,
9926
+ timestamp: event.timestamp
9927
+ };
9928
+ if (existing.agent !== void 0) messages[existing.agent] = agentMessage;
9929
+ else existing.agent = messages.push(agentMessage) - 1;
9930
+ }
9931
+ partialIndexes.set(payload.streamId, existing);
9932
+ return;
9933
+ }
9891
9934
  if (event.type === "claude-user") {
9892
9935
  const content = normalizeContentBlocks(event.payload.message?.content);
9893
9936
  const toolResult = content.find((c) => c.type === "tool_result");
@@ -9923,6 +9966,10 @@ function parseClaudeEvents(events, parentToolUseId) {
9923
9966
  }
9924
9967
  }
9925
9968
  if (event.type === "claude-assistant") {
9969
+ const messageId = event.payload.message?.id;
9970
+ if (typeof messageId === "string" && messageId) {
9971
+ completedPartialStreamIds.add(messageId);
9972
+ }
9926
9973
  const contentBlocks = normalizeContentBlocks(event.payload.message?.content);
9927
9974
  contentBlocks.forEach((block) => {
9928
9975
  if (block.type === "text" && block.text) {
@@ -10212,7 +10259,11 @@ function parseClaudeEvents(events, parentToolUseId) {
10212
10259
  }
10213
10260
  }
10214
10261
  });
10215
- return messages;
10262
+ if (partialIndexes.size === 0 || completedPartialStreamIds.size === 0) return messages;
10263
+ return messages.filter((message) => {
10264
+ const prefix = ["reasoning-partial:", "agent-partial:"].find((p) => message.id.startsWith(p));
10265
+ return !prefix || !completedPartialStreamIds.has(message.id.slice(prefix.length));
10266
+ });
10216
10267
  }
10217
10268
 
10218
10269
  // ../shared/src/agent-event-utils.ts
@@ -14224,6 +14275,10 @@ function patchChat(chats, chatId, patch) {
14224
14275
  return changed ? next.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)) : chats;
14225
14276
  }
14226
14277
  function getEventSignature(value) {
14278
+ const streamId = getClaudePartialMessageStreamId(value);
14279
+ if (streamId) {
14280
+ return `${CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE}:${streamId}`;
14281
+ }
14227
14282
  const normalize = (input) => {
14228
14283
  if (Array.isArray(input)) return input.map(normalize);
14229
14284
  if (input && typeof input === "object") {
@@ -14380,8 +14435,12 @@ function useWorkspaceEvents(workspaceId, enabled = true) {
14380
14435
  if (!current) {
14381
14436
  return { thread_id: null, events: [event.payload.event] };
14382
14437
  }
14383
- const hasDuplicate = current.events.some((e) => getEventSignature(e) === incomingSignature);
14384
- if (hasDuplicate) return current;
14438
+ const existingIndex = current.events.findIndex((e) => getEventSignature(e) === incomingSignature);
14439
+ if (existingIndex !== -1) {
14440
+ const events = current.events.slice();
14441
+ events[existingIndex] = event.payload.event;
14442
+ return { ...current, events };
14443
+ }
14385
14444
  return { ...current, events: [...current.events, event.payload.event] };
14386
14445
  }
14387
14446
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.255",
3
+ "version": "0.2.257",
4
4
  "description": "CLI for managing Replicas workspaces - SSH into cloud dev environments with automatic port forwarding",
5
5
  "main": "dist/index.mjs",
6
6
  "bin": {