@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
|
Binary file
|
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -1174,7 +1174,7 @@ import { v7 as uuidv7 } from "uuid";
|
|
|
1174
1174
|
// package.json
|
|
1175
1175
|
var package_default = {
|
|
1176
1176
|
name: "@posthog/agent",
|
|
1177
|
-
version: "2.1.
|
|
1177
|
+
version: "2.1.22",
|
|
1178
1178
|
repository: "https://github.com/PostHog/twig",
|
|
1179
1179
|
description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
|
|
1180
1180
|
exports: {
|
|
@@ -1246,11 +1246,11 @@ var package_default = {
|
|
|
1246
1246
|
},
|
|
1247
1247
|
devDependencies: {
|
|
1248
1248
|
"@changesets/cli": "^2.27.8",
|
|
1249
|
+
"@posthog/shared": "workspace:*",
|
|
1250
|
+
"@twig/git": "workspace:*",
|
|
1249
1251
|
"@types/bun": "latest",
|
|
1250
1252
|
"@types/tar": "^6.1.13",
|
|
1251
1253
|
minimatch: "^10.0.3",
|
|
1252
|
-
"@posthog/shared": "workspace:*",
|
|
1253
|
-
"@twig/git": "workspace:*",
|
|
1254
1254
|
msw: "^2.12.7",
|
|
1255
1255
|
tsup: "^8.5.1",
|
|
1256
1256
|
tsx: "^4.20.6",
|
|
@@ -1258,16 +1258,16 @@ var package_default = {
|
|
|
1258
1258
|
vitest: "^2.1.8"
|
|
1259
1259
|
},
|
|
1260
1260
|
dependencies: {
|
|
1261
|
+
"@agentclientprotocol/sdk": "^0.14.0",
|
|
1262
|
+
"@anthropic-ai/claude-agent-sdk": "0.2.42",
|
|
1263
|
+
"@anthropic-ai/sdk": "^0.71.0",
|
|
1264
|
+
"@hono/node-server": "^1.19.9",
|
|
1265
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
1261
1266
|
"@opentelemetry/api-logs": "^0.208.0",
|
|
1262
1267
|
"@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
|
|
1263
1268
|
"@opentelemetry/resources": "^2.0.0",
|
|
1264
1269
|
"@opentelemetry/sdk-logs": "^0.208.0",
|
|
1265
1270
|
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
1266
|
-
"@agentclientprotocol/sdk": "^0.14.0",
|
|
1267
|
-
"@anthropic-ai/claude-agent-sdk": "0.2.12",
|
|
1268
|
-
"@anthropic-ai/sdk": "^0.71.0",
|
|
1269
|
-
"@hono/node-server": "^1.19.9",
|
|
1270
|
-
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
1271
1271
|
"@types/jsonwebtoken": "^9.0.10",
|
|
1272
1272
|
commander: "^14.0.2",
|
|
1273
1273
|
diff: "^8.0.2",
|
|
@@ -2268,19 +2268,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
|
|
|
2268
2268
|
}
|
|
2269
2269
|
}
|
|
2270
2270
|
async function handleSystemMessage(message, context) {
|
|
2271
|
-
const {
|
|
2271
|
+
const { sessionId, client, logger } = context;
|
|
2272
2272
|
switch (message.subtype) {
|
|
2273
2273
|
case "init":
|
|
2274
|
-
if (message.session_id && session && !session.sessionId) {
|
|
2275
|
-
session.sessionId = message.session_id;
|
|
2276
|
-
if (session.taskRunId) {
|
|
2277
|
-
await client.extNotification("_posthog/sdk_session", {
|
|
2278
|
-
taskRunId: session.taskRunId,
|
|
2279
|
-
sessionId: message.session_id,
|
|
2280
|
-
adapter: "claude"
|
|
2281
|
-
});
|
|
2282
|
-
}
|
|
2283
|
-
}
|
|
2284
2274
|
break;
|
|
2285
2275
|
case "compact_boundary":
|
|
2286
2276
|
await client.extNotification("_posthog/compact_boundary", {
|
|
@@ -3210,7 +3200,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
3210
3200
|
};
|
|
3211
3201
|
};
|
|
3212
3202
|
}
|
|
3203
|
+
function ensureLocalSettings(cwd) {
|
|
3204
|
+
const claudeDir = path2.join(cwd, ".claude");
|
|
3205
|
+
const localSettingsPath = path2.join(claudeDir, "settings.local.json");
|
|
3206
|
+
try {
|
|
3207
|
+
if (!fs.existsSync(localSettingsPath)) {
|
|
3208
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
3209
|
+
fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
|
|
3210
|
+
}
|
|
3211
|
+
} catch {
|
|
3212
|
+
}
|
|
3213
|
+
}
|
|
3213
3214
|
function buildSessionOptions(params) {
|
|
3215
|
+
ensureLocalSettings(params.cwd);
|
|
3214
3216
|
const options = {
|
|
3215
3217
|
...params.userProvidedOptions,
|
|
3216
3218
|
systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
|
|
@@ -3233,7 +3235,7 @@ function buildSessionOptions(params) {
|
|
|
3233
3235
|
),
|
|
3234
3236
|
...params.onProcessSpawned && {
|
|
3235
3237
|
spawnClaudeCodeProcess: buildSpawnWrapper(
|
|
3236
|
-
params.sessionId
|
|
3238
|
+
params.sessionId,
|
|
3237
3239
|
params.onProcessSpawned,
|
|
3238
3240
|
params.onProcessExited
|
|
3239
3241
|
)
|
|
@@ -3242,8 +3244,11 @@ function buildSessionOptions(params) {
|
|
|
3242
3244
|
if (process.env.CLAUDE_CODE_EXECUTABLE) {
|
|
3243
3245
|
options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
|
|
3244
3246
|
}
|
|
3245
|
-
if (params.
|
|
3247
|
+
if (params.isResume) {
|
|
3246
3248
|
options.resume = params.sessionId;
|
|
3249
|
+
options.forkSession = false;
|
|
3250
|
+
} else {
|
|
3251
|
+
options.sessionId = params.sessionId;
|
|
3247
3252
|
}
|
|
3248
3253
|
if (params.additionalDirectories) {
|
|
3249
3254
|
options.additionalDirectories = params.additionalDirectories;
|
|
@@ -3320,7 +3325,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3320
3325
|
async newSession(params) {
|
|
3321
3326
|
this.checkAuthStatus();
|
|
3322
3327
|
const meta = params._meta;
|
|
3323
|
-
const
|
|
3328
|
+
const sessionId = uuidv7();
|
|
3324
3329
|
const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
|
|
3325
3330
|
const mcpServers = parseMcpServers(params);
|
|
3326
3331
|
await fetchMcpToolMetadata(mcpServers, this.logger);
|
|
@@ -3328,18 +3333,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3328
3333
|
cwd: params.cwd,
|
|
3329
3334
|
mcpServers,
|
|
3330
3335
|
permissionMode,
|
|
3331
|
-
canUseTool: this.createCanUseTool(
|
|
3336
|
+
canUseTool: this.createCanUseTool(sessionId),
|
|
3332
3337
|
logger: this.logger,
|
|
3333
3338
|
systemPrompt: buildSystemPrompt(meta?.systemPrompt),
|
|
3334
3339
|
userProvidedOptions: meta?.claudeCode?.options,
|
|
3335
|
-
|
|
3340
|
+
sessionId,
|
|
3341
|
+
isResume: false,
|
|
3342
|
+
onModeChange: this.createOnModeChange(sessionId),
|
|
3336
3343
|
onProcessSpawned: this.processCallbacks?.onProcessSpawned,
|
|
3337
3344
|
onProcessExited: this.processCallbacks?.onProcessExited
|
|
3338
3345
|
});
|
|
3339
3346
|
const input = new Pushable();
|
|
3340
3347
|
const q = query({ prompt: input, options });
|
|
3341
3348
|
const session = this.createSession(
|
|
3342
|
-
|
|
3349
|
+
sessionId,
|
|
3343
3350
|
q,
|
|
3344
3351
|
input,
|
|
3345
3352
|
permissionMode,
|
|
@@ -3347,19 +3354,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3347
3354
|
options.abortController
|
|
3348
3355
|
);
|
|
3349
3356
|
session.taskRunId = meta?.taskRunId;
|
|
3350
|
-
this.registerPersistence(
|
|
3351
|
-
|
|
3352
|
-
|
|
3353
|
-
|
|
3357
|
+
this.registerPersistence(sessionId, meta);
|
|
3358
|
+
if (meta?.taskRunId) {
|
|
3359
|
+
await this.client.extNotification("_posthog/sdk_session", {
|
|
3360
|
+
taskRunId: meta.taskRunId,
|
|
3361
|
+
sessionId,
|
|
3362
|
+
adapter: "claude"
|
|
3363
|
+
});
|
|
3364
|
+
}
|
|
3354
3365
|
const modelOptions = await this.getModelConfigOptions();
|
|
3355
3366
|
session.modelId = modelOptions.currentModelId;
|
|
3356
3367
|
await this.trySetModel(q, modelOptions.currentModelId);
|
|
3357
3368
|
this.sendAvailableCommandsUpdate(
|
|
3358
|
-
|
|
3369
|
+
sessionId,
|
|
3359
3370
|
await getAvailableSlashCommands(q)
|
|
3360
3371
|
);
|
|
3361
3372
|
return {
|
|
3362
|
-
sessionId
|
|
3373
|
+
sessionId,
|
|
3363
3374
|
configOptions: await this.buildConfigOptions(modelOptions)
|
|
3364
3375
|
};
|
|
3365
3376
|
}
|
|
@@ -3367,34 +3378,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3367
3378
|
return this.resumeSession(params);
|
|
3368
3379
|
}
|
|
3369
3380
|
async resumeSession(params) {
|
|
3370
|
-
const
|
|
3371
|
-
|
|
3381
|
+
const meta = params._meta;
|
|
3382
|
+
const sessionId = meta?.sessionId;
|
|
3383
|
+
if (!sessionId) {
|
|
3384
|
+
throw new Error("Cannot resume session without sessionId");
|
|
3385
|
+
}
|
|
3386
|
+
if (this.sessionId === sessionId) {
|
|
3372
3387
|
return {};
|
|
3373
3388
|
}
|
|
3374
|
-
const meta = params._meta;
|
|
3375
3389
|
const mcpServers = parseMcpServers(params);
|
|
3376
3390
|
await fetchMcpToolMetadata(mcpServers, this.logger);
|
|
3377
3391
|
const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
|
|
3378
3392
|
const { query: q, session } = await this.initializeQuery({
|
|
3379
|
-
internalSessionId,
|
|
3380
3393
|
cwd: params.cwd,
|
|
3381
3394
|
permissionMode,
|
|
3382
3395
|
mcpServers,
|
|
3383
3396
|
systemPrompt: buildSystemPrompt(meta?.systemPrompt),
|
|
3384
3397
|
userProvidedOptions: meta?.claudeCode?.options,
|
|
3385
|
-
sessionId
|
|
3398
|
+
sessionId,
|
|
3399
|
+
isResume: true,
|
|
3386
3400
|
additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
|
|
3387
3401
|
});
|
|
3388
3402
|
session.taskRunId = meta?.taskRunId;
|
|
3389
|
-
|
|
3390
|
-
session.sessionId = meta.sessionId;
|
|
3391
|
-
}
|
|
3392
|
-
this.registerPersistence(
|
|
3393
|
-
internalSessionId,
|
|
3394
|
-
meta
|
|
3395
|
-
);
|
|
3403
|
+
this.registerPersistence(sessionId, meta);
|
|
3396
3404
|
this.sendAvailableCommandsUpdate(
|
|
3397
|
-
|
|
3405
|
+
sessionId,
|
|
3398
3406
|
await getAvailableSlashCommands(q)
|
|
3399
3407
|
);
|
|
3400
3408
|
return {
|
|
@@ -3463,20 +3471,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3463
3471
|
cwd: config.cwd,
|
|
3464
3472
|
mcpServers: config.mcpServers,
|
|
3465
3473
|
permissionMode: config.permissionMode,
|
|
3466
|
-
canUseTool: this.createCanUseTool(config.
|
|
3474
|
+
canUseTool: this.createCanUseTool(config.sessionId),
|
|
3467
3475
|
logger: this.logger,
|
|
3468
3476
|
systemPrompt: config.systemPrompt,
|
|
3469
3477
|
userProvidedOptions: config.userProvidedOptions,
|
|
3470
3478
|
sessionId: config.sessionId,
|
|
3479
|
+
isResume: config.isResume,
|
|
3471
3480
|
additionalDirectories: config.additionalDirectories,
|
|
3472
|
-
onModeChange: this.createOnModeChange(config.
|
|
3481
|
+
onModeChange: this.createOnModeChange(config.sessionId),
|
|
3473
3482
|
onProcessSpawned: this.processCallbacks?.onProcessSpawned,
|
|
3474
3483
|
onProcessExited: this.processCallbacks?.onProcessExited
|
|
3475
3484
|
});
|
|
3476
3485
|
const q = query({ prompt: input, options });
|
|
3477
3486
|
const abortController = options.abortController;
|
|
3478
3487
|
const session = this.createSession(
|
|
3479
|
-
config.
|
|
3488
|
+
config.sessionId,
|
|
3480
3489
|
q,
|
|
3481
3490
|
input,
|
|
3482
3491
|
config.permissionMode,
|
|
@@ -3669,6 +3678,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3669
3678
|
}
|
|
3670
3679
|
case "tool_progress":
|
|
3671
3680
|
case "auth_status":
|
|
3681
|
+
case "tool_use_summary":
|
|
3672
3682
|
return null;
|
|
3673
3683
|
default:
|
|
3674
3684
|
unreachable(message, this.logger);
|