@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/server/bin.cjs
CHANGED
|
@@ -1175,7 +1175,7 @@ var import_uuid = require("uuid");
|
|
|
1175
1175
|
// package.json
|
|
1176
1176
|
var package_default = {
|
|
1177
1177
|
name: "@posthog/agent",
|
|
1178
|
-
version: "2.1.
|
|
1178
|
+
version: "2.1.22",
|
|
1179
1179
|
repository: "https://github.com/PostHog/twig",
|
|
1180
1180
|
description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
|
|
1181
1181
|
exports: {
|
|
@@ -1247,11 +1247,11 @@ var package_default = {
|
|
|
1247
1247
|
},
|
|
1248
1248
|
devDependencies: {
|
|
1249
1249
|
"@changesets/cli": "^2.27.8",
|
|
1250
|
+
"@posthog/shared": "workspace:*",
|
|
1251
|
+
"@twig/git": "workspace:*",
|
|
1250
1252
|
"@types/bun": "latest",
|
|
1251
1253
|
"@types/tar": "^6.1.13",
|
|
1252
1254
|
minimatch: "^10.0.3",
|
|
1253
|
-
"@posthog/shared": "workspace:*",
|
|
1254
|
-
"@twig/git": "workspace:*",
|
|
1255
1255
|
msw: "^2.12.7",
|
|
1256
1256
|
tsup: "^8.5.1",
|
|
1257
1257
|
tsx: "^4.20.6",
|
|
@@ -1259,16 +1259,16 @@ var package_default = {
|
|
|
1259
1259
|
vitest: "^2.1.8"
|
|
1260
1260
|
},
|
|
1261
1261
|
dependencies: {
|
|
1262
|
+
"@agentclientprotocol/sdk": "^0.14.0",
|
|
1263
|
+
"@anthropic-ai/claude-agent-sdk": "0.2.42",
|
|
1264
|
+
"@anthropic-ai/sdk": "^0.71.0",
|
|
1265
|
+
"@hono/node-server": "^1.19.9",
|
|
1266
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
1262
1267
|
"@opentelemetry/api-logs": "^0.208.0",
|
|
1263
1268
|
"@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
|
|
1264
1269
|
"@opentelemetry/resources": "^2.0.0",
|
|
1265
1270
|
"@opentelemetry/sdk-logs": "^0.208.0",
|
|
1266
1271
|
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
1267
|
-
"@agentclientprotocol/sdk": "^0.14.0",
|
|
1268
|
-
"@anthropic-ai/claude-agent-sdk": "0.2.12",
|
|
1269
|
-
"@anthropic-ai/sdk": "^0.71.0",
|
|
1270
|
-
"@hono/node-server": "^1.19.9",
|
|
1271
|
-
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
1272
1272
|
"@types/jsonwebtoken": "^9.0.10",
|
|
1273
1273
|
commander: "^14.0.2",
|
|
1274
1274
|
diff: "^8.0.2",
|
|
@@ -2234,19 +2234,9 @@ function streamEventToAcpNotifications(message, sessionId, toolUseCache, fileCon
|
|
|
2234
2234
|
}
|
|
2235
2235
|
}
|
|
2236
2236
|
async function handleSystemMessage(message, context) {
|
|
2237
|
-
const {
|
|
2237
|
+
const { sessionId, client, logger } = context;
|
|
2238
2238
|
switch (message.subtype) {
|
|
2239
2239
|
case "init":
|
|
2240
|
-
if (message.session_id && session && !session.sessionId) {
|
|
2241
|
-
session.sessionId = message.session_id;
|
|
2242
|
-
if (session.taskRunId) {
|
|
2243
|
-
await client.extNotification("_posthog/sdk_session", {
|
|
2244
|
-
taskRunId: session.taskRunId,
|
|
2245
|
-
sessionId: message.session_id,
|
|
2246
|
-
adapter: "claude"
|
|
2247
|
-
});
|
|
2248
|
-
}
|
|
2249
|
-
}
|
|
2250
2240
|
break;
|
|
2251
2241
|
case "compact_boundary":
|
|
2252
2242
|
await client.extNotification("_posthog/compact_boundary", {
|
|
@@ -3176,7 +3166,19 @@ function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited) {
|
|
|
3176
3166
|
};
|
|
3177
3167
|
};
|
|
3178
3168
|
}
|
|
3169
|
+
function ensureLocalSettings(cwd) {
|
|
3170
|
+
const claudeDir = path2.join(cwd, ".claude");
|
|
3171
|
+
const localSettingsPath = path2.join(claudeDir, "settings.local.json");
|
|
3172
|
+
try {
|
|
3173
|
+
if (!fs.existsSync(localSettingsPath)) {
|
|
3174
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
3175
|
+
fs.writeFileSync(localSettingsPath, "{}\n", { flag: "wx" });
|
|
3176
|
+
}
|
|
3177
|
+
} catch {
|
|
3178
|
+
}
|
|
3179
|
+
}
|
|
3179
3180
|
function buildSessionOptions(params) {
|
|
3181
|
+
ensureLocalSettings(params.cwd);
|
|
3180
3182
|
const options = {
|
|
3181
3183
|
...params.userProvidedOptions,
|
|
3182
3184
|
systemPrompt: params.systemPrompt ?? buildSystemPrompt(),
|
|
@@ -3199,7 +3201,7 @@ function buildSessionOptions(params) {
|
|
|
3199
3201
|
),
|
|
3200
3202
|
...params.onProcessSpawned && {
|
|
3201
3203
|
spawnClaudeCodeProcess: buildSpawnWrapper(
|
|
3202
|
-
params.sessionId
|
|
3204
|
+
params.sessionId,
|
|
3203
3205
|
params.onProcessSpawned,
|
|
3204
3206
|
params.onProcessExited
|
|
3205
3207
|
)
|
|
@@ -3208,8 +3210,11 @@ function buildSessionOptions(params) {
|
|
|
3208
3210
|
if (process.env.CLAUDE_CODE_EXECUTABLE) {
|
|
3209
3211
|
options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
|
|
3210
3212
|
}
|
|
3211
|
-
if (params.
|
|
3213
|
+
if (params.isResume) {
|
|
3212
3214
|
options.resume = params.sessionId;
|
|
3215
|
+
options.forkSession = false;
|
|
3216
|
+
} else {
|
|
3217
|
+
options.sessionId = params.sessionId;
|
|
3213
3218
|
}
|
|
3214
3219
|
if (params.additionalDirectories) {
|
|
3215
3220
|
options.additionalDirectories = params.additionalDirectories;
|
|
@@ -3286,7 +3291,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3286
3291
|
async newSession(params) {
|
|
3287
3292
|
this.checkAuthStatus();
|
|
3288
3293
|
const meta = params._meta;
|
|
3289
|
-
const
|
|
3294
|
+
const sessionId = (0, import_uuid.v7)();
|
|
3290
3295
|
const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
|
|
3291
3296
|
const mcpServers = parseMcpServers(params);
|
|
3292
3297
|
await fetchMcpToolMetadata(mcpServers, this.logger);
|
|
@@ -3294,18 +3299,20 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3294
3299
|
cwd: params.cwd,
|
|
3295
3300
|
mcpServers,
|
|
3296
3301
|
permissionMode,
|
|
3297
|
-
canUseTool: this.createCanUseTool(
|
|
3302
|
+
canUseTool: this.createCanUseTool(sessionId),
|
|
3298
3303
|
logger: this.logger,
|
|
3299
3304
|
systemPrompt: buildSystemPrompt(meta?.systemPrompt),
|
|
3300
3305
|
userProvidedOptions: meta?.claudeCode?.options,
|
|
3301
|
-
|
|
3306
|
+
sessionId,
|
|
3307
|
+
isResume: false,
|
|
3308
|
+
onModeChange: this.createOnModeChange(sessionId),
|
|
3302
3309
|
onProcessSpawned: this.processCallbacks?.onProcessSpawned,
|
|
3303
3310
|
onProcessExited: this.processCallbacks?.onProcessExited
|
|
3304
3311
|
});
|
|
3305
3312
|
const input = new Pushable();
|
|
3306
3313
|
const q = (0, import_claude_agent_sdk.query)({ prompt: input, options });
|
|
3307
3314
|
const session = this.createSession(
|
|
3308
|
-
|
|
3315
|
+
sessionId,
|
|
3309
3316
|
q,
|
|
3310
3317
|
input,
|
|
3311
3318
|
permissionMode,
|
|
@@ -3313,19 +3320,23 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3313
3320
|
options.abortController
|
|
3314
3321
|
);
|
|
3315
3322
|
session.taskRunId = meta?.taskRunId;
|
|
3316
|
-
this.registerPersistence(
|
|
3317
|
-
|
|
3318
|
-
|
|
3319
|
-
|
|
3323
|
+
this.registerPersistence(sessionId, meta);
|
|
3324
|
+
if (meta?.taskRunId) {
|
|
3325
|
+
await this.client.extNotification("_posthog/sdk_session", {
|
|
3326
|
+
taskRunId: meta.taskRunId,
|
|
3327
|
+
sessionId,
|
|
3328
|
+
adapter: "claude"
|
|
3329
|
+
});
|
|
3330
|
+
}
|
|
3320
3331
|
const modelOptions = await this.getModelConfigOptions();
|
|
3321
3332
|
session.modelId = modelOptions.currentModelId;
|
|
3322
3333
|
await this.trySetModel(q, modelOptions.currentModelId);
|
|
3323
3334
|
this.sendAvailableCommandsUpdate(
|
|
3324
|
-
|
|
3335
|
+
sessionId,
|
|
3325
3336
|
await getAvailableSlashCommands(q)
|
|
3326
3337
|
);
|
|
3327
3338
|
return {
|
|
3328
|
-
sessionId
|
|
3339
|
+
sessionId,
|
|
3329
3340
|
configOptions: await this.buildConfigOptions(modelOptions)
|
|
3330
3341
|
};
|
|
3331
3342
|
}
|
|
@@ -3333,34 +3344,31 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3333
3344
|
return this.resumeSession(params);
|
|
3334
3345
|
}
|
|
3335
3346
|
async resumeSession(params) {
|
|
3336
|
-
const
|
|
3337
|
-
|
|
3347
|
+
const meta = params._meta;
|
|
3348
|
+
const sessionId = meta?.sessionId;
|
|
3349
|
+
if (!sessionId) {
|
|
3350
|
+
throw new Error("Cannot resume session without sessionId");
|
|
3351
|
+
}
|
|
3352
|
+
if (this.sessionId === sessionId) {
|
|
3338
3353
|
return {};
|
|
3339
3354
|
}
|
|
3340
|
-
const meta = params._meta;
|
|
3341
3355
|
const mcpServers = parseMcpServers(params);
|
|
3342
3356
|
await fetchMcpToolMetadata(mcpServers, this.logger);
|
|
3343
3357
|
const permissionMode = meta?.permissionMode && TWIG_EXECUTION_MODES.includes(meta.permissionMode) ? meta.permissionMode : "default";
|
|
3344
3358
|
const { query: q, session } = await this.initializeQuery({
|
|
3345
|
-
internalSessionId,
|
|
3346
3359
|
cwd: params.cwd,
|
|
3347
3360
|
permissionMode,
|
|
3348
3361
|
mcpServers,
|
|
3349
3362
|
systemPrompt: buildSystemPrompt(meta?.systemPrompt),
|
|
3350
3363
|
userProvidedOptions: meta?.claudeCode?.options,
|
|
3351
|
-
sessionId
|
|
3364
|
+
sessionId,
|
|
3365
|
+
isResume: true,
|
|
3352
3366
|
additionalDirectories: meta?.claudeCode?.options?.additionalDirectories
|
|
3353
3367
|
});
|
|
3354
3368
|
session.taskRunId = meta?.taskRunId;
|
|
3355
|
-
|
|
3356
|
-
session.sessionId = meta.sessionId;
|
|
3357
|
-
}
|
|
3358
|
-
this.registerPersistence(
|
|
3359
|
-
internalSessionId,
|
|
3360
|
-
meta
|
|
3361
|
-
);
|
|
3369
|
+
this.registerPersistence(sessionId, meta);
|
|
3362
3370
|
this.sendAvailableCommandsUpdate(
|
|
3363
|
-
|
|
3371
|
+
sessionId,
|
|
3364
3372
|
await getAvailableSlashCommands(q)
|
|
3365
3373
|
);
|
|
3366
3374
|
return {
|
|
@@ -3429,20 +3437,21 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3429
3437
|
cwd: config.cwd,
|
|
3430
3438
|
mcpServers: config.mcpServers,
|
|
3431
3439
|
permissionMode: config.permissionMode,
|
|
3432
|
-
canUseTool: this.createCanUseTool(config.
|
|
3440
|
+
canUseTool: this.createCanUseTool(config.sessionId),
|
|
3433
3441
|
logger: this.logger,
|
|
3434
3442
|
systemPrompt: config.systemPrompt,
|
|
3435
3443
|
userProvidedOptions: config.userProvidedOptions,
|
|
3436
3444
|
sessionId: config.sessionId,
|
|
3445
|
+
isResume: config.isResume,
|
|
3437
3446
|
additionalDirectories: config.additionalDirectories,
|
|
3438
|
-
onModeChange: this.createOnModeChange(config.
|
|
3447
|
+
onModeChange: this.createOnModeChange(config.sessionId),
|
|
3439
3448
|
onProcessSpawned: this.processCallbacks?.onProcessSpawned,
|
|
3440
3449
|
onProcessExited: this.processCallbacks?.onProcessExited
|
|
3441
3450
|
});
|
|
3442
3451
|
const q = (0, import_claude_agent_sdk.query)({ prompt: input, options });
|
|
3443
3452
|
const abortController = options.abortController;
|
|
3444
3453
|
const session = this.createSession(
|
|
3445
|
-
config.
|
|
3454
|
+
config.sessionId,
|
|
3446
3455
|
q,
|
|
3447
3456
|
input,
|
|
3448
3457
|
config.permissionMode,
|
|
@@ -3635,6 +3644,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
|
|
|
3635
3644
|
}
|
|
3636
3645
|
case "tool_progress":
|
|
3637
3646
|
case "auth_status":
|
|
3647
|
+
case "tool_use_summary":
|
|
3638
3648
|
return null;
|
|
3639
3649
|
default:
|
|
3640
3650
|
unreachable(message, this.logger);
|