@posthog/agent 2.1.16 → 2.1.22

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.16",
279
+ version: "2.1.22",
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: {
@@ -348,11 +348,11 @@ var package_default = {
348
348
  },
349
349
  devDependencies: {
350
350
  "@changesets/cli": "^2.27.8",
351
+ "@posthog/shared": "workspace:*",
352
+ "@twig/git": "workspace:*",
351
353
  "@types/bun": "latest",
352
354
  "@types/tar": "^6.1.13",
353
355
  minimatch: "^10.0.3",
354
- "@posthog/shared": "workspace:*",
355
- "@twig/git": "workspace:*",
356
356
  msw: "^2.12.7",
357
357
  tsup: "^8.5.1",
358
358
  tsx: "^4.20.6",
@@ -360,16 +360,16 @@ var package_default = {
360
360
  vitest: "^2.1.8"
361
361
  },
362
362
  dependencies: {
363
+ "@agentclientprotocol/sdk": "^0.14.0",
364
+ "@anthropic-ai/claude-agent-sdk": "0.2.42",
365
+ "@anthropic-ai/sdk": "^0.71.0",
366
+ "@hono/node-server": "^1.19.9",
367
+ "@modelcontextprotocol/sdk": "^1.25.3",
363
368
  "@opentelemetry/api-logs": "^0.208.0",
364
369
  "@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
365
370
  "@opentelemetry/resources": "^2.0.0",
366
371
  "@opentelemetry/sdk-logs": "^0.208.0",
367
372
  "@opentelemetry/semantic-conventions": "^1.28.0",
368
- "@agentclientprotocol/sdk": "^0.14.0",
369
- "@anthropic-ai/claude-agent-sdk": "0.2.12",
370
- "@anthropic-ai/sdk": "^0.71.0",
371
- "@hono/node-server": "^1.19.9",
372
- "@modelcontextprotocol/sdk": "^1.25.3",
373
373
  "@types/jsonwebtoken": "^9.0.10",
374
374
  commander: "^14.0.2",
375
375
  diff: "^8.0.2",
@@ -1362,19 +1362,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
1362
1362
  }
1363
1363
  }
1364
1364
  async function handleSystemMessage(message, context) {
1365
- const { session, sessionId, client, logger } = context;
1365
+ const { sessionId, client, logger } = context;
1366
1366
  switch (message.subtype) {
1367
1367
  case "init":
1368
- if (message.session_id && session && !session.sessionId) {
1369
- session.sessionId = message.session_id;
1370
- if (session.taskRunId) {
1371
- await client.extNotification("_posthog/sdk_session", {
1372
- taskRunId: session.taskRunId,
1373
- sessionId: message.session_id,
1374
- adapter: "claude"
1375
- });
1376
- }
1377
- }
1378
1368
  break;
1379
1369
  case "compact_boundary":
1380
1370
  await client.extNotification("_posthog/compact_boundary", {
@@ -2304,7 +2294,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
2304
2294
  };
2305
2295
  };
2306
2296
  }
2297
+ function ensureLocalSettings(cwd) {
2298
+ const claudeDir = path2.join(cwd, ".claude");
2299
+ const localSettingsPath = path2.join(claudeDir, "settings.local.json");
2300
+ try {
2301
+ if (!fs.existsSync(localSettingsPath)) {
2302
+ fs.mkdirSync(claudeDir, { recursive: true });
2303
+ fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
2304
+ }
2305
+ } catch {
2306
+ }
2307
+ }
2307
2308
  function buildSessionOptions(params) {
2309
+ ensureLocalSettings(params.cwd);
2308
2310
  const options = {
2309
2311
  ...params.userProvidedOptions,
2310
2312
  systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
@@ -2327,7 +2329,7 @@ function buildSessionOptions(params) {
2327
2329
  ),
2328
2330
  ...params.onProcessSpawned && {
2329
2331
  spawnClaudeCodeProcess: buildSpawnWrapper(
2330
- params.sessionId ?? "unknown",
2332
+ params.sessionId,
2331
2333
  params.onProcessSpawned,
2332
2334
  params.onProcessExited
2333
2335
  )
@@ -2336,8 +2338,11 @@ function buildSessionOptions(params) {
2336
2338
  if (process.env.CLAUDE_CODE_EXECUTABLE) {
2337
2339
  options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
2338
2340
  }
2339
- if (params.sessionId) {
2341
+ if (params.isResume) {
2340
2342
  options.resume = params.sessionId;
2343
+ options.forkSession = false;
2344
+ } else {
2345
+ options.sessionId = params.sessionId;
2341
2346
  }
2342
2347
  if (params.additionalDirectories) {
2343
2348
  options.additionalDirectories = params.additionalDirectories;
@@ -2414,7 +2419,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2414
2419
  async newSession(params) {
2415
2420
  this.checkAuthStatus();
2416
2421
  const meta = params._meta;
2417
- const internalSessionId = uuidv7();
2422
+ const sessionId = uuidv7();
2418
2423
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
2419
2424
  const mcpServers = parseMcpServers(params);
2420
2425
  await fetchMcpToolMetadata(mcpServers, this.logger);
@@ -2422,18 +2427,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2422
2427
  cwd: params.cwd,
2423
2428
  mcpServers,
2424
2429
  permissionMode,
2425
- canUseTool: this.createCanUseTool(internalSessionId),
2430
+ canUseTool: this.createCanUseTool(sessionId),
2426
2431
  logger: this.logger,
2427
2432
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
2428
2433
  userProvidedOptions: meta?.claudeCode?.options,
2429
- onModeChange: this.createOnModeChange(internalSessionId),
2434
+ sessionId,
2435
+ isResume: false,
2436
+ onModeChange: this.createOnModeChange(sessionId),
2430
2437
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
2431
2438
  onProcessExited: this.processCallbacks?.onProcessExited
2432
2439
  });
2433
2440
  const input = new Pushable();
2434
2441
  const q = query({ prompt: input, options });
2435
2442
  const session = this.createSession(
2436
- internalSessionId,
2443
+ sessionId,
2437
2444
  q,
2438
2445
  input,
2439
2446
  permissionMode,
@@ -2441,19 +2448,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2441
2448
  options.abortController
2442
2449
  );
2443
2450
  session.taskRunId = meta?.taskRunId;
2444
- this.registerPersistence(
2445
- internalSessionId,
2446
- meta
2447
- );
2451
+ this.registerPersistence(sessionId, meta);
2452
+ if (meta?.taskRunId) {
2453
+ await this.client.extNotification("_posthog/sdk_session", {
2454
+ taskRunId: meta.taskRunId,
2455
+ sessionId,
2456
+ adapter: "claude"
2457
+ });
2458
+ }
2448
2459
  const modelOptions = await this.getModelConfigOptions();
2449
2460
  session.modelId = modelOptions.currentModelId;
2450
2461
  await this.trySetModel(q, modelOptions.currentModelId);
2451
2462
  this.sendAvailableCommandsUpdate(
2452
- internalSessionId,
2463
+ sessionId,
2453
2464
  await getAvailableSlashCommands(q)
2454
2465
  );
2455
2466
  return {
2456
- sessionId: internalSessionId,
2467
+ sessionId,
2457
2468
  configOptions: await this.buildConfigOptions(modelOptions)
2458
2469
  };
2459
2470
  }
@@ -2461,34 +2472,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2461
2472
  return this.resumeSession(params);
2462
2473
  }
2463
2474
  async resumeSession(params) {
2464
- const { sessionId: internalSessionId } = params;
2465
- if (this.sessionId === internalSessionId) {
2475
+ const meta = params._meta;
2476
+ const sessionId = meta?.sessionId;
2477
+ if (!sessionId) {
2478
+ throw new Error("Cannot resume session without sessionId");
2479
+ }
2480
+ if (this.sessionId === sessionId) {
2466
2481
  return {};
2467
2482
  }
2468
- const meta = params._meta;
2469
2483
  const mcpServers = parseMcpServers(params);
2470
2484
  await fetchMcpToolMetadata(mcpServers, this.logger);
2471
2485
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
2472
2486
  const { query: q, session } = await this.initializeQuery({
2473
- internalSessionId,
2474
2487
  cwd: params.cwd,
2475
2488
  permissionMode,
2476
2489
  mcpServers,
2477
2490
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
2478
2491
  userProvidedOptions: meta?.claudeCode?.options,
2479
- sessionId: meta?.sessionId,
2492
+ sessionId,
2493
+ isResume: true,
2480
2494
  additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
2481
2495
  });
2482
2496
  session.taskRunId = meta?.taskRunId;
2483
- if (meta?.sessionId) {
2484
- session.sessionId = meta.sessionId;
2485
- }
2486
- this.registerPersistence(
2487
- internalSessionId,
2488
- meta
2489
- );
2497
+ this.registerPersistence(sessionId, meta);
2490
2498
  this.sendAvailableCommandsUpdate(
2491
- internalSessionId,
2499
+ sessionId,
2492
2500
  await getAvailableSlashCommands(q)
2493
2501
  );
2494
2502
  return {
@@ -2557,20 +2565,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2557
2565
  cwd: config.cwd,
2558
2566
  mcpServers: config.mcpServers,
2559
2567
  permissionMode: config.permissionMode,
2560
- canUseTool: this.createCanUseTool(config.internalSessionId),
2568
+ canUseTool: this.createCanUseTool(config.sessionId),
2561
2569
  logger: this.logger,
2562
2570
  systemPrompt: config.systemPrompt,
2563
2571
  userProvidedOptions: config.userProvidedOptions,
2564
2572
  sessionId: config.sessionId,
2573
+ isResume: config.isResume,
2565
2574
  additionalDirectories: config.additionalDirectories,
2566
- onModeChange: this.createOnModeChange(config.internalSessionId),
2575
+ onModeChange: this.createOnModeChange(config.sessionId),
2567
2576
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
2568
2577
  onProcessExited: this.processCallbacks?.onProcessExited
2569
2578
  });
2570
2579
  const q = query({ prompt: input, options });
2571
2580
  const abortController = options.abortController;
2572
2581
  const session = this.createSession(
2573
- config.internalSessionId,
2582
+ config.sessionId,
2574
2583
  q,
2575
2584
  input,
2576
2585
  config.permissionMode,
@@ -2763,6 +2772,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
2763
2772
  }
2764
2773
  case "tool_progress":
2765
2774
  case "auth_status":
2775
+ case "tool_use_summary":
2766
2776
  return null;
2767
2777
  default:
2768
2778
  unreachable(message, this.logger);