@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.
Files changed (42) hide show
  1. package/dist/adapters/claude/conversion/tool-use-to-acp.d.ts +22 -2
  2. package/dist/adapters/claude/permissions/permission-options.d.ts +3 -1
  3. package/dist/adapters/claude/permissions/permission-options.js +5 -2
  4. package/dist/adapters/claude/permissions/permission-options.js.map +1 -1
  5. package/dist/adapters/claude/questions/utils.d.ts +1 -0
  6. package/dist/adapters/claude/tools.js.map +1 -1
  7. package/dist/agent.d.ts +30 -5
  8. package/dist/agent.js +22 -12
  9. package/dist/agent.js.map +1 -1
  10. package/dist/gateway-models.d.ts +1 -2
  11. package/dist/gateway-models.js +0 -5
  12. package/dist/gateway-models.js.map +1 -1
  13. package/dist/index.d.ts +1 -257
  14. package/dist/index.js +1 -10532
  15. package/dist/index.js.map +1 -1
  16. package/dist/server/agent-server.js +31 -17
  17. package/dist/server/agent-server.js.map +1 -1
  18. package/dist/server/bin.cjs +31 -17
  19. package/dist/server/bin.cjs.map +1 -1
  20. package/package.json +1 -4
  21. package/src/acp-extensions.ts +0 -98
  22. package/src/adapters/acp-connection.ts +6 -5
  23. package/src/adapters/claude/claude-agent.ts +1 -1
  24. package/src/adapters/claude/conversion/sdk-to-acp.ts +6 -3
  25. package/src/adapters/claude/mcp/tool-metadata.ts +8 -5
  26. package/src/adapters/claude/permissions/permission-handlers.ts +2 -1
  27. package/src/adapters/claude/permissions/permission-options.ts +10 -1
  28. package/src/adapters/claude/session/options.ts +11 -2
  29. package/src/agent.ts +2 -2
  30. package/src/gateway-models.ts +0 -7
  31. package/src/index.ts +1 -79
  32. package/src/sagas/apply-snapshot-saga.ts +6 -3
  33. package/src/sagas/capture-tree-saga.test.ts +1 -1
  34. package/src/test/mocks/msw-handlers.ts +0 -3
  35. package/dist/agent-DK1apkaG.d.ts +0 -133
  36. package/dist/logger-DDBiMOOD.d.ts +0 -24
  37. package/src/adapters/claude/tool-meta.ts +0 -143
  38. package/src/test/assertions.ts +0 -114
  39. package/src/test/controllers/sse-controller.ts +0 -107
  40. package/src/test/fixtures/notifications.ts +0 -92
  41. package/src/test/setup.ts +0 -114
  42. 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.71",
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 \`${cmdName}\` commands${cwdLabel}`
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, logger } = context;
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(config.taskRunId, line);
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(config.taskRunId, line);
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
- this.archivePath = join5(tmpDir, `${snapshot.treeHash}.tar.gz`);
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
- snapshot.archiveUrl
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(this.archivePath, binaryContent);
9793
+ await writeFile3(archivePath, binaryContent);
9780
9794
  },
9781
9795
  rollback: async () => {
9782
9796
  if (this.archivePath) {