replicas-engine 0.1.481 → 0.1.482

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/src/index.js +120 -81
  2. package/package.json +1 -1
package/dist/src/index.js CHANGED
@@ -101,6 +101,7 @@ var CODEX_ASP_ITEM_ID_PAYLOAD_KEY = "codexAspItemId";
101
101
  var CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE = "codex-asp-transcript-updated";
102
102
  var CODEX_QUOTA_STATUS_EVENT_TYPE = "codex-quota-status";
103
103
  var COMPACTION_STATUS_EVENT_TYPE = "compaction-status";
104
+ var CHAT_INTERRUPTED_EVENT_TYPE = "replicas-interrupted";
104
105
  var CHAT_GOAL_EVENT_TYPE = "chat-goal";
105
106
  var AUTH_RETRY_STATUS_EVENT_TYPE = "auth-retry-status";
106
107
  var CONTEXT_USAGE_EVENT_TYPE = "context-usage";
@@ -582,7 +583,7 @@ var WORKSPACE_SIZES = ["small", "large"];
582
583
  var INVALID_WORKSPACE_SIZE_ERROR = `Invalid size: must be one of ${WORKSPACE_SIZES.join(", ")}`;
583
584
 
584
585
  // ../shared/src/e2b.ts
585
- var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-23-v1";
586
+ var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-23-v2";
586
587
 
587
588
  // ../shared/src/runtime-env.ts
588
589
  function shellQuotePosix(value) {
@@ -3263,16 +3264,80 @@ function isTerminalBackgroundTaskStatus(status) {
3263
3264
  // ../shared/src/display-message/constants.ts
3264
3265
  var USER_MESSAGE_MATCH_GRACE_PERIOD_MS = 3e4;
3265
3266
 
3266
- // ../shared/src/json.ts
3267
- function safeJsonParse(str, fallback) {
3268
- try {
3269
- return JSON.parse(str);
3270
- } catch {
3271
- return fallback;
3267
+ // ../shared/src/agent-event-utils.ts
3268
+ function getUserMessage(event) {
3269
+ return event.type === "event_msg" && event.payload.type === "user_message" && typeof event.payload.message === "string" ? event.payload.message : null;
3270
+ }
3271
+ function getUserMessageId(event) {
3272
+ const messageId = event.payload[USER_MESSAGE_ID_PAYLOAD_KEY];
3273
+ return typeof messageId === "string" ? messageId : null;
3274
+ }
3275
+ function getUserMessageItemId(event) {
3276
+ const itemId = event.payload[CODEX_ASP_ITEM_ID_PAYLOAD_KEY];
3277
+ return typeof itemId === "string" ? itemId : null;
3278
+ }
3279
+ function parseTimestampMs(timestamp) {
3280
+ const value = Date.parse(timestamp);
3281
+ return Number.isFinite(value) ? value : 0;
3282
+ }
3283
+ function getEventTimestampMs(event) {
3284
+ return parseTimestampMs(event.timestamp);
3285
+ }
3286
+ function areSameUserMessageEvents(a, b) {
3287
+ const aMessage = getUserMessage(a);
3288
+ const bMessage = getUserMessage(b);
3289
+ if (!aMessage || aMessage !== bMessage) return false;
3290
+ const aMessageId = getUserMessageId(a);
3291
+ const bMessageId = getUserMessageId(b);
3292
+ if (aMessageId || bMessageId) return aMessageId === bMessageId;
3293
+ const aItemId = getUserMessageItemId(a);
3294
+ const bItemId = getUserMessageItemId(b);
3295
+ if (aItemId || bItemId) return aItemId === bItemId;
3296
+ return Math.abs(getEventTimestampMs(a) - getEventTimestampMs(b)) <= USER_MESSAGE_MATCH_GRACE_PERIOD_MS;
3297
+ }
3298
+ function parseAgentEventJsonl(content, options = {}) {
3299
+ const events = [];
3300
+ for (const line of content.split("\n")) {
3301
+ const trimmed = line.trim();
3302
+ if (!trimmed) continue;
3303
+ try {
3304
+ const parsed = JSON.parse(trimmed);
3305
+ if (isAgentBackendEvent(parsed)) {
3306
+ events.push(parsed);
3307
+ } else {
3308
+ options.onInvalidLine?.({ line: trimmed });
3309
+ }
3310
+ } catch (error) {
3311
+ options.onInvalidLine?.({ line: trimmed, error });
3312
+ }
3313
+ }
3314
+ return events;
3315
+ }
3316
+ function parseAgentEventJsonlWithCodexAspTranscript(content, options = {}) {
3317
+ const events = [];
3318
+ let transcript = null;
3319
+ const transcriptsByThreadId = /* @__PURE__ */ new Map();
3320
+ for (const event of parseAgentEventJsonl(content, options)) {
3321
+ if (event.type !== CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE) {
3322
+ events.push(event);
3323
+ continue;
3324
+ }
3325
+ const delta = event.payload.transcriptDelta;
3326
+ if (isCodexAspTranscriptDelta(delta)) {
3327
+ const previous = transcriptsByThreadId.get(delta.threadId) ?? null;
3328
+ transcript = applyCodexAspTranscriptDelta(previous, delta);
3329
+ } else if (isCodexAspTranscript(event.payload.transcript)) {
3330
+ transcript = event.payload.transcript;
3331
+ }
3332
+ if (transcript) {
3333
+ transcriptsByThreadId.set(transcript.threadId, transcript);
3334
+ }
3272
3335
  }
3336
+ return { events, transcript, transcriptsByThreadId };
3273
3337
  }
3274
3338
 
3275
3339
  // ../shared/src/display-message/parsers/utils.ts
3340
+ var INTERRUPTED_MESSAGE_REGEX = /^\[Request interrupted by user.*\]$/;
3276
3341
  function userMessageImages(value) {
3277
3342
  if (!Array.isArray(value)) return void 0;
3278
3343
  const images = value.filter((item) => isRecord(item) && item.type === "image" && typeof item.mediaType === "string" && typeof item.data === "string");
@@ -3288,6 +3353,15 @@ function stringifyDisplayValue(value) {
3288
3353
  }
3289
3354
  }
3290
3355
 
3356
+ // ../shared/src/json.ts
3357
+ function safeJsonParse(str, fallback) {
3358
+ try {
3359
+ return JSON.parse(str);
3360
+ } catch {
3361
+ return fallback;
3362
+ }
3363
+ }
3364
+
3291
3365
  // ../shared/src/display-message/parsers/codex-parser.ts
3292
3366
  function getStatusFromExitCode(exitCode) {
3293
3367
  return exitCode === 0 ? "completed" : "failed";
@@ -4084,6 +4158,7 @@ function parseClaudeEvents(events, parentToolUseId) {
4084
4158
  const assistantThinking = /* @__PURE__ */ new Map();
4085
4159
  const assistantTextCounts = /* @__PURE__ */ new Map();
4086
4160
  const acceptedUserMessageIndexes = /* @__PURE__ */ new Set();
4161
+ let turnWasInterrupted = false;
4087
4162
  const taskAccumulator = new TaskAccumulator();
4088
4163
  const taskSnapshot = () => taskAccumulator.getTasks().map((task) => ({
4089
4164
  text: task.subject,
@@ -4154,6 +4229,7 @@ function parseClaudeEvents(events, parentToolUseId) {
4154
4229
  if (LOCAL_COMMAND_ECHO_REGEX.test(textContent.trim())) {
4155
4230
  return;
4156
4231
  }
4232
+ turnWasInterrupted = INTERRUPTED_MESSAGE_REGEX.test(textContent.trim());
4157
4233
  const images = content.filter((c) => c.type === "image" && c.source).map((c) => {
4158
4234
  const source = c.source;
4159
4235
  return {
@@ -4401,8 +4477,21 @@ function parseClaudeEvents(events, parentToolUseId) {
4401
4477
  }
4402
4478
  if (event.type === "claude-result") {
4403
4479
  const payload = coerceClaudeResultPayload(event.payload);
4480
+ const errorList = payload.errors || [];
4481
+ if (turnWasInterrupted) {
4482
+ turnWasInterrupted = false;
4483
+ const genuineErrors = errorList.filter((e) => !e.includes("[ede_diagnostic]"));
4484
+ if (genuineErrors.length > 0) {
4485
+ messages.push({
4486
+ id: `error-${event.timestamp}`,
4487
+ type: "error",
4488
+ message: genuineErrors.join("\n"),
4489
+ timestamp: event.timestamp
4490
+ });
4491
+ }
4492
+ return;
4493
+ }
4404
4494
  if (isClaudeResultError(payload)) {
4405
- const errorList = payload.errors || [];
4406
4495
  const errorMessage = errorList.length > 0 ? errorList.join("\n") : "Claude session encountered an unexpected error.";
4407
4496
  messages.push({
4408
4497
  id: `error-${event.timestamp}`,
@@ -4541,78 +4630,6 @@ function parseClaudeEvents(events, parentToolUseId) {
4541
4630
  return messages.filter((_, index) => !staleIndexes.has(index));
4542
4631
  }
4543
4632
 
4544
- // ../shared/src/agent-event-utils.ts
4545
- function getUserMessage(event) {
4546
- return event.type === "event_msg" && event.payload.type === "user_message" && typeof event.payload.message === "string" ? event.payload.message : null;
4547
- }
4548
- function getUserMessageId(event) {
4549
- const messageId = event.payload[USER_MESSAGE_ID_PAYLOAD_KEY];
4550
- return typeof messageId === "string" ? messageId : null;
4551
- }
4552
- function getUserMessageItemId(event) {
4553
- const itemId = event.payload[CODEX_ASP_ITEM_ID_PAYLOAD_KEY];
4554
- return typeof itemId === "string" ? itemId : null;
4555
- }
4556
- function parseTimestampMs(timestamp) {
4557
- const value = Date.parse(timestamp);
4558
- return Number.isFinite(value) ? value : 0;
4559
- }
4560
- function getEventTimestampMs(event) {
4561
- return parseTimestampMs(event.timestamp);
4562
- }
4563
- function areSameUserMessageEvents(a, b) {
4564
- const aMessage = getUserMessage(a);
4565
- const bMessage = getUserMessage(b);
4566
- if (!aMessage || aMessage !== bMessage) return false;
4567
- const aMessageId = getUserMessageId(a);
4568
- const bMessageId = getUserMessageId(b);
4569
- if (aMessageId || bMessageId) return aMessageId === bMessageId;
4570
- const aItemId = getUserMessageItemId(a);
4571
- const bItemId = getUserMessageItemId(b);
4572
- if (aItemId || bItemId) return aItemId === bItemId;
4573
- return Math.abs(getEventTimestampMs(a) - getEventTimestampMs(b)) <= USER_MESSAGE_MATCH_GRACE_PERIOD_MS;
4574
- }
4575
- function parseAgentEventJsonl(content, options = {}) {
4576
- const events = [];
4577
- for (const line of content.split("\n")) {
4578
- const trimmed = line.trim();
4579
- if (!trimmed) continue;
4580
- try {
4581
- const parsed = JSON.parse(trimmed);
4582
- if (isAgentBackendEvent(parsed)) {
4583
- events.push(parsed);
4584
- } else {
4585
- options.onInvalidLine?.({ line: trimmed });
4586
- }
4587
- } catch (error) {
4588
- options.onInvalidLine?.({ line: trimmed, error });
4589
- }
4590
- }
4591
- return events;
4592
- }
4593
- function parseAgentEventJsonlWithCodexAspTranscript(content, options = {}) {
4594
- const events = [];
4595
- let transcript = null;
4596
- const transcriptsByThreadId = /* @__PURE__ */ new Map();
4597
- for (const event of parseAgentEventJsonl(content, options)) {
4598
- if (event.type !== CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE) {
4599
- events.push(event);
4600
- continue;
4601
- }
4602
- const delta = event.payload.transcriptDelta;
4603
- if (isCodexAspTranscriptDelta(delta)) {
4604
- const previous = transcriptsByThreadId.get(delta.threadId) ?? null;
4605
- transcript = applyCodexAspTranscriptDelta(previous, delta);
4606
- } else if (isCodexAspTranscript(event.payload.transcript)) {
4607
- transcript = event.payload.transcript;
4608
- }
4609
- if (transcript) {
4610
- transcriptsByThreadId.set(transcript.threadId, transcript);
4611
- }
4612
- }
4613
- return { events, transcript, transcriptsByThreadId };
4614
- }
4615
-
4616
4633
  // ../shared/src/display-message/parsers/codex-asp-parser.ts
4617
4634
  var DUPLICATE_WINDOW_MS = 5 * 60 * 1e3;
4618
4635
 
@@ -7822,6 +7839,13 @@ var CodingAgentManager = class {
7822
7839
  const { queue, isProcessing } = this.drainQueueForInterrupt();
7823
7840
  if (isProcessing) {
7824
7841
  await this.interruptActiveTurn();
7842
+ const event = {
7843
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
7844
+ type: CHAT_INTERRUPTED_EVENT_TYPE,
7845
+ payload: {}
7846
+ };
7847
+ this.onEvent(event);
7848
+ this.getHistorySink()?.append(event);
7825
7849
  }
7826
7850
  this.emitInterruptedQueueEvent(queue);
7827
7851
  return {
@@ -8681,6 +8705,9 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
8681
8705
  this.disallowedToolsOverride = options.disallowedTools;
8682
8706
  this.initializeManager(this.processMessageInternal.bind(this));
8683
8707
  }
8708
+ getHistorySink() {
8709
+ return this.historyFile;
8710
+ }
8684
8711
  async interruptActiveTurn() {
8685
8712
  this.pendingInterrupt = true;
8686
8713
  if (this.activeQuery) {
@@ -9802,7 +9829,7 @@ var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
9802
9829
  var MIN_CODEX_CLI_VERSION = "0.144.6";
9803
9830
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
9804
9831
  var codexCliVersionEnsured = null;
9805
- var ENGINE_PACKAGE_VERSION = "0.1.481";
9832
+ var ENGINE_PACKAGE_VERSION = "0.1.482";
9806
9833
  var INITIALIZE_METHOD = "initialize";
9807
9834
  var INITIALIZED_NOTIFICATION = "initialized";
9808
9835
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -10821,6 +10848,9 @@ var CodexAspManager = class extends CodingAgentManager {
10821
10848
  }
10822
10849
  this.currentThreadId = this.initialSessionId ?? replayed?.transcript?.threadId ?? null;
10823
10850
  }
10851
+ getHistorySink() {
10852
+ return { append: (event) => this.trackHistoryEvent(event) };
10853
+ }
10824
10854
  async interruptActiveTurn() {
10825
10855
  if (!this.currentThreadId || !this.activeTurnId) {
10826
10856
  return;
@@ -12047,6 +12077,9 @@ var CursorManager = class extends CodingAgentManager {
12047
12077
  async initialize() {
12048
12078
  await mkdir11(dirname5(this.historyFilePath), { recursive: true });
12049
12079
  }
12080
+ getHistorySink() {
12081
+ return this.historyFile;
12082
+ }
12050
12083
  async interruptActiveTurn() {
12051
12084
  await this.cancelRun(this.activeRun);
12052
12085
  this.abortActiveTurn?.();
@@ -12584,6 +12617,9 @@ var OpencodeManager = class extends CodingAgentManager {
12584
12617
  async initialize() {
12585
12618
  await mkdir12(dirname6(this.historyFilePath), { recursive: true });
12586
12619
  }
12620
+ getHistorySink() {
12621
+ return this.historyFile;
12622
+ }
12587
12623
  async interruptActiveTurn() {
12588
12624
  this.activeAbortController?.abort();
12589
12625
  if (this.client && this.sessionId) {
@@ -13112,6 +13148,9 @@ var PiManager = class extends CodingAgentManager {
13112
13148
  async initialize() {
13113
13149
  await mkdir13(dirname7(this.historyFilePath), { recursive: true });
13114
13150
  }
13151
+ getHistorySink() {
13152
+ return this.historyFile;
13153
+ }
13115
13154
  async interruptActiveTurn() {
13116
13155
  await this.session?.abort();
13117
13156
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.481",
3
+ "version": "0.1.482",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",