replicas-cli 0.2.256 → 0.2.258

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 +70 -4
  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.256";
9239
+ var CLI_VERSION = "0.2.258";
9220
9240
 
9221
9241
  // ../shared/src/engine/environment.ts
9222
9242
  var DESKTOP_NOVNC_PORT = 6080;
@@ -9874,6 +9894,8 @@ function parseClaudeEvents(events, parentToolUseId) {
9874
9894
  });
9875
9895
  const toolCallMap = /* @__PURE__ */ new Map();
9876
9896
  const taskMessageMap = /* @__PURE__ */ new Map();
9897
+ const partialIndexes = /* @__PURE__ */ new Map();
9898
+ const completedPartialStreamIds = /* @__PURE__ */ new Set();
9877
9899
  const taskAccumulator = new TaskAccumulator();
9878
9900
  const taskSnapshot = () => taskAccumulator.getTasks().map((task) => ({
9879
9901
  text: task.subject,
@@ -9881,6 +9903,34 @@ function parseClaudeEvents(events, parentToolUseId) {
9881
9903
  itemStatus: task.status
9882
9904
  }));
9883
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
+ }
9884
9934
  if (event.type === "claude-user") {
9885
9935
  const content = normalizeContentBlocks(event.payload.message?.content);
9886
9936
  const toolResult = content.find((c) => c.type === "tool_result");
@@ -9916,6 +9966,10 @@ function parseClaudeEvents(events, parentToolUseId) {
9916
9966
  }
9917
9967
  }
9918
9968
  if (event.type === "claude-assistant") {
9969
+ const messageId = event.payload.message?.id;
9970
+ if (typeof messageId === "string" && messageId) {
9971
+ completedPartialStreamIds.add(messageId);
9972
+ }
9919
9973
  const contentBlocks = normalizeContentBlocks(event.payload.message?.content);
9920
9974
  contentBlocks.forEach((block) => {
9921
9975
  if (block.type === "text" && block.text) {
@@ -10205,7 +10259,11 @@ function parseClaudeEvents(events, parentToolUseId) {
10205
10259
  }
10206
10260
  }
10207
10261
  });
10208
- 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
+ });
10209
10267
  }
10210
10268
 
10211
10269
  // ../shared/src/agent-event-utils.ts
@@ -14217,6 +14275,10 @@ function patchChat(chats, chatId, patch) {
14217
14275
  return changed ? next.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)) : chats;
14218
14276
  }
14219
14277
  function getEventSignature(value) {
14278
+ const streamId = getClaudePartialMessageStreamId(value);
14279
+ if (streamId) {
14280
+ return `${CLAUDE_PARTIAL_MESSAGE_EVENT_TYPE}:${streamId}`;
14281
+ }
14220
14282
  const normalize = (input) => {
14221
14283
  if (Array.isArray(input)) return input.map(normalize);
14222
14284
  if (input && typeof input === "object") {
@@ -14373,8 +14435,12 @@ function useWorkspaceEvents(workspaceId, enabled = true) {
14373
14435
  if (!current) {
14374
14436
  return { thread_id: null, events: [event.payload.event] };
14375
14437
  }
14376
- const hasDuplicate = current.events.some((e) => getEventSignature(e) === incomingSignature);
14377
- 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
+ }
14378
14444
  return { ...current, events: [...current.events, event.payload.event] };
14379
14445
  }
14380
14446
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-cli",
3
- "version": "0.2.256",
3
+ "version": "0.2.258",
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": {