@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.
@@ -1183,7 +1183,7 @@ import { v7 as uuidv7 } from "uuid";
1183
1183
  // package.json
1184
1184
  var package_default = {
1185
1185
  name: "@posthog/agent",
1186
- version: "2.1.16",
1186
+ version: "2.1.22",
1187
1187
  repository: "https://github.com/PostHog/twig",
1188
1188
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
1189
1189
  exports: {
@@ -1255,11 +1255,11 @@ var package_default = {
1255
1255
  },
1256
1256
  devDependencies: {
1257
1257
  "@changesets/cli": "^2.27.8",
1258
+ "@posthog/shared": "workspace:*",
1259
+ "@twig/git": "workspace:*",
1258
1260
  "@types/bun": "latest",
1259
1261
  "@types/tar": "^6.1.13",
1260
1262
  minimatch: "^10.0.3",
1261
- "@posthog/shared": "workspace:*",
1262
- "@twig/git": "workspace:*",
1263
1263
  msw: "^2.12.7",
1264
1264
  tsup: "^8.5.1",
1265
1265
  tsx: "^4.20.6",
@@ -1267,16 +1267,16 @@ var package_default = {
1267
1267
  vitest: "^2.1.8"
1268
1268
  },
1269
1269
  dependencies: {
1270
+ "@agentclientprotocol/sdk": "^0.14.0",
1271
+ "@anthropic-ai/claude-agent-sdk": "0.2.42",
1272
+ "@anthropic-ai/sdk": "^0.71.0",
1273
+ "@hono/node-server": "^1.19.9",
1274
+ "@modelcontextprotocol/sdk": "^1.25.3",
1270
1275
  "@opentelemetry/api-logs": "^0.208.0",
1271
1276
  "@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
1272
1277
  "@opentelemetry/resources": "^2.0.0",
1273
1278
  "@opentelemetry/sdk-logs": "^0.208.0",
1274
1279
  "@opentelemetry/semantic-conventions": "^1.28.0",
1275
- "@agentclientprotocol/sdk": "^0.14.0",
1276
- "@anthropic-ai/claude-agent-sdk": "0.2.12",
1277
- "@anthropic-ai/sdk": "^0.71.0",
1278
- "@hono/node-server": "^1.19.9",
1279
- "@modelcontextprotocol/sdk": "^1.25.3",
1280
1280
  "@types/jsonwebtoken": "^9.0.10",
1281
1281
  commander: "^14.0.2",
1282
1282
  diff: "^8.0.2",
@@ -2242,19 +2242,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
2242
2242
  }
2243
2243
  }
2244
2244
  async function handleSystemMessage(message, context) {
2245
- const { session, sessionId, client, logger } = context;
2245
+ const { sessionId, client, logger } = context;
2246
2246
  switch (message.subtype) {
2247
2247
  case "init":
2248
- if (message.session_id && session && !session.sessionId) {
2249
- session.sessionId = message.session_id;
2250
- if (session.taskRunId) {
2251
- await client.extNotification("_posthog/sdk_session", {
2252
- taskRunId: session.taskRunId,
2253
- sessionId: message.session_id,
2254
- adapter: "claude"
2255
- });
2256
- }
2257
- }
2258
2248
  break;
2259
2249
  case "compact_boundary":
2260
2250
  await client.extNotification("_posthog/compact_boundary", {
@@ -3184,7 +3174,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
3184
3174
  };
3185
3175
  };
3186
3176
  }
3177
+ function ensureLocalSettings(cwd) {
3178
+ const claudeDir = path2.join(cwd, ".claude");
3179
+ const localSettingsPath = path2.join(claudeDir, "settings.local.json");
3180
+ try {
3181
+ if (!fs.existsSync(localSettingsPath)) {
3182
+ fs.mkdirSync(claudeDir, { recursive: true });
3183
+ fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
3184
+ }
3185
+ } catch {
3186
+ }
3187
+ }
3187
3188
  function buildSessionOptions(params) {
3189
+ ensureLocalSettings(params.cwd);
3188
3190
  const options = {
3189
3191
  ...params.userProvidedOptions,
3190
3192
  systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
@@ -3207,7 +3209,7 @@ function buildSessionOptions(params) {
3207
3209
  ),
3208
3210
  ...params.onProcessSpawned && {
3209
3211
  spawnClaudeCodeProcess: buildSpawnWrapper(
3210
- params.sessionId ?? "unknown",
3212
+ params.sessionId,
3211
3213
  params.onProcessSpawned,
3212
3214
  params.onProcessExited
3213
3215
  )
@@ -3216,8 +3218,11 @@ function buildSessionOptions(params) {
3216
3218
  if (process.env.CLAUDE_CODE_EXECUTABLE) {
3217
3219
  options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
3218
3220
  }
3219
- if (params.sessionId) {
3221
+ if (params.isResume) {
3220
3222
  options.resume = params.sessionId;
3223
+ options.forkSession = false;
3224
+ } else {
3225
+ options.sessionId = params.sessionId;
3221
3226
  }
3222
3227
  if (params.additionalDirectories) {
3223
3228
  options.additionalDirectories = params.additionalDirectories;
@@ -3294,7 +3299,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3294
3299
  async newSession(params) {
3295
3300
  this.checkAuthStatus();
3296
3301
  const meta = params._meta;
3297
- const internalSessionId = uuidv7();
3302
+ const sessionId = uuidv7();
3298
3303
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3299
3304
  const mcpServers = parseMcpServers(params);
3300
3305
  await fetchMcpToolMetadata(mcpServers, this.logger);
@@ -3302,18 +3307,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3302
3307
  cwd: params.cwd,
3303
3308
  mcpServers,
3304
3309
  permissionMode,
3305
- canUseTool: this.createCanUseTool(internalSessionId),
3310
+ canUseTool: this.createCanUseTool(sessionId),
3306
3311
  logger: this.logger,
3307
3312
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3308
3313
  userProvidedOptions: meta?.claudeCode?.options,
3309
- onModeChange: this.createOnModeChange(internalSessionId),
3314
+ sessionId,
3315
+ isResume: false,
3316
+ onModeChange: this.createOnModeChange(sessionId),
3310
3317
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3311
3318
  onProcessExited: this.processCallbacks?.onProcessExited
3312
3319
  });
3313
3320
  const input = new Pushable();
3314
3321
  const q = query({ prompt: input, options });
3315
3322
  const session = this.createSession(
3316
- internalSessionId,
3323
+ sessionId,
3317
3324
  q,
3318
3325
  input,
3319
3326
  permissionMode,
@@ -3321,19 +3328,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3321
3328
  options.abortController
3322
3329
  );
3323
3330
  session.taskRunId = meta?.taskRunId;
3324
- this.registerPersistence(
3325
- internalSessionId,
3326
- meta
3327
- );
3331
+ this.registerPersistence(sessionId, meta);
3332
+ if (meta?.taskRunId) {
3333
+ await this.client.extNotification("_posthog/sdk_session", {
3334
+ taskRunId: meta.taskRunId,
3335
+ sessionId,
3336
+ adapter: "claude"
3337
+ });
3338
+ }
3328
3339
  const modelOptions = await this.getModelConfigOptions();
3329
3340
  session.modelId = modelOptions.currentModelId;
3330
3341
  await this.trySetModel(q, modelOptions.currentModelId);
3331
3342
  this.sendAvailableCommandsUpdate(
3332
- internalSessionId,
3343
+ sessionId,
3333
3344
  await getAvailableSlashCommands(q)
3334
3345
  );
3335
3346
  return {
3336
- sessionId: internalSessionId,
3347
+ sessionId,
3337
3348
  configOptions: await this.buildConfigOptions(modelOptions)
3338
3349
  };
3339
3350
  }
@@ -3341,34 +3352,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3341
3352
  return this.resumeSession(params);
3342
3353
  }
3343
3354
  async resumeSession(params) {
3344
- const { sessionId: internalSessionId } = params;
3345
- if (this.sessionId === internalSessionId) {
3355
+ const meta = params._meta;
3356
+ const sessionId = meta?.sessionId;
3357
+ if (!sessionId) {
3358
+ throw new Error("Cannot resume session without sessionId");
3359
+ }
3360
+ if (this.sessionId === sessionId) {
3346
3361
  return {};
3347
3362
  }
3348
- const meta = params._meta;
3349
3363
  const mcpServers = parseMcpServers(params);
3350
3364
  await fetchMcpToolMetadata(mcpServers, this.logger);
3351
3365
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3352
3366
  const { query: q, session } = await this.initializeQuery({
3353
- internalSessionId,
3354
3367
  cwd: params.cwd,
3355
3368
  permissionMode,
3356
3369
  mcpServers,
3357
3370
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3358
3371
  userProvidedOptions: meta?.claudeCode?.options,
3359
- sessionId: meta?.sessionId,
3372
+ sessionId,
3373
+ isResume: true,
3360
3374
  additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
3361
3375
  });
3362
3376
  session.taskRunId = meta?.taskRunId;
3363
- if (meta?.sessionId) {
3364
- session.sessionId = meta.sessionId;
3365
- }
3366
- this.registerPersistence(
3367
- internalSessionId,
3368
- meta
3369
- );
3377
+ this.registerPersistence(sessionId, meta);
3370
3378
  this.sendAvailableCommandsUpdate(
3371
- internalSessionId,
3379
+ sessionId,
3372
3380
  await getAvailableSlashCommands(q)
3373
3381
  );
3374
3382
  return {
@@ -3437,20 +3445,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3437
3445
  cwd: config.cwd,
3438
3446
  mcpServers: config.mcpServers,
3439
3447
  permissionMode: config.permissionMode,
3440
- canUseTool: this.createCanUseTool(config.internalSessionId),
3448
+ canUseTool: this.createCanUseTool(config.sessionId),
3441
3449
  logger: this.logger,
3442
3450
  systemPrompt: config.systemPrompt,
3443
3451
  userProvidedOptions: config.userProvidedOptions,
3444
3452
  sessionId: config.sessionId,
3453
+ isResume: config.isResume,
3445
3454
  additionalDirectories: config.additionalDirectories,
3446
- onModeChange: this.createOnModeChange(config.internalSessionId),
3455
+ onModeChange: this.createOnModeChange(config.sessionId),
3447
3456
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3448
3457
  onProcessExited: this.processCallbacks?.onProcessExited
3449
3458
  });
3450
3459
  const q = query({ prompt: input, options });
3451
3460
  const abortController = options.abortController;
3452
3461
  const session = this.createSession(
3453
- config.internalSessionId,
3462
+ config.sessionId,
3454
3463
  q,
3455
3464
  input,
3456
3465
  config.permissionMode,
@@ -3643,6 +3652,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3643
3652
  }
3644
3653
  case "tool_progress":
3645
3654
  case "auth_status":
3655
+ case "tool_use_summary":
3646
3656
  return null;
3647
3657
  default:
3648
3658
  unreachable(message, this.logger);