From b0b57479e10bbdbd5072ec0f570b3b5feaf3fdd9 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 28 Jul 2026 16:24:05 -0700 Subject: [PATCH 1/5] bill loop runs as posthog_code --- .../server/agent-server.configure-environment.test.ts | 11 +++++++++++ packages/agent/src/utils/gateway.test.ts | 10 ++++++++++ packages/agent/src/utils/gateway.ts | 3 +++ packages/shared/src/task.ts | 3 ++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/agent/src/server/agent-server.configure-environment.test.ts b/packages/agent/src/server/agent-server.configure-environment.test.ts index f5b96ccea9..7280ed66a1 100644 --- a/packages/agent/src/server/agent-server.configure-environment.test.ts +++ b/packages/agent/src/server/agent-server.configure-environment.test.ts @@ -92,6 +92,17 @@ describe("AgentServer.configureEnvironment", () => { expect(process.env.POSTHOG_PROJECT_ID).toBe("1"); }); + it("tags as posthog_code when an internal task has origin_product 'loop'", () => { + const env = buildServer("background").configureEnvironment({ + isInternal: true, + originProduct: "loop", + }); + + expect(env.anthropicBaseUrl).toBe( + "https://gateway.us.posthog.com/posthog_code", + ); + }); + it("tags as posthog_code when isInternal is omitted (getTask failure fallback)", () => { const env = buildServer("background").configureEnvironment(); diff --git a/packages/agent/src/utils/gateway.test.ts b/packages/agent/src/utils/gateway.test.ts index 9a2bc0a2aa..2a40bbf959 100644 --- a/packages/agent/src/utils/gateway.test.ts +++ b/packages/agent/src/utils/gateway.test.ts @@ -59,6 +59,16 @@ describe("resolveGatewayProduct", () => { originProduct: "support_reply", expected: "conversations", }, + { + isInternal: true, + originProduct: "loop", + expected: "posthog_code", + }, + { + isInternal: false, + originProduct: "loop", + expected: "posthog_code", + }, ] as const)( "isInternal=$isInternal originProduct=$originProduct -> $expected", ({ isInternal, originProduct, expected }) => { diff --git a/packages/agent/src/utils/gateway.ts b/packages/agent/src/utils/gateway.ts index b258086070..a9ecaaf41a 100644 --- a/packages/agent/src/utils/gateway.ts +++ b/packages/agent/src/utils/gateway.ts @@ -25,6 +25,9 @@ export function resolveGatewayProduct({ if (originProduct === "support_reply") { return "conversations"; } + if (originProduct === "loop") { + return "posthog_code"; + } if (isInternal) { return "background_agents"; } diff --git a/packages/shared/src/task.ts b/packages/shared/src/task.ts index b93c6e96d7..9e4c1c898f 100644 --- a/packages/shared/src/task.ts +++ b/packages/shared/src/task.ts @@ -16,7 +16,8 @@ export interface Task { | "session_summaries" | "signal_report" | "signals_scout" - | "slack"; + | "slack" + | "loop"; signal_report?: string | null; // Inbox report UUID when origin_product is "signal_report" github_integration?: number | null; repository: string; // Format: "organization/repository" (e.g., "posthog/posthog-js") From fc9729d21bd4c3daf8e15d3c9e73b963aecfa3c1 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 28 Jul 2026 16:39:00 -0700 Subject: [PATCH 2/5] remove shadowed Task interface from shared --- packages/shared/src/task.ts | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/packages/shared/src/task.ts b/packages/shared/src/task.ts index 9e4c1c898f..24a63bac5c 100644 --- a/packages/shared/src/task.ts +++ b/packages/shared/src/task.ts @@ -1,41 +1,6 @@ -// PostHog Task model (matches the desktop task API's OpenAPI schema) -import type { AgentRuntime } from "./agent-runtime"; +// PostHog TaskRun models (match the desktop task API's OpenAPI schema) import type { UploadableSkillSource } from "./skills"; -export interface Task { - id: string; - task_number?: number; - slug?: string; - title: string; - description: string; - origin_product: - | "error_tracking" - | "eval_clusters" - | "user_created" - | "support_queue" - | "session_summaries" - | "signal_report" - | "signals_scout" - | "slack" - | "loop"; - signal_report?: string | null; // Inbox report UUID when origin_product is "signal_report" - github_integration?: number | null; - repository: string; // Format: "organization/repository" (e.g., "posthog/posthog-js") - json_schema?: Record | null; // JSON schema for task output validation - internal?: boolean; - runtime?: AgentRuntime; - created_at: string; - updated_at: string; - created_by?: { - id: number; - uuid: string; - distinct_id: string; - first_name: string; - email: string; - }; - latest_run?: TaskRun; -} - export type ArtifactType = | "plan" | "context" From e100c3fa9576c10bb8931420bab04aec0377c816 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 28 Jul 2026 16:39:32 -0700 Subject: [PATCH 3/5] explain loop billing branch and tidy tests --- ...agent-server.configure-environment.test.ts | 28 +++++++++++-------- packages/agent/src/utils/gateway.ts | 1 + 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/packages/agent/src/server/agent-server.configure-environment.test.ts b/packages/agent/src/server/agent-server.configure-environment.test.ts index 7280ed66a1..dfae60dabe 100644 --- a/packages/agent/src/server/agent-server.configure-environment.test.ts +++ b/packages/agent/src/server/agent-server.configure-environment.test.ts @@ -92,17 +92,6 @@ describe("AgentServer.configureEnvironment", () => { expect(process.env.POSTHOG_PROJECT_ID).toBe("1"); }); - it("tags as posthog_code when an internal task has origin_product 'loop'", () => { - const env = buildServer("background").configureEnvironment({ - isInternal: true, - originProduct: "loop", - }); - - expect(env.anthropicBaseUrl).toBe( - "https://gateway.us.posthog.com/posthog_code", - ); - }); - it("tags as posthog_code when isInternal is omitted (getTask failure fallback)", () => { const env = buildServer("background").configureEnvironment(); @@ -172,6 +161,23 @@ describe("AgentServer.configureEnvironment", () => { }, ); + it.each([{ isInternal: true }, { isInternal: false }] as const)( + "tags as posthog_code when origin_product is 'loop' (isInternal=$isInternal)", + ({ isInternal }) => { + const env = buildServer("background").configureEnvironment({ + isInternal, + originProduct: "loop", + }); + + expect(env.anthropicBaseUrl).toBe( + "https://gateway.us.posthog.com/posthog_code", + ); + expect(env.openaiBaseUrl).toBe( + "https://gateway.us.posthog.com/posthog_code/v1", + ); + }, + ); + // The codex/OpenAI path sets provider http_headers rather than // ANTHROPIC_CUSTOM_HEADERS, so the same task metadata must be exposed as a // record — including team_id, which the Claude path adds separately in diff --git a/packages/agent/src/utils/gateway.ts b/packages/agent/src/utils/gateway.ts index a9ecaaf41a..f5e2c53666 100644 --- a/packages/agent/src/utils/gateway.ts +++ b/packages/agent/src/utils/gateway.ts @@ -25,6 +25,7 @@ export function resolveGatewayProduct({ if (originProduct === "support_reply") { return "conversations"; } + // Loop runs are internal but billed as posthog_code, not background_agents. if (originProduct === "loop") { return "posthog_code"; } From fa4665d8eef32d15451d499fccefc95339e5c0b2 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 28 Jul 2026 16:46:36 -0700 Subject: [PATCH 4/5] remove loop branch comment --- packages/agent/src/utils/gateway.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/agent/src/utils/gateway.ts b/packages/agent/src/utils/gateway.ts index f5e2c53666..a9ecaaf41a 100644 --- a/packages/agent/src/utils/gateway.ts +++ b/packages/agent/src/utils/gateway.ts @@ -25,7 +25,6 @@ export function resolveGatewayProduct({ if (originProduct === "support_reply") { return "conversations"; } - // Loop runs are internal but billed as posthog_code, not background_agents. if (originProduct === "loop") { return "posthog_code"; } From f21885634e324ccbaf160c33576274208cff40e2 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Tue, 28 Jul 2026 16:47:57 -0700 Subject: [PATCH 5/5] restore shared Task interface --- packages/shared/src/task.ts | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/task.ts b/packages/shared/src/task.ts index 24a63bac5c..9e4c1c898f 100644 --- a/packages/shared/src/task.ts +++ b/packages/shared/src/task.ts @@ -1,6 +1,41 @@ -// PostHog TaskRun models (match the desktop task API's OpenAPI schema) +// PostHog Task model (matches the desktop task API's OpenAPI schema) +import type { AgentRuntime } from "./agent-runtime"; import type { UploadableSkillSource } from "./skills"; +export interface Task { + id: string; + task_number?: number; + slug?: string; + title: string; + description: string; + origin_product: + | "error_tracking" + | "eval_clusters" + | "user_created" + | "support_queue" + | "session_summaries" + | "signal_report" + | "signals_scout" + | "slack" + | "loop"; + signal_report?: string | null; // Inbox report UUID when origin_product is "signal_report" + github_integration?: number | null; + repository: string; // Format: "organization/repository" (e.g., "posthog/posthog-js") + json_schema?: Record | null; // JSON schema for task output validation + internal?: boolean; + runtime?: AgentRuntime; + created_at: string; + updated_at: string; + created_by?: { + id: number; + uuid: string; + distinct_id: string; + first_name: string; + email: string; + }; + latest_run?: TaskRun; +} + export type ArtifactType = | "plan" | "context"