0pflow 0.1.0-dev.7dac39a → 0.1.0-dev.a318c24

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 (181) 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/agent.d.ts +6 -0
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +59 -9
  8. package/dist/agent.js.map +1 -1
  9. package/dist/cli/discovery.d.ts +10 -0
  10. package/dist/cli/discovery.d.ts.map +1 -1
  11. package/dist/cli/discovery.js +42 -0
  12. package/dist/cli/discovery.js.map +1 -1
  13. package/dist/cli/env.js +1 -1
  14. package/dist/cli/env.js.map +1 -1
  15. package/dist/cli/index.d.ts.map +1 -1
  16. package/dist/cli/index.js +101 -8
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/install.d.ts.map +1 -1
  19. package/dist/cli/install.js +32 -2
  20. package/dist/cli/install.js.map +1 -1
  21. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  22. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  23. package/dist/cli/mcp/lib/templates.js.map +1 -1
  24. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  25. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  26. package/dist/cli/mcp/tools/createApp.js +15 -5
  27. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  28. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  29. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  30. package/dist/cli/mcp/tools/getConnectionInfo.js +117 -0
  31. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  32. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  33. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  34. package/dist/cli/mcp/tools/getRun.js +80 -0
  35. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  36. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  37. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  38. package/dist/cli/mcp/tools/getTrace.js +104 -0
  39. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  40. package/dist/cli/mcp/tools/index.d.ts +101 -1
  41. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  42. package/dist/cli/mcp/tools/index.js +18 -0
  43. package/dist/cli/mcp/tools/index.js.map +1 -1
  44. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  45. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  46. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  47. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  48. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  49. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  50. package/dist/cli/mcp/tools/listRuns.js +72 -0
  51. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  52. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  53. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  54. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  55. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  56. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  57. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  58. package/dist/cli/mcp/tools/runNode.js +74 -0
  59. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  60. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  61. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  62. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  63. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  64. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  65. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  66. package/dist/cli/mcp/tools/setupAppSchema.js +41 -29
  67. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  68. package/dist/cli/mcp/tools/startDevUi.d.ts +15 -0
  69. package/dist/cli/mcp/tools/startDevUi.d.ts.map +1 -0
  70. package/dist/cli/mcp/tools/startDevUi.js +92 -0
  71. package/dist/cli/mcp/tools/startDevUi.js.map +1 -0
  72. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  73. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  74. package/dist/cli/mcp/tools/utils.js +28 -0
  75. package/dist/cli/mcp/tools/utils.js.map +1 -0
  76. package/dist/cli/trace.d.ts +5 -0
  77. package/dist/cli/trace.d.ts.map +1 -1
  78. package/dist/cli/trace.js +1 -1
  79. package/dist/cli/trace.js.map +1 -1
  80. package/dist/connections/cloud-auth.d.ts +46 -0
  81. package/dist/connections/cloud-auth.d.ts.map +1 -0
  82. package/dist/connections/cloud-auth.js +243 -0
  83. package/dist/connections/cloud-auth.js.map +1 -0
  84. package/dist/connections/cloud-client.d.ts +25 -0
  85. package/dist/connections/cloud-client.d.ts.map +1 -0
  86. package/dist/connections/cloud-client.js +59 -0
  87. package/dist/connections/cloud-client.js.map +1 -0
  88. package/dist/connections/cloud-integration-provider.d.ts +21 -0
  89. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  90. package/dist/connections/cloud-integration-provider.js +26 -0
  91. package/dist/connections/cloud-integration-provider.js.map +1 -0
  92. package/dist/connections/index.d.ts +11 -0
  93. package/dist/connections/index.d.ts.map +1 -0
  94. package/dist/connections/index.js +9 -0
  95. package/dist/connections/index.js.map +1 -0
  96. package/dist/connections/integration-provider.d.ts +38 -0
  97. package/dist/connections/integration-provider.d.ts.map +1 -0
  98. package/dist/connections/integration-provider.js +20 -0
  99. package/dist/connections/integration-provider.js.map +1 -0
  100. package/dist/connections/local-integration-provider.d.ts +28 -0
  101. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  102. package/dist/connections/local-integration-provider.js +54 -0
  103. package/dist/connections/local-integration-provider.js.map +1 -0
  104. package/dist/connections/nango-client.d.ts +14 -0
  105. package/dist/connections/nango-client.d.ts.map +1 -0
  106. package/dist/connections/nango-client.js +50 -0
  107. package/dist/connections/nango-client.js.map +1 -0
  108. package/dist/connections/resolver.d.ts +26 -0
  109. package/dist/connections/resolver.d.ts.map +1 -0
  110. package/dist/connections/resolver.js +44 -0
  111. package/dist/connections/resolver.js.map +1 -0
  112. package/dist/connections/schema.d.ts +6 -0
  113. package/dist/connections/schema.d.ts.map +1 -0
  114. package/dist/connections/schema.js +25 -0
  115. package/dist/connections/schema.js.map +1 -0
  116. package/dist/context.d.ts.map +1 -1
  117. package/dist/context.js +4 -0
  118. package/dist/context.js.map +1 -1
  119. package/dist/dev-ui/api.d.ts +13 -0
  120. package/dist/dev-ui/api.d.ts.map +1 -0
  121. package/dist/dev-ui/api.js +237 -0
  122. package/dist/dev-ui/api.js.map +1 -0
  123. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  124. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  125. package/dist/dev-ui/dag/extractor.js +728 -0
  126. package/dist/dev-ui/dag/extractor.js.map +1 -0
  127. package/dist/dev-ui/dag/types.d.ts +42 -0
  128. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  129. package/dist/dev-ui/dag/types.js +2 -0
  130. package/dist/dev-ui/dag/types.js.map +1 -0
  131. package/dist/dev-ui/dev-server.d.ts +14 -0
  132. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  133. package/dist/dev-ui/dev-server.js +158 -0
  134. package/dist/dev-ui/dev-server.js.map +1 -0
  135. package/dist/dev-ui/index.d.ts +3 -0
  136. package/dist/dev-ui/index.d.ts.map +1 -0
  137. package/dist/dev-ui/index.js +2 -0
  138. package/dist/dev-ui/index.js.map +1 -0
  139. package/dist/dev-ui/watcher.d.ts +12 -0
  140. package/dist/dev-ui/watcher.d.ts.map +1 -0
  141. package/dist/dev-ui/watcher.js +162 -0
  142. package/dist/dev-ui/watcher.js.map +1 -0
  143. package/dist/dev-ui/ws.d.ts +27 -0
  144. package/dist/dev-ui/ws.d.ts.map +1 -0
  145. package/dist/dev-ui/ws.js +19 -0
  146. package/dist/dev-ui/ws.js.map +1 -0
  147. package/dist/dev-ui-client/assets/index-B5wNJx8a.js +77 -0
  148. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  149. package/dist/dev-ui-client/assets/index-DpOZNNnF.css +1 -0
  150. package/dist/dev-ui-client/index.html +13 -0
  151. package/dist/discover.d.ts +15 -0
  152. package/dist/discover.d.ts.map +1 -0
  153. package/dist/discover.js +29 -0
  154. package/dist/discover.js.map +1 -0
  155. package/dist/factory.d.ts.map +1 -1
  156. package/dist/factory.js +25 -12
  157. package/dist/factory.js.map +1 -1
  158. package/dist/index.d.ts +5 -1
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +4 -0
  161. package/dist/index.js.map +1 -1
  162. package/dist/node.d.ts +1 -0
  163. package/dist/node.d.ts.map +1 -1
  164. package/dist/node.js +1 -0
  165. package/dist/node.js.map +1 -1
  166. package/dist/nodes/agent/executor.d.ts +2 -0
  167. package/dist/nodes/agent/executor.d.ts.map +1 -1
  168. package/dist/nodes/agent/executor.js +11 -1
  169. package/dist/nodes/agent/executor.js.map +1 -1
  170. package/dist/types.d.ts +19 -1
  171. package/dist/types.d.ts.map +1 -1
  172. package/dist/workflow.d.ts +22 -0
  173. package/dist/workflow.d.ts.map +1 -1
  174. package/dist/workflow.js +90 -2
  175. package/dist/workflow.js.map +1 -1
  176. package/package.json +18 -3
  177. package/templates/app/dbos-config.yaml +6 -0
  178. package/templates/app/package.json +3 -1
  179. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  180. package/templates/app/src/instrumentation.ts +6 -0
  181. package/templates/app/src/lib/pflow.ts +29 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=discover.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/discover.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ // packages/core/src/__tests__/discover.integration.test.ts
2
+ // Integration tests for the discover() auto-discovery API
3
+ // Uses real project directories to test discovery behavior
4
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
5
+ import { mkdtemp, rm, mkdir, writeFile, symlink } from "node:fs/promises";
6
+ import { tmpdir } from "node:os";
7
+ import { join, resolve } from "node:path";
8
+ import { discover } from "../discover.js";
9
+ import { discoverAgents } from "../cli/discovery.js";
10
+ // Absolute path to the core package root (packages/core)
11
+ const CORE_PKG = resolve(__dirname, "..", "..");
12
+ let tempDir;
13
+ let emptyDir;
14
+ beforeAll(async () => {
15
+ tempDir = await mkdtemp(join(tmpdir(), "0pflow-discover-test-"));
16
+ emptyDir = await mkdtemp(join(tmpdir(), "0pflow-discover-empty-"));
17
+ // Create directory structure matching a 0pflow app
18
+ await mkdir(join(tempDir, "generated", "workflows"), { recursive: true });
19
+ await mkdir(join(tempDir, "src", "nodes"), { recursive: true });
20
+ await mkdir(join(tempDir, "agents"), { recursive: true });
21
+ // Symlink node_modules/0pflow → core package root (equivalent to npm link)
22
+ // This lets jiti resolve `import from "0pflow"` in the temp dir
23
+ await mkdir(join(tempDir, "node_modules"), { recursive: true });
24
+ await symlink(CORE_PKG, join(tempDir, "node_modules", "0pflow"), "dir");
25
+ // Also symlink zod so test fixtures can import it
26
+ const zodPkg = resolve(CORE_PKG, "node_modules", "zod");
27
+ await symlink(zodPkg, join(tempDir, "node_modules", "zod"), "dir");
28
+ // Write a test workflow using the 0pflow package import
29
+ await writeFile(join(tempDir, "generated", "workflows", "test-workflow.ts"), `
30
+ import { z } from "zod";
31
+ import { Workflow } from "0pflow";
32
+
33
+ export const testWorkflow = Workflow.create({
34
+ name: "test-workflow",
35
+ description: "A test workflow for discovery",
36
+ version: 1,
37
+ inputSchema: z.object({ message: z.string() }),
38
+ outputSchema: z.object({ result: z.string() }),
39
+ run: async (ctx, inputs) => {
40
+ return { result: "processed: " + inputs.message };
41
+ },
42
+ });
43
+ `);
44
+ // Write a test node using the 0pflow package import
45
+ await writeFile(join(tempDir, "src", "nodes", "test-node.ts"), `
46
+ import { z } from "zod";
47
+ import { Node } from "0pflow";
48
+
49
+ export const testNode = Node.create({
50
+ name: "test-node",
51
+ description: "A test node for discovery",
52
+ inputSchema: z.object({ value: z.string() }),
53
+ outputSchema: z.object({ transformed: z.string() }),
54
+ execute: async (_ctx, inputs) => {
55
+ return { transformed: inputs.value.toUpperCase() };
56
+ },
57
+ });
58
+ `);
59
+ });
60
+ afterAll(async () => {
61
+ await rm(tempDir, { recursive: true, force: true });
62
+ await rm(emptyDir, { recursive: true, force: true });
63
+ });
64
+ describe("discover()", () => {
65
+ it("discovers workflows from generated/workflows/", async () => {
66
+ const result = await discover(tempDir);
67
+ expect(result.workflows).toHaveProperty("test-workflow");
68
+ expect(result.workflows["test-workflow"].type).toBe("workflow");
69
+ expect(result.workflows["test-workflow"].name).toBe("test-workflow");
70
+ });
71
+ it("discovers nodes from src/nodes/", async () => {
72
+ const result = await discover(tempDir);
73
+ expect(result.nodes).toHaveProperty("test-node");
74
+ expect(result.nodes["test-node"].type).toBe("node");
75
+ expect(result.nodes["test-node"].name).toBe("test-node");
76
+ });
77
+ it("returns empty results for agents/ when no agents exist", async () => {
78
+ const result = await discover(tempDir);
79
+ expect(result.agents).toEqual({});
80
+ });
81
+ it("collects no warnings for valid files", async () => {
82
+ const result = await discover(tempDir);
83
+ expect(result.warnings).toEqual([]);
84
+ });
85
+ it("returns empty results for empty project directory", async () => {
86
+ const result = await discover(emptyDir);
87
+ expect(result.workflows).toEqual({});
88
+ expect(result.agents).toEqual({});
89
+ expect(result.nodes).toEqual({});
90
+ expect(result.warnings).toEqual([]);
91
+ });
92
+ it("returns result shape compatible with create0pflow", async () => {
93
+ const result = await discover(tempDir);
94
+ // Verify the shape has the keys create0pflow expects
95
+ expect(result).toHaveProperty("workflows");
96
+ expect(result).toHaveProperty("agents");
97
+ expect(result).toHaveProperty("nodes");
98
+ expect(typeof result.workflows).toBe("object");
99
+ expect(typeof result.agents).toBe("object");
100
+ expect(typeof result.nodes).toBe("object");
101
+ });
102
+ it("skips index files in nodes directory", async () => {
103
+ await writeFile(join(tempDir, "src", "nodes", "index.ts"), `export { testNode } from "./test-node.js";`);
104
+ const result = await discover(tempDir);
105
+ const nodeNames = Object.keys(result.nodes);
106
+ expect(nodeNames).toEqual(["test-node"]);
107
+ await rm(join(tempDir, "src", "nodes", "index.ts"));
108
+ });
109
+ it("reports warnings for files that fail to load", async () => {
110
+ await writeFile(join(tempDir, "generated", "workflows", "bad-workflow.ts"), `throw new Error("intentional load failure");`);
111
+ const result = await discover(tempDir);
112
+ expect(result.warnings.length).toBeGreaterThan(0);
113
+ expect(result.warnings.some((w) => w.includes("bad-workflow"))).toBe(true);
114
+ // Valid workflow should still be discovered
115
+ expect(result.workflows).toHaveProperty("test-workflow");
116
+ await rm(join(tempDir, "generated", "workflows", "bad-workflow.ts"));
117
+ });
118
+ });
119
+ describe("discoverAgents()", () => {
120
+ it("returns empty when agents directory does not exist", async () => {
121
+ const result = await discoverAgents(emptyDir);
122
+ expect(result.agents).toEqual({});
123
+ expect(result.warnings).toEqual([]);
124
+ });
125
+ it("returns empty when agents directory is empty", async () => {
126
+ const result = await discoverAgents(tempDir);
127
+ expect(result.agents).toEqual({});
128
+ expect(result.warnings).toEqual([]);
129
+ });
130
+ it("skips index files in agents directory", async () => {
131
+ await writeFile(join(tempDir, "agents", "index.ts"), `export {};`);
132
+ const result = await discoverAgents(tempDir);
133
+ expect(result.agents).toEqual({});
134
+ await rm(join(tempDir, "agents", "index.ts"));
135
+ });
136
+ });
137
+ //# sourceMappingURL=discover.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/discover.integration.test.ts"],"names":[],"mappings":"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"}
package/dist/agent.d.ts CHANGED
@@ -3,6 +3,8 @@ import type { Executable } from "./types.js";
3
3
  import type { AgentTools } from "./nodes/agent/executor.js";
4
4
  import type { ModelConfig } from "./nodes/agent/model-config.js";
5
5
  import type { NodeRegistry } from "./nodes/registry.js";
6
+ import type { IntegrationProvider } from "./connections/integration-provider.js";
7
+ import type pg from "pg";
6
8
  export type { AgentTool, AgentTools } from "./nodes/agent/executor.js";
7
9
  /**
8
10
  * Definition for creating an agent
@@ -16,6 +18,8 @@ export interface AgentDefinition<TInput, TOutput> {
16
18
  tools?: AgentTools;
17
19
  /** Path to agent spec markdown file (for system prompt) */
18
20
  specPath: string;
21
+ /** Integrations this agent needs (e.g. ["openai"] to fetch API key from Nango) */
22
+ integrations?: string[];
19
23
  }
20
24
  /**
21
25
  * Extended executable interface for agents
@@ -31,6 +35,8 @@ export interface AgentExecutable<TInput = unknown, TOutput = unknown> extends Ex
31
35
  interface AgentRuntimeConfig {
32
36
  nodeRegistry: NodeRegistry;
33
37
  modelConfig?: ModelConfig;
38
+ pool: pg.Pool | null;
39
+ integrationProvider: IntegrationProvider | null;
34
40
  }
35
41
  /**
36
42
  * Configure the agent runtime (called by factory)
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAGxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,OAAO;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,mDAAmD;IACnD,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,CAClE,SAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEtE;AA6BD;;GAEG;AACH,eAAO,MAAM,KAAK;WACT,MAAM,EAAE,OAAO,wBACR,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;CAoDpC,CAAC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAoD,MAAM,YAAY,CAAC;AAG/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,OAAO;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,mDAAmD;IACnD,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,CAClE,SAAQ,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACjD;AAQD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAEtE;AAyFD;;GAEG;AACH,eAAO,MAAM,KAAK;WACT,MAAM,EAAE,OAAO,wBACR,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3C,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;CAmEpC,CAAC"}
package/dist/agent.js CHANGED
@@ -1,25 +1,65 @@
1
1
  import { DBOS } from "@dbos-inc/dbos-sdk";
2
2
  import { parseAgentSpec } from "./nodes/agent/parser.js";
3
3
  import { executeAgent } from "./nodes/agent/executor.js";
4
- let agentRuntimeConfig = null;
4
+ import { resolveConnectionId } from "./connections/index.js";
5
+ const AGENT_CONFIG_KEY = Symbol.for("opflow.getAgentRuntimeConfig()");
6
+ function getAgentRuntimeConfig() {
7
+ return globalThis[AGENT_CONFIG_KEY] ?? null;
8
+ }
5
9
  /**
6
10
  * Configure the agent runtime (called by factory)
7
11
  * @internal
8
12
  */
9
13
  export function configureAgentRuntime(config) {
10
- agentRuntimeConfig = config;
14
+ globalThis[AGENT_CONFIG_KEY] = config;
11
15
  }
12
16
  /**
13
17
  * Create a WorkflowContext for agent execution that wraps tool calls in DBOS steps
18
+ *
19
+ * @param agentName - The agent's own name (used as workflowName for DBOS child workflow)
20
+ * @param parentWorkflowName - The parent workflow name (for connection resolution)
21
+ * @param parentNodeName - The agent's node name within the parent workflow (for connection resolution)
14
22
  */
15
- function createAgentContext() {
23
+ function createAgentContext(agentName, parentWorkflowName, parentNodeName) {
24
+ let _currentNodeName = "*";
25
+ let _currentIntegrations;
16
26
  const ctx = {
27
+ workflowName: agentName,
17
28
  run: async (executable, inputs) => {
18
29
  // Validate inputs against schema
19
30
  const validated = executable.inputSchema.parse(inputs);
31
+ // Track current node for connection resolution
32
+ _currentNodeName = executable.name;
33
+ _currentIntegrations = executable.integrations;
20
34
  // Wrap execution in DBOS step for durability
21
35
  return DBOS.runStep(async () => executable.execute(ctx, validated), { name: executable.name });
22
36
  },
37
+ getConnection: async (integrationId) => {
38
+ const runtimeConfig = getAgentRuntimeConfig();
39
+ if (!runtimeConfig?.pool || !runtimeConfig?.integrationProvider) {
40
+ throw new Error("Connection management not configured. Set NANGO_SECRET_KEY and DATABASE_URL.");
41
+ }
42
+ // Validate that the integration was declared on the current node
43
+ if (_currentIntegrations && !_currentIntegrations.includes(integrationId)) {
44
+ const declared = _currentIntegrations.map(i => `"${i}"`).join(", ");
45
+ throw new Error(`Integration "${integrationId}" is not declared on node "${_currentNodeName}". ` +
46
+ `Declared integrations: [${declared}]. ` +
47
+ `Add "${integrationId}" to the node's integrations array.`);
48
+ }
49
+ // If the agent was called from a parent workflow, use the parent's
50
+ // workflow name and the agent's node name within that workflow for
51
+ // connection resolution. This matches how connections are configured
52
+ // in the DB (workflow_name + node_name).
53
+ const resolveWorkflow = parentWorkflowName ?? agentName;
54
+ const resolveNode = parentNodeName ?? _currentNodeName;
55
+ const connectionId = await resolveConnectionId(runtimeConfig.pool, resolveWorkflow, resolveNode, integrationId);
56
+ if (!connectionId) {
57
+ throw new Error(`No connection configured for integration "${integrationId}" ` +
58
+ `(workflow="${resolveWorkflow}", node="${resolveNode}"). ` +
59
+ `Configure it in the Dev UI or set a global default.`);
60
+ }
61
+ return runtimeConfig.integrationProvider.fetchCredentials(integrationId, connectionId);
62
+ },
23
63
  log: (message, level = "info") => {
24
64
  DBOS.logger[level](message);
25
65
  },
@@ -32,12 +72,16 @@ function createAgentContext() {
32
72
  export const Agent = {
33
73
  create(definition) {
34
74
  const tools = definition.tools ?? {};
75
+ // Parent workflow context info, captured before DBOS child workflow starts
76
+ let _parentWorkflowName;
77
+ let _parentNodeName;
35
78
  // Create the DBOS-registered workflow function for this agent
36
79
  async function agentWorkflowImpl(inputs) {
37
- if (!agentRuntimeConfig) {
80
+ const runtimeConfig = getAgentRuntimeConfig();
81
+ if (!runtimeConfig) {
38
82
  throw new Error("Agent runtime not configured. Make sure to use create0pflow() before executing agents.");
39
83
  }
40
- const ctx = createAgentContext();
84
+ const ctx = createAgentContext(definition.name, _parentWorkflowName, _parentNodeName);
41
85
  // Parse the agent spec (for system prompt and model override)
42
86
  const spec = await parseAgentSpec(definition.specPath);
43
87
  // Convert inputs to a user message string
@@ -49,9 +93,10 @@ export const Agent = {
49
93
  spec,
50
94
  userMessage,
51
95
  tools,
52
- nodeRegistry: agentRuntimeConfig.nodeRegistry,
53
- modelConfig: agentRuntimeConfig.modelConfig,
96
+ nodeRegistry: runtimeConfig.nodeRegistry,
97
+ modelConfig: runtimeConfig.modelConfig,
54
98
  outputSchema: definition.outputSchema,
99
+ integrations: definition.integrations,
55
100
  });
56
101
  return result.output;
57
102
  }
@@ -67,8 +112,13 @@ export const Agent = {
67
112
  outputSchema: definition.outputSchema,
68
113
  specPath: definition.specPath,
69
114
  tools,
70
- // execute ignores the ctx param and uses DBOS context instead
71
- execute: (_ctx, inputs) => durableAgentWorkflow(inputs),
115
+ integrations: definition.integrations,
116
+ // Capture parent workflow context for connection resolution, then run as DBOS child workflow
117
+ execute: (parentCtx, inputs) => {
118
+ _parentWorkflowName = parentCtx.workflowName;
119
+ _parentNodeName = definition.name;
120
+ return durableAgentWorkflow(inputs);
121
+ },
72
122
  };
73
123
  },
74
124
  };
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAuCzD,IAAI,kBAAkB,GAA8B,IAAI,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC9D,kBAAkB,GAAG,MAAM,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,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,6CAA6C;YAC7C,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAC9C,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,GAAG,EAAE,CAAC,OAAe,EAAE,QAAkB,MAAM,EAAE,EAAE;YACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,CACJ,UAA4C;QAE5C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QAErC,8DAA8D;QAC9D,KAAK,UAAU,iBAAiB,CAAC,MAAc;YAC7C,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,kBAAkB,EAAE,CAAC;YAEjC,8DAA8D;YAC9D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEvD,0CAA0C;YAC1C,gEAAgE;YAChE,MAAM,WAAW,GACf,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAExE,+CAA+C;YAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,GAAG;gBACH,IAAI;gBACJ,WAAW;gBACX,KAAK;gBACL,YAAY,EAAE,kBAAkB,CAAC,YAAY;gBAC7C,WAAW,EAAE,kBAAkB,CAAC,WAAW;gBAC3C,YAAY,EAAE,UAAU,CAAC,YAAY;aACtC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAiB,CAAC;QAClC,CAAC;QAED,mFAAmF;QACnF,MAAM,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE;YACpE,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK;YACL,8DAA8D;YAC9D,OAAO,EAAE,CAAC,IAAqB,EAAE,MAAc,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC;SACjF,CAAC;IACJ,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA0C7D,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAEtE,SAAS,qBAAqB;IAC5B,OAAQ,UAAwD,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC7D,UAAwD,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC;AACvF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,SAAiB,EACjB,kBAA2B,EAC3B,cAAuB;IAEvB,IAAI,gBAAgB,GAAG,GAAG,CAAC;IAC3B,IAAI,oBAA0C,CAAC;IAE/C,MAAM,GAAG,GAAoB;QAC3B,YAAY,EAAE,SAAS;QAEvB,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,+CAA+C;YAC/C,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC;YACnC,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC;YAE/C,6CAA6C;YAC7C,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAC9C,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,aAAa,EAAE,KAAK,EAAE,aAAqB,EAAkC,EAAE;YAC7E,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,CAAC;gBAChE,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;YACJ,CAAC;YAED,iEAAiE;YACjE,IAAI,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpE,MAAM,IAAI,KAAK,CACb,gBAAgB,aAAa,8BAA8B,gBAAgB,KAAK;oBAChF,2BAA2B,QAAQ,KAAK;oBACxC,QAAQ,aAAa,qCAAqC,CAC3D,CAAC;YACJ,CAAC;YAED,mEAAmE;YACnE,mEAAmE;YACnE,qEAAqE;YACrE,yCAAyC;YACzC,MAAM,eAAe,GAAG,kBAAkB,IAAI,SAAS,CAAC;YACxD,MAAM,WAAW,GAAG,cAAc,IAAI,gBAAgB,CAAC;YAEvD,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,aAAa,CAAC,IAAI,EAClB,eAAe,EACf,WAAW,EACX,aAAa,CACd,CAAC;YAEF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,6CAA6C,aAAa,IAAI;oBAC9D,cAAc,eAAe,YAAY,WAAW,MAAM;oBAC1D,qDAAqD,CACtD,CAAC;YACJ,CAAC;YAED,OAAO,aAAa,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACzF,CAAC;QAED,GAAG,EAAE,CAAC,OAAe,EAAE,QAAkB,MAAM,EAAE,EAAE;YACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,CACJ,UAA4C;QAE5C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QAErC,2EAA2E;QAC3E,IAAI,mBAAuC,CAAC;QAC5C,IAAI,eAAmC,CAAC;QAExC,8DAA8D;QAC9D,KAAK,UAAU,iBAAiB,CAAC,MAAc;YAC7C,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,kBAAkB,CAC5B,UAAU,CAAC,IAAI,EACf,mBAAmB,EACnB,eAAe,CAChB,CAAC;YAEF,8DAA8D;YAC9D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEvD,0CAA0C;YAC1C,gEAAgE;YAChE,MAAM,WAAW,GACf,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAExE,+CAA+C;YAC/C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,GAAG;gBACH,IAAI;gBACJ,WAAW;gBACX,KAAK;gBACL,YAAY,EAAE,aAAa,CAAC,YAAY;gBACxC,WAAW,EAAE,aAAa,CAAC,WAAW;gBACtC,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,YAAY,EAAE,UAAU,CAAC,YAAY;aACtC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,MAAiB,CAAC;QAClC,CAAC;QAED,mFAAmF;QACnF,MAAM,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE;YACpE,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK;YACL,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,6FAA6F;YAC7F,OAAO,EAAE,CAAC,SAA0B,EAAE,MAAc,EAAE,EAAE;gBACtD,mBAAmB,GAAG,SAAS,CAAC,YAAY,CAAC;gBAC7C,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC;gBAClC,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -8,6 +8,10 @@ export interface NodeDiscoveryResult {
8
8
  nodes: Record<string, AnyExecutable>;
9
9
  warnings: string[];
10
10
  }
11
+ export interface AgentDiscoveryResult {
12
+ agents: Record<string, AnyExecutable>;
13
+ warnings: string[];
14
+ }
11
15
  /**
12
16
  * Discover and load workflow executables from generated/workflows/ directory
13
17
  * Uses jiti to load TypeScript files directly without compilation
@@ -20,5 +24,11 @@ export declare function discoverWorkflows(projectDir: string): Promise<Discovery
20
24
  * Returns nodes indexed by name and any warnings
21
25
  */
22
26
  export declare function discoverNodes(projectDir: string): Promise<NodeDiscoveryResult>;
27
+ /**
28
+ * Discover and load agent executables from agents/ directory
29
+ * Uses jiti to load TypeScript files directly without compilation
30
+ * Returns agents indexed by name and any warnings
31
+ */
32
+ export declare function discoverAgents(projectDir: string): Promise<AgentDiscoveryResult>;
23
33
  export {};
24
34
  //# sourceMappingURL=discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/cli/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,KAAK,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAcD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAgC9B"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/cli/discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,KAAK,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CA8B1B;AAcD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAgC9B;AAcD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAgC/B"}
@@ -85,4 +85,46 @@ export async function discoverNodes(projectDir) {
85
85
  }
86
86
  return { nodes, warnings };
87
87
  }
88
+ /**
89
+ * Check if a value is an agent executable
90
+ */
91
+ function isAgent(value) {
92
+ return (value !== null &&
93
+ typeof value === "object" &&
94
+ "type" in value &&
95
+ value.type === "agent");
96
+ }
97
+ /**
98
+ * Discover and load agent executables from agents/ directory
99
+ * Uses jiti to load TypeScript files directly without compilation
100
+ * Returns agents indexed by name and any warnings
101
+ */
102
+ export async function discoverAgents(projectDir) {
103
+ const agentsDir = path.join(projectDir, "agents");
104
+ const agents = {};
105
+ const warnings = [];
106
+ if (!fs.existsSync(agentsDir)) {
107
+ return { agents, warnings };
108
+ }
109
+ const files = fs.readdirSync(agentsDir).filter(f => f.endsWith(".ts") || f.endsWith(".js"));
110
+ for (const file of files) {
111
+ // Skip index files
112
+ if (file === "index.ts" || file === "index.js")
113
+ continue;
114
+ const filePath = path.join(agentsDir, file);
115
+ try {
116
+ const module = await jiti.import(filePath);
117
+ // Find agent exports in the module
118
+ for (const value of Object.values(module)) {
119
+ if (isAgent(value)) {
120
+ agents[value.name] = value;
121
+ }
122
+ }
123
+ }
124
+ catch (err) {
125
+ warnings.push(`Failed to load agent ${file}: ${err}`);
126
+ }
127
+ }
128
+ return { agents, warnings };
129
+ }
88
130
  //# sourceMappingURL=discovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/cli/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/cli/discovery.ts"],"names":[],"mappings":"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"}
package/dist/cli/env.js CHANGED
@@ -28,7 +28,7 @@ export function findEnvFile(startDir) {
28
28
  * Throws if DATABASE_URL is not set (required for 0pflow)
29
29
  */
30
30
  export function loadEnv(envPath) {
31
- const result = dotenv.config({ path: envPath });
31
+ const result = dotenv.config({ path: envPath, quiet: true });
32
32
  if (result.error) {
33
33
  throw new Error(`Failed to load .env: ${result.error.message}`);
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAElC,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,kCAAkC;YAClC,6CAA6C;YAC7C,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,qCAAqC;YACrC,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAElC,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACb,kCAAkC;YAClC,6CAA6C;YAC7C,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,qCAAqC;YACrC,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAmBA,eAAO,IAAI,OAAO,QAAU,CAAC;AAQ7B;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAqBA,eAAO,IAAI,OAAO,QAAU,CAAC;AAQ7B;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
package/dist/cli/index.js CHANGED
@@ -3,8 +3,10 @@ import { Command } from "commander";
3
3
  import pc from "picocolors";
4
4
  import Table from "cli-table3";
5
5
  import { readFileSync } from "node:fs";
6
+ import { randomUUID } from "node:crypto";
6
7
  import { dirname, resolve } from "node:path";
7
8
  import { fileURLToPath } from "node:url";
9
+ import { DBOS } from "@dbos-inc/dbos-sdk";
8
10
  import { create0pflow } from "../index.js";
9
11
  import { discoverWorkflows, discoverNodes } from "./discovery.js";
10
12
  import { resolveEnv } from "./env.js";
@@ -63,6 +65,16 @@ function formatOutput(output) {
63
65
  return String(output);
64
66
  }
65
67
  }
68
+ /**
69
+ * Redirect stdout to stderr so dependency noise (DBOS logger, dotenv, etc.)
70
+ * doesn't pollute JSON output. Returns a function that writes directly to
71
+ * the real stdout for the final JSON result.
72
+ */
73
+ function captureStdout() {
74
+ const originalWrite = process.stdout.write.bind(process.stdout);
75
+ process.stdout.write = process.stderr.write.bind(process.stderr);
76
+ return (data) => { originalWrite(data + "\n"); };
77
+ }
66
78
  const program = new Command();
67
79
  program
68
80
  .name("0pflow")
@@ -117,6 +129,7 @@ workflow
117
129
  .option("-i, --input <json>", "JSON input for the workflow", "{}")
118
130
  .option("--json", "Output result as JSON")
119
131
  .action(async (workflowName, options) => {
132
+ const writeJson = options.json ? captureStdout() : null;
120
133
  try {
121
134
  // Load environment (all .env vars into process.env)
122
135
  resolveEnv();
@@ -171,11 +184,13 @@ workflow
171
184
  nodes,
172
185
  });
173
186
  try {
174
- const result = await pflow.triggerWorkflow(wf.name, inputs);
175
- if (options.json) {
176
- console.log(JSON.stringify(result, null, 2));
187
+ const runId = randomUUID();
188
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerWorkflow(wf.name, inputs));
189
+ if (writeJson) {
190
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
177
191
  }
178
192
  else {
193
+ console.log(pc.dim(`Run ID: ${runId}`));
179
194
  console.log(pc.green("\nResult:"));
180
195
  console.log(JSON.stringify(result, null, 2));
181
196
  }
@@ -185,7 +200,13 @@ workflow
185
200
  }
186
201
  }
187
202
  catch (err) {
188
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
203
+ const msg = err instanceof Error ? err.message : String(err);
204
+ if (writeJson) {
205
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
206
+ }
207
+ else {
208
+ console.error(pc.red(`Error: ${msg}`));
209
+ }
189
210
  process.exit(1);
190
211
  }
191
212
  });
@@ -237,8 +258,10 @@ node
237
258
  .command("run <name>")
238
259
  .description("Run a node (wrapped in workflow for durability)")
239
260
  .option("-i, --input <json>", "JSON input for the node", "{}")
261
+ .option("-w, --workflow <name>", "Workflow name for connection resolution")
240
262
  .option("--json", "Output result as JSON")
241
263
  .action(async (nodeName, options) => {
264
+ const writeJson = options.json ? captureStdout() : null;
242
265
  try {
243
266
  // Load environment
244
267
  resolveEnv();
@@ -287,11 +310,13 @@ node
287
310
  nodes,
288
311
  });
289
312
  try {
290
- const result = await pflow.triggerNode(nodeName, inputs);
291
- if (options.json) {
292
- console.log(JSON.stringify(result, null, 2));
313
+ const runId = randomUUID();
314
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerNode(nodeName, inputs, { workflowName: options.workflow }));
315
+ if (writeJson) {
316
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
293
317
  }
294
318
  else {
319
+ console.log(pc.dim(`Run ID: ${runId}`));
295
320
  console.log(pc.green("\nResult:"));
296
321
  console.log(JSON.stringify(result, null, 2));
297
322
  }
@@ -301,7 +326,13 @@ node
301
326
  }
302
327
  }
303
328
  catch (err) {
304
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
329
+ const msg = err instanceof Error ? err.message : String(err);
330
+ if (writeJson) {
331
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
332
+ }
333
+ else {
334
+ console.error(pc.red(`Error: ${msg}`));
335
+ }
305
336
  process.exit(1);
306
337
  }
307
338
  });
@@ -417,6 +448,29 @@ program
417
448
  process.exit(1);
418
449
  }
419
450
  });
451
+ // ============ Dev UI command ============
452
+ program
453
+ .command("dev")
454
+ .description("Start the Dev UI (visual workflow DAG viewer)")
455
+ .option("-p, --port <number>", "Port to serve on", "4173")
456
+ .option("--host", "Expose to network")
457
+ .action(async (options) => {
458
+ // Load .env for DATABASE_URL and NANGO_SECRET_KEY
459
+ try {
460
+ resolveEnv();
461
+ }
462
+ catch {
463
+ // Dev UI can work without env (connections API just won't be available)
464
+ }
465
+ const { startDevServer } = await import("../dev-ui/index.js");
466
+ await startDevServer({
467
+ projectRoot: process.cwd(),
468
+ port: parseInt(options.port, 10),
469
+ host: options.host,
470
+ databaseUrl: process.env.DATABASE_URL,
471
+ nangoSecretKey: process.env.NANGO_SECRET_KEY,
472
+ });
473
+ });
420
474
  // ============ MCP commands ============
421
475
  const mcp = program.command("mcp").description("MCP server commands");
422
476
  mcp
@@ -441,5 +495,44 @@ program
441
495
  .action(async (options) => {
442
496
  await runUninstall({ verbose: options.verbose });
443
497
  });
498
+ // ============ Auth commands ============
499
+ program
500
+ .command("login")
501
+ .description("Authenticate with 0pflow cloud (opens browser)")
502
+ .action(async () => {
503
+ const { authenticate, isAuthenticated, AuthRequiredError } = await import("../connections/cloud-auth.js");
504
+ if (isAuthenticated()) {
505
+ console.log(pc.green("Already logged in."));
506
+ return;
507
+ }
508
+ try {
509
+ console.log(pc.dim("Opening browser for authentication..."));
510
+ await authenticate();
511
+ console.log(pc.green("Logged in successfully."));
512
+ }
513
+ catch (err) {
514
+ if (err instanceof AuthRequiredError) {
515
+ console.log(`\n${pc.yellow("Waiting for browser approval...")}\n\n` +
516
+ `If the browser didn't open, visit:\n${pc.cyan(err.authUrl)}\n\n` +
517
+ `Then run ${pc.bold("0pflow login")} again.`);
518
+ }
519
+ else {
520
+ console.error(pc.red(`Login failed: ${err instanceof Error ? err.message : err}`));
521
+ process.exit(1);
522
+ }
523
+ }
524
+ });
525
+ program
526
+ .command("logout")
527
+ .description("Remove stored 0pflow cloud credentials")
528
+ .action(async () => {
529
+ const { logout, isAuthenticated } = await import("../connections/cloud-auth.js");
530
+ if (!isAuthenticated()) {
531
+ console.log(pc.dim("Not logged in."));
532
+ return;
533
+ }
534
+ logout();
535
+ console.log(pc.green("Logged out. Credentials removed from ~/.0pflow/credentials"));
536
+ });
444
537
  program.parse();
445
538
  //# sourceMappingURL=index.js.map