@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.
@@ -8755,7 +8755,7 @@ var import_zod3 = require("zod");
8755
8755
  // package.json
8756
8756
  var package_default = {
8757
8757
  name: "@posthog/agent",
8758
- version: "2.3.508",
8758
+ version: "2.3.510",
8759
8759
  repository: "https://github.com/PostHog/code",
8760
8760
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
8761
8761
  exports: {
@@ -13612,6 +13612,54 @@ function toolContent() {
13612
13612
  return new ToolContentBuilder();
13613
13613
  }
13614
13614
 
13615
+ // src/utils/partial-json.ts
13616
+ function tryParsePartialJson(s) {
13617
+ const trimmed2 = s.trim();
13618
+ if (!trimmed2) return null;
13619
+ try {
13620
+ return JSON.parse(trimmed2);
13621
+ } catch {
13622
+ }
13623
+ const closers = [];
13624
+ let inString = false;
13625
+ let escaped = false;
13626
+ for (let i2 = 0; i2 < trimmed2.length; i2++) {
13627
+ const ch = trimmed2[i2];
13628
+ if (inString) {
13629
+ if (escaped) {
13630
+ escaped = false;
13631
+ } else if (ch === "\\") {
13632
+ escaped = true;
13633
+ } else if (ch === '"') {
13634
+ inString = false;
13635
+ }
13636
+ continue;
13637
+ }
13638
+ if (ch === '"') inString = true;
13639
+ else if (ch === "{") closers.push("}");
13640
+ else if (ch === "[") closers.push("]");
13641
+ else if (ch === "}" || ch === "]") closers.pop();
13642
+ }
13643
+ const closeBrackets = (str) => {
13644
+ let out2 = str;
13645
+ for (let i2 = closers.length - 1; i2 >= 0; i2--) out2 += closers[i2];
13646
+ return out2;
13647
+ };
13648
+ const candidates = [];
13649
+ const closedString = inString ? `${trimmed2}"` : trimmed2;
13650
+ candidates.push(closeBrackets(closedString));
13651
+ let stripped = closedString.replace(/[,:]\s*$/, "");
13652
+ stripped = stripped.replace(/,?\s*"[^"]*"\s*:?\s*$/, "");
13653
+ candidates.push(closeBrackets(stripped));
13654
+ for (const candidate of candidates) {
13655
+ try {
13656
+ return JSON.parse(candidate);
13657
+ } catch {
13658
+ }
13659
+ }
13660
+ return null;
13661
+ }
13662
+
13615
13663
  // src/adapters/claude/permissions/posthog-exec-gate.ts
13616
13664
  var POSTHOG_EXEC_TOOL_RE = /^mcp__posthog(?:_[^_]+)*__exec$/;
13617
13665
  var POSTHOG_CALL_COMMAND_RE = /^\s*call\s+(?:--json\s+)?([a-zA-Z0-9_-]+)/;
@@ -14778,12 +14826,19 @@ function toAcpNotifications(content, role, sessionId, toolUseCache, fileContentC
14778
14826
  }
14779
14827
  return output;
14780
14828
  }
14781
- function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileContentCache, client, logger, parentToolCallId, registerHooks, supportsTerminalOutput, cwd, enrichedReadCache) {
14829
+ function streamEventToAcpNotifications(message, sessionId, toolUseCache, toolUseStreamCache, fileContentCache, client, logger, parentToolCallId, registerHooks, supportsTerminalOutput, cwd, enrichedReadCache) {
14782
14830
  const event = message.event;
14783
14831
  switch (event.type) {
14784
- case "content_block_start":
14832
+ case "content_block_start": {
14833
+ const block = event.content_block;
14834
+ if (block.type === "tool_use" || block.type === "mcp_tool_use") {
14835
+ toolUseStreamCache.set(event.index, {
14836
+ toolUseId: block.id,
14837
+ partialJson: ""
14838
+ });
14839
+ }
14785
14840
  return toAcpNotifications(
14786
- [event.content_block],
14841
+ [block],
14787
14842
  "assistant",
14788
14843
  sessionId,
14789
14844
  toolUseCache,
@@ -14797,7 +14852,16 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
14797
14852
  void 0,
14798
14853
  enrichedReadCache
14799
14854
  );
14800
- case "content_block_delta":
14855
+ }
14856
+ case "content_block_delta": {
14857
+ if (event.delta.type === "input_json_delta") {
14858
+ return inputJsonDeltaToAcpNotifications(
14859
+ event.index,
14860
+ event.delta.partial_json,
14861
+ sessionId,
14862
+ toolUseStreamCache
14863
+ );
14864
+ }
14801
14865
  return toAcpNotifications(
14802
14866
  [event.delta],
14803
14867
  "assistant",
@@ -14813,16 +14877,36 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
14813
14877
  void 0,
14814
14878
  enrichedReadCache
14815
14879
  );
14880
+ }
14881
+ case "content_block_stop":
14882
+ toolUseStreamCache.delete(event.index);
14883
+ return [];
14816
14884
  case "message_start":
14817
14885
  case "message_delta":
14818
14886
  case "message_stop":
14819
- case "content_block_stop":
14820
14887
  return [];
14821
14888
  default:
14822
14889
  unreachable(event, logger);
14823
14890
  return [];
14824
14891
  }
14825
14892
  }
14893
+ function inputJsonDeltaToAcpNotifications(index, partialJson, sessionId, toolUseStreamCache) {
14894
+ const entry = toolUseStreamCache.get(index);
14895
+ if (!entry) return [];
14896
+ entry.partialJson += partialJson;
14897
+ const parsed = tryParsePartialJson(entry.partialJson);
14898
+ if (!parsed || typeof parsed !== "object") return [];
14899
+ return [
14900
+ {
14901
+ sessionId,
14902
+ update: {
14903
+ sessionUpdate: "tool_call_update",
14904
+ toolCallId: entry.toolUseId,
14905
+ rawInput: parsed
14906
+ }
14907
+ }
14908
+ ];
14909
+ }
14826
14910
  async function handleSystemMessage(message, context) {
14827
14911
  const { session, sessionId, client, logger } = context;
14828
14912
  switch (message.subtype) {
@@ -14966,12 +15050,20 @@ function extractUsageFromResult(message) {
14966
15050
  };
14967
15051
  }
14968
15052
  async function handleStreamEvent(message, context) {
14969
- const { sessionId, client, toolUseCache, fileContentCache, logger } = context;
15053
+ const {
15054
+ sessionId,
15055
+ client,
15056
+ toolUseCache,
15057
+ toolUseStreamCache,
15058
+ fileContentCache,
15059
+ logger
15060
+ } = context;
14970
15061
  const parentToolCallId = message.parent_tool_use_id ?? void 0;
14971
15062
  for (const notification of streamEventToAcpNotifications(
14972
15063
  message,
14973
15064
  sessionId,
14974
15065
  toolUseCache,
15066
+ toolUseStreamCache,
14975
15067
  fileContentCache,
14976
15068
  client,
14977
15069
  logger,
@@ -16627,6 +16719,7 @@ function shouldEmitRawMessage(config, message) {
16627
16719
  var ClaudeAcpAgent = class extends BaseAcpAgent {
16628
16720
  adapterName = "claude";
16629
16721
  toolUseCache;
16722
+ toolUseStreamCache;
16630
16723
  backgroundTerminals = {};
16631
16724
  clientCapabilities;
16632
16725
  options;
@@ -16636,6 +16729,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
16636
16729
  super(client);
16637
16730
  this.options = options;
16638
16731
  this.toolUseCache = {};
16732
+ this.toolUseStreamCache = /* @__PURE__ */ new Map();
16639
16733
  this.logger = new Logger({ debug: true, prefix: "[ClaudeAcpAgent]" });
16640
16734
  this.enrichment = createEnrichment(options?.posthogApiConfig, this.logger);
16641
16735
  }
@@ -16830,6 +16924,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
16830
16924
  sessionId: params.sessionId,
16831
16925
  client: this.client,
16832
16926
  toolUseCache: this.toolUseCache,
16927
+ toolUseStreamCache: this.toolUseStreamCache,
16833
16928
  fileContentCache: this.fileContentCache,
16834
16929
  enrichedReadCache: this.enrichedReadCache,
16835
16930
  logger: this.logger,
@@ -17082,6 +17177,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
17082
17177
  }
17083
17178
  throw error;
17084
17179
  } finally {
17180
+ this.toolUseStreamCache.clear();
17085
17181
  if (!handedOff) {
17086
17182
  this.session.promptRunning = false;
17087
17183
  for (const [key, pending] of this.session.pendingMessages) {
@@ -17656,6 +17752,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
17656
17752
  sessionId,
17657
17753
  client: this.client,
17658
17754
  toolUseCache: this.toolUseCache,
17755
+ toolUseStreamCache: this.toolUseStreamCache,
17659
17756
  fileContentCache: this.fileContentCache,
17660
17757
  enrichedReadCache: this.enrichedReadCache,
17661
17758
  logger: this.logger,