0pflow 0.1.0-dev.628bd97 → 0.1.0-dev.67aecec
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/dist/__tests__/discover.integration.test.d.ts +2 -0
- package/dist/__tests__/discover.integration.test.d.ts.map +1 -0
- package/dist/__tests__/discover.integration.test.js +137 -0
- package/dist/__tests__/discover.integration.test.js.map +1 -0
- package/dist/__tests__/factory.test.js +13 -0
- package/dist/__tests__/factory.test.js.map +1 -1
- package/dist/__tests__/integration.e2e.test.js +2 -1
- package/dist/__tests__/integration.e2e.test.js.map +1 -1
- package/dist/__tests__/integration.test.js +87 -82
- package/dist/__tests__/integration.test.js.map +1 -1
- package/dist/agent.d.ts +7 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +75 -10
- package/dist/agent.js.map +1 -1
- package/dist/cli/__tests__/discovery.test.js +1 -1
- package/dist/cli/__tests__/discovery.test.js.map +1 -1
- package/dist/cli/app.d.ts +6 -0
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +31 -0
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/cloud-dev.d.ts +7 -0
- package/dist/cli/cloud-dev.d.ts.map +1 -0
- package/dist/cli/cloud-dev.js +570 -0
- package/dist/cli/cloud-dev.js.map +1 -0
- package/dist/cli/deploy.d.ts +27 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +332 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/discovery.d.ts +10 -0
- package/dist/cli/discovery.d.ts.map +1 -1
- package/dist/cli/discovery.js +42 -0
- package/dist/cli/discovery.js.map +1 -1
- package/dist/cli/env.d.ts +3 -1
- package/dist/cli/env.d.ts.map +1 -1
- package/dist/cli/env.js +9 -4
- package/dist/cli/env.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +208 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install.d.ts +4 -0
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +63 -32
- package/dist/cli/install.js.map +1 -1
- package/dist/cli/mcp/config.d.ts +0 -1
- package/dist/cli/mcp/config.d.ts.map +1 -1
- package/dist/cli/mcp/config.js +2 -4
- package/dist/cli/mcp/config.js.map +1 -1
- package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
- package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
- package/dist/cli/mcp/lib/scaffolding.js +234 -0
- package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
- package/dist/cli/mcp/lib/templates.d.ts +1 -0
- package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
- package/dist/cli/mcp/lib/templates.js.map +1 -1
- package/dist/cli/mcp/tools/createApp.d.ts +1 -0
- package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
- package/dist/cli/mcp/tools/createApp.js +12 -53
- package/dist/cli/mcp/tools/createApp.js.map +1 -1
- package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
- package/dist/cli/mcp/tools/createDatabase.js +2 -41
- package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
- package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
- package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
- package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
- package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
- package/dist/cli/mcp/tools/getRun.d.ts +22 -0
- package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
- package/dist/cli/mcp/tools/getRun.js +80 -0
- package/dist/cli/mcp/tools/getRun.js.map +1 -0
- package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
- package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
- package/dist/cli/mcp/tools/getTrace.js +104 -0
- package/dist/cli/mcp/tools/getTrace.js.map +1 -0
- package/dist/cli/mcp/tools/index.d.ts +94 -1
- package/dist/cli/mcp/tools/index.d.ts.map +1 -1
- package/dist/cli/mcp/tools/index.js +16 -0
- package/dist/cli/mcp/tools/index.js.map +1 -1
- package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
- package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
- package/dist/cli/mcp/tools/listIntegrations.js +53 -0
- package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
- package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
- package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
- package/dist/cli/mcp/tools/listRuns.js +72 -0
- package/dist/cli/mcp/tools/listRuns.js.map +1 -0
- package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
- package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
- package/dist/cli/mcp/tools/listWorkflows.js +45 -0
- package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
- package/dist/cli/mcp/tools/runNode.d.ts +17 -0
- package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
- package/dist/cli/mcp/tools/runNode.js +74 -0
- package/dist/cli/mcp/tools/runNode.js.map +1 -0
- package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
- package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
- package/dist/cli/mcp/tools/runWorkflow.js +66 -0
- package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
- package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
- package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
- package/dist/cli/mcp/tools/setupAppSchema.js +11 -132
- package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
- package/dist/cli/mcp/tools/utils.d.ts +7 -0
- package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
- package/dist/cli/mcp/tools/utils.js +28 -0
- package/dist/cli/mcp/tools/utils.js.map +1 -0
- package/dist/cli/run.d.ts +2 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +560 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/trace.d.ts +5 -0
- package/dist/cli/trace.d.ts.map +1 -1
- package/dist/cli/trace.js +1 -1
- package/dist/cli/trace.js.map +1 -1
- package/dist/connections/cloud-auth.d.ts +46 -0
- package/dist/connections/cloud-auth.d.ts.map +1 -0
- package/dist/connections/cloud-auth.js +247 -0
- package/dist/connections/cloud-auth.js.map +1 -0
- package/dist/connections/cloud-client.d.ts +25 -0
- package/dist/connections/cloud-client.d.ts.map +1 -0
- package/dist/connections/cloud-client.js +66 -0
- package/dist/connections/cloud-client.js.map +1 -0
- package/dist/connections/cloud-integration-provider.d.ts +22 -0
- package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
- package/dist/connections/cloud-integration-provider.js +42 -0
- package/dist/connections/cloud-integration-provider.js.map +1 -0
- package/dist/connections/connection-labels.d.ts +14 -0
- package/dist/connections/connection-labels.d.ts.map +1 -0
- package/dist/connections/connection-labels.js +46 -0
- package/dist/connections/connection-labels.js.map +1 -0
- package/dist/connections/index.d.ts +12 -0
- package/dist/connections/index.d.ts.map +1 -0
- package/dist/connections/index.js +10 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/integration-provider.d.ts +39 -0
- package/dist/connections/integration-provider.d.ts.map +1 -0
- package/dist/connections/integration-provider.js +20 -0
- package/dist/connections/integration-provider.js.map +1 -0
- package/dist/connections/local-integration-provider.d.ts +29 -0
- package/dist/connections/local-integration-provider.d.ts.map +1 -0
- package/dist/connections/local-integration-provider.js +71 -0
- package/dist/connections/local-integration-provider.js.map +1 -0
- package/dist/connections/nango-client.d.ts +14 -0
- package/dist/connections/nango-client.d.ts.map +1 -0
- package/dist/connections/nango-client.js +51 -0
- package/dist/connections/nango-client.js.map +1 -0
- package/dist/connections/resolver.d.ts +26 -0
- package/dist/connections/resolver.d.ts.map +1 -0
- package/dist/connections/resolver.js +48 -0
- package/dist/connections/resolver.js.map +1 -0
- package/dist/connections/schema.d.ts +8 -0
- package/dist/connections/schema.d.ts.map +1 -0
- package/dist/connections/schema.js +31 -0
- package/dist/connections/schema.js.map +1 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +4 -0
- package/dist/context.js.map +1 -1
- package/dist/dev-ui/api.d.ts +18 -0
- package/dist/dev-ui/api.d.ts.map +1 -0
- package/dist/dev-ui/api.js +273 -0
- package/dist/dev-ui/api.js.map +1 -0
- package/dist/dev-ui/dag/extractor.d.ts +19 -0
- package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
- package/dist/dev-ui/dag/extractor.js +716 -0
- package/dist/dev-ui/dag/extractor.js.map +1 -0
- package/dist/dev-ui/dag/types.d.ts +42 -0
- package/dist/dev-ui/dag/types.d.ts.map +1 -0
- package/dist/dev-ui/dag/types.js +2 -0
- package/dist/dev-ui/dag/types.js.map +1 -0
- package/dist/dev-ui/deploy-api.d.ts +14 -0
- package/dist/dev-ui/deploy-api.d.ts.map +1 -0
- package/dist/dev-ui/deploy-api.js +112 -0
- package/dist/dev-ui/deploy-api.js.map +1 -0
- package/dist/dev-ui/dev-server.d.ts +18 -0
- package/dist/dev-ui/dev-server.d.ts.map +1 -0
- package/dist/dev-ui/dev-server.js +275 -0
- package/dist/dev-ui/dev-server.js.map +1 -0
- package/dist/dev-ui/index.d.ts +3 -0
- package/dist/dev-ui/index.d.ts.map +1 -0
- package/dist/dev-ui/index.js +2 -0
- package/dist/dev-ui/index.js.map +1 -0
- package/dist/dev-ui/pty.d.ts +16 -0
- package/dist/dev-ui/pty.d.ts.map +1 -0
- package/dist/dev-ui/pty.js +87 -0
- package/dist/dev-ui/pty.js.map +1 -0
- package/dist/dev-ui/watcher.d.ts +12 -0
- package/dist/dev-ui/watcher.d.ts.map +1 -0
- package/dist/dev-ui/watcher.js +166 -0
- package/dist/dev-ui/watcher.js.map +1 -0
- package/dist/dev-ui/ws.d.ts +52 -0
- package/dist/dev-ui/ws.d.ts.map +1 -0
- package/dist/dev-ui/ws.js +32 -0
- package/dist/dev-ui/ws.js.map +1 -0
- package/dist/dev-ui-client/assets/index-CNKqwcCH.css +32 -0
- package/dist/dev-ui-client/assets/index-Ccj-QknZ.js +179 -0
- package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
- package/dist/dev-ui-client/index.html +13 -0
- package/dist/discover.d.ts +15 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +32 -0
- package/dist/discover.js.map +1 -0
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +37 -13
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +1 -0
- package/dist/node.js.map +1 -1
- package/dist/nodes/agent/executor.d.ts +2 -0
- package/dist/nodes/agent/executor.d.ts.map +1 -1
- package/dist/nodes/agent/executor.js +11 -1
- package/dist/nodes/agent/executor.js.map +1 -1
- package/dist/registry-gen.d.ts +6 -0
- package/dist/registry-gen.d.ts.map +1 -0
- package/dist/registry-gen.js +146 -0
- package/dist/registry-gen.js.map +1 -0
- package/dist/types.d.ts +28 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -1
- package/dist/types.js.map +1 -1
- package/dist/workflow.d.ts +22 -0
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +113 -3
- package/dist/workflow.js.map +1 -1
- package/package.json +30 -6
- package/templates/app/.dockerignore +6 -0
- package/templates/app/.env.example +13 -0
- package/templates/app/Dockerfile +34 -0
- package/templates/app/README.md +29 -0
- package/templates/app/biome.jsonc +81 -0
- package/templates/app/dbos-config.yaml +6 -0
- package/templates/app/drizzle.config.ts +12 -0
- package/templates/app/generated/registry.ts +8 -0
- package/templates/app/next.config.js +13 -0
- package/templates/app/package.json +57 -0
- package/templates/app/postcss.config.js +5 -0
- package/templates/app/public/favicon.ico +0 -0
- package/templates/app/src/app/_components/.gitkeep +0 -0
- package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
- package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
- package/templates/app/src/app/layout.tsx +29 -0
- package/templates/app/src/app/page.tsx +18 -0
- package/templates/app/src/env.js +46 -0
- package/templates/app/src/instrumentation.ts +6 -0
- package/templates/app/src/lib/pflow.ts +28 -0
- package/templates/app/src/server/api/root.ts +21 -0
- package/templates/app/src/server/api/routers/.gitkeep +0 -0
- package/templates/app/src/server/api/trpc.ts +106 -0
- package/templates/app/src/server/db/index.ts +18 -0
- package/templates/app/src/server/db/schema.ts +14 -0
- package/templates/app/src/styles/globals.css +6 -0
- package/templates/app/src/styles/globals.css.orange +126 -0
- package/templates/app/src/trpc/query-client.ts +25 -0
- package/templates/app/src/trpc/react.tsx +78 -0
- package/templates/app/src/trpc/server.ts +30 -0
- package/templates/app/tsconfig.check.json +23 -0
- package/templates/app/tsconfig.json +42 -0
- package/templates/app/tsconfig.server.json +5 -0
- package/templates/app/tsconfig.test.json +21 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { discoverWorkflows } from "../../discovery.js";
|
|
3
|
+
const inputSchema = {};
|
|
4
|
+
const outputSchema = {
|
|
5
|
+
workflows: z
|
|
6
|
+
.array(z.object({
|
|
7
|
+
name: z.string(),
|
|
8
|
+
version: z.number().optional(),
|
|
9
|
+
description: z.string().optional(),
|
|
10
|
+
}))
|
|
11
|
+
.describe("List of available workflows"),
|
|
12
|
+
error: z.string().optional().describe("Error message if discovery failed"),
|
|
13
|
+
};
|
|
14
|
+
export const listWorkflowsFactory = () => {
|
|
15
|
+
return {
|
|
16
|
+
name: "list_workflows",
|
|
17
|
+
config: {
|
|
18
|
+
title: "List Workflows",
|
|
19
|
+
description: "List all available compiled workflows in the project. " +
|
|
20
|
+
"Returns workflow names, versions, and descriptions.",
|
|
21
|
+
inputSchema,
|
|
22
|
+
outputSchema,
|
|
23
|
+
},
|
|
24
|
+
fn: async () => {
|
|
25
|
+
try {
|
|
26
|
+
const { workflows, warnings } = await discoverWorkflows(process.cwd());
|
|
27
|
+
return {
|
|
28
|
+
workflows: workflows.map((w) => ({
|
|
29
|
+
name: w.name,
|
|
30
|
+
version: "version" in w ? w.version : undefined,
|
|
31
|
+
description: w.description || undefined,
|
|
32
|
+
})),
|
|
33
|
+
...(warnings.length > 0 ? { error: warnings.join("; ") } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
workflows: [],
|
|
39
|
+
error: err instanceof Error ? err.message : String(err),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=listWorkflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listWorkflows.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/listWorkflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,GAAG,EAAW,CAAC;AAEhC,MAAM,YAAY,GAAG;IACnB,SAAS,EAAE,CAAC;SACT,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC,CACH;SACA,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAClE,CAAC;AAOX,MAAM,CAAC,MAAM,oBAAoB,GAI7B,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,gBAAgB;YACvB,WAAW,EACT,wDAAwD;gBACxD,qDAAqD;YACvD,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,IAA2B,EAAE;YACpC,IAAI,CAAC;gBACH,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEvE,OAAO;oBACL,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAE,CAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;wBACzE,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;qBACxC,CAAC,CAAC;oBACH,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/D,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,SAAS,EAAE,EAAE;oBACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ApiFactory } from "@tigerdata/mcp-boilerplate";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { ServerContext } from "../types.js";
|
|
4
|
+
declare const inputSchema: {
|
|
5
|
+
readonly node_name: z.ZodString;
|
|
6
|
+
readonly workflow_name: z.ZodOptional<z.ZodString>;
|
|
7
|
+
readonly input: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
8
|
+
};
|
|
9
|
+
declare const outputSchema: {
|
|
10
|
+
readonly run_id: z.ZodOptional<z.ZodString>;
|
|
11
|
+
readonly status: z.ZodString;
|
|
12
|
+
readonly result: z.ZodOptional<z.ZodUnknown>;
|
|
13
|
+
readonly error: z.ZodOptional<z.ZodString>;
|
|
14
|
+
};
|
|
15
|
+
export declare const runNodeFactory: ApiFactory<ServerContext, typeof inputSchema, typeof outputSchema>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=runNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runNode.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/runNode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD,QAAA,MAAM,WAAW;;;;CAWP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AASX,eAAO,MAAM,cAAc,EAAE,UAAU,CACrC,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CA6CpB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
// We shell out to the CLI instead of running nodes in-process because
|
|
6
|
+
// DBOS doesn't allow re-registering workflows after launch. A subprocess
|
|
7
|
+
// loads fresh code every time, so users can edit node code and re-run
|
|
8
|
+
// through MCP without restarting the server.
|
|
9
|
+
// process.argv gives us the same runtime+script the MCP server was started
|
|
10
|
+
// with (e.g. tsx + .ts in dev, node + .js in prod). process.execArgv
|
|
11
|
+
// forwards loader flags (--import tsx/esm) so .ts files resolve correctly.
|
|
12
|
+
const inputSchema = {
|
|
13
|
+
node_name: z.string().describe("Name of the node to run"),
|
|
14
|
+
workflow_name: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Workflow name for connection resolution (uses the workflow's configured connections)"),
|
|
18
|
+
input: z
|
|
19
|
+
.record(z.string(), z.unknown())
|
|
20
|
+
.optional()
|
|
21
|
+
.default({})
|
|
22
|
+
.describe("JSON input for the node (default: {})"),
|
|
23
|
+
};
|
|
24
|
+
const outputSchema = {
|
|
25
|
+
run_id: z.string().optional().describe("Wrapper workflow run UUID (use with get_trace to inspect execution)"),
|
|
26
|
+
status: z.string().describe("Execution status: SUCCESS or ERROR"),
|
|
27
|
+
result: z.unknown().optional().describe("Node return value"),
|
|
28
|
+
error: z.string().optional().describe("Error message if execution failed"),
|
|
29
|
+
};
|
|
30
|
+
export const runNodeFactory = () => {
|
|
31
|
+
return {
|
|
32
|
+
name: "run_node",
|
|
33
|
+
config: {
|
|
34
|
+
title: "Run Node",
|
|
35
|
+
description: "Execute a node by name with JSON input. " +
|
|
36
|
+
"The node is wrapped in a workflow for durability. " +
|
|
37
|
+
"Returns the result and a run_id that can be used with get_trace.",
|
|
38
|
+
inputSchema,
|
|
39
|
+
outputSchema,
|
|
40
|
+
},
|
|
41
|
+
fn: async ({ node_name, workflow_name, input }) => {
|
|
42
|
+
const [runtime, script] = process.argv;
|
|
43
|
+
try {
|
|
44
|
+
const args = [
|
|
45
|
+
...process.execArgv,
|
|
46
|
+
script,
|
|
47
|
+
"node", "run", node_name,
|
|
48
|
+
"--json",
|
|
49
|
+
"-i", JSON.stringify(input),
|
|
50
|
+
];
|
|
51
|
+
if (workflow_name) {
|
|
52
|
+
args.push("-w", workflow_name);
|
|
53
|
+
}
|
|
54
|
+
const { stdout } = await execFileAsync(runtime, args, { cwd: process.cwd() });
|
|
55
|
+
return JSON.parse(stdout);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// execFile rejects on non-zero exit — try to parse JSON from stdout
|
|
59
|
+
const execErr = err;
|
|
60
|
+
if (execErr.stdout) {
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(execErr.stdout);
|
|
63
|
+
}
|
|
64
|
+
catch { /* fall through */ }
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
status: "ERROR",
|
|
68
|
+
error: execErr.stderr?.trim() || execErr.message || String(err),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=runNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runNode.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/runNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ApiFactory } from "@tigerdata/mcp-boilerplate";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { ServerContext } from "../types.js";
|
|
4
|
+
declare const inputSchema: {
|
|
5
|
+
readonly workflow_name: z.ZodString;
|
|
6
|
+
readonly input: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
|
|
7
|
+
};
|
|
8
|
+
declare const outputSchema: {
|
|
9
|
+
readonly run_id: z.ZodOptional<z.ZodString>;
|
|
10
|
+
readonly status: z.ZodString;
|
|
11
|
+
readonly result: z.ZodOptional<z.ZodUnknown>;
|
|
12
|
+
readonly error: z.ZodOptional<z.ZodString>;
|
|
13
|
+
};
|
|
14
|
+
export declare const runWorkflowFactory: ApiFactory<ServerContext, typeof inputSchema, typeof outputSchema>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=runWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runWorkflow.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/runWorkflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD,QAAA,MAAM,WAAW;;;CAOP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AASX,eAAO,MAAM,kBAAkB,EAAE,UAAU,CACzC,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAyCpB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
// We shell out to the CLI instead of running workflows in-process because
|
|
6
|
+
// DBOS doesn't allow re-registering workflows after launch. A subprocess
|
|
7
|
+
// loads fresh code every time, so users can edit workflow code and re-run
|
|
8
|
+
// through MCP without restarting the server.
|
|
9
|
+
// process.argv gives us the same runtime+script the MCP server was started
|
|
10
|
+
// with (e.g. tsx + .ts in dev, node + .js in prod). process.execArgv
|
|
11
|
+
// forwards loader flags (--import tsx/esm) so .ts files resolve correctly.
|
|
12
|
+
const inputSchema = {
|
|
13
|
+
workflow_name: z.string().describe("Name of the workflow to run"),
|
|
14
|
+
input: z
|
|
15
|
+
.record(z.string(), z.unknown())
|
|
16
|
+
.optional()
|
|
17
|
+
.default({})
|
|
18
|
+
.describe("JSON input for the workflow (default: {})"),
|
|
19
|
+
};
|
|
20
|
+
const outputSchema = {
|
|
21
|
+
run_id: z.string().optional().describe("Workflow run UUID (use with get_trace to inspect execution)"),
|
|
22
|
+
status: z.string().describe("Execution status: SUCCESS or ERROR"),
|
|
23
|
+
result: z.unknown().optional().describe("Workflow return value"),
|
|
24
|
+
error: z.string().optional().describe("Error message if execution failed"),
|
|
25
|
+
};
|
|
26
|
+
export const runWorkflowFactory = () => {
|
|
27
|
+
return {
|
|
28
|
+
name: "run_workflow",
|
|
29
|
+
config: {
|
|
30
|
+
title: "Run Workflow",
|
|
31
|
+
description: "Execute a compiled workflow by name with JSON input. " +
|
|
32
|
+
"Returns the result and a run_id that can be used with get_trace to inspect execution details. " +
|
|
33
|
+
"Use list_workflows first to see available workflows.",
|
|
34
|
+
inputSchema,
|
|
35
|
+
outputSchema,
|
|
36
|
+
},
|
|
37
|
+
fn: async ({ workflow_name, input }) => {
|
|
38
|
+
const [runtime, script] = process.argv;
|
|
39
|
+
try {
|
|
40
|
+
const { stdout } = await execFileAsync(runtime, [
|
|
41
|
+
...process.execArgv,
|
|
42
|
+
script,
|
|
43
|
+
"workflow", "run", workflow_name,
|
|
44
|
+
"--json",
|
|
45
|
+
"-i", JSON.stringify(input),
|
|
46
|
+
], { cwd: process.cwd() });
|
|
47
|
+
return JSON.parse(stdout);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
// execFile rejects on non-zero exit — try to parse JSON from stdout
|
|
51
|
+
const execErr = err;
|
|
52
|
+
if (execErr.stdout) {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(execErr.stdout);
|
|
55
|
+
}
|
|
56
|
+
catch { /* fall through */ }
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
status: "ERROR",
|
|
60
|
+
error: execErr.stderr?.trim() || execErr.message || String(err),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=runWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runWorkflow.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/runWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,6CAA6C;AAC7C,2EAA2E;AAC3E,qEAAqE;AACrE,2EAA2E;AAE3E,MAAM,WAAW,GAAG;IAClB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACjE,KAAK,EAAE,CAAC;SACL,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/B,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,2CAA2C,CAAC;CAChD,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IACrG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACjE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAClE,CAAC;AASX,MAAM,CAAC,MAAM,kBAAkB,GAI3B,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE;YACN,KAAK,EAAE,cAAc;YACrB,WAAW,EACT,uDAAuD;gBACvD,gGAAgG;gBAChG,sDAAsD;YACxD,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,EAAyB,EAAE;YAC5D,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAEvC,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE;oBAC9C,GAAG,OAAO,CAAC,QAAQ;oBACnB,MAAM;oBACN,UAAU,EAAE,KAAK,EAAE,aAAa;oBAChC,QAAQ;oBACR,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;iBAC5B,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAE3B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAiB,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,oEAAoE;gBACpE,MAAM,OAAO,GAAG,GAA6D,CAAC;gBAC9E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,IAAI,CAAC;wBACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAiB,CAAC;oBACpD,CAAC;oBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;gBAChC,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,OAAO;oBACf,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;iBAChE,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -2,7 +2,7 @@ import type { ApiFactory } from "@tigerdata/mcp-boilerplate";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import type { ServerContext } from "../types.js";
|
|
4
4
|
declare const inputSchema: {
|
|
5
|
-
readonly
|
|
5
|
+
readonly directory: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
6
6
|
readonly service_id: z.ZodString;
|
|
7
7
|
readonly app_name: z.ZodString;
|
|
8
8
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupAppSchema.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/setupAppSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setupAppSchema.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/setupAppSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,QAAA,MAAM,WAAW;;;;CAgBP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AASX,eAAO,MAAM,qBAAqB,EAAE,UAAU,CAC5C,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAuBpB,CAAC"}
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
import { exec } from "node:child_process";
|
|
2
|
-
import { existsSync } from "node:fs";
|
|
3
|
-
import { readFile, writeFile } from "node:fs/promises";
|
|
4
|
-
import { join, resolve } from "node:path";
|
|
5
|
-
import { promisify } from "node:util";
|
|
6
|
-
import * as dotenv from "dotenv";
|
|
7
|
-
import postgres from "postgres";
|
|
8
1
|
import { z } from "zod";
|
|
9
|
-
|
|
2
|
+
import { setupAppSchema } from "../lib/scaffolding.js";
|
|
10
3
|
const inputSchema = {
|
|
11
|
-
|
|
4
|
+
directory: z
|
|
12
5
|
.string()
|
|
13
|
-
.
|
|
6
|
+
.optional()
|
|
7
|
+
.default(".")
|
|
8
|
+
.describe("Directory of the application, relative to cwd (default: current working directory)"),
|
|
14
9
|
service_id: z.string().describe("Tiger Cloud service ID for the database"),
|
|
15
10
|
app_name: z
|
|
16
11
|
.string()
|
|
@@ -23,23 +18,6 @@ const outputSchema = {
|
|
|
23
18
|
schema_name: z.string().optional().describe("Name of the created schema"),
|
|
24
19
|
user_name: z.string().optional().describe("Name of the created user"),
|
|
25
20
|
};
|
|
26
|
-
function generatePassword(length = 24) {
|
|
27
|
-
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
28
|
-
let password = "";
|
|
29
|
-
for (let i = 0; i < length; i++) {
|
|
30
|
-
password += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
31
|
-
}
|
|
32
|
-
return password;
|
|
33
|
-
}
|
|
34
|
-
function buildConnectionString(originalUrl, user, password) {
|
|
35
|
-
const parsed = new URL(originalUrl);
|
|
36
|
-
parsed.username = user;
|
|
37
|
-
parsed.password = encodeURIComponent(password);
|
|
38
|
-
if (!parsed.searchParams.has("uselibpqcompat")) {
|
|
39
|
-
parsed.searchParams.set("uselibpqcompat", "true");
|
|
40
|
-
}
|
|
41
|
-
return parsed.toString();
|
|
42
|
-
}
|
|
43
21
|
export const setupAppSchemaFactory = () => {
|
|
44
22
|
return {
|
|
45
23
|
name: "setup_app_schema",
|
|
@@ -49,111 +27,12 @@ export const setupAppSchemaFactory = () => {
|
|
|
49
27
|
inputSchema,
|
|
50
28
|
outputSchema,
|
|
51
29
|
},
|
|
52
|
-
fn: async ({
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const env = dotenv.parse(envContent);
|
|
59
|
-
if (env.DATABASE_SCHEMA) {
|
|
60
|
-
return {
|
|
61
|
-
success: true,
|
|
62
|
-
message: "DATABASE_SCHEMA already set in .env. Delete it and re-run if you need to regenerate.",
|
|
63
|
-
schema_name: app_name,
|
|
64
|
-
user_name: app_name,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// Get database connection string from Tiger
|
|
69
|
-
let adminConnectionString;
|
|
70
|
-
try {
|
|
71
|
-
const { stdout: serviceJson } = await execAsync(`tiger service get ${service_id} --with-password -o json`);
|
|
72
|
-
const serviceDetails = JSON.parse(serviceJson);
|
|
73
|
-
if (!serviceDetails.connection_string) {
|
|
74
|
-
return {
|
|
75
|
-
success: false,
|
|
76
|
-
message: "connection_string not found in service details",
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
adminConnectionString = serviceDetails.connection_string;
|
|
80
|
-
}
|
|
81
|
-
catch (err) {
|
|
82
|
-
const error = err;
|
|
83
|
-
return {
|
|
84
|
-
success: false,
|
|
85
|
-
message: `Failed to get service details: ${error.message}`,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
// Connect using postgres.js as admin
|
|
89
|
-
const sql = postgres(adminConnectionString);
|
|
90
|
-
try {
|
|
91
|
-
// Check if user already exists
|
|
92
|
-
const existingUser = await sql `
|
|
93
|
-
SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = ${app_name}
|
|
94
|
-
`;
|
|
95
|
-
if (existingUser.length > 0) {
|
|
96
|
-
await sql.end();
|
|
97
|
-
return {
|
|
98
|
-
success: false,
|
|
99
|
-
message: `User '${app_name}' already exists. Choose a different app name or delete the existing user.`,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
// Create new user
|
|
103
|
-
const appPassword = generatePassword();
|
|
104
|
-
await sql.unsafe(`CREATE ROLE ${app_name} WITH LOGIN PASSWORD '${appPassword}'`);
|
|
105
|
-
// Grant app role to tsdbadmin so admin can access app objects
|
|
106
|
-
await sql.unsafe(`GRANT ${app_name} TO tsdbadmin WITH INHERIT TRUE`);
|
|
107
|
-
// Create app schema owned by the app user
|
|
108
|
-
await sql.unsafe(`CREATE SCHEMA IF NOT EXISTS ${app_name} AUTHORIZATION ${app_name}`);
|
|
109
|
-
await sql.unsafe(`CREATE SCHEMA IF NOT EXISTS ${app_name}_dbos AUTHORIZATION ${app_name}`);
|
|
110
|
-
//annoyingly, dbos seems to need this. TODO: find a better way to do this.
|
|
111
|
-
await sql.unsafe(`GRANT CREATE ON DATABASE tsdb TO ${app_name}`);
|
|
112
|
-
// Allow using extensions in public schema, but not creating objects there
|
|
113
|
-
await sql.unsafe(`REVOKE CREATE ON SCHEMA public FROM ${app_name}`);
|
|
114
|
-
await sql.unsafe(`GRANT USAGE ON SCHEMA public TO ${app_name}`);
|
|
115
|
-
// Set search_path for app user (app schema first, then public for extensions)
|
|
116
|
-
await sql.unsafe(`ALTER ROLE ${app_name} SET search_path TO ${app_name}, ${app_name}_dbos, public`);
|
|
117
|
-
// Append app schema to tsdbadmin's search_path
|
|
118
|
-
const currentPath = await sql `
|
|
119
|
-
SELECT setting FROM pg_settings WHERE name = 'search_path'
|
|
120
|
-
`;
|
|
121
|
-
const existingPath = currentPath[0]?.setting ?? "public";
|
|
122
|
-
if (!existingPath.includes(app_name)) {
|
|
123
|
-
await sql.unsafe(`ALTER ROLE tsdbadmin SET search_path TO ${existingPath}, ${app_name}, ${app_name}_dbos`);
|
|
124
|
-
}
|
|
125
|
-
await sql.end();
|
|
126
|
-
// Build app connection string
|
|
127
|
-
const appDatabaseUrl = buildConnectionString(adminConnectionString, app_name, appPassword);
|
|
128
|
-
// Write or update .env file
|
|
129
|
-
let envContent = "";
|
|
130
|
-
if (existsSync(envPath)) {
|
|
131
|
-
envContent = await readFile(envPath, "utf-8");
|
|
132
|
-
}
|
|
133
|
-
// Update or add DATABASE_URL and DATABASE_SCHEMA
|
|
134
|
-
const env = dotenv.parse(envContent);
|
|
135
|
-
env.DATABASE_URL = appDatabaseUrl;
|
|
136
|
-
env.DATABASE_SCHEMA = app_name;
|
|
137
|
-
// Rebuild .env content
|
|
138
|
-
const newEnvContent = Object.entries(env)
|
|
139
|
-
.map(([key, value]) => `${key}="${value}"`)
|
|
140
|
-
.join("\n");
|
|
141
|
-
await writeFile(envPath, `${newEnvContent}\n`);
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
await sql.end();
|
|
145
|
-
const error = err;
|
|
146
|
-
return {
|
|
147
|
-
success: false,
|
|
148
|
-
message: `Failed to set up app schema: ${error.message}`,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
success: true,
|
|
153
|
-
message: `Created schema '${app_name}' and user '${app_name}'. DATABASE_URL and DATABASE_SCHEMA written to .env.`,
|
|
154
|
-
schema_name: app_name,
|
|
155
|
-
user_name: app_name,
|
|
156
|
-
};
|
|
30
|
+
fn: async ({ directory, service_id, app_name, }) => {
|
|
31
|
+
return setupAppSchema({
|
|
32
|
+
directory,
|
|
33
|
+
serviceId: service_id,
|
|
34
|
+
appName: app_name,
|
|
35
|
+
});
|
|
157
36
|
},
|
|
158
37
|
};
|
|
159
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupAppSchema.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/setupAppSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setupAppSchema.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/setupAppSchema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,GAAG,CAAC;SACZ,QAAQ,CAAC,oFAAoF,CAAC;IACjG,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC1E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,KAAK,CACJ,mBAAmB,EACnB,kFAAkF,CACnF;SACA,QAAQ,CACP,sFAAsF,CACvF;CACK,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACzE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC7D,CAAC;AASX,MAAM,CAAC,MAAM,qBAAqB,GAI9B,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EACT,+KAA+K;YACjL,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,EAAE,EACT,SAAS,EACT,UAAU,EACV,QAAQ,GACT,EAAyB,EAAE;YAC1B,OAAO,cAAc,CAAC;gBACpB,SAAS;gBACT,SAAS,EAAE,UAAU;gBACrB,OAAO,EAAE,QAAQ;aAClB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/utils.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAGD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
/**
|
|
5
|
+
* Load .env directly from cwd — NOT via resolveEnv() which walks up
|
|
6
|
+
* the directory tree and may find a parent .env instead of the app's.
|
|
7
|
+
* Uses override: true so the app's values always win.
|
|
8
|
+
*/
|
|
9
|
+
function loadProjectEnv() {
|
|
10
|
+
const envPath = join(process.cwd(), ".env");
|
|
11
|
+
if (existsSync(envPath)) {
|
|
12
|
+
dotenv.config({ path: envPath, override: true, quiet: true });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load .env from cwd and return DATABASE_URL.
|
|
17
|
+
* Throws with a helpful message if not found.
|
|
18
|
+
*/
|
|
19
|
+
export function requireDatabaseUrl() {
|
|
20
|
+
loadProjectEnv();
|
|
21
|
+
const url = process.env.DATABASE_URL;
|
|
22
|
+
if (!url)
|
|
23
|
+
throw new Error("DATABASE_URL not set in .env");
|
|
24
|
+
return url;
|
|
25
|
+
}
|
|
26
|
+
// Re-export parseOutput for MCP tools to unwrap superjson DB rows
|
|
27
|
+
export { parseOutput } from "../../trace.js";
|
|
28
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;;GAIG;AACH,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,cAAc,EAAE,CAAC;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AA0SA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAwT5C"}
|