0pflow 0.1.0-dev.d3a9dc9 → 0.1.0-dev.d7ec3ec

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 (205) hide show
  1. package/dist/__tests__/discover.integration.test.d.ts +2 -0
  2. package/dist/__tests__/discover.integration.test.d.ts.map +1 -0
  3. package/dist/__tests__/discover.integration.test.js +137 -0
  4. package/dist/__tests__/discover.integration.test.js.map +1 -0
  5. package/dist/__tests__/factory.test.js +13 -0
  6. package/dist/__tests__/factory.test.js.map +1 -1
  7. package/dist/__tests__/integration.e2e.test.js +2 -1
  8. package/dist/__tests__/integration.e2e.test.js.map +1 -1
  9. package/dist/__tests__/integration.test.js +87 -82
  10. package/dist/__tests__/integration.test.js.map +1 -1
  11. package/dist/agent.d.ts +7 -0
  12. package/dist/agent.d.ts.map +1 -1
  13. package/dist/agent.js +75 -10
  14. package/dist/agent.js.map +1 -1
  15. package/dist/cli/app.d.ts +6 -0
  16. package/dist/cli/app.d.ts.map +1 -1
  17. package/dist/cli/app.js +27 -0
  18. package/dist/cli/app.js.map +1 -1
  19. package/dist/cli/discovery.d.ts +10 -0
  20. package/dist/cli/discovery.d.ts.map +1 -1
  21. package/dist/cli/discovery.js +42 -0
  22. package/dist/cli/discovery.js.map +1 -1
  23. package/dist/cli/env.js +1 -1
  24. package/dist/cli/env.js.map +1 -1
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +133 -11
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/install.d.ts.map +1 -1
  29. package/dist/cli/install.js +43 -13
  30. package/dist/cli/install.js.map +1 -1
  31. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  32. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  33. package/dist/cli/mcp/lib/scaffolding.js +219 -0
  34. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  35. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  36. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  37. package/dist/cli/mcp/tools/createApp.js +12 -56
  38. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  39. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  40. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  41. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  42. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  43. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  44. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  45. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  46. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  47. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  48. package/dist/cli/mcp/tools/getRun.js +80 -0
  49. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  50. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  51. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  52. package/dist/cli/mcp/tools/getTrace.js +104 -0
  53. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  54. package/dist/cli/mcp/tools/index.d.ts +94 -1
  55. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  56. package/dist/cli/mcp/tools/index.js +16 -0
  57. package/dist/cli/mcp/tools/index.js.map +1 -1
  58. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  59. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  60. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  61. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  62. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  63. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  64. package/dist/cli/mcp/tools/listRuns.js +72 -0
  65. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  66. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  67. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  68. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  69. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  70. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  71. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  72. package/dist/cli/mcp/tools/runNode.js +74 -0
  73. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  74. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  75. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  76. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  77. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  78. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  79. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  80. package/dist/cli/mcp/tools/setupAppSchema.js +11 -132
  81. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  82. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  83. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  84. package/dist/cli/mcp/tools/utils.js +28 -0
  85. package/dist/cli/mcp/tools/utils.js.map +1 -0
  86. package/dist/cli/run.d.ts +2 -0
  87. package/dist/cli/run.d.ts.map +1 -0
  88. package/dist/cli/run.js +545 -0
  89. package/dist/cli/run.js.map +1 -0
  90. package/dist/cli/trace.d.ts +5 -0
  91. package/dist/cli/trace.d.ts.map +1 -1
  92. package/dist/cli/trace.js +1 -1
  93. package/dist/cli/trace.js.map +1 -1
  94. package/dist/connections/cloud-auth.d.ts +46 -0
  95. package/dist/connections/cloud-auth.d.ts.map +1 -0
  96. package/dist/connections/cloud-auth.js +243 -0
  97. package/dist/connections/cloud-auth.js.map +1 -0
  98. package/dist/connections/cloud-client.d.ts +25 -0
  99. package/dist/connections/cloud-client.d.ts.map +1 -0
  100. package/dist/connections/cloud-client.js +59 -0
  101. package/dist/connections/cloud-client.js.map +1 -0
  102. package/dist/connections/cloud-integration-provider.d.ts +21 -0
  103. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  104. package/dist/connections/cloud-integration-provider.js +26 -0
  105. package/dist/connections/cloud-integration-provider.js.map +1 -0
  106. package/dist/connections/index.d.ts +11 -0
  107. package/dist/connections/index.d.ts.map +1 -0
  108. package/dist/connections/index.js +9 -0
  109. package/dist/connections/index.js.map +1 -0
  110. package/dist/connections/integration-provider.d.ts +38 -0
  111. package/dist/connections/integration-provider.d.ts.map +1 -0
  112. package/dist/connections/integration-provider.js +20 -0
  113. package/dist/connections/integration-provider.js.map +1 -0
  114. package/dist/connections/local-integration-provider.d.ts +28 -0
  115. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  116. package/dist/connections/local-integration-provider.js +54 -0
  117. package/dist/connections/local-integration-provider.js.map +1 -0
  118. package/dist/connections/nango-client.d.ts +14 -0
  119. package/dist/connections/nango-client.d.ts.map +1 -0
  120. package/dist/connections/nango-client.js +50 -0
  121. package/dist/connections/nango-client.js.map +1 -0
  122. package/dist/connections/resolver.d.ts +26 -0
  123. package/dist/connections/resolver.d.ts.map +1 -0
  124. package/dist/connections/resolver.js +48 -0
  125. package/dist/connections/resolver.js.map +1 -0
  126. package/dist/connections/schema.d.ts +8 -0
  127. package/dist/connections/schema.d.ts.map +1 -0
  128. package/dist/connections/schema.js +31 -0
  129. package/dist/connections/schema.js.map +1 -0
  130. package/dist/context.d.ts.map +1 -1
  131. package/dist/context.js +4 -0
  132. package/dist/context.js.map +1 -1
  133. package/dist/dev-ui/api.d.ts +16 -0
  134. package/dist/dev-ui/api.d.ts.map +1 -0
  135. package/dist/dev-ui/api.js +237 -0
  136. package/dist/dev-ui/api.js.map +1 -0
  137. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  138. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  139. package/dist/dev-ui/dag/extractor.js +716 -0
  140. package/dist/dev-ui/dag/extractor.js.map +1 -0
  141. package/dist/dev-ui/dag/types.d.ts +42 -0
  142. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  143. package/dist/dev-ui/dag/types.js +2 -0
  144. package/dist/dev-ui/dag/types.js.map +1 -0
  145. package/dist/dev-ui/dev-server.d.ts +18 -0
  146. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  147. package/dist/dev-ui/dev-server.js +252 -0
  148. package/dist/dev-ui/dev-server.js.map +1 -0
  149. package/dist/dev-ui/index.d.ts +3 -0
  150. package/dist/dev-ui/index.d.ts.map +1 -0
  151. package/dist/dev-ui/index.js +2 -0
  152. package/dist/dev-ui/index.js.map +1 -0
  153. package/dist/dev-ui/pty.d.ts +16 -0
  154. package/dist/dev-ui/pty.d.ts.map +1 -0
  155. package/dist/dev-ui/pty.js +87 -0
  156. package/dist/dev-ui/pty.js.map +1 -0
  157. package/dist/dev-ui/watcher.d.ts +12 -0
  158. package/dist/dev-ui/watcher.d.ts.map +1 -0
  159. package/dist/dev-ui/watcher.js +162 -0
  160. package/dist/dev-ui/watcher.js.map +1 -0
  161. package/dist/dev-ui/ws.d.ts +52 -0
  162. package/dist/dev-ui/ws.d.ts.map +1 -0
  163. package/dist/dev-ui/ws.js +32 -0
  164. package/dist/dev-ui/ws.js.map +1 -0
  165. package/dist/dev-ui-client/assets/index-C-LxzUII.css +32 -0
  166. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  167. package/dist/dev-ui-client/assets/index-aAIwXl4O.js +127 -0
  168. package/dist/dev-ui-client/index.html +13 -0
  169. package/dist/discover.d.ts +15 -0
  170. package/dist/discover.d.ts.map +1 -0
  171. package/dist/discover.js +32 -0
  172. package/dist/discover.js.map +1 -0
  173. package/dist/factory.d.ts.map +1 -1
  174. package/dist/factory.js +37 -13
  175. package/dist/factory.js.map +1 -1
  176. package/dist/index.d.ts +6 -1
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +6 -0
  179. package/dist/index.js.map +1 -1
  180. package/dist/node.d.ts +1 -0
  181. package/dist/node.d.ts.map +1 -1
  182. package/dist/node.js +1 -0
  183. package/dist/node.js.map +1 -1
  184. package/dist/nodes/agent/executor.d.ts +2 -0
  185. package/dist/nodes/agent/executor.d.ts.map +1 -1
  186. package/dist/nodes/agent/executor.js +11 -1
  187. package/dist/nodes/agent/executor.js.map +1 -1
  188. package/dist/registry-gen.d.ts +6 -0
  189. package/dist/registry-gen.d.ts.map +1 -0
  190. package/dist/registry-gen.js +126 -0
  191. package/dist/registry-gen.js.map +1 -0
  192. package/dist/types.d.ts +21 -3
  193. package/dist/types.d.ts.map +1 -1
  194. package/dist/workflow.d.ts +22 -0
  195. package/dist/workflow.d.ts.map +1 -1
  196. package/dist/workflow.js +113 -3
  197. package/dist/workflow.js.map +1 -1
  198. package/package.json +24 -3
  199. package/templates/app/dbos-config.yaml +6 -0
  200. package/templates/app/generated/registry.ts +8 -0
  201. package/templates/app/next.config.js +3 -1
  202. package/templates/app/package.json +5 -0
  203. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  204. package/templates/app/src/instrumentation.ts +6 -0
  205. package/templates/app/src/lib/pflow.ts +28 -0
package/dist/agent.js CHANGED
@@ -1,43 +1,100 @@
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, runtimeConfig.appSchema);
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
  },
26
66
  };
27
67
  return ctx;
28
68
  }
69
+ // Global cache for agent executables to prevent duplicate DBOS registration
70
+ // when bundlers (Turbopack) re-evaluate the same module in multiple chunks.
71
+ const AGENT_CACHE_KEY = Symbol.for("opflow.agentCache");
72
+ function getAgentCache() {
73
+ const g = globalThis;
74
+ if (!g[AGENT_CACHE_KEY])
75
+ g[AGENT_CACHE_KEY] = new Map();
76
+ return g[AGENT_CACHE_KEY];
77
+ }
29
78
  /**
30
79
  * Factory for creating agent executables
31
80
  */
32
81
  export const Agent = {
33
82
  create(definition) {
83
+ // Return cached executable if already registered (bundler re-evaluation)
84
+ const cached = getAgentCache().get(definition.name);
85
+ if (cached)
86
+ return cached;
34
87
  const tools = definition.tools ?? {};
88
+ // Parent workflow context info, captured before DBOS child workflow starts
89
+ let _parentWorkflowName;
90
+ let _parentNodeName;
35
91
  // Create the DBOS-registered workflow function for this agent
36
92
  async function agentWorkflowImpl(inputs) {
37
- if (!agentRuntimeConfig) {
93
+ const runtimeConfig = getAgentRuntimeConfig();
94
+ if (!runtimeConfig) {
38
95
  throw new Error("Agent runtime not configured. Make sure to use create0pflow() before executing agents.");
39
96
  }
40
- const ctx = createAgentContext();
97
+ const ctx = createAgentContext(definition.name, _parentWorkflowName, _parentNodeName);
41
98
  // Parse the agent spec (for system prompt and model override)
42
99
  const spec = await parseAgentSpec(definition.specPath);
43
100
  // Convert inputs to a user message string
@@ -49,9 +106,10 @@ export const Agent = {
49
106
  spec,
50
107
  userMessage,
51
108
  tools,
52
- nodeRegistry: agentRuntimeConfig.nodeRegistry,
53
- modelConfig: agentRuntimeConfig.modelConfig,
109
+ nodeRegistry: runtimeConfig.nodeRegistry,
110
+ modelConfig: runtimeConfig.modelConfig,
54
111
  outputSchema: definition.outputSchema,
112
+ integrations: definition.integrations,
55
113
  });
56
114
  return result.output;
57
115
  }
@@ -59,7 +117,7 @@ export const Agent = {
59
117
  const durableAgentWorkflow = DBOS.registerWorkflow(agentWorkflowImpl, {
60
118
  name: definition.name,
61
119
  });
62
- return {
120
+ const executable = {
63
121
  name: definition.name,
64
122
  type: "agent",
65
123
  description: definition.description,
@@ -67,9 +125,16 @@ export const Agent = {
67
125
  outputSchema: definition.outputSchema,
68
126
  specPath: definition.specPath,
69
127
  tools,
70
- // execute ignores the ctx param and uses DBOS context instead
71
- execute: (_ctx, inputs) => durableAgentWorkflow(inputs),
128
+ integrations: definition.integrations,
129
+ // Capture parent workflow context for connection resolution, then run as DBOS child workflow
130
+ execute: (parentCtx, inputs) => {
131
+ _parentWorkflowName = parentCtx.workflowName;
132
+ _parentNodeName = definition.name;
133
+ return durableAgentWorkflow(inputs);
134
+ },
72
135
  };
136
+ getAgentCache().set(definition.name, executable);
137
+ return executable;
73
138
  },
74
139
  };
75
140
  //# sourceMappingURL=agent.js.map
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":"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"}
package/dist/cli/app.d.ts CHANGED
@@ -3,4 +3,10 @@
3
3
  * Returns undefined if not found
4
4
  */
5
5
  export declare function getAppName(): string | undefined;
6
+ /**
7
+ * Get the app schema name from DATABASE_SCHEMA in the project's .env file.
8
+ * This is the canonical source — written by setup_app_schema.
9
+ * @param projectRoot Directory containing the .env file (defaults to cwd)
10
+ */
11
+ export declare function getAppSchema(projectRoot?: string): string;
6
12
  //# sourceMappingURL=app.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAa/C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAa/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CA0BzD"}
package/dist/cli/app.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // packages/cli/src/app.ts
2
2
  import fs from "fs";
3
3
  import path from "path";
4
+ import * as dotenv from "dotenv";
4
5
  /**
5
6
  * Get the app name from package.json in cwd
6
7
  * Returns undefined if not found
@@ -18,4 +19,30 @@ export function getAppName() {
18
19
  return undefined;
19
20
  }
20
21
  }
22
+ /**
23
+ * Get the app schema name from DATABASE_SCHEMA in the project's .env file.
24
+ * This is the canonical source — written by setup_app_schema.
25
+ * @param projectRoot Directory containing the .env file (defaults to cwd)
26
+ */
27
+ export function getAppSchema(projectRoot) {
28
+ const envPath = path.join(projectRoot ?? process.cwd(), ".env");
29
+ if (!fs.existsSync(envPath)) {
30
+ throw new Error("DATABASE_SCHEMA not found in .env file. " +
31
+ "Run setup_app_schema to configure the database.");
32
+ }
33
+ try {
34
+ const env = dotenv.parse(fs.readFileSync(envPath, "utf-8"));
35
+ if (!env.DATABASE_SCHEMA) {
36
+ throw new Error("DATABASE_SCHEMA not found in .env file. " +
37
+ "Run setup_app_schema to configure the database.");
38
+ }
39
+ return env.DATABASE_SCHEMA;
40
+ }
41
+ catch (err) {
42
+ if (err instanceof Error && err.message.includes("DATABASE_SCHEMA"))
43
+ throw err;
44
+ throw new Error("DATABASE_SCHEMA not found in .env file. " +
45
+ "Run setup_app_schema to configure the database.");
46
+ }
47
+ }
21
48
  //# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAEzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAEhE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,0CAA0C;YAC1C,iDAAiD,CAClD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,0CAA0C;gBAC1C,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,eAAe,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAAE,MAAM,GAAG,CAAC;QAC/E,MAAM,IAAI,KAAK,CACb,0CAA0C;YAC1C,iDAAiD,CAClD,CAAC;IACJ,CAAC;AACH,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":";AAsBA,eAAO,IAAI,OAAO,QAAU,CAAC;AAQ7B;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
package/dist/cli/index.js CHANGED
@@ -3,16 +3,19 @@ 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";
11
13
  import { listRuns, getRun } from "./runs.js";
12
14
  import { getTrace, printTrace } from "./trace.js";
13
- import { getAppName } from "./app.js";
15
+ import { getAppSchema } from "./app.js";
14
16
  import { startMcpServer } from "./mcp/server.js";
15
17
  import { runInstall, runUninstall } from "./install.js";
18
+ import { runRun } from "./run.js";
16
19
  // Read version from package.json
17
20
  const __dirname = dirname(fileURLToPath(import.meta.url));
18
21
  const pkgJsonPath = resolve(__dirname, "../../package.json");
@@ -63,11 +66,37 @@ function formatOutput(output) {
63
66
  return String(output);
64
67
  }
65
68
  }
69
+ /**
70
+ * Redirect stdout to stderr so dependency noise (DBOS logger, dotenv, etc.)
71
+ * doesn't pollute JSON output. Returns a function that writes directly to
72
+ * the real stdout for the final JSON result.
73
+ */
74
+ function captureStdout() {
75
+ const originalWrite = process.stdout.write.bind(process.stdout);
76
+ process.stdout.write = process.stderr.write.bind(process.stderr);
77
+ return (data) => { originalWrite(data + "\n"); };
78
+ }
66
79
  const program = new Command();
67
80
  program
68
81
  .name("0pflow")
69
82
  .description("CLI for 0pflow workflow engine")
70
83
  .version(version);
84
+ // ============ Run command ============
85
+ program
86
+ .command("run")
87
+ .description("Create a new project or launch an existing one")
88
+ .action(async () => {
89
+ await runRun();
90
+ });
91
+ // ============ Build command ============
92
+ program
93
+ .command("build")
94
+ .description("Generate registry.ts with static imports (for Next.js / bundled builds)")
95
+ .action(async () => {
96
+ const { generateRegistry } = await import("../registry-gen.js");
97
+ const outPath = generateRegistry(process.cwd());
98
+ console.log(pc.green(`Registry generated: ${outPath}`));
99
+ });
71
100
  // ============ Workflow commands ============
72
101
  const workflow = program.command("workflow").description("Workflow commands");
73
102
  workflow
@@ -117,6 +146,7 @@ workflow
117
146
  .option("-i, --input <json>", "JSON input for the workflow", "{}")
118
147
  .option("--json", "Output result as JSON")
119
148
  .action(async (workflowName, options) => {
149
+ const writeJson = options.json ? captureStdout() : null;
120
150
  try {
121
151
  // Load environment (all .env vars into process.env)
122
152
  resolveEnv();
@@ -166,16 +196,18 @@ workflow
166
196
  }
167
197
  const pflow = await create0pflow({
168
198
  databaseUrl: process.env.DATABASE_URL,
169
- appName: getAppName(),
199
+ appName: getAppSchema(),
170
200
  workflows: workflowRegistry,
171
201
  nodes,
172
202
  });
173
203
  try {
174
- const result = await pflow.triggerWorkflow(wf.name, inputs);
175
- if (options.json) {
176
- console.log(JSON.stringify(result, null, 2));
204
+ const runId = randomUUID();
205
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerWorkflow(wf.name, inputs));
206
+ if (writeJson) {
207
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
177
208
  }
178
209
  else {
210
+ console.log(pc.dim(`Run ID: ${runId}`));
179
211
  console.log(pc.green("\nResult:"));
180
212
  console.log(JSON.stringify(result, null, 2));
181
213
  }
@@ -185,7 +217,13 @@ workflow
185
217
  }
186
218
  }
187
219
  catch (err) {
188
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
220
+ const msg = err instanceof Error ? err.message : String(err);
221
+ if (writeJson) {
222
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
223
+ }
224
+ else {
225
+ console.error(pc.red(`Error: ${msg}`));
226
+ }
189
227
  process.exit(1);
190
228
  }
191
229
  });
@@ -237,8 +275,10 @@ node
237
275
  .command("run <name>")
238
276
  .description("Run a node (wrapped in workflow for durability)")
239
277
  .option("-i, --input <json>", "JSON input for the node", "{}")
278
+ .option("-w, --workflow <name>", "Workflow name for connection resolution")
240
279
  .option("--json", "Output result as JSON")
241
280
  .action(async (nodeName, options) => {
281
+ const writeJson = options.json ? captureStdout() : null;
242
282
  try {
243
283
  // Load environment
244
284
  resolveEnv();
@@ -283,15 +323,17 @@ node
283
323
  }
284
324
  const pflow = await create0pflow({
285
325
  databaseUrl: process.env.DATABASE_URL,
286
- appName: getAppName(),
326
+ appName: getAppSchema(),
287
327
  nodes,
288
328
  });
289
329
  try {
290
- const result = await pflow.triggerNode(nodeName, inputs);
291
- if (options.json) {
292
- console.log(JSON.stringify(result, null, 2));
330
+ const runId = randomUUID();
331
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerNode(nodeName, inputs, { workflowName: options.workflow }));
332
+ if (writeJson) {
333
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
293
334
  }
294
335
  else {
336
+ console.log(pc.dim(`Run ID: ${runId}`));
295
337
  console.log(pc.green("\nResult:"));
296
338
  console.log(JSON.stringify(result, null, 2));
297
339
  }
@@ -301,7 +343,13 @@ node
301
343
  }
302
344
  }
303
345
  catch (err) {
304
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
346
+ const msg = err instanceof Error ? err.message : String(err);
347
+ if (writeJson) {
348
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
349
+ }
350
+ else {
351
+ console.error(pc.red(`Error: ${msg}`));
352
+ }
305
353
  process.exit(1);
306
354
  }
307
355
  });
@@ -417,6 +465,41 @@ program
417
465
  process.exit(1);
418
466
  }
419
467
  });
468
+ // ============ Dev UI command ============
469
+ program
470
+ .command("dev")
471
+ .description("Start the Dev UI (visual workflow DAG viewer)")
472
+ .option("-p, --port <number>", "Port to serve on", "4173")
473
+ .option("--host", "Expose to network")
474
+ .option("--dangerously-skip-permissions", "Pass --dangerously-skip-permissions to Claude Code")
475
+ .option("--claude-prompt <text>", "Initial prompt to send to Claude Code")
476
+ .option("--verbose", "Show detailed startup information")
477
+ .action(async (options) => {
478
+ // Load .env for DATABASE_URL and NANGO_SECRET_KEY
479
+ try {
480
+ resolveEnv();
481
+ }
482
+ catch {
483
+ // Dev UI can work without env (connections API just won't be available)
484
+ }
485
+ // Detect dev mode (running from monorepo source) for --plugin-dir
486
+ const { packageRoot } = await import("./mcp/config.js");
487
+ const monorepoRoot = resolve(packageRoot, "..", "..");
488
+ const { existsSync } = await import("node:fs");
489
+ const pluginDir = existsSync(resolve(monorepoRoot, "packages", "core")) ? monorepoRoot : undefined;
490
+ const { startDevServer } = await import("../dev-ui/index.js");
491
+ await startDevServer({
492
+ projectRoot: process.cwd(),
493
+ port: parseInt(options.port, 10),
494
+ host: options.host,
495
+ databaseUrl: process.env.DATABASE_URL,
496
+ nangoSecretKey: process.env.NANGO_SECRET_KEY,
497
+ claudePluginDir: pluginDir,
498
+ claudeSkipPermissions: options.dangerouslySkipPermissions,
499
+ claudePrompt: options.claudePrompt,
500
+ verbose: options.verbose,
501
+ });
502
+ });
420
503
  // ============ MCP commands ============
421
504
  const mcp = program.command("mcp").description("MCP server commands");
422
505
  mcp
@@ -441,5 +524,44 @@ program
441
524
  .action(async (options) => {
442
525
  await runUninstall({ verbose: options.verbose });
443
526
  });
527
+ // ============ Auth commands ============
528
+ program
529
+ .command("login")
530
+ .description("Authenticate with 0pflow cloud (opens browser)")
531
+ .action(async () => {
532
+ const { authenticate, isAuthenticated, AuthRequiredError } = await import("../connections/cloud-auth.js");
533
+ if (isAuthenticated()) {
534
+ console.log(pc.green("Already logged in."));
535
+ return;
536
+ }
537
+ try {
538
+ console.log(pc.dim("Opening browser for authentication..."));
539
+ await authenticate();
540
+ console.log(pc.green("Logged in successfully."));
541
+ }
542
+ catch (err) {
543
+ if (err instanceof AuthRequiredError) {
544
+ console.log(`\n${pc.yellow("Waiting for browser approval...")}\n\n` +
545
+ `If the browser didn't open, visit:\n${pc.cyan(err.authUrl)}\n\n` +
546
+ `Then run ${pc.bold("0pflow login")} again.`);
547
+ }
548
+ else {
549
+ console.error(pc.red(`Login failed: ${err instanceof Error ? err.message : err}`));
550
+ process.exit(1);
551
+ }
552
+ }
553
+ });
554
+ program
555
+ .command("logout")
556
+ .description("Remove stored 0pflow cloud credentials")
557
+ .action(async () => {
558
+ const { logout, isAuthenticated } = await import("../connections/cloud-auth.js");
559
+ if (!isAuthenticated()) {
560
+ console.log(pc.dim("Not logged in."));
561
+ return;
562
+ }
563
+ logout();
564
+ console.log(pc.green("Logged out. Credentials removed from ~/.0pflow/credentials"));
565
+ });
444
566
  program.parse();
445
567
  //# sourceMappingURL=index.js.map