replicas-engine 0.1.1005 → 0.1.1007

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.
@@ -5,12 +5,12 @@ import {
5
5
  getCodexAspHost,
6
6
  restartCodexAspHost,
7
7
  restartCodexAspHostIfRunning
8
- } from "./chunk-3SPI3DBP.js";
9
- import "./chunk-Y57FU4PE.js";
10
- import "./chunk-SWXXNS2U.js";
11
- import "./chunk-ZDIZBHEZ.js";
8
+ } from "./chunk-U6JEKZGL.js";
9
+ import "./chunk-M3FARRDB.js";
10
+ import "./chunk-MPQHAEI4.js";
11
+ import "./chunk-RCCLUBJX.js";
12
12
  import "./chunk-UZSNFLDQ.js";
13
- import "./chunk-VQDPYJKB.js";
13
+ import "./chunk-FKI4Y34A.js";
14
14
  import "./chunk-VEQXQN22.js";
15
15
  export {
16
16
  getCodexAspHost,
@@ -3,18 +3,18 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  monolithRequest
6
- } from "./chunk-Y57FU4PE.js";
6
+ } from "./chunk-M3FARRDB.js";
7
7
  import {
8
8
  SUBPROCESS_MAX_BUFFER,
9
9
  execFileAsync
10
- } from "./chunk-ZDIZBHEZ.js";
10
+ } from "./chunk-RCCLUBJX.js";
11
11
  import {
12
12
  extractCommandProtectionCommandText,
13
13
  findCommandProtectionGitLookups,
14
14
  findGitCommitSignals,
15
15
  findPrMergeSignals,
16
16
  parseCommandProtectionRequest
17
- } from "./chunk-VQDPYJKB.js";
17
+ } from "./chunk-FKI4Y34A.js";
18
18
 
19
19
  // src/services/command-protection-service.ts
20
20
  import { readFile, stat } from "fs/promises";
@@ -5,7 +5,7 @@ import {
5
5
  extractCommandProtectionCommandText,
6
6
  isRecord,
7
7
  parseCodeHostPrUrl
8
- } from "./chunk-VQDPYJKB.js";
8
+ } from "./chunk-FKI4Y34A.js";
9
9
 
10
10
  // src/services/published-pull-request-urls.ts
11
11
  function publishedPullRequestUrls(result) {
@@ -3182,10 +3182,11 @@ Explore a codebase, get it running in this workspace, verify it end to end, and
3182
3182
  Use this when:
3183
3183
  - This workspace was started as an environment setup run (\`replicas environment-setup status\` succeeds)
3184
3184
  - The user asks you to set up, configure, audit, or improve a Replicas environment for a repository
3185
- - The user asks what should go in a start hook, warm hook, or environment system prompt`;
3185
+ - The user asks what should go in a start hook, warm hook, or environment system prompt
3186
+ - A warm pool, warm hook, or start hook is failing, or the fix you found belongs in the environment rather than the repository`;
3186
3187
  var REFERENCE3 = `# Environment setup (agent-led)
3187
3188
 
3188
- Use this workflow to make a repository fully usable by Replicas background agents: agents booted from the environment should be able to install, run, test, verify, and demo changes without a human babysitting them. The result of the workflow is a **proposal**, never a direct change: the user reviews, edits, and saves it in the Environment panel next to the chat.
3189
+ Use this workflow to make a repository fully usable by Replicas background agents: agents booted from the environment should be able to install, run, test, verify, and demo changes without a human babysitting them. In a setup run, the result is a **proposal**, never a direct change: the user reviews, edits, and saves it in the Environment panel next to the chat. Outside a setup run, see below.
3189
3190
 
3190
3191
  ## Mental model
3191
3192
 
@@ -3217,7 +3218,14 @@ replicas environment-setup wait-variables [-t 5m]
3217
3218
 
3218
3219
  \`status\` prints the environment, repositories, current steps, and variable requests. \`request-variables\` returns immediately; \`wait-variables\` blocks until the required values arrive, are skipped, or the time runs out. Step statuses are \`pending\`, \`in_progress\`, \`completed\`, and \`skipped\`. Step keys, in order: \`understand\`, \`install\`, \`verify\`, \`configure\`, \`propose\`. Mark the first step \`in_progress\` before your first tool call, keep exactly one step \`in_progress\`, and mark a step \`completed\` only after its work actually succeeded. Use \`skipped\` when something genuinely cannot run (for example no browser UI to record) and say so in the proposal.
3219
3220
 
3220
- If \`replicas environment-setup status\` reports that there is no active setup run, the user asked for this in an ordinary workspace. Follow the same discovery and verification steps, then present the configuration in chat; apply it with \`replicas environment ...\` and \`replicas automation ...\` only when the user explicitly asks you to.
3221
+ If \`replicas environment-setup status\` reports that there is no active setup run, you are in an ordinary workspace, either because the user asked for this or because the fix you found while debugging belongs in the environment. Follow the same discovery and verification steps, show the exact change in chat, and offer to apply and test it yourself. Ask the user before changing the environment, since it affects every workspace built from it. Once they approve:
3222
+
3223
+ - Warm hook: \`replicas environment warm-hooks save-test <env> -f <file>\` runs it in an isolated sandbox and saves it only if it passes.
3224
+ - Start hook: \`replicas environment start-hooks test <env> -f <file>\`, then \`replicas environment start-hooks save <env> -f <file>\` with the same file once it passes.
3225
+ - Variables and files: apply with \`replicas environment vars set\` or \`files set\`, then confirm with \`vars list\` or \`files list\`.
3226
+ - Automations: apply with \`replicas automation ...\`, then read back with \`replicas automation get <id>\`.
3227
+
3228
+ When a test fails, fix the earliest failure and test again instead of saving. If the fix materially changes what the user approved, show the revised change and ask again before saving. Report what you changed and the test result.
3221
3229
 
3222
3230
  ## 1. Understand the codebase
3223
3231
 
@@ -3409,7 +3417,7 @@ After \`propose\` succeeds, mark the \`propose\` step completed and send one mes
3409
3417
  Review the start hook, warm hook, system prompt, variables, and automations in the Environment panel on the right. Edit anything inline, then select **Save configuration**. Ask me here if you want changes and I will revise the proposal.
3410
3418
  \`\`\`
3411
3419
 
3412
- Keep it under 250 words plus the lists. Do not paste the hooks or system prompt into chat; the panel shows them. Never imply the configuration was saved: saving is the user's action.
3420
+ Keep it under 250 words plus the lists. Do not paste the hooks or system prompt into chat; the panel shows them. Never imply the configuration was saved: in a setup run, saving is the user's action.
3413
3421
 
3414
3422
  ## Safety
3415
3423
 
@@ -3421,7 +3429,7 @@ Keep it under 250 words plus the lists. Do not paste the hooks or system prompt
3421
3429
  var ENVIRONMENT_SETUP_ABILITY = {
3422
3430
  label: "Environment setup",
3423
3431
  description: "Explore a codebase, verify it runs, and propose environment hooks, a system prompt, variables, and automations for review.",
3424
- bullet: "- Setting up, auditing, or improving a Replicas environment for a repository (hooks, system prompt, variables, automations)",
3432
+ bullet: "- Setting up, auditing, fixing, or improving a Replicas environment for a repository (hooks, system prompt, variables, automations), including a failing warm pool or hook",
3425
3433
  section: SECTION3,
3426
3434
  referenceFile: { name: "ENVIRONMENT-SETUP.md", content: REFERENCE3 }
3427
3435
  };
@@ -6275,6 +6283,17 @@ function createSubagentMessage(messageIndex, timestamp, fields) {
6275
6283
  function collectNestedEvents(events, toolUseId) {
6276
6284
  return events.filter((e) => e.payload.parent_tool_use_id === toolUseId).map(({ timestamp, type, payload }) => ({ timestamp, type, payload }));
6277
6285
  }
6286
+ function readToolResult(event) {
6287
+ if (event.type !== "claude-user") return void 0;
6288
+ const toolResult = normalizeContentBlocks(event.payload.message?.content).find((c) => c.type === "tool_result");
6289
+ if (!toolResult?.tool_use_id) return void 0;
6290
+ return {
6291
+ toolResult,
6292
+ toolUseId: toolResult.tool_use_id,
6293
+ output: extractToolResultText(toolResult.content),
6294
+ status: toolResult.is_error ? "failed" : "completed"
6295
+ };
6296
+ }
6278
6297
  function coerceClaudeResultPayload(payload) {
6279
6298
  return {
6280
6299
  is_error: typeof payload.is_error === "boolean" ? payload.is_error : void 0,
@@ -6716,52 +6735,47 @@ function parseClaudeEvents(events, parentToolUseId) {
6716
6735
  messages.push(fileOrCommandMessage(tool.name, tool.id, "filePath" in tool ? { file_path: tool.filePath } : { command: tool.command }, timestamp));
6717
6736
  }
6718
6737
  filteredEvents.forEach((event) => {
6719
- if (event.type === "claude-user") {
6720
- const content = normalizeContentBlocks(event.payload.message?.content);
6721
- const toolResult = content.find((c) => c.type === "tool_result");
6722
- if (toolResult && toolResult.tool_use_id) {
6723
- const toolInfo = toolCallMap.get(toolResult.tool_use_id);
6724
- if (!toolInfo) return;
6725
- const resultContent = extractToolResultText(toolResult.content);
6726
- const isError = toolResult.is_error || false;
6727
- const status = isError ? "failed" : "completed";
6728
- if (toolInfo.toolName === "TaskCreate" && !isError) {
6729
- taskAccumulator.processContentBlock(toolResult);
6730
- }
6731
- const message = messages[toolInfo.messageIndex];
6732
- if (!message) return;
6733
- if (message.type === "command") {
6734
- message.output = resultContent;
6735
- message.status = status;
6736
- const exitCodeMatch = resultContent.match(/exit code:?\s*(\d+)/i);
6737
- if (exitCodeMatch) {
6738
- message.exitCode = parseInt(exitCodeMatch[1], 10);
6739
- } else {
6740
- message.exitCode = isError ? 1 : 0;
6741
- }
6742
- } else if (message.type === "patch") {
6743
- message.status = status;
6744
- } else if (message.type === "web_search") {
6745
- message.status = status;
6746
- } else if (message.type === "tool_call") {
6747
- message.output = resultContent;
6748
- message.status = status;
6749
- } else if (message.type === "skill") {
6750
- message.status = status;
6751
- } else if (message.type === "subagent") {
6752
- message.output = resultContent;
6753
- message.status = status;
6754
- if (!message.chatId && resultContent) {
6755
- const parsed = safeJsonParse(resultContent, {});
6756
- if (parsed.chatId) {
6757
- message.chatId = parsed.chatId;
6758
- }
6759
- }
6760
- } else if (message.type === "subagent_followup") {
6761
- message.output = resultContent;
6762
- message.status = status;
6738
+ const result = readToolResult(event);
6739
+ if (!result) return;
6740
+ const { toolResult, output: resultContent, status } = result;
6741
+ const toolInfo = toolCallMap.get(result.toolUseId);
6742
+ if (!toolInfo) return;
6743
+ const isError = status === "failed";
6744
+ if (toolInfo.toolName === "TaskCreate" && !isError) {
6745
+ taskAccumulator.processContentBlock(toolResult);
6746
+ }
6747
+ const message = messages[toolInfo.messageIndex];
6748
+ if (!message) return;
6749
+ if (message.type === "command") {
6750
+ message.output = resultContent;
6751
+ message.status = status;
6752
+ const exitCodeMatch = resultContent.match(/exit code:?\s*(\d+)/i);
6753
+ if (exitCodeMatch) {
6754
+ message.exitCode = parseInt(exitCodeMatch[1], 10);
6755
+ } else {
6756
+ message.exitCode = isError ? 1 : 0;
6757
+ }
6758
+ } else if (message.type === "patch") {
6759
+ message.status = status;
6760
+ } else if (message.type === "web_search") {
6761
+ message.status = status;
6762
+ } else if (message.type === "tool_call") {
6763
+ message.output = resultContent;
6764
+ message.status = status;
6765
+ } else if (message.type === "skill") {
6766
+ message.status = status;
6767
+ } else if (message.type === "subagent") {
6768
+ message.output = resultContent;
6769
+ message.status = status;
6770
+ if (!message.chatId && resultContent) {
6771
+ const parsed = safeJsonParse(resultContent, {});
6772
+ if (parsed.chatId) {
6773
+ message.chatId = parsed.chatId;
6763
6774
  }
6764
6775
  }
6776
+ } else if (message.type === "subagent_followup") {
6777
+ message.output = resultContent;
6778
+ message.status = status;
6765
6779
  }
6766
6780
  });
6767
6781
  for (const message of messages) {
@@ -14,7 +14,7 @@ import {
14
14
  isValidAgentProvider,
15
15
  parsePosixEnvFile,
16
16
  readReplicasRuntimeEnv
17
- } from "./chunk-VQDPYJKB.js";
17
+ } from "./chunk-FKI4Y34A.js";
18
18
 
19
19
  // src/runtime-env-loader.ts
20
20
  import { readFileSync } from "fs";
@@ -3,10 +3,10 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  execFileAsync
6
- } from "./chunk-ZDIZBHEZ.js";
6
+ } from "./chunk-RCCLUBJX.js";
7
7
  import {
8
8
  isVersionBelow
9
- } from "./chunk-VQDPYJKB.js";
9
+ } from "./chunk-FKI4Y34A.js";
10
10
 
11
11
  // src/utils/codex-agent-env.ts
12
12
  function buildCodexAgentEnv(source = process.env) {
@@ -240,7 +240,7 @@ function getCodexModelProvider(method) {
240
240
  if (method === "foundry") return "azure";
241
241
  return method === "ollama" || method === "openai-compatible" ? "replicas_openai_compatible" : "openai";
242
242
  }
243
- var ENGINE_PACKAGE_VERSION = "0.1.1005";
243
+ var ENGINE_PACKAGE_VERSION = "0.1.1007";
244
244
  var INITIALIZE_METHOD = "initialize";
245
245
  var INITIALIZED_NOTIFICATION = "initialized";
246
246
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  HOOK_EXEC_MAX_BUFFER_BYTES
6
- } from "./chunk-VQDPYJKB.js";
6
+ } from "./chunk-FKI4Y34A.js";
7
7
 
8
8
  // src/utils/exec.ts
9
9
  import { exec, execFile } from "child_process";
@@ -5,15 +5,15 @@ import {
5
5
  ENGINE_ENV,
6
6
  monolithRequest,
7
7
  setAgentCredentialSnapshot
8
- } from "./chunk-Y57FU4PE.js";
8
+ } from "./chunk-M3FARRDB.js";
9
9
  import {
10
10
  AppServerProcess,
11
11
  buildCodexAgentEnv
12
- } from "./chunk-SWXXNS2U.js";
12
+ } from "./chunk-MPQHAEI4.js";
13
13
  import {
14
14
  SUBPROCESS_MAX_BUFFER,
15
15
  execFileAsync
16
- } from "./chunk-ZDIZBHEZ.js";
16
+ } from "./chunk-RCCLUBJX.js";
17
17
  import {
18
18
  isRecord
19
19
  } from "./chunk-UZSNFLDQ.js";
@@ -28,7 +28,7 @@ import {
28
28
  listOpenAICompatibleModels,
29
29
  readOllamaAuthEnv,
30
30
  resolveOpenAICompatibleModelsUrl
31
- } from "./chunk-VQDPYJKB.js";
31
+ } from "./chunk-FKI4Y34A.js";
32
32
 
33
33
  // src/managers/codex-token-manager.ts
34
34
  import { promises as fs } from "fs";
@@ -264,7 +264,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
264
264
  await this.applyCredentialUpdate(++this.credentialGeneration, async () => {
265
265
  await this.applyCredentialsResponse(data);
266
266
  setAgentCredentialSnapshot("codex", data);
267
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-OCHT3JKS.js");
267
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-NKNJVTOF.js");
268
268
  await restartCodexAspHostIfRunning2();
269
269
  });
270
270
  await this.start(true);
@@ -285,7 +285,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
285
285
  const accountChanged = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.codex?.credentialId !== data.credentialId;
286
286
  await this.applyCredentialsResponse(data);
287
287
  if (restartOnChange && (accountChanged || CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index]))) {
288
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-OCHT3JKS.js");
288
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-NKNJVTOF.js");
289
289
  await restartCodexAspHostIfRunning2();
290
290
  }
291
291
  setAgentCredentialSnapshot("codex", data);
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  evaluateCommandProtection
6
- } from "./chunk-6CRZSZVE.js";
7
- import "./chunk-Y57FU4PE.js";
8
- import "./chunk-ZDIZBHEZ.js";
6
+ } from "./chunk-4L2COBFE.js";
7
+ import "./chunk-M3FARRDB.js";
8
+ import "./chunk-RCCLUBJX.js";
9
9
  import {
10
10
  isRecord
11
11
  } from "./chunk-UZSNFLDQ.js";
12
- import "./chunk-VQDPYJKB.js";
12
+ import "./chunk-FKI4Y34A.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/command-protection-hook.ts
@@ -7,12 +7,12 @@ import {
7
7
  import {
8
8
  AppServerProcess,
9
9
  buildCodexAgentEnv
10
- } from "./chunk-SWXXNS2U.js";
11
- import "./chunk-ZDIZBHEZ.js";
10
+ } from "./chunk-MPQHAEI4.js";
11
+ import "./chunk-RCCLUBJX.js";
12
12
  import {
13
13
  AGENT,
14
14
  headlessAgentRequestSchema
15
- } from "./chunk-VQDPYJKB.js";
15
+ } from "./chunk-FKI4Y34A.js";
16
16
  import "./chunk-VEQXQN22.js";
17
17
 
18
18
  // src/headless-agent.ts
package/dist/src/index.js CHANGED
@@ -32,7 +32,7 @@ import {
32
32
  reportCommandProtectionBlock,
33
33
  resolveDiffBase,
34
34
  runGitCommand
35
- } from "./chunk-6CRZSZVE.js";
35
+ } from "./chunk-4L2COBFE.js";
36
36
  import {
37
37
  ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
38
38
  AGENT_MESSAGE_DELTA_METHOD,
@@ -57,7 +57,7 @@ import {
57
57
  } from "./chunk-P73LGPQO.js";
58
58
  import {
59
59
  publishedPullRequestUrls
60
- } from "./chunk-JC2TIYY2.js";
60
+ } from "./chunk-AHKE7S5O.js";
61
61
  import {
62
62
  BaseRefreshManager,
63
63
  CodexAspAuthMethodChangedError,
@@ -71,7 +71,7 @@ import {
71
71
  refreshDelayMs,
72
72
  restartCodexAspHost,
73
73
  routineRefreshRequest
74
- } from "./chunk-3SPI3DBP.js";
74
+ } from "./chunk-U6JEKZGL.js";
75
75
  import {
76
76
  ENGINE_ENV,
77
77
  monolithRequest,
@@ -79,16 +79,16 @@ import {
79
79
  readRuntimeEnvFile,
80
80
  reloadEngineEnv,
81
81
  setAgentCredentialSnapshot
82
- } from "./chunk-Y57FU4PE.js";
82
+ } from "./chunk-M3FARRDB.js";
83
83
  import {
84
84
  AspClient,
85
85
  getCodexModelProvider
86
- } from "./chunk-SWXXNS2U.js";
86
+ } from "./chunk-MPQHAEI4.js";
87
87
  import {
88
88
  SUBPROCESS_MAX_BUFFER,
89
89
  execAsync,
90
90
  execFileAsync
91
- } from "./chunk-ZDIZBHEZ.js";
91
+ } from "./chunk-RCCLUBJX.js";
92
92
  import {
93
93
  isRecord as isRecord2
94
94
  } from "./chunk-UZSNFLDQ.js";
@@ -316,7 +316,7 @@ import {
316
316
  workspaceCredentialProviderSchema,
317
317
  workspaceTokenRequestSchema,
318
318
  workspaceTokenResponseSchema
319
- } from "./chunk-VQDPYJKB.js";
319
+ } from "./chunk-FKI4Y34A.js";
320
320
  import {
321
321
  cloneMcpConfig,
322
322
  ensureCompatibilityImports,
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  publishedPullRequestUrls
6
- } from "./chunk-JC2TIYY2.js";
6
+ } from "./chunk-AHKE7S5O.js";
7
7
  import {
8
8
  isRecord
9
9
  } from "./chunk-UZSNFLDQ.js";
10
10
  import {
11
11
  shouldRefreshPullRequests
12
- } from "./chunk-VQDPYJKB.js";
12
+ } from "./chunk-FKI4Y34A.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/services/post-tool-pr-notifier.ts
@@ -9,7 +9,7 @@ import {
9
9
  spawnSubagentRequestSchema,
10
10
  subagentResponseSchema,
11
11
  waitSubagentRequestSchema
12
- } from "./chunk-VQDPYJKB.js";
12
+ } from "./chunk-FKI4Y34A.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/subagent-mcp.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.1005",
3
+ "version": "0.1.1007",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",