@invect/nextjs 0.0.1
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/LICENSE +21 -0
- package/README.md +151 -0
- package/dist/index.cjs +652 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +650 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Invect","ZodError","BatchProvider","GraphNodeType"],"sources":["../src/index.ts"],"sourcesContent":["import { BatchProvider, Invect, InvectConfig, GraphNodeType } from '@invect/core';\nimport { ZodError } from 'zod';\n\n/**\n * Invect Next.js API Route Handler\n *\n * Usage in your Next.js app:\n *\n * // app/api/invect/[...invect]/route.ts\n * import { createInvectHandler } from \"@invect/nextjs\";\n *\n * const config = { ... }; // Your Invect config\n * const handler = createInvectHandler(config);\n *\n * export const GET = handler.GET;\n * export const POST = handler.POST;\n * export const PATCH = handler.PATCH;\n * export const PUT = handler.PUT;\n * export const DELETE = handler.DELETE;\n */\n\ninterface InvectHandler {\n GET: (request: Request, context: { params: Promise<{ invect: string[] }> }) => Promise<Response>;\n POST: (request: Request, context: { params: Promise<{ invect: string[] }> }) => Promise<Response>;\n PATCH: (\n request: Request,\n context: { params: Promise<{ invect: string[] }> },\n ) => Promise<Response>;\n PUT: (request: Request, context: { params: Promise<{ invect: string[] }> }) => Promise<Response>;\n DELETE: (\n request: Request,\n context: { params: Promise<{ invect: string[] }> },\n ) => Promise<Response>;\n}\n\ntype PostgreSqlClientLike = {\n unsafe<T = Record<string, unknown>>(statement: string, params?: unknown[]): Promise<T[]>;\n};\n\ntype SqliteClientLike = {\n prepare(sql: string): {\n all(...params: unknown[]): Record<string, unknown>[];\n run(...params: unknown[]): { changes: number };\n };\n};\n\ntype MysqlClientLike = {\n execute<T = Record<string, unknown>>(\n statement: string,\n params: unknown[],\n ): Promise<[T[] | unknown, unknown]>;\n};\n\nconst parseParamsFromSearch = (value: string | null): Record<string, unknown> => {\n if (!value) {\n return {};\n }\n\n try {\n return JSON.parse(value);\n } catch {\n return {};\n }\n};\n\nfunction createPluginDatabaseApi(core: Invect) {\n const connection = core.getDatabaseConnection();\n\n const normalizeSql = (statement: string): string => {\n if (connection.type !== 'postgresql') {\n return statement;\n }\n\n let index = 0;\n return statement.replace(/\\?/g, () => `$${++index}`);\n };\n\n const query = async <T = Record<string, unknown>>(\n statement: string,\n params: unknown[] = [],\n ): Promise<T[]> => {\n switch (connection.type) {\n case 'postgresql': {\n const client = (connection.db as unknown as { $client: PostgreSqlClientLike }).$client;\n return await client.unsafe<T>(normalizeSql(statement), params);\n }\n case 'sqlite': {\n const client = (connection.db as unknown as { $client: SqliteClientLike }).$client;\n return client.prepare(statement).all(...params) as T[];\n }\n case 'mysql': {\n const client = (connection.db as unknown as { $client: MysqlClientLike }).$client;\n const [rows] = await client.execute<T>(statement, params);\n return Array.isArray(rows) ? rows : [];\n }\n }\n\n throw new Error(`Unsupported database type: ${String((connection as { type?: string }).type)}`);\n };\n\n return {\n type: connection.type,\n query,\n async execute(statement: string, params: unknown[] = []): Promise<void> {\n await query(statement, params);\n },\n };\n}\n\nexport function createInvectHandler(config: InvectConfig): InvectHandler {\n let core: InstanceType<typeof Invect> | null = null;\n let initializationPromise: Promise<void> | null = null;\n\n // Lazy initialization - only initialize when first request comes in\n const ensureInitialized = async (): Promise<InstanceType<typeof Invect>> => {\n if (core && core.isInitialized()) {\n return core;\n }\n\n if (!initializationPromise) {\n initializationPromise = (async () => {\n try {\n // Skip initialization during build time\n if (\n process.env.NODE_ENV === 'production' &&\n process.env.NEXT_PHASE === 'phase-production-build'\n ) {\n throw new Error('Skipping database initialization during build');\n }\n\n core = new Invect(config);\n await core.initialize();\n await core.startBatchPolling();\n // eslint-disable-next-line no-console\n console.log('✅ Invect initialized and batch polling started');\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to initialize Invect Core:', error);\n core = null;\n initializationPromise = null;\n throw error;\n }\n })();\n }\n\n await initializationPromise;\n\n if (!core) {\n throw new Error('Invect Core failed to initialize');\n }\n\n return core;\n };\n\n // Helper function to get initialized core\n const getInitializedCore = async (): Promise<InstanceType<typeof Invect> | Response> => {\n try {\n return await ensureInitialized();\n } catch (error) {\n // The DatabaseService startup checks already log detailed, helpful\n // messages to the console. Avoid duplicating them — just log a short\n // pointer so the developer knows where to look.\n const errMsg = error instanceof Error ? error.message : String(error);\n\n // Only log the full error if it's NOT one of our own startup-check\n // errors (those have already been logged with the big banner).\n const isStartupCheckError =\n (errMsg.includes('missing') && errMsg.includes('table')) ||\n errMsg.includes('DATABASE NOT READY') ||\n errMsg.includes('DATABASE CONNECTION FAILED') ||\n errMsg.includes('connectivity check failed');\n\n if (!isStartupCheckError) {\n // eslint-disable-next-line no-console\n console.error('Invect initialization failed:', error);\n }\n\n return Response.json(\n {\n error: 'Service Unavailable',\n message: errMsg,\n },\n { status: 503 },\n );\n }\n };\n\n // Helper function to handle errors\n const handleError = (error: unknown): Response => {\n // Handle Zod validation errors\n if (error instanceof ZodError) {\n return Response.json(\n {\n error: 'Validation Error',\n message: 'Invalid request data',\n details: error.errors.map((err) => ({\n path: err.path.join('.'),\n message: err.message,\n code: err.code,\n })),\n },\n { status: 400 },\n );\n }\n\n // Handle other known errors\n if (error && typeof error === 'object' && 'name' in error && error.name === 'DatabaseError') {\n return Response.json(\n {\n error: 'Database Error',\n message: error instanceof Error ? error.message : 'A database error occurred',\n },\n { status: 500 },\n );\n }\n\n // Handle errors that carry their own statusCode (e.g. ValidationError, NotFoundError)\n if (\n error &&\n typeof error === 'object' &&\n 'statusCode' in error &&\n typeof (error as { statusCode: unknown }).statusCode === 'number'\n ) {\n const statusCode = (error as { statusCode: number }).statusCode;\n const message = error instanceof Error ? error.message : 'An error occurred';\n const code =\n 'code' in error && typeof (error as { code: unknown }).code === 'string'\n ? (error as { code: string }).code\n : undefined;\n return Response.json(\n {\n error: statusCode < 500 ? 'Bad Request' : 'Internal Server Error',\n message,\n ...(code ? { code } : {}),\n },\n { status: statusCode },\n );\n }\n\n // Handle generic errors\n // eslint-disable-next-line no-console\n console.error('Invect Handler Error:', error);\n return Response.json(\n {\n error: 'Internal Server Error',\n message: 'An unexpected error occurred',\n },\n { status: 500 },\n );\n };\n\n // Helper function to parse request body\n const parseRequestBody = async (request: Request) => {\n try {\n const contentType = request.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n return await request.json();\n }\n return {};\n } catch {\n return {};\n }\n };\n\n // Route handler function\n const handleRequest = async (\n request: Request,\n context: { params: Promise<{ invect: string[] }> },\n ): Promise<Response> => {\n try {\n // Get initialized core\n const coreOrResponse = await getInitializedCore();\n if (coreOrResponse instanceof Response) {\n return coreOrResponse;\n }\n const initializedCore = coreOrResponse;\n\n const method = request.method;\n const params = await context.params;\n const path = params.invect.join('/');\n\n // Clone the request before consuming the body so plugin handlers\n // (e.g. better-auth) can read the raw body stream themselves.\n const requestClone = request.clone();\n\n const body = await parseRequestBody(request);\n const url = new URL(request.url);\n const searchParams = url.searchParams;\n\n // =====================================\n // FLOW MANAGEMENT ROUTES\n // =====================================\n\n // GET /flows/list — simple GET endpoint\n if (method === 'GET' && path === 'flows/list') {\n const flows = await initializedCore.listFlows();\n return Response.json(flows);\n }\n\n if (method === 'POST' && path === 'flows/list') {\n const flows = await initializedCore.listFlows(body);\n return Response.json(flows);\n }\n\n if (method === 'POST' && path === 'flows') {\n const flow = await initializedCore.createFlow(body);\n return Response.json(flow, { status: 201 });\n }\n\n if (method === 'POST' && path === 'validate-flow') {\n const { flowId, flowDefinition } = body;\n const result = await initializedCore.validateFlowDefinition(flowId, flowDefinition);\n return Response.json(result);\n }\n\n // GET /flows/:flowId/react-flow\n if (method === 'GET' && path.match(/^flows\\/[^/]+\\/react-flow$/)) {\n const flowId = path.split('/')[1];\n const options: { version?: string; flowRunId?: string } = {};\n const version = searchParams.get('version');\n const flowRunId = searchParams.get('flowRunId');\n if (version) {\n options.version = version;\n }\n if (flowRunId) {\n options.flowRunId = flowRunId;\n }\n const result = await initializedCore.renderToReactFlow(flowId, options);\n return Response.json(result);\n }\n\n // =====================================\n // FLOW VERSION MANAGEMENT ROUTES\n // =====================================\n\n if (method === 'POST' && path.match(/^flows\\/[^/]+\\/versions\\/list$/)) {\n const flowId = path.split('/')[1];\n const versions = await initializedCore.listFlowVersions(flowId, body);\n return Response.json(versions);\n }\n\n if (method === 'POST' && path.match(/^flows\\/[^/]+\\/versions$/) && !path.endsWith('/list')) {\n const flowId = path.split('/')[1];\n const version = await initializedCore.createFlowVersion(flowId, body);\n return Response.json(version, { status: 201 });\n }\n\n if (method === 'GET' && path.match(/^flows\\/[^/]+\\/versions\\/[^/]+$/)) {\n const parts = path.split('/');\n const flowId = parts[1];\n const version = parts[3];\n const flowVersion = await initializedCore.getFlowVersion(flowId, version);\n if (!flowVersion) {\n return Response.json(\n { error: 'Not Found', message: `Version ${version} not found for flow ${flowId}` },\n { status: 404 },\n );\n }\n return Response.json(flowVersion);\n }\n\n // =====================================\n // FLOW RUN EXECUTION ROUTES\n // =====================================\n\n // POST /flows/:flowId/run-to-node/:nodeId\n if (method === 'POST' && path.match(/^flows\\/[^/]+\\/run-to-node\\/[^/]+$/)) {\n const parts = path.split('/');\n const flowId = parts[1];\n const nodeId = parts[3];\n const { inputs = {}, options } = body;\n const result = await initializedCore.executeFlowToNode(flowId, nodeId, inputs, options);\n return Response.json(result, { status: 201 });\n }\n\n if (method === 'POST' && path.match(/^flows\\/[^/]+\\/run$/)) {\n const flowId = path.split('/')[1];\n const { inputs = {}, options } = body;\n const result = await initializedCore.startFlowRunAsync(flowId, inputs, options);\n return Response.json(result, { status: 201 });\n }\n\n if (method === 'POST' && path === 'flow-runs/list') {\n const flowRuns = await initializedCore.listFlowRuns(body);\n return Response.json(flowRuns);\n }\n\n if (method === 'POST' && path.match(/^flow-runs\\/[^/]+\\/resume$/)) {\n const flowRunId = path.split('/')[1];\n const result = await initializedCore.resumeExecution(flowRunId);\n return Response.json(result);\n }\n\n if (method === 'POST' && path.match(/^flow-runs\\/[^/]+\\/cancel$/)) {\n const flowRunId = path.split('/')[1];\n const result = await initializedCore.cancelFlowRun(flowRunId);\n return Response.json(result);\n }\n\n if (method === 'POST' && path.match(/^flow-runs\\/[^/]+\\/pause$/)) {\n const flowRunId = path.split('/')[1];\n const { reason } = body;\n const result = await initializedCore.pauseFlowRun(flowRunId, reason);\n return Response.json(result);\n }\n\n // GET /flow-runs/:flowRunId/node-executions\n if (method === 'GET' && path.match(/^flow-runs\\/[^/]+\\/node-executions$/)) {\n const flowRunId = path.split('/')[1];\n const nodeExecutions = await initializedCore.getNodeExecutionsByRunId(flowRunId);\n return Response.json(nodeExecutions);\n }\n\n // GET /flow-runs/:flowRunId/stream - SSE stream of execution events\n if (method === 'GET' && path.match(/^flow-runs\\/[^/]+\\/stream$/)) {\n const flowRunId = path.split('/')[1];\n const stream = initializedCore.createFlowRunEventStream(flowRunId);\n\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of stream) {\n const data = JSON.stringify(event);\n controller.enqueue(encoder.encode(`event: ${event.type}\\ndata: ${data}\\n\\n`));\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Stream failed';\n controller.enqueue(\n encoder.encode(\n `event: error\\ndata: ${JSON.stringify({ type: 'error', message })}\\n\\n`,\n ),\n );\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(readable, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n }\n\n // GET /flows/:flowId/flow-runs\n if (method === 'GET' && path.match(/^flows\\/[^/]+\\/flow-runs$/)) {\n const flowId = path.split('/')[1];\n const flowRuns = await initializedCore.listFlowRunsByFlowId(flowId);\n return Response.json(flowRuns);\n }\n\n // GET /flow-runs/:flowRunId (must come AFTER more specific flow-runs/ routes)\n if (method === 'GET' && path.match(/^flow-runs\\/[^/]+$/)) {\n const flowRunId = path.split('/')[1];\n const flowRun = await initializedCore.getFlowRunById(flowRunId);\n return Response.json(flowRun);\n }\n\n // =====================================\n // NODE EXECUTION ROUTES\n // =====================================\n\n if (method === 'POST' && path === 'node-executions/list') {\n const nodeExecutions = await initializedCore.listNodeExecutions(body);\n return Response.json(nodeExecutions);\n }\n\n // =====================================\n // NODE DATA & TESTING ROUTES\n // =====================================\n\n if (method === 'POST' && path === 'node-data/sql-query') {\n const result = await initializedCore.executeSqlQuery(body);\n return Response.json(result);\n }\n\n if (method === 'POST' && path === 'node-data/test-expression') {\n const result = await initializedCore.testJsExpression(body);\n return Response.json(result);\n }\n\n if (method === 'POST' && path === 'node-data/test-mapper') {\n const result = await initializedCore.testMapper(body);\n return Response.json(result);\n }\n\n if (method === 'POST' && path === 'node-data/model-query') {\n const result = await initializedCore.testModelPrompt(body);\n return Response.json(result);\n }\n\n if (method === 'GET' && path === 'node-data/models') {\n const credentialId = searchParams.get('credentialId');\n const providerParam = searchParams.get('provider');\n\n if (credentialId) {\n return Response.json(await initializedCore.getModelsForCredential(credentialId));\n }\n if (providerParam) {\n const normalized = providerParam.trim().toUpperCase();\n if (!Object.values(BatchProvider).includes(normalized as BatchProvider)) {\n return Response.json(\n { error: 'INVALID_PROVIDER', message: `Unsupported provider '${providerParam}'` },\n { status: 400 },\n );\n }\n return Response.json(\n await initializedCore.getModelsForProvider(normalized as BatchProvider),\n );\n }\n return Response.json(await initializedCore.getAvailableModels());\n }\n\n if (method === 'GET' && path === 'node-data/databases') {\n return Response.json(initializedCore.getAvailableDatabases());\n }\n\n if (method === 'POST' && path === 'node-config/update') {\n const response = await initializedCore.handleNodeConfigUpdate(body);\n return Response.json(response);\n }\n\n if (method === 'GET' && path.startsWith('node-definition/')) {\n const rawNodeType = path.split('/')[1] ?? '';\n const nodeTypeParam = rawNodeType.includes('.') ? rawNodeType : rawNodeType.toUpperCase();\n\n const isLegacyEnum = !rawNodeType.includes('.') && nodeTypeParam in GraphNodeType;\n const isActionId = rawNodeType.includes('.');\n\n if (!isLegacyEnum && !isActionId) {\n return Response.json(\n { error: 'INVALID_NODE_TYPE', message: `Unknown node type '${rawNodeType}'` },\n { status: 400 },\n );\n }\n\n const params = parseParamsFromSearch(searchParams.get('params'));\n const changeField = searchParams.get('changeField') ?? undefined;\n const changeValue = searchParams.get('changeValue') ?? undefined;\n const nodeId = searchParams.get('nodeId') ?? `definition-${nodeTypeParam.toLowerCase()}`;\n const flowId = searchParams.get('flowId') ?? undefined;\n\n const response = await initializedCore.handleNodeConfigUpdate({\n nodeType: nodeTypeParam as GraphNodeType,\n nodeId,\n flowId,\n params,\n change: changeField ? { field: changeField, value: changeValue } : undefined,\n });\n return Response.json(response);\n }\n\n // GET /nodes — available node definitions\n if (method === 'GET' && path === 'nodes') {\n return Response.json(initializedCore.getAvailableNodes());\n }\n\n // GET /actions/:actionId/fields/:fieldName/options — dynamic field options\n if (method === 'GET' && path.match(/^actions\\/[^/]+\\/fields\\/[^/]+\\/options$/)) {\n const parts = path.split('/');\n const actionId = parts[1];\n const fieldName = parts[3];\n let dependencyValues: Record<string, unknown> = {};\n const depsParam = searchParams.get('deps');\n if (depsParam) {\n try {\n dependencyValues = JSON.parse(depsParam);\n } catch {\n return Response.json({ error: 'Invalid deps JSON' }, { status: 400 });\n }\n }\n return Response.json(\n await initializedCore.resolveFieldOptions(actionId, fieldName, dependencyValues),\n );\n }\n\n // POST /nodes/test — test a single node in isolation\n if (method === 'POST' && path === 'nodes/test') {\n const { nodeType, params: nodeParams, inputData } = body;\n if (!nodeType || typeof nodeType !== 'string') {\n return Response.json(\n { error: 'nodeType is required and must be a string' },\n { status: 400 },\n );\n }\n if (!nodeParams || typeof nodeParams !== 'object') {\n return Response.json(\n { error: 'params is required and must be an object' },\n { status: 400 },\n );\n }\n return Response.json(await initializedCore.testNode(nodeType, nodeParams, inputData || {}));\n }\n\n // =====================================\n // CREDENTIAL ROUTES\n // =====================================\n\n // OAuth2 routes (must come before generic credential routes)\n if (method === 'GET' && path === 'credentials/oauth2/providers') {\n return Response.json(initializedCore.getOAuth2Providers());\n }\n\n if (method === 'GET' && path.match(/^credentials\\/oauth2\\/providers\\/[^/]+$/)) {\n const providerId = path.split('/')[3];\n const provider = initializedCore.getOAuth2Provider(providerId);\n if (!provider) {\n return Response.json({ error: 'OAuth2 provider not found' }, { status: 404 });\n }\n return Response.json(provider);\n }\n\n if (method === 'POST' && path === 'credentials/oauth2/start') {\n const {\n providerId,\n clientId,\n clientSecret,\n redirectUri,\n scopes,\n returnUrl,\n credentialName,\n } = body;\n if (!providerId || !clientId || !clientSecret || !redirectUri) {\n return Response.json(\n { error: 'Missing required fields: providerId, clientId, clientSecret, redirectUri' },\n { status: 400 },\n );\n }\n const result = initializedCore.startOAuth2Flow(\n providerId,\n { clientId, clientSecret, redirectUri },\n { scopes, returnUrl, credentialName },\n );\n return Response.json(result);\n }\n\n if (method === 'POST' && path === 'credentials/oauth2/callback') {\n const { code, state, clientId, clientSecret, redirectUri } = body;\n if (!code || !state || !clientId || !clientSecret || !redirectUri) {\n return Response.json(\n { error: 'Missing required fields: code, state, clientId, clientSecret, redirectUri' },\n { status: 400 },\n );\n }\n const credential = await initializedCore.handleOAuth2Callback(code, state, {\n clientId,\n clientSecret,\n redirectUri,\n });\n return Response.json(credential);\n }\n\n if (method === 'GET' && path === 'credentials/expiring') {\n const daysParam = searchParams.get('daysUntilExpiry');\n const days = daysParam ? parseInt(daysParam) : 7;\n return Response.json(await initializedCore.getExpiringCredentials(days));\n }\n\n if (method === 'POST' && path === 'credentials/test-request') {\n const {\n url: targetUrl,\n method: reqMethod = 'GET',\n headers: reqHeaders = {},\n body: reqBody,\n } = body;\n if (!targetUrl) {\n return Response.json({ error: 'URL is required' }, { status: 400 });\n }\n const fetchOptions: RequestInit = { method: reqMethod, headers: reqHeaders };\n if (reqBody && ['POST', 'PUT', 'PATCH'].includes(reqMethod)) {\n fetchOptions.body = typeof reqBody === 'string' ? reqBody : JSON.stringify(reqBody);\n }\n const resp = await fetch(targetUrl, fetchOptions);\n const respText = await resp.text();\n let respBody: unknown;\n try {\n respBody = JSON.parse(respText);\n } catch {\n respBody = respText;\n }\n return Response.json({\n status: resp.status,\n statusText: resp.statusText,\n ok: resp.ok,\n body: respBody,\n });\n }\n\n if (method === 'POST' && path === 'credentials') {\n const credential = await initializedCore.createCredential(body);\n return Response.json(credential, { status: 201 });\n }\n\n if (method === 'GET' && path === 'credentials') {\n const filters: Record<string, unknown> = {};\n const type = searchParams.get('type');\n const authType = searchParams.get('authType');\n const isActive = searchParams.get('isActive');\n if (type) {\n filters.type = type;\n }\n if (authType) {\n filters.authType = authType;\n }\n if (isActive !== null) {\n filters.isActive = isActive === 'true';\n }\n return Response.json(\n await initializedCore.listCredentials(\n filters as import('@invect/core').CredentialFilters,\n ),\n );\n }\n\n // POST /credentials/:id/refresh\n if (method === 'POST' && path.match(/^credentials\\/[^/]+\\/refresh$/)) {\n const credId = path.split('/')[1];\n return Response.json(await initializedCore.refreshOAuth2Credential(credId));\n }\n\n // POST /credentials/:id/track-usage\n if (method === 'POST' && path.match(/^credentials\\/[^/]+\\/track-usage$/)) {\n const credId = path.split('/')[1];\n await initializedCore.updateCredentialLastUsed(credId);\n return new Response(null, { status: 204 });\n }\n\n // POST /credentials/:id/test\n if (method === 'POST' && path.match(/^credentials\\/[^/]+\\/test$/)) {\n const credentialId = path.split('/')[1];\n const result = await initializedCore.testCredential(credentialId);\n return Response.json(result);\n }\n\n // GET /credentials/:id\n if (method === 'GET' && path.match(/^credentials\\/[^/]+$/)) {\n const credentialId = path.split('/')[1];\n return Response.json(await initializedCore.getCredential(credentialId));\n }\n\n // DELETE /credentials/:id\n if (method === 'DELETE' && path.match(/^credentials\\/[^/]+$/)) {\n const credentialId = path.split('/')[1];\n await initializedCore.deleteCredential(credentialId);\n return new Response(null, { status: 204 });\n }\n\n // GET /triggers/:triggerId\n if (method === 'GET' && path.match(/^triggers\\/[^/]+$/)) {\n const triggerId = path.split('/')[1];\n const trigger = await initializedCore.getTrigger(triggerId);\n if (!trigger) {\n return Response.json(\n { error: 'Not Found', message: `Trigger ${triggerId} not found` },\n { status: 404 },\n );\n }\n return Response.json(trigger);\n }\n\n if (method === 'PUT' && path.match(/^triggers\\/[^/]+$/)) {\n const triggerId = path.split('/')[1];\n const trigger = await initializedCore.updateTrigger(triggerId, body);\n if (!trigger) {\n return Response.json({ error: 'Not Found' }, { status: 404 });\n }\n return Response.json(trigger);\n }\n\n if (method === 'DELETE' && path.match(/^triggers\\/[^/]+$/)) {\n const triggerId = path.split('/')[1];\n await initializedCore.deleteTrigger(triggerId);\n return new Response(null, { status: 204 });\n }\n\n // =====================================\n // AGENT TOOLS ROUTES\n // =====================================\n\n if (method === 'GET' && path === 'agent/tools') {\n return Response.json(initializedCore.getAgentTools());\n }\n\n // =====================================\n // DASHBOARD ROUTES\n // =====================================\n\n if (method === 'GET' && path === 'dashboard/stats') {\n return Response.json(await initializedCore.getDashboardStats());\n }\n\n // =====================================\n // CHAT ROUTES\n // =====================================\n\n if (method === 'GET' && path === 'chat/status') {\n return Response.json({ enabled: initializedCore.isChatEnabled() });\n }\n\n // POST /chat - Streaming chat assistant endpoint (SSE via Web ReadableStream)\n if (method === 'POST' && path === 'chat') {\n const { messages, context: chatContext } = body;\n\n if (!messages || !Array.isArray(messages)) {\n return Response.json(\n { error: 'Validation Error', message: '\"messages\" must be an array of chat messages' },\n { status: 400 },\n );\n }\n\n const stream = await initializedCore.createChatStream({\n messages,\n context: chatContext || {},\n });\n\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const event of stream) {\n const data = JSON.stringify(event);\n controller.enqueue(encoder.encode(`event: ${event.type}\\ndata: ${data}\\n\\n`));\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Chat stream failed';\n controller.enqueue(\n encoder.encode(\n `event: error\\ndata: ${JSON.stringify({ type: 'error', message, recoverable: false })}\\n\\n`,\n ),\n );\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(readable, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n }\n\n if (method === 'GET' && path.match(/^chat\\/messages\\/[^/]+$/)) {\n const flowId = path.split('/')[2];\n return Response.json(await initializedCore.getChatMessages(flowId));\n }\n\n if (method === 'PUT' && path.match(/^chat\\/messages\\/[^/]+$/)) {\n const flowId = path.split('/')[2];\n const { messages } = body;\n if (!messages || !Array.isArray(messages)) {\n return Response.json({ error: '\"messages\" must be an array' }, { status: 400 });\n }\n return Response.json(await initializedCore.saveChatMessages(flowId, messages));\n }\n\n if (method === 'DELETE' && path.match(/^chat\\/messages\\/[^/]+$/)) {\n const flowId = path.split('/')[2];\n await initializedCore.deleteChatMessages(flowId);\n return Response.json({ success: true });\n }\n\n // =====================================\n // FLOW CRUD (generic — must come AFTER all more-specific /flows/ routes)\n // =====================================\n\n if (method === 'GET' && path.match(/^flows\\/[^/]+$/)) {\n const flowId = path.split('/')[1];\n return Response.json(await initializedCore.getFlow(flowId));\n }\n\n if (method === 'PUT' && path.match(/^flows\\/[^/]+$/)) {\n const flowId = path.split('/')[1];\n return Response.json(await initializedCore.updateFlow(flowId, body));\n }\n\n if (method === 'DELETE' && path.match(/^flows\\/[^/]+$/)) {\n const flowId = path.split('/')[1];\n await initializedCore.deleteFlow(flowId);\n return new Response(null, { status: 204 });\n }\n\n // =====================================\n // PLUGIN ENDPOINTS\n // Delegate to plugin-defined routes under the plugins/ prefix\n // =====================================\n if (path.startsWith('plugins/')) {\n const pluginPath = '/' + path.replace(/^plugins\\/?/, '');\n const endpoints = initializedCore.getPluginEndpoints();\n\n const matchedEndpoint = endpoints.find((ep) => {\n if (ep.method !== method) {\n return false;\n }\n const pattern = ep.path\n .replace(/\\*/g, '(.*)') // wildcard * → match any path segments\n .replace(/:([^/]+)/g, '([^/]+)'); // :param → match single segment\n return new RegExp(`^${pattern}$`).test(pluginPath);\n });\n\n if (!matchedEndpoint) {\n return Response.json(\n { error: 'Not Found', message: `Plugin route ${method} ${pluginPath} not found` },\n { status: 404 },\n );\n }\n\n // Extract path params\n const paramNames: string[] = [];\n const paramPattern = matchedEndpoint.path\n .replace(/\\*/g, '(.*)') // wildcard * → match rest of path\n .replace(/:([^/]+)/g, (_m: string, name: string) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n const paramMatch = new RegExp(`^${paramPattern}$`).exec(pluginPath);\n const pluginParams: Record<string, string> = {};\n if (paramMatch) {\n paramNames.forEach((name, i) => {\n pluginParams[name] = paramMatch[i + 1] || '';\n });\n }\n\n // Resolve identity for this request by running plugin onRequest hooks.\n // The auth plugin writes the resolved session identity onto the context object.\n const pluginRequestContext = {\n path: '/' + path.replace(/^plugins\\/?/, ''),\n method,\n identity: null as import('@invect/core').InvectIdentity | null,\n };\n const hookResult = await initializedCore\n .getPluginHookRunner()\n .runOnRequest(requestClone.clone(), pluginRequestContext);\n if (hookResult.intercepted && hookResult.response) {\n return hookResult.response;\n }\n\n const pluginResult = await matchedEndpoint.handler({\n body,\n params: pluginParams,\n query: Object.fromEntries(new URL(request.url).searchParams.entries()),\n headers: (() => {\n const h: Record<string, string | undefined> = {};\n request.headers.forEach((v, k) => {\n h[k] = v;\n });\n return h;\n })(),\n identity: pluginRequestContext.identity,\n database: createPluginDatabaseApi(initializedCore),\n request: requestClone,\n core: {\n getPermissions: (identity) => initializedCore.getPermissions(identity),\n getAvailableRoles: () => initializedCore.getAvailableRoles(),\n getResolvedRole: (identity) =>\n initializedCore.getAuthService().getResolvedRole(identity),\n isFlowAccessTableEnabled: () => initializedCore.isFlowAccessTableEnabled(),\n listFlowAccess: (flowId) => initializedCore.listFlowAccess(flowId),\n grantFlowAccess: (input) => initializedCore.grantFlowAccess(input),\n revokeFlowAccess: (accessId) => initializedCore.revokeFlowAccess(accessId),\n getAccessibleFlowIds: (userId, teamIds) =>\n initializedCore.getAccessibleFlowIds(userId, teamIds),\n getFlowPermission: (flowId, userId, teamIds) =>\n initializedCore.getFlowPermission(flowId, userId, teamIds),\n authorize: (context) => initializedCore.authorize(context),\n },\n });\n\n // Handle raw Response objects\n if (pluginResult instanceof Response) {\n return pluginResult;\n }\n\n // Handle streaming responses\n if ('stream' in pluginResult && pluginResult.stream) {\n return new Response(pluginResult.stream as ReadableStream, {\n status: pluginResult.status || 200,\n headers: { 'Content-Type': 'text/event-stream' },\n });\n }\n\n // Standard JSON response\n const jsonBody = 'body' in pluginResult ? pluginResult.body : null;\n return Response.json(jsonBody, { status: pluginResult.status || 200 });\n }\n\n // Route not found\n return Response.json(\n {\n error: 'Not Found',\n message: `Route ${method} /${path} not found`,\n },\n { status: 404 },\n );\n } catch (error) {\n return handleError(error);\n }\n };\n\n return {\n GET: handleRequest,\n POST: handleRequest,\n PATCH: handleRequest,\n PUT: handleRequest,\n DELETE: handleRequest,\n };\n}\n\n/**\n * Convenience function for creating a simple handler when you don't need catch-all routing\n * This creates individual route handlers for specific endpoints\n */\nexport function createInvectEndpoint(config: InvectConfig) {\n let core: InstanceType<typeof Invect> | null = null;\n let initializationPromise: Promise<void> | null = null;\n\n const ensureInitialized = async (): Promise<InstanceType<typeof Invect>> => {\n if (core && core.isInitialized()) {\n return core;\n }\n\n if (!initializationPromise) {\n initializationPromise = (async () => {\n try {\n core = new Invect(config);\n await core.initialize();\n await core.startBatchPolling();\n // eslint-disable-next-line no-console\n console.log('✅ Invect batch polling started');\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to initialize Invect Core:', error);\n core = null;\n initializationPromise = null;\n throw error;\n }\n })();\n }\n\n await initializationPromise;\n\n if (!core) {\n throw new Error('Invect Core failed to initialize');\n }\n\n return core;\n };\n\n return {\n core: () => core,\n\n // Helper to create individual endpoint handlers\n createEndpoint: (\n handler: (core: InstanceType<typeof Invect>, request: Request) => Promise<Response>,\n ) => {\n return async (request: Request) => {\n try {\n const initializedCore = await ensureInitialized();\n return await handler(initializedCore, request);\n } catch (error) {\n if (error instanceof ZodError) {\n return Response.json(\n {\n error: 'Validation Error',\n message: 'Invalid request data',\n details: error.errors.map((err) => ({\n path: err.path.join('.'),\n message: err.message,\n code: err.code,\n })),\n },\n { status: 400 },\n );\n }\n\n // eslint-disable-next-line no-console\n console.error('Invect Endpoint Error:', error);\n return Response.json(\n {\n error: 'Internal Server Error',\n message: 'An unexpected error occurred',\n },\n { status: 500 },\n );\n }\n };\n },\n };\n}\n\n// Re-export types from core for convenience\nexport type { InvectConfig } from '@invect/core';\n"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Invect, InvectConfig } from '@invect/core';
|
|
2
|
+
/**
|
|
3
|
+
* Invect Next.js API Route Handler
|
|
4
|
+
*
|
|
5
|
+
* Usage in your Next.js app:
|
|
6
|
+
*
|
|
7
|
+
* // app/api/invect/[...invect]/route.ts
|
|
8
|
+
* import { createInvectHandler } from "@invect/nextjs";
|
|
9
|
+
*
|
|
10
|
+
* const config = { ... }; // Your Invect config
|
|
11
|
+
* const handler = createInvectHandler(config);
|
|
12
|
+
*
|
|
13
|
+
* export const GET = handler.GET;
|
|
14
|
+
* export const POST = handler.POST;
|
|
15
|
+
* export const PATCH = handler.PATCH;
|
|
16
|
+
* export const PUT = handler.PUT;
|
|
17
|
+
* export const DELETE = handler.DELETE;
|
|
18
|
+
*/
|
|
19
|
+
interface InvectHandler {
|
|
20
|
+
GET: (request: Request, context: {
|
|
21
|
+
params: Promise<{
|
|
22
|
+
invect: string[];
|
|
23
|
+
}>;
|
|
24
|
+
}) => Promise<Response>;
|
|
25
|
+
POST: (request: Request, context: {
|
|
26
|
+
params: Promise<{
|
|
27
|
+
invect: string[];
|
|
28
|
+
}>;
|
|
29
|
+
}) => Promise<Response>;
|
|
30
|
+
PATCH: (request: Request, context: {
|
|
31
|
+
params: Promise<{
|
|
32
|
+
invect: string[];
|
|
33
|
+
}>;
|
|
34
|
+
}) => Promise<Response>;
|
|
35
|
+
PUT: (request: Request, context: {
|
|
36
|
+
params: Promise<{
|
|
37
|
+
invect: string[];
|
|
38
|
+
}>;
|
|
39
|
+
}) => Promise<Response>;
|
|
40
|
+
DELETE: (request: Request, context: {
|
|
41
|
+
params: Promise<{
|
|
42
|
+
invect: string[];
|
|
43
|
+
}>;
|
|
44
|
+
}) => Promise<Response>;
|
|
45
|
+
}
|
|
46
|
+
export declare function createInvectHandler(config: InvectConfig): InvectHandler;
|
|
47
|
+
/**
|
|
48
|
+
* Convenience function for creating a simple handler when you don't need catch-all routing
|
|
49
|
+
* This creates individual route handlers for specific endpoints
|
|
50
|
+
*/
|
|
51
|
+
export declare function createInvectEndpoint(config: InvectConfig): {
|
|
52
|
+
core: () => Invect | null;
|
|
53
|
+
createEndpoint: (handler: (core: InstanceType<typeof Invect>, request: Request) => Promise<Response>) => (request: Request) => Promise<Response>;
|
|
54
|
+
};
|
|
55
|
+
export type { InvectConfig } from '@invect/core';
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAC;AAGlF;;;;;;;;;;;;;;;;GAgBG;AAEH,UAAU,aAAa;IACrB,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjG,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClG,KAAK,EAAE,CACL,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,KAC/C,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjG,MAAM,EAAE,CACN,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,KAC/C,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxB;AA4ED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CA04BvE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY;;8BAyC1C,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,MAErE,SAAS,OAAO;EAiCnC;AAGD,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|