@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.
- package/dist/adapters/claude/permissions/permission-options.js +19 -0
- package/dist/adapters/claude/permissions/permission-options.js.map +1 -1
- package/dist/adapters/claude/tools.js +19 -0
- package/dist/adapters/claude/tools.js.map +1 -1
- package/dist/agent.js +160 -106
- package/dist/agent.js.map +1 -1
- package/dist/execution-mode.d.ts +7 -2
- package/dist/execution-mode.js +25 -0
- package/dist/execution-mode.js.map +1 -1
- package/dist/posthog-api.js +1 -1
- package/dist/posthog-api.js.map +1 -1
- package/dist/server/agent-server.js +125 -71
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +125 -71
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +1 -1
- package/src/acp-extensions.ts +3 -0
- package/src/adapters/claude/claude-agent.ts +13 -9
- package/src/adapters/codex/codex-agent.ts +61 -63
- package/src/adapters/codex/codex-client.ts +48 -4
- package/src/adapters/codex/session-state.ts +4 -3
- package/src/adapters/codex/spawn.ts +2 -0
- package/src/execution-mode.ts +37 -1
package/dist/server/bin.cjs
CHANGED
|
@@ -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.
|
|
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(
|
|
4376
|
-
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
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
|
-
|
|
5013
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
5510
|
+
return this.listSessions(params);
|
|
5441
5511
|
}
|
|
5442
5512
|
async prompt(params) {
|
|
5443
|
-
|
|
5444
|
-
|
|
5445
|
-
|
|
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
|
|
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(
|
|
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
|
|
5503
|
-
|
|
5504
|
-
|
|
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 (
|
|
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();
|