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.
Files changed (262) hide show
  1. package/dist/__tests__/discover.integration.test.d.ts +2 -0
  2. package/dist/__tests__/discover.integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/discover.integration.test.js +137 -0
  4. package/dist/__tests__/discover.integration.test.js.map +1 -0
  5. package/dist/__tests__/factory.test.js +13 -0
  6. package/dist/__tests__/factory.test.js.map +1 -1
  7. package/dist/__tests__/integration.e2e.test.js +2 -1
  8. package/dist/__tests__/integration.e2e.test.js.map +1 -1
  9. package/dist/__tests__/integration.test.js +87 -82
  10. package/dist/__tests__/integration.test.js.map +1 -1
  11. package/dist/agent.d.ts +7 -0
  12. package/dist/agent.d.ts.map +1 -1
  13. package/dist/agent.js +75 -10
  14. package/dist/agent.js.map +1 -1
  15. package/dist/cli/__tests__/discovery.test.js +1 -1
  16. package/dist/cli/__tests__/discovery.test.js.map +1 -1
  17. package/dist/cli/app.d.ts +6 -0
  18. package/dist/cli/app.d.ts.map +1 -1
  19. package/dist/cli/app.js +31 -0
  20. package/dist/cli/app.js.map +1 -1
  21. package/dist/cli/cloud-dev.d.ts +7 -0
  22. package/dist/cli/cloud-dev.d.ts.map +1 -0
  23. package/dist/cli/cloud-dev.js +570 -0
  24. package/dist/cli/cloud-dev.js.map +1 -0
  25. package/dist/cli/deploy.d.ts +27 -0
  26. package/dist/cli/deploy.d.ts.map +1 -0
  27. package/dist/cli/deploy.js +332 -0
  28. package/dist/cli/deploy.js.map +1 -0
  29. package/dist/cli/discovery.d.ts +10 -0
  30. package/dist/cli/discovery.d.ts.map +1 -1
  31. package/dist/cli/discovery.js +42 -0
  32. package/dist/cli/discovery.js.map +1 -1
  33. package/dist/cli/env.d.ts +3 -1
  34. package/dist/cli/env.d.ts.map +1 -1
  35. package/dist/cli/env.js +9 -4
  36. package/dist/cli/env.js.map +1 -1
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +208 -11
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/install.d.ts +4 -0
  41. package/dist/cli/install.d.ts.map +1 -1
  42. package/dist/cli/install.js +63 -32
  43. package/dist/cli/install.js.map +1 -1
  44. package/dist/cli/mcp/config.d.ts +0 -1
  45. package/dist/cli/mcp/config.d.ts.map +1 -1
  46. package/dist/cli/mcp/config.js +2 -4
  47. package/dist/cli/mcp/config.js.map +1 -1
  48. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  49. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  50. package/dist/cli/mcp/lib/scaffolding.js +234 -0
  51. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  52. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  53. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  54. package/dist/cli/mcp/lib/templates.js.map +1 -1
  55. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  56. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  57. package/dist/cli/mcp/tools/createApp.js +12 -53
  58. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  59. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  60. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  61. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  62. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  63. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  64. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  65. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  66. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  67. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  68. package/dist/cli/mcp/tools/getRun.js +80 -0
  69. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  70. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  71. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  72. package/dist/cli/mcp/tools/getTrace.js +104 -0
  73. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  74. package/dist/cli/mcp/tools/index.d.ts +94 -1
  75. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  76. package/dist/cli/mcp/tools/index.js +16 -0
  77. package/dist/cli/mcp/tools/index.js.map +1 -1
  78. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  79. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  80. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  81. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  82. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  83. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  84. package/dist/cli/mcp/tools/listRuns.js +72 -0
  85. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  86. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  87. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  88. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  89. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  90. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  91. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  92. package/dist/cli/mcp/tools/runNode.js +74 -0
  93. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  94. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  95. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  96. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  97. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  98. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  99. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  100. package/dist/cli/mcp/tools/setupAppSchema.js +11 -132
  101. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  102. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  103. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  104. package/dist/cli/mcp/tools/utils.js +28 -0
  105. package/dist/cli/mcp/tools/utils.js.map +1 -0
  106. package/dist/cli/run.d.ts +2 -0
  107. package/dist/cli/run.d.ts.map +1 -0
  108. package/dist/cli/run.js +560 -0
  109. package/dist/cli/run.js.map +1 -0
  110. package/dist/cli/trace.d.ts +5 -0
  111. package/dist/cli/trace.d.ts.map +1 -1
  112. package/dist/cli/trace.js +1 -1
  113. package/dist/cli/trace.js.map +1 -1
  114. package/dist/connections/cloud-auth.d.ts +46 -0
  115. package/dist/connections/cloud-auth.d.ts.map +1 -0
  116. package/dist/connections/cloud-auth.js +247 -0
  117. package/dist/connections/cloud-auth.js.map +1 -0
  118. package/dist/connections/cloud-client.d.ts +25 -0
  119. package/dist/connections/cloud-client.d.ts.map +1 -0
  120. package/dist/connections/cloud-client.js +66 -0
  121. package/dist/connections/cloud-client.js.map +1 -0
  122. package/dist/connections/cloud-integration-provider.d.ts +22 -0
  123. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  124. package/dist/connections/cloud-integration-provider.js +42 -0
  125. package/dist/connections/cloud-integration-provider.js.map +1 -0
  126. package/dist/connections/connection-labels.d.ts +14 -0
  127. package/dist/connections/connection-labels.d.ts.map +1 -0
  128. package/dist/connections/connection-labels.js +46 -0
  129. package/dist/connections/connection-labels.js.map +1 -0
  130. package/dist/connections/index.d.ts +12 -0
  131. package/dist/connections/index.d.ts.map +1 -0
  132. package/dist/connections/index.js +10 -0
  133. package/dist/connections/index.js.map +1 -0
  134. package/dist/connections/integration-provider.d.ts +39 -0
  135. package/dist/connections/integration-provider.d.ts.map +1 -0
  136. package/dist/connections/integration-provider.js +20 -0
  137. package/dist/connections/integration-provider.js.map +1 -0
  138. package/dist/connections/local-integration-provider.d.ts +29 -0
  139. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  140. package/dist/connections/local-integration-provider.js +71 -0
  141. package/dist/connections/local-integration-provider.js.map +1 -0
  142. package/dist/connections/nango-client.d.ts +14 -0
  143. package/dist/connections/nango-client.d.ts.map +1 -0
  144. package/dist/connections/nango-client.js +51 -0
  145. package/dist/connections/nango-client.js.map +1 -0
  146. package/dist/connections/resolver.d.ts +26 -0
  147. package/dist/connections/resolver.d.ts.map +1 -0
  148. package/dist/connections/resolver.js +48 -0
  149. package/dist/connections/resolver.js.map +1 -0
  150. package/dist/connections/schema.d.ts +8 -0
  151. package/dist/connections/schema.d.ts.map +1 -0
  152. package/dist/connections/schema.js +31 -0
  153. package/dist/connections/schema.js.map +1 -0
  154. package/dist/context.d.ts.map +1 -1
  155. package/dist/context.js +4 -0
  156. package/dist/context.js.map +1 -1
  157. package/dist/dev-ui/api.d.ts +18 -0
  158. package/dist/dev-ui/api.d.ts.map +1 -0
  159. package/dist/dev-ui/api.js +273 -0
  160. package/dist/dev-ui/api.js.map +1 -0
  161. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  162. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  163. package/dist/dev-ui/dag/extractor.js +716 -0
  164. package/dist/dev-ui/dag/extractor.js.map +1 -0
  165. package/dist/dev-ui/dag/types.d.ts +42 -0
  166. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  167. package/dist/dev-ui/dag/types.js +2 -0
  168. package/dist/dev-ui/dag/types.js.map +1 -0
  169. package/dist/dev-ui/deploy-api.d.ts +14 -0
  170. package/dist/dev-ui/deploy-api.d.ts.map +1 -0
  171. package/dist/dev-ui/deploy-api.js +112 -0
  172. package/dist/dev-ui/deploy-api.js.map +1 -0
  173. package/dist/dev-ui/dev-server.d.ts +18 -0
  174. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  175. package/dist/dev-ui/dev-server.js +275 -0
  176. package/dist/dev-ui/dev-server.js.map +1 -0
  177. package/dist/dev-ui/index.d.ts +3 -0
  178. package/dist/dev-ui/index.d.ts.map +1 -0
  179. package/dist/dev-ui/index.js +2 -0
  180. package/dist/dev-ui/index.js.map +1 -0
  181. package/dist/dev-ui/pty.d.ts +16 -0
  182. package/dist/dev-ui/pty.d.ts.map +1 -0
  183. package/dist/dev-ui/pty.js +87 -0
  184. package/dist/dev-ui/pty.js.map +1 -0
  185. package/dist/dev-ui/watcher.d.ts +12 -0
  186. package/dist/dev-ui/watcher.d.ts.map +1 -0
  187. package/dist/dev-ui/watcher.js +166 -0
  188. package/dist/dev-ui/watcher.js.map +1 -0
  189. package/dist/dev-ui/ws.d.ts +52 -0
  190. package/dist/dev-ui/ws.d.ts.map +1 -0
  191. package/dist/dev-ui/ws.js +32 -0
  192. package/dist/dev-ui/ws.js.map +1 -0
  193. package/dist/dev-ui-client/assets/index-CNKqwcCH.css +32 -0
  194. package/dist/dev-ui-client/assets/index-Ccj-QknZ.js +179 -0
  195. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  196. package/dist/dev-ui-client/index.html +13 -0
  197. package/dist/discover.d.ts +15 -0
  198. package/dist/discover.d.ts.map +1 -0
  199. package/dist/discover.js +32 -0
  200. package/dist/discover.js.map +1 -0
  201. package/dist/factory.d.ts.map +1 -1
  202. package/dist/factory.js +37 -13
  203. package/dist/factory.js.map +1 -1
  204. package/dist/index.d.ts +6 -0
  205. package/dist/index.d.ts.map +1 -1
  206. package/dist/index.js +7 -0
  207. package/dist/index.js.map +1 -1
  208. package/dist/node.d.ts +1 -0
  209. package/dist/node.d.ts.map +1 -1
  210. package/dist/node.js +1 -0
  211. package/dist/node.js.map +1 -1
  212. package/dist/nodes/agent/executor.d.ts +2 -0
  213. package/dist/nodes/agent/executor.d.ts.map +1 -1
  214. package/dist/nodes/agent/executor.js +11 -1
  215. package/dist/nodes/agent/executor.js.map +1 -1
  216. package/dist/registry-gen.d.ts +6 -0
  217. package/dist/registry-gen.d.ts.map +1 -0
  218. package/dist/registry-gen.js +146 -0
  219. package/dist/registry-gen.js.map +1 -0
  220. package/dist/types.d.ts +28 -3
  221. package/dist/types.d.ts.map +1 -1
  222. package/dist/types.js +18 -1
  223. package/dist/types.js.map +1 -1
  224. package/dist/workflow.d.ts +22 -0
  225. package/dist/workflow.d.ts.map +1 -1
  226. package/dist/workflow.js +113 -3
  227. package/dist/workflow.js.map +1 -1
  228. package/package.json +30 -6
  229. package/templates/app/.dockerignore +6 -0
  230. package/templates/app/.env.example +13 -0
  231. package/templates/app/Dockerfile +34 -0
  232. package/templates/app/README.md +29 -0
  233. package/templates/app/biome.jsonc +81 -0
  234. package/templates/app/dbos-config.yaml +6 -0
  235. package/templates/app/drizzle.config.ts +12 -0
  236. package/templates/app/generated/registry.ts +8 -0
  237. package/templates/app/next.config.js +13 -0
  238. package/templates/app/package.json +57 -0
  239. package/templates/app/postcss.config.js +5 -0
  240. package/templates/app/public/favicon.ico +0 -0
  241. package/templates/app/src/app/_components/.gitkeep +0 -0
  242. package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
  243. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  244. package/templates/app/src/app/layout.tsx +29 -0
  245. package/templates/app/src/app/page.tsx +18 -0
  246. package/templates/app/src/env.js +46 -0
  247. package/templates/app/src/instrumentation.ts +6 -0
  248. package/templates/app/src/lib/pflow.ts +28 -0
  249. package/templates/app/src/server/api/root.ts +21 -0
  250. package/templates/app/src/server/api/routers/.gitkeep +0 -0
  251. package/templates/app/src/server/api/trpc.ts +106 -0
  252. package/templates/app/src/server/db/index.ts +18 -0
  253. package/templates/app/src/server/db/schema.ts +14 -0
  254. package/templates/app/src/styles/globals.css +6 -0
  255. package/templates/app/src/styles/globals.css.orange +126 -0
  256. package/templates/app/src/trpc/query-client.ts +25 -0
  257. package/templates/app/src/trpc/react.tsx +78 -0
  258. package/templates/app/src/trpc/server.ts +30 -0
  259. package/templates/app/tsconfig.check.json +23 -0
  260. package/templates/app/tsconfig.json +42 -0
  261. package/templates/app/tsconfig.server.json +5 -0
  262. package/templates/app/tsconfig.test.json +21 -0
@@ -0,0 +1,33 @@
1
+ export interface ScaffoldAppOpts {
2
+ appName: string;
3
+ directory: string;
4
+ installDeps?: boolean;
5
+ }
6
+ export interface ScaffoldAppResult {
7
+ success: boolean;
8
+ message: string;
9
+ path?: string;
10
+ }
11
+ export declare function scaffoldApp({ appName, directory, installDeps, }: ScaffoldAppOpts): Promise<ScaffoldAppResult>;
12
+ export interface CreateDatabaseOpts {
13
+ name?: string;
14
+ }
15
+ export interface CreateDatabaseResult {
16
+ success: boolean;
17
+ service_id?: string;
18
+ error?: string;
19
+ }
20
+ export declare function createDatabase({ name, }?: CreateDatabaseOpts): Promise<CreateDatabaseResult>;
21
+ export interface SetupAppSchemaOpts {
22
+ directory: string;
23
+ serviceId: string;
24
+ appName: string;
25
+ }
26
+ export interface SetupAppSchemaResult {
27
+ success: boolean;
28
+ message: string;
29
+ schema_name?: string;
30
+ user_name?: string;
31
+ }
32
+ export declare function setupAppSchema({ directory, serviceId, appName, }: SetupAppSchemaOpts): Promise<SetupAppSchemaResult>;
33
+ //# sourceMappingURL=scaffolding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolding.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/lib/scaffolding.ts"],"names":[],"mappings":"AAqDA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,SAAS,EACT,WAAkB,GACnB,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkD9C;AAID,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,EACnC,IAAI,GACL,GAAE,kBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0CzD;AAID,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,EACnC,SAAS,EACT,SAAS,EACT,OAAO,GACR,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+JpD"}
@@ -0,0 +1,234 @@
1
+ import { exec } from "node:child_process";
2
+ import { existsSync, mkdirSync } from "node:fs";
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { join, resolve } from "node:path";
5
+ import * as dotenv from "dotenv";
6
+ import pg from "pg";
7
+ import { packageRoot, version } from "../config.js";
8
+ import { writeAppTemplates, create0pflowDirectories } from "../lib/templates.js";
9
+ import { ensureConnectionsTable } from "../../../connections/schema.js";
10
+ const execAsync = (cmd, cwd) => new Promise((resolve, reject) => {
11
+ exec(cmd, { cwd }, (error, stdout, stderr) => {
12
+ if (error)
13
+ reject(Object.assign(error, { stderr }));
14
+ else
15
+ resolve({ stdout, stderr });
16
+ });
17
+ });
18
+ // Monorepo root (only valid in dev mode when running from packages/core)
19
+ const monorepoRoot = join(packageRoot, "..", "..");
20
+ function isDevMode() {
21
+ const corePath = join(monorepoRoot, "packages", "core");
22
+ return existsSync(corePath);
23
+ }
24
+ function generatePassword(length = 24) {
25
+ const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
26
+ let password = "";
27
+ for (let i = 0; i < length; i++) {
28
+ password += chars.charAt(Math.floor(Math.random() * chars.length));
29
+ }
30
+ return password;
31
+ }
32
+ function buildConnectionString(originalUrl, user, password) {
33
+ const parsed = new URL(originalUrl);
34
+ parsed.username = user;
35
+ parsed.password = encodeURIComponent(password);
36
+ if (!parsed.searchParams.has("uselibpqcompat")) {
37
+ parsed.searchParams.set("uselibpqcompat", "true");
38
+ }
39
+ return parsed.toString();
40
+ }
41
+ export async function scaffoldApp({ appName, directory, installDeps = true, }) {
42
+ const appPath = resolve(process.cwd(), directory);
43
+ if (!existsSync(appPath)) {
44
+ mkdirSync(appPath, { recursive: true });
45
+ }
46
+ try {
47
+ await writeAppTemplates(appPath, {
48
+ app_name: appName,
49
+ // - Dev mode (monorepo via npm link): "dev" dist-tag
50
+ // - Installed from 0pflow@dev (e.g. 0.1.0-dev.c6251ba): "dev" dist-tag
51
+ // - Installed from 0pflow@latest (e.g. 0.1.0): exact version
52
+ opflow_version: isDevMode() || version.includes("-dev.") ? "dev" : version,
53
+ });
54
+ await create0pflowDirectories(appPath);
55
+ // In dev mode, link local 0pflow packages
56
+ if (isDevMode()) {
57
+ const corePath = join(monorepoRoot, "packages", "core");
58
+ await execAsync("npm link", corePath);
59
+ await execAsync("npm link 0pflow", appPath);
60
+ }
61
+ if (installDeps) {
62
+ await execAsync("npm install", appPath);
63
+ }
64
+ // Initialize git repo with initial commit
65
+ try {
66
+ await execAsync("git init", appPath);
67
+ await execAsync("git add -A", appPath);
68
+ await execAsync('git commit -m "Initial commit"', appPath);
69
+ }
70
+ catch {
71
+ // git not available — continue without repo
72
+ }
73
+ return {
74
+ success: true,
75
+ message: `Created 0pflow app '${appName}' in ${appPath}`,
76
+ path: appPath,
77
+ };
78
+ }
79
+ catch (err) {
80
+ const error = err;
81
+ return {
82
+ success: false,
83
+ message: `Failed to create app: ${error.message}\n${error.stderr || ""}`,
84
+ };
85
+ }
86
+ }
87
+ export async function createDatabase({ name, } = {}) {
88
+ const dbName = name || "app-db";
89
+ const cmdArgs = [
90
+ "tiger",
91
+ "service",
92
+ "create",
93
+ "--name",
94
+ dbName,
95
+ "--cpu",
96
+ "shared",
97
+ "--memory",
98
+ "shared",
99
+ "--addons",
100
+ "time-series,ai",
101
+ "--no-wait",
102
+ "-o",
103
+ "json",
104
+ ];
105
+ try {
106
+ const { stdout, stderr } = await execAsync(cmdArgs.join(" "));
107
+ const result = JSON.parse(stdout);
108
+ if (!result.service_id) {
109
+ return {
110
+ success: false,
111
+ error: `No service_id in response: ${stdout}${stderr}`,
112
+ };
113
+ }
114
+ return {
115
+ success: true,
116
+ service_id: result.service_id,
117
+ };
118
+ }
119
+ catch (err) {
120
+ const error = err;
121
+ return {
122
+ success: false,
123
+ error: `Failed to create database: ${error.message}\n${error.stdout || ""}${error.stderr || ""}`,
124
+ };
125
+ }
126
+ }
127
+ export async function setupAppSchema({ directory, serviceId, appName, }) {
128
+ const appDir = resolve(process.cwd(), directory);
129
+ const envPath = join(appDir, ".env");
130
+ // Sanitize app name into a valid PostgreSQL identifier
131
+ // (replace hyphens/dots with underscores, strip anything else non-alphanumeric)
132
+ const pgName = appName.replace(/[-. ]/g, "_").replace(/[^a-zA-Z0-9_]/g, "");
133
+ // Check if already run
134
+ if (existsSync(envPath)) {
135
+ const envContent = await readFile(envPath, "utf-8");
136
+ const env = dotenv.parse(envContent);
137
+ if (env.DATABASE_SCHEMA) {
138
+ return {
139
+ success: true,
140
+ message: "DATABASE_SCHEMA already set in .env. Delete it and re-run if you need to regenerate.",
141
+ schema_name: pgName,
142
+ user_name: pgName,
143
+ };
144
+ }
145
+ }
146
+ // Get database connection string from Tiger
147
+ let adminConnectionString;
148
+ try {
149
+ const { stdout: serviceJson } = await execAsync(`tiger service get ${serviceId} --with-password -o json`);
150
+ const serviceDetails = JSON.parse(serviceJson);
151
+ if (!serviceDetails.connection_string) {
152
+ return {
153
+ success: false,
154
+ message: "connection_string not found in service details",
155
+ };
156
+ }
157
+ const parsed = new URL(serviceDetails.connection_string);
158
+ if (!parsed.searchParams.has("uselibpqcompat")) {
159
+ parsed.searchParams.set("uselibpqcompat", "true");
160
+ }
161
+ adminConnectionString = parsed.toString();
162
+ }
163
+ catch (err) {
164
+ const error = err;
165
+ return {
166
+ success: false,
167
+ message: `Failed to get service details: ${error.message}`,
168
+ };
169
+ }
170
+ const pool = new pg.Pool({ connectionString: adminConnectionString, max: 1 });
171
+ try {
172
+ const existingUser = await pool.query(`SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = $1`, [pgName]);
173
+ if (existingUser.rows.length > 0) {
174
+ return {
175
+ success: false,
176
+ message: `User '${pgName}' already exists. Choose a different app name or delete the existing user.`,
177
+ };
178
+ }
179
+ const appPassword = generatePassword();
180
+ await pool.query(`CREATE ROLE ${pgName} WITH LOGIN PASSWORD '${appPassword}'`);
181
+ await pool.query(`GRANT ${pgName} TO tsdbadmin WITH INHERIT TRUE`);
182
+ await pool.query(`CREATE SCHEMA IF NOT EXISTS ${pgName} AUTHORIZATION ${pgName}`);
183
+ await pool.query(`CREATE SCHEMA IF NOT EXISTS ${pgName}_dbos AUTHORIZATION ${pgName}`);
184
+ await pool.query(`GRANT CREATE ON DATABASE tsdb TO ${pgName}`);
185
+ await pool.query(`REVOKE CREATE ON SCHEMA public FROM ${pgName}`);
186
+ await pool.query(`GRANT USAGE ON SCHEMA public TO ${pgName}`);
187
+ await pool.query(`ALTER ROLE ${pgName} SET search_path TO ${pgName}, ${pgName}_dbos, public`);
188
+ const currentPath = await pool.query(`SELECT setting FROM pg_settings WHERE name = 'search_path'`);
189
+ const existingPath = currentPath.rows[0]?.setting ?? "public";
190
+ if (!existingPath.includes(pgName)) {
191
+ await pool.query(`ALTER ROLE tsdbadmin SET search_path TO ${existingPath}, ${pgName}, ${pgName}_dbos`);
192
+ }
193
+ const existingAdmin = await pool.query(`SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = 'dbosadmin'`);
194
+ let dbosAdminPassword;
195
+ if (existingAdmin.rows.length === 0) {
196
+ dbosAdminPassword = generatePassword();
197
+ await pool.query(`CREATE ROLE dbosadmin WITH LOGIN CREATEDB PASSWORD '${dbosAdminPassword}'`);
198
+ }
199
+ const appDatabaseUrl = buildConnectionString(adminConnectionString, pgName, appPassword);
200
+ let envContent = "";
201
+ if (existsSync(envPath)) {
202
+ envContent = await readFile(envPath, "utf-8");
203
+ }
204
+ const env = dotenv.parse(envContent);
205
+ env.DATABASE_URL = appDatabaseUrl;
206
+ env.DATABASE_SCHEMA = pgName;
207
+ if (dbosAdminPassword) {
208
+ env.DBOS_ADMIN_URL = buildConnectionString(adminConnectionString, "dbosadmin", dbosAdminPassword);
209
+ }
210
+ const newEnvContent = Object.entries(env)
211
+ .map(([key, value]) => `${key}="${value}"`)
212
+ .join("\n");
213
+ await writeFile(envPath, `${newEnvContent}\n`);
214
+ // Create the opflow_connections table so it's ready before the dev UI launches
215
+ await ensureConnectionsTable(appDatabaseUrl, pgName);
216
+ }
217
+ catch (err) {
218
+ const error = err;
219
+ return {
220
+ success: false,
221
+ message: `Failed to set up app schema: ${error.message}`,
222
+ };
223
+ }
224
+ finally {
225
+ await pool.end();
226
+ }
227
+ return {
228
+ success: true,
229
+ message: `Created schema '${pgName}' and user '${pgName}'. DATABASE_URL and DATABASE_SCHEMA written to .env.`,
230
+ schema_name: pgName,
231
+ user_name: pgName,
232
+ };
233
+ }
234
+ //# sourceMappingURL=scaffolding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolding.js","sourceRoot":"","sources":["../../../../src/cli/mcp/lib/scaffolding.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export interface AppTemplateVars {
2
2
  app_name: string;
3
+ opflow_version: string;
3
4
  }
4
5
  /**
5
6
  * Write app templates with Handlebars templating
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/lib/templates.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA4DD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5E"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/lib/templates.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AA4DD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/cli/mcp/lib/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/cli/mcp/lib/templates.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { z } from "zod";
3
3
  import type { ServerContext } from "../types.js";
4
4
  declare const inputSchema: {
5
5
  readonly app_name: z.ZodString;
6
+ readonly directory: z.ZodDefault<z.ZodOptional<z.ZodString>>;
6
7
  readonly install_deps: z.ZodDefault<z.ZodBoolean>;
7
8
  };
8
9
  declare const outputSchema: {
@@ -1 +1 @@
1
- {"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createApp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgBjD,QAAA,MAAM,WAAW;;;CAMP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;CAIR,CAAC;AAQX,eAAO,MAAM,gBAAgB,EAAE,UAAU,CACvC,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAuDpB,CAAC"}
1
+ {"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createApp.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;;;;CAWP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;CAIR,CAAC;AAQX,eAAO,MAAM,gBAAgB,EAAE,UAAU,CACvC,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAuBpB,CAAC"}
@@ -1,24 +1,12 @@
1
- import { exec } from "node:child_process";
2
- import { existsSync } from "node:fs";
3
- import { join } from "node:path";
4
1
  import { z } from "zod";
5
- import { monorepoRoot } from "../config.js";
6
- import { writeAppTemplates, create0pflowDirectories } from "../lib/templates.js";
7
- // Check if running in development mode (monorepo with packages/core exists)
8
- function isDevMode() {
9
- const corePath = join(monorepoRoot, "packages", "core");
10
- return existsSync(corePath);
11
- }
12
- const execAsync = (cmd, cwd) => new Promise((resolve, reject) => {
13
- exec(cmd, { cwd }, (error, stdout, stderr) => {
14
- if (error)
15
- reject(Object.assign(error, { stderr }));
16
- else
17
- resolve({ stdout, stderr });
18
- });
19
- });
2
+ import { scaffoldApp } from "../lib/scaffolding.js";
20
3
  const inputSchema = {
21
4
  app_name: z.string().describe("Application name (lowercase with hyphens, e.g., 'lead-scoring-app')"),
5
+ directory: z
6
+ .string()
7
+ .optional()
8
+ .default(".")
9
+ .describe("Directory to create the app in, relative to cwd (default: current directory). Created if it doesn't exist."),
22
10
  install_deps: z
23
11
  .boolean()
24
12
  .default(true)
@@ -38,41 +26,12 @@ export const createAppFactory = () => {
38
26
  inputSchema,
39
27
  outputSchema,
40
28
  },
41
- fn: async ({ app_name, install_deps, }) => {
42
- const appName = app_name;
43
- const appPath = process.cwd();
44
- try {
45
- // Copy app template with Handlebars substitution
46
- await writeAppTemplates(appPath, {
47
- app_name: appName,
48
- });
49
- // Create 0pflow-specific directories
50
- await create0pflowDirectories(appPath);
51
- // In dev mode, link local 0pflow packages (before npm install)
52
- if (isDevMode()) {
53
- const corePath = join(monorepoRoot, "packages", "core");
54
- // Register package globally first
55
- await execAsync("npm link", corePath);
56
- // Then link it in the app
57
- await execAsync("npm link 0pflow", appPath);
58
- }
59
- // Install dependencies if requested
60
- if (install_deps) {
61
- await execAsync("npm install", appPath);
62
- }
63
- return {
64
- success: true,
65
- message: `Created 0pflow app '${appName}' in ${appPath}`,
66
- path: appPath,
67
- };
68
- }
69
- catch (err) {
70
- const error = err;
71
- return {
72
- success: false,
73
- message: `Failed to create app: ${error.message}\n${error.stderr || ""}`,
74
- };
75
- }
29
+ fn: async ({ app_name, directory, install_deps, }) => {
30
+ return scaffoldApp({
31
+ appName: app_name,
32
+ directory,
33
+ installDeps: install_deps,
34
+ });
76
35
  },
77
36
  };
78
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createApp.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createApp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createApp.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createApp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;IACpG,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,GAAG,CAAC;SACZ,QAAQ,CAAC,4GAA4G,CAAC;IACzH,YAAY,EAAE,CAAC;SACZ,OAAO,EAAE;SACT,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,wCAAwC,CAAC;CAC7C,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACzE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAC5D,CAAC;AAQX,MAAM,CAAC,MAAM,gBAAgB,GAIzB,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE;YACN,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EACT,uJAAuJ;YACzJ,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,EAAE,EACT,QAAQ,EACR,SAAS,EACT,YAAY,GACb,EAAyB,EAAE;YAC1B,OAAO,WAAW,CAAC;gBACjB,OAAO,EAAE,QAAQ;gBACjB,SAAS;gBACT,WAAW,EAAE,YAAY;aAC1B,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createDatabase.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createDatabase.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;AAIjD,QAAA,MAAM,WAAW;;CAEP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;CAMR,CAAC;AAQX,eAAO,MAAM,qBAAqB,EAAE,UAAU,CAC5C,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAuDpB,CAAC"}
1
+ {"version":3,"file":"createDatabase.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createDatabase.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;;CAEP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;CAMR,CAAC;AAQX,eAAO,MAAM,qBAAqB,EAAE,UAAU,CAC5C,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAepB,CAAC"}
@@ -1,7 +1,5 @@
1
- import { exec } from "node:child_process";
2
- import { promisify } from "node:util";
3
1
  import { z } from "zod";
4
- const execAsync = promisify(exec);
2
+ import { createDatabase } from "../lib/scaffolding.js";
5
3
  const inputSchema = {
6
4
  name: z.string().optional().describe("Database name (default: app-db)"),
7
5
  };
@@ -22,44 +20,7 @@ export const createDatabaseFactory = () => {
22
20
  outputSchema,
23
21
  },
24
22
  fn: async ({ name }) => {
25
- const dbName = name || "app-db";
26
- const cmdArgs = [
27
- "tiger",
28
- "service",
29
- "create",
30
- "--name",
31
- dbName,
32
- "--cpu",
33
- "shared",
34
- "--memory",
35
- "shared",
36
- "--addons",
37
- "time-series,ai",
38
- "--no-wait",
39
- "-o",
40
- "json",
41
- ];
42
- try {
43
- const { stdout, stderr } = await execAsync(cmdArgs.join(" "));
44
- const result = JSON.parse(stdout);
45
- if (!result.service_id) {
46
- return {
47
- success: false,
48
- error: `No service_id in response: ${stdout}${stderr}`,
49
- };
50
- }
51
- return {
52
- success: true,
53
- service_id: result.service_id,
54
- };
55
- }
56
- catch (err) {
57
- const error = err;
58
- return {
59
- success: false,
60
- error: `Failed to create database: ${error.message}\n${error.stdout || ""}${error.stderr || ""}`,
61
- };
62
- }
23
+ return createDatabase({ name });
63
24
  },
64
25
  };
65
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createDatabase.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAC/D,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC;SACP,OAAO,EAAE;SACT,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACjE,CAAC;AAQX,MAAM,CAAC,MAAM,qBAAqB,GAI9B,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,WAAW,EACT,8GAA8G;YAChH,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAyB,EAAE;YAC5C,MAAM,MAAM,GAAG,IAAI,IAAI,QAAQ,CAAC;YAEhC,MAAM,OAAO,GAAG;gBACd,OAAO;gBACP,SAAS;gBACT,QAAQ;gBACR,QAAQ;gBACR,MAAM;gBACN,OAAO;gBACP,QAAQ;gBACR,UAAU;gBACV,QAAQ;gBACR,UAAU;gBACV,gBAAgB;gBAChB,WAAW;gBACX,IAAI;gBACJ,MAAM;aACP,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;gBAE7D,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACvB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,8BAA8B,MAAM,GAAG,MAAM,EAAE;qBACvD,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,GAAmD,CAAC;gBAClE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,8BAA8B,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE;iBACjG,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"createDatabase.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/createDatabase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAC/D,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC;SACP,OAAO,EAAE;SACT,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACxE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACjE,CAAC;AAQX,MAAM,CAAC,MAAM,qBAAqB,GAI9B,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,WAAW,EACT,8GAA8G;YAChH,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAyB,EAAE;YAC5C,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
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 integration_id: z.ZodString;
6
+ readonly workflow_name: z.ZodString;
7
+ readonly node_name: z.ZodString;
8
+ };
9
+ declare const outputSchema: {
10
+ readonly connection_id: z.ZodOptional<z.ZodString>;
11
+ readonly provider: z.ZodOptional<z.ZodString>;
12
+ readonly connection_config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
13
+ readonly metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
14
+ readonly access_token: z.ZodOptional<z.ZodString>;
15
+ readonly error: z.ZodOptional<z.ZodString>;
16
+ };
17
+ export declare const getConnectionInfoFactory: ApiFactory<ServerContext, typeof inputSchema, typeof outputSchema>;
18
+ export {};
19
+ //# sourceMappingURL=getConnectionInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConnectionInfo.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/getConnectionInfo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,QAAA,MAAM,WAAW;;;;CAaP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;;;;CAgBR,CAAC;AA8BX,eAAO,MAAM,wBAAwB,EAAE,UAAU,CAC/C,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CA+DpB,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import * as dotenv from "dotenv";
5
+ import pg from "pg";
6
+ import { createIntegrationProvider } from "../../../connections/integration-provider.js";
7
+ import { resolveConnectionId } from "../../../connections/resolver.js";
8
+ import { getAppSchema } from "../../app.js";
9
+ const inputSchema = {
10
+ integration_id: z
11
+ .string()
12
+ .describe("The integration ID to look up (e.g., 'salesforce', 'slack'). " +
13
+ "Must match an integration_id in the opflow_connections table."),
14
+ workflow_name: z
15
+ .string()
16
+ .describe("Workflow name for connection lookup. Used to resolve workflow/node-scoped connections, with fallback to global default."),
17
+ node_name: z
18
+ .string()
19
+ .describe("Node name for connection lookup. Used to resolve workflow/node-scoped connections, with fallback to global default."),
20
+ };
21
+ const outputSchema = {
22
+ connection_id: z.string().optional().describe("The Nango connection ID"),
23
+ provider: z.string().optional().describe("Provider name (e.g., salesforce)"),
24
+ connection_config: z
25
+ .record(z.string(), z.unknown())
26
+ .optional()
27
+ .describe("Provider-specific config (e.g., instance_url for Salesforce)"),
28
+ metadata: z
29
+ .record(z.string(), z.unknown())
30
+ .optional()
31
+ .describe("Custom metadata stored on the connection"),
32
+ access_token: z
33
+ .string()
34
+ .optional()
35
+ .describe("OAuth access token for the connection (for dev-time operations like schema fetching)"),
36
+ error: z.string().optional().describe("Error message if lookup failed"),
37
+ };
38
+ /**
39
+ * Load env vars from the project's .env file
40
+ */
41
+ function loadEnv() {
42
+ const envPath = join(process.cwd(), ".env");
43
+ if (!existsSync(envPath))
44
+ return {};
45
+ const content = readFileSync(envPath, "utf-8");
46
+ return dotenv.parse(content);
47
+ }
48
+ /**
49
+ * Create an IntegrationProvider based on available env vars.
50
+ * NANGO_SECRET_KEY → local, otherwise → cloud (auto-auth).
51
+ */
52
+ async function createProvider(env) {
53
+ const nangoSecretKey = env.NANGO_SECRET_KEY ?? undefined;
54
+ return createIntegrationProvider(nangoSecretKey);
55
+ }
56
+ export const getConnectionInfoFactory = () => {
57
+ return {
58
+ name: "get_connection_info",
59
+ config: {
60
+ title: "Get Connection Info",
61
+ description: "Get metadata for a configured integration connection. " +
62
+ "Resolves the connection ID from the opflow_connections table, " +
63
+ "then fetches connection details via IntegrationProvider (local Nango or cloud).",
64
+ inputSchema,
65
+ outputSchema,
66
+ },
67
+ fn: async ({ integration_id, workflow_name, node_name }) => {
68
+ const env = loadEnv();
69
+ const databaseUrl = env.DATABASE_URL ?? process.env.DATABASE_URL;
70
+ if (!databaseUrl) {
71
+ return {
72
+ error: "DATABASE_URL not found in .env file. " +
73
+ "Run setup_app_schema to configure the database.",
74
+ };
75
+ }
76
+ // Look up connection_id using the same resolution as runtime:
77
+ // exact (workflow_name, node_name) match first, then global (* / *) fallback
78
+ const appSchema = getAppSchema();
79
+ let connectionId = null;
80
+ const pool = new pg.Pool({ connectionString: databaseUrl, max: 1 });
81
+ try {
82
+ connectionId = await resolveConnectionId(pool, workflow_name, node_name, integration_id, appSchema);
83
+ }
84
+ finally {
85
+ await pool.end();
86
+ }
87
+ if (!connectionId) {
88
+ return {
89
+ error: `No connection configured for integration "${integration_id}". ` +
90
+ `Use the Dev UI to connect an account first.`,
91
+ };
92
+ }
93
+ try {
94
+ const provider = await createProvider(env);
95
+ const credentials = await provider.fetchCredentials(integration_id, connectionId);
96
+ return {
97
+ connection_id: connectionId,
98
+ provider: integration_id,
99
+ connection_config: credentials.connectionConfig ?? {},
100
+ access_token: credentials.token,
101
+ };
102
+ }
103
+ catch (err) {
104
+ return {
105
+ error: `Failed to fetch connection: ${err instanceof Error ? err.message : String(err)}`,
106
+ };
107
+ }
108
+ },
109
+ };
110
+ };
111
+ //# sourceMappingURL=getConnectionInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConnectionInfo.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/getConnectionInfo.ts"],"names":[],"mappings":"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"}