@posthog/agent 2.3.171 → 2.3.173

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.
@@ -904,7 +904,7 @@ var import_hono = require("hono");
904
904
  // package.json
905
905
  var package_default = {
906
906
  name: "@posthog/agent",
907
- version: "2.3.171",
907
+ version: "2.3.173",
908
908
  repository: "https://github.com/PostHog/code",
909
909
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
910
910
  exports: {
@@ -1062,7 +1062,9 @@ var POSTHOG_NOTIFICATIONS = {
1062
1062
  /** Task-level notification (progress, milestones) */
1063
1063
  TASK_NOTIFICATION: "_posthog/task_notification",
1064
1064
  /** Marks a boundary for log compaction */
1065
- COMPACT_BOUNDARY: "_posthog/compact_boundary"
1065
+ COMPACT_BOUNDARY: "_posthog/compact_boundary",
1066
+ /** Token usage update for a session turn */
1067
+ USAGE_UPDATE: "_posthog/usage_update"
1066
1068
  };
1067
1069
 
1068
1070
  // src/adapters/acp-connection.ts
@@ -3006,6 +3008,25 @@ var CODE_EXECUTION_MODES = [
3006
3008
  function getAvailableModes() {
3007
3009
  return IS_ROOT ? availableModes.filter((m) => m.id !== "bypassPermissions") : availableModes;
3008
3010
  }
3011
+ var codexModes = [
3012
+ {
3013
+ id: "read-only",
3014
+ name: "Read Only",
3015
+ description: "Read-only access, no file modifications"
3016
+ },
3017
+ {
3018
+ id: "auto",
3019
+ name: "Auto",
3020
+ description: "Standard behavior, prompts for dangerous operations"
3021
+ }
3022
+ ];
3023
+ if (ALLOW_BYPASS) {
3024
+ codexModes.push({
3025
+ id: "full-access",
3026
+ name: "Full Access",
3027
+ description: "Auto-accept all permission requests"
3028
+ });
3029
+ }
3009
3030
 
3010
3031
  // src/adapters/claude/tools.ts
3011
3032
  var READ_TOOLS = /* @__PURE__ */ new Set(["Read", "NotebookRead"]);
@@ -4372,16 +4393,19 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
4372
4393
  }
4373
4394
  });
4374
4395
  }
4375
- await this.client.extNotification("_posthog/usage_update", {
4376
- sessionId: params.sessionId,
4377
- used: {
4378
- inputTokens: message.usage.input_tokens,
4379
- outputTokens: message.usage.output_tokens,
4380
- cachedReadTokens: message.usage.cache_read_input_tokens,
4381
- cachedWriteTokens: message.usage.cache_creation_input_tokens
4382
- },
4383
- cost: message.total_cost_usd
4384
- });
4396
+ await this.client.extNotification(
4397
+ POSTHOG_NOTIFICATIONS.USAGE_UPDATE,
4398
+ {
4399
+ sessionId: params.sessionId,
4400
+ used: {
4401
+ inputTokens: message.usage.input_tokens,
4402
+ outputTokens: message.usage.output_tokens,
4403
+ cachedReadTokens: message.usage.cache_read_input_tokens,
4404
+ cachedWriteTokens: message.usage.cache_creation_input_tokens
4405
+ },
4406
+ cost: message.total_cost_usd
4407
+ }
4408
+ );
4385
4409
  const usage = {
4386
4410
  inputTokens: this.session.accumulatedUsage.inputTokens,
4387
4411
  outputTokens: this.session.accumulatedUsage.outputTokens,
@@ -5005,13 +5029,49 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
5005
5029
  var import_sdk3 = require("@agentclientprotocol/sdk");
5006
5030
 
5007
5031
  // src/adapters/codex/codex-client.ts
5032
+ var AUTO_APPROVED_KINDS = {
5033
+ default: /* @__PURE__ */ new Set(["read", "search", "fetch", "think"]),
5034
+ acceptEdits: /* @__PURE__ */ new Set(["read", "edit", "search", "fetch", "think"]),
5035
+ plan: /* @__PURE__ */ new Set(["read", "search", "fetch", "think"]),
5036
+ bypassPermissions: /* @__PURE__ */ new Set([
5037
+ "read",
5038
+ "edit",
5039
+ "delete",
5040
+ "move",
5041
+ "search",
5042
+ "execute",
5043
+ "think",
5044
+ "fetch",
5045
+ "switch_mode",
5046
+ "other"
5047
+ ])
5048
+ };
5049
+ function shouldAutoApprove(mode, kind) {
5050
+ if (mode === "bypassPermissions") return true;
5051
+ if (!kind) return false;
5052
+ return AUTO_APPROVED_KINDS[mode]?.has(kind) ?? false;
5053
+ }
5008
5054
  function createCodexClient(upstreamClient, logger, sessionState, callbacks) {
5009
5055
  const terminalHandles = /* @__PURE__ */ new Map();
5010
5056
  return {
5011
5057
  async requestPermission(params) {
5012
- logger.debug("Relaying permission request to upstream", {
5013
- sessionId: params.sessionId
5014
- });
5058
+ const kind = params.toolCall?.kind;
5059
+ if (shouldAutoApprove(sessionState.permissionMode, kind)) {
5060
+ logger.debug("Auto-approving permission", {
5061
+ mode: sessionState.permissionMode,
5062
+ kind,
5063
+ toolCallId: params.toolCall?.toolCallId
5064
+ });
5065
+ const allowOption = params.options?.find(
5066
+ (o) => o.kind === "allow_once" || o.kind === "allow_always"
5067
+ );
5068
+ return {
5069
+ outcome: {
5070
+ outcome: "selected",
5071
+ optionId: allowOption?.optionId ?? "allow"
5072
+ }
5073
+ };
5074
+ }
5015
5075
  return upstreamClient.requestPermission(params);
5016
5076
  },
5017
5077
  async sessionUpdate(params) {
@@ -5103,7 +5163,7 @@ function createSessionState(sessionId, cwd, opts) {
5103
5163
  cachedReadTokens: 0,
5104
5164
  cachedWriteTokens: 0
5105
5165
  },
5106
- cancelled: false,
5166
+ permissionMode: opts?.permissionMode ?? "default",
5107
5167
  taskRunId: opts?.taskRunId,
5108
5168
  taskId: opts?.taskId
5109
5169
  };
@@ -5217,7 +5277,7 @@ function buildConfigArgs(options) {
5217
5277
  args.push("-c", `model="${options.model}"`);
5218
5278
  }
5219
5279
  if (options.instructions) {
5220
- const escaped = options.instructions.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
5280
+ const escaped = options.instructions.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/"/g, '\\"');
5221
5281
  args.push("-c", `instructions="${escaped}"`);
5222
5282
  }
5223
5283
  return args;
@@ -5297,6 +5357,18 @@ function spawnCodexProcess(options) {
5297
5357
  }
5298
5358
 
5299
5359
  // src/adapters/codex/codex-agent.ts
5360
+ function toCodeExecutionMode(mode) {
5361
+ if (mode && CODE_EXECUTION_MODES.includes(mode)) {
5362
+ return mode;
5363
+ }
5364
+ return "default";
5365
+ }
5366
+ var CODEX_NATIVE_MODE = {
5367
+ default: "default",
5368
+ acceptEdits: "default",
5369
+ plan: "plan",
5370
+ bypassPermissions: "default"
5371
+ };
5300
5372
  var CodexAcpAgent = class extends BaseAcpAgent {
5301
5373
  adapterName = "codex";
5302
5374
  codexProcess;
@@ -5322,24 +5394,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5322
5394
  notificationHistory: [],
5323
5395
  cancelled: false
5324
5396
  };
5397
+ this.sessionState = createSessionState("", cwd);
5325
5398
  this.codexConnection = new import_sdk3.ClientSideConnection(
5326
- (_agent) => createCodexClient(
5327
- this.client,
5328
- this.logger,
5329
- this.sessionState ?? {
5330
- sessionId: "",
5331
- cwd: "",
5332
- modeId: "default",
5333
- configOptions: [],
5334
- accumulatedUsage: {
5335
- inputTokens: 0,
5336
- outputTokens: 0,
5337
- cachedReadTokens: 0,
5338
- cachedWriteTokens: 0
5339
- },
5340
- cancelled: false
5341
- }
5342
- ),
5399
+ (_agent) => createCodexClient(this.client, this.logger, this.sessionState),
5343
5400
  codexStream
5344
5401
  );
5345
5402
  }
@@ -5375,7 +5432,8 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5375
5432
  taskRunId: meta?.taskRunId,
5376
5433
  taskId: meta?.taskId ?? meta?.persistence?.taskId,
5377
5434
  modeId: response.modes?.currentModeId ?? "default",
5378
- modelId: response.models?.currentModelId
5435
+ modelId: response.models?.currentModelId,
5436
+ permissionMode: toCodeExecutionMode(meta?.permissionMode)
5379
5437
  });
5380
5438
  this.sessionId = response.sessionId;
5381
5439
  this.sessionState.configOptions = response.configOptions ?? [];
@@ -5394,7 +5452,10 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5394
5452
  }
5395
5453
  async loadSession(params) {
5396
5454
  const response = await this.codexConnection.loadSession(params);
5397
- this.sessionState = createSessionState(params.sessionId, params.cwd);
5455
+ const meta = params._meta;
5456
+ this.sessionState = createSessionState(params.sessionId, params.cwd, {
5457
+ permissionMode: toCodeExecutionMode(meta?.permissionMode)
5458
+ });
5398
5459
  this.sessionId = params.sessionId;
5399
5460
  this.sessionState.configOptions = response.configOptions ?? [];
5400
5461
  return response;
@@ -5405,10 +5466,14 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5405
5466
  cwd: params.cwd,
5406
5467
  mcpServers: params.mcpServers ?? []
5407
5468
  });
5408
- this.sessionState = createSessionState(params.sessionId, params.cwd);
5469
+ const meta = params._meta;
5470
+ this.sessionState = createSessionState(params.sessionId, params.cwd, {
5471
+ taskRunId: meta?.taskRunId,
5472
+ taskId: meta?.taskId ?? meta?.persistence?.taskId,
5473
+ permissionMode: toCodeExecutionMode(meta?.permissionMode)
5474
+ });
5409
5475
  this.sessionId = params.sessionId;
5410
5476
  this.sessionState.configOptions = loadResponse.configOptions ?? [];
5411
- const meta = params._meta;
5412
5477
  if (meta?.taskRunId) {
5413
5478
  await this.client.extNotification(POSTHOG_NOTIFICATIONS.SDK_SESSION, {
5414
5479
  taskRunId: meta.taskRunId,
@@ -5428,7 +5493,12 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5428
5493
  mcpServers: params.mcpServers ?? [],
5429
5494
  _meta: params._meta
5430
5495
  });
5431
- this.sessionState = createSessionState(newResponse.sessionId, params.cwd);
5496
+ const meta = params._meta;
5497
+ this.sessionState = createSessionState(newResponse.sessionId, params.cwd, {
5498
+ taskRunId: meta?.taskRunId,
5499
+ taskId: meta?.taskId ?? meta?.persistence?.taskId,
5500
+ permissionMode: toCodeExecutionMode(meta?.permissionMode)
5501
+ });
5432
5502
  this.sessionId = newResponse.sessionId;
5433
5503
  this.sessionState.configOptions = newResponse.configOptions ?? [];
5434
5504
  return newResponse;
@@ -5437,22 +5507,14 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5437
5507
  return this.codexConnection.listSessions(params);
5438
5508
  }
5439
5509
  async unstable_listSessions(params) {
5440
- return this.codexConnection.listSessions(params);
5510
+ return this.listSessions(params);
5441
5511
  }
5442
5512
  async prompt(params) {
5443
- if (this.sessionState) {
5444
- this.sessionState.cancelled = false;
5445
- this.sessionState.interruptReason = void 0;
5446
- resetUsage(this.sessionState);
5447
- }
5513
+ this.session.cancelled = false;
5514
+ this.session.interruptReason = void 0;
5515
+ resetUsage(this.sessionState);
5448
5516
  const response = await this.codexConnection.prompt(params);
5449
- if (this.sessionState && response.usage) {
5450
- this.sessionState.accumulatedUsage.inputTokens += response.usage.inputTokens ?? 0;
5451
- this.sessionState.accumulatedUsage.outputTokens += response.usage.outputTokens ?? 0;
5452
- this.sessionState.accumulatedUsage.cachedReadTokens += response.usage.cachedReadTokens ?? 0;
5453
- this.sessionState.accumulatedUsage.cachedWriteTokens += response.usage.cachedWriteTokens ?? 0;
5454
- }
5455
- if (this.sessionState?.taskRunId) {
5517
+ if (this.sessionState.taskRunId) {
5456
5518
  const { accumulatedUsage } = this.sessionState;
5457
5519
  await this.client.extNotification(POSTHOG_NOTIFICATIONS.TURN_COMPLETE, {
5458
5520
  sessionId: params.sessionId,
@@ -5466,7 +5528,7 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5466
5528
  }
5467
5529
  });
5468
5530
  if (response.usage) {
5469
- await this.client.extNotification("_posthog/usage_update", {
5531
+ await this.client.extNotification(POSTHOG_NOTIFICATIONS.USAGE_UPDATE, {
5470
5532
  sessionId: params.sessionId,
5471
5533
  used: {
5472
5534
  inputTokens: response.usage.inputTokens ?? 0,
@@ -5481,33 +5543,24 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5481
5543
  return response;
5482
5544
  }
5483
5545
  async interrupt() {
5484
- if (this.sessionState) {
5485
- this.sessionState.cancelled = true;
5486
- }
5487
5546
  await this.codexConnection.cancel({
5488
5547
  sessionId: this.sessionId
5489
5548
  });
5490
5549
  }
5491
- async cancel(params) {
5492
- if (this.sessionState) {
5493
- this.sessionState.cancelled = true;
5494
- const meta = params._meta;
5495
- if (meta?.interruptReason) {
5496
- this.sessionState.interruptReason = meta.interruptReason;
5497
- }
5498
- }
5499
- await this.codexConnection.cancel(params);
5500
- }
5501
5550
  async setSessionMode(params) {
5502
- const response = await this.codexConnection.setSessionMode(params);
5503
- if (this.sessionState) {
5504
- this.sessionState.modeId = params.modeId;
5505
- }
5551
+ const requestedMode = toCodeExecutionMode(params.modeId);
5552
+ const nativeMode = CODEX_NATIVE_MODE[requestedMode];
5553
+ const response = await this.codexConnection.setSessionMode({
5554
+ ...params,
5555
+ modeId: nativeMode
5556
+ });
5557
+ this.sessionState.modeId = nativeMode;
5558
+ this.sessionState.permissionMode = requestedMode;
5506
5559
  return response ?? {};
5507
5560
  }
5508
5561
  async setSessionConfigOption(params) {
5509
5562
  const response = await this.codexConnection.setSessionConfigOption(params);
5510
- if (this.sessionState && response.configOptions) {
5563
+ if (response.configOptions) {
5511
5564
  this.sessionState.configOptions = response.configOptions;
5512
5565
  }
5513
5566
  return response;
@@ -5516,6 +5569,7 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5516
5569
  }
5517
5570
  async closeSession() {
5518
5571
  this.logger.info("Closing Codex session", { sessionId: this.sessionId });
5572
+ this.session.abortController.abort();
5519
5573
  this.session.settingsManager.dispose();
5520
5574
  try {
5521
5575
  this.codexProcess.kill();