@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
@@ -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.71",
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 \`${cmdName}\` commands${cwdLabel}`
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, logger } = context;
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(config.taskRunId, line);
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(config.taskRunId, line);
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
- this.archivePath = (0, import_node_path4.join)(tmpDir, `${snapshot.treeHash}.tar.gz`);
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
- snapshot.archiveUrl
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)(this.archivePath, binaryContent);
9785
+ await (0, import_promises2.writeFile)(archivePath, binaryContent);
9772
9786
  },
9773
9787
  rollback: async () => {
9774
9788
  if (this.archivePath) {