@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/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.16",
1177
+ version: "2.1.22",
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: {
@@ -1246,11 +1246,11 @@ var package_default = {
1246
1246
  },
1247
1247
  devDependencies: {
1248
1248
  "@changesets/cli": "^2.27.8",
1249
+ "@posthog/shared": "workspace:*",
1250
+ "@twig/git": "workspace:*",
1249
1251
  "@types/bun": "latest",
1250
1252
  "@types/tar": "^6.1.13",
1251
1253
  minimatch: "^10.0.3",
1252
- "@posthog/shared": "workspace:*",
1253
- "@twig/git": "workspace:*",
1254
1254
  msw: "^2.12.7",
1255
1255
  tsup: "^8.5.1",
1256
1256
  tsx: "^4.20.6",
@@ -1258,16 +1258,16 @@ var package_default = {
1258
1258
  vitest: "^2.1.8"
1259
1259
  },
1260
1260
  dependencies: {
1261
+ "@agentclientprotocol/sdk": "^0.14.0",
1262
+ "@anthropic-ai/claude-agent-sdk": "0.2.42",
1263
+ "@anthropic-ai/sdk": "^0.71.0",
1264
+ "@hono/node-server": "^1.19.9",
1265
+ "@modelcontextprotocol/sdk": "^1.25.3",
1261
1266
  "@opentelemetry/api-logs": "^0.208.0",
1262
1267
  "@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
1263
1268
  "@opentelemetry/resources": "^2.0.0",
1264
1269
  "@opentelemetry/sdk-logs": "^0.208.0",
1265
1270
  "@opentelemetry/semantic-conventions": "^1.28.0",
1266
- "@agentclientprotocol/sdk": "^0.14.0",
1267
- "@anthropic-ai/claude-agent-sdk": "0.2.12",
1268
- "@anthropic-ai/sdk": "^0.71.0",
1269
- "@hono/node-server": "^1.19.9",
1270
- "@modelcontextprotocol/sdk": "^1.25.3",
1271
1271
  "@types/jsonwebtoken": "^9.0.10",
1272
1272
  commander: "^14.0.2",
1273
1273
  diff: "^8.0.2",
@@ -2268,19 +2268,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
2268
2268
  }
2269
2269
  }
2270
2270
  async function handleSystemMessage(message, context) {
2271
- const { session, sessionId, client, logger } = context;
2271
+ const { sessionId, client, logger } = context;
2272
2272
  switch (message.subtype) {
2273
2273
  case "init":
2274
- if (message.session_id && session && !session.sessionId) {
2275
- session.sessionId = message.session_id;
2276
- if (session.taskRunId) {
2277
- await client.extNotification("_posthog/sdk_session", {
2278
- taskRunId: session.taskRunId,
2279
- sessionId: message.session_id,
2280
- adapter: "claude"
2281
- });
2282
- }
2283
- }
2284
2274
  break;
2285
2275
  case "compact_boundary":
2286
2276
  await client.extNotification("_posthog/compact_boundary", {
@@ -3210,7 +3200,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
3210
3200
  };
3211
3201
  };
3212
3202
  }
3203
+ function ensureLocalSettings(cwd) {
3204
+ const claudeDir = path2.join(cwd, ".claude");
3205
+ const localSettingsPath = path2.join(claudeDir, "settings.local.json");
3206
+ try {
3207
+ if (!fs.existsSync(localSettingsPath)) {
3208
+ fs.mkdirSync(claudeDir, { recursive: true });
3209
+ fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
3210
+ }
3211
+ } catch {
3212
+ }
3213
+ }
3213
3214
  function buildSessionOptions(params) {
3215
+ ensureLocalSettings(params.cwd);
3214
3216
  const options = {
3215
3217
  ...params.userProvidedOptions,
3216
3218
  systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
@@ -3233,7 +3235,7 @@ function buildSessionOptions(params) {
3233
3235
  ),
3234
3236
  ...params.onProcessSpawned && {
3235
3237
  spawnClaudeCodeProcess: buildSpawnWrapper(
3236
- params.sessionId ?? "unknown",
3238
+ params.sessionId,
3237
3239
  params.onProcessSpawned,
3238
3240
  params.onProcessExited
3239
3241
  )
@@ -3242,8 +3244,11 @@ function buildSessionOptions(params) {
3242
3244
  if (process.env.CLAUDE_CODE_EXECUTABLE) {
3243
3245
  options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
3244
3246
  }
3245
- if (params.sessionId) {
3247
+ if (params.isResume) {
3246
3248
  options.resume = params.sessionId;
3249
+ options.forkSession = false;
3250
+ } else {
3251
+ options.sessionId = params.sessionId;
3247
3252
  }
3248
3253
  if (params.additionalDirectories) {
3249
3254
  options.additionalDirectories = params.additionalDirectories;
@@ -3320,7 +3325,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3320
3325
  async newSession(params) {
3321
3326
  this.checkAuthStatus();
3322
3327
  const meta = params._meta;
3323
- const internalSessionId = uuidv7();
3328
+ const sessionId = uuidv7();
3324
3329
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3325
3330
  const mcpServers = parseMcpServers(params);
3326
3331
  await fetchMcpToolMetadata(mcpServers, this.logger);
@@ -3328,18 +3333,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3328
3333
  cwd: params.cwd,
3329
3334
  mcpServers,
3330
3335
  permissionMode,
3331
- canUseTool: this.createCanUseTool(internalSessionId),
3336
+ canUseTool: this.createCanUseTool(sessionId),
3332
3337
  logger: this.logger,
3333
3338
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3334
3339
  userProvidedOptions: meta?.claudeCode?.options,
3335
- onModeChange: this.createOnModeChange(internalSessionId),
3340
+ sessionId,
3341
+ isResume: false,
3342
+ onModeChange: this.createOnModeChange(sessionId),
3336
3343
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3337
3344
  onProcessExited: this.processCallbacks?.onProcessExited
3338
3345
  });
3339
3346
  const input = new Pushable();
3340
3347
  const q = query({ prompt: input, options });
3341
3348
  const session = this.createSession(
3342
- internalSessionId,
3349
+ sessionId,
3343
3350
  q,
3344
3351
  input,
3345
3352
  permissionMode,
@@ -3347,19 +3354,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3347
3354
  options.abortController
3348
3355
  );
3349
3356
  session.taskRunId = meta?.taskRunId;
3350
- this.registerPersistence(
3351
- internalSessionId,
3352
- meta
3353
- );
3357
+ this.registerPersistence(sessionId, meta);
3358
+ if (meta?.taskRunId) {
3359
+ await this.client.extNotification("_posthog/sdk_session", {
3360
+ taskRunId: meta.taskRunId,
3361
+ sessionId,
3362
+ adapter: "claude"
3363
+ });
3364
+ }
3354
3365
  const modelOptions = await this.getModelConfigOptions();
3355
3366
  session.modelId = modelOptions.currentModelId;
3356
3367
  await this.trySetModel(q, modelOptions.currentModelId);
3357
3368
  this.sendAvailableCommandsUpdate(
3358
- internalSessionId,
3369
+ sessionId,
3359
3370
  await getAvailableSlashCommands(q)
3360
3371
  );
3361
3372
  return {
3362
- sessionId: internalSessionId,
3373
+ sessionId,
3363
3374
  configOptions: await this.buildConfigOptions(modelOptions)
3364
3375
  };
3365
3376
  }
@@ -3367,34 +3378,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3367
3378
  return this.resumeSession(params);
3368
3379
  }
3369
3380
  async resumeSession(params) {
3370
- const { sessionId: internalSessionId } = params;
3371
- if (this.sessionId === internalSessionId) {
3381
+ const meta = params._meta;
3382
+ const sessionId = meta?.sessionId;
3383
+ if (!sessionId) {
3384
+ throw new Error("Cannot resume session without sessionId");
3385
+ }
3386
+ if (this.sessionId === sessionId) {
3372
3387
  return {};
3373
3388
  }
3374
- const meta = params._meta;
3375
3389
  const mcpServers = parseMcpServers(params);
3376
3390
  await fetchMcpToolMetadata(mcpServers, this.logger);
3377
3391
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3378
3392
  const { query: q, session } = await this.initializeQuery({
3379
- internalSessionId,
3380
3393
  cwd: params.cwd,
3381
3394
  permissionMode,
3382
3395
  mcpServers,
3383
3396
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3384
3397
  userProvidedOptions: meta?.claudeCode?.options,
3385
- sessionId: meta?.sessionId,
3398
+ sessionId,
3399
+ isResume: true,
3386
3400
  additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
3387
3401
  });
3388
3402
  session.taskRunId = meta?.taskRunId;
3389
- if (meta?.sessionId) {
3390
- session.sessionId = meta.sessionId;
3391
- }
3392
- this.registerPersistence(
3393
- internalSessionId,
3394
- meta
3395
- );
3403
+ this.registerPersistence(sessionId, meta);
3396
3404
  this.sendAvailableCommandsUpdate(
3397
- internalSessionId,
3405
+ sessionId,
3398
3406
  await getAvailableSlashCommands(q)
3399
3407
  );
3400
3408
  return {
@@ -3463,20 +3471,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3463
3471
  cwd: config.cwd,
3464
3472
  mcpServers: config.mcpServers,
3465
3473
  permissionMode: config.permissionMode,
3466
- canUseTool: this.createCanUseTool(config.internalSessionId),
3474
+ canUseTool: this.createCanUseTool(config.sessionId),
3467
3475
  logger: this.logger,
3468
3476
  systemPrompt: config.systemPrompt,
3469
3477
  userProvidedOptions: config.userProvidedOptions,
3470
3478
  sessionId: config.sessionId,
3479
+ isResume: config.isResume,
3471
3480
  additionalDirectories: config.additionalDirectories,
3472
- onModeChange: this.createOnModeChange(config.internalSessionId),
3481
+ onModeChange: this.createOnModeChange(config.sessionId),
3473
3482
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3474
3483
  onProcessExited: this.processCallbacks?.onProcessExited
3475
3484
  });
3476
3485
  const q = query({ prompt: input, options });
3477
3486
  const abortController = options.abortController;
3478
3487
  const session = this.createSession(
3479
- config.internalSessionId,
3488
+ config.sessionId,
3480
3489
  q,
3481
3490
  input,
3482
3491
  config.permissionMode,
@@ -3669,6 +3678,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3669
3678
  }
3670
3679
  case "tool_progress":
3671
3680
  case "auth_status":
3681
+ case "tool_use_summary":
3672
3682
  return null;
3673
3683
  default:
3674
3684
  unreachable(message, this.logger);