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,50 @@
1
+ // Use dynamic import to avoid hard dependency when Nango isn't configured.
2
+ // Stored on globalThis so it's shared across module instances (jiti vs compiled).
3
+ const NANGO_KEY = Symbol.for("opflow.nangoInstance");
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ function getNangoInstance() {
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ return globalThis[NANGO_KEY] ?? null;
8
+ }
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ function setNangoInstance(instance) {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ globalThis[NANGO_KEY] = instance;
13
+ }
14
+ /**
15
+ * Initialize the Nango client singleton.
16
+ */
17
+ export async function initNango(secretKey) {
18
+ const { Nango } = await import("@nangohq/node");
19
+ setNangoInstance(new Nango({ secretKey }));
20
+ }
21
+ /**
22
+ * Get the Nango client instance, or null if not initialized.
23
+ */
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ export function getNango() {
26
+ return getNangoInstance();
27
+ }
28
+ /**
29
+ * Fetch credentials for an integration connection from Nango.
30
+ */
31
+ export async function fetchCredentials(integrationId, connectionId) {
32
+ const nango = getNangoInstance();
33
+ if (!nango) {
34
+ throw new Error("Nango not initialized. Set NANGO_SECRET_KEY environment variable or nangoSecretKey in config.");
35
+ }
36
+ const connection = await nango.getConnection(integrationId, connectionId);
37
+ // Extract token from credentials based on auth type
38
+ const creds = connection.credentials ?? {};
39
+ const token = creds.access_token ??
40
+ creds.api_key ??
41
+ creds.apiKey ??
42
+ creds.token ??
43
+ "";
44
+ return {
45
+ token,
46
+ connectionConfig: connection.connection_config ?? {},
47
+ raw: creds,
48
+ };
49
+ }
50
+ //# sourceMappingURL=nango-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nango-client.js","sourceRoot":"","sources":["../../src/connections/nango-client.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,kFAAkF;AAClF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAErD,8DAA8D;AAC9D,SAAS,gBAAgB;IACvB,8DAA8D;IAC9D,OAAQ,UAAkC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAChE,CAAC;AAED,8DAA8D;AAC9D,SAAS,gBAAgB,CAAC,QAAa;IACrC,8DAA8D;IAC7D,UAAkC,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAChD,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,8DAA8D;AAC9D,MAAM,UAAU,QAAQ;IACtB,OAAO,gBAAgB,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,YAAoB;IAEpB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAE1E,oDAAoD;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GACT,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,MAAM;QACZ,KAAK,CAAC,KAAK;QACX,EAAE,CAAC;IAEL,OAAO;QACL,KAAK;QACL,gBAAgB,EAAE,UAAU,CAAC,iBAAiB,IAAI,EAAE;QACpD,GAAG,EAAE,KAAK;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import pg from "pg";
2
+ export interface ConnectionMapping {
3
+ workflow_name: string;
4
+ node_name: string;
5
+ integration_id: string;
6
+ connection_id: string;
7
+ updated_at?: Date;
8
+ }
9
+ /**
10
+ * Resolve a connection ID for a given workflow/node/integration.
11
+ * Checks for an exact match first, then falls back to global defaults (* / *).
12
+ */
13
+ export declare function resolveConnectionId(pool: pg.Pool, workflowName: string, nodeName: string, integrationId: string, schema: string): Promise<string | null>;
14
+ /**
15
+ * Upsert a connection mapping.
16
+ */
17
+ export declare function upsertConnection(pool: pg.Pool, mapping: Omit<ConnectionMapping, "updated_at">, schema: string): Promise<void>;
18
+ /**
19
+ * List all connection mappings.
20
+ */
21
+ export declare function listConnections(pool: pg.Pool, schema: string): Promise<ConnectionMapping[]>;
22
+ /**
23
+ * Delete a connection mapping.
24
+ */
25
+ export declare function deleteConnection(pool: pg.Pool, workflowName: string, nodeName: string, integrationId: string, schema: string): Promise<void>;
26
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/connections/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB;AAOD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,EAC9C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAOjG;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,48 @@
1
+ /** Schema-qualified table reference for opflow_connections */
2
+ function table(schema) {
3
+ return `"${schema}".opflow_connections`;
4
+ }
5
+ /**
6
+ * Resolve a connection ID for a given workflow/node/integration.
7
+ * Checks for an exact match first, then falls back to global defaults (* / *).
8
+ */
9
+ export async function resolveConnectionId(pool, workflowName, nodeName, integrationId, schema) {
10
+ const result = await pool.query(`SELECT connection_id FROM ${table(schema)}
11
+ WHERE integration_id = $1
12
+ AND (
13
+ (workflow_name = $2 AND node_name = $3)
14
+ OR (workflow_name = '*' AND node_name = '*')
15
+ )
16
+ ORDER BY
17
+ CASE WHEN workflow_name = '*' AND node_name = '*' THEN 1 ELSE 0 END
18
+ LIMIT 1`, [integrationId, workflowName, nodeName]);
19
+ return result.rows.length > 0 ? result.rows[0].connection_id : null;
20
+ }
21
+ /**
22
+ * Upsert a connection mapping.
23
+ */
24
+ export async function upsertConnection(pool, mapping, schema) {
25
+ await pool.query(`INSERT INTO ${table(schema)} (workflow_name, node_name, integration_id, connection_id, updated_at)
26
+ VALUES ($1, $2, $3, $4, NOW())
27
+ ON CONFLICT (workflow_name, node_name, integration_id)
28
+ DO UPDATE SET connection_id = EXCLUDED.connection_id, updated_at = NOW()`, [mapping.workflow_name, mapping.node_name, mapping.integration_id, mapping.connection_id]);
29
+ }
30
+ /**
31
+ * List all connection mappings.
32
+ */
33
+ export async function listConnections(pool, schema) {
34
+ const result = await pool.query(`SELECT workflow_name, node_name, integration_id, connection_id, updated_at
35
+ FROM ${table(schema)}
36
+ ORDER BY workflow_name, node_name, integration_id`);
37
+ return result.rows;
38
+ }
39
+ /**
40
+ * Delete a connection mapping.
41
+ */
42
+ export async function deleteConnection(pool, workflowName, nodeName, integrationId, schema) {
43
+ await pool.query(`DELETE FROM ${table(schema)}
44
+ WHERE workflow_name = $1
45
+ AND node_name = $2
46
+ AND integration_id = $3`, [workflowName, nodeName, integrationId]);
47
+ }
48
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/connections/resolver.ts"],"names":[],"mappings":"AAUA,8DAA8D;AAC9D,SAAS,KAAK,CAAC,MAAc;IAC3B,OAAO,IAAI,MAAM,sBAAsB,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAa,EACb,YAAoB,EACpB,QAAgB,EAChB,aAAqB,EACrB,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B,6BAA6B,KAAK,CAAC,MAAM,CAAC;;;;;;;;YAQlC,EACR,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CACxC,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,OAA8C,EAC9C,MAAc;IAEd,MAAM,IAAI,CAAC,KAAK,CACd,eAAe,KAAK,CAAC,MAAM,CAAC;;;6EAG6C,EACzE,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAa,EAAE,MAAc;IACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAC7B;WACO,KAAK,CAAC,MAAM,CAAC;sDAC8B,CACnD,CAAC;IACF,OAAO,MAAM,CAAC,IAA2B,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,YAAoB,EACpB,QAAgB,EAChB,aAAqB,EACrB,MAAc;IAEd,MAAM,IAAI,CAAC,KAAK,CACd,eAAe,KAAK,CAAC,MAAM,CAAC;;;8BAGF,EAC1B,CAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,CAAC,CACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Ensure the opflow_connections table exists.
3
+ * Creates a short-lived connection, runs the DDL, then closes it.
4
+ * When schema is provided, the table is created in that schema explicitly
5
+ * (avoids permission issues when a same-named table exists in public).
6
+ */
7
+ export declare function ensureConnectionsTable(databaseUrl: string, schema: string): Promise<void>;
8
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/connections/schema.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/F"}
@@ -0,0 +1,31 @@
1
+ import pg from "pg";
2
+ function createTableSQL(schema) {
3
+ const table = `"${schema}".opflow_connections`;
4
+ return `
5
+ CREATE TABLE IF NOT EXISTS ${table} (
6
+ workflow_name TEXT NOT NULL,
7
+ node_name TEXT NOT NULL,
8
+ integration_id TEXT NOT NULL,
9
+ connection_id TEXT NOT NULL,
10
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
11
+ PRIMARY KEY (workflow_name, node_name, integration_id)
12
+ )`;
13
+ }
14
+ /**
15
+ * Ensure the opflow_connections table exists.
16
+ * Creates a short-lived connection, runs the DDL, then closes it.
17
+ * When schema is provided, the table is created in that schema explicitly
18
+ * (avoids permission issues when a same-named table exists in public).
19
+ */
20
+ export async function ensureConnectionsTable(databaseUrl, schema) {
21
+ const client = new pg.Client({ connectionString: databaseUrl });
22
+ try {
23
+ await client.connect();
24
+ await client.query(`CREATE SCHEMA IF NOT EXISTS "${schema}"`);
25
+ await client.query(createTableSQL(schema));
26
+ }
27
+ finally {
28
+ await client.end();
29
+ }
30
+ }
31
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/connections/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,SAAS,cAAc,CAAC,MAAc;IACpC,MAAM,KAAK,GAAG,IAAI,MAAM,sBAAsB,CAAC;IAC/C,OAAO;6BACoB,KAAK;;;;;;;EAOhC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB,EAAE,MAAc;IAC9E,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,KAAK,CAAC,gCAAgC,MAAM,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACrD;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,cAAmB,GAAG,eAAe,CAqBnF"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CACrD;AAQD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,cAAmB,GAAG,eAAe,CA6BnF"}
package/dist/context.js CHANGED
@@ -10,12 +10,16 @@ const defaultLogger = (message, level) => {
10
10
  export function createWorkflowContext(options = {}) {
11
11
  const logger = options.logger ?? defaultLogger;
12
12
  const ctx = {
13
+ workflowName: "*",
13
14
  run: async (executable, inputs) => {
14
15
  // Validate inputs against schema
15
16
  const validated = executable.inputSchema.parse(inputs);
16
17
  // Execute (DBOS wrapping will be added in factory integration)
17
18
  return executable.execute(ctx, validated);
18
19
  },
20
+ getConnection: async () => {
21
+ throw new Error("getConnection is not available in this context. Use create0pflow() for connection management.");
22
+ },
19
23
  log: (message, level = "info") => {
20
24
  logger(message, level);
21
25
  },
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,KAAe,EAAE,EAAE;IACzD,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CACxC,WAAW,KAAK,KAAK,OAAO,EAAE,CAC/B,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAA0B,EAAE;IAChE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAE/C,MAAM,GAAG,GAAoB;QAC3B,GAAG,EAAE,KAAK,EACR,UAAuC,EACvC,MAAc,EACI,EAAE;YACpB,iCAAiC;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvD,+DAA+D;YAC/D,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,GAAG,EAAE,CAAC,OAAe,EAAE,QAAkB,MAAM,EAAE,EAAE;YACjD,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,KAAe,EAAE,EAAE;IACzD,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CACxC,WAAW,KAAK,KAAK,OAAO,EAAE,CAC/B,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAA0B,EAAE;IAChE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAE/C,MAAM,GAAG,GAAoB;QAC3B,YAAY,EAAE,GAAG;QAEjB,GAAG,EAAE,KAAK,EACR,UAAuC,EACvC,MAAc,EACI,EAAE;YACpB,iCAAiC;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEvD,+DAA+D;YAC/D,OAAO,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC;QAED,aAAa,EAAE,KAAK,IAAI,EAAE;YACxB,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QAED,GAAG,EAAE,CAAC,OAAe,EAAE,QAAkB,MAAM,EAAE,EAAE;YACjD,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type pg from "pg";
3
+ import type { IntegrationProvider } from "../connections/integration-provider.js";
4
+ export interface ApiContext {
5
+ pool: pg.Pool;
6
+ integrationProvider: IntegrationProvider;
7
+ /** DBOS system schema (e.g. my_app_dbos) for workflow_status queries */
8
+ schema: string;
9
+ /** App schema where opflow_connections lives (e.g. my_app) */
10
+ appSchema: string;
11
+ }
12
+ /**
13
+ * Handle API requests. Returns true if the request was handled, false otherwise.
14
+ */
15
+ export declare function handleApiRequest(req: IncomingMessage, res: ServerResponse, ctx: ApiContext): Promise<boolean>;
16
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/dev-ui/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAMzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AA0BD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,OAAO,CAAC,CAoPlB"}
@@ -0,0 +1,237 @@
1
+ import { listConnections, upsertConnection, deleteConnection, } from "../connections/index.js";
2
+ import { parseOutput } from "../cli/trace.js";
3
+ function jsonResponse(res, status, data) {
4
+ res.writeHead(status, {
5
+ "Content-Type": "application/json",
6
+ "Access-Control-Allow-Origin": "*",
7
+ });
8
+ res.end(JSON.stringify(data));
9
+ }
10
+ function parseBody(req) {
11
+ return new Promise((resolve, reject) => {
12
+ const chunks = [];
13
+ req.on("data", (chunk) => chunks.push(chunk));
14
+ req.on("end", () => {
15
+ try {
16
+ const body = Buffer.concat(chunks).toString("utf-8");
17
+ resolve(body ? JSON.parse(body) : {});
18
+ }
19
+ catch (err) {
20
+ reject(err);
21
+ }
22
+ });
23
+ req.on("error", reject);
24
+ });
25
+ }
26
+ /**
27
+ * Handle API requests. Returns true if the request was handled, false otherwise.
28
+ */
29
+ export async function handleApiRequest(req, res, ctx) {
30
+ const url = req.url ?? "";
31
+ const method = req.method ?? "GET";
32
+ // CORS preflight
33
+ if (method === "OPTIONS" && url.startsWith("/api/")) {
34
+ res.writeHead(204, {
35
+ "Access-Control-Allow-Origin": "*",
36
+ "Access-Control-Allow-Methods": "GET, PUT, DELETE, POST, OPTIONS",
37
+ "Access-Control-Allow-Headers": "Content-Type",
38
+ });
39
+ res.end();
40
+ return true;
41
+ }
42
+ // GET /api/connections
43
+ if (url === "/api/connections" && method === "GET") {
44
+ const connections = await listConnections(ctx.pool, ctx.appSchema);
45
+ jsonResponse(res, 200, connections);
46
+ return true;
47
+ }
48
+ // PUT /api/connections
49
+ if (url === "/api/connections" && method === "PUT") {
50
+ const body = (await parseBody(req));
51
+ if (!body.integration_id || !body.connection_id) {
52
+ jsonResponse(res, 400, { error: "integration_id and connection_id are required" });
53
+ return true;
54
+ }
55
+ await upsertConnection(ctx.pool, {
56
+ workflow_name: body.workflow_name ?? "*",
57
+ node_name: body.node_name ?? "*",
58
+ integration_id: body.integration_id,
59
+ connection_id: body.connection_id,
60
+ }, ctx.appSchema);
61
+ jsonResponse(res, 200, { ok: true });
62
+ return true;
63
+ }
64
+ // DELETE /api/connections
65
+ if (url === "/api/connections" && method === "DELETE") {
66
+ const body = (await parseBody(req));
67
+ if (!body.integration_id) {
68
+ jsonResponse(res, 400, { error: "integration_id is required" });
69
+ return true;
70
+ }
71
+ await deleteConnection(ctx.pool, body.workflow_name ?? "*", body.node_name ?? "*", body.integration_id, ctx.appSchema);
72
+ jsonResponse(res, 200, { ok: true });
73
+ return true;
74
+ }
75
+ // GET /api/nango/integrations — list available integrations
76
+ if (url === "/api/nango/integrations" && method === "GET") {
77
+ try {
78
+ const integrations = await ctx.integrationProvider.listIntegrations();
79
+ jsonResponse(res, 200, integrations);
80
+ }
81
+ catch (err) {
82
+ jsonResponse(res, 500, {
83
+ error: err instanceof Error ? err.message : "Failed to list integrations",
84
+ });
85
+ }
86
+ return true;
87
+ }
88
+ // GET /api/nango/connections/:integrationId
89
+ const nangoConnectionsMatch = url.match(/^\/api\/nango\/connections\/([^/]+)$/);
90
+ if (nangoConnectionsMatch && method === "GET") {
91
+ const integrationId = decodeURIComponent(nangoConnectionsMatch[1]);
92
+ try {
93
+ const connections = await ctx.integrationProvider.listConnections(integrationId);
94
+ jsonResponse(res, 200, connections);
95
+ }
96
+ catch (err) {
97
+ jsonResponse(res, 500, {
98
+ error: err instanceof Error ? err.message : "Failed to list connections",
99
+ });
100
+ }
101
+ return true;
102
+ }
103
+ // POST /api/nango/connect-session
104
+ if (url === "/api/nango/connect-session" && method === "POST") {
105
+ const body = (await parseBody(req));
106
+ if (!body.integration_id) {
107
+ jsonResponse(res, 400, { error: "integration_id is required" });
108
+ return true;
109
+ }
110
+ try {
111
+ const session = await ctx.integrationProvider.createConnectSession(body.integration_id);
112
+ jsonResponse(res, 200, session);
113
+ }
114
+ catch (err) {
115
+ jsonResponse(res, 500, {
116
+ error: err instanceof Error ? err.message : "Failed to create connect session",
117
+ });
118
+ }
119
+ return true;
120
+ }
121
+ // ---- Run History endpoints ----
122
+ /** Unwrap a superjson-wrapped error into a clean string (stack trace if available, else message) */
123
+ function parseError(raw) {
124
+ if (!raw)
125
+ return null;
126
+ const parsed = parseOutput(raw);
127
+ if (parsed && typeof parsed === "object") {
128
+ const obj = parsed;
129
+ // Stack already includes the message as its first line
130
+ if (typeof obj.stack === "string")
131
+ return obj.stack;
132
+ if (typeof obj.message === "string")
133
+ return obj.message;
134
+ }
135
+ if (typeof parsed === "string")
136
+ return parsed;
137
+ if (typeof raw === "string")
138
+ return raw;
139
+ return null;
140
+ }
141
+ // GET /api/runs?workflow=NAME&limit=N
142
+ if (url.startsWith("/api/runs") && method === "GET") {
143
+ const fullUrl = req.url ?? "";
144
+ // GET /api/runs/:runId/trace
145
+ const traceMatch = fullUrl.match(/^\/api\/runs\/([^/]+)\/trace/);
146
+ if (traceMatch) {
147
+ const runId = decodeURIComponent(traceMatch[1]);
148
+ try {
149
+ // Get workflow metadata
150
+ const workflowResult = await ctx.pool.query(`SELECT
151
+ workflow_uuid, name, status, created_at, updated_at,
152
+ (updated_at - created_at) as duration_ms,
153
+ output::text, error
154
+ FROM ${ctx.schema}.workflow_status
155
+ WHERE workflow_uuid = $1`, [runId]);
156
+ if (workflowResult.rows.length === 0) {
157
+ jsonResponse(res, 404, { error: "Run not found" });
158
+ return true;
159
+ }
160
+ const workflow = workflowResult.rows[0];
161
+ workflow.output = parseOutput(workflow.output);
162
+ workflow.error = parseError(workflow.error);
163
+ // Get operations with hierarchy using recursive CTE
164
+ const opsResult = await ctx.pool.query(`WITH RECURSIVE workflow_tree AS (
165
+ SELECT workflow_uuid, workflow_uuid as root_uuid, 0 as depth
166
+ FROM ${ctx.schema}.workflow_status
167
+ WHERE workflow_uuid = $1
168
+ UNION
169
+ SELECT ws.workflow_uuid, wt.root_uuid, wt.depth + 1
170
+ FROM ${ctx.schema}.workflow_status ws
171
+ JOIN ${ctx.schema}.operation_outputs oo ON oo.child_workflow_id = ws.workflow_uuid
172
+ JOIN workflow_tree wt ON oo.workflow_uuid = wt.workflow_uuid
173
+ )
174
+ SELECT
175
+ oo.workflow_uuid, wt.depth, oo.function_id, oo.function_name,
176
+ oo.child_workflow_id, oo.started_at_epoch_ms, oo.completed_at_epoch_ms,
177
+ (oo.completed_at_epoch_ms - oo.started_at_epoch_ms) as duration_ms,
178
+ oo.output::text as output_preview, oo.error
179
+ FROM workflow_tree wt
180
+ JOIN ${ctx.schema}.operation_outputs oo ON oo.workflow_uuid = wt.workflow_uuid
181
+ ORDER BY oo.started_at_epoch_ms, wt.depth, oo.function_id`, [runId]);
182
+ // Unwrap superjson in operation output previews and errors
183
+ const operations = opsResult.rows.map((op) => {
184
+ if (op.output_preview) {
185
+ const parsed = parseOutput(op.output_preview);
186
+ op.output_preview = parsed !== null ? JSON.stringify(parsed) : null;
187
+ }
188
+ op.error = parseError(op.error);
189
+ return op;
190
+ });
191
+ jsonResponse(res, 200, { workflow, operations });
192
+ }
193
+ catch (err) {
194
+ jsonResponse(res, 500, {
195
+ error: err instanceof Error ? err.message : "Failed to get trace",
196
+ });
197
+ }
198
+ return true;
199
+ }
200
+ // GET /api/runs (list)
201
+ if (fullUrl.match(/^\/api\/runs(\?|$)/)) {
202
+ try {
203
+ const params = new URL(fullUrl, "http://localhost").searchParams;
204
+ const workflowName = params.get("workflow");
205
+ const limit = Math.min(parseInt(params.get("limit") ?? "50", 10), 200);
206
+ const queryParams = [];
207
+ let query = `
208
+ SELECT workflow_uuid, name, status, created_at, updated_at, output::text, error
209
+ FROM ${ctx.schema}.workflow_status
210
+ WHERE LENGTH(workflow_uuid) = 36
211
+ `;
212
+ if (workflowName) {
213
+ queryParams.push(workflowName);
214
+ query += ` AND name = $${queryParams.length}`;
215
+ }
216
+ queryParams.push(limit);
217
+ query += ` ORDER BY created_at DESC LIMIT $${queryParams.length}`;
218
+ const result = await ctx.pool.query(query, queryParams);
219
+ // Unwrap superjson output and errors for each run
220
+ const runs = result.rows.map((row) => {
221
+ row.output = parseOutput(row.output);
222
+ row.error = parseError(row.error);
223
+ return row;
224
+ });
225
+ jsonResponse(res, 200, runs);
226
+ }
227
+ catch (err) {
228
+ jsonResponse(res, 500, {
229
+ error: err instanceof Error ? err.message : "Failed to list runs",
230
+ });
231
+ }
232
+ return true;
233
+ }
234
+ }
235
+ return false;
236
+ }
237
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/dev-ui/api.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAW9C,SAAS,YAAY,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IACtE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,kBAAkB;QAClC,6BAA6B,EAAE,GAAG;KACnC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,SAAS,CAAC,GAAoB;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,GAAe;IAEf,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IAEnC,iBAAiB;IACjB,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,6BAA6B,EAAE,GAAG;YAClC,8BAA8B,EAAE,iCAAiC;YACjE,8BAA8B,EAAE,cAAc;SAC/C,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,KAAK,kBAAkB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACnE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,KAAK,kBAAkB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAKjC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAChD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,GAAG;YACxC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,GAAG;YAChC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAClB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0BAA0B;IAC1B,IAAI,GAAG,KAAK,kBAAkB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAIjC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,gBAAgB,CACpB,GAAG,CAAC,IAAI,EACR,IAAI,CAAC,aAAa,IAAI,GAAG,EACzB,IAAI,CAAC,SAAS,IAAI,GAAG,EACrB,IAAI,CAAC,cAAc,EACnB,GAAG,CAAC,SAAS,CACd,CAAC;QACF,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4DAA4D;IAC5D,IAAI,GAAG,KAAK,yBAAyB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC;YACtE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;gBACrB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B;aAC1E,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4CAA4C;IAC5C,MAAM,qBAAqB,GAAG,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAChF,IAAI,qBAAqB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC9C,MAAM,aAAa,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YACjF,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;gBACrB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B;aACzE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kCAAkC;IAClC,IAAI,GAAG,KAAK,4BAA4B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAEjC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxF,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;gBACrB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC;aAC/E,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kCAAkC;IAElC,oGAAoG;IACpG,SAAS,UAAU,CAAC,GAAY;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,MAAiC,CAAC;YAC9C,uDAAuD;YACvD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC;YACpD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QAC1D,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAE9B,6BAA6B;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC;gBACH,wBAAwB;gBACxB,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CACzC;;;;iBAIO,GAAG,CAAC,MAAM;mCACQ,EACzB,CAAC,KAAK,CAAC,CACR,CAAC;gBAEF,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACrC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;oBACnD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/C,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAE5C,oDAAoD;gBACpD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CACpC;;mBAES,GAAG,CAAC,MAAM;;;;mBAIV,GAAG,CAAC,MAAM;mBACV,GAAG,CAAC,MAAM;;;;;;;;;iBASZ,GAAG,CAAC,MAAM;oEACyC,EAC1D,CAAC,KAAK,CAAC,CACR,CAAC;gBAEF,2DAA2D;gBAC3D,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAA2B,EAAE,EAAE;oBACpE,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;wBACtB,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;wBAC9C,EAAE,CAAC,cAAc,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACtE,CAAC;oBACD,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;oBAChC,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;oBACrB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;iBAClE,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAAC;gBACjE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;gBAEvE,MAAM,WAAW,GAAwB,EAAE,CAAC;gBAC5C,IAAI,KAAK,GAAG;;iBAEH,GAAG,CAAC,MAAM;;SAElB,CAAC;gBAEF,IAAI,YAAY,EAAE,CAAC;oBACjB,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC/B,KAAK,IAAI,gBAAgB,WAAW,CAAC,MAAM,EAAE,CAAC;gBAChD,CAAC;gBAED,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,KAAK,IAAI,oCAAoC,WAAW,CAAC,MAAM,EAAE,CAAC;gBAElE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBAExD,kDAAkD;gBAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAA4B,EAAE,EAAE;oBAC5D,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACrC,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAClC,OAAO,GAAG,CAAC;gBACb,CAAC,CAAC,CAAC;gBAEH,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;oBACrB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB;iBAClE,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { WorkflowDAG } from "./types.js";
2
+ /**
3
+ * Parse a node source file and extract the integrations array from its .create() config.
4
+ */
5
+ export declare function extractNodeIntegrations(source: string): Promise<string[] | undefined>;
6
+ /**
7
+ * Parse a node source file and extract the name from its .create() config.
8
+ */
9
+ export declare function extractNodeName(source: string): Promise<string | undefined>;
10
+ /**
11
+ * Parse a node source file and extract the description from its .create() config.
12
+ */
13
+ export declare function extractNodeDescription(source: string): Promise<string | undefined>;
14
+ /**
15
+ * Parse a single TypeScript file and extract workflow DAGs from it.
16
+ * Fault-tolerant: returns whatever it can parse, even from broken files.
17
+ */
18
+ export declare function extractDAGs(filePath: string, source: string): Promise<WorkflowDAG[]>;
19
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/dev-ui/dag/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,WAAW,EAAa,MAAM,YAAY,CAAC;AAgI3E;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAuB3F;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAuBjF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwBxF;AAoWD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,EAAE,CAAC,CAoRxB"}