From 1ebba3b7b6062974f72500fceca9afa27b38b094 Mon Sep 17 00:00:00 2001 From: Vojta Bartos Date: Tue, 19 May 2026 17:27:45 +0200 Subject: [PATCH] feat(agent): route slack-originated tasks to slack_app gateway product --- ...agent-server.configure-environment.test.ts | 40 ++++++++++++++++++- packages/agent/src/server/agent-server.ts | 3 +- packages/agent/src/types.ts | 3 +- packages/agent/src/utils/gateway.ts | 9 ++++- 4 files changed, 51 insertions(+), 4 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 23e3ed33d..d28464530 100644 --- a/packages/agent/src/server/agent-server.configure-environment.test.ts +++ b/packages/agent/src/server/agent-server.configure-environment.test.ts @@ -1,10 +1,11 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import type { Task } from "../types"; import { AgentServer } from "./agent-server"; interface TestableServer { configureEnvironment(args?: { isInternal?: boolean; - originProduct?: string | null; + originProduct?: Task["origin_product"] | null; taskId?: string | null; taskRunId?: string | null; taskUserId?: number | null; @@ -148,6 +149,43 @@ describe("AgentServer.configureEnvironment", () => { ); }); + it("tags as slack_app when the task was initiated from Slack", () => { + buildServer("interactive").configureEnvironment({ + originProduct: "slack", + }); + + expect(process.env.LLM_GATEWAY_URL).toBe( + "https://gateway.us.posthog.com/slack_app", + ); + expect(process.env.ANTHROPIC_BASE_URL).toBe( + "https://gateway.us.posthog.com/slack_app", + ); + expect(process.env.OPENAI_BASE_URL).toBe( + "https://gateway.us.posthog.com/slack_app/v1", + ); + }); + + it("prefers slack_app over background_agents when both signals are present", () => { + buildServer("interactive").configureEnvironment({ + isInternal: true, + originProduct: "slack", + }); + + expect(process.env.LLM_GATEWAY_URL).toBe( + "https://gateway.us.posthog.com/slack_app", + ); + }); + + it("falls back to posthog_code for non-slack origin products", () => { + buildServer("background").configureEnvironment({ + originProduct: "user_created", + }); + + expect(process.env.LLM_GATEWAY_URL).toBe( + "https://gateway.us.posthog.com/posthog_code", + ); + }); + it("respects the LLM_GATEWAY_URL override regardless of internal flag", () => { process.env.LLM_GATEWAY_URL = "http://ngrok.test/proxy"; diff --git a/packages/agent/src/server/agent-server.ts b/packages/agent/src/server/agent-server.ts index 37ea4d8b8..f62ee0bb7 100644 --- a/packages/agent/src/server/agent-server.ts +++ b/packages/agent/src/server/agent-server.ts @@ -43,6 +43,7 @@ import type { GitCheckpointEvent, HandoffLocalGitState, LogLevel, + Task, TaskRun, TaskRunArtifact, } from "../types"; @@ -1858,7 +1859,7 @@ ${signedCommitInstructions} taskUserId, }: { isInternal?: boolean; - originProduct?: string | null; + originProduct?: Task["origin_product"] | null; taskId?: string | null; taskRunId?: string | null; taskUserId?: number | null; diff --git a/packages/agent/src/types.ts b/packages/agent/src/types.ts index 6047c3e9c..b45443d5c 100644 --- a/packages/agent/src/types.ts +++ b/packages/agent/src/types.ts @@ -38,7 +38,8 @@ export interface Task { | "user_created" | "support_queue" | "session_summaries" - | "signal_report"; + | "signal_report" + | "slack"; github_integration?: number | null; repository: string; // Format: "organization/repository" (e.g., "posthog/posthog-js") json_schema?: Record | null; // JSON schema for task output validation diff --git a/packages/agent/src/utils/gateway.ts b/packages/agent/src/utils/gateway.ts index ff27758b2..a3370bce0 100644 --- a/packages/agent/src/utils/gateway.ts +++ b/packages/agent/src/utils/gateway.ts @@ -1,4 +1,8 @@ -export type GatewayProduct = "posthog_code" | "background_agents" | "signals"; +export type GatewayProduct = + | "posthog_code" + | "background_agents" + | "signals" + | "slack_app"; export function resolveGatewayProduct({ isInternal, @@ -7,6 +11,9 @@ export function resolveGatewayProduct({ isInternal?: boolean; originProduct?: string | null; } = {}): GatewayProduct { + if (originProduct === "slack") { + return "slack_app"; + } if (isInternal) { return originProduct === "signal_report" ? "signals" : "background_agents"; }