@posthog/agent 2.3.465 → 2.3.466

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.466",
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: {
@@ -17686,6 +17686,40 @@ function createCodexClient(upstreamClient, logger, sessionState, callbacks) {
17686
17686
  };
17687
17687
  }
17688
17688
 
17689
+ // src/adapters/codex/models.ts
17690
+ var CODEX_ACRONYMS = {
17691
+ gpt: "GPT"
17692
+ };
17693
+ function formatCodexModelName(value) {
17694
+ const normalized = value.replace(/(\d)-(\d)/g, "$1.$2");
17695
+ return normalized.split("-").map((part) => {
17696
+ const lower = part.toLowerCase();
17697
+ if (CODEX_ACRONYMS[lower]) return CODEX_ACRONYMS[lower];
17698
+ if (/^[0-9.]+$/.test(part)) return part;
17699
+ return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
17700
+ }).join("-");
17701
+ }
17702
+ function normalizeCodexConfigOptions(configOptions) {
17703
+ if (!configOptions) return configOptions;
17704
+ const formatOption = (opt) => ({
17705
+ ...opt,
17706
+ name: formatCodexModelName(opt.value)
17707
+ });
17708
+ return configOptions.map((option) => {
17709
+ if (option.category !== "model" || option.type !== "select") return option;
17710
+ const options = option.options;
17711
+ if (options.length === 0) return option;
17712
+ const isGroup = "group" in options[0];
17713
+ return {
17714
+ ...option,
17715
+ options: isGroup ? options.map((group) => ({
17716
+ ...group,
17717
+ options: group.options.map(formatOption)
17718
+ })) : options.map(formatOption)
17719
+ };
17720
+ });
17721
+ }
17722
+
17689
17723
  // src/adapters/codex/session-state.ts
17690
17724
  function createSessionState(sessionId, cwd, opts) {
17691
17725
  return {
@@ -18018,6 +18052,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18018
18052
  const meta = params._meta;
18019
18053
  const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);
18020
18054
  const response = await this.codexConnection.newSession(params);
18055
+ response.configOptions = normalizeCodexConfigOptions(
18056
+ response.configOptions
18057
+ );
18021
18058
  this.sessionState = createSessionState(response.sessionId, params.cwd, {
18022
18059
  taskRunId: meta?.taskRunId,
18023
18060
  taskId: meta?.taskId ?? meta?.persistence?.taskId,
@@ -18047,6 +18084,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18047
18084
  }
18048
18085
  async loadSession(params) {
18049
18086
  const response = await this.codexConnection.loadSession(params);
18087
+ response.configOptions = normalizeCodexConfigOptions(
18088
+ response.configOptions
18089
+ );
18050
18090
  const meta = params._meta;
18051
18091
  const currentPermissionMode = getCurrentPermissionMode(
18052
18092
  response.modes?.currentModeId,
@@ -18075,6 +18115,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18075
18115
  cwd: params.cwd,
18076
18116
  mcpServers: params.mcpServers ?? []
18077
18117
  });
18118
+ loadResponse.configOptions = normalizeCodexConfigOptions(
18119
+ loadResponse.configOptions
18120
+ );
18078
18121
  const meta = params._meta;
18079
18122
  const currentPermissionMode = getCurrentPermissionMode(
18080
18123
  loadResponse.modes?.currentModeId,
@@ -18107,6 +18150,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18107
18150
  mcpServers: params.mcpServers ?? [],
18108
18151
  _meta: params._meta
18109
18152
  });
18153
+ newResponse.configOptions = normalizeCodexConfigOptions(
18154
+ newResponse.configOptions
18155
+ );
18110
18156
  const meta = params._meta;
18111
18157
  const requestedPermissionMode = toCodexPermissionMode(meta?.permissionMode);
18112
18158
  this.sessionState = createSessionState(newResponse.sessionId, params.cwd, {
@@ -18314,6 +18360,9 @@ var CodexAcpAgent = class extends BaseAcpAgent {
18314
18360
  async setSessionConfigOption(params) {
18315
18361
  const response = await this.codexConnection.setSessionConfigOption(params);
18316
18362
  if (response.configOptions) {
18363
+ response.configOptions = normalizeCodexConfigOptions(
18364
+ response.configOptions
18365
+ );
18317
18366
  this.sessionState.configOptions = response.configOptions;
18318
18367
  }
18319
18368
  if (params.configId === "mode" && typeof params.value === "string") {