@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.
package/dist/agent.js CHANGED
@@ -276,7 +276,7 @@ import { v7 as uuidv7 } from "uuid";
276
276
  // package.json
277
277
  var package_default = {
278
278
  name: "@posthog/agent",
279
- version: "2.1.35",
279
+ version: "2.1.45",
280
280
  repository: "https://github.com/PostHog/twig",
281
281
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
282
282
  exports: {
@@ -407,11 +407,16 @@ function unreachable(value, logger) {
407
407
  // src/gateway-models.ts
408
408
  var DEFAULT_GATEWAY_MODEL = "claude-opus-4-6";
409
409
  var BLOCKED_MODELS = /* @__PURE__ */ new Set(["gpt-5-mini", "openai/gpt-5-mini"]);
410
+ var CACHE_TTL = 10 * 60 * 1e3;
411
+ var gatewayModelsCache = null;
410
412
  async function fetchGatewayModels(options) {
411
413
  const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;
412
414
  if (!gatewayUrl) {
413
415
  return [];
414
416
  }
417
+ if (gatewayModelsCache && gatewayModelsCache.url === gatewayUrl && Date.now() < gatewayModelsCache.expiry) {
418
+ return gatewayModelsCache.models;
419
+ }
415
420
  const modelsUrl = `${gatewayUrl}/v1/models`;
416
421
  try {
417
422
  const response = await fetch(modelsUrl);
@@ -419,8 +424,13 @@ async function fetchGatewayModels(options) {
419
424
  return [];
420
425
  }
421
426
  const data = await response.json();
422
- const models = data.data ?? [];
423
- return models.filter((m) => !BLOCKED_MODELS.has(m.id));
427
+ const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));
428
+ gatewayModelsCache = {
429
+ models,
430
+ expiry: Date.now() + CACHE_TTL,
431
+ url: gatewayUrl
432
+ };
433
+ return models;
424
434
  } catch {
425
435
  return [];
426
436
  }
@@ -431,11 +441,15 @@ function isAnthropicModel(model) {
431
441
  }
432
442
  return model.id.startsWith("claude-") || model.id.startsWith("anthropic/");
433
443
  }
444
+ var arrayModelsCache = null;
434
445
  async function fetchArrayModels(options) {
435
446
  const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;
436
447
  if (!gatewayUrl) {
437
448
  return [];
438
449
  }
450
+ if (arrayModelsCache && arrayModelsCache.url === gatewayUrl && Date.now() < arrayModelsCache.expiry) {
451
+ return arrayModelsCache.models;
452
+ }
439
453
  try {
440
454
  const base = new URL(gatewayUrl);
441
455
  base.pathname = "/array/v1/models";
@@ -453,6 +467,11 @@ async function fetchArrayModels(options) {
453
467
  if (!id) continue;
454
468
  results.push({ id, owned_by: model?.owned_by });
455
469
  }
470
+ arrayModelsCache = {
471
+ models: results,
472
+ expiry: Date.now() + CACHE_TTL,
473
+ url: gatewayUrl
474
+ };
456
475
  return results;
457
476
  } catch {
458
477
  return [];
@@ -2355,12 +2374,8 @@ function clearStatsigCache() {
2355
2374
  process.env.CLAUDE_CONFIG_DIR || path2.join(os2.homedir(), ".claude"),
2356
2375
  "statsig"
2357
2376
  );
2358
- try {
2359
- if (fs.existsSync(statsigPath)) {
2360
- fs.rmSync(statsigPath, { recursive: true, force: true });
2361
- }
2362
- } catch {
2363
- }
2377
+ fs.rm(statsigPath, { recursive: true, force: true }, () => {
2378
+ });
2364
2379
  }
2365
2380
 
2366
2381
  // src/adapters/claude/claude-agent.ts
@@ -2422,7 +2437,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2422
2437
  const sessionId = uuidv7();
2423
2438
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
2424
2439
  const mcpServers = parseMcpServers(params);
2425
- await fetchMcpToolMetadata(mcpServers, this.logger);
2440
+ const mcpMetadataPromise = fetchMcpToolMetadata(mcpServers, this.logger);
2426
2441
  const options = buildSessionOptions({
2427
2442
  cwd: params.cwd,
2428
2443
  mcpServers,
@@ -2456,13 +2471,14 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2456
2471
  adapter: "claude"
2457
2472
  });
2458
2473
  }
2459
- const modelOptions = await this.getModelConfigOptions();
2474
+ const [modelOptions, slashCommands] = await Promise.all([
2475
+ this.getModelConfigOptions(),
2476
+ getAvailableSlashCommands(q),
2477
+ mcpMetadataPromise
2478
+ ]);
2460
2479
  session.modelId = modelOptions.currentModelId;
2461
2480
  await this.trySetModel(q, modelOptions.currentModelId);
2462
- this.sendAvailableCommandsUpdate(
2463
- sessionId,
2464
- await getAvailableSlashCommands(q)
2465
- );
2481
+ this.sendAvailableCommandsUpdate(sessionId, slashCommands);
2466
2482
  return {
2467
2483
  sessionId,
2468
2484
  configOptions: await this.buildConfigOptions(modelOptions)
@@ -2481,7 +2497,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2481
2497
  return {};
2482
2498
  }
2483
2499
  const mcpServers = parseMcpServers(params);
2484
- await fetchMcpToolMetadata(mcpServers, this.logger);
2500
+ const mcpMetadataPromise = fetchMcpToolMetadata(mcpServers, this.logger);
2485
2501
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
2486
2502
  const { query: q, session } = await this.initializeQuery({
2487
2503
  cwd: params.cwd,
@@ -2495,10 +2511,11 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2495
2511
  });
2496
2512
  session.taskRunId = meta?.taskRunId;
2497
2513
  this.registerPersistence(sessionId, meta);
2498
- this.sendAvailableCommandsUpdate(
2499
- sessionId,
2500
- await getAvailableSlashCommands(q)
2501
- );
2514
+ const [slashCommands] = await Promise.all([
2515
+ getAvailableSlashCommands(q),
2516
+ mcpMetadataPromise
2517
+ ]);
2518
+ this.sendAvailableCommandsUpdate(sessionId, slashCommands);
2502
2519
  return {
2503
2520
  configOptions: await this.buildConfigOptions()
2504
2521
  };