@posthog/agent 2.1.71 → 2.1.83
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/conversion/tool-use-to-acp.d.ts +22 -2
- package/dist/adapters/claude/permissions/permission-options.d.ts +3 -1
- package/dist/adapters/claude/permissions/permission-options.js +5 -2
- package/dist/adapters/claude/permissions/permission-options.js.map +1 -1
- package/dist/adapters/claude/questions/utils.d.ts +1 -0
- package/dist/adapters/claude/tools.js.map +1 -1
- package/dist/agent.d.ts +30 -5
- package/dist/agent.js +22 -12
- package/dist/agent.js.map +1 -1
- package/dist/gateway-models.d.ts +1 -2
- package/dist/gateway-models.js +0 -5
- package/dist/gateway-models.js.map +1 -1
- package/dist/index.d.ts +1 -257
- package/dist/index.js +1 -10532
- package/dist/index.js.map +1 -1
- package/dist/server/agent-server.js +31 -17
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +31 -17
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +1 -4
- package/src/acp-extensions.ts +0 -98
- package/src/adapters/acp-connection.ts +6 -5
- package/src/adapters/claude/claude-agent.ts +1 -1
- package/src/adapters/claude/conversion/sdk-to-acp.ts +6 -3
- package/src/adapters/claude/mcp/tool-metadata.ts +8 -5
- package/src/adapters/claude/permissions/permission-handlers.ts +2 -1
- package/src/adapters/claude/permissions/permission-options.ts +10 -1
- package/src/adapters/claude/session/options.ts +11 -2
- package/src/agent.ts +2 -2
- package/src/gateway-models.ts +0 -7
- package/src/index.ts +1 -79
- package/src/sagas/apply-snapshot-saga.ts +6 -3
- package/src/sagas/capture-tree-saga.test.ts +1 -1
- package/src/test/mocks/msw-handlers.ts +0 -3
- package/dist/agent-DK1apkaG.d.ts +0 -133
- package/dist/logger-DDBiMOOD.d.ts +0 -24
- package/src/adapters/claude/tool-meta.ts +0 -143
- package/src/test/assertions.ts +0 -114
- package/src/test/controllers/sse-controller.ts +0 -107
- package/src/test/fixtures/notifications.ts +0 -92
- package/src/test/setup.ts +0 -114
- package/src/test/wait.ts +0 -41
|
@@ -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.
|
|
1186
|
+
version: "2.1.83",
|
|
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,7 +1255,6 @@ var package_default = {
|
|
|
1255
1255
|
node: ">=20.0.0"
|
|
1256
1256
|
},
|
|
1257
1257
|
devDependencies: {
|
|
1258
|
-
"@changesets/cli": "^2.27.8",
|
|
1259
1258
|
"@posthog/shared": "workspace:*",
|
|
1260
1259
|
"@twig/git": "workspace:*",
|
|
1261
1260
|
"@types/bun": "latest",
|
|
@@ -1280,8 +1279,6 @@ var package_default = {
|
|
|
1280
1279
|
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
1281
1280
|
"@types/jsonwebtoken": "^9.0.10",
|
|
1282
1281
|
commander: "^14.0.2",
|
|
1283
|
-
diff: "^8.0.2",
|
|
1284
|
-
dotenv: "^17.2.3",
|
|
1285
1282
|
hono: "^4.11.7",
|
|
1286
1283
|
jsonwebtoken: "^9.0.2",
|
|
1287
1284
|
tar: "^7.5.0",
|
|
@@ -2478,7 +2475,7 @@ function isHttpMcpServer(config) {
|
|
|
2478
2475
|
async function fetchToolsFromHttpServer(_serverName, config) {
|
|
2479
2476
|
const transport = new StreamableHTTPClientTransport(new URL(config.url), {
|
|
2480
2477
|
requestInit: {
|
|
2481
|
-
headers: config.headers
|
|
2478
|
+
headers: config.headers ?? {}
|
|
2482
2479
|
}
|
|
2483
2480
|
});
|
|
2484
2481
|
const client = new Client({
|
|
@@ -2696,13 +2693,16 @@ function permissionOptions(allowAlwaysLabel) {
|
|
|
2696
2693
|
}
|
|
2697
2694
|
];
|
|
2698
2695
|
}
|
|
2699
|
-
function buildPermissionOptions(toolName, toolInput, cwd) {
|
|
2696
|
+
function buildPermissionOptions(toolName, toolInput, cwd, suggestions) {
|
|
2700
2697
|
if (BASH_TOOLS.has(toolName)) {
|
|
2698
|
+
const rawRuleContent = suggestions?.flatMap((s) => "rules" in s ? s.rules : []).find((r) => r.toolName === "Bash" && r.ruleContent)?.ruleContent;
|
|
2699
|
+
const ruleContent = rawRuleContent?.replace(/:?\*$/, "");
|
|
2701
2700
|
const command = toolInput?.command;
|
|
2702
2701
|
const cmdName = command?.split(/\s+/)[0] ?? "this command";
|
|
2703
2702
|
const cwdLabel = cwd ? ` in ${cwd}` : "";
|
|
2703
|
+
const label = ruleContent ?? `\`${cmdName}\` commands`;
|
|
2704
2704
|
return permissionOptions(
|
|
2705
|
-
`Yes, and don't ask again for
|
|
2705
|
+
`Yes, and don't ask again for ${label}${cwdLabel}`
|
|
2706
2706
|
);
|
|
2707
2707
|
}
|
|
2708
2708
|
if (toolName === "BashOutput") {
|
|
@@ -2855,7 +2855,7 @@ async function applyPlanApproval(response, context, updatedInput) {
|
|
|
2855
2855
|
return { behavior: "deny", message, interrupt: false };
|
|
2856
2856
|
}
|
|
2857
2857
|
async function handleEnterPlanModeTool(context) {
|
|
2858
|
-
const { session, toolInput
|
|
2858
|
+
const { session, toolInput } = context;
|
|
2859
2859
|
session.permissionMode = "plan";
|
|
2860
2860
|
await session.query.setPermissionMode("plan");
|
|
2861
2861
|
await context.emitConfigOptionsUpdate();
|
|
@@ -2963,7 +2963,8 @@ async function handleDefaultPermissionFlow(context) {
|
|
|
2963
2963
|
const options = buildPermissionOptions(
|
|
2964
2964
|
toolName,
|
|
2965
2965
|
toolInput,
|
|
2966
|
-
session?.cwd
|
|
2966
|
+
session?.cwd,
|
|
2967
|
+
suggestions
|
|
2967
2968
|
);
|
|
2968
2969
|
const response = await client.requestPermission({
|
|
2969
2970
|
options,
|
|
@@ -3202,6 +3203,11 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
3202
3203
|
child.kill("SIGTERM");
|
|
3203
3204
|
});
|
|
3204
3205
|
}
|
|
3206
|
+
if (!child.stdin || !child.stdout) {
|
|
3207
|
+
throw new Error(
|
|
3208
|
+
`Failed to get stdio streams for spawned process (pid=${child.pid})`
|
|
3209
|
+
);
|
|
3210
|
+
}
|
|
3205
3211
|
return {
|
|
3206
3212
|
stdin: child.stdin,
|
|
3207
3213
|
stdout: child.stdout,
|
|
@@ -3214,12 +3220,15 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
3214
3220
|
kill(signal) {
|
|
3215
3221
|
return child.kill(signal);
|
|
3216
3222
|
},
|
|
3223
|
+
// biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]
|
|
3217
3224
|
on(event, listener) {
|
|
3218
3225
|
child.on(event, listener);
|
|
3219
3226
|
},
|
|
3227
|
+
// biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]
|
|
3220
3228
|
once(event, listener) {
|
|
3221
3229
|
child.once(event, listener);
|
|
3222
3230
|
},
|
|
3231
|
+
// biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]
|
|
3223
3232
|
off(event, listener) {
|
|
3224
3233
|
child.off(event, listener);
|
|
3225
3234
|
}
|
|
@@ -3900,15 +3909,16 @@ function createClaudeConnection(config) {
|
|
|
3900
3909
|
deviceType: config.deviceType
|
|
3901
3910
|
});
|
|
3902
3911
|
}
|
|
3912
|
+
const taskRunId = config.taskRunId;
|
|
3903
3913
|
agentWritable = createTappedWritableStream(streams.agent.writable, {
|
|
3904
3914
|
onMessage: (line) => {
|
|
3905
|
-
logWriter.appendRawLine(
|
|
3915
|
+
logWriter.appendRawLine(taskRunId, line);
|
|
3906
3916
|
},
|
|
3907
3917
|
logger
|
|
3908
3918
|
});
|
|
3909
3919
|
clientWritable = createTappedWritableStream(streams.client.writable, {
|
|
3910
3920
|
onMessage: (line) => {
|
|
3911
|
-
logWriter.appendRawLine(
|
|
3921
|
+
logWriter.appendRawLine(taskRunId, line);
|
|
3912
3922
|
},
|
|
3913
3923
|
logger
|
|
3914
3924
|
});
|
|
@@ -4104,7 +4114,7 @@ function createCodexConnection(config) {
|
|
|
4104
4114
|
}
|
|
4105
4115
|
});
|
|
4106
4116
|
const shouldTapLogs = config.taskRunId && logWriter;
|
|
4107
|
-
if (shouldTapLogs) {
|
|
4117
|
+
if (shouldTapLogs && config.taskRunId) {
|
|
4108
4118
|
const taskRunId2 = config.taskRunId;
|
|
4109
4119
|
if (!logWriter.isRegistered(taskRunId2)) {
|
|
4110
4120
|
logWriter.register(taskRunId2, {
|
|
@@ -9236,11 +9246,13 @@ var AsyncReaderWriterLock = class {
|
|
|
9236
9246
|
return;
|
|
9237
9247
|
if (this.writeQueue.length > 0) {
|
|
9238
9248
|
const next = this.writeQueue.shift();
|
|
9239
|
-
next
|
|
9249
|
+
if (next)
|
|
9250
|
+
next();
|
|
9240
9251
|
} else {
|
|
9241
9252
|
while (this.readQueue.length > 0 && !this.writerWaiting) {
|
|
9242
9253
|
const next = this.readQueue.shift();
|
|
9243
|
-
next
|
|
9254
|
+
if (next)
|
|
9255
|
+
next();
|
|
9244
9256
|
}
|
|
9245
9257
|
}
|
|
9246
9258
|
}
|
|
@@ -9756,27 +9768,29 @@ var ApplySnapshotSaga = class extends Saga {
|
|
|
9756
9768
|
if (!snapshot.archiveUrl) {
|
|
9757
9769
|
throw new Error("Cannot apply snapshot: no archive URL");
|
|
9758
9770
|
}
|
|
9771
|
+
const archiveUrl = snapshot.archiveUrl;
|
|
9759
9772
|
await this.step({
|
|
9760
9773
|
name: "create_tmp_dir",
|
|
9761
9774
|
execute: () => mkdir3(tmpDir, { recursive: true }),
|
|
9762
9775
|
rollback: async () => {
|
|
9763
9776
|
}
|
|
9764
9777
|
});
|
|
9765
|
-
|
|
9778
|
+
const archivePath = join5(tmpDir, `${snapshot.treeHash}.tar.gz`);
|
|
9779
|
+
this.archivePath = archivePath;
|
|
9766
9780
|
await this.step({
|
|
9767
9781
|
name: "download_archive",
|
|
9768
9782
|
execute: async () => {
|
|
9769
9783
|
const arrayBuffer = await apiClient.downloadArtifact(
|
|
9770
9784
|
taskId,
|
|
9771
9785
|
runId,
|
|
9772
|
-
|
|
9786
|
+
archiveUrl
|
|
9773
9787
|
);
|
|
9774
9788
|
if (!arrayBuffer) {
|
|
9775
9789
|
throw new Error("Failed to download archive");
|
|
9776
9790
|
}
|
|
9777
9791
|
const base64Content = Buffer.from(arrayBuffer).toString("utf-8");
|
|
9778
9792
|
const binaryContent = Buffer.from(base64Content, "base64");
|
|
9779
|
-
await writeFile3(
|
|
9793
|
+
await writeFile3(archivePath, binaryContent);
|
|
9780
9794
|
},
|
|
9781
9795
|
rollback: async () => {
|
|
9782
9796
|
if (this.archivePath) {
|