@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
package/dist/server/bin.cjs
CHANGED
|
@@ -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.
|
|
1178
|
+
version: "2.1.83",
|
|
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,7 +1247,6 @@ var package_default = {
|
|
|
1247
1247
|
node: ">=20.0.0"
|
|
1248
1248
|
},
|
|
1249
1249
|
devDependencies: {
|
|
1250
|
-
"@changesets/cli": "^2.27.8",
|
|
1251
1250
|
"@posthog/shared": "workspace:*",
|
|
1252
1251
|
"@twig/git": "workspace:*",
|
|
1253
1252
|
"@types/bun": "latest",
|
|
@@ -1272,8 +1271,6 @@ var package_default = {
|
|
|
1272
1271
|
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
1273
1272
|
"@types/jsonwebtoken": "^9.0.10",
|
|
1274
1273
|
commander: "^14.0.2",
|
|
1275
|
-
diff: "^8.0.2",
|
|
1276
|
-
dotenv: "^17.2.3",
|
|
1277
1274
|
hono: "^4.11.7",
|
|
1278
1275
|
jsonwebtoken: "^9.0.2",
|
|
1279
1276
|
tar: "^7.5.0",
|
|
@@ -2470,7 +2467,7 @@ function isHttpMcpServer(config) {
|
|
|
2470
2467
|
async function fetchToolsFromHttpServer(_serverName, config) {
|
|
2471
2468
|
const transport = new import_streamableHttp.StreamableHTTPClientTransport(new URL(config.url), {
|
|
2472
2469
|
requestInit: {
|
|
2473
|
-
headers: config.headers
|
|
2470
|
+
headers: config.headers ?? {}
|
|
2474
2471
|
}
|
|
2475
2472
|
});
|
|
2476
2473
|
const client = new import_client.Client({
|
|
@@ -2688,13 +2685,16 @@ function permissionOptions(allowAlwaysLabel) {
|
|
|
2688
2685
|
}
|
|
2689
2686
|
];
|
|
2690
2687
|
}
|
|
2691
|
-
function buildPermissionOptions(toolName, toolInput, cwd) {
|
|
2688
|
+
function buildPermissionOptions(toolName, toolInput, cwd, suggestions) {
|
|
2692
2689
|
if (BASH_TOOLS.has(toolName)) {
|
|
2690
|
+
const rawRuleContent = suggestions?.flatMap((s) => "rules" in s ? s.rules : []).find((r) => r.toolName === "Bash" && r.ruleContent)?.ruleContent;
|
|
2691
|
+
const ruleContent = rawRuleContent?.replace(/:?\*$/, "");
|
|
2693
2692
|
const command = toolInput?.command;
|
|
2694
2693
|
const cmdName = command?.split(/\s+/)[0] ?? "this command";
|
|
2695
2694
|
const cwdLabel = cwd ? ` in ${cwd}` : "";
|
|
2695
|
+
const label = ruleContent ?? `\`${cmdName}\` commands`;
|
|
2696
2696
|
return permissionOptions(
|
|
2697
|
-
`Yes, and don't ask again for
|
|
2697
|
+
`Yes, and don't ask again for ${label}${cwdLabel}`
|
|
2698
2698
|
);
|
|
2699
2699
|
}
|
|
2700
2700
|
if (toolName === "BashOutput") {
|
|
@@ -2847,7 +2847,7 @@ async function applyPlanApproval(response, context, updatedInput) {
|
|
|
2847
2847
|
return { behavior: "deny", message, interrupt: false };
|
|
2848
2848
|
}
|
|
2849
2849
|
async function handleEnterPlanModeTool(context) {
|
|
2850
|
-
const { session, toolInput
|
|
2850
|
+
const { session, toolInput } = context;
|
|
2851
2851
|
session.permissionMode = "plan";
|
|
2852
2852
|
await session.query.setPermissionMode("plan");
|
|
2853
2853
|
await context.emitConfigOptionsUpdate();
|
|
@@ -2955,7 +2955,8 @@ async function handleDefaultPermissionFlow(context) {
|
|
|
2955
2955
|
const options = buildPermissionOptions(
|
|
2956
2956
|
toolName,
|
|
2957
2957
|
toolInput,
|
|
2958
|
-
session?.cwd
|
|
2958
|
+
session?.cwd,
|
|
2959
|
+
suggestions
|
|
2959
2960
|
);
|
|
2960
2961
|
const response = await client.requestPermission({
|
|
2961
2962
|
options,
|
|
@@ -3194,6 +3195,11 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
3194
3195
|
child.kill("SIGTERM");
|
|
3195
3196
|
});
|
|
3196
3197
|
}
|
|
3198
|
+
if (!child.stdin || !child.stdout) {
|
|
3199
|
+
throw new Error(
|
|
3200
|
+
`Failed to get stdio streams for spawned process (pid=${child.pid})`
|
|
3201
|
+
);
|
|
3202
|
+
}
|
|
3197
3203
|
return {
|
|
3198
3204
|
stdin: child.stdin,
|
|
3199
3205
|
stdout: child.stdout,
|
|
@@ -3206,12 +3212,15 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
3206
3212
|
kill(signal) {
|
|
3207
3213
|
return child.kill(signal);
|
|
3208
3214
|
},
|
|
3215
|
+
// biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]
|
|
3209
3216
|
on(event, listener) {
|
|
3210
3217
|
child.on(event, listener);
|
|
3211
3218
|
},
|
|
3219
|
+
// biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]
|
|
3212
3220
|
once(event, listener) {
|
|
3213
3221
|
child.once(event, listener);
|
|
3214
3222
|
},
|
|
3223
|
+
// biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]
|
|
3215
3224
|
off(event, listener) {
|
|
3216
3225
|
child.off(event, listener);
|
|
3217
3226
|
}
|
|
@@ -3892,15 +3901,16 @@ function createClaudeConnection(config) {
|
|
|
3892
3901
|
deviceType: config.deviceType
|
|
3893
3902
|
});
|
|
3894
3903
|
}
|
|
3904
|
+
const taskRunId = config.taskRunId;
|
|
3895
3905
|
agentWritable = createTappedWritableStream(streams.agent.writable, {
|
|
3896
3906
|
onMessage: (line) => {
|
|
3897
|
-
logWriter.appendRawLine(
|
|
3907
|
+
logWriter.appendRawLine(taskRunId, line);
|
|
3898
3908
|
},
|
|
3899
3909
|
logger
|
|
3900
3910
|
});
|
|
3901
3911
|
clientWritable = createTappedWritableStream(streams.client.writable, {
|
|
3902
3912
|
onMessage: (line) => {
|
|
3903
|
-
logWriter.appendRawLine(
|
|
3913
|
+
logWriter.appendRawLine(taskRunId, line);
|
|
3904
3914
|
},
|
|
3905
3915
|
logger
|
|
3906
3916
|
});
|
|
@@ -4096,7 +4106,7 @@ function createCodexConnection(config) {
|
|
|
4096
4106
|
}
|
|
4097
4107
|
});
|
|
4098
4108
|
const shouldTapLogs = config.taskRunId && logWriter;
|
|
4099
|
-
if (shouldTapLogs) {
|
|
4109
|
+
if (shouldTapLogs && config.taskRunId) {
|
|
4100
4110
|
const taskRunId2 = config.taskRunId;
|
|
4101
4111
|
if (!logWriter.isRegistered(taskRunId2)) {
|
|
4102
4112
|
logWriter.register(taskRunId2, {
|
|
@@ -9228,11 +9238,13 @@ var AsyncReaderWriterLock = class {
|
|
|
9228
9238
|
return;
|
|
9229
9239
|
if (this.writeQueue.length > 0) {
|
|
9230
9240
|
const next = this.writeQueue.shift();
|
|
9231
|
-
next
|
|
9241
|
+
if (next)
|
|
9242
|
+
next();
|
|
9232
9243
|
} else {
|
|
9233
9244
|
while (this.readQueue.length > 0 && !this.writerWaiting) {
|
|
9234
9245
|
const next = this.readQueue.shift();
|
|
9235
|
-
next
|
|
9246
|
+
if (next)
|
|
9247
|
+
next();
|
|
9236
9248
|
}
|
|
9237
9249
|
}
|
|
9238
9250
|
}
|
|
@@ -9748,27 +9760,29 @@ var ApplySnapshotSaga = class extends Saga {
|
|
|
9748
9760
|
if (!snapshot.archiveUrl) {
|
|
9749
9761
|
throw new Error("Cannot apply snapshot: no archive URL");
|
|
9750
9762
|
}
|
|
9763
|
+
const archiveUrl = snapshot.archiveUrl;
|
|
9751
9764
|
await this.step({
|
|
9752
9765
|
name: "create_tmp_dir",
|
|
9753
9766
|
execute: () => (0, import_promises2.mkdir)(tmpDir, { recursive: true }),
|
|
9754
9767
|
rollback: async () => {
|
|
9755
9768
|
}
|
|
9756
9769
|
});
|
|
9757
|
-
|
|
9770
|
+
const archivePath = (0, import_node_path4.join)(tmpDir, `${snapshot.treeHash}.tar.gz`);
|
|
9771
|
+
this.archivePath = archivePath;
|
|
9758
9772
|
await this.step({
|
|
9759
9773
|
name: "download_archive",
|
|
9760
9774
|
execute: async () => {
|
|
9761
9775
|
const arrayBuffer = await apiClient.downloadArtifact(
|
|
9762
9776
|
taskId,
|
|
9763
9777
|
runId,
|
|
9764
|
-
|
|
9778
|
+
archiveUrl
|
|
9765
9779
|
);
|
|
9766
9780
|
if (!arrayBuffer) {
|
|
9767
9781
|
throw new Error("Failed to download archive");
|
|
9768
9782
|
}
|
|
9769
9783
|
const base64Content = Buffer.from(arrayBuffer).toString("utf-8");
|
|
9770
9784
|
const binaryContent = Buffer.from(base64Content, "base64");
|
|
9771
|
-
await (0, import_promises2.writeFile)(
|
|
9785
|
+
await (0, import_promises2.writeFile)(archivePath, binaryContent);
|
|
9772
9786
|
},
|
|
9773
9787
|
rollback: async () => {
|
|
9774
9788
|
if (this.archivePath) {
|