@posthog/agent 2.3.169 → 2.3.172

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.169",
907
+ version: "2.3.172",
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: {
@@ -3006,6 +3006,26 @@ var CODE_EXECUTION_MODES = [
3006
3006
  function getAvailableModes() {
3007
3007
  return IS_ROOT ? availableModes.filter((m) => m.id !== "bypassPermissions") : availableModes;
3008
3008
  }
3009
+ var CODEX_NATIVE_MODES = ["auto", "read-only", "full-access"];
3010
+ var codexModes = [
3011
+ {
3012
+ id: "read-only",
3013
+ name: "Read Only",
3014
+ description: "Read-only access, no file modifications"
3015
+ },
3016
+ {
3017
+ id: "auto",
3018
+ name: "Auto",
3019
+ description: "Standard behavior, prompts for dangerous operations"
3020
+ }
3021
+ ];
3022
+ if (ALLOW_BYPASS) {
3023
+ codexModes.push({
3024
+ id: "full-access",
3025
+ name: "Full Access",
3026
+ description: "Auto-accept all permission requests"
3027
+ });
3028
+ }
3009
3029
 
3010
3030
  // src/adapters/claude/tools.ts
3011
3031
  var READ_TOOLS = /* @__PURE__ */ new Set(["Read", "NotebookRead"]);
@@ -5005,13 +5025,48 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
5005
5025
  var import_sdk3 = require("@agentclientprotocol/sdk");
5006
5026
 
5007
5027
  // src/adapters/codex/codex-client.ts
5028
+ var AUTO_APPROVED_KINDS = {
5029
+ auto: /* @__PURE__ */ new Set(["read", "search", "fetch", "think"]),
5030
+ "read-only": /* @__PURE__ */ new Set(["read", "search", "fetch", "think"]),
5031
+ "full-access": /* @__PURE__ */ new Set([
5032
+ "read",
5033
+ "edit",
5034
+ "delete",
5035
+ "move",
5036
+ "search",
5037
+ "execute",
5038
+ "think",
5039
+ "fetch",
5040
+ "switch_mode",
5041
+ "other"
5042
+ ])
5043
+ };
5044
+ function shouldAutoApprove(mode, kind) {
5045
+ if (mode === "full-access") return true;
5046
+ if (!kind) return false;
5047
+ return AUTO_APPROVED_KINDS[mode]?.has(kind) ?? false;
5048
+ }
5008
5049
  function createCodexClient(upstreamClient, logger, sessionState, callbacks) {
5009
5050
  const terminalHandles = /* @__PURE__ */ new Map();
5010
5051
  return {
5011
5052
  async requestPermission(params) {
5012
- logger.debug("Relaying permission request to upstream", {
5013
- sessionId: params.sessionId
5014
- });
5053
+ const kind = params.toolCall?.kind;
5054
+ if (shouldAutoApprove(sessionState.permissionMode, kind)) {
5055
+ logger.debug("Auto-approving permission", {
5056
+ mode: sessionState.permissionMode,
5057
+ kind,
5058
+ toolCallId: params.toolCall?.toolCallId
5059
+ });
5060
+ const allowOption = params.options?.find(
5061
+ (o) => o.kind === "allow_once" || o.kind === "allow_always"
5062
+ );
5063
+ return {
5064
+ outcome: {
5065
+ outcome: "selected",
5066
+ optionId: allowOption?.optionId ?? "allow"
5067
+ }
5068
+ };
5069
+ }
5015
5070
  return upstreamClient.requestPermission(params);
5016
5071
  },
5017
5072
  async sessionUpdate(params) {
@@ -5021,6 +5076,22 @@ function createCodexClient(upstreamClient, logger, sessionState, callbacks) {
5021
5076
  const size = update.size;
5022
5077
  if (used !== void 0) sessionState.contextUsed = used;
5023
5078
  if (size !== void 0) sessionState.contextSize = size;
5079
+ const inputTokens = update.inputTokens;
5080
+ const outputTokens = update.outputTokens;
5081
+ if (inputTokens !== void 0) {
5082
+ sessionState.accumulatedUsage.inputTokens += inputTokens;
5083
+ }
5084
+ if (outputTokens !== void 0) {
5085
+ sessionState.accumulatedUsage.outputTokens += outputTokens;
5086
+ }
5087
+ const cachedRead = update.cachedReadTokens;
5088
+ const cachedWrite = update.cachedWriteTokens;
5089
+ if (cachedRead !== void 0) {
5090
+ sessionState.accumulatedUsage.cachedReadTokens += cachedRead;
5091
+ }
5092
+ if (cachedWrite !== void 0) {
5093
+ sessionState.accumulatedUsage.cachedWriteTokens += cachedWrite;
5094
+ }
5024
5095
  callbacks?.onUsageUpdate?.(update);
5025
5096
  }
5026
5097
  await upstreamClient.sessionUpdate(params);
@@ -5078,7 +5149,7 @@ function createSessionState(sessionId, cwd, opts) {
5078
5149
  return {
5079
5150
  sessionId,
5080
5151
  cwd,
5081
- modeId: opts?.modeId ?? "default",
5152
+ modeId: opts?.modeId ?? "auto",
5082
5153
  modelId: opts?.modelId,
5083
5154
  configOptions: [],
5084
5155
  accumulatedUsage: {
@@ -5087,6 +5158,7 @@ function createSessionState(sessionId, cwd, opts) {
5087
5158
  cachedReadTokens: 0,
5088
5159
  cachedWriteTokens: 0
5089
5160
  },
5161
+ permissionMode: opts?.permissionMode ?? "auto",
5090
5162
  cancelled: false,
5091
5163
  taskRunId: opts?.taskRunId,
5092
5164
  taskId: opts?.taskId
@@ -5200,6 +5272,10 @@ function buildConfigArgs(options) {
5200
5272
  if (options.model) {
5201
5273
  args.push("-c", `model="${options.model}"`);
5202
5274
  }
5275
+ if (options.instructions) {
5276
+ const escaped = options.instructions.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
5277
+ args.push("-c", `instructions="${escaped}"`);
5278
+ }
5203
5279
  return args;
5204
5280
  }
5205
5281
  function findCodexBinary(options) {
@@ -5277,6 +5353,12 @@ function spawnCodexProcess(options) {
5277
5353
  }
5278
5354
 
5279
5355
  // src/adapters/codex/codex-agent.ts
5356
+ function toPermissionMode(mode) {
5357
+ if (mode && CODEX_NATIVE_MODES.includes(mode)) {
5358
+ return mode;
5359
+ }
5360
+ return "auto";
5361
+ }
5280
5362
  var CodexAcpAgent = class extends BaseAcpAgent {
5281
5363
  adapterName = "codex";
5282
5364
  codexProcess;
@@ -5309,7 +5391,7 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5309
5391
  this.sessionState ?? {
5310
5392
  sessionId: "",
5311
5393
  cwd: "",
5312
- modeId: "default",
5394
+ modeId: "auto",
5313
5395
  configOptions: [],
5314
5396
  accumulatedUsage: {
5315
5397
  inputTokens: 0,
@@ -5317,6 +5399,7 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5317
5399
  cachedReadTokens: 0,
5318
5400
  cachedWriteTokens: 0
5319
5401
  },
5402
+ permissionMode: "auto",
5320
5403
  cancelled: false
5321
5404
  }
5322
5405
  ),
@@ -5355,7 +5438,8 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5355
5438
  taskRunId: meta?.taskRunId,
5356
5439
  taskId: meta?.taskId ?? meta?.persistence?.taskId,
5357
5440
  modeId: response.modes?.currentModeId ?? "default",
5358
- modelId: response.models?.currentModelId
5441
+ modelId: response.models?.currentModelId,
5442
+ permissionMode: toPermissionMode(meta?.permissionMode)
5359
5443
  });
5360
5444
  this.sessionId = response.sessionId;
5361
5445
  this.sessionState.configOptions = response.configOptions ?? [];
@@ -5426,17 +5510,37 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5426
5510
  resetUsage(this.sessionState);
5427
5511
  }
5428
5512
  const response = await this.codexConnection.prompt(params);
5429
- if (this.sessionState?.taskRunId && response.usage) {
5430
- await this.client.extNotification("_posthog/usage_update", {
5513
+ if (this.sessionState && response.usage) {
5514
+ this.sessionState.accumulatedUsage.inputTokens += response.usage.inputTokens ?? 0;
5515
+ this.sessionState.accumulatedUsage.outputTokens += response.usage.outputTokens ?? 0;
5516
+ this.sessionState.accumulatedUsage.cachedReadTokens += response.usage.cachedReadTokens ?? 0;
5517
+ this.sessionState.accumulatedUsage.cachedWriteTokens += response.usage.cachedWriteTokens ?? 0;
5518
+ }
5519
+ if (this.sessionState?.taskRunId) {
5520
+ const { accumulatedUsage } = this.sessionState;
5521
+ await this.client.extNotification(POSTHOG_NOTIFICATIONS.TURN_COMPLETE, {
5431
5522
  sessionId: params.sessionId,
5432
- used: {
5433
- inputTokens: response.usage.inputTokens ?? 0,
5434
- outputTokens: response.usage.outputTokens ?? 0,
5435
- cachedReadTokens: response.usage.cachedReadTokens ?? 0,
5436
- cachedWriteTokens: response.usage.cachedWriteTokens ?? 0
5437
- },
5438
- cost: null
5523
+ stopReason: response.stopReason ?? "end_turn",
5524
+ usage: {
5525
+ inputTokens: accumulatedUsage.inputTokens,
5526
+ outputTokens: accumulatedUsage.outputTokens,
5527
+ cachedReadTokens: accumulatedUsage.cachedReadTokens,
5528
+ cachedWriteTokens: accumulatedUsage.cachedWriteTokens,
5529
+ totalTokens: accumulatedUsage.inputTokens + accumulatedUsage.outputTokens + accumulatedUsage.cachedReadTokens + accumulatedUsage.cachedWriteTokens
5530
+ }
5439
5531
  });
5532
+ if (response.usage) {
5533
+ await this.client.extNotification("_posthog/usage_update", {
5534
+ sessionId: params.sessionId,
5535
+ used: {
5536
+ inputTokens: response.usage.inputTokens ?? 0,
5537
+ outputTokens: response.usage.outputTokens ?? 0,
5538
+ cachedReadTokens: response.usage.cachedReadTokens ?? 0,
5539
+ cachedWriteTokens: response.usage.cachedWriteTokens ?? 0
5540
+ },
5541
+ cost: null
5542
+ });
5543
+ }
5440
5544
  }
5441
5545
  return response;
5442
5546
  }
@@ -5459,9 +5563,14 @@ var CodexAcpAgent = class extends BaseAcpAgent {
5459
5563
  await this.codexConnection.cancel(params);
5460
5564
  }
5461
5565
  async setSessionMode(params) {
5462
- const response = await this.codexConnection.setSessionMode(params);
5566
+ const permissionMode = toPermissionMode(params.modeId);
5567
+ const response = await this.codexConnection.setSessionMode({
5568
+ ...params,
5569
+ modeId: permissionMode
5570
+ });
5463
5571
  if (this.sessionState) {
5464
- this.sessionState.modeId = params.modeId;
5572
+ this.sessionState.modeId = permissionMode;
5573
+ this.sessionState.permissionMode = permissionMode;
5465
5574
  }
5466
5575
  return response ?? {};
5467
5576
  }