0pflow 0.1.0-dev.b4bf1ab → 0.1.0-dev.bdfaa95

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 (254) 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 +27 -0
  20. package/dist/cli/app.js.map +1 -1
  21. package/dist/cli/deploy.d.ts +27 -0
  22. package/dist/cli/deploy.d.ts.map +1 -0
  23. package/dist/cli/deploy.js +332 -0
  24. package/dist/cli/deploy.js.map +1 -0
  25. package/dist/cli/discovery.d.ts +10 -0
  26. package/dist/cli/discovery.d.ts.map +1 -1
  27. package/dist/cli/discovery.js +42 -0
  28. package/dist/cli/discovery.js.map +1 -1
  29. package/dist/cli/env.js +1 -1
  30. package/dist/cli/env.js.map +1 -1
  31. package/dist/cli/index.d.ts.map +1 -1
  32. package/dist/cli/index.js +142 -11
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/install.d.ts +4 -0
  35. package/dist/cli/install.d.ts.map +1 -1
  36. package/dist/cli/install.js +63 -32
  37. package/dist/cli/install.js.map +1 -1
  38. package/dist/cli/mcp/config.d.ts +0 -1
  39. package/dist/cli/mcp/config.d.ts.map +1 -1
  40. package/dist/cli/mcp/config.js +2 -4
  41. package/dist/cli/mcp/config.js.map +1 -1
  42. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  43. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  44. package/dist/cli/mcp/lib/scaffolding.js +231 -0
  45. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  46. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  47. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  48. package/dist/cli/mcp/lib/templates.js.map +1 -1
  49. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  50. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  51. package/dist/cli/mcp/tools/createApp.js +12 -55
  52. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  53. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  54. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  55. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  56. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  57. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  58. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  59. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  60. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  61. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  62. package/dist/cli/mcp/tools/getRun.js +80 -0
  63. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  64. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  65. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  66. package/dist/cli/mcp/tools/getTrace.js +104 -0
  67. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  68. package/dist/cli/mcp/tools/index.d.ts +94 -1
  69. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  70. package/dist/cli/mcp/tools/index.js +16 -0
  71. package/dist/cli/mcp/tools/index.js.map +1 -1
  72. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  73. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  74. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  75. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  76. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  77. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  78. package/dist/cli/mcp/tools/listRuns.js +72 -0
  79. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  80. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  81. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  82. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  83. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  84. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  85. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  86. package/dist/cli/mcp/tools/runNode.js +74 -0
  87. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  88. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  89. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  90. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  91. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  92. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  93. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  94. package/dist/cli/mcp/tools/setupAppSchema.js +11 -129
  95. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  96. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  97. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  98. package/dist/cli/mcp/tools/utils.js +28 -0
  99. package/dist/cli/mcp/tools/utils.js.map +1 -0
  100. package/dist/cli/run.d.ts +2 -0
  101. package/dist/cli/run.d.ts.map +1 -0
  102. package/dist/cli/run.js +560 -0
  103. package/dist/cli/run.js.map +1 -0
  104. package/dist/cli/trace.d.ts +5 -0
  105. package/dist/cli/trace.d.ts.map +1 -1
  106. package/dist/cli/trace.js +1 -1
  107. package/dist/cli/trace.js.map +1 -1
  108. package/dist/connections/cloud-auth.d.ts +46 -0
  109. package/dist/connections/cloud-auth.d.ts.map +1 -0
  110. package/dist/connections/cloud-auth.js +247 -0
  111. package/dist/connections/cloud-auth.js.map +1 -0
  112. package/dist/connections/cloud-client.d.ts +25 -0
  113. package/dist/connections/cloud-client.d.ts.map +1 -0
  114. package/dist/connections/cloud-client.js +59 -0
  115. package/dist/connections/cloud-client.js.map +1 -0
  116. package/dist/connections/cloud-integration-provider.d.ts +22 -0
  117. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  118. package/dist/connections/cloud-integration-provider.js +41 -0
  119. package/dist/connections/cloud-integration-provider.js.map +1 -0
  120. package/dist/connections/connection-labels.d.ts +14 -0
  121. package/dist/connections/connection-labels.d.ts.map +1 -0
  122. package/dist/connections/connection-labels.js +46 -0
  123. package/dist/connections/connection-labels.js.map +1 -0
  124. package/dist/connections/index.d.ts +12 -0
  125. package/dist/connections/index.d.ts.map +1 -0
  126. package/dist/connections/index.js +10 -0
  127. package/dist/connections/index.js.map +1 -0
  128. package/dist/connections/integration-provider.d.ts +39 -0
  129. package/dist/connections/integration-provider.d.ts.map +1 -0
  130. package/dist/connections/integration-provider.js +20 -0
  131. package/dist/connections/integration-provider.js.map +1 -0
  132. package/dist/connections/local-integration-provider.d.ts +29 -0
  133. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  134. package/dist/connections/local-integration-provider.js +70 -0
  135. package/dist/connections/local-integration-provider.js.map +1 -0
  136. package/dist/connections/nango-client.d.ts +14 -0
  137. package/dist/connections/nango-client.d.ts.map +1 -0
  138. package/dist/connections/nango-client.js +50 -0
  139. package/dist/connections/nango-client.js.map +1 -0
  140. package/dist/connections/resolver.d.ts +26 -0
  141. package/dist/connections/resolver.d.ts.map +1 -0
  142. package/dist/connections/resolver.js +48 -0
  143. package/dist/connections/resolver.js.map +1 -0
  144. package/dist/connections/schema.d.ts +8 -0
  145. package/dist/connections/schema.d.ts.map +1 -0
  146. package/dist/connections/schema.js +31 -0
  147. package/dist/connections/schema.js.map +1 -0
  148. package/dist/context.d.ts.map +1 -1
  149. package/dist/context.js +4 -0
  150. package/dist/context.js.map +1 -1
  151. package/dist/dev-ui/api.d.ts +18 -0
  152. package/dist/dev-ui/api.d.ts.map +1 -0
  153. package/dist/dev-ui/api.js +273 -0
  154. package/dist/dev-ui/api.js.map +1 -0
  155. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  156. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  157. package/dist/dev-ui/dag/extractor.js +716 -0
  158. package/dist/dev-ui/dag/extractor.js.map +1 -0
  159. package/dist/dev-ui/dag/types.d.ts +42 -0
  160. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  161. package/dist/dev-ui/dag/types.js +2 -0
  162. package/dist/dev-ui/dag/types.js.map +1 -0
  163. package/dist/dev-ui/deploy-api.d.ts +14 -0
  164. package/dist/dev-ui/deploy-api.d.ts.map +1 -0
  165. package/dist/dev-ui/deploy-api.js +112 -0
  166. package/dist/dev-ui/deploy-api.js.map +1 -0
  167. package/dist/dev-ui/dev-server.d.ts +18 -0
  168. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  169. package/dist/dev-ui/dev-server.js +273 -0
  170. package/dist/dev-ui/dev-server.js.map +1 -0
  171. package/dist/dev-ui/index.d.ts +3 -0
  172. package/dist/dev-ui/index.d.ts.map +1 -0
  173. package/dist/dev-ui/index.js +2 -0
  174. package/dist/dev-ui/index.js.map +1 -0
  175. package/dist/dev-ui/pty.d.ts +16 -0
  176. package/dist/dev-ui/pty.d.ts.map +1 -0
  177. package/dist/dev-ui/pty.js +87 -0
  178. package/dist/dev-ui/pty.js.map +1 -0
  179. package/dist/dev-ui/watcher.d.ts +12 -0
  180. package/dist/dev-ui/watcher.d.ts.map +1 -0
  181. package/dist/dev-ui/watcher.js +166 -0
  182. package/dist/dev-ui/watcher.js.map +1 -0
  183. package/dist/dev-ui/ws.d.ts +52 -0
  184. package/dist/dev-ui/ws.d.ts.map +1 -0
  185. package/dist/dev-ui/ws.js +32 -0
  186. package/dist/dev-ui/ws.js.map +1 -0
  187. package/dist/dev-ui-client/assets/index-CFhxfKAk.js +176 -0
  188. package/dist/dev-ui-client/assets/index-D9wFwfPp.css +32 -0
  189. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  190. package/dist/dev-ui-client/index.html +13 -0
  191. package/dist/discover.d.ts +15 -0
  192. package/dist/discover.d.ts.map +1 -0
  193. package/dist/discover.js +32 -0
  194. package/dist/discover.js.map +1 -0
  195. package/dist/factory.d.ts.map +1 -1
  196. package/dist/factory.js +37 -13
  197. package/dist/factory.js.map +1 -1
  198. package/dist/index.d.ts +6 -1
  199. package/dist/index.d.ts.map +1 -1
  200. package/dist/index.js +6 -0
  201. package/dist/index.js.map +1 -1
  202. package/dist/node.d.ts +1 -0
  203. package/dist/node.d.ts.map +1 -1
  204. package/dist/node.js +1 -0
  205. package/dist/node.js.map +1 -1
  206. package/dist/nodes/agent/executor.d.ts +2 -0
  207. package/dist/nodes/agent/executor.d.ts.map +1 -1
  208. package/dist/nodes/agent/executor.js +11 -1
  209. package/dist/nodes/agent/executor.js.map +1 -1
  210. package/dist/registry-gen.d.ts +6 -0
  211. package/dist/registry-gen.d.ts.map +1 -0
  212. package/dist/registry-gen.js +146 -0
  213. package/dist/registry-gen.js.map +1 -0
  214. package/dist/types.d.ts +21 -3
  215. package/dist/types.d.ts.map +1 -1
  216. package/dist/workflow.d.ts +22 -0
  217. package/dist/workflow.d.ts.map +1 -1
  218. package/dist/workflow.js +113 -3
  219. package/dist/workflow.js.map +1 -1
  220. package/package.json +30 -6
  221. package/templates/app/.dockerignore +6 -0
  222. package/templates/app/.env.example +13 -0
  223. package/templates/app/Dockerfile +34 -0
  224. package/templates/app/README.md +29 -0
  225. package/templates/app/biome.jsonc +81 -0
  226. package/templates/app/dbos-config.yaml +6 -0
  227. package/templates/app/drizzle.config.ts +12 -0
  228. package/templates/app/generated/registry.ts +8 -0
  229. package/templates/app/next.config.js +13 -0
  230. package/templates/app/package.json +57 -0
  231. package/templates/app/postcss.config.js +5 -0
  232. package/templates/app/public/favicon.ico +0 -0
  233. package/templates/app/src/app/_components/.gitkeep +0 -0
  234. package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
  235. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  236. package/templates/app/src/app/layout.tsx +29 -0
  237. package/templates/app/src/app/page.tsx +18 -0
  238. package/templates/app/src/env.js +46 -0
  239. package/templates/app/src/instrumentation.ts +6 -0
  240. package/templates/app/src/lib/pflow.ts +28 -0
  241. package/templates/app/src/server/api/root.ts +21 -0
  242. package/templates/app/src/server/api/routers/.gitkeep +0 -0
  243. package/templates/app/src/server/api/trpc.ts +106 -0
  244. package/templates/app/src/server/db/index.ts +18 -0
  245. package/templates/app/src/server/db/schema.ts +14 -0
  246. package/templates/app/src/styles/globals.css +6 -0
  247. package/templates/app/src/styles/globals.css.orange +126 -0
  248. package/templates/app/src/trpc/query-client.ts +25 -0
  249. package/templates/app/src/trpc/react.tsx +78 -0
  250. package/templates/app/src/trpc/server.ts +30 -0
  251. package/templates/app/tsconfig.check.json +23 -0
  252. package/templates/app/tsconfig.json +42 -0
  253. package/templates/app/tsconfig.server.json +5 -0
  254. package/templates/app/tsconfig.test.json +21 -0
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Get the stored API token, or null if not authenticated.
3
+ */
4
+ export declare function getToken(): string | null;
5
+ /**
6
+ * Save an API token and server URL to ~/.0pflow/credentials.
7
+ */
8
+ export declare function saveToken(token: string, serverUrl?: string): void;
9
+ /**
10
+ * Check if the user is authenticated (has a stored token).
11
+ */
12
+ export declare function isAuthenticated(): boolean;
13
+ /**
14
+ * Get the server URL from stored credentials, or the default.
15
+ */
16
+ export declare function getServerUrl(): string;
17
+ /**
18
+ * Open a URL in the user's default browser.
19
+ */
20
+ export declare function openBrowser(url: string): void;
21
+ /**
22
+ * Error indicating the user needs to approve the auth session in their browser.
23
+ */
24
+ export declare class AuthRequiredError extends Error {
25
+ readonly authUrl: string;
26
+ constructor(authUrl: string);
27
+ }
28
+ /**
29
+ * Perform browser-based CLI authentication (two-phase, non-blocking).
30
+ *
31
+ * Phase 1 (no pending session):
32
+ * - Creates a session, opens browser, polls briefly (~16s)
33
+ * - If approved quickly: saves token, returns
34
+ * - If not: saves pending session, throws AuthRequiredError with URL
35
+ *
36
+ * Phase 2 (pending session exists):
37
+ * - Checks if the pending session was approved
38
+ * - If approved: saves token, clears pending, returns
39
+ * - If not: throws AuthRequiredError with URL again
40
+ */
41
+ export declare function authenticate(): Promise<void>;
42
+ /**
43
+ * Clear stored credentials (logout).
44
+ */
45
+ export declare function logout(): void;
46
+ //# sourceMappingURL=cloud-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-auth.d.ts","sourceRoot":"","sources":["../../src/connections/cloud-auth.ts"],"names":[],"mappings":"AA+FA;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAOxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAOjE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiB7C;AA0CD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,OAAO,EAAE,MAAM,CAAC;gBAEpB,OAAO,EAAE,MAAM;CAS5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DlD;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAS7B"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * CLI authentication for the 0pflow cloud server.
3
+ *
4
+ * Adapted from the Pencil MCP auth pattern:
5
+ * /Users/cevian/Development/pencil/packages/mcp-server/src/auth.ts
6
+ *
7
+ * Flow:
8
+ * 1. MCP/CLI calls authenticate()
9
+ * 2. Creates session on server → gets {code, secret}
10
+ * 3. Opens browser to /auth/cli?cli_code=X
11
+ * 4. User signs in (GitHub OAuth) and approves
12
+ * 5. Polls server until approved → saves token to ~/.0pflow/credentials
13
+ */
14
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { homedir } from "node:os";
17
+ import { exec } from "node:child_process";
18
+ const CREDENTIALS_DIR = join(homedir(), ".0pflow");
19
+ const CREDENTIALS_FILE = join(CREDENTIALS_DIR, "credentials");
20
+ const PENDING_AUTH_FILE = join(CREDENTIALS_DIR, "pending_auth");
21
+ const DEFAULT_SERVER_URL = process.env.OPFLOW_SERVER_URL ?? "https://opflow-auth.fly.dev";
22
+ const POLL_INTERVAL_MS = 2000;
23
+ const QUICK_POLL_ATTEMPTS = 8; // ~16 seconds
24
+ function ensureDir() {
25
+ if (!existsSync(CREDENTIALS_DIR)) {
26
+ mkdirSync(CREDENTIALS_DIR, { recursive: true });
27
+ }
28
+ }
29
+ function readCredentials() {
30
+ try {
31
+ if (!existsSync(CREDENTIALS_FILE)) {
32
+ return null;
33
+ }
34
+ const raw = readFileSync(CREDENTIALS_FILE, "utf-8");
35
+ const parsed = JSON.parse(raw);
36
+ if (!parsed.token) {
37
+ return null;
38
+ }
39
+ return parsed;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function readPendingAuth() {
46
+ try {
47
+ if (!existsSync(PENDING_AUTH_FILE)) {
48
+ return null;
49
+ }
50
+ const raw = readFileSync(PENDING_AUTH_FILE, "utf-8");
51
+ const parsed = JSON.parse(raw);
52
+ // Expire after 5 minutes
53
+ if (Date.now() - parsed.createdAt > 5 * 60 * 1000) {
54
+ unlinkSync(PENDING_AUTH_FILE);
55
+ return null;
56
+ }
57
+ return parsed;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ function savePendingAuth(pending) {
64
+ ensureDir();
65
+ writeFileSync(PENDING_AUTH_FILE, JSON.stringify(pending, null, 2), "utf-8");
66
+ }
67
+ function clearPendingAuth() {
68
+ try {
69
+ if (existsSync(PENDING_AUTH_FILE)) {
70
+ unlinkSync(PENDING_AUTH_FILE);
71
+ }
72
+ }
73
+ catch {
74
+ // ignore
75
+ }
76
+ }
77
+ /**
78
+ * Get the stored API token, or null if not authenticated.
79
+ */
80
+ export function getToken() {
81
+ // Environment variable takes precedence (for cloud deployments)
82
+ if (process.env.OPFLOW_TOKEN) {
83
+ return process.env.OPFLOW_TOKEN;
84
+ }
85
+ const creds = readCredentials();
86
+ return creds?.token ?? null;
87
+ }
88
+ /**
89
+ * Save an API token and server URL to ~/.0pflow/credentials.
90
+ */
91
+ export function saveToken(token, serverUrl) {
92
+ ensureDir();
93
+ const credentials = {
94
+ token,
95
+ serverUrl: serverUrl ?? DEFAULT_SERVER_URL,
96
+ };
97
+ writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), "utf-8");
98
+ }
99
+ /**
100
+ * Check if the user is authenticated (has a stored token).
101
+ */
102
+ export function isAuthenticated() {
103
+ return getToken() !== null;
104
+ }
105
+ /**
106
+ * Get the server URL from stored credentials, or the default.
107
+ */
108
+ export function getServerUrl() {
109
+ // Environment variable takes precedence (matches getToken() behavior)
110
+ if (process.env.OPFLOW_SERVER_URL) {
111
+ return process.env.OPFLOW_SERVER_URL;
112
+ }
113
+ const creds = readCredentials();
114
+ return creds?.serverUrl ?? DEFAULT_SERVER_URL;
115
+ }
116
+ /**
117
+ * Open a URL in the user's default browser.
118
+ */
119
+ export function openBrowser(url) {
120
+ const platform = process.platform;
121
+ let command;
122
+ if (platform === "darwin") {
123
+ command = `open "${url}"`;
124
+ }
125
+ else if (platform === "win32") {
126
+ command = `start "" "${url}"`;
127
+ }
128
+ else {
129
+ command = `xdg-open "${url}"`;
130
+ }
131
+ exec(command, (error) => {
132
+ if (error) {
133
+ process.stderr.write(`Failed to open browser: ${error.message}\n`);
134
+ }
135
+ });
136
+ }
137
+ function sleep(ms) {
138
+ return new Promise((resolve) => setTimeout(resolve, ms));
139
+ }
140
+ /**
141
+ * Check a pending auth session's status.
142
+ */
143
+ async function checkPendingSession(serverUrl, code, secret) {
144
+ try {
145
+ const checkResponse = await fetch(`${serverUrl}/api/auth/cli/check?code=${encodeURIComponent(code)}&secret=${encodeURIComponent(secret)}`);
146
+ if (!checkResponse.ok)
147
+ return null;
148
+ const checkData = (await checkResponse.json());
149
+ if (checkData.data.status === "approved" && checkData.data.token) {
150
+ return { token: checkData.data.token };
151
+ }
152
+ if (checkData.data.status === "expired") {
153
+ clearPendingAuth();
154
+ }
155
+ return null;
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ /**
162
+ * Error indicating the user needs to approve the auth session in their browser.
163
+ */
164
+ export class AuthRequiredError extends Error {
165
+ authUrl;
166
+ constructor(authUrl) {
167
+ super(`Authentication required. I've opened your browser to authorize access.\n\n` +
168
+ `If the browser didn't open, visit this URL:\n${authUrl}\n\n` +
169
+ `After you approve access in the browser, retry this command.`);
170
+ this.name = "AuthRequiredError";
171
+ this.authUrl = authUrl;
172
+ }
173
+ }
174
+ /**
175
+ * Perform browser-based CLI authentication (two-phase, non-blocking).
176
+ *
177
+ * Phase 1 (no pending session):
178
+ * - Creates a session, opens browser, polls briefly (~16s)
179
+ * - If approved quickly: saves token, returns
180
+ * - If not: saves pending session, throws AuthRequiredError with URL
181
+ *
182
+ * Phase 2 (pending session exists):
183
+ * - Checks if the pending session was approved
184
+ * - If approved: saves token, clears pending, returns
185
+ * - If not: throws AuthRequiredError with URL again
186
+ */
187
+ export async function authenticate() {
188
+ const serverUrl = DEFAULT_SERVER_URL;
189
+ // Phase 2: Check if a pending session was approved
190
+ const pending = readPendingAuth();
191
+ if (pending) {
192
+ const result = await checkPendingSession(pending.serverUrl, pending.code, pending.secret);
193
+ if (result) {
194
+ saveToken(result.token, pending.serverUrl);
195
+ clearPendingAuth();
196
+ process.stderr.write("Authentication successful! Token saved.\n");
197
+ return;
198
+ }
199
+ // Still pending — tell user to approve
200
+ throw new AuthRequiredError(pending.authUrl);
201
+ }
202
+ // Phase 1: Create a new session
203
+ const createResponse = await fetch(`${serverUrl}/api/auth/cli/session`, {
204
+ method: "POST",
205
+ headers: { "Content-Type": "application/json" },
206
+ });
207
+ if (!createResponse.ok) {
208
+ const errorText = await createResponse.text();
209
+ throw new Error(`Failed to create auth session: ${errorText}`);
210
+ }
211
+ const createData = (await createResponse.json());
212
+ const { code, secret } = createData.data;
213
+ const authUrl = `${serverUrl}/auth/cli?cli_code=${code}`;
214
+ // Save pending session so Phase 2 can pick it up
215
+ savePendingAuth({ code, secret, authUrl, serverUrl, createdAt: Date.now() });
216
+ // Open browser and print URL
217
+ process.stderr.write(`\nOpen this URL to authenticate:\n ${authUrl}\n\n`);
218
+ openBrowser(authUrl);
219
+ // Quick poll: give the user ~16 seconds to approve
220
+ for (let attempt = 0; attempt < QUICK_POLL_ATTEMPTS; attempt++) {
221
+ await sleep(POLL_INTERVAL_MS);
222
+ const result = await checkPendingSession(serverUrl, code, secret);
223
+ if (result) {
224
+ saveToken(result.token, serverUrl);
225
+ clearPendingAuth();
226
+ process.stderr.write("Authentication successful! Token saved.\n");
227
+ return;
228
+ }
229
+ }
230
+ // Not approved yet — throw with helpful message
231
+ throw new AuthRequiredError(authUrl);
232
+ }
233
+ /**
234
+ * Clear stored credentials (logout).
235
+ */
236
+ export function logout() {
237
+ try {
238
+ if (existsSync(CREDENTIALS_FILE)) {
239
+ unlinkSync(CREDENTIALS_FILE);
240
+ }
241
+ }
242
+ catch {
243
+ // ignore
244
+ }
245
+ clearPendingAuth();
246
+ }
247
+ //# sourceMappingURL=cloud-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-auth.js","sourceRoot":"","sources":["../../src/connections/cloud-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * HTTP client for the 0pflow cloud server.
3
+ *
4
+ * Adapted from the Pencil MCP client pattern:
5
+ * /Users/cevian/Development/pencil/packages/mcp-server/src/client.ts
6
+ *
7
+ * Makes authenticated API calls using the token from cloud-auth.ts.
8
+ * Auto-triggers authenticate() when not authenticated.
9
+ */
10
+ import { AuthRequiredError } from "./cloud-auth.js";
11
+ export declare class AuthError extends Error {
12
+ constructor(message?: string);
13
+ }
14
+ export declare class ApiError extends Error {
15
+ readonly status: number;
16
+ constructor(status: number, message: string);
17
+ }
18
+ /**
19
+ * Make an authenticated HTTP call to the 0pflow cloud server.
20
+ * Returns the parsed response data (the `data` field from the response).
21
+ * Throws AuthError if not authenticated, ApiError if the request fails.
22
+ */
23
+ export declare function apiCall(method: string, path: string, body?: Record<string, unknown>): Promise<unknown>;
24
+ export { AuthRequiredError };
25
+ //# sourceMappingURL=cloud-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../../src/connections/cloud-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAKL,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,CAAC,EAAE,MAAM;CAO7B;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * HTTP client for the 0pflow cloud server.
3
+ *
4
+ * Adapted from the Pencil MCP client pattern:
5
+ * /Users/cevian/Development/pencil/packages/mcp-server/src/client.ts
6
+ *
7
+ * Makes authenticated API calls using the token from cloud-auth.ts.
8
+ * Auto-triggers authenticate() when not authenticated.
9
+ */
10
+ import { getToken, getServerUrl, isAuthenticated, authenticate, AuthRequiredError, } from "./cloud-auth.js";
11
+ export class AuthError extends Error {
12
+ constructor(message) {
13
+ super(message ??
14
+ "Not authenticated with 0pflow cloud. Run `0pflow login` or set OPFLOW_TOKEN.");
15
+ this.name = "AuthError";
16
+ }
17
+ }
18
+ export class ApiError extends Error {
19
+ status;
20
+ constructor(status, message) {
21
+ super(message);
22
+ this.name = "ApiError";
23
+ this.status = status;
24
+ }
25
+ }
26
+ /**
27
+ * Make an authenticated HTTP call to the 0pflow cloud server.
28
+ * Returns the parsed response data (the `data` field from the response).
29
+ * Throws AuthError if not authenticated, ApiError if the request fails.
30
+ */
31
+ export async function apiCall(method, path, body) {
32
+ if (!isAuthenticated()) {
33
+ // Attempt browser-based authentication (non-blocking, ~16s max)
34
+ await authenticate();
35
+ if (!isAuthenticated()) {
36
+ throw new AuthError();
37
+ }
38
+ }
39
+ const token = getToken();
40
+ const serverUrl = getServerUrl();
41
+ const headers = {
42
+ Authorization: `Bearer ${token}`,
43
+ "Content-Type": "application/json",
44
+ };
45
+ const response = await fetch(`${serverUrl}${path}`, {
46
+ method,
47
+ headers,
48
+ body: body ? JSON.stringify(body) : undefined,
49
+ });
50
+ const responseData = (await response.json());
51
+ if (!response.ok) {
52
+ const errorMessage = responseData.error ??
53
+ `HTTP ${response.status}: ${response.statusText}`;
54
+ throw new ApiError(response.status, errorMessage);
55
+ }
56
+ return responseData.data;
57
+ }
58
+ export { AuthRequiredError };
59
+ //# sourceMappingURL=cloud-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../../src/connections/cloud-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAgB;QAC1B,KAAK,CACH,OAAO;YACL,8EAA8E,CACjF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,MAAM,CAAS;IAE/B,YAAY,MAAc,EAAE,OAAe;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,IAAY,EACZ,IAA8B;IAE9B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,gEAAgE;QAChE,MAAM,YAAY,EAAE,CAAC;QAErB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,EAAG,CAAC;IAC1B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,KAAK,EAAE;QAChC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,IAAI,EAAE,EAAE;QAClD,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;IAExE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GACf,YAAY,CAAC,KAAgB;YAC9B,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC;AAC3B,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { IntegrationProvider } from "./integration-provider.js";
2
+ import type { ConnectionCredentials } from "../types.js";
3
+ /**
4
+ * IntegrationProvider backed by the 0pflow cloud server (hosted mode).
5
+ * All Nango operations are proxied through the server — no NANGO_SECRET_KEY needed locally.
6
+ */
7
+ export declare class CloudIntegrationProvider implements IntegrationProvider {
8
+ fetchCredentials(integrationId: string, connectionId: string): Promise<ConnectionCredentials>;
9
+ listIntegrations(): Promise<Array<{
10
+ id: string;
11
+ provider: string;
12
+ }>>;
13
+ listConnections(integrationId: string): Promise<Array<{
14
+ connection_id: string;
15
+ provider_config_key: string;
16
+ display_name: string;
17
+ }>>;
18
+ createConnectSession(integrationId: string): Promise<{
19
+ token: string;
20
+ }>;
21
+ }
22
+ //# sourceMappingURL=cloud-integration-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-integration-provider.d.ts","sourceRoot":"","sources":["../../src/connections/cloud-integration-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIzD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAC5D,gBAAgB,CACpB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAS3B,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAQpE,eAAe,CACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAuBzF,oBAAoB,CACxB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAM9B"}
@@ -0,0 +1,41 @@
1
+ import { apiCall } from "./cloud-client.js";
2
+ import { getConnectionDisplayName } from "./connection-labels.js";
3
+ /**
4
+ * IntegrationProvider backed by the 0pflow cloud server (hosted mode).
5
+ * All Nango operations are proxied through the server — no NANGO_SECRET_KEY needed locally.
6
+ */
7
+ export class CloudIntegrationProvider {
8
+ async fetchCredentials(integrationId, connectionId) {
9
+ const data = (await apiCall("GET", `/api/credentials/${encodeURIComponent(integrationId)}?connection_id=${encodeURIComponent(connectionId)}`));
10
+ return data;
11
+ }
12
+ async listIntegrations() {
13
+ const data = (await apiCall("GET", "/api/integrations"));
14
+ return data;
15
+ }
16
+ async listConnections(integrationId) {
17
+ const data = (await apiCall("GET", `/api/integrations/${encodeURIComponent(integrationId)}/connections`));
18
+ return Promise.all(data.map(async (c) => {
19
+ let displayName = c.connection_id;
20
+ try {
21
+ const creds = await this.fetchCredentials(integrationId, c.connection_id);
22
+ displayName = await getConnectionDisplayName(integrationId, c.connection_id, creds.raw);
23
+ }
24
+ catch {
25
+ // Fall back to connection_id if fetch fails
26
+ }
27
+ return {
28
+ connection_id: c.connection_id,
29
+ provider_config_key: c.provider_config_key,
30
+ display_name: displayName,
31
+ };
32
+ }));
33
+ }
34
+ async createConnectSession(integrationId) {
35
+ const data = (await apiCall("POST", "/api/nango/connect-session", {
36
+ integration_id: integrationId,
37
+ }));
38
+ return data;
39
+ }
40
+ }
41
+ //# sourceMappingURL=cloud-integration-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-integration-provider.js","sourceRoot":"","sources":["../../src/connections/cloud-integration-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,gBAAgB,CACpB,aAAqB,EACrB,YAAoB;QAEpB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CACzB,KAAK,EACL,oBAAoB,kBAAkB,CAAC,aAAa,CAAC,kBAAkB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAC1G,CAA0B,CAAC;QAE5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAGrD,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,aAAqB;QAErB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CACzB,KAAK,EACL,qBAAqB,kBAAkB,CAAC,aAAa,CAAC,cAAc,CACrE,CAAkE,CAAC;QACpE,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACnB,IAAI,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;gBAC1E,WAAW,GAAG,MAAM,wBAAwB,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1F,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;YAC9C,CAAC;YACD,OAAO;gBACL,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,mBAAmB,EAAE,CAAC,CAAC,mBAAmB;gBAC1C,YAAY,EAAE,WAAW;aAC1B,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,aAAqB;QAErB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,4BAA4B,EAAE;YAChE,cAAc,EAAE,aAAa;SAC9B,CAAC,CAAsB,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Per-integration display name resolvers.
3
+ *
4
+ * Each resolver extracts a human-readable label from the raw OAuth
5
+ * credentials returned by nango.getConnection(). The `raw` object
6
+ * structure varies per provider.
7
+ *
8
+ * Google integrations don't include email in the OAuth token response,
9
+ * so we call the userinfo API with the access token to resolve it.
10
+ */
11
+ type RawCredentials = Record<string, any>;
12
+ export declare function getConnectionDisplayName(integrationId: string, connectionId: string, rawCredentials: RawCredentials | undefined): Promise<string>;
13
+ export {};
14
+ //# sourceMappingURL=connection-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-labels.d.ts","sourceRoot":"","sources":["../../src/connections/connection-labels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AA8B1C,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,cAAc,GAAG,SAAS,GACzC,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Per-integration display name resolvers.
3
+ *
4
+ * Each resolver extracts a human-readable label from the raw OAuth
5
+ * credentials returned by nango.getConnection(). The `raw` object
6
+ * structure varies per provider.
7
+ *
8
+ * Google integrations don't include email in the OAuth token response,
9
+ * so we call the userinfo API with the access token to resolve it.
10
+ */
11
+ async function resolveGoogleEmail(raw) {
12
+ const accessToken = raw?.access_token;
13
+ if (!accessToken)
14
+ return undefined;
15
+ try {
16
+ const res = await fetch("https://www.googleapis.com/oauth2/v2/userinfo", {
17
+ headers: { Authorization: `Bearer ${accessToken}` },
18
+ });
19
+ if (!res.ok)
20
+ return undefined;
21
+ const data = (await res.json());
22
+ return data.email;
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ }
28
+ const resolvers = {
29
+ slack: (r) => r?.raw?.team?.name,
30
+ github: (r) => r?.raw?.login ?? r?.raw?.name,
31
+ "google-calendar": resolveGoogleEmail,
32
+ "google-drive": resolveGoogleEmail,
33
+ "google-mail": resolveGoogleEmail,
34
+ "google-sheet": resolveGoogleEmail,
35
+ salesforce: (r) => r?.raw?.instance_url?.replace(/^https?:\/\//, ""),
36
+ };
37
+ export async function getConnectionDisplayName(integrationId, connectionId, rawCredentials) {
38
+ if (rawCredentials) {
39
+ const resolver = resolvers[integrationId];
40
+ const name = await resolver?.(rawCredentials);
41
+ if (name)
42
+ return name;
43
+ }
44
+ return connectionId;
45
+ }
46
+ //# sourceMappingURL=connection-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-labels.js","sourceRoot":"","sources":["../../src/connections/connection-labels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,KAAK,UAAU,kBAAkB,CAAC,GAAmB;IACnD,MAAM,WAAW,GAAG,GAAG,EAAE,YAAY,CAAC;IACtC,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+CAA+C,EAAE;YACvE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAkC;IAC/C,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;IAChC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI;IAC5C,iBAAiB,EAAE,kBAAkB;IACrC,cAAc,EAAE,kBAAkB;IAClC,aAAa,EAAE,kBAAkB;IACjC,cAAc,EAAE,kBAAkB;IAClC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAChB,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;CACpD,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,aAAqB,EACrB,YAAoB,EACpB,cAA0C;IAE1C,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { ensureConnectionsTable } from "./schema.js";
2
+ export { resolveConnectionId, upsertConnection, listConnections, deleteConnection, } from "./resolver.js";
3
+ export type { ConnectionMapping } from "./resolver.js";
4
+ export { initNango, getNango, fetchCredentials } from "./nango-client.js";
5
+ export type { IntegrationProvider } from "./integration-provider.js";
6
+ export { createIntegrationProvider } from "./integration-provider.js";
7
+ export { LocalIntegrationProvider, createLocalIntegrationProvider } from "./local-integration-provider.js";
8
+ export { CloudIntegrationProvider } from "./cloud-integration-provider.js";
9
+ export { getToken as getCloudToken, isAuthenticated as isCloudAuthenticated, authenticate as cloudAuthenticate, logout as cloudLogout, } from "./cloud-auth.js";
10
+ export { apiCall as cloudApiCall } from "./cloud-client.js";
11
+ export { getConnectionDisplayName } from "./connection-labels.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,eAAe,IAAI,oBAAoB,EACvC,YAAY,IAAI,iBAAiB,EACjC,MAAM,IAAI,WAAW,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { ensureConnectionsTable } from "./schema.js";
2
+ export { resolveConnectionId, upsertConnection, listConnections, deleteConnection, } from "./resolver.js";
3
+ export { initNango, getNango, fetchCredentials } from "./nango-client.js";
4
+ export { createIntegrationProvider } from "./integration-provider.js";
5
+ export { LocalIntegrationProvider, createLocalIntegrationProvider } from "./local-integration-provider.js";
6
+ export { CloudIntegrationProvider } from "./cloud-integration-provider.js";
7
+ export { getToken as getCloudToken, isAuthenticated as isCloudAuthenticated, authenticate as cloudAuthenticate, logout as cloudLogout, } from "./cloud-auth.js";
8
+ export { apiCall as cloudApiCall } from "./cloud-client.js";
9
+ export { getConnectionDisplayName } from "./connection-labels.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAC3G,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,eAAe,IAAI,oBAAoB,EACvC,YAAY,IAAI,iBAAiB,EACjC,MAAM,IAAI,WAAW,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ConnectionCredentials } from "../types.js";
2
+ /**
3
+ * Abstraction over integration/credential operations.
4
+ *
5
+ * LocalIntegrationProvider calls Nango directly (self-hosted mode).
6
+ * CloudIntegrationProvider calls the 0pflow cloud server (hosted mode).
7
+ *
8
+ * Connection *mapping* (workflow/node → connection_id) is NOT part of this
9
+ * interface — that stays in the user's local app DB via resolver.ts.
10
+ */
11
+ export interface IntegrationProvider {
12
+ /** Fetch actual credentials for a connection */
13
+ fetchCredentials(integrationId: string, connectionId: string): Promise<ConnectionCredentials>;
14
+ /** List available integrations */
15
+ listIntegrations(): Promise<Array<{
16
+ id: string;
17
+ provider: string;
18
+ }>>;
19
+ /** List connections for an integration */
20
+ listConnections(integrationId: string): Promise<Array<{
21
+ connection_id: string;
22
+ provider_config_key: string;
23
+ display_name: string;
24
+ }>>;
25
+ /** Create a Connect session for OAuth setup */
26
+ createConnectSession(integrationId: string, endUserId?: string): Promise<{
27
+ token: string;
28
+ }>;
29
+ }
30
+ /**
31
+ * Auto-detect and create the appropriate IntegrationProvider.
32
+ *
33
+ * - NANGO_SECRET_KEY set → LocalIntegrationProvider (direct Nango)
34
+ * - Otherwise → CloudIntegrationProvider (proxies through 0pflow cloud)
35
+ *
36
+ * Optionally pass a nangoSecretKey to override env detection.
37
+ */
38
+ export declare function createIntegrationProvider(nangoSecretKey?: string): Promise<IntegrationProvider>;
39
+ //# sourceMappingURL=integration-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-provider.d.ts","sourceRoot":"","sources":["../../src/connections/integration-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,gBAAgB,CACd,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAElC,kCAAkC;IAClC,gBAAgB,IAAI,OAAO,CACzB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CACxC,CAAC;IAEF,0CAA0C;IAC1C,eAAe,CACb,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAEhG,+CAA+C;IAC/C,oBAAoB,CAClB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAU9B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Auto-detect and create the appropriate IntegrationProvider.
3
+ *
4
+ * - NANGO_SECRET_KEY set → LocalIntegrationProvider (direct Nango)
5
+ * - Otherwise → CloudIntegrationProvider (proxies through 0pflow cloud)
6
+ *
7
+ * Optionally pass a nangoSecretKey to override env detection.
8
+ */
9
+ export async function createIntegrationProvider(nangoSecretKey) {
10
+ const key = nangoSecretKey ?? process.env.NANGO_SECRET_KEY;
11
+ if (key) {
12
+ const { createLocalIntegrationProvider } = await import("./local-integration-provider.js");
13
+ return createLocalIntegrationProvider(key);
14
+ }
15
+ else {
16
+ const { CloudIntegrationProvider } = await import("./cloud-integration-provider.js");
17
+ return new CloudIntegrationProvider();
18
+ }
19
+ }
20
+ //# sourceMappingURL=integration-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-provider.js","sourceRoot":"","sources":["../../src/connections/integration-provider.ts"],"names":[],"mappings":"AAmCA;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,cAAuB;IAEvB,MAAM,GAAG,GAAG,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAE3D,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,EAAE,8BAA8B,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAC3F,OAAO,8BAA8B,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QACrF,OAAO,IAAI,wBAAwB,EAAE,CAAC;IACxC,CAAC;AACH,CAAC"}