@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/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.
|
|
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
|
-
[
|
|
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
|
-
|
|
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 {
|
|
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,
|