0pflow 0.1.0-dev.4fd2ac2 → 0.1.0-dev.582d64d

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 (204) 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 +7 -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 +59 -9
  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/discovery.d.ts +10 -0
  22. package/dist/cli/discovery.d.ts.map +1 -1
  23. package/dist/cli/discovery.js +42 -0
  24. package/dist/cli/discovery.js.map +1 -1
  25. package/dist/cli/env.js +1 -1
  26. package/dist/cli/env.js.map +1 -1
  27. package/dist/cli/index.d.ts.map +1 -1
  28. package/dist/cli/index.js +124 -11
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/install.d.ts.map +1 -1
  31. package/dist/cli/install.js +39 -9
  32. package/dist/cli/install.js.map +1 -1
  33. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  34. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  35. package/dist/cli/mcp/lib/scaffolding.js +219 -0
  36. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  37. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  38. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  39. package/dist/cli/mcp/lib/templates.js.map +1 -1
  40. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  41. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  42. package/dist/cli/mcp/tools/createApp.js +12 -55
  43. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  44. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  45. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  46. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  47. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  48. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  49. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  50. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  51. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  52. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  53. package/dist/cli/mcp/tools/getRun.js +80 -0
  54. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  55. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  56. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  57. package/dist/cli/mcp/tools/getTrace.js +104 -0
  58. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  59. package/dist/cli/mcp/tools/index.d.ts +94 -1
  60. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  61. package/dist/cli/mcp/tools/index.js +16 -0
  62. package/dist/cli/mcp/tools/index.js.map +1 -1
  63. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  64. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  65. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  66. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  67. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  68. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  69. package/dist/cli/mcp/tools/listRuns.js +72 -0
  70. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  71. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  72. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  73. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  74. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  75. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  76. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  77. package/dist/cli/mcp/tools/runNode.js +74 -0
  78. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  79. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  80. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  81. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  82. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  83. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  84. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  85. package/dist/cli/mcp/tools/setupAppSchema.js +11 -132
  86. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  87. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  88. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  89. package/dist/cli/mcp/tools/utils.js +28 -0
  90. package/dist/cli/mcp/tools/utils.js.map +1 -0
  91. package/dist/cli/run.d.ts +2 -0
  92. package/dist/cli/run.d.ts.map +1 -0
  93. package/dist/cli/run.js +391 -0
  94. package/dist/cli/run.js.map +1 -0
  95. package/dist/cli/trace.d.ts +5 -0
  96. package/dist/cli/trace.d.ts.map +1 -1
  97. package/dist/cli/trace.js +1 -1
  98. package/dist/cli/trace.js.map +1 -1
  99. package/dist/connections/cloud-auth.d.ts +46 -0
  100. package/dist/connections/cloud-auth.d.ts.map +1 -0
  101. package/dist/connections/cloud-auth.js +243 -0
  102. package/dist/connections/cloud-auth.js.map +1 -0
  103. package/dist/connections/cloud-client.d.ts +25 -0
  104. package/dist/connections/cloud-client.d.ts.map +1 -0
  105. package/dist/connections/cloud-client.js +59 -0
  106. package/dist/connections/cloud-client.js.map +1 -0
  107. package/dist/connections/cloud-integration-provider.d.ts +21 -0
  108. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  109. package/dist/connections/cloud-integration-provider.js +26 -0
  110. package/dist/connections/cloud-integration-provider.js.map +1 -0
  111. package/dist/connections/index.d.ts +11 -0
  112. package/dist/connections/index.d.ts.map +1 -0
  113. package/dist/connections/index.js +9 -0
  114. package/dist/connections/index.js.map +1 -0
  115. package/dist/connections/integration-provider.d.ts +38 -0
  116. package/dist/connections/integration-provider.d.ts.map +1 -0
  117. package/dist/connections/integration-provider.js +20 -0
  118. package/dist/connections/integration-provider.js.map +1 -0
  119. package/dist/connections/local-integration-provider.d.ts +28 -0
  120. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  121. package/dist/connections/local-integration-provider.js +54 -0
  122. package/dist/connections/local-integration-provider.js.map +1 -0
  123. package/dist/connections/nango-client.d.ts +14 -0
  124. package/dist/connections/nango-client.d.ts.map +1 -0
  125. package/dist/connections/nango-client.js +50 -0
  126. package/dist/connections/nango-client.js.map +1 -0
  127. package/dist/connections/resolver.d.ts +26 -0
  128. package/dist/connections/resolver.d.ts.map +1 -0
  129. package/dist/connections/resolver.js +48 -0
  130. package/dist/connections/resolver.js.map +1 -0
  131. package/dist/connections/schema.d.ts +8 -0
  132. package/dist/connections/schema.d.ts.map +1 -0
  133. package/dist/connections/schema.js +31 -0
  134. package/dist/connections/schema.js.map +1 -0
  135. package/dist/context.d.ts.map +1 -1
  136. package/dist/context.js +4 -0
  137. package/dist/context.js.map +1 -1
  138. package/dist/dev-ui/api.d.ts +16 -0
  139. package/dist/dev-ui/api.d.ts.map +1 -0
  140. package/dist/dev-ui/api.js +237 -0
  141. package/dist/dev-ui/api.js.map +1 -0
  142. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  143. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  144. package/dist/dev-ui/dag/extractor.js +716 -0
  145. package/dist/dev-ui/dag/extractor.js.map +1 -0
  146. package/dist/dev-ui/dag/types.d.ts +42 -0
  147. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  148. package/dist/dev-ui/dag/types.js +2 -0
  149. package/dist/dev-ui/dag/types.js.map +1 -0
  150. package/dist/dev-ui/dev-server.d.ts +18 -0
  151. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  152. package/dist/dev-ui/dev-server.js +222 -0
  153. package/dist/dev-ui/dev-server.js.map +1 -0
  154. package/dist/dev-ui/index.d.ts +3 -0
  155. package/dist/dev-ui/index.d.ts.map +1 -0
  156. package/dist/dev-ui/index.js +2 -0
  157. package/dist/dev-ui/index.js.map +1 -0
  158. package/dist/dev-ui/pty.d.ts +16 -0
  159. package/dist/dev-ui/pty.d.ts.map +1 -0
  160. package/dist/dev-ui/pty.js +87 -0
  161. package/dist/dev-ui/pty.js.map +1 -0
  162. package/dist/dev-ui/watcher.d.ts +12 -0
  163. package/dist/dev-ui/watcher.d.ts.map +1 -0
  164. package/dist/dev-ui/watcher.js +162 -0
  165. package/dist/dev-ui/watcher.js.map +1 -0
  166. package/dist/dev-ui/ws.d.ts +52 -0
  167. package/dist/dev-ui/ws.d.ts.map +1 -0
  168. package/dist/dev-ui/ws.js +32 -0
  169. package/dist/dev-ui/ws.js.map +1 -0
  170. package/dist/dev-ui-client/assets/index-C-LxzUII.css +32 -0
  171. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  172. package/dist/dev-ui-client/assets/index-aAIwXl4O.js +127 -0
  173. package/dist/dev-ui-client/index.html +13 -0
  174. package/dist/discover.d.ts +15 -0
  175. package/dist/discover.d.ts.map +1 -0
  176. package/dist/discover.js +29 -0
  177. package/dist/discover.js.map +1 -0
  178. package/dist/factory.d.ts.map +1 -1
  179. package/dist/factory.js +25 -12
  180. package/dist/factory.js.map +1 -1
  181. package/dist/index.d.ts +5 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +4 -0
  184. package/dist/index.js.map +1 -1
  185. package/dist/node.d.ts +1 -0
  186. package/dist/node.d.ts.map +1 -1
  187. package/dist/node.js +1 -0
  188. package/dist/node.js.map +1 -1
  189. package/dist/nodes/agent/executor.d.ts +2 -0
  190. package/dist/nodes/agent/executor.d.ts.map +1 -1
  191. package/dist/nodes/agent/executor.js +11 -1
  192. package/dist/nodes/agent/executor.js.map +1 -1
  193. package/dist/types.d.ts +21 -3
  194. package/dist/types.d.ts.map +1 -1
  195. package/dist/workflow.d.ts +22 -0
  196. package/dist/workflow.d.ts.map +1 -1
  197. package/dist/workflow.js +97 -2
  198. package/dist/workflow.js.map +1 -1
  199. package/package.json +26 -5
  200. package/templates/app/dbos-config.yaml +6 -0
  201. package/templates/app/package.json +4 -1
  202. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  203. package/templates/app/src/instrumentation.ts +6 -0
  204. package/templates/app/src/lib/pflow.ts +29 -0
@@ -0,0 +1,243 @@
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://auth-server-vert.vercel.app";
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
+ const creds = readCredentials();
110
+ return creds?.serverUrl ?? DEFAULT_SERVER_URL;
111
+ }
112
+ /**
113
+ * Open a URL in the user's default browser.
114
+ */
115
+ export function openBrowser(url) {
116
+ const platform = process.platform;
117
+ let command;
118
+ if (platform === "darwin") {
119
+ command = `open "${url}"`;
120
+ }
121
+ else if (platform === "win32") {
122
+ command = `start "" "${url}"`;
123
+ }
124
+ else {
125
+ command = `xdg-open "${url}"`;
126
+ }
127
+ exec(command, (error) => {
128
+ if (error) {
129
+ process.stderr.write(`Failed to open browser: ${error.message}\n`);
130
+ }
131
+ });
132
+ }
133
+ function sleep(ms) {
134
+ return new Promise((resolve) => setTimeout(resolve, ms));
135
+ }
136
+ /**
137
+ * Check a pending auth session's status.
138
+ */
139
+ async function checkPendingSession(serverUrl, code, secret) {
140
+ try {
141
+ const checkResponse = await fetch(`${serverUrl}/api/auth/cli/check?code=${encodeURIComponent(code)}&secret=${encodeURIComponent(secret)}`);
142
+ if (!checkResponse.ok)
143
+ return null;
144
+ const checkData = (await checkResponse.json());
145
+ if (checkData.data.status === "approved" && checkData.data.token) {
146
+ return { token: checkData.data.token };
147
+ }
148
+ if (checkData.data.status === "expired") {
149
+ clearPendingAuth();
150
+ }
151
+ return null;
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ }
157
+ /**
158
+ * Error indicating the user needs to approve the auth session in their browser.
159
+ */
160
+ export class AuthRequiredError extends Error {
161
+ authUrl;
162
+ constructor(authUrl) {
163
+ super(`Authentication required. I've opened your browser to authorize access.\n\n` +
164
+ `If the browser didn't open, visit this URL:\n${authUrl}\n\n` +
165
+ `After you approve access in the browser, retry this command.`);
166
+ this.name = "AuthRequiredError";
167
+ this.authUrl = authUrl;
168
+ }
169
+ }
170
+ /**
171
+ * Perform browser-based CLI authentication (two-phase, non-blocking).
172
+ *
173
+ * Phase 1 (no pending session):
174
+ * - Creates a session, opens browser, polls briefly (~16s)
175
+ * - If approved quickly: saves token, returns
176
+ * - If not: saves pending session, throws AuthRequiredError with URL
177
+ *
178
+ * Phase 2 (pending session exists):
179
+ * - Checks if the pending session was approved
180
+ * - If approved: saves token, clears pending, returns
181
+ * - If not: throws AuthRequiredError with URL again
182
+ */
183
+ export async function authenticate() {
184
+ const serverUrl = DEFAULT_SERVER_URL;
185
+ // Phase 2: Check if a pending session was approved
186
+ const pending = readPendingAuth();
187
+ if (pending) {
188
+ const result = await checkPendingSession(pending.serverUrl, pending.code, pending.secret);
189
+ if (result) {
190
+ saveToken(result.token, pending.serverUrl);
191
+ clearPendingAuth();
192
+ process.stderr.write("Authentication successful! Token saved.\n");
193
+ return;
194
+ }
195
+ // Still pending — tell user to approve
196
+ throw new AuthRequiredError(pending.authUrl);
197
+ }
198
+ // Phase 1: Create a new session
199
+ const createResponse = await fetch(`${serverUrl}/api/auth/cli/session`, {
200
+ method: "POST",
201
+ headers: { "Content-Type": "application/json" },
202
+ });
203
+ if (!createResponse.ok) {
204
+ const errorText = await createResponse.text();
205
+ throw new Error(`Failed to create auth session: ${errorText}`);
206
+ }
207
+ const createData = (await createResponse.json());
208
+ const { code, secret } = createData.data;
209
+ const authUrl = `${serverUrl}/auth/cli?cli_code=${code}`;
210
+ // Save pending session so Phase 2 can pick it up
211
+ savePendingAuth({ code, secret, authUrl, serverUrl, createdAt: Date.now() });
212
+ // Open browser and print URL
213
+ process.stderr.write(`\nOpen this URL to authenticate:\n ${authUrl}\n\n`);
214
+ openBrowser(authUrl);
215
+ // Quick poll: give the user ~16 seconds to approve
216
+ for (let attempt = 0; attempt < QUICK_POLL_ATTEMPTS; attempt++) {
217
+ await sleep(POLL_INTERVAL_MS);
218
+ const result = await checkPendingSession(serverUrl, code, secret);
219
+ if (result) {
220
+ saveToken(result.token, serverUrl);
221
+ clearPendingAuth();
222
+ process.stderr.write("Authentication successful! Token saved.\n");
223
+ return;
224
+ }
225
+ }
226
+ // Not approved yet — throw with helpful message
227
+ throw new AuthRequiredError(authUrl);
228
+ }
229
+ /**
230
+ * Clear stored credentials (logout).
231
+ */
232
+ export function logout() {
233
+ try {
234
+ if (existsSync(CREDENTIALS_FILE)) {
235
+ unlinkSync(CREDENTIALS_FILE);
236
+ }
237
+ }
238
+ catch {
239
+ // ignore
240
+ }
241
+ clearPendingAuth();
242
+ }
243
+ //# 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,21 @@
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
+ }>>;
17
+ createConnectSession(integrationId: string): Promise<{
18
+ token: string;
19
+ }>;
20
+ }
21
+ //# 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;AAGzD;;;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,CAAA;KAAE,CAAC,CAAC;IAQnE,oBAAoB,CACxB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAM9B"}
@@ -0,0 +1,26 @@
1
+ import { apiCall } from "./cloud-client.js";
2
+ /**
3
+ * IntegrationProvider backed by the 0pflow cloud server (hosted mode).
4
+ * All Nango operations are proxied through the server — no NANGO_SECRET_KEY needed locally.
5
+ */
6
+ export class CloudIntegrationProvider {
7
+ async fetchCredentials(integrationId, connectionId) {
8
+ const data = (await apiCall("GET", `/api/credentials/${encodeURIComponent(integrationId)}?connection_id=${encodeURIComponent(connectionId)}`));
9
+ return data;
10
+ }
11
+ async listIntegrations() {
12
+ const data = (await apiCall("GET", "/api/integrations"));
13
+ return data;
14
+ }
15
+ async listConnections(integrationId) {
16
+ const data = (await apiCall("GET", `/api/integrations/${encodeURIComponent(integrationId)}/connections`));
17
+ return data;
18
+ }
19
+ async createConnectSession(integrationId) {
20
+ const data = (await apiCall("POST", "/api/nango/connect-session", {
21
+ integration_id: integrationId,
22
+ }));
23
+ return data;
24
+ }
25
+ }
26
+ //# 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;AAE5C;;;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,IAAI,CAAC;IACd,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,11 @@
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
+ //# 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"}
@@ -0,0 +1,9 @@
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
+ //# 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"}
@@ -0,0 +1,38 @@
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
+ }>>;
24
+ /** Create a Connect session for OAuth setup */
25
+ createConnectSession(integrationId: string, endUserId?: string): Promise<{
26
+ token: string;
27
+ }>;
28
+ }
29
+ /**
30
+ * Auto-detect and create the appropriate IntegrationProvider.
31
+ *
32
+ * - NANGO_SECRET_KEY set → LocalIntegrationProvider (direct Nango)
33
+ * - Otherwise → CloudIntegrationProvider (proxies through 0pflow cloud)
34
+ *
35
+ * Optionally pass a nangoSecretKey to override env detection.
36
+ */
37
+ export declare function createIntegrationProvider(nangoSecretKey?: string): Promise<IntegrationProvider>;
38
+ //# 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,CAAA;KAAE,CAAC,CAAC,CAAC;IAE1E,+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"}
@@ -0,0 +1,28 @@
1
+ import type { IntegrationProvider } from "./integration-provider.js";
2
+ import type { ConnectionCredentials } from "../types.js";
3
+ /**
4
+ * IntegrationProvider backed by a direct Nango connection (self-hosted mode).
5
+ * Requires NANGO_SECRET_KEY.
6
+ */
7
+ export declare class LocalIntegrationProvider implements IntegrationProvider {
8
+ private nango;
9
+ constructor(nangoInstance: any);
10
+ fetchCredentials(integrationId: string, connectionId: string): Promise<ConnectionCredentials>;
11
+ listIntegrations(): Promise<Array<{
12
+ id: string;
13
+ provider: string;
14
+ }>>;
15
+ listConnections(integrationId: string): Promise<Array<{
16
+ connection_id: string;
17
+ provider_config_key: string;
18
+ }>>;
19
+ createConnectSession(integrationId: string, endUserId?: string): Promise<{
20
+ token: string;
21
+ }>;
22
+ }
23
+ /**
24
+ * Create a LocalIntegrationProvider from a Nango secret key.
25
+ * Uses dynamic import to avoid hard dependency on @nangohq/node.
26
+ */
27
+ export declare function createLocalIntegrationProvider(secretKey: string): Promise<LocalIntegrationProvider>;
28
+ //# sourceMappingURL=local-integration-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-integration-provider.d.ts","sourceRoot":"","sources":["../../src/connections/local-integration-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAElE,OAAO,CAAC,KAAK,CAAM;gBAGP,aAAa,EAAE,GAAG;IAIxB,gBAAgB,CACpB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAkB3B,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAUpE,eAAe,CACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAQnE,oBAAoB,CACxB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAO9B;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,wBAAwB,CAAC,CAInC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * IntegrationProvider backed by a direct Nango connection (self-hosted mode).
3
+ * Requires NANGO_SECRET_KEY.
4
+ */
5
+ export class LocalIntegrationProvider {
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ nango;
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ constructor(nangoInstance) {
10
+ this.nango = nangoInstance;
11
+ }
12
+ async fetchCredentials(integrationId, connectionId) {
13
+ const connection = await this.nango.getConnection(integrationId, connectionId);
14
+ const creds = connection.credentials ?? {};
15
+ const token = creds.access_token ??
16
+ creds.api_key ??
17
+ creds.apiKey ??
18
+ creds.token ??
19
+ "";
20
+ return {
21
+ token,
22
+ connectionConfig: connection.connection_config ?? {},
23
+ raw: creds,
24
+ };
25
+ }
26
+ async listIntegrations() {
27
+ const result = await this.nango.listIntegrations();
28
+ return (result.configs ?? []).map((c) => ({
29
+ id: c.unique_key,
30
+ provider: c.provider,
31
+ }));
32
+ }
33
+ async listConnections(integrationId) {
34
+ const result = await this.nango.listConnections();
35
+ return (result.connections ?? []).filter((c) => c.provider_config_key === integrationId);
36
+ }
37
+ async createConnectSession(integrationId, endUserId) {
38
+ const session = await this.nango.createConnectSession({
39
+ end_user: { id: endUserId ?? "dev-ui-user" },
40
+ allowed_integrations: [integrationId],
41
+ });
42
+ return { token: session.data.token };
43
+ }
44
+ }
45
+ /**
46
+ * Create a LocalIntegrationProvider from a Nango secret key.
47
+ * Uses dynamic import to avoid hard dependency on @nangohq/node.
48
+ */
49
+ export async function createLocalIntegrationProvider(secretKey) {
50
+ const { Nango } = await import("@nangohq/node");
51
+ const nango = new Nango({ secretKey });
52
+ return new LocalIntegrationProvider(nango);
53
+ }
54
+ //# sourceMappingURL=local-integration-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-integration-provider.js","sourceRoot":"","sources":["../../src/connections/local-integration-provider.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACnC,8DAA8D;IACtD,KAAK,CAAM;IAEnB,8DAA8D;IAC9D,YAAY,aAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,aAAqB,EACrB,YAAoB;QAEpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAE/E,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GACT,KAAK,CAAC,YAAY;YAClB,KAAK,CAAC,OAAO;YACb,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,KAAK;YACX,EAAE,CAAC;QAEL,OAAO;YACL,KAAK;YACL,gBAAgB,EAAE,UAAU,CAAC,iBAAiB,IAAI,EAAE;YACpD,GAAG,EAAE,KAAK;SACX,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAC/B,CAAC,CAA2C,EAAE,EAAE,CAAC,CAAC;YAChD,EAAE,EAAE,CAAC,CAAC,UAAU;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,aAAqB;QAErB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CACtC,CAAC,CAAkC,EAAE,EAAE,CACrC,CAAC,CAAC,mBAAmB,KAAK,aAAa,CAC1C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,aAAqB,EACrB,SAAkB;QAElB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;YACpD,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,IAAI,aAAa,EAAE;YAC5C,oBAAoB,EAAE,CAAC,aAAa,CAAC;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,SAAiB;IAEjB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ConnectionCredentials } from "../types.js";
2
+ /**
3
+ * Initialize the Nango client singleton.
4
+ */
5
+ export declare function initNango(secretKey: string): Promise<void>;
6
+ /**
7
+ * Get the Nango client instance, or null if not initialized.
8
+ */
9
+ export declare function getNango(): any | null;
10
+ /**
11
+ * Fetch credentials for an integration connection from Nango.
12
+ */
13
+ export declare function fetchCredentials(integrationId: string, connectionId: string): Promise<ConnectionCredentials>;
14
+ //# sourceMappingURL=nango-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nango-client.d.ts","sourceRoot":"","sources":["../../src/connections/nango-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAkBzD;;GAEG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED;;GAEG;AAEH,wBAAgB,QAAQ,IAAI,GAAG,GAAG,IAAI,CAErC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAwBhC"}