@posthog/agent 2.3.735 → 2.3.736

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 (62) hide show
  1. package/dist/adapters/claude/conversion/tool-use-to-acp.d.ts +2 -10
  2. package/dist/adapters/claude/conversion/tool-use-to-acp.js +24 -10
  3. package/dist/adapters/claude/conversion/tool-use-to-acp.js.map +1 -1
  4. package/dist/adapters/claude/permissions/permission-options.js +6 -4
  5. package/dist/adapters/claude/permissions/permission-options.js.map +1 -1
  6. package/dist/adapters/claude/session/jsonl-hydration.js +1 -0
  7. package/dist/adapters/claude/session/jsonl-hydration.js.map +1 -1
  8. package/dist/adapters/claude/session/models.js +20 -1
  9. package/dist/adapters/claude/session/models.js.map +1 -1
  10. package/dist/adapters/claude/tools.js +4 -2
  11. package/dist/adapters/claude/tools.js.map +1 -1
  12. package/dist/adapters/reasoning-effort.js +3 -1
  13. package/dist/adapters/reasoning-effort.js.map +1 -1
  14. package/dist/agent.js +524 -72
  15. package/dist/agent.js.map +1 -1
  16. package/dist/posthog-api.js +4 -4
  17. package/dist/posthog-api.js.map +1 -1
  18. package/dist/server/agent-server.js +524 -72
  19. package/dist/server/agent-server.js.map +1 -1
  20. package/dist/server/bin.cjs +524 -72
  21. package/dist/server/bin.cjs.map +1 -1
  22. package/package.json +6 -6
  23. package/src/adapters/claude/UPSTREAM.md +80 -3
  24. package/src/adapters/claude/claude-agent.ts +201 -18
  25. package/src/adapters/claude/conversion/sdk-to-acp.ts +182 -16
  26. package/src/adapters/claude/conversion/task-state.test.ts +338 -0
  27. package/src/adapters/claude/conversion/task-state.ts +178 -0
  28. package/src/adapters/claude/conversion/tool-use-to-acp.ts +29 -19
  29. package/src/adapters/claude/hooks.test.ts +162 -0
  30. package/src/adapters/claude/hooks.ts +44 -3
  31. package/src/adapters/claude/permissions/permission-options.ts +7 -2
  32. package/src/adapters/claude/session/commands.ts +1 -0
  33. package/src/adapters/claude/session/mcp-config.ts +23 -7
  34. package/src/adapters/claude/session/model-config.test.ts +60 -0
  35. package/src/adapters/claude/session/model-config.ts +56 -0
  36. package/src/adapters/claude/session/models.test.ts +119 -0
  37. package/src/adapters/claude/session/models.ts +31 -0
  38. package/src/adapters/claude/session/options.test.ts +1 -0
  39. package/src/adapters/claude/session/options.ts +29 -1
  40. package/src/adapters/claude/session/settings.test.ts +102 -1
  41. package/src/adapters/claude/session/settings.ts +33 -6
  42. package/src/adapters/claude/tools.ts +4 -2
  43. package/src/adapters/claude/types.ts +8 -0
  44. package/src/adapters/codex/codex-agent.ts +2 -2
  45. package/src/server/agent-server.test.ts +173 -0
  46. package/src/test/mocks/claude-sdk.ts +4 -0
  47. package/src/test/native-binary.test.ts +27 -0
  48. package/dist/claude-cli/cli.js +0 -18412
  49. package/dist/claude-cli/vendor/audio-capture/arm64-darwin/audio-capture.node +0 -0
  50. package/dist/claude-cli/vendor/audio-capture/arm64-linux/audio-capture.node +0 -0
  51. package/dist/claude-cli/vendor/audio-capture/arm64-win32/audio-capture.node +0 -0
  52. package/dist/claude-cli/vendor/audio-capture/x64-darwin/audio-capture.node +0 -0
  53. package/dist/claude-cli/vendor/audio-capture/x64-linux/audio-capture.node +0 -0
  54. package/dist/claude-cli/vendor/audio-capture/x64-win32/audio-capture.node +0 -0
  55. package/dist/claude-cli/vendor/ripgrep/COPYING +0 -3
  56. package/dist/claude-cli/vendor/ripgrep/arm64-darwin/rg +0 -0
  57. package/dist/claude-cli/vendor/ripgrep/arm64-linux/rg +0 -0
  58. package/dist/claude-cli/vendor/ripgrep/arm64-win32/rg.exe +0 -0
  59. package/dist/claude-cli/vendor/ripgrep/x64-darwin/rg +0 -0
  60. package/dist/claude-cli/vendor/ripgrep/x64-linux/rg +0 -0
  61. package/dist/claude-cli/vendor/ripgrep/x64-win32/rg.exe +0 -0
  62. package/dist/claude-cli/yoga.wasm +0 -0
@@ -16,6 +16,179 @@ import type { TaskRun } from "../types";
16
16
  import { AgentServer, SSE_KEEPALIVE_INTERVAL_MS } from "./agent-server";
17
17
  import { type JwtPayload, SANDBOX_CONNECTION_AUDIENCE } from "./jwt";
18
18
 
19
+ const mockedClaudeSdk = vi.hoisted(() => {
20
+ const createSuccessResult = () => ({
21
+ type: "result",
22
+ subtype: "success",
23
+ duration_ms: 100,
24
+ duration_api_ms: 50,
25
+ is_error: false,
26
+ num_turns: 1,
27
+ result: "Done",
28
+ stop_reason: null,
29
+ total_cost_usd: 0.01,
30
+ usage: {
31
+ input_tokens: 100,
32
+ output_tokens: 50,
33
+ output_tokens_details: { thinking_tokens: 0 },
34
+ cache_read_input_tokens: 0,
35
+ cache_creation_input_tokens: 0,
36
+ cache_creation: {
37
+ ephemeral_1h_input_tokens: 0,
38
+ ephemeral_5m_input_tokens: 0,
39
+ },
40
+ server_tool_use: { web_search_requests: 0, web_fetch_requests: 0 },
41
+ service_tier: "standard",
42
+ inference_geo: "us",
43
+ iterations: [],
44
+ speed: "standard",
45
+ },
46
+ modelUsage: {},
47
+ permission_denials: [],
48
+ uuid: crypto.randomUUID() as `${string}-${string}-${string}-${string}-${string}`,
49
+ session_id: "test-session",
50
+ });
51
+
52
+ const query = vi.fn(
53
+ (params: { prompt?: { push?: (message: unknown) => void } }) => {
54
+ const queuedMessages: unknown[] = [];
55
+ let resolveNext: ((value: IteratorResult<unknown, void>) => void) | null =
56
+ null;
57
+ let isDone = false;
58
+
59
+ const flushQueue = () => {
60
+ if (!resolveNext) {
61
+ return;
62
+ }
63
+
64
+ if (queuedMessages.length > 0) {
65
+ const resolve = resolveNext;
66
+ resolveNext = null;
67
+ resolve({
68
+ value: queuedMessages.shift(),
69
+ done: false,
70
+ });
71
+ return;
72
+ }
73
+
74
+ if (isDone) {
75
+ const resolve = resolveNext;
76
+ resolveNext = null;
77
+ resolve({ value: undefined, done: true });
78
+ }
79
+ };
80
+
81
+ const enqueue = (message: unknown) => {
82
+ if (isDone) {
83
+ return;
84
+ }
85
+ queuedMessages.push(message);
86
+ flushQueue();
87
+ };
88
+
89
+ const prompt = params.prompt;
90
+ if (prompt && typeof prompt.push === "function") {
91
+ const originalPush = prompt.push.bind(prompt);
92
+ prompt.push = (message: unknown) => {
93
+ originalPush(message);
94
+
95
+ if (
96
+ message &&
97
+ typeof message === "object" &&
98
+ "uuid" in message &&
99
+ typeof message.uuid === "string"
100
+ ) {
101
+ enqueue({
102
+ type: "user",
103
+ uuid: message.uuid,
104
+ parent_tool_use_id: null,
105
+ message: {
106
+ content: [],
107
+ },
108
+ });
109
+ enqueue(createSuccessResult());
110
+ }
111
+ };
112
+ }
113
+
114
+ return {
115
+ next: vi.fn(() => {
116
+ if (queuedMessages.length > 0) {
117
+ return Promise.resolve({
118
+ value: queuedMessages.shift(),
119
+ done: false as const,
120
+ });
121
+ }
122
+
123
+ if (isDone) {
124
+ return Promise.resolve({
125
+ value: undefined,
126
+ done: true as const,
127
+ });
128
+ }
129
+
130
+ return new Promise<IteratorResult<unknown, void>>((resolve) => {
131
+ resolveNext = resolve;
132
+ });
133
+ }),
134
+ return: vi.fn(() => {
135
+ isDone = true;
136
+ flushQueue();
137
+ return Promise.resolve({ value: undefined, done: true as const });
138
+ }),
139
+ throw: vi.fn((error: Error) => {
140
+ isDone = true;
141
+ flushQueue();
142
+ return Promise.reject(error);
143
+ }),
144
+ [Symbol.asyncIterator]() {
145
+ return this;
146
+ },
147
+ interrupt: vi.fn(async () => {
148
+ isDone = true;
149
+ flushQueue();
150
+ }),
151
+ setPermissionMode: vi.fn().mockResolvedValue(undefined),
152
+ setModel: vi.fn().mockResolvedValue(undefined),
153
+ setMaxThinkingTokens: vi.fn().mockResolvedValue(undefined),
154
+ supportedCommands: vi.fn().mockResolvedValue([]),
155
+ supportedModels: vi.fn().mockResolvedValue([]),
156
+ mcpServerStatus: vi.fn().mockResolvedValue([]),
157
+ accountInfo: vi.fn().mockResolvedValue({}),
158
+ rewindFiles: vi.fn().mockResolvedValue({ canRewind: false }),
159
+ setMcpServers: vi
160
+ .fn()
161
+ .mockResolvedValue({ added: [], removed: [], errors: {} }),
162
+ streamInput: vi.fn().mockResolvedValue(undefined),
163
+ close: vi.fn(),
164
+ initializationResult: vi.fn().mockResolvedValue({
165
+ result: "success",
166
+ commands: [],
167
+ models: [],
168
+ }),
169
+ reconnectMcpServer: vi.fn().mockResolvedValue(undefined),
170
+ toggleMcpServer: vi.fn().mockResolvedValue(undefined),
171
+ supportedAgents: vi.fn().mockResolvedValue([]),
172
+ stopTask: vi.fn().mockResolvedValue(undefined),
173
+ applyFlagSettings: vi.fn().mockResolvedValue(undefined),
174
+ getContextUsage: vi.fn().mockResolvedValue({}),
175
+ reloadPlugins: vi.fn().mockResolvedValue(undefined),
176
+ seedReadState: vi.fn().mockResolvedValue(undefined),
177
+ readFile: vi.fn().mockResolvedValue(""),
178
+ backgroundTasks: vi.fn().mockResolvedValue([]),
179
+ [Symbol.asyncDispose]: vi.fn().mockResolvedValue(undefined),
180
+ };
181
+ },
182
+ );
183
+
184
+ return { query };
185
+ });
186
+
187
+ vi.mock("@anthropic-ai/claude-agent-sdk", async (importOriginal) => ({
188
+ ...(await importOriginal()),
189
+ query: mockedClaudeSdk.query,
190
+ }));
191
+
19
192
  interface TestableServer {
20
193
  getInitialPromptOverride(run: TaskRun): string | null;
21
194
  getClearedPendingUserState(run: TaskRun | null): string[] | null;
@@ -105,6 +105,8 @@ export function createMockQuery(
105
105
  getContextUsage: vi.fn().mockResolvedValue({}),
106
106
  reloadPlugins: vi.fn().mockResolvedValue(undefined),
107
107
  seedReadState: vi.fn().mockResolvedValue(undefined),
108
+ readFile: vi.fn().mockResolvedValue(""),
109
+ backgroundTasks: vi.fn().mockResolvedValue([]),
108
110
  [Symbol.asyncDispose]: vi.fn().mockResolvedValue(undefined),
109
111
  _abortController: abortController,
110
112
  _mockHelpers: {
@@ -173,6 +175,7 @@ export function createSuccessResult(
173
175
  usage: {
174
176
  input_tokens: 100,
175
177
  output_tokens: 50,
178
+ output_tokens_details: { thinking_tokens: 0 },
176
179
  cache_read_input_tokens: 0,
177
180
  cache_creation_input_tokens: 0,
178
181
  cache_creation: {
@@ -209,6 +212,7 @@ export function createErrorResult(
209
212
  usage: {
210
213
  input_tokens: 100,
211
214
  output_tokens: 50,
215
+ output_tokens_details: { thinking_tokens: 0 },
212
216
  cache_read_input_tokens: 0,
213
217
  cache_creation_input_tokens: 0,
214
218
  cache_creation: {
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ CLAUDE_CLI_SUPPORT_DIRS,
4
+ CLAUDE_CLI_SUPPORT_FILES,
5
+ claudeExecutableCandidates,
6
+ } from "../../build/native-binary.mjs";
7
+
8
+ describe("claudeExecutableCandidates", () => {
9
+ it("includes the legacy cli.js fallback after native binary candidates", () => {
10
+ const candidates = claudeExecutableCandidates("/tmp/node_modules");
11
+ expect(candidates.at(-1)).toBe(
12
+ "/tmp/node_modules/@anthropic-ai/claude-agent-sdk/cli.js",
13
+ );
14
+ });
15
+ });
16
+
17
+ describe("Claude CLI support assets", () => {
18
+ it("tracks the files needed by the legacy SDK layout", () => {
19
+ expect(CLAUDE_CLI_SUPPORT_FILES).toEqual([
20
+ "package.json",
21
+ "manifest.json",
22
+ "manifest.zst.json",
23
+ "yoga.wasm",
24
+ ]);
25
+ expect(CLAUDE_CLI_SUPPORT_DIRS).toEqual(["vendor"]);
26
+ });
27
+ });