@posthog/agent 2.3.548 → 2.3.616
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/agent.js +105 -31
- package/dist/agent.js.map +1 -1
- package/dist/handoff-checkpoint.js +142 -117
- package/dist/handoff-checkpoint.js.map +1 -1
- package/dist/posthog-api.js +1 -1
- package/dist/posthog-api.js.map +1 -1
- package/dist/server/agent-server.d.ts +2 -1
- package/dist/server/agent-server.js +155 -68
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +166 -80
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +3 -3
- package/src/adapters/claude/conversion/sdk-to-acp.ts +1 -26
- package/src/adapters/claude/session/options.ts +8 -0
- package/src/adapters/codex/codex-agent.test.ts +83 -0
- package/src/adapters/codex/codex-agent.ts +16 -0
- package/src/adapters/error-classification.ts +30 -0
- package/src/server/agent-server.ts +17 -7
- package/src/server/question-relay.test.ts +67 -5
package/dist/posthog-api.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// package.json
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "@posthog/agent",
|
|
4
|
-
version: "2.3.
|
|
4
|
+
version: "2.3.616",
|
|
5
5
|
repository: "https://github.com/PostHog/code",
|
|
6
6
|
description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
|
|
7
7
|
exports: {
|
package/dist/posthog-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/utils/gateway.ts","../src/posthog-api.ts"],"sourcesContent":["{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.548\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./pr-url-detector\": {\n \"types\": \"./dist/pr-url-detector.d.ts\",\n \"import\": \"./dist/pr-url-detector.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./adapters/claude/session/models\": {\n \"types\": \"./dist/adapters/claude/session/models.d.ts\",\n \"import\": \"./dist/adapters/claude/session/models.js\"\n },\n \"./adapters/reasoning-effort\": {\n \"types\": \"./dist/adapters/reasoning-effort.d.ts\",\n \"import\": \"./dist/adapters/reasoning-effort.js\"\n },\n \"./adapters/claude/mcp/tool-metadata\": {\n \"types\": \"./dist/adapters/claude/mcp/tool-metadata.d.ts\",\n \"import\": \"./dist/adapters/claude/mcp/tool-metadata.js\"\n },\n \"./execution-mode\": {\n \"types\": \"./dist/execution-mode.d.ts\",\n \"import\": \"./dist/execution-mode.js\"\n },\n \"./resume\": {\n \"types\": \"./dist/resume.d.ts\",\n \"import\": \"./dist/resume.js\"\n },\n \"./handoff-checkpoint\": {\n \"types\": \"./dist/handoff-checkpoint.d.ts\",\n \"import\": \"./dist/handoff-checkpoint.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n },\n \"./server/schemas\": {\n \"types\": \"./dist/server/schemas.d.ts\",\n \"import\": \"./dist/server/schemas.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@posthog/enricher\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.19.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.112\",\n \"@anthropic-ai/sdk\": \"0.89.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"@modelcontextprotocol/sdk\": \"1.29.0\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^4.2.0\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nfunction getGatewayBaseUrl(posthogHost: string): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308`;\n }\n\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308`;\n }\n\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com`;\n}\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/${product}`;\n}\n\nexport function getGatewayUsageUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/v1/usage/${product}`;\n}\n\nexport function getGatewayInvalidatePlanCacheUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/v1/usage/${product}/invalidate-plan-cache`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport {\n getGatewayInvalidatePlanCacheUrl,\n getGatewayUsageUrl,\n getLlmGatewayUrl,\n} from \"./utils/gateway\";\n\nexport {\n getGatewayInvalidatePlanCacheUrl,\n getGatewayUsageUrl,\n getLlmGatewayUrl,\n};\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n> & {\n state_remove_keys?: string[];\n};\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private isAuthFailure(status: number): boolean {\n return status === 401 || status === 403;\n }\n\n private async resolveApiKey(forceRefresh = false): Promise<string> {\n if (forceRefresh && this.config.refreshApiKey) {\n return this.config.refreshApiKey();\n }\n\n return this.config.getApiKey();\n }\n\n private async buildHeaders(\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Headers> {\n const headers = new Headers(options.headers);\n headers.set(\n \"Authorization\",\n `Bearer ${await this.resolveApiKey(forceRefresh)}`,\n );\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"User-Agent\", this.config.userAgent ?? DEFAULT_USER_AGENT);\n return headers;\n }\n\n private async performRequest(\n endpoint: string,\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n\n return fetch(url, {\n ...options,\n headers: await this.buildHeaders(options, forceRefresh),\n });\n }\n\n private async performRequestWithRetry(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<Response> {\n let response = await this.performRequest(endpoint, options);\n\n if (!response.ok && this.isAuthFailure(response.status)) {\n response = await this.performRequest(endpoint, options, true);\n }\n\n return response;\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.performRequestWithRetry(endpoint, options);\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n async getApiKey(forceRefresh = false): Promise<string> {\n return this.resolveApiKey(forceRefresh);\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async resumeRunInCloud(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/resume_in_cloud/`,\n { method: \"POST\" },\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async setTaskRunOutput(\n taskId: string,\n runId: string,\n output: Record<string, unknown>,\n ): Promise<TaskRun> {\n return this.apiRequest(\n `/api/projects/${this.getTeamId()}/tasks/${taskId}/runs/${runId}/set_output/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(output),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n const manifest = response.artifacts ?? [];\n\n // The backend returns the full run artifact manifest after each upload.\n // Callers want the artifacts corresponding to this upload request only.\n return manifest.slice(-artifacts.length);\n }\n\n /**\n * Download artifact content by storage path\n * Streams the file through the PostHog backend so the sandbox does not need\n * direct access to object storage.\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const teamId = this.getTeamId();\n\n try {\n const response = await this.performRequestWithRetry(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/download/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n const endpoint = `/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`;\n\n try {\n const response = await this.performRequestWithRetry(endpoint);\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/utils/gateway.ts","../src/posthog-api.ts"],"sourcesContent":["{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.616\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./pr-url-detector\": {\n \"types\": \"./dist/pr-url-detector.d.ts\",\n \"import\": \"./dist/pr-url-detector.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./adapters/claude/session/models\": {\n \"types\": \"./dist/adapters/claude/session/models.d.ts\",\n \"import\": \"./dist/adapters/claude/session/models.js\"\n },\n \"./adapters/reasoning-effort\": {\n \"types\": \"./dist/adapters/reasoning-effort.d.ts\",\n \"import\": \"./dist/adapters/reasoning-effort.js\"\n },\n \"./adapters/claude/mcp/tool-metadata\": {\n \"types\": \"./dist/adapters/claude/mcp/tool-metadata.d.ts\",\n \"import\": \"./dist/adapters/claude/mcp/tool-metadata.js\"\n },\n \"./execution-mode\": {\n \"types\": \"./dist/execution-mode.d.ts\",\n \"import\": \"./dist/execution-mode.js\"\n },\n \"./resume\": {\n \"types\": \"./dist/resume.d.ts\",\n \"import\": \"./dist/resume.js\"\n },\n \"./handoff-checkpoint\": {\n \"types\": \"./dist/handoff-checkpoint.d.ts\",\n \"import\": \"./dist/handoff-checkpoint.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n },\n \"./server/schemas\": {\n \"types\": \"./dist/server/schemas.d.ts\",\n \"import\": \"./dist/server/schemas.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@posthog/enricher\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.19.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.112\",\n \"@anthropic-ai/sdk\": \"0.89.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"@modelcontextprotocol/sdk\": \"1.29.0\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^4.2.0\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nfunction getGatewayBaseUrl(posthogHost: string): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308`;\n }\n\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308`;\n }\n\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com`;\n}\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/${product}`;\n}\n\nexport function getGatewayUsageUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/v1/usage/${product}`;\n}\n\nexport function getGatewayInvalidatePlanCacheUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n return `${getGatewayBaseUrl(posthogHost)}/v1/usage/${product}/invalidate-plan-cache`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport {\n getGatewayInvalidatePlanCacheUrl,\n getGatewayUsageUrl,\n getLlmGatewayUrl,\n} from \"./utils/gateway\";\n\nexport {\n getGatewayInvalidatePlanCacheUrl,\n getGatewayUsageUrl,\n getLlmGatewayUrl,\n};\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n> & {\n state_remove_keys?: string[];\n};\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private isAuthFailure(status: number): boolean {\n return status === 401 || status === 403;\n }\n\n private async resolveApiKey(forceRefresh = false): Promise<string> {\n if (forceRefresh && this.config.refreshApiKey) {\n return this.config.refreshApiKey();\n }\n\n return this.config.getApiKey();\n }\n\n private async buildHeaders(\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Headers> {\n const headers = new Headers(options.headers);\n headers.set(\n \"Authorization\",\n `Bearer ${await this.resolveApiKey(forceRefresh)}`,\n );\n headers.set(\"Content-Type\", \"application/json\");\n headers.set(\"User-Agent\", this.config.userAgent ?? DEFAULT_USER_AGENT);\n return headers;\n }\n\n private async performRequest(\n endpoint: string,\n options: RequestInit,\n forceRefresh = false,\n ): Promise<Response> {\n const url = `${this.baseUrl}${endpoint}`;\n\n return fetch(url, {\n ...options,\n headers: await this.buildHeaders(options, forceRefresh),\n });\n }\n\n private async performRequestWithRetry(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<Response> {\n let response = await this.performRequest(endpoint, options);\n\n if (!response.ok && this.isAuthFailure(response.status)) {\n response = await this.performRequest(endpoint, options, true);\n }\n\n return response;\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const response = await this.performRequestWithRetry(endpoint, options);\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n async getApiKey(forceRefresh = false): Promise<string> {\n return this.resolveApiKey(forceRefresh);\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async resumeRunInCloud(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/resume_in_cloud/`,\n { method: \"POST\" },\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async setTaskRunOutput(\n taskId: string,\n runId: string,\n output: Record<string, unknown>,\n ): Promise<TaskRun> {\n return this.apiRequest(\n `/api/projects/${this.getTeamId()}/tasks/${taskId}/runs/${runId}/set_output/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(output),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n const manifest = response.artifacts ?? [];\n\n // The backend returns the full run artifact manifest after each upload.\n // Callers want the artifacts corresponding to this upload request only.\n return manifest.slice(-artifacts.length);\n }\n\n /**\n * Download artifact content by storage path\n * Streams the file through the PostHog backend so the sandbox does not need\n * direct access to object storage.\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const teamId = this.getTeamId();\n\n try {\n const response = await this.performRequestWithRetry(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/download/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n const endpoint = `/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`;\n\n try {\n const response = await this.performRequestWithRetry(endpoint);\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -35,6 +35,7 @@ interface AgentServerConfig {
|
|
|
35
35
|
reasoningEffort?: "low" | "medium" | "high" | "xhigh" | "max";
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
declare const UPSTREAM_PROVIDER_FAILURE_MESSAGE = "The upstream AI provider failed to process the request. Please retry the task in a few minutes.";
|
|
38
39
|
declare const SSE_KEEPALIVE_INTERVAL_MS = 25000;
|
|
39
40
|
declare class AgentServer {
|
|
40
41
|
private config;
|
|
@@ -122,4 +123,4 @@ declare class AgentServer {
|
|
|
122
123
|
private resolvePermission;
|
|
123
124
|
}
|
|
124
125
|
|
|
125
|
-
export { AgentServer, SSE_KEEPALIVE_INTERVAL_MS };
|
|
126
|
+
export { AgentServer, SSE_KEEPALIVE_INTERVAL_MS, UPSTREAM_PROVIDER_FAILURE_MESSAGE };
|
|
@@ -3795,6 +3795,7 @@ import {
|
|
|
3795
3795
|
import { serve } from "@hono/node-server";
|
|
3796
3796
|
|
|
3797
3797
|
// ../git/dist/queries.js
|
|
3798
|
+
import { createReadStream } from "fs";
|
|
3798
3799
|
import * as fs3 from "fs/promises";
|
|
3799
3800
|
import * as path2 from "path";
|
|
3800
3801
|
|
|
@@ -8346,13 +8347,20 @@ init_git_response_error();
|
|
|
8346
8347
|
var simpleGit = gitInstanceFactory;
|
|
8347
8348
|
|
|
8348
8349
|
// ../git/dist/client.js
|
|
8350
|
+
var PERFORMANCE_CONFIG = [
|
|
8351
|
+
"core.untrackedCache=true",
|
|
8352
|
+
"core.fsmonitor=true",
|
|
8353
|
+
"core.preloadIndex=true"
|
|
8354
|
+
];
|
|
8349
8355
|
function createGitClient(baseDir, options) {
|
|
8350
|
-
const { abortSignal: signal, ...rest } = options ?? {};
|
|
8356
|
+
const { abortSignal: signal, config: callerConfig, ...rest } = options ?? {};
|
|
8357
|
+
const config = callerConfig ? [...PERFORMANCE_CONFIG, ...callerConfig] : PERFORMANCE_CONFIG;
|
|
8351
8358
|
return simpleGit({
|
|
8352
8359
|
baseDir,
|
|
8353
8360
|
maxConcurrentProcesses: 6,
|
|
8354
8361
|
trimmed: true,
|
|
8355
8362
|
abort: signal,
|
|
8363
|
+
config,
|
|
8356
8364
|
...rest
|
|
8357
8365
|
});
|
|
8358
8366
|
}
|
|
@@ -8505,14 +8513,18 @@ var GitOperationManagerImpl = class _GitOperationManagerImpl {
|
|
|
8505
8513
|
}
|
|
8506
8514
|
async executeRead(repoPath, operation, options) {
|
|
8507
8515
|
const state = this.getRepoState(repoPath);
|
|
8516
|
+
const env = {
|
|
8517
|
+
...getCleanEnv(),
|
|
8518
|
+
GIT_OPTIONAL_LOCKS: "0",
|
|
8519
|
+
...options?.env
|
|
8520
|
+
};
|
|
8508
8521
|
if (options?.signal) {
|
|
8509
8522
|
const scopedGit = createGitClient(repoPath, {
|
|
8510
8523
|
abortSignal: options.signal
|
|
8511
8524
|
});
|
|
8512
|
-
return operation(scopedGit.env(
|
|
8525
|
+
return operation(scopedGit.env(env));
|
|
8513
8526
|
}
|
|
8514
|
-
|
|
8515
|
-
return operation(git);
|
|
8527
|
+
return operation(state.client.env(env));
|
|
8516
8528
|
}
|
|
8517
8529
|
async executeWrite(repoPath, operation, options) {
|
|
8518
8530
|
const state = this.getRepoState(repoPath);
|
|
@@ -8522,15 +8534,16 @@ var GitOperationManagerImpl = class _GitOperationManagerImpl {
|
|
|
8522
8534
|
throw new Error(`Git repository is locked: ${repoPath}`);
|
|
8523
8535
|
}
|
|
8524
8536
|
}
|
|
8537
|
+
const env = { ...getCleanEnv(), ...options?.env };
|
|
8525
8538
|
await state.lock.acquireWrite();
|
|
8526
8539
|
try {
|
|
8527
8540
|
if (options?.signal) {
|
|
8528
8541
|
const scopedGit = createGitClient(repoPath, {
|
|
8529
8542
|
abortSignal: options.signal
|
|
8530
8543
|
});
|
|
8531
|
-
return await operation(scopedGit.env(
|
|
8544
|
+
return await operation(scopedGit.env(env));
|
|
8532
8545
|
}
|
|
8533
|
-
return await operation(state.client.env(
|
|
8546
|
+
return await operation(state.client.env(env));
|
|
8534
8547
|
} catch (error) {
|
|
8535
8548
|
if (options?.signal?.aborted) {
|
|
8536
8549
|
await removeLock(repoPath).catch(() => {
|
|
@@ -8557,6 +8570,9 @@ function getGitOperationManager() {
|
|
|
8557
8570
|
return instance2;
|
|
8558
8571
|
}
|
|
8559
8572
|
|
|
8573
|
+
// ../git/dist/status-stream.js
|
|
8574
|
+
import { spawn as spawn2 } from "child_process";
|
|
8575
|
+
|
|
8560
8576
|
// ../git/dist/queries.js
|
|
8561
8577
|
async function getCurrentBranch(baseDir, options) {
|
|
8562
8578
|
const manager = getGitOperationManager();
|
|
@@ -8591,6 +8607,44 @@ async function listWorktrees(baseDir, options) {
|
|
|
8591
8607
|
return worktrees;
|
|
8592
8608
|
}, { signal: options?.abortSignal });
|
|
8593
8609
|
}
|
|
8610
|
+
async function inspectGitBusyState(git) {
|
|
8611
|
+
const toplevel = (await git.raw(["rev-parse", "--show-toplevel"])).trim();
|
|
8612
|
+
const resolveGitPath = async (gitPath) => {
|
|
8613
|
+
const relative = (await git.raw(["rev-parse", "--git-path", gitPath])).trim();
|
|
8614
|
+
return path2.isAbsolute(relative) ? relative : path2.resolve(toplevel, relative);
|
|
8615
|
+
};
|
|
8616
|
+
const pathExists = async (gitPath) => {
|
|
8617
|
+
const resolved = await resolveGitPath(gitPath);
|
|
8618
|
+
try {
|
|
8619
|
+
await fs3.access(resolved);
|
|
8620
|
+
return true;
|
|
8621
|
+
} catch {
|
|
8622
|
+
return false;
|
|
8623
|
+
}
|
|
8624
|
+
};
|
|
8625
|
+
const dirExists = async (gitPath) => {
|
|
8626
|
+
const resolved = await resolveGitPath(gitPath);
|
|
8627
|
+
try {
|
|
8628
|
+
const stat4 = await fs3.stat(resolved);
|
|
8629
|
+
return stat4.isDirectory();
|
|
8630
|
+
} catch {
|
|
8631
|
+
return false;
|
|
8632
|
+
}
|
|
8633
|
+
};
|
|
8634
|
+
if (await dirExists("rebase-merge") || await dirExists("rebase-apply")) {
|
|
8635
|
+
return { busy: true, operation: "rebase" };
|
|
8636
|
+
}
|
|
8637
|
+
if (await pathExists("MERGE_HEAD")) {
|
|
8638
|
+
return { busy: true, operation: "merge" };
|
|
8639
|
+
}
|
|
8640
|
+
if (await pathExists("CHERRY_PICK_HEAD")) {
|
|
8641
|
+
return { busy: true, operation: "cherry-pick" };
|
|
8642
|
+
}
|
|
8643
|
+
if (await pathExists("REVERT_HEAD")) {
|
|
8644
|
+
return { busy: true, operation: "revert" };
|
|
8645
|
+
}
|
|
8646
|
+
return { busy: false };
|
|
8647
|
+
}
|
|
8594
8648
|
|
|
8595
8649
|
// src/server/agent-server.ts
|
|
8596
8650
|
import { Hono } from "hono";
|
|
@@ -8599,7 +8653,7 @@ import { z as z4 } from "zod";
|
|
|
8599
8653
|
// package.json
|
|
8600
8654
|
var package_default = {
|
|
8601
8655
|
name: "@posthog/agent",
|
|
8602
|
-
version: "2.3.
|
|
8656
|
+
version: "2.3.616",
|
|
8603
8657
|
repository: "https://github.com/PostHog/code",
|
|
8604
8658
|
description: "TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog",
|
|
8605
8659
|
exports: {
|
|
@@ -11071,6 +11125,7 @@ var ParserManager = class {
|
|
|
11071
11125
|
languages = /* @__PURE__ */ new Map();
|
|
11072
11126
|
languageKeys = /* @__PURE__ */ new WeakMap();
|
|
11073
11127
|
queryCache = /* @__PURE__ */ new Map();
|
|
11128
|
+
failedQueries = /* @__PURE__ */ new Set();
|
|
11074
11129
|
maxCacheSize = 256;
|
|
11075
11130
|
initPromise = null;
|
|
11076
11131
|
wasmDir = resolveGrammarsDir();
|
|
@@ -11078,6 +11133,7 @@ var ParserManager = class {
|
|
|
11078
11133
|
updateConfig(config) {
|
|
11079
11134
|
this.config = config;
|
|
11080
11135
|
this.queryCache.clear();
|
|
11136
|
+
this.failedQueries.clear();
|
|
11081
11137
|
}
|
|
11082
11138
|
async ensureInitialized() {
|
|
11083
11139
|
if (!this.initPromise) {
|
|
@@ -11139,6 +11195,9 @@ var ParserManager = class {
|
|
|
11139
11195
|
}
|
|
11140
11196
|
const langKey = this.languageKeys.get(lang) ?? lang.toString();
|
|
11141
11197
|
const cacheKey = `${langKey}:${queryStr}`;
|
|
11198
|
+
if (this.failedQueries.has(cacheKey)) {
|
|
11199
|
+
return null;
|
|
11200
|
+
}
|
|
11142
11201
|
let query2 = this.queryCache.get(cacheKey);
|
|
11143
11202
|
if (query2) {
|
|
11144
11203
|
this.queryCache.delete(cacheKey);
|
|
@@ -11155,8 +11214,8 @@ var ParserManager = class {
|
|
|
11155
11214
|
}
|
|
11156
11215
|
this.queryCache.set(cacheKey, query2);
|
|
11157
11216
|
return query2;
|
|
11158
|
-
} catch
|
|
11159
|
-
|
|
11217
|
+
} catch {
|
|
11218
|
+
this.failedQueries.add(cacheKey);
|
|
11160
11219
|
return null;
|
|
11161
11220
|
}
|
|
11162
11221
|
}
|
|
@@ -11167,6 +11226,7 @@ var ParserManager = class {
|
|
|
11167
11226
|
this.languages.clear();
|
|
11168
11227
|
this.languageKeys = /* @__PURE__ */ new WeakMap();
|
|
11169
11228
|
this.queryCache.clear();
|
|
11229
|
+
this.failedQueries.clear();
|
|
11170
11230
|
}
|
|
11171
11231
|
};
|
|
11172
11232
|
async function findVariantBranches(pm, source, languageId) {
|
|
@@ -12692,6 +12752,33 @@ var PostHogApi = class {
|
|
|
12692
12752
|
);
|
|
12693
12753
|
return data.results.filter((f) => !f.deleted);
|
|
12694
12754
|
}
|
|
12755
|
+
// Keys absent from the returned map have NOT been called in the window.
|
|
12756
|
+
async getFlagLastCalled(flagKeys, daysBack = 30) {
|
|
12757
|
+
if (flagKeys.length === 0) return /* @__PURE__ */ new Map();
|
|
12758
|
+
const days = Math.max(1, Math.min(365, Math.floor(daysBack)));
|
|
12759
|
+
const query2 = `
|
|
12760
|
+
SELECT
|
|
12761
|
+
properties.$feature_flag AS flag_key,
|
|
12762
|
+
max(timestamp) AS last_called_at
|
|
12763
|
+
FROM events
|
|
12764
|
+
WHERE event = '$feature_flag_called'
|
|
12765
|
+
AND properties.$feature_flag IN {flagKeys}
|
|
12766
|
+
AND timestamp >= now() - INTERVAL ${days} DAY
|
|
12767
|
+
GROUP BY flag_key
|
|
12768
|
+
`;
|
|
12769
|
+
const data = await this.post("/query/", {
|
|
12770
|
+
query: {
|
|
12771
|
+
kind: "HogQLQuery",
|
|
12772
|
+
query: query2,
|
|
12773
|
+
values: { flagKeys }
|
|
12774
|
+
}
|
|
12775
|
+
});
|
|
12776
|
+
const lastCalled = /* @__PURE__ */ new Map();
|
|
12777
|
+
for (const [flagKey, lastCalledAt] of data.results) {
|
|
12778
|
+
if (lastCalledAt) lastCalled.set(flagKey, lastCalledAt);
|
|
12779
|
+
}
|
|
12780
|
+
return lastCalled;
|
|
12781
|
+
}
|
|
12695
12782
|
async getExperiments() {
|
|
12696
12783
|
const data = await this.get(
|
|
12697
12784
|
"/experiments/?limit=500"
|
|
@@ -13513,6 +13600,23 @@ function tryParsePartialJson(s) {
|
|
|
13513
13600
|
return null;
|
|
13514
13601
|
}
|
|
13515
13602
|
|
|
13603
|
+
// src/adapters/error-classification.ts
|
|
13604
|
+
var UPSTREAM_PROVIDER_ERROR_STATUS_PATTERN = /API Error:\s*(?:429|5\d\d)\b/i;
|
|
13605
|
+
function classifyAgentError(result) {
|
|
13606
|
+
if (!result) return "agent_error";
|
|
13607
|
+
const text2 = result.trim();
|
|
13608
|
+
if (/API Error:\s*terminated\b/i.test(text2)) {
|
|
13609
|
+
return "upstream_stream_terminated";
|
|
13610
|
+
}
|
|
13611
|
+
if (/API Error:\s*Connection error\b/i.test(text2)) {
|
|
13612
|
+
return "upstream_connection_error";
|
|
13613
|
+
}
|
|
13614
|
+
if (UPSTREAM_PROVIDER_ERROR_STATUS_PATTERN.test(text2)) {
|
|
13615
|
+
return "upstream_provider_failure";
|
|
13616
|
+
}
|
|
13617
|
+
return "agent_error";
|
|
13618
|
+
}
|
|
13619
|
+
|
|
13516
13620
|
// src/adapters/claude/permissions/posthog-exec-gate.ts
|
|
13517
13621
|
var POSTHOG_EXEC_TOOL_RE = /^mcp__posthog(?:_[^_]+)*__exec$/;
|
|
13518
13622
|
var POSTHOG_CALL_COMMAND_RE = /^\s*call\s+(?:--json\s+)?([a-zA-Z0-9_-]+)/;
|
|
@@ -14829,17 +14933,6 @@ async function handleSystemMessage(message, context) {
|
|
|
14829
14933
|
break;
|
|
14830
14934
|
}
|
|
14831
14935
|
}
|
|
14832
|
-
function classifyAgentError(result) {
|
|
14833
|
-
if (!result) return "agent_error";
|
|
14834
|
-
const text2 = result.trim();
|
|
14835
|
-
if (/API Error:\s*terminated\b/i.test(text2)) {
|
|
14836
|
-
return "upstream_stream_terminated";
|
|
14837
|
-
}
|
|
14838
|
-
if (/API Error:\s*Connection error\b/i.test(text2)) {
|
|
14839
|
-
return "upstream_connection_error";
|
|
14840
|
-
}
|
|
14841
|
-
return "agent_error";
|
|
14842
|
-
}
|
|
14843
14936
|
function handleResultMessage(message) {
|
|
14844
14937
|
const usage = extractUsageFromResult(message);
|
|
14845
14938
|
switch (message.subtype) {
|
|
@@ -16008,7 +16101,7 @@ function resolveModelPreference(preference, options) {
|
|
|
16008
16101
|
}
|
|
16009
16102
|
|
|
16010
16103
|
// src/adapters/claude/session/options.ts
|
|
16011
|
-
import { spawn as
|
|
16104
|
+
import { spawn as spawn3 } from "child_process";
|
|
16012
16105
|
import * as fs7 from "fs";
|
|
16013
16106
|
import * as os3 from "os";
|
|
16014
16107
|
import * as path9 from "path";
|
|
@@ -16070,6 +16163,10 @@ function buildMcpServers(userServers, acpServers, projectScopedServers) {
|
|
|
16070
16163
|
};
|
|
16071
16164
|
}
|
|
16072
16165
|
function buildEnvironment() {
|
|
16166
|
+
const bedrockFallbackHeader = "x-posthog-use-bedrock-fallback: true";
|
|
16167
|
+
const existingCustomHeaders = process.env.ANTHROPIC_CUSTOM_HEADERS;
|
|
16168
|
+
const customHeaders = existingCustomHeaders ? `${existingCustomHeaders}
|
|
16169
|
+
${bedrockFallbackHeader}` : bedrockFallbackHeader;
|
|
16073
16170
|
return {
|
|
16074
16171
|
...process.env,
|
|
16075
16172
|
ELECTRON_RUN_AS_NODE: "1",
|
|
@@ -16077,7 +16174,9 @@ function buildEnvironment() {
|
|
|
16077
16174
|
// Offload all MCP tools by default
|
|
16078
16175
|
ENABLE_TOOL_SEARCH: "auto:0",
|
|
16079
16176
|
// Enable idle state as end-of-turn signal (required for SDK 0.2.114+)
|
|
16080
|
-
CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS: "1"
|
|
16177
|
+
CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS: "1",
|
|
16178
|
+
// Route to AWS Bedrock as a fallback when Anthropic returns 5xx
|
|
16179
|
+
ANTHROPIC_CUSTOM_HEADERS: customHeaders
|
|
16081
16180
|
};
|
|
16082
16181
|
}
|
|
16083
16182
|
function buildHooks(userHooks, onModeChange, settingsManager, logger, enrichmentDeps, enrichedReadCache, registeredAgents) {
|
|
@@ -16150,7 +16249,7 @@ function getAbortController(userProvidedController) {
|
|
|
16150
16249
|
}
|
|
16151
16250
|
function buildSpawnWrapper(sessionId, onProcessSpawned, onProcessExited, logger) {
|
|
16152
16251
|
return (spawnOpts) => {
|
|
16153
|
-
const child =
|
|
16252
|
+
const child = spawn3(spawnOpts.command, spawnOpts.args, {
|
|
16154
16253
|
cwd: spawnOpts.cwd,
|
|
16155
16254
|
env: spawnOpts.env,
|
|
16156
16255
|
stdio: ["pipe", "pipe", "pipe"]
|
|
@@ -18146,7 +18245,7 @@ function parseCodexToml(content, cwd) {
|
|
|
18146
18245
|
}
|
|
18147
18246
|
|
|
18148
18247
|
// src/adapters/codex/spawn.ts
|
|
18149
|
-
import { spawn as
|
|
18248
|
+
import { spawn as spawn4 } from "child_process";
|
|
18150
18249
|
import { existsSync as existsSync4 } from "fs";
|
|
18151
18250
|
import { delimiter, dirname as dirname5 } from "path";
|
|
18152
18251
|
function buildConfigArgs(options) {
|
|
@@ -18210,7 +18309,7 @@ function spawnCodexProcess(options) {
|
|
|
18210
18309
|
hasApiKey: !!options.apiKey,
|
|
18211
18310
|
binaryPath: options.binaryPath
|
|
18212
18311
|
});
|
|
18213
|
-
const child =
|
|
18312
|
+
const child = spawn4(command, args2, {
|
|
18214
18313
|
cwd: options.cwd,
|
|
18215
18314
|
env,
|
|
18216
18315
|
stdio: ["pipe", "pipe", "pipe"],
|
|
@@ -18268,6 +18367,17 @@ function prependPrContext(params) {
|
|
|
18268
18367
|
prompt: [{ type: "text", text: prContext }, ...params.prompt]
|
|
18269
18368
|
};
|
|
18270
18369
|
}
|
|
18370
|
+
function classifyPromptError(error) {
|
|
18371
|
+
const message = error instanceof Error ? error.message : String(error ?? "");
|
|
18372
|
+
const classification = classifyAgentError(message);
|
|
18373
|
+
if (classification === "agent_error") {
|
|
18374
|
+
return error;
|
|
18375
|
+
}
|
|
18376
|
+
return RequestError3.internalError(
|
|
18377
|
+
{ classification, result: message },
|
|
18378
|
+
message
|
|
18379
|
+
);
|
|
18380
|
+
}
|
|
18271
18381
|
var CODEX_NATIVE_MODE = {
|
|
18272
18382
|
auto: "auto",
|
|
18273
18383
|
default: "auto",
|
|
@@ -18597,6 +18707,8 @@ var CodexAcpAgent = class extends BaseAcpAgent {
|
|
|
18597
18707
|
let response;
|
|
18598
18708
|
try {
|
|
18599
18709
|
response = await this.codexConnection.prompt(prependPrContext(params));
|
|
18710
|
+
} catch (error) {
|
|
18711
|
+
throw classifyPromptError(error);
|
|
18600
18712
|
} finally {
|
|
18601
18713
|
this.session.promptRunning = false;
|
|
18602
18714
|
}
|
|
@@ -18932,7 +19044,7 @@ import { tmpdir as tmpdir2 } from "os";
|
|
|
18932
19044
|
import { dirname as dirname6, join as join10 } from "path";
|
|
18933
19045
|
|
|
18934
19046
|
// ../git/dist/handoff.js
|
|
18935
|
-
import { spawn as
|
|
19047
|
+
import { spawn as spawn5 } from "child_process";
|
|
18936
19048
|
import { copyFile, mkdtemp, readFile as readFile3, rm as rm3, stat as stat3 } from "fs/promises";
|
|
18937
19049
|
import { tmpdir } from "os";
|
|
18938
19050
|
import path14 from "path";
|
|
@@ -19098,7 +19210,7 @@ var GitSaga = class extends Saga {
|
|
|
19098
19210
|
return manager.executeWrite(input.baseDir, async (git) => {
|
|
19099
19211
|
this._git = git;
|
|
19100
19212
|
return this.executeGitOperations(input);
|
|
19101
|
-
}, { signal: input.signal });
|
|
19213
|
+
}, { signal: input.signal, env: input.env });
|
|
19102
19214
|
}
|
|
19103
19215
|
};
|
|
19104
19216
|
|
|
@@ -19210,42 +19322,7 @@ async function hasUnmergedEntries(git) {
|
|
|
19210
19322
|
return output.trim().length > 0;
|
|
19211
19323
|
}
|
|
19212
19324
|
async function getGitBusyState(git) {
|
|
19213
|
-
|
|
19214
|
-
const resolveGitPath = async (gitPath) => {
|
|
19215
|
-
const relative = (await git.raw(["rev-parse", "--git-path", gitPath])).trim();
|
|
19216
|
-
return path13.isAbsolute(relative) ? relative : path13.resolve(toplevel, relative);
|
|
19217
|
-
};
|
|
19218
|
-
const pathExists = async (gitPath) => {
|
|
19219
|
-
const resolved = await resolveGitPath(gitPath);
|
|
19220
|
-
try {
|
|
19221
|
-
await fs11.access(resolved);
|
|
19222
|
-
return true;
|
|
19223
|
-
} catch {
|
|
19224
|
-
return false;
|
|
19225
|
-
}
|
|
19226
|
-
};
|
|
19227
|
-
const dirExists = async (gitPath) => {
|
|
19228
|
-
const resolved = await resolveGitPath(gitPath);
|
|
19229
|
-
try {
|
|
19230
|
-
const stat4 = await fs11.stat(resolved);
|
|
19231
|
-
return stat4.isDirectory();
|
|
19232
|
-
} catch {
|
|
19233
|
-
return false;
|
|
19234
|
-
}
|
|
19235
|
-
};
|
|
19236
|
-
if (await dirExists("rebase-merge") || await dirExists("rebase-apply")) {
|
|
19237
|
-
return { busy: true, operation: "rebase" };
|
|
19238
|
-
}
|
|
19239
|
-
if (await pathExists("MERGE_HEAD")) {
|
|
19240
|
-
return { busy: true, operation: "merge" };
|
|
19241
|
-
}
|
|
19242
|
-
if (await pathExists("CHERRY_PICK_HEAD")) {
|
|
19243
|
-
return { busy: true, operation: "cherry-pick" };
|
|
19244
|
-
}
|
|
19245
|
-
if (await pathExists("REVERT_HEAD")) {
|
|
19246
|
-
return { busy: true, operation: "revert" };
|
|
19247
|
-
}
|
|
19248
|
-
return { busy: false };
|
|
19325
|
+
return inspectGitBusyState(git);
|
|
19249
19326
|
}
|
|
19250
19327
|
var MAX_WORKTREE_FILE_BYTES = 1024 * 1024;
|
|
19251
19328
|
async function createWorktreeTree(git, baseDir, head) {
|
|
@@ -19747,7 +19824,7 @@ var GitHandoffTracker = class {
|
|
|
19747
19824
|
}
|
|
19748
19825
|
async runGitProcessAllowingFailure(args2) {
|
|
19749
19826
|
return new Promise((resolve7, reject) => {
|
|
19750
|
-
const child =
|
|
19827
|
+
const child = spawn5("git", args2, {
|
|
19751
19828
|
cwd: this.repositoryPath,
|
|
19752
19829
|
stdio: ["ignore", "ignore", "pipe"]
|
|
19753
19830
|
});
|
|
@@ -19771,7 +19848,7 @@ var GitHandoffTracker = class {
|
|
|
19771
19848
|
}
|
|
19772
19849
|
async runGitWithEnv(env, args2) {
|
|
19773
19850
|
return new Promise((resolve7, reject) => {
|
|
19774
|
-
const child =
|
|
19851
|
+
const child = spawn5("git", args2, {
|
|
19775
19852
|
cwd: this.repositoryPath,
|
|
19776
19853
|
stdio: ["ignore", "pipe", "pipe"],
|
|
19777
19854
|
env
|
|
@@ -19796,7 +19873,7 @@ var GitHandoffTracker = class {
|
|
|
19796
19873
|
}
|
|
19797
19874
|
runGitProcess(args2, input) {
|
|
19798
19875
|
return new Promise((resolve7, reject) => {
|
|
19799
|
-
const child =
|
|
19876
|
+
const child = spawn5("git", args2, {
|
|
19800
19877
|
cwd: this.repositoryPath,
|
|
19801
19878
|
stdio: "pipe"
|
|
19802
19879
|
});
|
|
@@ -21210,8 +21287,15 @@ function validateCommandParams(method, params) {
|
|
|
21210
21287
|
var agentErrorClassificationSchema = z4.enum([
|
|
21211
21288
|
"upstream_stream_terminated",
|
|
21212
21289
|
"upstream_connection_error",
|
|
21290
|
+
"upstream_provider_failure",
|
|
21213
21291
|
"agent_error"
|
|
21214
21292
|
]);
|
|
21293
|
+
var UPSTREAM_PROVIDER_FAILURE_MESSAGE = "The upstream AI provider failed to process the request. Please retry the task in a few minutes.";
|
|
21294
|
+
var upstreamProviderFailureClassifications = /* @__PURE__ */ new Set([
|
|
21295
|
+
"upstream_stream_terminated",
|
|
21296
|
+
"upstream_connection_error",
|
|
21297
|
+
"upstream_provider_failure"
|
|
21298
|
+
]);
|
|
21215
21299
|
var errorWithClassificationSchema = z4.object({
|
|
21216
21300
|
data: z4.object({ classification: agentErrorClassificationSchema })
|
|
21217
21301
|
});
|
|
@@ -21955,7 +22039,9 @@ var AgentServer = class {
|
|
|
21955
22039
|
}
|
|
21956
22040
|
classifyAndSignalFailure(payload, phase, error) {
|
|
21957
22041
|
const { classification, message } = this.extractErrorClassification(error);
|
|
21958
|
-
const errorMessage2 =
|
|
22042
|
+
const errorMessage2 = upstreamProviderFailureClassifications.has(
|
|
22043
|
+
classification
|
|
22044
|
+
) ? UPSTREAM_PROVIDER_FAILURE_MESSAGE : message || "Agent error";
|
|
21959
22045
|
this.logger.error(`send_${phase}_task_message_failed`, {
|
|
21960
22046
|
classification,
|
|
21961
22047
|
message
|
|
@@ -22931,6 +23017,7 @@ ${attributionInstructions}
|
|
|
22931
23017
|
};
|
|
22932
23018
|
export {
|
|
22933
23019
|
AgentServer,
|
|
22934
|
-
SSE_KEEPALIVE_INTERVAL_MS
|
|
23020
|
+
SSE_KEEPALIVE_INTERVAL_MS,
|
|
23021
|
+
UPSTREAM_PROVIDER_FAILURE_MESSAGE
|
|
22935
23022
|
};
|
|
22936
23023
|
//# sourceMappingURL=agent-server.js.map
|