Return to Builder to finish connecting OpenRouter.
-`, - { - headers: { - 'Content-Type': 'text/html; charset=utf-8', - 'Cache-Control': 'no-store', - 'Referrer-Policy': 'no-referrer', - 'Content-Security-Policy': `default-src 'none'; script-src 'nonce-${nonce}'; base-uri 'none'; frame-ancestors 'none'; form-action 'none'`, - 'X-Content-Type-Options': 'nosniff', - 'Cross-Origin-Opener-Policy': 'same-origin', - }, - }, - ) -} -export const handlers = { GET: () => openRouterCallbackResponse() } diff --git a/src/chat/server/routes/plugins.ts b/src/chat/server/routes/plugins.ts deleted file mode 100644 index c8f539ced..000000000 --- a/src/chat/server/routes/plugins.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { hasChatAccess } from '~/chat/access.server' -import { z } from 'zod' -import { getAuthService } from '~/auth/index.server' -import { - jsonError, - validateSameOriginRequest, -} from '~/utils/api-boundary.server' -import { - readWorkspacePolicy, - WorkspacePolicyError, -} from '~/chat/workspace-policy.server' -import { - getKodyEnvironment, - KodyEnvironmentError, -} from '~/chat/server/kody-environment.server' -import { pluginApi } from '~/chat/server/plugin-api' -export async function handlePlugins(request: Request, id?: string) { - if (request.method === 'POST') { - const error = validateSameOriginRequest(request) - if (error) return jsonError(error.message, error.status) - } - const user = await getAuthService().getCurrentUser(request) - if (!user) return jsonError('Sign in to continue.', 401) - if (!(await hasChatAccess(user))) - return jsonError('Chat access is unavailable.', 403) - const url = new URL(request.url) - const parsed = z - .string() - .min(1) - .max(1000) - .safeParse(url.searchParams.get('workspaceId')) - if (url.searchParams.getAll('workspaceId').length !== 1 || !parsed.success) - return jsonError('Choose a workspace.', 400) - try { - await readWorkspacePolicy(parsed.data, user.userId) - return await pluginApi( - request, - await getKodyEnvironment(), - { workspaceId: parsed.data, userId: user.userId }, - id ?? url.searchParams.get('id') ?? undefined, - ) - } catch (error) { - if ( - error instanceof WorkspacePolicyError || - error instanceof KodyEnvironmentError - ) - return jsonError(error.message, error.status) - throw error - } -} -export const handlers = { - GET: ({ request }: { request: Request }) => handlePlugins(request), - POST: ({ request }: { request: Request }) => handlePlugins(request), -} diff --git a/src/chat/server/routes/project-snapshots.$hash.quarantine.ts b/src/chat/server/routes/project-snapshots.$hash.quarantine.ts deleted file mode 100644 index 4367eb5ad..000000000 --- a/src/chat/server/routes/project-snapshots.$hash.quarantine.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { - jsonError, - jsonResponse, - validateSameOriginRequest, -} from '~/utils/api-boundary.server' -import { - purgeHostingCacheTags, - type PurgeResult, -} from '~/utils/hosting-cache.server' -import { - getBuilderProjectSnapshotCacheTag, - isBuilderProjectSnapshotHash, - isBuilderProjectSnapshotQuarantined, - BuilderProjectSnapshotStorageUnavailableError, - quarantineBuilderProjectSnapshot, -} from '~/utils/builder-project-snapshot-storage.server' -import { - BuilderProjectStorageUnavailableError, - quarantineStoredBuilderProjectsBySnapshotHash, -} from '~/utils/builder-project-storage.server' -import { quarantineBuilderProjectsBySnapshotHash } from '~/utils/builder-project-events.server' - -type BuilderProjectQuarantineOperations = { - quarantineSnapshot: (hash: string, userId: string) => PromiseReturn to Builder to finish connecting OpenRouter.
+`, { + headers: { + 'Content-Type': 'text/html; charset=utf-8', + 'Cache-Control': 'no-store', + 'Referrer-Policy': 'no-referrer', + 'Content-Security-Policy': `default-src 'none'; script-src 'nonce-${nonce}'; base-uri 'none'; frame-ancestors 'none'; form-action 'none'`, + 'X-Content-Type-Options': 'nosniff', + 'Cross-Origin-Opener-Policy': 'same-origin', + }, + }) +} diff --git a/src/routes/api/chat/plugins.ts b/src/routes/api/chat/plugins.ts index 9b30c22c2..7a3d81254 100644 --- a/src/routes/api/chat/plugins.ts +++ b/src/routes/api/chat/plugins.ts @@ -1,11 +1,28 @@ +import { hasChatAccess } from '~/chat/access.server' +import { z } from 'zod' import { createFileRoute } from '@tanstack/react-router' -import { forwardWorkerRequest } from '~/server/runtime/worker-service.server' - -export const Route = createFileRoute('/api/chat/plugins')({ - server: { - handlers: { - GET: ({ request }) => forwardWorkerRequest('CHAT', request), - POST: ({ request }) => forwardWorkerRequest('CHAT', request), - }, - }, -}) +import { getAuthService } from '~/auth/index.server' +import { jsonError,validateSameOriginRequest } from '~/utils/api-boundary.server' +import { readWorkspacePolicy,WorkspacePolicyError } from '~/chat/workspace-policy.server' +import { getKodyEnvironment,KodyEnvironmentError } from '~/chat/server/kody-environment.server' +import { pluginApi } from '~/chat/server/plugin-api' +export async function handlePlugins(request:Request, id?:string) { + if(request.method==='POST') { + const error=validateSameOriginRequest(request) + if(error) return jsonError(error.message,error.status) + } + const user=await getAuthService().getCurrentUser(request) + if(!user) return jsonError('Sign in to continue.',401) + if(!await hasChatAccess(user)) return jsonError('Chat access is unavailable.',403) + const url=new URL(request.url) + const parsed=z.string().min(1).max(1000).safeParse(url.searchParams.get('workspaceId')) + if(url.searchParams.getAll('workspaceId').length!==1||!parsed.success) return jsonError('Choose a workspace.',400) + try { + await readWorkspacePolicy(parsed.data,user.userId) + return await pluginApi(request,await getKodyEnvironment(),{workspaceId:parsed.data,userId:user.userId},id??url.searchParams.get('id')??undefined) + } catch(error) { + if(error instanceof WorkspacePolicyError||error instanceof KodyEnvironmentError) return jsonError(error.message,error.status) + throw error + } +} +export const Route=createFileRoute('/api/chat/plugins')({server:{handlers:{GET:({request})=>handlePlugins(request),POST:({request})=>handlePlugins(request)}}}) diff --git a/src/routes/api/chat/plugins/$id.ts b/src/routes/api/chat/plugins/$id.ts index 5223a7704..8846d3468 100644 --- a/src/routes/api/chat/plugins/$id.ts +++ b/src/routes/api/chat/plugins/$id.ts @@ -1,11 +1,11 @@ import { createFileRoute } from '@tanstack/react-router' -import { forwardWorkerRequest } from '~/server/runtime/worker-service.server' +import { handlePlugins } from '../plugins' export const Route = createFileRoute('/api/chat/plugins/$id')({ server: { handlers: { - GET: ({ request }) => forwardWorkerRequest('CHAT', request), - POST: ({ request }) => forwardWorkerRequest('CHAT', request), + GET: ({ request, params }) => handlePlugins(request, params.id), + POST: ({ request, params }) => handlePlugins(request, params.id), }, }, }) diff --git a/src/routes/api/chat/policy.ts b/src/routes/api/chat/policy.ts index 4007290da..bac151812 100644 --- a/src/routes/api/chat/policy.ts +++ b/src/routes/api/chat/policy.ts @@ -1,10 +1,3 @@ -import { createFileRoute } from '@tanstack/react-router' -import { forwardWorkerRequest } from '~/server/runtime/worker-service.server' - -export const Route = createFileRoute('/api/chat/policy')({ - server: { - handlers: { - POST: ({ request }) => forwardWorkerRequest('CHAT', request), - }, - }, -}) +import {createFileRoute} from '@tanstack/react-router' +import {handleWorkspacePolicy} from '~/chat/server/workspace-policy-http.server' +export const Route=createFileRoute('/api/chat/policy')({server:{handlers:{POST:({request})=>handleWorkspacePolicy(request)}}}) diff --git a/src/routes/api/chat/project-snapshots.$hash.quarantine.ts b/src/routes/api/chat/project-snapshots.$hash.quarantine.ts index dd1509d61..f7ce51c99 100644 --- a/src/routes/api/chat/project-snapshots.$hash.quarantine.ts +++ b/src/routes/api/chat/project-snapshots.$hash.quarantine.ts @@ -1,12 +1,172 @@ import { createFileRoute } from '@tanstack/react-router' -import { forwardWorkerRequest } from '~/server/runtime/worker-service.server' +import { + jsonError, + jsonResponse, + validateSameOriginRequest, +} from '~/utils/api-boundary.server' +import { + purgeHostingCacheTags, + type PurgeResult, +} from '~/utils/hosting-cache.server' +import { + getBuilderProjectSnapshotCacheTag, + isBuilderProjectSnapshotHash, + isBuilderProjectSnapshotQuarantined, + BuilderProjectSnapshotStorageUnavailableError, + quarantineBuilderProjectSnapshot, +} from '~/utils/builder-project-snapshot-storage.server' +import { + BuilderProjectStorageUnavailableError, + quarantineStoredBuilderProjectsBySnapshotHash, +} from '~/utils/builder-project-storage.server' +import { quarantineBuilderProjectsBySnapshotHash } from '~/utils/builder-project-events.server' + +type BuilderProjectQuarantineOperations = { + quarantineSnapshot: (hash: string, userId: string) => Promise