replicas-engine 0.1.480 → 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 +124 -84
  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-22-v5";
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) {
@@ -1614,9 +1615,10 @@ All writes are proposals: a human reviews them in the dashboard, and nothing tak
1614
1615
 
1615
1616
  Use \`replicas learnings --help\` and subcommand help such as \`replicas learnings add --help\`, \`replicas learnings update --help\`, or \`replicas learnings delete --help\` for current command syntax.
1616
1617
 
1617
- **Be very conservative:**
1618
- - Propose \`add\` only for repeatable, org-useful facts likely to matter again: explicit user corrections, hard-won environment or process knowledge.
1619
- - Never store task-specific details, anything derivable by reading the repo, or secrets/credentials.
1618
+ A human approves every proposal before it takes effect, so don't agonize over borderline calls \u2014 but keep proposals genuinely useful rather than reflexive.
1619
+
1620
+ - Propose \`add\` for anything repeatable and org-useful: user corrections and preferences, hard-won environment or process knowledge, conventions and decisions worth following, and gotchas that would waste time again. If you learned it the hard way this task, capture it.
1621
+ - Never store task-specific details that won't recur, facts trivially derivable by reading the repo, or secrets/credentials.
1620
1622
  - Propose \`update\` or \`delete\` when a learning is contradicted by the current code or docs, especially if the outdated guidance would affect future repeated work.
1621
1623
  - Write narrow triggers describing when the entry should surface (e.g. "UI/UX work on the admin panel"), not vague topics.`;
1622
1624
  var LEARNINGS_ABILITY = {
@@ -3262,16 +3264,80 @@ function isTerminalBackgroundTaskStatus(status) {
3262
3264
  // ../shared/src/display-message/constants.ts
3263
3265
  var USER_MESSAGE_MATCH_GRACE_PERIOD_MS = 3e4;
3264
3266
 
3265
- // ../shared/src/json.ts
3266
- function safeJsonParse(str, fallback) {
3267
- try {
3268
- return JSON.parse(str);
3269
- } catch {
3270
- 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
+ }
3271
3335
  }
3336
+ return { events, transcript, transcriptsByThreadId };
3272
3337
  }
3273
3338
 
3274
3339
  // ../shared/src/display-message/parsers/utils.ts
3340
+ var INTERRUPTED_MESSAGE_REGEX = /^\[Request interrupted by user.*\]$/;
3275
3341
  function userMessageImages(value) {
3276
3342
  if (!Array.isArray(value)) return void 0;
3277
3343
  const images = value.filter((item) => isRecord(item) && item.type === "image" && typeof item.mediaType === "string" && typeof item.data === "string");
@@ -3287,6 +3353,15 @@ function stringifyDisplayValue(value) {
3287
3353
  }
3288
3354
  }
3289
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
+
3290
3365
  // ../shared/src/display-message/parsers/codex-parser.ts
3291
3366
  function getStatusFromExitCode(exitCode) {
3292
3367
  return exitCode === 0 ? "completed" : "failed";
@@ -4083,6 +4158,7 @@ function parseClaudeEvents(events, parentToolUseId) {
4083
4158
  const assistantThinking = /* @__PURE__ */ new Map();
4084
4159
  const assistantTextCounts = /* @__PURE__ */ new Map();
4085
4160
  const acceptedUserMessageIndexes = /* @__PURE__ */ new Set();
4161
+ let turnWasInterrupted = false;
4086
4162
  const taskAccumulator = new TaskAccumulator();
4087
4163
  const taskSnapshot = () => taskAccumulator.getTasks().map((task) => ({
4088
4164
  text: task.subject,
@@ -4153,6 +4229,7 @@ function parseClaudeEvents(events, parentToolUseId) {
4153
4229
  if (LOCAL_COMMAND_ECHO_REGEX.test(textContent.trim())) {
4154
4230
  return;
4155
4231
  }
4232
+ turnWasInterrupted = INTERRUPTED_MESSAGE_REGEX.test(textContent.trim());
4156
4233
  const images = content.filter((c) => c.type === "image" && c.source).map((c) => {
4157
4234
  const source = c.source;
4158
4235
  return {
@@ -4400,8 +4477,21 @@ function parseClaudeEvents(events, parentToolUseId) {
4400
4477
  }
4401
4478
  if (event.type === "claude-result") {
4402
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
+ }
4403
4494
  if (isClaudeResultError(payload)) {
4404
- const errorList = payload.errors || [];
4405
4495
  const errorMessage = errorList.length > 0 ? errorList.join("\n") : "Claude session encountered an unexpected error.";
4406
4496
  messages.push({
4407
4497
  id: `error-${event.timestamp}`,
@@ -4540,78 +4630,6 @@ function parseClaudeEvents(events, parentToolUseId) {
4540
4630
  return messages.filter((_, index) => !staleIndexes.has(index));
4541
4631
  }
4542
4632
 
4543
- // ../shared/src/agent-event-utils.ts
4544
- function getUserMessage(event) {
4545
- return event.type === "event_msg" && event.payload.type === "user_message" && typeof event.payload.message === "string" ? event.payload.message : null;
4546
- }
4547
- function getUserMessageId(event) {
4548
- const messageId = event.payload[USER_MESSAGE_ID_PAYLOAD_KEY];
4549
- return typeof messageId === "string" ? messageId : null;
4550
- }
4551
- function getUserMessageItemId(event) {
4552
- const itemId = event.payload[CODEX_ASP_ITEM_ID_PAYLOAD_KEY];
4553
- return typeof itemId === "string" ? itemId : null;
4554
- }
4555
- function parseTimestampMs(timestamp) {
4556
- const value = Date.parse(timestamp);
4557
- return Number.isFinite(value) ? value : 0;
4558
- }
4559
- function getEventTimestampMs(event) {
4560
- return parseTimestampMs(event.timestamp);
4561
- }
4562
- function areSameUserMessageEvents(a, b) {
4563
- const aMessage = getUserMessage(a);
4564
- const bMessage = getUserMessage(b);
4565
- if (!aMessage || aMessage !== bMessage) return false;
4566
- const aMessageId = getUserMessageId(a);
4567
- const bMessageId = getUserMessageId(b);
4568
- if (aMessageId || bMessageId) return aMessageId === bMessageId;
4569
- const aItemId = getUserMessageItemId(a);
4570
- const bItemId = getUserMessageItemId(b);
4571
- if (aItemId || bItemId) return aItemId === bItemId;
4572
- return Math.abs(getEventTimestampMs(a) - getEventTimestampMs(b)) <= USER_MESSAGE_MATCH_GRACE_PERIOD_MS;
4573
- }
4574
- function parseAgentEventJsonl(content, options = {}) {
4575
- const events = [];
4576
- for (const line of content.split("\n")) {
4577
- const trimmed = line.trim();
4578
- if (!trimmed) continue;
4579
- try {
4580
- const parsed = JSON.parse(trimmed);
4581
- if (isAgentBackendEvent(parsed)) {
4582
- events.push(parsed);
4583
- } else {
4584
- options.onInvalidLine?.({ line: trimmed });
4585
- }
4586
- } catch (error) {
4587
- options.onInvalidLine?.({ line: trimmed, error });
4588
- }
4589
- }
4590
- return events;
4591
- }
4592
- function parseAgentEventJsonlWithCodexAspTranscript(content, options = {}) {
4593
- const events = [];
4594
- let transcript = null;
4595
- const transcriptsByThreadId = /* @__PURE__ */ new Map();
4596
- for (const event of parseAgentEventJsonl(content, options)) {
4597
- if (event.type !== CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE) {
4598
- events.push(event);
4599
- continue;
4600
- }
4601
- const delta = event.payload.transcriptDelta;
4602
- if (isCodexAspTranscriptDelta(delta)) {
4603
- const previous = transcriptsByThreadId.get(delta.threadId) ?? null;
4604
- transcript = applyCodexAspTranscriptDelta(previous, delta);
4605
- } else if (isCodexAspTranscript(event.payload.transcript)) {
4606
- transcript = event.payload.transcript;
4607
- }
4608
- if (transcript) {
4609
- transcriptsByThreadId.set(transcript.threadId, transcript);
4610
- }
4611
- }
4612
- return { events, transcript, transcriptsByThreadId };
4613
- }
4614
-
4615
4633
  // ../shared/src/display-message/parsers/codex-asp-parser.ts
4616
4634
  var DUPLICATE_WINDOW_MS = 5 * 60 * 1e3;
4617
4635
 
@@ -7821,6 +7839,13 @@ var CodingAgentManager = class {
7821
7839
  const { queue, isProcessing } = this.drainQueueForInterrupt();
7822
7840
  if (isProcessing) {
7823
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);
7824
7849
  }
7825
7850
  this.emitInterruptedQueueEvent(queue);
7826
7851
  return {
@@ -8680,6 +8705,9 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
8680
8705
  this.disallowedToolsOverride = options.disallowedTools;
8681
8706
  this.initializeManager(this.processMessageInternal.bind(this));
8682
8707
  }
8708
+ getHistorySink() {
8709
+ return this.historyFile;
8710
+ }
8683
8711
  async interruptActiveTurn() {
8684
8712
  this.pendingInterrupt = true;
8685
8713
  if (this.activeQuery) {
@@ -9801,7 +9829,7 @@ var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
9801
9829
  var MIN_CODEX_CLI_VERSION = "0.144.6";
9802
9830
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
9803
9831
  var codexCliVersionEnsured = null;
9804
- var ENGINE_PACKAGE_VERSION = "0.1.480";
9832
+ var ENGINE_PACKAGE_VERSION = "0.1.482";
9805
9833
  var INITIALIZE_METHOD = "initialize";
9806
9834
  var INITIALIZED_NOTIFICATION = "initialized";
9807
9835
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -10820,6 +10848,9 @@ var CodexAspManager = class extends CodingAgentManager {
10820
10848
  }
10821
10849
  this.currentThreadId = this.initialSessionId ?? replayed?.transcript?.threadId ?? null;
10822
10850
  }
10851
+ getHistorySink() {
10852
+ return { append: (event) => this.trackHistoryEvent(event) };
10853
+ }
10823
10854
  async interruptActiveTurn() {
10824
10855
  if (!this.currentThreadId || !this.activeTurnId) {
10825
10856
  return;
@@ -12046,6 +12077,9 @@ var CursorManager = class extends CodingAgentManager {
12046
12077
  async initialize() {
12047
12078
  await mkdir11(dirname5(this.historyFilePath), { recursive: true });
12048
12079
  }
12080
+ getHistorySink() {
12081
+ return this.historyFile;
12082
+ }
12049
12083
  async interruptActiveTurn() {
12050
12084
  await this.cancelRun(this.activeRun);
12051
12085
  this.abortActiveTurn?.();
@@ -12583,6 +12617,9 @@ var OpencodeManager = class extends CodingAgentManager {
12583
12617
  async initialize() {
12584
12618
  await mkdir12(dirname6(this.historyFilePath), { recursive: true });
12585
12619
  }
12620
+ getHistorySink() {
12621
+ return this.historyFile;
12622
+ }
12586
12623
  async interruptActiveTurn() {
12587
12624
  this.activeAbortController?.abort();
12588
12625
  if (this.client && this.sessionId) {
@@ -13111,6 +13148,9 @@ var PiManager = class extends CodingAgentManager {
13111
13148
  async initialize() {
13112
13149
  await mkdir13(dirname7(this.historyFilePath), { recursive: true });
13113
13150
  }
13151
+ getHistorySink() {
13152
+ return this.historyFile;
13153
+ }
13114
13154
  async interruptActiveTurn() {
13115
13155
  await this.session?.abort();
13116
13156
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.480",
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",