@posthog/agent 2.1.35 → 2.1.45

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.
@@ -1,11 +1,16 @@
1
1
  // src/gateway-models.ts
2
2
  var DEFAULT_GATEWAY_MODEL = "claude-opus-4-6";
3
3
  var BLOCKED_MODELS = /* @__PURE__ */ new Set(["gpt-5-mini", "openai/gpt-5-mini"]);
4
+ var CACHE_TTL = 10 * 60 * 1e3;
5
+ var gatewayModelsCache = null;
4
6
  async function fetchGatewayModels(options) {
5
7
  const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;
6
8
  if (!gatewayUrl) {
7
9
  return [];
8
10
  }
11
+ if (gatewayModelsCache && gatewayModelsCache.url === gatewayUrl && Date.now() < gatewayModelsCache.expiry) {
12
+ return gatewayModelsCache.models;
13
+ }
9
14
  const modelsUrl = `${gatewayUrl}/v1/models`;
10
15
  try {
11
16
  const response = await fetch(modelsUrl);
@@ -13,8 +18,13 @@ async function fetchGatewayModels(options) {
13
18
  return [];
14
19
  }
15
20
  const data = await response.json();
16
- const models = data.data ?? [];
17
- return models.filter((m) => !BLOCKED_MODELS.has(m.id));
21
+ const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));
22
+ gatewayModelsCache = {
23
+ models,
24
+ expiry: Date.now() + CACHE_TTL,
25
+ url: gatewayUrl
26
+ };
27
+ return models;
18
28
  } catch {
19
29
  return [];
20
30
  }
@@ -29,11 +39,15 @@ async function fetchArrayModelIds(options) {
29
39
  const models = await fetchArrayModels(options);
30
40
  return models.map((model) => model.id);
31
41
  }
42
+ var arrayModelsCache = null;
32
43
  async function fetchArrayModels(options) {
33
44
  const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;
34
45
  if (!gatewayUrl) {
35
46
  return [];
36
47
  }
48
+ if (arrayModelsCache && arrayModelsCache.url === gatewayUrl && Date.now() < arrayModelsCache.expiry) {
49
+ return arrayModelsCache.models;
50
+ }
37
51
  try {
38
52
  const base = new URL(gatewayUrl);
39
53
  base.pathname = "/array/v1/models";
@@ -51,6 +65,11 @@ async function fetchArrayModels(options) {
51
65
  if (!id) continue;
52
66
  results.push({ id, owned_by: model?.owned_by });
53
67
  }
68
+ arrayModelsCache = {
69
+ models: results,
70
+ expiry: Date.now() + CACHE_TTL,
71
+ url: gatewayUrl
72
+ };
54
73
  return results;
55
74
  } catch {
56
75
  return [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/gateway-models.ts"],"sourcesContent":["export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ArrayModelsResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = data.data ?? [];\n return models.filter((m) => !BLOCKED_MODELS.has(m.id));\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport async function fetchArrayModelIds(\n options?: FetchGatewayModelsOptions,\n): Promise<string[]> {\n const models = await fetchArrayModels(options);\n return models.map((model) => model.id);\n}\n\nexport interface ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\n\nexport async function fetchArrayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<ArrayModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n try {\n const base = new URL(gatewayUrl);\n base.pathname = \"/array/v1/models\";\n base.search = \"\";\n base.hash = \"\";\n const response = await fetch(base.toString());\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ArrayModelsResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ArrayModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n let cleanId = model.id;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n"],"mappings":";AAiBO,IAAM,wBAAwB;AAE9B,IAAM,iBAAiB,oBAAI,IAAI,CAAC,cAAc,mBAAmB,CAAC;AASzE,eAAsB,mBACpB,SACyB;AACzB,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI;AACtD,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY,GAAG,UAAU;AAE/B,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,SAAS;AAEtC,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,SAAS,KAAK,QAAQ,CAAC;AAC7B,WAAO,OAAO,OAAO,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,iBAAiB,OAA8B;AAC7D,MAAI,MAAM,UAAU;AAClB,WAAO,MAAM,aAAa;AAAA,EAC5B;AACA,SAAO,MAAM,GAAG,WAAW,SAAS,KAAK,MAAM,GAAG,WAAW,YAAY;AAC3E;AAEA,eAAsB,mBACpB,SACmB;AACnB,QAAM,SAAS,MAAM,iBAAiB,OAAO;AAC7C,SAAO,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE;AACvC;AAOA,eAAsB,iBACpB,SAC2B;AAC3B,QAAM,aAAa,SAAS,cAAc,QAAQ,IAAI;AACtD,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,OAAO,IAAI,IAAI,UAAU;AAC/B,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,UAAM,WAAW,MAAM,MAAM,KAAK,SAAS,CAAC;AAC5C,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,SAAS,MAAM,QAAQ,IAAI,IAC7B,OACC,KAAK,QAAQ,KAAK,UAAU,CAAC;AAClC,UAAM,UAA4B,CAAC;AACnC,eAAW,SAAS,QAAQ;AAC1B,YAAM,KAAK,OAAO,KAAK,OAAO,MAAM,EAAE,IAAI;AAC1C,UAAI,CAAC,GAAI;AACT,cAAQ,KAAK,EAAE,IAAI,UAAU,OAAO,SAAS,CAAC;AAAA,IAChD;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAM,iBAAyC;AAAA,EAC7C,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AACnB;AAEO,SAAS,gBAAgB,SAAyB;AACvD,SAAO,eAAe,OAAO,KAAK;AACpC;AAEA,IAAM,oBAAoB,CAAC,cAAc,WAAW,gBAAgB;AAE7D,SAAS,uBAAuB,OAA6B;AAClE,MAAI,UAAU,MAAM;AACpB,aAAW,UAAU,mBAAmB;AACtC,QAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,gBAAU,QAAQ,MAAM,OAAO,MAAM;AACrC;AAAA,IACF;AAAA,EACF;AAEA,YAAU,QAAQ,QAAQ,cAAc,OAAO;AAE/C,QAAM,QAAQ,QAAQ,MAAM,MAAM,EAAE,IAAI,CAAC,SAAS;AAChD,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO;AACpC,WAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EAClE,CAAC;AAED,SAAO,MAAM,KAAK,GAAG;AACvB;","names":[]}
1
+ {"version":3,"sources":["../src/gateway-models.ts"],"sourcesContent":["export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ArrayModelsResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport async function fetchArrayModelIds(\n options?: FetchGatewayModelsOptions,\n): Promise<string[]> {\n const models = await fetchArrayModels(options);\n return models.map((model) => model.id);\n}\n\nexport interface ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet arrayModelsCache: {\n models: ArrayModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchArrayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<ArrayModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n arrayModelsCache &&\n arrayModelsCache.url === gatewayUrl &&\n Date.now() < arrayModelsCache.expiry\n ) {\n return arrayModelsCache.models;\n }\n\n try {\n const base = new URL(gatewayUrl);\n base.pathname = \"/array/v1/models\";\n base.search = \"\";\n base.hash = \"\";\n const response = await fetch(base.toString());\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ArrayModelsResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ArrayModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n arrayModelsCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n let cleanId = model.id;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -1174,7 +1174,7 @@ import { v7 as uuidv7 } from "uuid";
1174
1174
  // package.json
1175
1175
  var package_default = {
1176
1176
  name: "@posthog/agent",
1177
- version: "2.1.35",
1177
+ version: "2.1.45",
1178
1178
  repository: "https://github.com/PostHog/twig",
1179
1179
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
1180
1180
  exports: {
@@ -1305,11 +1305,16 @@ function unreachable(value, logger) {
1305
1305
  // src/gateway-models.ts
1306
1306
  var DEFAULT_GATEWAY_MODEL = "claude-opus-4-6";
1307
1307
  var BLOCKED_MODELS = /* @__PURE__ */ new Set(["gpt-5-mini", "openai/gpt-5-mini"]);
1308
+ var CACHE_TTL = 10 * 60 * 1e3;
1309
+ var gatewayModelsCache = null;
1308
1310
  async function fetchGatewayModels(options) {
1309
1311
  const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;
1310
1312
  if (!gatewayUrl) {
1311
1313
  return [];
1312
1314
  }
1315
+ if (gatewayModelsCache && gatewayModelsCache.url === gatewayUrl && Date.now() < gatewayModelsCache.expiry) {
1316
+ return gatewayModelsCache.models;
1317
+ }
1313
1318
  const modelsUrl = `${gatewayUrl}/v1/models`;
1314
1319
  try {
1315
1320
  const response = await fetch(modelsUrl);
@@ -1317,8 +1322,13 @@ async function fetchGatewayModels(options) {
1317
1322
  return [];
1318
1323
  }
1319
1324
  const data = await response.json();
1320
- const models = data.data ?? [];
1321
- return models.filter((m) => !BLOCKED_MODELS.has(m.id));
1325
+ const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));
1326
+ gatewayModelsCache = {
1327
+ models,
1328
+ expiry: Date.now() + CACHE_TTL,
1329
+ url: gatewayUrl
1330
+ };
1331
+ return models;
1322
1332
  } catch {
1323
1333
  return [];
1324
1334
  }
@@ -1329,11 +1339,15 @@ function isAnthropicModel(model) {
1329
1339
  }
1330
1340
  return model.id.startsWith("claude-") || model.id.startsWith("anthropic/");
1331
1341
  }
1342
+ var arrayModelsCache = null;
1332
1343
  async function fetchArrayModels(options) {
1333
1344
  const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;
1334
1345
  if (!gatewayUrl) {
1335
1346
  return [];
1336
1347
  }
1348
+ if (arrayModelsCache && arrayModelsCache.url === gatewayUrl && Date.now() < arrayModelsCache.expiry) {
1349
+ return arrayModelsCache.models;
1350
+ }
1337
1351
  try {
1338
1352
  const base = new URL(gatewayUrl);
1339
1353
  base.pathname = "/array/v1/models";
@@ -1351,6 +1365,11 @@ async function fetchArrayModels(options) {
1351
1365
  if (!id) continue;
1352
1366
  results.push({ id, owned_by: model?.owned_by });
1353
1367
  }
1368
+ arrayModelsCache = {
1369
+ models: results,
1370
+ expiry: Date.now() + CACHE_TTL,
1371
+ url: gatewayUrl
1372
+ };
1354
1373
  return results;
1355
1374
  } catch {
1356
1375
  return [];
@@ -3261,12 +3280,8 @@ function clearStatsigCache() {
3261
3280
  process.env.CLAUDE_CONFIG_DIR || path2.join(os2.homedir(), ".claude"),
3262
3281
  "statsig"
3263
3282
  );
3264
- try {
3265
- if (fs.existsSync(statsigPath)) {
3266
- fs.rmSync(statsigPath, { recursive: true, force: true });
3267
- }
3268
- } catch {
3269
- }
3283
+ fs.rm(statsigPath, { recursive: true, force: true }, () => {
3284
+ });
3270
3285
  }
3271
3286
 
3272
3287
  // src/adapters/claude/claude-agent.ts
@@ -3328,7 +3343,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3328
3343
  const sessionId = uuidv7();
3329
3344
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3330
3345
  const mcpServers = parseMcpServers(params);
3331
- await fetchMcpToolMetadata(mcpServers, this.logger);
3346
+ const mcpMetadataPromise = fetchMcpToolMetadata(mcpServers, this.logger);
3332
3347
  const options = buildSessionOptions({
3333
3348
  cwd: params.cwd,
3334
3349
  mcpServers,
@@ -3362,13 +3377,14 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3362
3377
  adapter: "claude"
3363
3378
  });
3364
3379
  }
3365
- const modelOptions = await this.getModelConfigOptions();
3380
+ const [modelOptions, slashCommands] = await Promise.all([
3381
+ this.getModelConfigOptions(),
3382
+ getAvailableSlashCommands(q),
3383
+ mcpMetadataPromise
3384
+ ]);
3366
3385
  session.modelId = modelOptions.currentModelId;
3367
3386
  await this.trySetModel(q, modelOptions.currentModelId);
3368
- this.sendAvailableCommandsUpdate(
3369
- sessionId,
3370
- await getAvailableSlashCommands(q)
3371
- );
3387
+ this.sendAvailableCommandsUpdate(sessionId, slashCommands);
3372
3388
  return {
3373
3389
  sessionId,
3374
3390
  configOptions: await this.buildConfigOptions(modelOptions)
@@ -3387,7 +3403,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3387
3403
  return {};
3388
3404
  }
3389
3405
  const mcpServers = parseMcpServers(params);
3390
- await fetchMcpToolMetadata(mcpServers, this.logger);
3406
+ const mcpMetadataPromise = fetchMcpToolMetadata(mcpServers, this.logger);
3391
3407
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3392
3408
  const { query: q, session } = await this.initializeQuery({
3393
3409
  cwd: params.cwd,
@@ -3401,10 +3417,11 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3401
3417
  });
3402
3418
  session.taskRunId = meta?.taskRunId;
3403
3419
  this.registerPersistence(sessionId, meta);
3404
- this.sendAvailableCommandsUpdate(
3405
- sessionId,
3406
- await getAvailableSlashCommands(q)
3407
- );
3420
+ const [slashCommands] = await Promise.all([
3421
+ getAvailableSlashCommands(q),
3422
+ mcpMetadataPromise
3423
+ ]);
3424
+ this.sendAvailableCommandsUpdate(sessionId, slashCommands);
3408
3425
  return {
3409
3426
  configOptions: await this.buildConfigOptions()
3410
3427
  };
@@ -9570,7 +9587,7 @@ async function isCommitOnRemote(baseDir, commit, options) {
9570
9587
  }
9571
9588
 
9572
9589
  // src/sagas/apply-snapshot-saga.ts
9573
- import { mkdir as mkdir3, rm as rm2, writeFile as writeFile3 } from "fs/promises";
9590
+ import { mkdir as mkdir3, rm as rm3, writeFile as writeFile3 } from "fs/promises";
9574
9591
  import { join as join5 } from "path";
9575
9592
 
9576
9593
  // ../git/dist/sagas/tree.js
@@ -9884,7 +9901,7 @@ var ApplySnapshotSaga = class extends Saga {
9884
9901
  },
9885
9902
  rollback: async () => {
9886
9903
  if (this.archivePath) {
9887
- await rm2(this.archivePath, { force: true }).catch(() => {
9904
+ await rm3(this.archivePath, { force: true }).catch(() => {
9888
9905
  });
9889
9906
  }
9890
9907
  }
@@ -9900,7 +9917,7 @@ var ApplySnapshotSaga = class extends Saga {
9900
9917
  if (!applyResult.success) {
9901
9918
  throw new Error(`Failed to apply tree: ${applyResult.error}`);
9902
9919
  }
9903
- await rm2(this.archivePath, { force: true }).catch(() => {
9920
+ await rm3(this.archivePath, { force: true }).catch(() => {
9904
9921
  });
9905
9922
  this.log.info("Tree snapshot applied", {
9906
9923
  treeHash: snapshot.treeHash,
@@ -9913,7 +9930,7 @@ var ApplySnapshotSaga = class extends Saga {
9913
9930
 
9914
9931
  // src/sagas/capture-tree-saga.ts
9915
9932
  import { existsSync as existsSync5 } from "fs";
9916
- import { readFile as readFile3, rm as rm3 } from "fs/promises";
9933
+ import { readFile as readFile3, rm as rm4 } from "fs/promises";
9917
9934
  import { join as join6 } from "path";
9918
9935
  var CaptureTreeSaga2 = class extends Saga {
9919
9936
  async execute(input) {
@@ -9962,7 +9979,7 @@ var CaptureTreeSaga2 = class extends Saga {
9962
9979
  runId
9963
9980
  );
9964
9981
  } finally {
9965
- await rm3(createdArchivePath, { force: true }).catch(() => {
9982
+ await rm4(createdArchivePath, { force: true }).catch(() => {
9966
9983
  });
9967
9984
  }
9968
9985
  }
@@ -10006,7 +10023,7 @@ var CaptureTreeSaga2 = class extends Saga {
10006
10023
  return void 0;
10007
10024
  },
10008
10025
  rollback: async () => {
10009
- await rm3(archivePath, { force: true }).catch(() => {
10026
+ await rm4(archivePath, { force: true }).catch(() => {
10010
10027
  });
10011
10028
  }
10012
10029
  });