Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions packages/api/src/server/background/auth/github-app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,6 @@ export function getGitHubAppConfig(env: {
)
}

export function getGitHubAppConfigOrThrow(
env: Parameters<typeof getGitHubAppConfig>[0],
message: string,
): GitHubAppConfig {
return Option.getOrThrowWith(getGitHubAppConfig(env), () => new GitHubAppError({ message }))
}

function fetchWithTimeout(
input: RequestInfo | URL,
init: RequestInit,
Expand Down
27 changes: 0 additions & 27 deletions packages/api/src/server/background/provider-catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import {
type RuntimeProviderCatalog,
type RuntimeProviderCatalogEntry,
type SharedProviderDefinition,
type UserCustomProviderSettings,
} from "@solzero/shared"
import * as Arr from "effect/Array"
import * as Match from "effect/Match"
Expand Down Expand Up @@ -525,19 +524,6 @@ function isProviderAvailable(provider: ResolvedProviderRecord): boolean {
return provider.credentialSource === "binding" || isNonEmptyString(provider.apiKey)
}

export async function isVisibleModelForUser(
env: Env,
userId: string,
model: string,
): Promise<boolean> {
const catalog = await buildRuntimeProviderCatalog(env, userId)
const runtimeModelId = normalizeModelId(model)

return catalog.modelOptions.some((group) =>
group.models.some((item) => item.id === runtimeModelId),
)
}

export function getUserProviderSettingsSnapshot(
env: Env,
userId: string,
Expand Down Expand Up @@ -948,16 +934,3 @@ function splitRuntimeModelId(runtimeModelId: string) {
modelId: rest.join("/"),
}
}

export function toEditableCustomProviderSettings(
provider: UserCustomProviderSettings,
): UserCustomProviderSettings {
return {
providerId: provider.providerId,
name: provider.name,
npm: provider.npm,
options: provider.options,
models: provider.models,
hasApiKey: provider.hasApiKey,
}
}
13 changes: 0 additions & 13 deletions packages/api/src/server/background/session/access.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import * as Effect from "effect/Effect"
import { runOptionPromise } from "../../lib/effect-promise"
import * as Match from "effect/Match"
import * as Option from "effect/Option"
import type { SessionIndexRecord, SessionIndexStore } from "../db/session-index"
Expand Down Expand Up @@ -45,15 +44,3 @@ export const resolveSessionAccess = Effect.fn("session.resolveSessionAccess")(fu
),
)
})

/**
* Promise bridge for non-Effect callers: resolves to
* the access grant or `null` so imperative request plumbing can branch without importing Effect.
*/
export function resolveSessionAccessPromise(
store: SessionAccessStore,
sessionId: string,
userId: string,
): Promise<SessionAccessGrant | null> {
return runOptionPromise(resolveSessionAccess(store, sessionId, userId))
}
15 changes: 0 additions & 15 deletions packages/api/src/server/background/session/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,21 +177,6 @@ export function toRuntimeActivityRow(row: SandboxActivityRow): RuntimeActivityRo
}
}

export function toSandboxActivityRow(row: RuntimeActivityRow): SandboxActivityRow {
return {
id: row.id,
sandbox_id: row.runtimeId,
type: row.type,
summary: row.summary,
status_from: row.statusFrom,
status_to: row.statusTo,
keep_alive: row.keepAlive == null ? null : row.keepAlive ? 1 : 0,
reason: row.reason,
data: row.dataJson,
created_at: row.createdAt,
}
}

export interface PromptDispatchResult {
success: boolean
error?: string
Expand Down
5 changes: 0 additions & 5 deletions packages/api/src/server/background/workflows/nodes/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,9 @@ import * as Result from "effect/Result"

export type WorkflowHttpNodeExecutionInput = WorkflowNodeExecutionInput

const workflowHttpNodeTypes = new Set(["http-request"])
const workflowHttpMethods = new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"])
const workflowResponseTypes = new Set(["auto", "json", "text"])

export function isWorkflowHttpNodeType(nodeType: string): boolean {
return workflowHttpNodeTypes.has(nodeType)
}

const requireString = (value: Option.Option<string>, message: string) =>
Option.match(value, {
onNone: () => workflowNodeFail(message),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,6 @@ import * as Match from "effect/Match"

export type WorkflowNotificationNodeExecutionInput = WorkflowNodeExecutionInput

const workflowNotificationNodeTypes = new Set(["email-notification"])

export function isWorkflowNotificationNodeType(nodeType: string): boolean {
return workflowNotificationNodeTypes.has(nodeType)
}

export const executeWorkflowNotificationNode = Effect.fn("workflows.executeNotificationNode")(
function* (input: WorkflowNotificationNodeExecutionInput) {
return yield* Match.value(input.node.type).pipe(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,6 @@ const workflowNodeAdapters: Partial<Record<WorkflowNodeAdapterCategory, Workflow
},
}

export function getRegisteredWorkflowNodeAdapterCategories(): WorkflowNodeAdapterCategory[] {
return /* SAFETY: These keys are exactly the members of WorkflowNodeAdapterCategory[]. */ Object.keys(
workflowNodeAdapters,
) as WorkflowNodeAdapterCategory[]
}

type WorkflowNodeRuntimeSupport = ReturnType<typeof getWorkflowNodeRuntimeSupport>

type AdapterRuntimeSupport = Extract<WorkflowNodeRuntimeSupport, { kind: "adapter" }>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ import * as Option from "effect/Option"

export type WorkflowSessionNodeExecutionInput = WorkflowNodeExecutionInput

const workflowSessionNodeTypes = new Set(["isolate-session", "sandbox-session"])
const MIN_WORKFLOW_SESSION_CACHE_TTL_SECONDS = 60

function runWorkflowLog(action: () => void) {
Expand Down Expand Up @@ -98,10 +97,6 @@ interface WorkflowSessionRunResponse extends WorkflowSessionCacheEntry {
createdSession?: boolean
}

export function isWorkflowSessionNodeType(nodeType: string): boolean {
return workflowSessionNodeTypes.has(nodeType)
}

export const executeWorkflowSessionNode = Effect.fn("workflows.executeSessionNode")(function* (
input: WorkflowSessionNodeExecutionInput,
) {
Expand Down
12 changes: 0 additions & 12 deletions packages/api/src/server/background/workflows/nodes/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,6 @@ import * as Result from "effect/Result"

export type WorkflowStorageNodeExecutionInput = WorkflowNodeExecutionInput

const workflowStorageNodeTypes = new Set([
"r2-put-object",
"r2-get-object",
"kv-put",
"kv-get",
"get-secret",
])

const workflowR2BucketIds = new Set<string>(
WORKFLOW_R2_BUCKET_OPTIONS.map((bucket) => bucket.binding),
)
Expand All @@ -52,10 +44,6 @@ const workflowStorageEncodings = new Set<string>(

const R2_CONTENT_ENCODING_MANIFEST_VERSION = 2

export function isWorkflowStorageNodeType(nodeType: string): boolean {
return workflowStorageNodeTypes.has(nodeType)
}

const requireString = (value: Option.Option<string>, message: string) =>
Option.match(value, {
onNone: () => workflowNodeFail(message),
Expand Down
7 changes: 0 additions & 7 deletions packages/api/src/server/effect/db/control-plane-db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,6 @@ export function resolveControlPlaneHandle(db: AppDrizzleDatabase | ControlPlaneD
)
}

export function controlPlaneDialectForEngine(engine: S0DatabaseEngine): ControlPlaneDialect {
return Match.value(engine).pipe(
Match.when("planetscale", () => "postgres" as const),
Match.orElse(() => "sqlite" as const),
)
}

interface DatabaseEngineSource {
readonly [DATABASE_ENV]?: unknown
}
Expand Down
15 changes: 0 additions & 15 deletions packages/api/src/server/effect/handlers/shared/control-plane.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,21 +300,6 @@ function buildSetupUrl(env: ApiEnv, extraParams?: Record<string, string>): strin
)
}

export function buildSetupResponse(
env: ApiEnv,
message: string,
status: number,
extraParams?: Record<string, string>,
): Response {
return json(
{
error: message,
setupUrl: buildSetupUrl(env, extraParams),
},
status,
)
}

export const failSetup = (
env: ApiEnv,
message: string,
Expand Down
18 changes: 0 additions & 18 deletions packages/api/src/server/effect/services/providers.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as Context from "effect/Context"
import * as Effect from "effect/Effect"
import * as Layer from "effect/Layer"
import * as Match from "effect/Match"
import * as Option from "effect/Option"
import type { ApiEnv } from "infra/types/env"
Expand Down Expand Up @@ -224,16 +223,6 @@ export const MockGitHubProvider: GitHubProviderService = {
},
}

export const LiveProviderLayer = Layer.mergeAll(
Layer.succeed(IdentityProvider, LiveIdentityProvider),
Layer.succeed(GitHubProvider, LiveGitHubProvider),
)

export const MockProviderLayer = Layer.mergeAll(
Layer.succeed(IdentityProvider, MockIdentityProvider),
Layer.succeed(GitHubProvider, MockGitHubProvider),
)

export function providerServicesForEnv(env: ApiEnv) {
return Match.value(env.S0_PROVIDER_LAYER === "mock").pipe(
Match.when(true, () => ({
Expand All @@ -246,10 +235,3 @@ export function providerServicesForEnv(env: ApiEnv) {
})),
)
}

export function providerLayerForEnv(env: ApiEnv) {
return Match.value(env.S0_PROVIDER_LAYER === "mock").pipe(
Match.when(true, () => MockProviderLayer),
Match.orElse(() => LiveProviderLayer),
)
}
11 changes: 0 additions & 11 deletions packages/shared/src/agent-runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,6 @@ const PROVIDER_COMPATIBILITY: Record<
(providerId === "cloudflare-ai-gateway" && providerApi === "messages"),
}

const MODEL_COMPATIBILITY_DESCRIPTIONS: Record<AgentRuntime, string> = {
isolate: "any configured model",
opencode: "Cloudflare AI Gateway or LiteLLM models",
codex: "Cloudflare AI Gateway OpenAI Responses or LiteLLM OpenAI-compatible models",
"claude-code": "Cloudflare AI Gateway or LiteLLM Anthropic Messages models",
}

const AGENT_RUNTIME_LABELS: Record<AgentRuntime, string> = {
isolate: "Isolate",
opencode: "OpenCode",
Expand All @@ -67,10 +60,6 @@ export function isAgentRuntimeCompatibleWithProvider(
return PROVIDER_COMPATIBILITY[agentRuntime](providerId, providerApi)
}

export function describeAgentRuntimeModelCompatibility(agentRuntime: AgentRuntime): string {
return MODEL_COMPATIBILITY_DESCRIPTIONS[agentRuntime]
}

export function formatAgentRuntimeLabel(agentRuntime: AgentRuntime): string {
return AGENT_RUNTIME_LABELS[agentRuntime]
}
55 changes: 0 additions & 55 deletions packages/shared/src/session-tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,33 +90,6 @@ export function isCustomMcpServerId(id: string): boolean {
return id.startsWith(CUSTOM_MCP_SERVER_ID_PREFIX)
}

export function parseCustomMcpServerId(id: string): {
serverName: string
hash: string
} | null {
if (!isCustomMcpServerId(id)) {
return null
}

const body = id.slice(CUSTOM_MCP_SERVER_ID_PREFIX.length)
const separatorIndex = body.lastIndexOf(CUSTOM_MCP_SERVER_ID_HASH_SEPARATOR)

if (separatorIndex <= 0) {
return null
}

const hashStart = separatorIndex + CUSTOM_MCP_SERVER_ID_HASH_SEPARATOR.length

if (hashStart >= body.length) {
return null
}

return {
serverName: body.slice(0, separatorIndex),
hash: body.slice(hashStart),
}
}

export function parseCustomMcpToolKey(toolKey: string): {
serverName: string | null
mcpToolName: string
Expand Down Expand Up @@ -731,22 +704,6 @@ export function resolveSessionTools(input: ResolveSessionToolsInput): SessionToo
return normalizeSessionTools(combined)
}

export function encodeSessionToolQueryValue(tool: SessionToolSpec): string {
if (tool.kind === "github_repo") {
return `${tool.kind}:${formatGitHubRepoTool(tool)}`
}

if (tool.kind === "workflow_builder") {
return tool.kind
}

if (tool.kind === MCPCF_SESSION_TOOL_KIND) {
return `${tool.kind}:${tool.serverId}`
}

return `${tool.kind}:${tool.sourceId}`
}

export function decodeSessionToolQueryValue(value: string): SessionToolSpec {
if (value === "workflow_builder") {
return { kind: "workflow_builder" }
Expand Down Expand Up @@ -799,18 +756,6 @@ export function parseSessionToolsFromSearchParams(
return normalizeSessionTools(searchParams.getAll(paramName).map(decodeSessionToolQueryValue))
}

export function appendSessionToolsToSearchParams(
searchParams: URLSearchParams,
tools: readonly SessionToolSpec[] | null | undefined,
paramName = SESSION_TOOL_QUERY_PARAM,
): URLSearchParams {
normalizeSessionTools(tools).forEach((tool) => {
searchParams.append(paramName, encodeSessionToolQueryValue(tool))
})

return searchParams
}

export function stringifySessionTools(
tools: readonly SessionToolSpec[] | null | undefined,
): string {
Expand Down
Loading
Loading