@posthog/agent 2.3.137 → 2.3.144

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.
@@ -0,0 +1,18 @@
1
+ declare const DEFAULT_MODEL = "opus";
2
+ declare function toSdkModelId(modelId: string): string;
3
+ declare function supports1MContext(modelId: string): boolean;
4
+ declare function supportsEffort(modelId: string): boolean;
5
+ declare function supportsMaxEffort(modelId: string): boolean;
6
+ interface EffortOption {
7
+ value: string;
8
+ name: string;
9
+ }
10
+ declare function getEffortOptions(modelId: string): EffortOption[] | null;
11
+ interface ModelOption {
12
+ value: string;
13
+ name?: string;
14
+ description?: string;
15
+ }
16
+ declare function resolveModelPreference(preference: string, options: ModelOption[]): string | null;
17
+
18
+ export { DEFAULT_MODEL, getEffortOptions, resolveModelPreference, supports1MContext, supportsEffort, supportsMaxEffort, toSdkModelId };
@@ -0,0 +1,103 @@
1
+ // src/adapters/claude/session/models.ts
2
+ var DEFAULT_MODEL = "opus";
3
+ var GATEWAY_TO_SDK_MODEL = {
4
+ "claude-opus-4-5": "opus",
5
+ "claude-opus-4-6": "opus",
6
+ "claude-sonnet-4-5": "sonnet",
7
+ "claude-sonnet-4-6": "sonnet",
8
+ "claude-haiku-4-5": "haiku"
9
+ };
10
+ function toSdkModelId(modelId) {
11
+ return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;
12
+ }
13
+ var MODELS_WITH_1M_CONTEXT = /* @__PURE__ */ new Set([
14
+ "claude-opus-4-6",
15
+ "claude-sonnet-4-6"
16
+ ]);
17
+ function supports1MContext(modelId) {
18
+ return MODELS_WITH_1M_CONTEXT.has(modelId);
19
+ }
20
+ var MODELS_WITH_EFFORT = /* @__PURE__ */ new Set([
21
+ "claude-opus-4-5",
22
+ "claude-opus-4-6",
23
+ "claude-sonnet-4-6"
24
+ ]);
25
+ var MODELS_WITH_MAX_EFFORT = /* @__PURE__ */ new Set(["claude-opus-4-6"]);
26
+ function supportsEffort(modelId) {
27
+ return MODELS_WITH_EFFORT.has(modelId);
28
+ }
29
+ function supportsMaxEffort(modelId) {
30
+ return MODELS_WITH_MAX_EFFORT.has(modelId);
31
+ }
32
+ function getEffortOptions(modelId) {
33
+ if (!supportsEffort(modelId)) return null;
34
+ const options = [
35
+ { value: "low", name: "Low" },
36
+ { value: "medium", name: "Medium" },
37
+ { value: "high", name: "High" }
38
+ ];
39
+ if (supportsMaxEffort(modelId)) {
40
+ options.push({ value: "max", name: "Max" });
41
+ }
42
+ return options;
43
+ }
44
+ var MODEL_CONTEXT_HINT_PATTERN = /\[(\d+m)\]$/i;
45
+ function tokenizeModelPreference(model) {
46
+ const lower = model.trim().toLowerCase();
47
+ const contextHint = lower.match(MODEL_CONTEXT_HINT_PATTERN)?.[1]?.toLowerCase();
48
+ const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, " $1 ");
49
+ const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);
50
+ const tokens = rawTokens.map((token) => {
51
+ if (token === "opusplan") return "opus";
52
+ if (token === "best" || token === "default") return "";
53
+ return token;
54
+ }).filter((token) => token && token !== "claude").filter((token) => /[a-z]/.test(token) || token.endsWith("m"));
55
+ return { tokens, contextHint };
56
+ }
57
+ function scoreModelMatch(model, tokens, contextHint) {
58
+ const haystack = `${model.value} ${model.name ?? ""}`.toLowerCase();
59
+ let score = 0;
60
+ for (const token of tokens) {
61
+ if (haystack.includes(token)) {
62
+ score += token === contextHint ? 3 : 1;
63
+ }
64
+ }
65
+ return score;
66
+ }
67
+ function resolveModelPreference(preference, options) {
68
+ const trimmed = preference.trim();
69
+ if (!trimmed) return null;
70
+ const lower = trimmed.toLowerCase();
71
+ const directMatch = options.find(
72
+ (o) => o.value === trimmed || o.value.toLowerCase() === lower || o.name && o.name.toLowerCase() === lower
73
+ );
74
+ if (directMatch) return directMatch.value;
75
+ const includesMatch = options.find((o) => {
76
+ const value = o.value.toLowerCase();
77
+ const display = (o.name ?? "").toLowerCase();
78
+ return value.includes(lower) || display.includes(lower) || lower.includes(value);
79
+ });
80
+ if (includesMatch) return includesMatch.value;
81
+ const { tokens, contextHint } = tokenizeModelPreference(trimmed);
82
+ if (tokens.length === 0) return null;
83
+ let bestMatch = null;
84
+ let bestScore = 0;
85
+ for (const model of options) {
86
+ const score = scoreModelMatch(model, tokens, contextHint);
87
+ if (0 < score && (!bestMatch || bestScore < score)) {
88
+ bestMatch = model;
89
+ bestScore = score;
90
+ }
91
+ }
92
+ return bestMatch?.value ?? null;
93
+ }
94
+ export {
95
+ DEFAULT_MODEL,
96
+ getEffortOptions,
97
+ resolveModelPreference,
98
+ supports1MContext,
99
+ supportsEffort,
100
+ supportsMaxEffort,
101
+ toSdkModelId
102
+ };
103
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/adapters/claude/session/models.ts"],"sourcesContent":["export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_MAX_EFFORT = new Set([\"claude-opus-4-6\"]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsMaxEffort(modelId: string): boolean {\n return MODELS_WITH_MAX_EFFORT.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsMaxEffort(modelId)) {\n options.push({ value: \"max\", name: \"Max\" });\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n"],"mappings":";AAAO,IAAM,gBAAgB;AAE7B,IAAM,uBAA+C;AAAA,EACnD,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AACtB;AAEO,SAAS,aAAa,SAAyB;AACpD,SAAO,qBAAqB,OAAO,KAAK;AAC1C;AAEA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AACF,CAAC;AAEM,SAAS,kBAAkB,SAA0B;AAC1D,SAAO,uBAAuB,IAAI,OAAO;AAC3C;AAEA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,yBAAyB,oBAAI,IAAI,CAAC,iBAAiB,CAAC;AAEnD,SAAS,eAAe,SAA0B;AACvD,SAAO,mBAAmB,IAAI,OAAO;AACvC;AAEO,SAAS,kBAAkB,SAA0B;AAC1D,SAAO,uBAAuB,IAAI,OAAO;AAC3C;AAOO,SAAS,iBAAiB,SAAwC;AACvE,MAAI,CAAC,eAAe,OAAO,EAAG,QAAO;AAErC,QAAM,UAA0B;AAAA,IAC9B,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,IAC5B,EAAE,OAAO,UAAU,MAAM,SAAS;AAAA,IAClC,EAAE,OAAO,QAAQ,MAAM,OAAO;AAAA,EAChC;AAEA,MAAI,kBAAkB,OAAO,GAAG;AAC9B,YAAQ,KAAK,EAAE,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,EAC5C;AAEA,SAAO;AACT;AAKA,IAAM,6BAA6B;AAEnC,SAAS,wBAAwB,OAG/B;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,QAAM,cAAc,MACjB,MAAM,0BAA0B,IAAI,CAAC,GACpC,YAAY;AAEhB,QAAM,aAAa,MAAM,QAAQ,4BAA4B,MAAM;AACnE,QAAM,YAAY,WAAW,MAAM,YAAY,EAAE,OAAO,OAAO;AAC/D,QAAM,SAAS,UACZ,IAAI,CAAC,UAAU;AACd,QAAI,UAAU,WAAY,QAAO;AACjC,QAAI,UAAU,UAAU,UAAU,UAAW,QAAO;AACpD,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,UAAU,SAAS,UAAU,QAAQ,EAC7C,OAAO,CAAC,UAAU,QAAQ,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,CAAC;AAE/D,SAAO,EAAE,QAAQ,YAAY;AAC/B;AAQA,SAAS,gBACP,OACA,QACA,aACQ;AACR,QAAM,WAAW,GAAG,MAAM,KAAK,IAAI,MAAM,QAAQ,EAAE,GAAG,YAAY;AAClE,MAAI,QAAQ;AACZ,aAAW,SAAS,QAAQ;AAC1B,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,eAAS,UAAU,cAAc,IAAI;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,uBACd,YACA,SACe;AACf,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,QAAQ,YAAY;AAGlC,QAAM,cAAc,QAAQ;AAAA,IAC1B,CAAC,MACC,EAAE,UAAU,WACZ,EAAE,MAAM,YAAY,MAAM,SACzB,EAAE,QAAQ,EAAE,KAAK,YAAY,MAAM;AAAA,EACxC;AACA,MAAI,YAAa,QAAO,YAAY;AAGpC,QAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM;AACxC,UAAM,QAAQ,EAAE,MAAM,YAAY;AAClC,UAAM,WAAW,EAAE,QAAQ,IAAI,YAAY;AAC3C,WACE,MAAM,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK;AAAA,EAE5E,CAAC;AACD,MAAI,cAAe,QAAO,cAAc;AAGxC,QAAM,EAAE,QAAQ,YAAY,IAAI,wBAAwB,OAAO;AAC/D,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,YAAgC;AACpC,MAAI,YAAY;AAChB,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,gBAAgB,OAAO,QAAQ,WAAW;AACxD,QAAI,IAAI,UAAU,CAAC,aAAa,YAAY,QAAQ;AAClD,kBAAY;AACZ,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,WAAW,SAAS;AAC7B;","names":[]}
@@ -1,11 +1,5 @@
1
- interface ModeInfo {
2
- id: CodeExecutionMode;
3
- name: string;
4
- description: string;
5
- }
6
- declare const CODE_EXECUTION_MODES: readonly ["default", "acceptEdits", "plan", "bypassPermissions"];
7
- type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];
8
- declare function getAvailableModes(): ModeInfo[];
1
+ import { CodeExecutionMode } from '../../execution-mode.js';
2
+ export { CODE_EXECUTION_MODES, ModeInfo, getAvailableModes } from '../../execution-mode.js';
9
3
 
10
4
  declare const READ_TOOLS: Set<string>;
11
5
  declare const WRITE_TOOLS: Set<string>;
@@ -15,4 +9,4 @@ declare const WEB_TOOLS: Set<string>;
15
9
  declare const AGENT_TOOLS: Set<string>;
16
10
  declare function isToolAllowedForMode(toolName: string, mode: CodeExecutionMode): boolean;
17
11
 
18
- export { AGENT_TOOLS, BASH_TOOLS, CODE_EXECUTION_MODES, type CodeExecutionMode, type ModeInfo, READ_TOOLS, SEARCH_TOOLS, WEB_TOOLS, WRITE_TOOLS, getAvailableModes, isToolAllowedForMode };
12
+ export { AGENT_TOOLS, BASH_TOOLS, CodeExecutionMode, READ_TOOLS, SEARCH_TOOLS, WEB_TOOLS, WRITE_TOOLS, isToolAllowedForMode };
package/dist/agent.js CHANGED
@@ -371,7 +371,7 @@ import { v7 as uuidv7 } from "uuid";
371
371
  // package.json
372
372
  var package_default = {
373
373
  name: "@posthog/agent",
374
- version: "2.3.137",
374
+ version: "2.3.144",
375
375
  repository: "https://github.com/PostHog/code",
376
376
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
377
377
  exports: {
@@ -415,6 +415,14 @@ var package_default = {
415
415
  types: "./dist/adapters/claude/session/jsonl-hydration.d.ts",
416
416
  import: "./dist/adapters/claude/session/jsonl-hydration.js"
417
417
  },
418
+ "./adapters/claude/session/models": {
419
+ types: "./dist/adapters/claude/session/models.d.ts",
420
+ import: "./dist/adapters/claude/session/models.js"
421
+ },
422
+ "./execution-mode": {
423
+ types: "./dist/execution-mode.d.ts",
424
+ import: "./dist/execution-mode.js"
425
+ },
418
426
  "./server": {
419
427
  types: "./dist/server/agent-server.d.ts",
420
428
  import: "./dist/server/agent-server.js"