@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.
@@ -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.16",
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", {
@@ -3176,7 +3166,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
3176
3166
  };
3177
3167
  };
3178
3168
  }
3169
+ function ensureLocalSettings(cwd) {
3170
+ const claudeDir = path2.join(cwd, ".claude");
3171
+ const localSettingsPath = path2.join(claudeDir, "settings.local.json");
3172
+ try {
3173
+ if (!fs.existsSync(localSettingsPath)) {
3174
+ fs.mkdirSync(claudeDir, { recursive: true });
3175
+ fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
3176
+ }
3177
+ } catch {
3178
+ }
3179
+ }
3179
3180
  function buildSessionOptions(params) {
3181
+ ensureLocalSettings(params.cwd);
3180
3182
  const options = {
3181
3183
  ...params.userProvidedOptions,
3182
3184
  systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
@@ -3199,7 +3201,7 @@ function buildSessionOptions(params) {
3199
3201
  ),
3200
3202
  ...params.onProcessSpawned && {
3201
3203
  spawnClaudeCodeProcess: buildSpawnWrapper(
3202
- params.sessionId ?? "unknown",
3204
+ params.sessionId,
3203
3205
  params.onProcessSpawned,
3204
3206
  params.onProcessExited
3205
3207
  )
@@ -3208,8 +3210,11 @@ function buildSessionOptions(params) {
3208
3210
  if (process.env.CLAUDE_CODE_EXECUTABLE) {
3209
3211
  options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
3210
3212
  }
3211
- if (params.sessionId) {
3213
+ if (params.isResume) {
3212
3214
  options.resume = params.sessionId;
3215
+ options.forkSession = false;
3216
+ } else {
3217
+ options.sessionId = params.sessionId;
3213
3218
  }
3214
3219
  if (params.additionalDirectories) {
3215
3220
  options.additionalDirectories = params.additionalDirectories;
@@ -3286,7 +3291,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3286
3291
  async newSession(params) {
3287
3292
  this.checkAuthStatus();
3288
3293
  const meta = params._meta;
3289
- const internalSessionId = (0, import_uuid.v7)();
3294
+ const sessionId = (0, import_uuid.v7)();
3290
3295
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3291
3296
  const mcpServers = parseMcpServers(params);
3292
3297
  await fetchMcpToolMetadata(mcpServers, this.logger);
@@ -3294,18 +3299,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3294
3299
  cwd: params.cwd,
3295
3300
  mcpServers,
3296
3301
  permissionMode,
3297
- canUseTool: this.createCanUseTool(internalSessionId),
3302
+ canUseTool: this.createCanUseTool(sessionId),
3298
3303
  logger: this.logger,
3299
3304
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3300
3305
  userProvidedOptions: meta?.claudeCode?.options,
3301
- onModeChange: this.createOnModeChange(internalSessionId),
3306
+ sessionId,
3307
+ isResume: false,
3308
+ onModeChange: this.createOnModeChange(sessionId),
3302
3309
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3303
3310
  onProcessExited: this.processCallbacks?.onProcessExited
3304
3311
  });
3305
3312
  const input = new Pushable();
3306
3313
  const q = (0, import_claude_agent_sdk.query)({ prompt: input, options });
3307
3314
  const session = this.createSession(
3308
- internalSessionId,
3315
+ sessionId,
3309
3316
  q,
3310
3317
  input,
3311
3318
  permissionMode,
@@ -3313,19 +3320,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3313
3320
  options.abortController
3314
3321
  );
3315
3322
  session.taskRunId = meta?.taskRunId;
3316
- this.registerPersistence(
3317
- internalSessionId,
3318
- meta
3319
- );
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
+ }
3320
3331
  const modelOptions = await this.getModelConfigOptions();
3321
3332
  session.modelId = modelOptions.currentModelId;
3322
3333
  await this.trySetModel(q, modelOptions.currentModelId);
3323
3334
  this.sendAvailableCommandsUpdate(
3324
- internalSessionId,
3335
+ sessionId,
3325
3336
  await getAvailableSlashCommands(q)
3326
3337
  );
3327
3338
  return {
3328
- sessionId: internalSessionId,
3339
+ sessionId,
3329
3340
  configOptions: await this.buildConfigOptions(modelOptions)
3330
3341
  };
3331
3342
  }
@@ -3333,34 +3344,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3333
3344
  return this.resumeSession(params);
3334
3345
  }
3335
3346
  async resumeSession(params) {
3336
- const { sessionId: internalSessionId } = params;
3337
- 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) {
3338
3353
  return {};
3339
3354
  }
3340
- const meta = params._meta;
3341
3355
  const mcpServers = parseMcpServers(params);
3342
3356
  await fetchMcpToolMetadata(mcpServers, this.logger);
3343
3357
  const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
3344
3358
  const { query: q, session } = await this.initializeQuery({
3345
- internalSessionId,
3346
3359
  cwd: params.cwd,
3347
3360
  permissionMode,
3348
3361
  mcpServers,
3349
3362
  systemPrompt: buildSystemPrompt(meta?.systemPrompt),
3350
3363
  userProvidedOptions: meta?.claudeCode?.options,
3351
- sessionId: meta?.sessionId,
3364
+ sessionId,
3365
+ isResume: true,
3352
3366
  additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
3353
3367
  });
3354
3368
  session.taskRunId = meta?.taskRunId;
3355
- if (meta?.sessionId) {
3356
- session.sessionId = meta.sessionId;
3357
- }
3358
- this.registerPersistence(
3359
- internalSessionId,
3360
- meta
3361
- );
3369
+ this.registerPersistence(sessionId, meta);
3362
3370
  this.sendAvailableCommandsUpdate(
3363
- internalSessionId,
3371
+ sessionId,
3364
3372
  await getAvailableSlashCommands(q)
3365
3373
  );
3366
3374
  return {
@@ -3429,20 +3437,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3429
3437
  cwd: config.cwd,
3430
3438
  mcpServers: config.mcpServers,
3431
3439
  permissionMode: config.permissionMode,
3432
- canUseTool: this.createCanUseTool(config.internalSessionId),
3440
+ canUseTool: this.createCanUseTool(config.sessionId),
3433
3441
  logger: this.logger,
3434
3442
  systemPrompt: config.systemPrompt,
3435
3443
  userProvidedOptions: config.userProvidedOptions,
3436
3444
  sessionId: config.sessionId,
3445
+ isResume: config.isResume,
3437
3446
  additionalDirectories: config.additionalDirectories,
3438
- onModeChange: this.createOnModeChange(config.internalSessionId),
3447
+ onModeChange: this.createOnModeChange(config.sessionId),
3439
3448
  onProcessSpawned: this.processCallbacks?.onProcessSpawned,
3440
3449
  onProcessExited: this.processCallbacks?.onProcessExited
3441
3450
  });
3442
3451
  const q = (0, import_claude_agent_sdk.query)({ prompt: input, options });
3443
3452
  const abortController = options.abortController;
3444
3453
  const session = this.createSession(
3445
- config.internalSessionId,
3454
+ config.sessionId,
3446
3455
  q,
3447
3456
  input,
3448
3457
  config.permissionMode,
@@ -3635,6 +3644,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
3635
3644
  }
3636
3645
  case "tool_progress":
3637
3646
  case "auth_status":
3647
+ case "tool_use_summary":
3638
3648
  return null;
3639
3649
  default:
3640
3650
  unreachable(message, this.logger);