@posthog/agent 2.3.508 → 2.3.510

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/agent.js CHANGED
@@ -4030,7 +4030,7 @@ import { v7 as uuidv7 } from "uuid";
4030
4030
  // package.json
4031
4031
  var package_default = {
4032
4032
  name: "@posthog/agent",
4033
- version: "2.3.508",
4033
+ version: "2.3.510",
4034
4034
  repository: "https://github.com/PostHog/code",
4035
4035
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
4036
4036
  exports: {
@@ -8681,6 +8681,54 @@ function toolContent() {
8681
8681
  return new ToolContentBuilder();
8682
8682
  }
8683
8683
 
8684
+ // src/utils/partial-json.ts
8685
+ function tryParsePartialJson(s) {
8686
+ const trimmed2 = s.trim();
8687
+ if (!trimmed2) return null;
8688
+ try {
8689
+ return JSON.parse(trimmed2);
8690
+ } catch {
8691
+ }
8692
+ const closers = [];
8693
+ let inString = false;
8694
+ let escaped = false;
8695
+ for (let i2 = 0; i2 < trimmed2.length; i2++) {
8696
+ const ch = trimmed2[i2];
8697
+ if (inString) {
8698
+ if (escaped) {
8699
+ escaped = false;
8700
+ } else if (ch === "\\") {
8701
+ escaped = true;
8702
+ } else if (ch === '"') {
8703
+ inString = false;
8704
+ }
8705
+ continue;
8706
+ }
8707
+ if (ch === '"') inString = true;
8708
+ else if (ch === "{") closers.push("}");
8709
+ else if (ch === "[") closers.push("]");
8710
+ else if (ch === "}" || ch === "]") closers.pop();
8711
+ }
8712
+ const closeBrackets = (str) => {
8713
+ let out2 = str;
8714
+ for (let i2 = closers.length - 1; i2 >= 0; i2--) out2 += closers[i2];
8715
+ return out2;
8716
+ };
8717
+ const candidates = [];
8718
+ const closedString = inString ? `${trimmed2}"` : trimmed2;
8719
+ candidates.push(closeBrackets(closedString));
8720
+ let stripped = closedString.replace(/[,:]\s*$/, "");
8721
+ stripped = stripped.replace(/,?\s*"[^"]*"\s*:?\s*$/, "");
8722
+ candidates.push(closeBrackets(stripped));
8723
+ for (const candidate of candidates) {
8724
+ try {
8725
+ return JSON.parse(candidate);
8726
+ } catch {
8727
+ }
8728
+ }
8729
+ return null;
8730
+ }
8731
+
8684
8732
  // src/adapters/claude/permissions/posthog-exec-gate.ts
8685
8733
  var POSTHOG_EXEC_TOOL_RE = /^mcp__posthog(?:_[^_]+)*__exec$/;
8686
8734
  var POSTHOG_CALL_COMMAND_RE = /^\s*call\s+(?:--json\s+)?([a-zA-Z0-9_-]+)/;
@@ -9847,12 +9895,19 @@ function toAcpNotifications(content, role, sessionId, toolUseCache, fileContentC
9847
9895
  }
9848
9896
  return output;
9849
9897
  }
9850
- function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileContentCache, client, logger, parentToolCallId, registerHooks, supportsTerminalOutput, cwd, enrichedReadCache) {
9898
+ function streamEventToAcpNotifications(message, sessionId, toolUseCache, toolUseStreamCache, fileContentCache, client, logger, parentToolCallId, registerHooks, supportsTerminalOutput, cwd, enrichedReadCache) {
9851
9899
  const event = message.event;
9852
9900
  switch (event.type) {
9853
- case "content_block_start":
9901
+ case "content_block_start": {
9902
+ const block = event.content_block;
9903
+ if (block.type === "tool_use" || block.type === "mcp_tool_use") {
9904
+ toolUseStreamCache.set(event.index, {
9905
+ toolUseId: block.id,
9906
+ partialJson: ""
9907
+ });
9908
+ }
9854
9909
  return toAcpNotifications(
9855
- [event.content_block],
9910
+ [block],
9856
9911
  "assistant",
9857
9912
  sessionId,
9858
9913
  toolUseCache,
@@ -9866,7 +9921,16 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
9866
9921
  void 0,
9867
9922
  enrichedReadCache
9868
9923
  );
9869
- case "content_block_delta":
9924
+ }
9925
+ case "content_block_delta": {
9926
+ if (event.delta.type === "input_json_delta") {
9927
+ return inputJsonDeltaToAcpNotifications(
9928
+ event.index,
9929
+ event.delta.partial_json,
9930
+ sessionId,
9931
+ toolUseStreamCache
9932
+ );
9933
+ }
9870
9934
  return toAcpNotifications(
9871
9935
  [event.delta],
9872
9936
  "assistant",
@@ -9882,16 +9946,36 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
9882
9946
  void 0,
9883
9947
  enrichedReadCache
9884
9948
  );
9949
+ }
9950
+ case "content_block_stop":
9951
+ toolUseStreamCache.delete(event.index);
9952
+ return [];
9885
9953
  case "message_start":
9886
9954
  case "message_delta":
9887
9955
  case "message_stop":
9888
- case "content_block_stop":
9889
9956
  return [];
9890
9957
  default:
9891
9958
  unreachable(event, logger);
9892
9959
  return [];
9893
9960
  }
9894
9961
  }
9962
+ function inputJsonDeltaToAcpNotifications(index, partialJson, sessionId, toolUseStreamCache) {
9963
+ const entry = toolUseStreamCache.get(index);
9964
+ if (!entry) return [];
9965
+ entry.partialJson += partialJson;
9966
+ const parsed = tryParsePartialJson(entry.partialJson);
9967
+ if (!parsed || typeof parsed !== "object") return [];
9968
+ return [
9969
+ {
9970
+ sessionId,
9971
+ update: {
9972
+ sessionUpdate: "tool_call_update",
9973
+ toolCallId: entry.toolUseId,
9974
+ rawInput: parsed
9975
+ }
9976
+ }
9977
+ ];
9978
+ }
9895
9979
  async function handleSystemMessage(message, context) {
9896
9980
  const { session, sessionId, client, logger } = context;
9897
9981
  switch (message.subtype) {
@@ -10035,12 +10119,20 @@ function extractUsageFromResult(message) {
10035
10119
  };
10036
10120
  }
10037
10121
  async function handleStreamEvent(message, context) {
10038
- const { sessionId, client, toolUseCache, fileContentCache, logger } = context;
10122
+ const {
10123
+ sessionId,
10124
+ client,
10125
+ toolUseCache,
10126
+ toolUseStreamCache,
10127
+ fileContentCache,
10128
+ logger
10129
+ } = context;
10039
10130
  const parentToolCallId = message.parent_tool_use_id ?? void 0;
10040
10131
  for (const notification of streamEventToAcpNotifications(
10041
10132
  message,
10042
10133
  sessionId,
10043
10134
  toolUseCache,
10135
+ toolUseStreamCache,
10044
10136
  fileContentCache,
10045
10137
  client,
10046
10138
  logger,
@@ -16594,6 +16686,7 @@ function shouldEmitRawMessage(config, message) {
16594
16686
  var ClaudeAcpAgent = class extends BaseAcpAgent {
16595
16687
  adapterName = "claude";
16596
16688
  toolUseCache;
16689
+ toolUseStreamCache;
16597
16690
  backgroundTerminals = {};
16598
16691
  clientCapabilities;
16599
16692
  options;
@@ -16603,6 +16696,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
16603
16696
  super(client);
16604
16697
  this.options = options;
16605
16698
  this.toolUseCache = {};
16699
+ this.toolUseStreamCache = /* @__PURE__ */ new Map();
16606
16700
  this.logger = new Logger({ debug: true, prefix: "[ClaudeAcpAgent]" });
16607
16701
  this.enrichment = createEnrichment(options?.posthogApiConfig, this.logger);
16608
16702
  }
@@ -16797,6 +16891,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
16797
16891
  sessionId: params.sessionId,
16798
16892
  client: this.client,
16799
16893
  toolUseCache: this.toolUseCache,
16894
+ toolUseStreamCache: this.toolUseStreamCache,
16800
16895
  fileContentCache: this.fileContentCache,
16801
16896
  enrichedReadCache: this.enrichedReadCache,
16802
16897
  logger: this.logger,
@@ -17049,6 +17144,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
17049
17144
  }
17050
17145
  throw error;
17051
17146
  } finally {
17147
+ this.toolUseStreamCache.clear();
17052
17148
  if (!handedOff) {
17053
17149
  this.session.promptRunning = false;
17054
17150
  for (const [key, pending] of this.session.pendingMessages) {
@@ -17623,6 +17719,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
17623
17719
  sessionId,
17624
17720
  client: this.client,
17625
17721
  toolUseCache: this.toolUseCache,
17722
+ toolUseStreamCache: this.toolUseStreamCache,
17626
17723
  fileContentCache: this.fileContentCache,
17627
17724
  enrichedReadCache: this.enrichedReadCache,
17628
17725
  logger: this.logger,