@decocms/runtime 0.0.1-testing-beta.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/config-schema.json +553 -0
- package/dist/admin.d.ts +5 -0
- package/dist/admin.js +21 -0
- package/dist/admin.js.map +1 -0
- package/dist/bindings/deconfig/index.d.ts +9 -0
- package/dist/bindings/deconfig/index.js +9 -0
- package/dist/bindings/deconfig/index.js.map +1 -0
- package/dist/bindings/index.d.ts +1053 -0
- package/dist/bindings/index.js +132 -0
- package/dist/bindings/index.js.map +1 -0
- package/dist/chunk-4XSQKJLU.js +105 -0
- package/dist/chunk-4XSQKJLU.js.map +1 -0
- package/dist/chunk-AOFOWQXY.js +27 -0
- package/dist/chunk-AOFOWQXY.js.map +1 -0
- package/dist/chunk-F6XZPFWM.js +127 -0
- package/dist/chunk-F6XZPFWM.js.map +1 -0
- package/dist/chunk-IB3KGSMB.js +150 -0
- package/dist/chunk-IB3KGSMB.js.map +1 -0
- package/dist/chunk-NKUMVYKI.js +128 -0
- package/dist/chunk-NKUMVYKI.js.map +1 -0
- package/dist/chunk-NMXOC7PT.js +763 -0
- package/dist/chunk-NMXOC7PT.js.map +1 -0
- package/dist/chunk-OSSKGDAG.js +395 -0
- package/dist/chunk-OSSKGDAG.js.map +1 -0
- package/dist/chunk-UHR3BLMF.js +92 -0
- package/dist/chunk-UHR3BLMF.js.map +1 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.js +4 -0
- package/dist/client.js.map +1 -0
- package/dist/connection-DDtQYrea.d.ts +30 -0
- package/dist/drizzle.d.ts +47 -0
- package/dist/drizzle.js +121 -0
- package/dist/drizzle.js.map +1 -0
- package/dist/index-AKVjfH4b.d.ts +336 -0
- package/dist/index-kMsI0ELb.d.ts +530 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +507 -0
- package/dist/index.js.map +1 -0
- package/dist/mastra.d.ts +8 -0
- package/dist/mastra.js +5 -0
- package/dist/mastra.js.map +1 -0
- package/dist/mcp-Bv7IAgWX.d.ts +109 -0
- package/dist/mcp-client.d.ts +236 -0
- package/dist/mcp-client.js +3 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/proxy.d.ts +10 -0
- package/dist/proxy.js +4 -0
- package/dist/proxy.js.map +1 -0
- package/dist/resources.d.ts +362 -0
- package/dist/resources.js +3 -0
- package/dist/resources.js.map +1 -0
- package/dist/views.d.ts +72 -0
- package/dist/views.js +3 -0
- package/dist/views.js.map +1 -0
- package/package.json +98 -0
- package/src/admin.ts +16 -0
- package/src/auth.ts +233 -0
- package/src/bindings/README.md +132 -0
- package/src/bindings/binder.ts +143 -0
- package/src/bindings/channels.ts +54 -0
- package/src/bindings/deconfig/helpers.ts +107 -0
- package/src/bindings/deconfig/index.ts +1 -0
- package/src/bindings/deconfig/resources.ts +659 -0
- package/src/bindings/deconfig/types.ts +106 -0
- package/src/bindings/index.ts +61 -0
- package/src/bindings/resources/bindings.ts +99 -0
- package/src/bindings/resources/helpers.ts +95 -0
- package/src/bindings/resources/schemas.ts +265 -0
- package/src/bindings/utils.ts +22 -0
- package/src/bindings/views.ts +14 -0
- package/src/bindings.ts +179 -0
- package/src/client.ts +201 -0
- package/src/connection.ts +53 -0
- package/src/drizzle.ts +201 -0
- package/src/http-client-transport.ts +66 -0
- package/src/index.ts +394 -0
- package/src/mastra.ts +666 -0
- package/src/mcp-client.ts +119 -0
- package/src/mcp.ts +171 -0
- package/src/proxy.ts +204 -0
- package/src/resources.ts +168 -0
- package/src/state.ts +44 -0
- package/src/views.ts +26 -0
- package/src/well-known.ts +20 -0
- package/src/wrangler.ts +146 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state.ts","../src/mastra.ts"],"names":["mastraCreateTool","z","bindings","base"],"mappings":"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","file":"chunk-OSSKGDAG.js","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { z } from \"zod\";\nimport type { AppContext } from \"./mastra.ts\";\nimport { createTool } from \"./mastra.ts\";\n\nconst asyncLocalStorage = new AsyncLocalStorage<AppContext | undefined>();\n\nexport const State = {\n getStore: () => {\n return asyncLocalStorage.getStore();\n },\n run: <TEnv, R, TArgs extends unknown[]>(\n ctx: AppContext<TEnv>,\n f: (...args: TArgs) => R,\n ...args: TArgs\n ): R => asyncLocalStorage.run(ctx, f, ...args),\n};\n\nexport interface ValidationPayload {\n state: unknown;\n}\n\nexport const createStateValidationTool = (stateSchema?: z.ZodTypeAny) => {\n return createTool({\n id: \"DECO_CHAT_STATE_VALIDATION\",\n description: \"Validate the state of the OAuth flow\",\n inputSchema: z.object({\n state: z.unknown(),\n }),\n outputSchema: z.object({\n valid: z.boolean(),\n }),\n execute: (ctx) => {\n if (!stateSchema) {\n return Promise.resolve({ valid: true });\n }\n const parsed = stateSchema.safeParse(ctx.context.state);\n return Promise.resolve({\n valid: parsed.success,\n reason: parsed.error?.message,\n });\n },\n });\n};\n","/* oxlint-disable no-explicit-any */\n/* oxlint-disable ban-types */\nimport { HttpServerTransport } from \"@deco/mcp/http\";\nimport {\n createTool as mastraCreateTool,\n Tool,\n type ToolAction,\n type ToolExecutionContext,\n} from \"@mastra/core\";\nimport { RuntimeContext } from \"@mastra/core/di\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { DefaultEnv } from \"./index.ts\";\nimport {\n ResourceCreateInputSchema,\n ResourceCreateOutputSchema,\n ResourceDeleteInputSchema,\n ResourceDeleteOutputSchema,\n ResourceSearchInputSchema,\n ResourceSearchOutputSchema,\n ResourcesListOutputSchema,\n ResourcesReadInputSchema,\n ResourcesReadOutputSchema,\n ResourceUpdateInputSchema,\n ResourceUpdateOutputSchema,\n} from \"./resources.ts\";\nimport { createStateValidationTool, State } from \"./state.ts\";\nimport { ViewsListOutputSchema } from \"./views.ts\";\n\nexport const createRuntimeContext = (prev?: RuntimeContext<AppContext>) => {\n const runtimeContext = new RuntimeContext<AppContext>();\n const store = State.getStore();\n if (!store) {\n if (prev) {\n return prev;\n }\n throw new Error(\"Missing context, did you forget to call State.bind?\");\n }\n const { env, ctx, req } = store;\n runtimeContext.set(\"env\", env);\n runtimeContext.set(\"ctx\", ctx);\n runtimeContext.set(\"req\", req);\n return runtimeContext;\n};\n\n/**\n * creates a private tool that always ensure for athentication before being executed\n */\nexport function createPrivateTool<\n TSchemaIn extends z.ZodSchema = z.ZodSchema,\n TSchemaOut extends z.ZodSchema | undefined = undefined,\n TSuspendSchema extends z.ZodSchema = z.ZodSchema,\n TResumeSchema extends z.ZodSchema = z.ZodSchema,\n TContext extends\n ToolExecutionContext<TSchemaIn> = ToolExecutionContext<TSchemaIn>,\n TExecute extends ToolAction<\n TSchemaIn,\n TSchemaOut,\n any,\n any,\n TContext\n >[\"execute\"] = ToolAction<\n TSchemaIn,\n TSchemaOut,\n any,\n any,\n TContext\n >[\"execute\"],\n>(\n opts: ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n > & {\n execute?: TExecute;\n },\n): [TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TExecute] extends [\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n Function,\n]\n ? Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> & {\n inputSchema: TSchemaIn;\n outputSchema: TSchemaOut;\n execute: (context: TContext) => Promise<any>;\n }\n : Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> {\n const execute = opts.execute;\n if (typeof execute === \"function\") {\n opts.execute = ((input, options) => {\n const env = input.runtimeContext.get(\"env\") as DefaultEnv;\n if (env) {\n env.DECO_REQUEST_CONTEXT.ensureAuthenticated();\n }\n return execute(input, options);\n }) as TExecute;\n }\n return createTool(opts);\n}\n\nexport interface StreamableTool<TSchemaIn extends z.ZodSchema = z.ZodSchema> {\n id: string;\n inputSchema: TSchemaIn;\n streamable?: true;\n description?: string;\n execute: (input: ToolExecutionContext<TSchemaIn>) => Promise<Response>;\n}\n\nexport function createStreamableTool<\n TSchemaIn extends z.ZodSchema = z.ZodSchema,\n>(streamableTool: StreamableTool<TSchemaIn>): StreamableTool<TSchemaIn> {\n return {\n ...streamableTool,\n execute: (input: ToolExecutionContext<TSchemaIn>) => {\n return streamableTool.execute({\n ...input,\n runtimeContext: createRuntimeContext(input.runtimeContext),\n });\n },\n };\n}\n\nexport function createTool<\n TSchemaIn extends z.ZodSchema | undefined = undefined,\n TSchemaOut extends z.ZodSchema | undefined = undefined,\n TSuspendSchema extends z.ZodSchema = z.ZodSchema,\n TResumeSchema extends z.ZodSchema = z.ZodSchema,\n TContext extends ToolExecutionContext<\n TSchemaIn,\n TSuspendSchema,\n TResumeSchema\n > = ToolExecutionContext<TSchemaIn, TSuspendSchema, TResumeSchema>,\n TExecute extends ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n >[\"execute\"] = ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n >[\"execute\"],\n>(\n opts: ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext\n > & {\n execute?: TExecute;\n },\n): [TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TExecute] extends [\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n z.ZodSchema,\n Function,\n]\n ? Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> & {\n inputSchema: TSchemaIn;\n outputSchema: TSchemaOut;\n execute: (context: TContext) => Promise<any>;\n }\n : Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext> {\n // @ts-expect-error - TSchemaIn is not a ZodType\n return mastraCreateTool({\n ...opts,\n execute:\n typeof opts?.execute === \"function\"\n ? (((input) => {\n return opts.execute!({\n ...input,\n runtimeContext: createRuntimeContext(input.runtimeContext),\n });\n }) as TExecute)\n : opts.execute,\n });\n}\n\nexport type ExecWithContext<TF extends (...args: any[]) => any> = (\n input: Omit<Parameters<TF>[0], \"runtimeContext\"> & {\n runtimeContext: RuntimeContext<AppContext>;\n },\n) => ReturnType<TF>;\n\nexport interface ViewExport {\n title: string;\n icon: string;\n url: string;\n tools?: string[];\n rules?: string[];\n installBehavior?: \"none\" | \"open\" | \"autoPin\";\n}\n\nexport type Resources<Env = any, TSchema extends z.ZodTypeAny = never> = Array<\n (env: Env & DefaultEnv<TSchema>) => {\n name: string;\n icon: string;\n title: string;\n description?: string;\n tools: {\n read: (args: { uri: string }) => Promise<unknown>;\n search: (args: {\n term: string;\n cursor?: string;\n limit?: number;\n }) => Promise<unknown>;\n create?: (\n args: z.infer<typeof ResourceCreateInputSchema>,\n ) => Promise<unknown>;\n update?: (\n args: z.infer<typeof ResourceUpdateInputSchema>,\n ) => Promise<unknown>;\n delete?: (\n args: z.infer<typeof ResourceDeleteInputSchema>,\n ) => Promise<unknown>;\n };\n views?: {\n list?: { url?: string; tools?: string[]; rules?: string[] };\n detail?: {\n url?: string;\n mimeTypePattern?: string;\n resourceName?: string;\n tools?: string[];\n rules?: string[];\n };\n };\n }\n>;\nexport interface Integration {\n id: string;\n appId: string;\n}\nexport type CreatedTool =\n | ReturnType<typeof createTool>\n | ReturnType<typeof createStreamableTool>;\nexport function isStreamableTool(tool: CreatedTool): tool is StreamableTool {\n return tool && \"streamable\" in tool && tool.streamable === true;\n}\nexport interface CreateMCPServerOptions<\n Env = any,\n TSchema extends z.ZodTypeAny = never,\n> {\n before?: (env: Env & DefaultEnv<TSchema>) => Promise<void> | void;\n oauth?: {\n state?: TSchema;\n scopes?: string[];\n };\n views?: (\n env: Env & DefaultEnv<TSchema>,\n ) => Promise<ViewExport[]> | ViewExport[];\n resources?: Resources<Env, TSchema>;\n tools?:\n | Array<\n (\n env: Env & DefaultEnv<TSchema>,\n ) =>\n | Promise<CreatedTool>\n | CreatedTool\n | CreatedTool[]\n | Promise<CreatedTool[]>\n >\n | ((\n env: Env & DefaultEnv<TSchema>,\n ) => CreatedTool[] | Promise<CreatedTool[]>);\n}\n\nexport type Fetch<TEnv = any> = (\n req: Request,\n env: TEnv,\n ctx: ExecutionContext,\n) => Promise<Response> | Response;\n\nexport interface AppContext<TEnv = any> {\n env: TEnv;\n ctx: { waitUntil: (promise: Promise<any>) => void };\n req?: Request;\n}\n\nconst decoChatOAuthToolsFor = <TSchema extends z.ZodTypeAny = never>({\n state: schema,\n scopes,\n}: CreateMCPServerOptions<any, TSchema>[\"oauth\"] = {}) => {\n const jsonSchema = schema\n ? zodToJsonSchema(schema)\n : { type: \"object\", properties: {} };\n return [\n createTool({\n id: \"DECO_CHAT_OAUTH_START\",\n description: \"OAuth for Deco Chat\",\n inputSchema: z.object({\n returnUrl: z.string(),\n }),\n outputSchema: z.object({\n stateSchema: z.any(),\n scopes: z.array(z.string()).optional(),\n }),\n execute: () => {\n return Promise.resolve({\n stateSchema: jsonSchema,\n scopes,\n });\n },\n }),\n ];\n};\n\ntype CallTool = (opts: {\n toolCallId: string;\n toolCallInput: any;\n}) => Promise<any>;\n\nexport type MCPServer<TEnv = any, TSchema extends z.ZodTypeAny = never> = {\n fetch: Fetch<TEnv & DefaultEnv<TSchema>>;\n callTool: CallTool;\n};\n\nexport const createMCPServer = <\n TEnv = any,\n TSchema extends z.ZodTypeAny = never,\n>(\n options: CreateMCPServerOptions<TEnv, TSchema>,\n): MCPServer<TEnv, TSchema> => {\n const createServer = async (bindings: TEnv & DefaultEnv<TSchema>) => {\n await options.before?.(bindings);\n\n const server = new McpServer(\n { name: \"@deco/mcp-api\", version: \"1.0.0\" },\n { capabilities: { tools: {} } },\n );\n\n // Resolve resources first; build resource tools; append later\n const resolvedResources = await Promise.all(\n options.resources?.map((r) => r(bindings)) ?? [],\n );\n const readHandlers = new Map<\n string,\n (a: { uri: string }) => Promise<any>\n >();\n const searchHandlers = new Map<\n string,\n (a: { term: string; cursor?: string; limit?: number }) => Promise<any>\n >();\n const createHandlers = new Map<string, (a: any) => Promise<any>>();\n const updateHandlers = new Map<string, (a: any) => Promise<any>>();\n const deleteHandlers = new Map<string, (a: any) => Promise<any>>();\n for (const r of resolvedResources) {\n if (r?.tools?.read) readHandlers.set(r.name, r.tools.read);\n if (r?.tools?.search) searchHandlers.set(r.name, r.tools.search);\n if (r?.tools?.create) createHandlers.set(r.name, r.tools.create);\n if (r?.tools?.update) updateHandlers.set(r.name, r.tools.update);\n if (r?.tools?.delete) deleteHandlers.set(r.name, r.tools.delete);\n }\n const resourceTools: ReturnType<typeof createTool>[] = [];\n if (resolvedResources.length > 0) {\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_READ\",\n description: \"Read a resource by uri (name + uri)\",\n inputSchema: ResourcesReadInputSchema,\n outputSchema: ResourcesReadOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = readHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`READ not implemented for ${input.name}`);\n }\n // @ts-expect-error - input.name is not a string\n return fn({ uri: input.uri });\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_SEARCH\",\n description: \"Search resources (name + term)\",\n inputSchema: ResourceSearchInputSchema,\n outputSchema: ResourceSearchOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = searchHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`SEARCH not implemented for ${input.name}`);\n }\n // @ts-expect-error - input.name is not a string\n const { term, cursor, limit } = input;\n return fn({ term, cursor, limit });\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_CREATE\",\n description: \"Create a resource (name + content)\",\n inputSchema: ResourceCreateInputSchema,\n outputSchema: ResourceCreateOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = createHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`CREATE not implemented for ${input.name}`);\n }\n return fn(input);\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_UPDATE\",\n description: \"Update a resource (name + uri)\",\n inputSchema: ResourceUpdateInputSchema,\n outputSchema: ResourceUpdateOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = updateHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`UPDATE not implemented for ${input.name}`);\n }\n return fn(input);\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_DELETE\",\n description: \"Delete a resource (name + uri)\",\n inputSchema: ResourceDeleteInputSchema,\n outputSchema: ResourceDeleteOutputSchema,\n execute: (input) => {\n // @ts-expect-error - input.name is not a string\n const fn = deleteHandlers.get(input.name);\n if (!fn) {\n // @ts-expect-error - input.name is not a string\n throw new Error(`DELETE not implemented for ${input.name}`);\n }\n return fn(input);\n },\n }),\n );\n resourceTools.push(\n createTool({\n id: \"DECO_CHAT_RESOURCES_LIST\",\n description: \"List resource types\",\n inputSchema: z.object({}),\n outputSchema: ResourcesListOutputSchema,\n execute: () =>\n Promise.resolve({\n resources: resolvedResources.map((r) => ({\n name: r.name,\n icon: r.icon,\n title: r.title,\n description: r.description ?? \"\",\n hasCreate: Boolean(createHandlers.get(r.name)),\n hasUpdate: Boolean(updateHandlers.get(r.name)),\n hasDelete: Boolean(deleteHandlers.get(r.name)),\n })),\n }),\n }),\n );\n }\n\n const toolsFn =\n typeof options.tools === \"function\"\n ? options.tools\n : async (bindings: TEnv & DefaultEnv<TSchema>) => {\n if (typeof options.tools === \"function\") {\n return await options.tools(bindings);\n }\n return await Promise.all(\n options.tools?.flatMap(async (tool) => {\n const toolResult = tool(bindings);\n const awaited = await toolResult;\n if (Array.isArray(awaited)) {\n return awaited;\n }\n return [awaited];\n }) ?? [],\n ).then((t) => t.flat());\n };\n const tools = await toolsFn(bindings);\n\n tools.push(...decoChatOAuthToolsFor<TSchema>(options.oauth));\n tools.push(createStateValidationTool(options.oauth?.state));\n\n tools.push(\n createTool({\n id: `DECO_CHAT_VIEWS_LIST`,\n description: \"List views exposed by this MCP\",\n inputSchema: z.any(),\n outputSchema: ViewsListOutputSchema,\n execute: async () => {\n const base = ((await options.views?.(bindings)) ?? []).map((v) => ({\n id: undefined,\n // Stable machine name for routing: UPPERCASE + underscores\n name: v.title.toUpperCase().replace(/[^A-Z0-9]/g, \"_\"),\n title: v.title,\n description: undefined,\n icon: v.icon,\n url: v.url,\n tools: v.tools ?? [],\n rules: v.rules ?? [],\n installBehavior: v.installBehavior ?? \"none\",\n }));\n const resourceViews = resolvedResources\n .map((r) => {\n const listUrl =\n r.views?.list?.url ??\n `internal://resource/list?name=${encodeURIComponent(r.name)}`;\n\n // Default CRUD tool ids for resources\n const defaultListTools: string[] = (() => {\n const base = [\n \"DECO_CHAT_RESOURCES_LIST\",\n \"DECO_CHAT_RESOURCES_READ\",\n \"DECO_CHAT_RESOURCES_SEARCH\",\n ];\n const canCreate = Boolean(createHandlers.get(r.name));\n const canUpdate = Boolean(updateHandlers.get(r.name));\n const canDelete = Boolean(deleteHandlers.get(r.name));\n if (canCreate) base.push(\"DECO_CHAT_RESOURCES_CREATE\");\n if (canUpdate) base.push(\"DECO_CHAT_RESOURCES_UPDATE\");\n if (canDelete) base.push(\"DECO_CHAT_RESOURCES_DELETE\");\n return base;\n })();\n\n const defaultListRules: string[] = [\n `You are viewing the ${\n r.title ?? r.name\n } resources list. Resources are changeable via Resource tools (DECO_CHAT_RESOURCES_*). Use the appropriate tools to read, search, create, update, or delete items; do not fabricate data.`,\n ];\n\n const list = [\n {\n name: `${r.name.toUpperCase()}_LIST`,\n title: `${r.name} List`,\n description: r.description,\n icon: r.icon,\n url: listUrl,\n tools: r.views?.list?.tools ?? defaultListTools,\n rules: r.views?.list?.rules ?? defaultListRules,\n },\n ];\n const detailUrl =\n r.views?.detail?.url ??\n `internal://resource/detail?name=${encodeURIComponent(r.name)}`;\n const detail = [\n {\n name: `${r.name.toUpperCase()}_DETAIL`,\n title: `${r.name} Detail`,\n description: r.description,\n icon: r.icon,\n url: detailUrl,\n mimeTypePattern: r.views?.detail?.mimeTypePattern,\n resourceName: r.views?.detail?.resourceName ?? r.name,\n tools: r.views?.detail?.tools ?? [],\n rules: r.views?.detail?.rules ?? [],\n },\n ];\n return [...list, ...detail];\n })\n .flat();\n\n return { views: [...base, ...resourceViews] };\n },\n }),\n );\n\n for (const tool of tools) {\n server.registerTool(\n tool.id,\n {\n _meta: {\n streamable: isStreamableTool(tool),\n },\n description: tool.description,\n inputSchema:\n tool.inputSchema && \"shape\" in tool.inputSchema\n ? (tool.inputSchema.shape as z.ZodRawShape)\n : z.object({}).shape,\n outputSchema: isStreamableTool(tool)\n ? z.object({ bytes: z.record(z.string(), z.number()) }).shape\n : tool.outputSchema &&\n typeof tool.outputSchema === \"object\" &&\n \"shape\" in tool.outputSchema\n ? (tool.outputSchema.shape as z.ZodRawShape)\n : z.object({}).shape,\n },\n async (args) => {\n let result = await tool.execute!({\n context: args,\n runId: crypto.randomUUID(),\n runtimeContext: createRuntimeContext(),\n });\n\n if (isStreamableTool(tool) && result instanceof Response) {\n result = { bytes: await result.bytes() };\n }\n return {\n structuredContent: result,\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result),\n },\n ],\n };\n },\n );\n }\n\n return { server, tools };\n };\n\n const fetch = async (\n req: Request,\n env: TEnv & DefaultEnv<TSchema>,\n _ctx: ExecutionContext,\n ) => {\n const { server } = await createServer(env);\n const transport = new HttpServerTransport();\n\n await server.connect(transport);\n\n return await transport.handleMessage(req);\n };\n\n const callTool: CallTool = async ({ toolCallId, toolCallInput }) => {\n const currentState = State.getStore();\n if (!currentState) {\n throw new Error(\"Missing state, did you forget to call State.bind?\");\n }\n const env = currentState?.env;\n const { tools } = await createServer(env);\n const tool = tools.find((t) => t.id === toolCallId);\n const execute = tool?.execute;\n if (!execute) {\n throw new Error(\n `Tool ${toolCallId} not found or does not have an execute function`,\n );\n }\n\n return execute({\n context: toolCallInput,\n runId: crypto.randomUUID(),\n runtimeContext: createRuntimeContext(),\n });\n };\n\n return {\n fetch,\n callTool,\n };\n};\n"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// src/bindings/deconfig/helpers.ts
|
|
2
|
+
var normalizeDirectory = (dir) => {
|
|
3
|
+
const normalized = dir.startsWith("/") ? dir : `/${dir}`;
|
|
4
|
+
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
5
|
+
};
|
|
6
|
+
var ResourcePath = {
|
|
7
|
+
build: (directory, resourceId) => {
|
|
8
|
+
const normalizedDir = normalizeDirectory(directory);
|
|
9
|
+
return `${normalizedDir}/${resourceId}.json`;
|
|
10
|
+
},
|
|
11
|
+
extract: (path) => {
|
|
12
|
+
const match = path.match(/^(.+)\/(.+)\.json$/);
|
|
13
|
+
if (!match) {
|
|
14
|
+
throw new Error("Invalid resource path");
|
|
15
|
+
}
|
|
16
|
+
return { directory: match[1], resourceId: match[2] };
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
var ResourceUri = {
|
|
20
|
+
build: (integrationId, resourceName, resourceId) => {
|
|
21
|
+
return `rsc://${integrationId}/${resourceName}/${resourceId}`;
|
|
22
|
+
},
|
|
23
|
+
unwind: (uri) => {
|
|
24
|
+
const match = uri.match(/^rsc:\/\/[^/]+\/([^/]+)\/(.+)$/);
|
|
25
|
+
if (!match) {
|
|
26
|
+
throw new Error("Invalid Resources 2.0 URI format");
|
|
27
|
+
}
|
|
28
|
+
return { resourceName: match[1], resourceId: match[2] };
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
function getMetadataValue(metadata, key) {
|
|
32
|
+
if (!metadata || typeof metadata !== "object") return void 0;
|
|
33
|
+
const metaObj = metadata;
|
|
34
|
+
if (key in metaObj) return metaObj[key];
|
|
35
|
+
const nested = metaObj.metadata;
|
|
36
|
+
if (nested && typeof nested === "object" && key in nested) {
|
|
37
|
+
return nested[key];
|
|
38
|
+
}
|
|
39
|
+
return void 0;
|
|
40
|
+
}
|
|
41
|
+
function getMetadataString(metadata, key) {
|
|
42
|
+
const value = getMetadataValue(metadata, key);
|
|
43
|
+
return typeof value === "string" ? value : void 0;
|
|
44
|
+
}
|
|
45
|
+
var toAsyncIterator = (emitter, eventType = "message") => {
|
|
46
|
+
const queue = [];
|
|
47
|
+
let done = false;
|
|
48
|
+
let waitPromise = null;
|
|
49
|
+
const triggerLoop = () => {
|
|
50
|
+
if (waitPromise) {
|
|
51
|
+
waitPromise();
|
|
52
|
+
waitPromise = null;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const messageHandler = (data) => {
|
|
56
|
+
try {
|
|
57
|
+
queue.push(JSON.parse(data.data));
|
|
58
|
+
} catch {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
triggerLoop();
|
|
62
|
+
};
|
|
63
|
+
const errorHandler = () => {
|
|
64
|
+
done = true;
|
|
65
|
+
triggerLoop();
|
|
66
|
+
};
|
|
67
|
+
emitter.addEventListener(eventType, messageHandler);
|
|
68
|
+
emitter.addEventListener("error", errorHandler);
|
|
69
|
+
return {
|
|
70
|
+
async *[Symbol.asyncIterator]() {
|
|
71
|
+
try {
|
|
72
|
+
while (true) {
|
|
73
|
+
const value = queue.shift();
|
|
74
|
+
if (value) {
|
|
75
|
+
yield value;
|
|
76
|
+
} else {
|
|
77
|
+
if (done) return;
|
|
78
|
+
await new Promise((resolve) => waitPromise = resolve);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} finally {
|
|
82
|
+
emitter.removeEventListener(eventType, messageHandler);
|
|
83
|
+
emitter.removeEventListener("error", errorHandler);
|
|
84
|
+
emitter.close();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export { ResourcePath, ResourceUri, getMetadataString, getMetadataValue, normalizeDirectory, toAsyncIterator };
|
|
91
|
+
//# sourceMappingURL=chunk-UHR3BLMF.js.map
|
|
92
|
+
//# sourceMappingURL=chunk-UHR3BLMF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bindings/deconfig/helpers.ts"],"names":[],"mappings":"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","file":"chunk-UHR3BLMF.js","sourcesContent":["// Helper functions for DeconfigResource\n\nexport const normalizeDirectory = (dir: string) => {\n // Ensure directory starts with / and doesn't end with /\n const normalized = dir.startsWith(\"/\") ? dir : `/${dir}`;\n return normalized.endsWith(\"/\") ? normalized.slice(0, -1) : normalized;\n};\n\nexport const ResourcePath = {\n build: (directory: string, resourceId: string) => {\n const normalizedDir = normalizeDirectory(directory);\n return `${normalizedDir}/${resourceId}.json`;\n },\n extract: (path: string) => {\n const match = path.match(/^(.+)\\/(.+)\\.json$/);\n if (!match) {\n throw new Error(\"Invalid resource path\");\n }\n return { directory: match[1], resourceId: match[2] };\n },\n};\n\nexport const ResourceUri = {\n build: (integrationId: string, resourceName: string, resourceId: string) => {\n return `rsc://${integrationId}/${resourceName}/${resourceId}`;\n },\n unwind: (uri: string) => {\n const match = uri.match(/^rsc:\\/\\/[^/]+\\/([^/]+)\\/(.+)$/);\n if (!match) {\n throw new Error(\"Invalid Resources 2.0 URI format\");\n }\n return { resourceName: match[1], resourceId: match[2] };\n },\n};\n\nexport function getMetadataValue(metadata: unknown, key: string): unknown {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const metaObj = metadata as Record<string, unknown>;\n if (key in metaObj) return metaObj[key];\n const nested = metaObj.metadata;\n if (nested && typeof nested === \"object\" && key in nested) {\n return (nested as Record<string, unknown>)[key];\n }\n return undefined;\n}\n\nexport function getMetadataString(\n metadata: unknown,\n key: string,\n): string | undefined {\n const value = getMetadataValue(metadata, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport const toAsyncIterator = <T>(\n emitter: EventSource,\n eventType: string = \"message\",\n): AsyncIterable<T> => {\n const queue: T[] = [];\n let done = false;\n let waitPromise: ((data?: T) => void) | null = null;\n\n const triggerLoop = () => {\n if (waitPromise) {\n waitPromise();\n waitPromise = null;\n }\n };\n\n const messageHandler = (data: MessageEvent) => {\n try {\n queue.push(JSON.parse(data.data));\n } catch {\n // Silently ignore malformed data or optionally log error\n return;\n }\n triggerLoop();\n };\n\n const errorHandler = () => {\n done = true;\n triggerLoop();\n };\n\n emitter.addEventListener(eventType, messageHandler);\n emitter.addEventListener(\"error\", errorHandler);\n\n return {\n async *[Symbol.asyncIterator]() {\n try {\n while (true) {\n const value = queue.shift();\n if (value) {\n yield value;\n } else {\n if (done) return;\n await new Promise((resolve) => (waitPromise = resolve));\n }\n }\n } finally {\n emitter.removeEventListener(eventType, messageHandler);\n emitter.removeEventListener(\"error\", errorHandler);\n emitter.close();\n }\n },\n };\n};\n"]}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
type ExtractResourceName<K> = K extends `DECO_RESOURCE_${infer Name}_READ` ? Name : never;
|
|
2
|
+
type SubscribeMethodName<Name extends string> = `DECO_RESOURCE_${Name}_SUBSCRIBE`;
|
|
3
|
+
type ExtractReadData<T> = T extends Promise<{
|
|
4
|
+
data: infer D;
|
|
5
|
+
}> ? D : T extends {
|
|
6
|
+
data: infer D;
|
|
7
|
+
} ? D : never;
|
|
8
|
+
type SubscribeMethods<T> = {
|
|
9
|
+
[K in keyof T as K extends `DECO_RESOURCE_${string}_READ` ? SubscribeMethodName<ExtractResourceName<K>> : never]: K extends `DECO_RESOURCE_${string}_READ` ? T[K] extends (...args: any) => any ? (args: {
|
|
10
|
+
id: string;
|
|
11
|
+
} | {
|
|
12
|
+
uri: string;
|
|
13
|
+
}) => AsyncIterableIterator<{
|
|
14
|
+
uri: string;
|
|
15
|
+
data: ExtractReadData<Awaited<ReturnType<T[K]>>>;
|
|
16
|
+
}> : never : never;
|
|
17
|
+
};
|
|
18
|
+
type MCPClient<T> = {
|
|
19
|
+
[K in keyof T]: T[K] extends (...args: any) => any ? (args: Parameters<T[K]>[0], init?: CustomInit) => Promise<Awaited<ReturnType<T[K]>>> : never;
|
|
20
|
+
} & SubscribeMethods<T>;
|
|
21
|
+
type CustomInit = RequestInit & {
|
|
22
|
+
handleResponse?: (response: Response) => Promise<unknown>;
|
|
23
|
+
};
|
|
24
|
+
declare const DECO_MCP_CLIENT_HEADER = "X-Deco-MCP-Client";
|
|
25
|
+
declare const DEFAULT_INIT: CustomInit;
|
|
26
|
+
declare const createClient: <T>(init?: CustomInit) => MCPClient<T>;
|
|
27
|
+
|
|
28
|
+
export { type CustomInit, DECO_MCP_CLIENT_HEADER, DEFAULT_INIT, type MCPClient, createClient };
|
package/dist/client.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"client.js"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type SSEConnection = {
|
|
2
|
+
type: "SSE";
|
|
3
|
+
url: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
type WebsocketConnection = {
|
|
8
|
+
type: "Websocket";
|
|
9
|
+
url: string;
|
|
10
|
+
token?: string;
|
|
11
|
+
};
|
|
12
|
+
type DecoConnection = {
|
|
13
|
+
type: "Deco";
|
|
14
|
+
tenant: string;
|
|
15
|
+
token?: string;
|
|
16
|
+
};
|
|
17
|
+
type InnateConnection = {
|
|
18
|
+
type: "INNATE";
|
|
19
|
+
name: string;
|
|
20
|
+
workspace?: string;
|
|
21
|
+
};
|
|
22
|
+
type HTTPConnection = {
|
|
23
|
+
type: "HTTP";
|
|
24
|
+
url: string;
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
token?: string;
|
|
27
|
+
};
|
|
28
|
+
type MCPConnection = SSEConnection | WebsocketConnection | InnateConnection | DecoConnection | HTTPConnection;
|
|
29
|
+
|
|
30
|
+
export type { MCPConnection as M };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { DrizzleConfig } from 'drizzle-orm';
|
|
2
|
+
import * as drizzleOrm from 'drizzle-orm';
|
|
3
|
+
export { drizzleOrm as orm };
|
|
4
|
+
import { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
|
|
5
|
+
export * from 'drizzle-orm/sqlite-core';
|
|
6
|
+
import { D as DefaultEnv } from './index-AKVjfH4b.js';
|
|
7
|
+
import '@cloudflare/workers-types';
|
|
8
|
+
import 'zod';
|
|
9
|
+
import '@mastra/core';
|
|
10
|
+
import '@mastra/core/di';
|
|
11
|
+
import './mcp-Bv7IAgWX.js';
|
|
12
|
+
import './connection-DDtQYrea.js';
|
|
13
|
+
import './resources.js';
|
|
14
|
+
|
|
15
|
+
declare function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>({ DECO_WORKSPACE_DB }: Pick<DefaultEnv, "DECO_WORKSPACE_DB">, config?: DrizzleConfig<TSchema>): SqliteRemoteDatabase<TSchema>;
|
|
16
|
+
/**
|
|
17
|
+
* The following code is a custom migration system tweaked
|
|
18
|
+
* from the durable-sqlite original migrator.
|
|
19
|
+
*
|
|
20
|
+
* @see https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/durable-sqlite/migrator.ts
|
|
21
|
+
*
|
|
22
|
+
* It applies the migrations without transactions, as a workaround
|
|
23
|
+
* while we don't have remote transactions support on the
|
|
24
|
+
* workspace database durable object. Not ideal and we should
|
|
25
|
+
* look into implementing some way of doing transactions soon.
|
|
26
|
+
*/
|
|
27
|
+
interface MigrationMeta {
|
|
28
|
+
sql: string[];
|
|
29
|
+
folderMillis: number;
|
|
30
|
+
hash: string;
|
|
31
|
+
bps: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface MigrationConfig {
|
|
34
|
+
journal: {
|
|
35
|
+
entries: {
|
|
36
|
+
idx: number;
|
|
37
|
+
when: number;
|
|
38
|
+
tag: string;
|
|
39
|
+
breakpoints: boolean;
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
migrations: Record<string, string>;
|
|
43
|
+
debug?: boolean;
|
|
44
|
+
}
|
|
45
|
+
declare function migrateWithoutTransaction(db: SqliteRemoteDatabase, config: MigrationConfig): Promise<void>;
|
|
46
|
+
|
|
47
|
+
export { type MigrationConfig, type MigrationMeta, drizzle, migrateWithoutTransaction };
|
package/dist/drizzle.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { drizzle as drizzle$1 } from 'drizzle-orm/sqlite-proxy';
|
|
2
|
+
export * from 'drizzle-orm/sqlite-core';
|
|
3
|
+
import { sql } from 'drizzle-orm';
|
|
4
|
+
import * as drizzleOrm from 'drizzle-orm';
|
|
5
|
+
export { drizzleOrm as orm };
|
|
6
|
+
|
|
7
|
+
// src/drizzle.ts
|
|
8
|
+
var mapGetResult = ({ result: [page] }) => {
|
|
9
|
+
return page.results ?? [];
|
|
10
|
+
};
|
|
11
|
+
var mapPostResult = ({ result }) => {
|
|
12
|
+
return result.map((page) => page.results ?? []).flat().map(Object.values);
|
|
13
|
+
};
|
|
14
|
+
function drizzle({ DECO_WORKSPACE_DB }, config) {
|
|
15
|
+
return drizzle$1((sql2, params, method) => {
|
|
16
|
+
const asRows = method === "get" ? mapGetResult : mapPostResult;
|
|
17
|
+
return DECO_WORKSPACE_DB.query({
|
|
18
|
+
sql: sql2,
|
|
19
|
+
params
|
|
20
|
+
}).then((result) => ({ rows: asRows(result) }));
|
|
21
|
+
}, config);
|
|
22
|
+
}
|
|
23
|
+
function readMigrationFiles({
|
|
24
|
+
journal,
|
|
25
|
+
migrations
|
|
26
|
+
}) {
|
|
27
|
+
const migrationQueries = [];
|
|
28
|
+
for (const journalEntry of journal.entries) {
|
|
29
|
+
const query = migrations[`m${journalEntry.idx.toString().padStart(4, "0")}`];
|
|
30
|
+
if (!query) {
|
|
31
|
+
throw new Error(`Missing migration: ${journalEntry.tag}`);
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const result = query.split("--> statement-breakpoint").map((it) => {
|
|
35
|
+
return it;
|
|
36
|
+
});
|
|
37
|
+
migrationQueries.push({
|
|
38
|
+
sql: result,
|
|
39
|
+
bps: journalEntry.breakpoints,
|
|
40
|
+
folderMillis: journalEntry.when,
|
|
41
|
+
hash: ""
|
|
42
|
+
});
|
|
43
|
+
} catch {
|
|
44
|
+
throw new Error(`Failed to parse migration: ${journalEntry.tag}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return migrationQueries;
|
|
48
|
+
}
|
|
49
|
+
async function migrateWithoutTransaction(db, config) {
|
|
50
|
+
const debug = config.debug ?? false;
|
|
51
|
+
if (debug) console.log("Migrating database");
|
|
52
|
+
const migrations = readMigrationFiles(config);
|
|
53
|
+
if (debug) console.log("Migrations", migrations);
|
|
54
|
+
try {
|
|
55
|
+
if (debug) console.log("Setting up migrations table");
|
|
56
|
+
const migrationsTable = "__drizzle_migrations";
|
|
57
|
+
const migrationTableCreate = sql`
|
|
58
|
+
CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
|
|
59
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
60
|
+
hash text NOT NULL,
|
|
61
|
+
created_at numeric
|
|
62
|
+
)
|
|
63
|
+
`;
|
|
64
|
+
await db.run(migrationTableCreate);
|
|
65
|
+
const dbMigrations = await db.values(
|
|
66
|
+
sql`SELECT id, hash, created_at FROM ${sql.identifier(
|
|
67
|
+
migrationsTable
|
|
68
|
+
)} ORDER BY created_at DESC LIMIT 1`
|
|
69
|
+
);
|
|
70
|
+
const lastDbMigration = dbMigrations[0] ?? void 0;
|
|
71
|
+
if (debug) console.log("Last applied migration:", lastDbMigration);
|
|
72
|
+
for (const migration of migrations) {
|
|
73
|
+
const hasNoMigrations = lastDbMigration === void 0 || !lastDbMigration.length;
|
|
74
|
+
if (hasNoMigrations || Number(lastDbMigration[2]) < migration.folderMillis) {
|
|
75
|
+
if (debug) console.log(`Applying migration: ${migration.folderMillis}`);
|
|
76
|
+
try {
|
|
77
|
+
for (const stmt of migration.sql) {
|
|
78
|
+
if (stmt.trim()) {
|
|
79
|
+
if (debug) {
|
|
80
|
+
console.log("Executing:", stmt.substring(0, 100) + "...");
|
|
81
|
+
}
|
|
82
|
+
await db.run(sql.raw(stmt));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
await db.run(
|
|
86
|
+
sql`INSERT INTO ${sql.identifier(
|
|
87
|
+
migrationsTable
|
|
88
|
+
)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`
|
|
89
|
+
);
|
|
90
|
+
if (debug) {
|
|
91
|
+
console.log(
|
|
92
|
+
`\u2705 Migration ${migration.folderMillis} applied successfully`
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
} catch (migrationError) {
|
|
96
|
+
console.error(
|
|
97
|
+
`\u274C Migration ${migration.folderMillis} failed:`,
|
|
98
|
+
migrationError
|
|
99
|
+
);
|
|
100
|
+
throw new Error(
|
|
101
|
+
`Migration failed at ${migration.folderMillis}: ${migrationError instanceof Error ? migrationError.message : String(migrationError)}`
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
if (debug) {
|
|
106
|
+
console.log(
|
|
107
|
+
`\u23ED\uFE0F Skipping already applied migration: ${migration.folderMillis}`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (debug) console.log("\u2705 All migrations completed successfully");
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error("\u274C Migration process failed:", error);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export { drizzle, migrateWithoutTransaction };
|
|
120
|
+
//# sourceMappingURL=drizzle.js.map
|
|
121
|
+
//# sourceMappingURL=drizzle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/drizzle.ts"],"names":["drizzleProxy","sql"],"mappings":"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","file":"drizzle.js","sourcesContent":["import type { DrizzleConfig } from \"drizzle-orm\";\nimport {\n drizzle as drizzleProxy,\n type SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport { QueryResult } from \"./mcp.ts\";\nexport * from \"drizzle-orm/sqlite-core\";\nexport * as orm from \"drizzle-orm\";\nimport { sql } from \"drizzle-orm\";\nimport { DefaultEnv } from \"./index.ts\";\n\nconst mapGetResult = ({ result: [page] }: { result: QueryResult[] }) => {\n return page.results ?? [];\n};\n\nconst mapPostResult = ({ result }: { result: QueryResult[] }) => {\n return (\n result\n .map((page) => page.results ?? [])\n .flat()\n // @ts-expect-error - this is ok, result comes as unknown\n .map(Object.values)\n );\n};\n\nexport function drizzle<\n TSchema extends Record<string, unknown> = Record<string, never>,\n>(\n { DECO_WORKSPACE_DB }: Pick<DefaultEnv, \"DECO_WORKSPACE_DB\">,\n config?: DrizzleConfig<TSchema>,\n) {\n return drizzleProxy((sql, params, method) => {\n // https://orm.drizzle.team/docs/connect-drizzle-proxy says\n // Drizzle always waits for {rows: string[][]} or {rows: string[]} for the return value.\n // When the method is get, you should return a value as {rows: string[]}.\n // Otherwise, you should return {rows: string[][]}.\n const asRows = method === \"get\" ? mapGetResult : mapPostResult;\n return DECO_WORKSPACE_DB.query({\n sql,\n params,\n }).then((result) => ({ rows: asRows(result) }));\n }, config);\n}\n\n/**\n * The following code is a custom migration system tweaked\n * from the durable-sqlite original migrator.\n *\n * @see https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/durable-sqlite/migrator.ts\n *\n * It applies the migrations without transactions, as a workaround\n * while we don't have remote transactions support on the\n * workspace database durable object. Not ideal and we should\n * look into implementing some way of doing transactions soon.\n */\n\nexport interface MigrationMeta {\n sql: string[];\n folderMillis: number;\n hash: string;\n bps: boolean;\n}\n\nexport interface MigrationConfig {\n journal: {\n entries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n };\n migrations: Record<string, string>;\n debug?: boolean;\n}\n\nfunction readMigrationFiles({\n journal,\n migrations,\n}: MigrationConfig): MigrationMeta[] {\n const migrationQueries: MigrationMeta[] = [];\n\n for (const journalEntry of journal.entries) {\n const query =\n migrations[`m${journalEntry.idx.toString().padStart(4, \"0\")}`];\n\n if (!query) {\n throw new Error(`Missing migration: ${journalEntry.tag}`);\n }\n\n try {\n const result = query.split(\"--> statement-breakpoint\").map((it) => {\n return it;\n });\n\n migrationQueries.push({\n sql: result,\n bps: journalEntry.breakpoints,\n folderMillis: journalEntry.when,\n hash: \"\",\n });\n } catch {\n throw new Error(`Failed to parse migration: ${journalEntry.tag}`);\n }\n }\n\n return migrationQueries;\n}\n\nexport async function migrateWithoutTransaction(\n db: SqliteRemoteDatabase,\n config: MigrationConfig,\n): Promise<void> {\n const debug = config.debug ?? false;\n\n if (debug) console.log(\"Migrating database\");\n const migrations = readMigrationFiles(config);\n if (debug) console.log(\"Migrations\", migrations);\n\n try {\n if (debug) console.log(\"Setting up migrations table\");\n const migrationsTable = \"__drizzle_migrations\";\n\n // Create migrations table if it doesn't exist\n // Note: Changed from SERIAL to INTEGER PRIMARY KEY AUTOINCREMENT for SQLite compatibility\n const migrationTableCreate = sql`\n CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n hash text NOT NULL,\n created_at numeric\n )\n `;\n await db.run(migrationTableCreate);\n\n // Get the last applied migration\n const dbMigrations = await db.values<[number, string, string]>(\n sql`SELECT id, hash, created_at FROM ${sql.identifier(\n migrationsTable,\n )} ORDER BY created_at DESC LIMIT 1`,\n );\n\n const lastDbMigration = dbMigrations[0] ?? undefined;\n if (debug) console.log(\"Last applied migration:\", lastDbMigration);\n\n // Apply pending migrations sequentially (without transaction wrapper)\n for (const migration of migrations) {\n const hasNoMigrations =\n lastDbMigration === undefined || !lastDbMigration.length;\n if (\n hasNoMigrations ||\n Number(lastDbMigration[2])! < migration.folderMillis\n ) {\n if (debug) console.log(`Applying migration: ${migration.folderMillis}`);\n\n try {\n // Execute all statements in the migration\n for (const stmt of migration.sql) {\n if (stmt.trim()) {\n // Skip empty statements\n if (debug) {\n console.log(\"Executing:\", stmt.substring(0, 100) + \"...\");\n }\n await db.run(sql.raw(stmt));\n }\n }\n\n // Record successful migration\n await db.run(\n sql`INSERT INTO ${sql.identifier(\n migrationsTable,\n )} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n );\n\n if (debug) {\n console.log(\n `✅ Migration ${migration.folderMillis} applied successfully`,\n );\n }\n } catch (migrationError: unknown) {\n console.error(\n `❌ Migration ${migration.folderMillis} failed:`,\n migrationError,\n );\n throw new Error(\n `Migration failed at ${migration.folderMillis}: ${\n migrationError instanceof Error\n ? migrationError.message\n : String(migrationError)\n }`,\n );\n }\n } else {\n if (debug) {\n console.log(\n `⏭️ Skipping already applied migration: ${migration.folderMillis}`,\n );\n }\n }\n }\n\n if (debug) console.log(\"✅ All migrations completed successfully\");\n } catch (error: unknown) {\n console.error(\"❌ Migration process failed:\", error);\n throw error;\n }\n}\n"]}
|