@posthog/agent 2.1.17 → 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.
@@ -1175,7 +1175,7 @@ var import_uuid = require("uuid");
1175
1175
  // package.json
1176
1176
  var package_default = {
1177
1177
  name: "@posthog/agent",
1178
- version: "2.1.17",
1178
+ version: "2.1.22",
1179
1179
  repository: "https://github.com/PostHog/twig",
1180
1180
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
1181
1181
  exports: {
@@ -1247,11 +1247,11 @@ var package_default = {
1247
1247
  },
1248
1248
  devDependencies: {
1249
1249
  "@changesets/cli": "^2.27.8",
1250
+ "@posthog/shared": "workspace:*",
1251
+ "@twig/git": "workspace:*",
1250
1252
  "@types/bun": "latest",
1251
1253
  "@types/tar": "^6.1.13",
1252
1254
  minimatch: "^10.0.3",
1253
- "@posthog/shared": "workspace:*",
1254
- "@twig/git": "workspace:*",
1255
1255
  msw: "^2.12.7",
1256
1256
  tsup: "^8.5.1",
1257
1257
  tsx: "^4.20.6",
@@ -1259,16 +1259,16 @@ var package_default = {
1259
1259
  vitest: "^2.1.8"
1260
1260
  },
1261
1261
  dependencies: {
1262
+ "@agentclientprotocol/sdk": "^0.14.0",
1263
+ "@anthropic-ai/claude-agent-sdk": "0.2.42",
1264
+ "@anthropic-ai/sdk": "^0.71.0",
1265
+ "@hono/node-server": "^1.19.9",
1266
+ "@modelcontextprotocol/sdk": "^1.25.3",
1262
1267
  "@opentelemetry/api-logs": "^0.208.0",
1263
1268
  "@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
1264
1269
  "@opentelemetry/resources": "^2.0.0",
1265
1270
  "@opentelemetry/sdk-logs": "^0.208.0",
1266
1271
  "@opentelemetry/semantic-conventions": "^1.28.0",
1267
- "@agentclientprotocol/sdk": "^0.14.0",
1268
- "@anthropic-ai/claude-agent-sdk": "0.2.12",
1269
- "@anthropic-ai/sdk": "^0.71.0",
1270
- "@hono/node-server": "^1.19.9",
1271
- "@modelcontextprotocol/sdk": "^1.25.3",
1272
1272
  "@types/jsonwebtoken": "^9.0.10",
1273
1273
  commander: "^14.0.2",
1274
1274
  diff: "^8.0.2",
@@ -2234,19 +2234,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
2234
2234
  }
2235
2235
  }
2236
2236
  async function handleSystemMessage(message, context) {
2237
- const { session, sessionId, client, logger } = context;
2237
+ const { sessionId, client, logger } = context;
2238
2238
  switch (message.subtype) {
2239
2239
  case "init":
2240
- if (message.session_id && session && !session.sessionId) {
2241
- session.sessionId = message.session_id;
2242
- if (session.taskRunId) {
2243
- await client.extNotification("_posthog/sdk_session", {
2244
- taskRunId: session.taskRunId,
2245
- sessionId: message.session_id,
2246
- adapter: "claude"
2247
- });
2248
- }
2249
- }
2250
2240
  break;
2251
2241
  case "compact_boundary":
2252
2242
  await client.extNotification("_posthog/compact_boundary", {
@@ -3211,7 +3201,7 @@ function buildSessionOptions(params) {
3211
3201
  ),
3212
3202
  ...params.onProcessSpawned && {
3213
3203
  spawnClaudeCodeProcess: buildSpawnWrapper(
3214
- params.sessionId ?? "unknown",
3204
+ params.sessionId,
3215
3205
  params.onProcessSpawned,
3216
3206
  params.onProcessExited
3217
3207
  )
@@ -3220,8 +3210,11 @@ function buildSessionOptions(params) {
3220
3210
  if (process.env.CLAUDE_CODE_EXECUTABLE) {
3221
3211
  options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
3222
3212
  }
3223
- if (params.sessionId) {
3213
+ if (params.isResume) {
3224
3214
  options.resume = params.sessionId;
3215
+ options.forkSession = false;
3216
+ } else {
3217
+ options.sessionId = params.sessionId;
3225
3218
  }
3226
3219
  if (params.additionalDirectories) {
3227
3220
  options.additionalDirectories = params.additionalDirectories;
@@ -3298,7 +3291,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3298
3291
  async newSession(params) {
3299
3292
  this.checkAuthStatus();
3300
3293
  const meta = params._meta;
3301
- const internalSessionId = (0, import_uuid.v7)();
3294
+ const sessionId = (0, import_uuid.v7)();
3302
3295
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3303
3296
  const mcpServers = parseMcpServers(params);
3304
3297
  await fetchMcpToolMetadata(mcpServers, this.logger);
@@ -3306,18 +3299,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3306
3299
  cwd: params.cwd,
3307
3300
  mcpServers,
3308
3301
  permissionMode,
3309
- canUseTool: this.createCanUseTool(internalSessionId),
3302
+ canUseTool: this.createCanUseTool(sessionId),
3310
3303
  logger: this.logger,
3311
3304
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3312
3305
  userProvidedOptions: meta?.claudeCode?.options,
3313
- onModeChange: this.createOnModeChange(internalSessionId),
3306
+ sessionId,
3307
+ isResume: false,
3308
+ onModeChange: this.createOnModeChange(sessionId),
3314
3309
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3315
3310
  onProcessExited: this.processCallbacks?.onProcessExited
3316
3311
  });
3317
3312
  const input = new Pushable();
3318
3313
  const q = (0, import_claude_agent_sdk.query)({ prompt: input, options });
3319
3314
  const session = this.createSession(
3320
- internalSessionId,
3315
+ sessionId,
3321
3316
  q,
3322
3317
  input,
3323
3318
  permissionMode,
@@ -3325,19 +3320,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3325
3320
  options.abortController
3326
3321
  );
3327
3322
  session.taskRunId = meta?.taskRunId;
3328
- this.registerPersistence(
3329
- internalSessionId,
3330
- meta
3331
- );
3323
+ this.registerPersistence(sessionId, meta);
3324
+ if (meta?.taskRunId) {
3325
+ await this.client.extNotification("_posthog/sdk_session", {
3326
+ taskRunId: meta.taskRunId,
3327
+ sessionId,
3328
+ adapter: "claude"
3329
+ });
3330
+ }
3332
3331
  const modelOptions = await this.getModelConfigOptions();
3333
3332
  session.modelId = modelOptions.currentModelId;
3334
3333
  await this.trySetModel(q, modelOptions.currentModelId);
3335
3334
  this.sendAvailableCommandsUpdate(
3336
- internalSessionId,
3335
+ sessionId,
3337
3336
  await getAvailableSlashCommands(q)
3338
3337
  );
3339
3338
  return {
3340
- sessionId: internalSessionId,
3339
+ sessionId,
3341
3340
  configOptions: await this.buildConfigOptions(modelOptions)
3342
3341
  };
3343
3342
  }
@@ -3345,34 +3344,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3345
3344
  return this.resumeSession(params);
3346
3345
  }
3347
3346
  async resumeSession(params) {
3348
- const { sessionId: internalSessionId } = params;
3349
- if (this.sessionId === internalSessionId) {
3347
+ const meta = params._meta;
3348
+ const sessionId = meta?.sessionId;
3349
+ if (!sessionId) {
3350
+ throw new Error("Cannot resume session without sessionId");
3351
+ }
3352
+ if (this.sessionId === sessionId) {
3350
3353
  return {};
3351
3354
  }
3352
- const meta = params._meta;
3353
3355
  const mcpServers = parseMcpServers(params);
3354
3356
  await fetchMcpToolMetadata(mcpServers, this.logger);
3355
3357
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3356
3358
  const { query: q, session } = await this.initializeQuery({
3357
- internalSessionId,
3358
3359
  cwd: params.cwd,
3359
3360
  permissionMode,
3360
3361
  mcpServers,
3361
3362
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3362
3363
  userProvidedOptions: meta?.claudeCode?.options,
3363
- sessionId: meta?.sessionId,
3364
+ sessionId,
3365
+ isResume: true,
3364
3366
  additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
3365
3367
  });
3366
3368
  session.taskRunId = meta?.taskRunId;
3367
- if (meta?.sessionId) {
3368
- session.sessionId = meta.sessionId;
3369
- }
3370
- this.registerPersistence(
3371
- internalSessionId,
3372
- meta
3373
- );
3369
+ this.registerPersistence(sessionId, meta);
3374
3370
  this.sendAvailableCommandsUpdate(
3375
- internalSessionId,
3371
+ sessionId,
3376
3372
  await getAvailableSlashCommands(q)
3377
3373
  );
3378
3374
  return {
@@ -3441,20 +3437,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3441
3437
  cwd: config.cwd,
3442
3438
  mcpServers: config.mcpServers,
3443
3439
  permissionMode: config.permissionMode,
3444
- canUseTool: this.createCanUseTool(config.internalSessionId),
3440
+ canUseTool: this.createCanUseTool(config.sessionId),
3445
3441
  logger: this.logger,
3446
3442
  systemPrompt: config.systemPrompt,
3447
3443
  userProvidedOptions: config.userProvidedOptions,
3448
3444
  sessionId: config.sessionId,
3445
+ isResume: config.isResume,
3449
3446
  additionalDirectories: config.additionalDirectories,
3450
- onModeChange: this.createOnModeChange(config.internalSessionId),
3447
+ onModeChange: this.createOnModeChange(config.sessionId),
3451
3448
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3452
3449
  onProcessExited: this.processCallbacks?.onProcessExited
3453
3450
  });
3454
3451
  const q = (0, import_claude_agent_sdk.query)({ prompt: input, options });
3455
3452
  const abortController = options.abortController;
3456
3453
  const session = this.createSession(
3457
- config.internalSessionId,
3454
+ config.sessionId,
3458
3455
  q,
3459
3456
  input,
3460
3457
  config.permissionMode,
@@ -3647,6 +3644,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3647
3644
  }
3648
3645
  case "tool_progress":
3649
3646
  case "auth_status":
3647
+ case "tool_use_summary":
3650
3648
  return null;
3651
3649
  default:
3652
3650
  unreachable(message, this.logger);