@posthog/agent 2.1.16 → 2.1.22
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 +57 -47
- package/dist/agent.js.map +1 -1
- package/dist/claude-cli/cli.js +5349 -3347
- package/dist/claude-cli/vendor/ripgrep/arm64-win32/rg.exe +0 -0
- package/dist/claude-cli/vendor/ripgrep/arm64-win32/ripgrep.node +0 -0
- package/dist/index.js +57 -47
- package/dist/index.js.map +1 -1
- package/dist/server/agent-server.js +57 -47
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +57 -47
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +6 -6
- package/src/adapters/claude/claude-agent.ts +35 -28
- package/src/adapters/claude/conversion/sdk-to-acp.ts +1 -11
- package/src/adapters/claude/session/options.ts +22 -3
- package/src/adapters/claude/types.ts +0 -1
- package/src/test/mocks/claude-sdk.ts +7 -0
package/dist/agent.js
CHANGED
|
@@ -276,7 +276,7 @@ import { v7 as uuidv7 } from "uuid";
|
|
|
276
276
|
// package.json
|
|
277
277
|
var package_default = {
|
|
278
278
|
name: "@posthog/agent",
|
|
279
|
-
version: "2.1.
|
|
279
|
+
version: "2.1.22",
|
|
280
280
|
repository: "https://github.com/PostHog/twig",
|
|
281
281
|
description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
|
|
282
282
|
exports: {
|
|
@@ -348,11 +348,11 @@ var package_default = {
|
|
|
348
348
|
},
|
|
349
349
|
devDependencies: {
|
|
350
350
|
"@changesets/cli": "^2.27.8",
|
|
351
|
+
"@posthog/shared": "workspace:*",
|
|
352
|
+
"@twig/git": "workspace:*",
|
|
351
353
|
"@types/bun": "latest",
|
|
352
354
|
"@types/tar": "^6.1.13",
|
|
353
355
|
minimatch: "^10.0.3",
|
|
354
|
-
"@posthog/shared": "workspace:*",
|
|
355
|
-
"@twig/git": "workspace:*",
|
|
356
356
|
msw: "^2.12.7",
|
|
357
357
|
tsup: "^8.5.1",
|
|
358
358
|
tsx: "^4.20.6",
|
|
@@ -360,16 +360,16 @@ var package_default = {
|
|
|
360
360
|
vitest: "^2.1.8"
|
|
361
361
|
},
|
|
362
362
|
dependencies: {
|
|
363
|
+
"@agentclientprotocol/sdk": "^0.14.0",
|
|
364
|
+
"@anthropic-ai/claude-agent-sdk": "0.2.42",
|
|
365
|
+
"@anthropic-ai/sdk": "^0.71.0",
|
|
366
|
+
"@hono/node-server": "^1.19.9",
|
|
367
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
363
368
|
"@opentelemetry/api-logs": "^0.208.0",
|
|
364
369
|
"@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
|
|
365
370
|
"@opentelemetry/resources": "^2.0.0",
|
|
366
371
|
"@opentelemetry/sdk-logs": "^0.208.0",
|
|
367
372
|
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
368
|
-
"@agentclientprotocol/sdk": "^0.14.0",
|
|
369
|
-
"@anthropic-ai/claude-agent-sdk": "0.2.12",
|
|
370
|
-
"@anthropic-ai/sdk": "^0.71.0",
|
|
371
|
-
"@hono/node-server": "^1.19.9",
|
|
372
|
-
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
373
373
|
"@types/jsonwebtoken": "^9.0.10",
|
|
374
374
|
commander: "^14.0.2",
|
|
375
375
|
diff: "^8.0.2",
|
|
@@ -1362,19 +1362,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
|
|
|
1362
1362
|
}
|
|
1363
1363
|
}
|
|
1364
1364
|
async function handleSystemMessage(message, context) {
|
|
1365
|
-
const {
|
|
1365
|
+
const { sessionId, client, logger } = context;
|
|
1366
1366
|
switch (message.subtype) {
|
|
1367
1367
|
case "init":
|
|
1368
|
-
if (message.session_id && session && !session.sessionId) {
|
|
1369
|
-
session.sessionId = message.session_id;
|
|
1370
|
-
if (session.taskRunId) {
|
|
1371
|
-
await client.extNotification("_posthog/sdk_session", {
|
|
1372
|
-
taskRunId: session.taskRunId,
|
|
1373
|
-
sessionId: message.session_id,
|
|
1374
|
-
adapter: "claude"
|
|
1375
|
-
});
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
1368
|
break;
|
|
1379
1369
|
case "compact_boundary":
|
|
1380
1370
|
await client.extNotification("_posthog/compact_boundary", {
|
|
@@ -2304,7 +2294,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
2304
2294
|
};
|
|
2305
2295
|
};
|
|
2306
2296
|
}
|
|
2297
|
+
function ensureLocalSettings(cwd) {
|
|
2298
|
+
const claudeDir = path2.join(cwd, ".claude");
|
|
2299
|
+
const localSettingsPath = path2.join(claudeDir, "settings.local.json");
|
|
2300
|
+
try {
|
|
2301
|
+
if (!fs.existsSync(localSettingsPath)) {
|
|
2302
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
2303
|
+
fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
|
|
2304
|
+
}
|
|
2305
|
+
} catch {
|
|
2306
|
+
}
|
|
2307
|
+
}
|
|
2307
2308
|
function buildSessionOptions(params) {
|
|
2309
|
+
ensureLocalSettings(params.cwd);
|
|
2308
2310
|
const options = {
|
|
2309
2311
|
...params.userProvidedOptions,
|
|
2310
2312
|
systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
|
|
@@ -2327,7 +2329,7 @@ function buildSessionOptions(params) {
|
|
|
2327
2329
|
),
|
|
2328
2330
|
...params.onProcessSpawned && {
|
|
2329
2331
|
spawnClaudeCodeProcess: buildSpawnWrapper(
|
|
2330
|
-
params.sessionId
|
|
2332
|
+
params.sessionId,
|
|
2331
2333
|
params.onProcessSpawned,
|
|
2332
2334
|
params.onProcessExited
|
|
2333
2335
|
)
|
|
@@ -2336,8 +2338,11 @@ function buildSessionOptions(params) {
|
|
|
2336
2338
|
if (process.env.CLAUDE_CODE_EXECUTABLE) {
|
|
2337
2339
|
options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
|
|
2338
2340
|
}
|
|
2339
|
-
if (params.
|
|
2341
|
+
if (params.isResume) {
|
|
2340
2342
|
options.resume = params.sessionId;
|
|
2343
|
+
options.forkSession = false;
|
|
2344
|
+
} else {
|
|
2345
|
+
options.sessionId = params.sessionId;
|
|
2341
2346
|
}
|
|
2342
2347
|
if (params.additionalDirectories) {
|
|
2343
2348
|
options.additionalDirectories = params.additionalDirectories;
|
|
@@ -2414,7 +2419,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
2414
2419
|
async newSession(params) {
|
|
2415
2420
|
this.checkAuthStatus();
|
|
2416
2421
|
const meta = params._meta;
|
|
2417
|
-
const
|
|
2422
|
+
const sessionId = uuidv7();
|
|
2418
2423
|
const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
|
|
2419
2424
|
const mcpServers = parseMcpServers(params);
|
|
2420
2425
|
await fetchMcpToolMetadata(mcpServers, this.logger);
|
|
@@ -2422,18 +2427,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
2422
2427
|
cwd: params.cwd,
|
|
2423
2428
|
mcpServers,
|
|
2424
2429
|
permissionMode,
|
|
2425
|
-
canUseTool: this.createCanUseTool(
|
|
2430
|
+
canUseTool: this.createCanUseTool(sessionId),
|
|
2426
2431
|
logger: this.logger,
|
|
2427
2432
|
systemPrompt: buildSystemPrompt(meta?.systemPrompt),
|
|
2428
2433
|
userProvidedOptions: meta?.claudeCode?.options,
|
|
2429
|
-
|
|
2434
|
+
sessionId,
|
|
2435
|
+
isResume: false,
|
|
2436
|
+
onModeChange: this.createOnModeChange(sessionId),
|
|
2430
2437
|
onProcessSpawned: this.processCallbacks?.onProcessSpawned,
|
|
2431
2438
|
onProcessExited: this.processCallbacks?.onProcessExited
|
|
2432
2439
|
});
|
|
2433
2440
|
const input = new Pushable();
|
|
2434
2441
|
const q = query({ prompt: input, options });
|
|
2435
2442
|
const session = this.createSession(
|
|
2436
|
-
|
|
2443
|
+
sessionId,
|
|
2437
2444
|
q,
|
|
2438
2445
|
input,
|
|
2439
2446
|
permissionMode,
|
|
@@ -2441,19 +2448,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
2441
2448
|
options.abortController
|
|
2442
2449
|
);
|
|
2443
2450
|
session.taskRunId = meta?.taskRunId;
|
|
2444
|
-
this.registerPersistence(
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2451
|
+
this.registerPersistence(sessionId, meta);
|
|
2452
|
+
if (meta?.taskRunId) {
|
|
2453
|
+
await this.client.extNotification("_posthog/sdk_session", {
|
|
2454
|
+
taskRunId: meta.taskRunId,
|
|
2455
|
+
sessionId,
|
|
2456
|
+
adapter: "claude"
|
|
2457
|
+
});
|
|
2458
|
+
}
|
|
2448
2459
|
const modelOptions = await this.getModelConfigOptions();
|
|
2449
2460
|
session.modelId = modelOptions.currentModelId;
|
|
2450
2461
|
await this.trySetModel(q, modelOptions.currentModelId);
|
|
2451
2462
|
this.sendAvailableCommandsUpdate(
|
|
2452
|
-
|
|
2463
|
+
sessionId,
|
|
2453
2464
|
await getAvailableSlashCommands(q)
|
|
2454
2465
|
);
|
|
2455
2466
|
return {
|
|
2456
|
-
sessionId
|
|
2467
|
+
sessionId,
|
|
2457
2468
|
configOptions: await this.buildConfigOptions(modelOptions)
|
|
2458
2469
|
};
|
|
2459
2470
|
}
|
|
@@ -2461,34 +2472,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
2461
2472
|
return this.resumeSession(params);
|
|
2462
2473
|
}
|
|
2463
2474
|
async resumeSession(params) {
|
|
2464
|
-
const
|
|
2465
|
-
|
|
2475
|
+
const meta = params._meta;
|
|
2476
|
+
const sessionId = meta?.sessionId;
|
|
2477
|
+
if (!sessionId) {
|
|
2478
|
+
throw new Error("Cannot resume session without sessionId");
|
|
2479
|
+
}
|
|
2480
|
+
if (this.sessionId === sessionId) {
|
|
2466
2481
|
return {};
|
|
2467
2482
|
}
|
|
2468
|
-
const meta = params._meta;
|
|
2469
2483
|
const mcpServers = parseMcpServers(params);
|
|
2470
2484
|
await fetchMcpToolMetadata(mcpServers, this.logger);
|
|
2471
2485
|
const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
|
|
2472
2486
|
const { query: q, session } = await this.initializeQuery({
|
|
2473
|
-
internalSessionId,
|
|
2474
2487
|
cwd: params.cwd,
|
|
2475
2488
|
permissionMode,
|
|
2476
2489
|
mcpServers,
|
|
2477
2490
|
systemPrompt: buildSystemPrompt(meta?.systemPrompt),
|
|
2478
2491
|
userProvidedOptions: meta?.claudeCode?.options,
|
|
2479
|
-
sessionId
|
|
2492
|
+
sessionId,
|
|
2493
|
+
isResume: true,
|
|
2480
2494
|
additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
|
|
2481
2495
|
});
|
|
2482
2496
|
session.taskRunId = meta?.taskRunId;
|
|
2483
|
-
|
|
2484
|
-
session.sessionId = meta.sessionId;
|
|
2485
|
-
}
|
|
2486
|
-
this.registerPersistence(
|
|
2487
|
-
internalSessionId,
|
|
2488
|
-
meta
|
|
2489
|
-
);
|
|
2497
|
+
this.registerPersistence(sessionId, meta);
|
|
2490
2498
|
this.sendAvailableCommandsUpdate(
|
|
2491
|
-
|
|
2499
|
+
sessionId,
|
|
2492
2500
|
await getAvailableSlashCommands(q)
|
|
2493
2501
|
);
|
|
2494
2502
|
return {
|
|
@@ -2557,20 +2565,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
2557
2565
|
cwd: config.cwd,
|
|
2558
2566
|
mcpServers: config.mcpServers,
|
|
2559
2567
|
permissionMode: config.permissionMode,
|
|
2560
|
-
canUseTool: this.createCanUseTool(config.
|
|
2568
|
+
canUseTool: this.createCanUseTool(config.sessionId),
|
|
2561
2569
|
logger: this.logger,
|
|
2562
2570
|
systemPrompt: config.systemPrompt,
|
|
2563
2571
|
userProvidedOptions: config.userProvidedOptions,
|
|
2564
2572
|
sessionId: config.sessionId,
|
|
2573
|
+
isResume: config.isResume,
|
|
2565
2574
|
additionalDirectories: config.additionalDirectories,
|
|
2566
|
-
onModeChange: this.createOnModeChange(config.
|
|
2575
|
+
onModeChange: this.createOnModeChange(config.sessionId),
|
|
2567
2576
|
onProcessSpawned: this.processCallbacks?.onProcessSpawned,
|
|
2568
2577
|
onProcessExited: this.processCallbacks?.onProcessExited
|
|
2569
2578
|
});
|
|
2570
2579
|
const q = query({ prompt: input, options });
|
|
2571
2580
|
const abortController = options.abortController;
|
|
2572
2581
|
const session = this.createSession(
|
|
2573
|
-
config.
|
|
2582
|
+
config.sessionId,
|
|
2574
2583
|
q,
|
|
2575
2584
|
input,
|
|
2576
2585
|
config.permissionMode,
|
|
@@ -2763,6 +2772,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
2763
2772
|
}
|
|
2764
2773
|
case "tool_progress":
|
|
2765
2774
|
case "auth_status":
|
|
2775
|
+
case "tool_use_summary":
|
|
2766
2776
|
return null;
|
|
2767
2777
|
default:
|
|
2768
2778
|
unreachable(message, this.logger);
|