@posthog/agent 2.3.137 → 2.3.145
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/adapters/claude/session/models.d.ts +18 -0
- package/dist/adapters/claude/session/models.js +103 -0
- package/dist/adapters/claude/session/models.js.map +1 -0
- package/dist/adapters/claude/tools.d.ts +3 -9
- package/dist/agent.js +9 -1
- package/dist/agent.js.map +1 -1
- package/dist/execution-mode.d.ts +10 -0
- package/dist/execution-mode.js +49 -0
- package/dist/execution-mode.js.map +1 -0
- package/dist/gateway-models.d.ts +2 -1
- package/dist/gateway-models.js +8 -1
- package/dist/gateway-models.js.map +1 -1
- package/dist/posthog-api.js +9 -1
- package/dist/posthog-api.js.map +1 -1
- package/dist/server/agent-server.js +9 -1
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +9 -1
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +9 -1
- package/src/gateway-models.ts +7 -0
- package/src/sagas/test-fixtures.ts +1 -0
- package/src/test/fixtures/api.ts +1 -0
|
@@ -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":"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","names":[]}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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,
|
|
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.
|
|
374
|
+
version: "2.3.145",
|
|
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"
|