@posthog/agent 2.3.465 → 2.3.474

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.
@@ -1,7 +1,11 @@
1
+ import { SessionConfigOption } from '@agentclientprotocol/sdk';
2
+
1
3
  interface ReasoningEffortOption {
2
4
  value: string;
3
5
  name: string;
4
6
  }
5
7
  declare function getReasoningEffortOptions(_modelId: string): ReasoningEffortOption[];
8
+ declare function formatCodexModelName(value: string): string;
9
+ declare function normalizeCodexConfigOptions(configOptions: SessionConfigOption[] | null | undefined): SessionConfigOption[] | null | undefined;
6
10
 
7
- export { getReasoningEffortOptions };
11
+ export { formatCodexModelName, getReasoningEffortOptions, normalizeCodexConfigOptions };
@@ -7,7 +7,41 @@ var CODEX_REASONING_EFFORT_OPTIONS = [
7
7
  function getReasoningEffortOptions(_modelId) {
8
8
  return CODEX_REASONING_EFFORT_OPTIONS;
9
9
  }
10
+ var CODEX_ACRONYMS = {
11
+ gpt: "GPT"
12
+ };
13
+ function formatCodexModelName(value) {
14
+ const normalized = value.replace(/(\d)-(\d)/g, "$1.$2");
15
+ return normalized.split("-").map((part) => {
16
+ const lower = part.toLowerCase();
17
+ if (CODEX_ACRONYMS[lower]) return CODEX_ACRONYMS[lower];
18
+ if (/^[0-9.]+$/.test(part)) return part;
19
+ return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
20
+ }).join("-");
21
+ }
22
+ function normalizeCodexConfigOptions(configOptions) {
23
+ if (!configOptions) return configOptions;
24
+ const formatOption = (opt) => ({
25
+ ...opt,
26
+ name: formatCodexModelName(opt.value)
27
+ });
28
+ return configOptions.map((option) => {
29
+ if (option.category !== "model" || option.type !== "select") return option;
30
+ const options = option.options;
31
+ if (options.length === 0) return option;
32
+ const isGroup = "group" in options[0];
33
+ return {
34
+ ...option,
35
+ options: isGroup ? options.map((group) => ({
36
+ ...group,
37
+ options: group.options.map(formatOption)
38
+ })) : options.map(formatOption)
39
+ };
40
+ });
41
+ }
10
42
  export {
11
- getReasoningEffortOptions
43
+ formatCodexModelName,
44
+ getReasoningEffortOptions,
45
+ normalizeCodexConfigOptions
12
46
  };
13
47
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/codex/models.ts"],"sourcesContent":["interface ReasoningEffortOption {\n value: string;\n name: string;\n}\n\nconst CODEX_REASONING_EFFORT_OPTIONS: ReasoningEffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n];\n\nexport function getReasoningEffortOptions(\n _modelId: string,\n): ReasoningEffortOption[] {\n return CODEX_REASONING_EFFORT_OPTIONS;\n}\n"],"mappings":";AAKA,IAAM,iCAA0D;AAAA,EAC9D,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,EAC5B,EAAE,OAAO,UAAU,MAAM,SAAS;AAAA,EAClC,EAAE,OAAO,QAAQ,MAAM,OAAO;AAChC;AAEO,SAAS,0BACd,UACyB;AACzB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/adapters/codex/models.ts"],"sourcesContent":["import type {\n SessionConfigOption,\n SessionConfigSelectGroup,\n SessionConfigSelectOption,\n} from \"@agentclientprotocol/sdk\";\n\ninterface ReasoningEffortOption {\n value: string;\n name: string;\n}\n\nconst CODEX_REASONING_EFFORT_OPTIONS: ReasoningEffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n];\n\nexport function getReasoningEffortOptions(\n _modelId: string,\n): ReasoningEffortOption[] {\n return CODEX_REASONING_EFFORT_OPTIONS;\n}\n\nconst CODEX_ACRONYMS: Record<string, string> = {\n gpt: \"GPT\",\n};\n\nexport function formatCodexModelName(value: string): string {\n const normalized = value.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n return normalized\n .split(\"-\")\n .map((part) => {\n const lower = part.toLowerCase();\n if (CODEX_ACRONYMS[lower]) return CODEX_ACRONYMS[lower];\n if (/^[0-9.]+$/.test(part)) return part;\n return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();\n })\n .join(\"-\");\n}\n\nexport function normalizeCodexConfigOptions(\n configOptions: SessionConfigOption[] | null | undefined,\n): SessionConfigOption[] | null | undefined {\n if (!configOptions) return configOptions;\n const formatOption = (\n opt: SessionConfigSelectOption,\n ): SessionConfigSelectOption => ({\n ...opt,\n name: formatCodexModelName(opt.value),\n });\n return configOptions.map((option) => {\n if (option.category !== \"model\" || option.type !== \"select\") return option;\n const options = option.options;\n if (options.length === 0) return option;\n const isGroup = \"group\" in options[0];\n return {\n ...option,\n options: isGroup\n ? (options as SessionConfigSelectGroup[]).map((group) => ({\n ...group,\n options: group.options.map(formatOption),\n }))\n : (options as SessionConfigSelectOption[]).map(formatOption),\n } as SessionConfigOption;\n });\n}\n"],"mappings":";AAWA,IAAM,iCAA0D;AAAA,EAC9D,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,EAC5B,EAAE,OAAO,UAAU,MAAM,SAAS;AAAA,EAClC,EAAE,OAAO,QAAQ,MAAM,OAAO;AAChC;AAEO,SAAS,0BACd,UACyB;AACzB,SAAO;AACT;AAEA,IAAM,iBAAyC;AAAA,EAC7C,KAAK;AACP;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,QAAM,aAAa,MAAM,QAAQ,cAAc,OAAO;AACtD,SAAO,WACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,eAAe,KAAK,EAAG,QAAO,eAAe,KAAK;AACtD,QAAI,YAAY,KAAK,IAAI,EAAG,QAAO;AACnC,WAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EAClE,CAAC,EACA,KAAK,GAAG;AACb;AAEO,SAAS,4BACd,eAC0C;AAC1C,MAAI,CAAC,cAAe,QAAO;AAC3B,QAAM,eAAe,CACnB,SAC+B;AAAA,IAC/B,GAAG;AAAA,IACH,MAAM,qBAAqB,IAAI,KAAK;AAAA,EACtC;AACA,SAAO,cAAc,IAAI,CAAC,WAAW;AACnC,QAAI,OAAO,aAAa,WAAW,OAAO,SAAS,SAAU,QAAO;AACpE,UAAM,UAAU,OAAO;AACvB,QAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,UAAM,UAAU,WAAW,QAAQ,CAAC;AACpC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,UACJ,QAAuC,IAAI,CAAC,WAAW;AAAA,QACtD,GAAG;AAAA,QACH,SAAS,MAAM,QAAQ,IAAI,YAAY;AAAA,MACzC,EAAE,IACD,QAAwC,IAAI,YAAY;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/claude/session/models.ts","../../src/adapters/codex/models.ts","../../src/adapters/reasoning-effort.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-opus-4-7\": \"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-opus-4-7\",\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-opus-4-7\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_XHIGH_EFFORT = new Set([\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsXhighEffort(modelId: string): boolean {\n return MODELS_WITH_XHIGH_EFFORT.has(modelId);\n}\n\nconst MODELS_TO_EXCLUDE_MCP_TOOLS = new Set([\"claude-haiku-4-5\"]);\n\nexport function supportsMcpInjection(modelId: string): boolean {\n return !MODELS_TO_EXCLUDE_MCP_TOOLS.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 (supportsXhighEffort(modelId)) {\n options.push(\n { value: \"xhigh\", name: \"Extra High\" },\n { value: \"max\", name: \"Max\" },\n );\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","interface ReasoningEffortOption {\n value: string;\n name: string;\n}\n\nconst CODEX_REASONING_EFFORT_OPTIONS: ReasoningEffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n];\n\nexport function getReasoningEffortOptions(\n _modelId: string,\n): ReasoningEffortOption[] {\n return CODEX_REASONING_EFFORT_OPTIONS;\n}\n","import { getEffortOptions as getClaudeEffortOptions } from \"./claude/session/models\";\nimport { getReasoningEffortOptions as getCodexReasoningEffortOptions } from \"./codex/models\";\n\nexport type RuntimeAdapter = \"claude\" | \"codex\";\n\nexport type SupportedReasoningEffort =\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\";\n\nexport interface ReasoningEffortOption {\n value: SupportedReasoningEffort;\n name: string;\n}\n\nexport function getReasoningEffortOptions(\n adapter: RuntimeAdapter,\n modelId: string,\n): ReasoningEffortOption[] | null {\n const options =\n adapter === \"codex\"\n ? getCodexReasoningEffortOptions(modelId)\n : getClaudeEffortOptions(modelId);\n\n return options as ReasoningEffortOption[] | null;\n}\n\nexport function isSupportedReasoningEffort(\n adapter: RuntimeAdapter,\n modelId: string,\n value: string,\n): value is SupportedReasoningEffort {\n return (\n getReasoningEffortOptions(adapter, modelId)?.some(\n (option) => option.value === value,\n ) ?? false\n );\n}\n"],"mappings":";AAyBA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AACF,CAAC;AAEM,SAAS,eAAe,SAA0B;AACvD,SAAO,mBAAmB,IAAI,OAAO;AACvC;AAEO,SAAS,oBAAoB,SAA0B;AAC5D,SAAO,yBAAyB,IAAI,OAAO;AAC7C;AAaO,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,oBAAoB,OAAO,GAAG;AAChC,YAAQ;AAAA,MACN,EAAE,OAAO,SAAS,MAAM,aAAa;AAAA,MACrC,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;;;ACpEA,IAAM,iCAA0D;AAAA,EAC9D,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,EAC5B,EAAE,OAAO,UAAU,MAAM,SAAS;AAAA,EAClC,EAAE,OAAO,QAAQ,MAAM,OAAO;AAChC;AAEO,SAAS,0BACd,UACyB;AACzB,SAAO;AACT;;;ACEO,SAASA,2BACd,SACA,SACgC;AAChC,QAAM,UACJ,YAAY,UACR,0BAA+B,OAAO,IACtC,iBAAuB,OAAO;AAEpC,SAAO;AACT;AAEO,SAAS,2BACd,SACA,SACA,OACmC;AACnC,SACEA,2BAA0B,SAAS,OAAO,GAAG;AAAA,IAC3C,CAAC,WAAW,OAAO,UAAU;AAAA,EAC/B,KAAK;AAET;","names":["getReasoningEffortOptions"]}
1
+ {"version":3,"sources":["../../src/adapters/claude/session/models.ts","../../src/adapters/codex/models.ts","../../src/adapters/reasoning-effort.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-opus-4-7\": \"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-opus-4-7\",\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-opus-4-7\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_XHIGH_EFFORT = new Set([\n \"claude-opus-4-6\",\n \"claude-opus-4-7\",\n]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsXhighEffort(modelId: string): boolean {\n return MODELS_WITH_XHIGH_EFFORT.has(modelId);\n}\n\nconst MODELS_TO_EXCLUDE_MCP_TOOLS = new Set([\"claude-haiku-4-5\"]);\n\nexport function supportsMcpInjection(modelId: string): boolean {\n return !MODELS_TO_EXCLUDE_MCP_TOOLS.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 (supportsXhighEffort(modelId)) {\n options.push(\n { value: \"xhigh\", name: \"Extra High\" },\n { value: \"max\", name: \"Max\" },\n );\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","import type {\n SessionConfigOption,\n SessionConfigSelectGroup,\n SessionConfigSelectOption,\n} from \"@agentclientprotocol/sdk\";\n\ninterface ReasoningEffortOption {\n value: string;\n name: string;\n}\n\nconst CODEX_REASONING_EFFORT_OPTIONS: ReasoningEffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n];\n\nexport function getReasoningEffortOptions(\n _modelId: string,\n): ReasoningEffortOption[] {\n return CODEX_REASONING_EFFORT_OPTIONS;\n}\n\nconst CODEX_ACRONYMS: Record<string, string> = {\n gpt: \"GPT\",\n};\n\nexport function formatCodexModelName(value: string): string {\n const normalized = value.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n return normalized\n .split(\"-\")\n .map((part) => {\n const lower = part.toLowerCase();\n if (CODEX_ACRONYMS[lower]) return CODEX_ACRONYMS[lower];\n if (/^[0-9.]+$/.test(part)) return part;\n return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();\n })\n .join(\"-\");\n}\n\nexport function normalizeCodexConfigOptions(\n configOptions: SessionConfigOption[] | null | undefined,\n): SessionConfigOption[] | null | undefined {\n if (!configOptions) return configOptions;\n const formatOption = (\n opt: SessionConfigSelectOption,\n ): SessionConfigSelectOption => ({\n ...opt,\n name: formatCodexModelName(opt.value),\n });\n return configOptions.map((option) => {\n if (option.category !== \"model\" || option.type !== \"select\") return option;\n const options = option.options;\n if (options.length === 0) return option;\n const isGroup = \"group\" in options[0];\n return {\n ...option,\n options: isGroup\n ? (options as SessionConfigSelectGroup[]).map((group) => ({\n ...group,\n options: group.options.map(formatOption),\n }))\n : (options as SessionConfigSelectOption[]).map(formatOption),\n } as SessionConfigOption;\n });\n}\n","import { getEffortOptions as getClaudeEffortOptions } from \"./claude/session/models\";\nimport { getReasoningEffortOptions as getCodexReasoningEffortOptions } from \"./codex/models\";\n\nexport type RuntimeAdapter = \"claude\" | \"codex\";\n\nexport type SupportedReasoningEffort =\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"xhigh\"\n | \"max\";\n\nexport interface ReasoningEffortOption {\n value: SupportedReasoningEffort;\n name: string;\n}\n\nexport function getReasoningEffortOptions(\n adapter: RuntimeAdapter,\n modelId: string,\n): ReasoningEffortOption[] | null {\n const options =\n adapter === \"codex\"\n ? getCodexReasoningEffortOptions(modelId)\n : getClaudeEffortOptions(modelId);\n\n return options as ReasoningEffortOption[] | null;\n}\n\nexport function isSupportedReasoningEffort(\n adapter: RuntimeAdapter,\n modelId: string,\n value: string,\n): value is SupportedReasoningEffort {\n return (\n getReasoningEffortOptions(adapter, modelId)?.some(\n (option) => option.value === value,\n ) ?? false\n );\n}\n"],"mappings":";AAyBA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AACF,CAAC;AAEM,SAAS,eAAe,SAA0B;AACvD,SAAO,mBAAmB,IAAI,OAAO;AACvC;AAEO,SAAS,oBAAoB,SAA0B;AAC5D,SAAO,yBAAyB,IAAI,OAAO;AAC7C;AAaO,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,oBAAoB,OAAO,GAAG;AAChC,YAAQ;AAAA,MACN,EAAE,OAAO,SAAS,MAAM,aAAa;AAAA,MACrC,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;;;AC9DA,IAAM,iCAA0D;AAAA,EAC9D,EAAE,OAAO,OAAO,MAAM,MAAM;AAAA,EAC5B,EAAE,OAAO,UAAU,MAAM,SAAS;AAAA,EAClC,EAAE,OAAO,QAAQ,MAAM,OAAO;AAChC;AAEO,SAAS,0BACd,UACyB;AACzB,SAAO;AACT;;;ACJO,SAASA,2BACd,SACA,SACgC;AAChC,QAAM,UACJ,YAAY,UACR,0BAA+B,OAAO,IACtC,iBAAuB,OAAO;AAEpC,SAAO;AACT;AAEO,SAAS,2BACd,SACA,SACA,OACmC;AACnC,SACEA,2BAA0B,SAAS,OAAO,GAAG;AAAA,IAC3C,CAAC,WAAW,OAAO,UAAU;AAAA,EAC/B,KAAK;AAET;","names":["getReasoningEffortOptions"]}
package/dist/agent.js CHANGED
@@ -4030,7 +4030,7 @@ import { v7 as uuidv7 } from "uuid";
4030
4030
  // package.json
4031
4031
  var package_default = {
4032
4032
  name: "@posthog/agent",
4033
- version: "2.3.465",
4033
+ version: "2.3.474",
4034
4034
  repository: "https://github.com/PostHog/code",
4035
4035
  description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
4036
4036
  exports: {
@@ -10993,6 +10993,8 @@ var BRANCH_NAMING = `
10993
10993
  # Branch Naming
10994
10994
 
10995
10995
  When working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.
10996
+
10997
+ When creating a new branch, prefix it with \`posthog-code/\` (e.g. \`posthog-code/fix-login-redirect\`).
10996
10998
  `;
10997
10999
  var PLAN_MODE = `
10998
11000
  # Plan Mode
@@ -17686,6 +17688,40 @@ function createCodexClient(upstreamClient, logger, sessionState, callbacks) {
17686
17688
  };
17687
17689
  }
17688
17690
 
17691
+ // src/adapters/codex/models.ts
17692
+ var CODEX_ACRONYMS = {
17693
+ gpt: "GPT"
17694
+ };
17695
+ function formatCodexModelName(value) {
17696
+ const normalized = value.replace(/(\d)-(\d)/g, "$1.$2");
17697
+ return normalized.split("-").map((part) => {
17698
+ const lower = part.toLowerCase();
17699
+ if (CODEX_ACRONYMS[lower]) return CODEX_ACRONYMS[lower];
17700
+ if (/^[0-9.]+$/.test(part)) return part;
17701
+ return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
17702
+ }).join("-");
17703
+ }
17704
+ function normalizeCodexConfigOptions(configOptions) {
17705
+ if (!configOptions) return configOptions;
17706
+ const formatOption = (opt) => ({
17707
+ ...opt,
17708
+ name: formatCodexModelName(opt.value)
17709
+ });
17710
+ return configOptions.map((option) => {
17711
+ if (option.category !== "model" || option.type !== "select") return option;
17712
+ const options = option.options;
17713
+ if (options.length === 0) return option;
17714
+ const isGroup = "group" in options[0];
17715
+ return {
17716
+ ...option,
17717
+ options: isGroup ? options.map((group) => ({
17718
+ ...group,
17719
+ options: group.options.map(formatOption)
17720
+ })) : options.map(formatOption)
17721
+ };
17722
+ });
17723
+ }
17724
+
17689
17725
  // src/adapters/codex/session-state.ts
17690
17726
  function createSessionState(sessionId, cwd, opts) {
17691
17727
  return {
@@ -18018,6 +18054,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18018
18054
  const meta = params._meta;
18019
18055
  const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);
18020
18056
  const response = await this.codexConnection.newSession(params);
18057
+ response.configOptions = normalizeCodexConfigOptions(
18058
+ response.configOptions
18059
+ );
18021
18060
  this.sessionState = createSessionState(response.sessionId, params.cwd, {
18022
18061
  taskRunId: meta?.taskRunId,
18023
18062
  taskId: meta?.taskId ?? meta?.persistence?.taskId,
@@ -18047,6 +18086,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18047
18086
  }
18048
18087
  async loadSession(params) {
18049
18088
  const response = await this.codexConnection.loadSession(params);
18089
+ response.configOptions = normalizeCodexConfigOptions(
18090
+ response.configOptions
18091
+ );
18050
18092
  const meta = params._meta;
18051
18093
  const currentPermissionMode = getCurrentPermissionMode(
18052
18094
  response.modes?.currentModeId,
@@ -18075,6 +18117,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18075
18117
  cwd: params.cwd,
18076
18118
  mcpServers: params.mcpServers ?? []
18077
18119
  });
18120
+ loadResponse.configOptions = normalizeCodexConfigOptions(
18121
+ loadResponse.configOptions
18122
+ );
18078
18123
  const meta = params._meta;
18079
18124
  const currentPermissionMode = getCurrentPermissionMode(
18080
18125
  loadResponse.modes?.currentModeId,
@@ -18107,6 +18152,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18107
18152
  mcpServers: params.mcpServers ?? [],
18108
18153
  _meta: params._meta
18109
18154
  });
18155
+ newResponse.configOptions = normalizeCodexConfigOptions(
18156
+ newResponse.configOptions
18157
+ );
18110
18158
  const meta = params._meta;
18111
18159
  const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);
18112
18160
  this.sessionState = createSessionState(newResponse.sessionId, params.cwd, {
@@ -18314,6 +18362,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18314
18362
  async setSessionConfigOption(params) {
18315
18363
  const response = await this.codexConnection.setSessionConfigOption(params);
18316
18364
  if (response.configOptions) {
18365
+ response.configOptions = normalizeCodexConfigOptions(
18366
+ response.configOptions
18367
+ );
18317
18368
  this.sessionState.configOptions = response.configOptions;
18318
18369
  }
18319
18370
  if (params.configId === "mode" && typeof params.value === "string") {