@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 +104 -7
- package/dist/agent.js.map +1 -1
- package/dist/posthog-api.js +1 -1
- package/dist/posthog-api.js.map +1 -1
- package/dist/server/agent-server.js +104 -7
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +104 -7
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +1 -1
- package/src/adapters/claude/claude-agent.ts +10 -0
- package/src/adapters/claude/conversion/sdk-to-acp.ts +67 -6
- package/src/adapters/claude/types.ts +10 -0
- package/src/utils/partial-json.test.ts +72 -0
- package/src/utils/partial-json.ts +68 -0
package/dist/server/bin.cjs
CHANGED
|
@@ -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.
|
|
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
|
-
[
|
|
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
|
-
|
|
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 {
|
|
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,
|