@posthog/agent 2.3.22 → 2.3.31

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.
@@ -904,7 +904,7 @@ var import_hono = require("hono");
904
904
  // package.json
905
905
  var package_default = {
906
906
  name: "@posthog/agent",
907
- version: "2.3.22",
907
+ version: "2.3.31",
908
908
  repository: "https://github.com/PostHog/code",
909
909
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
910
910
  exports: {
@@ -3455,6 +3455,40 @@ var GATEWAY_TO_SDK_MODEL = {
3455
3455
  function toSdkModelId(modelId) {
3456
3456
  return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;
3457
3457
  }
3458
+ var MODELS_WITH_1M_CONTEXT = /* @__PURE__ */ new Set([
3459
+ "claude-opus-4-6",
3460
+ "claude-sonnet-4-6"
3461
+ ]);
3462
+ function supports1MContext(modelId) {
3463
+ return MODELS_WITH_1M_CONTEXT.has(modelId);
3464
+ }
3465
+ function getDefaultContextWindow(modelId) {
3466
+ return supports1MContext(modelId) ? 1e6 : 2e5;
3467
+ }
3468
+ var MODELS_WITH_EFFORT = /* @__PURE__ */ new Set([
3469
+ "claude-opus-4-5",
3470
+ "claude-opus-4-6",
3471
+ "claude-sonnet-4-6"
3472
+ ]);
3473
+ var MODELS_WITH_MAX_EFFORT = /* @__PURE__ */ new Set(["claude-opus-4-6"]);
3474
+ function supportsEffort(modelId) {
3475
+ return MODELS_WITH_EFFORT.has(modelId);
3476
+ }
3477
+ function supportsMaxEffort(modelId) {
3478
+ return MODELS_WITH_MAX_EFFORT.has(modelId);
3479
+ }
3480
+ function getEffortOptions(modelId) {
3481
+ if (!supportsEffort(modelId)) return null;
3482
+ const options = [
3483
+ { value: "low", name: "Low" },
3484
+ { value: "medium", name: "Medium" },
3485
+ { value: "high", name: "High" }
3486
+ ];
3487
+ if (supportsMaxEffort(modelId)) {
3488
+ options.push({ value: "max", name: "Max" });
3489
+ }
3490
+ return options;
3491
+ }
3458
3492
 
3459
3493
  // src/adapters/claude/session/options.ts
3460
3494
  var import_node_child_process = require("child_process");
@@ -4124,7 +4158,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
4124
4158
  const contextWindows = Object.values(message.modelUsage).map(
4125
4159
  (m) => m.contextWindow
4126
4160
  );
4127
- const contextWindowSize = contextWindows.length > 0 ? Math.min(...contextWindows) : 2e5;
4161
+ const contextWindowSize = contextWindows.length > 0 ? Math.min(...contextWindows) : getDefaultContextWindow(this.session.modelId ?? "");
4128
4162
  if (lastAssistantTotalUsage !== null) {
4129
4163
  await this.client.sessionUpdate({
4130
4164
  sessionId: params.sessionId,
@@ -4244,6 +4278,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
4244
4278
  const sdkModelId = toSdkModelId(params.modelId);
4245
4279
  await this.session.query.setModel(sdkModelId);
4246
4280
  this.session.modelId = params.modelId;
4281
+ this.rebuildEffortConfigOption(params.modelId);
4247
4282
  await this.updateConfigOption("model", params.modelId);
4248
4283
  return {};
4249
4284
  }
@@ -4281,6 +4316,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
4281
4316
  const sdkModelId = toSdkModelId(params.value);
4282
4317
  await this.session.query.setModel(sdkModelId);
4283
4318
  this.session.modelId = params.value;
4319
+ this.rebuildEffortConfigOption(params.value);
4284
4320
  } else if (params.configId === "effort") {
4285
4321
  const newEffort = params.value;
4286
4322
  this.session.effort = newEffort;
@@ -4510,7 +4546,7 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
4510
4546
  name: mode.name,
4511
4547
  description: mode.description ?? void 0
4512
4548
  }));
4513
- return [
4549
+ const configOptions = [
4514
4550
  {
4515
4551
  id: "mode",
4516
4552
  name: "Approval Preset",
@@ -4528,22 +4564,60 @@ var ClaudeAcpAgent = class extends BaseAcpAgent {
4528
4564
  options: modelOptions.options,
4529
4565
  category: "model",
4530
4566
  description: "Choose which model Claude should use"
4531
- },
4532
- {
4567
+ }
4568
+ ];
4569
+ const effortOptions = getEffortOptions(modelOptions.currentModelId);
4570
+ if (effortOptions) {
4571
+ configOptions.push({
4533
4572
  id: "effort",
4534
4573
  name: "Effort",
4535
4574
  type: "select",
4536
4575
  currentValue: currentEffort,
4537
- options: [
4538
- { value: "low", name: "Low" },
4539
- { value: "medium", name: "Medium" },
4540
- { value: "high", name: "High" },
4541
- { value: "max", name: "Max" }
4542
- ],
4576
+ options: effortOptions,
4543
4577
  category: "thought_level",
4544
4578
  description: "Controls how much effort Claude puts into its response"
4579
+ });
4580
+ }
4581
+ return configOptions;
4582
+ }
4583
+ rebuildEffortConfigOption(modelId) {
4584
+ const effortOptions = getEffortOptions(modelId);
4585
+ const existingEffort = this.session.configOptions.find(
4586
+ (o) => o.id === "effort"
4587
+ );
4588
+ if (!effortOptions) {
4589
+ this.session.configOptions = this.session.configOptions.filter(
4590
+ (o) => o.id !== "effort"
4591
+ );
4592
+ if (this.session.effort) {
4593
+ this.session.effort = void 0;
4594
+ this.session.queryOptions.effort = void 0;
4545
4595
  }
4546
- ];
4596
+ return;
4597
+ }
4598
+ const currentValue = existingEffort?.currentValue ?? "high";
4599
+ const isValidValue = effortOptions.some((o) => o.value === currentValue);
4600
+ const resolvedValue = isValidValue ? currentValue : "high";
4601
+ if (resolvedValue !== currentValue && this.session.effort) {
4602
+ this.session.effort = resolvedValue;
4603
+ this.session.queryOptions.effort = resolvedValue;
4604
+ }
4605
+ const effortConfig = {
4606
+ id: "effort",
4607
+ name: "Effort",
4608
+ type: "select",
4609
+ currentValue: resolvedValue,
4610
+ options: effortOptions,
4611
+ category: "thought_level",
4612
+ description: "Controls how much effort Claude puts into its response"
4613
+ };
4614
+ if (existingEffort) {
4615
+ this.session.configOptions = this.session.configOptions.map(
4616
+ (o) => o.id === "effort" ? effortConfig : o
4617
+ );
4618
+ } else {
4619
+ this.session.configOptions.push(effortConfig);
4620
+ }
4547
4621
  }
4548
4622
  async sendAvailableCommandsUpdate() {
4549
4623
  const commands = await this.session.query.supportedCommands();
@@ -11377,6 +11451,17 @@ var remoteMcpServerSchema = import_zod3.z.object({
11377
11451
  headers: import_zod3.z.array(httpHeaderSchema).default([])
11378
11452
  });
11379
11453
  var mcpServersSchema = import_zod3.z.array(remoteMcpServerSchema);
11454
+ var claudeCodeConfigSchema = import_zod3.z.object({
11455
+ systemPrompt: import_zod3.z.union([
11456
+ import_zod3.z.string(),
11457
+ import_zod3.z.object({
11458
+ type: import_zod3.z.literal("preset"),
11459
+ preset: import_zod3.z.literal("claude_code"),
11460
+ append: import_zod3.z.string().optional()
11461
+ })
11462
+ ]).optional(),
11463
+ plugins: import_zod3.z.array(import_zod3.z.object({ type: import_zod3.z.literal("local"), path: import_zod3.z.string() })).optional()
11464
+ });
11380
11465
  var jsonRpcRequestSchema = import_zod3.z.object({
11381
11466
  jsonrpc: import_zod3.z.literal("2.0"),
11382
11467
  method: import_zod3.z.string(),
@@ -11881,7 +11966,14 @@ You MUST NOT create a new branch, close the existing PR, or create a new PR.`
11881
11966
  _meta: {
11882
11967
  sessionId: payload.run_id,
11883
11968
  taskRunId: payload.run_id,
11884
- systemPrompt: { append: this.buildCloudSystemPrompt(prUrl) }
11969
+ systemPrompt: this.buildSessionSystemPrompt(prUrl),
11970
+ ...this.config.claudeCode?.plugins?.length && {
11971
+ claudeCode: {
11972
+ options: {
11973
+ plugins: this.config.claudeCode.plugins
11974
+ }
11975
+ }
11976
+ }
11885
11977
  }
11886
11978
  });
11887
11979
  const acpSessionId = sessionResponse.sessionId;
@@ -12111,6 +12203,19 @@ ${toolSummary}`);
12111
12203
  const stateRunId = state?.resume_from_run_id;
12112
12204
  return typeof stateRunId === "string" && stateRunId.trim().length > 0 ? stateRunId.trim() : null;
12113
12205
  }
12206
+ buildSessionSystemPrompt(prUrl) {
12207
+ const cloudAppend = this.buildCloudSystemPrompt(prUrl);
12208
+ const userPrompt = this.config.claudeCode?.systemPrompt;
12209
+ if (typeof userPrompt === "string") {
12210
+ return [userPrompt, cloudAppend].join("\n\n");
12211
+ }
12212
+ if (typeof userPrompt === "object") {
12213
+ return {
12214
+ append: [userPrompt.append, cloudAppend].filter(Boolean).join("\n\n")
12215
+ };
12216
+ }
12217
+ return { append: cloudAppend };
12218
+ }
12114
12219
  buildCloudSystemPrompt(prUrl) {
12115
12220
  if (prUrl) {
12116
12221
  return `
@@ -12485,6 +12590,22 @@ var envSchema = import_zod4.z.object({
12485
12590
  }).regex(/^\d+$/, "POSTHOG_PROJECT_ID must be a numeric string").transform((val) => parseInt(val, 10))
12486
12591
  });
12487
12592
  var program = new import_commander.Command();
12593
+ function parseJsonOption(raw, schema, flag) {
12594
+ if (!raw) return void 0;
12595
+ let parsed;
12596
+ try {
12597
+ parsed = JSON.parse(raw);
12598
+ } catch {
12599
+ program.error(`${flag} must be valid JSON`);
12600
+ }
12601
+ const result = schema.safeParse(parsed);
12602
+ if (!result.success) {
12603
+ const errors = result.error.issues.map((issue) => ` - ${issue.path.join(".")}: ${issue.message}`).join("\n");
12604
+ program.error(`${flag} validation failed:
12605
+ ${errors}`);
12606
+ }
12607
+ return result.data;
12608
+ }
12488
12609
  program.name("agent-server").description("PostHog cloud agent server - runs in sandbox environments").option("--port <port>", "HTTP server port", "3001").option(
12489
12610
  "--mode <mode>",
12490
12611
  "Execution mode: interactive or background",
@@ -12492,7 +12613,10 @@ program.name("agent-server").description("PostHog cloud agent server - runs in s
12492
12613
  ).option("--repositoryPath <path>", "Path to the repository").requiredOption("--taskId <id>", "Task ID").requiredOption("--runId <id>", "Task run ID").option(
12493
12614
  "--mcpServers <json>",
12494
12615
  "MCP servers config as JSON array (ACP McpServer[] format)"
12495
- ).option("--baseBranch <branch>", "Base branch for PR creation").action(async (options) => {
12616
+ ).option("--baseBranch <branch>", "Base branch for PR creation").option(
12617
+ "--claudeCodeConfig <json>",
12618
+ "Claude Code config as JSON (systemPrompt, systemPromptAppend, plugins)"
12619
+ ).action(async (options) => {
12496
12620
  const envResult = envSchema.safeParse(process.env);
12497
12621
  if (!envResult.success) {
12498
12622
  const errors = envResult.error.issues.map((issue) => ` - ${issue.message}`).join("\n");
@@ -12502,26 +12626,16 @@ ${errors}`);
12502
12626
  }
12503
12627
  const env = envResult.data;
12504
12628
  const mode = options.mode === "background" ? "background" : "interactive";
12505
- let mcpServers;
12506
- if (options.mcpServers) {
12507
- let parsed;
12508
- try {
12509
- parsed = JSON.parse(options.mcpServers);
12510
- } catch {
12511
- program.error("--mcpServers must be valid JSON");
12512
- return;
12513
- }
12514
- const result = mcpServersSchema.safeParse(parsed);
12515
- if (!result.success) {
12516
- const errors = result.error.issues.map((issue) => ` - ${issue.path.join(".")}: ${issue.message}`).join("\n");
12517
- program.error(
12518
- `--mcpServers validation failed (only remote http/sse servers are supported):
12519
- ${errors}`
12520
- );
12521
- return;
12522
- }
12523
- mcpServers = result.data;
12524
- }
12629
+ const mcpServers = parseJsonOption(
12630
+ options.mcpServers,
12631
+ mcpServersSchema,
12632
+ "--mcpServers"
12633
+ );
12634
+ const claudeCode = parseJsonOption(
12635
+ options.claudeCodeConfig,
12636
+ claudeCodeConfigSchema,
12637
+ "--claudeCodeConfig"
12638
+ );
12525
12639
  const server = new AgentServer({
12526
12640
  port: parseInt(options.port, 10),
12527
12641
  jwtPublicKey: env.JWT_PUBLIC_KEY,
@@ -12533,7 +12647,8 @@ ${errors}`
12533
12647
  taskId: options.taskId,
12534
12648
  runId: options.runId,
12535
12649
  mcpServers,
12536
- baseBranch: options.baseBranch
12650
+ baseBranch: options.baseBranch,
12651
+ claudeCode
12537
12652
  });
12538
12653
  process.on("SIGINT", async () => {
12539
12654
  await server.stop();