0pflow 0.1.0-dev.628bd97 → 0.1.0-dev.6c5c92a

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 (239) 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 +120 -24
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/cli/mcp/config.d.ts +0 -1
  31. package/dist/cli/mcp/config.d.ts.map +1 -1
  32. package/dist/cli/mcp/config.js +2 -4
  33. package/dist/cli/mcp/config.js.map +1 -1
  34. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  35. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  36. package/dist/cli/mcp/lib/scaffolding.js +251 -0
  37. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  38. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  39. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  40. package/dist/cli/mcp/lib/templates.js.map +1 -1
  41. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  42. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  43. package/dist/cli/mcp/tools/createApp.js +12 -53
  44. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  45. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  46. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  47. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  48. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  49. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  50. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  51. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  52. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  53. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  54. package/dist/cli/mcp/tools/getRun.js +80 -0
  55. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  56. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  57. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  58. package/dist/cli/mcp/tools/getTrace.js +104 -0
  59. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  60. package/dist/cli/mcp/tools/index.d.ts +94 -1
  61. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  62. package/dist/cli/mcp/tools/index.js +16 -0
  63. package/dist/cli/mcp/tools/index.js.map +1 -1
  64. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  65. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  66. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  67. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  68. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  69. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  70. package/dist/cli/mcp/tools/listRuns.js +72 -0
  71. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  72. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  73. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  74. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  75. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  76. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  77. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  78. package/dist/cli/mcp/tools/runNode.js +74 -0
  79. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  80. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  81. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  82. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  83. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  84. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  85. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  86. package/dist/cli/mcp/tools/setupAppSchema.js +11 -132
  87. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  88. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  89. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  90. package/dist/cli/mcp/tools/utils.js +28 -0
  91. package/dist/cli/mcp/tools/utils.js.map +1 -0
  92. package/dist/cli/run.d.ts +2 -0
  93. package/dist/cli/run.d.ts.map +1 -0
  94. package/dist/cli/run.js +391 -0
  95. package/dist/cli/run.js.map +1 -0
  96. package/dist/cli/trace.d.ts +5 -0
  97. package/dist/cli/trace.d.ts.map +1 -1
  98. package/dist/cli/trace.js +1 -1
  99. package/dist/cli/trace.js.map +1 -1
  100. package/dist/connections/cloud-auth.d.ts +46 -0
  101. package/dist/connections/cloud-auth.d.ts.map +1 -0
  102. package/dist/connections/cloud-auth.js +243 -0
  103. package/dist/connections/cloud-auth.js.map +1 -0
  104. package/dist/connections/cloud-client.d.ts +25 -0
  105. package/dist/connections/cloud-client.d.ts.map +1 -0
  106. package/dist/connections/cloud-client.js +59 -0
  107. package/dist/connections/cloud-client.js.map +1 -0
  108. package/dist/connections/cloud-integration-provider.d.ts +21 -0
  109. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  110. package/dist/connections/cloud-integration-provider.js +26 -0
  111. package/dist/connections/cloud-integration-provider.js.map +1 -0
  112. package/dist/connections/index.d.ts +11 -0
  113. package/dist/connections/index.d.ts.map +1 -0
  114. package/dist/connections/index.js +9 -0
  115. package/dist/connections/index.js.map +1 -0
  116. package/dist/connections/integration-provider.d.ts +38 -0
  117. package/dist/connections/integration-provider.d.ts.map +1 -0
  118. package/dist/connections/integration-provider.js +20 -0
  119. package/dist/connections/integration-provider.js.map +1 -0
  120. package/dist/connections/local-integration-provider.d.ts +28 -0
  121. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  122. package/dist/connections/local-integration-provider.js +54 -0
  123. package/dist/connections/local-integration-provider.js.map +1 -0
  124. package/dist/connections/nango-client.d.ts +14 -0
  125. package/dist/connections/nango-client.d.ts.map +1 -0
  126. package/dist/connections/nango-client.js +50 -0
  127. package/dist/connections/nango-client.js.map +1 -0
  128. package/dist/connections/resolver.d.ts +26 -0
  129. package/dist/connections/resolver.d.ts.map +1 -0
  130. package/dist/connections/resolver.js +48 -0
  131. package/dist/connections/resolver.js.map +1 -0
  132. package/dist/connections/schema.d.ts +8 -0
  133. package/dist/connections/schema.d.ts.map +1 -0
  134. package/dist/connections/schema.js +31 -0
  135. package/dist/connections/schema.js.map +1 -0
  136. package/dist/context.d.ts.map +1 -1
  137. package/dist/context.js +4 -0
  138. package/dist/context.js.map +1 -1
  139. package/dist/dev-ui/api.d.ts +16 -0
  140. package/dist/dev-ui/api.d.ts.map +1 -0
  141. package/dist/dev-ui/api.js +237 -0
  142. package/dist/dev-ui/api.js.map +1 -0
  143. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  144. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  145. package/dist/dev-ui/dag/extractor.js +716 -0
  146. package/dist/dev-ui/dag/extractor.js.map +1 -0
  147. package/dist/dev-ui/dag/types.d.ts +42 -0
  148. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  149. package/dist/dev-ui/dag/types.js +2 -0
  150. package/dist/dev-ui/dag/types.js.map +1 -0
  151. package/dist/dev-ui/dev-server.d.ts +18 -0
  152. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  153. package/dist/dev-ui/dev-server.js +222 -0
  154. package/dist/dev-ui/dev-server.js.map +1 -0
  155. package/dist/dev-ui/index.d.ts +3 -0
  156. package/dist/dev-ui/index.d.ts.map +1 -0
  157. package/dist/dev-ui/index.js +2 -0
  158. package/dist/dev-ui/index.js.map +1 -0
  159. package/dist/dev-ui/pty.d.ts +16 -0
  160. package/dist/dev-ui/pty.d.ts.map +1 -0
  161. package/dist/dev-ui/pty.js +87 -0
  162. package/dist/dev-ui/pty.js.map +1 -0
  163. package/dist/dev-ui/watcher.d.ts +12 -0
  164. package/dist/dev-ui/watcher.d.ts.map +1 -0
  165. package/dist/dev-ui/watcher.js +162 -0
  166. package/dist/dev-ui/watcher.js.map +1 -0
  167. package/dist/dev-ui/ws.d.ts +52 -0
  168. package/dist/dev-ui/ws.d.ts.map +1 -0
  169. package/dist/dev-ui/ws.js +32 -0
  170. package/dist/dev-ui/ws.js.map +1 -0
  171. package/dist/dev-ui-client/assets/index-C-LxzUII.css +32 -0
  172. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  173. package/dist/dev-ui-client/assets/index-aAIwXl4O.js +127 -0
  174. package/dist/dev-ui-client/index.html +13 -0
  175. package/dist/discover.d.ts +15 -0
  176. package/dist/discover.d.ts.map +1 -0
  177. package/dist/discover.js +29 -0
  178. package/dist/discover.js.map +1 -0
  179. package/dist/factory.d.ts.map +1 -1
  180. package/dist/factory.js +25 -12
  181. package/dist/factory.js.map +1 -1
  182. package/dist/index.d.ts +5 -1
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.js +4 -0
  185. package/dist/index.js.map +1 -1
  186. package/dist/node.d.ts +1 -0
  187. package/dist/node.d.ts.map +1 -1
  188. package/dist/node.js +1 -0
  189. package/dist/node.js.map +1 -1
  190. package/dist/nodes/agent/executor.d.ts +2 -0
  191. package/dist/nodes/agent/executor.d.ts.map +1 -1
  192. package/dist/nodes/agent/executor.js +11 -1
  193. package/dist/nodes/agent/executor.js.map +1 -1
  194. package/dist/types.d.ts +21 -3
  195. package/dist/types.d.ts.map +1 -1
  196. package/dist/version.d.ts +6 -0
  197. package/dist/version.d.ts.map +1 -0
  198. package/dist/version.js +7 -0
  199. package/dist/version.js.map +1 -0
  200. package/dist/workflow.d.ts +22 -0
  201. package/dist/workflow.d.ts.map +1 -1
  202. package/dist/workflow.js +97 -2
  203. package/dist/workflow.js.map +1 -1
  204. package/package.json +28 -6
  205. package/templates/app/.env.example +13 -0
  206. package/templates/app/README.md +29 -0
  207. package/templates/app/biome.jsonc +81 -0
  208. package/templates/app/dbos-config.yaml +6 -0
  209. package/templates/app/drizzle.config.ts +12 -0
  210. package/templates/app/next.config.js +10 -0
  211. package/templates/app/package.json +55 -0
  212. package/templates/app/postcss.config.js +5 -0
  213. package/templates/app/public/favicon.ico +0 -0
  214. package/templates/app/src/app/_components/.gitkeep +0 -0
  215. package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
  216. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  217. package/templates/app/src/app/layout.tsx +29 -0
  218. package/templates/app/src/app/page.tsx +18 -0
  219. package/templates/app/src/env.js +46 -0
  220. package/templates/app/src/instrumentation.ts +6 -0
  221. package/templates/app/src/lib/pflow.ts +29 -0
  222. package/templates/app/src/server/api/root.ts +21 -0
  223. package/templates/app/src/server/api/routers/.gitkeep +0 -0
  224. package/templates/app/src/server/api/trpc.ts +106 -0
  225. package/templates/app/src/server/db/index.ts +18 -0
  226. package/templates/app/src/server/db/schema.ts +14 -0
  227. package/templates/app/src/styles/globals.css +6 -0
  228. package/templates/app/src/styles/globals.css.orange +126 -0
  229. package/templates/app/src/trpc/query-client.ts +25 -0
  230. package/templates/app/src/trpc/react.tsx +78 -0
  231. package/templates/app/src/trpc/server.ts +30 -0
  232. package/templates/app/tsconfig.check.json +23 -0
  233. package/templates/app/tsconfig.json +42 -0
  234. package/templates/app/tsconfig.server.json +5 -0
  235. package/templates/app/tsconfig.test.json +21 -0
  236. package/dist/cli/install.d.ts +0 -63
  237. package/dist/cli/install.d.ts.map +0 -1
  238. package/dist/cli/install.js +0 -239
  239. package/dist/cli/install.js.map +0 -1
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, 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
  },
@@ -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;AA2C7D,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,EACb,aAAa,CAAC,SAAS,CACxB,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"}
@@ -9,7 +9,7 @@ describe("discoverWorkflows", () => {
9
9
  expect(result.warnings).toEqual([]);
10
10
  });
11
11
  it("discovers workflow executables from uptime-app", async () => {
12
- const projectRoot = path.resolve(__dirname, "../../../..");
12
+ const projectRoot = path.resolve(__dirname, "../../../../..");
13
13
  const uptimeApp = path.join(projectRoot, "examples/uptime-app");
14
14
  const result = await discoverWorkflows(uptimeApp);
15
15
  expect(result.workflows.length).toBeGreaterThan(0);
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/discovery.test.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,yDAAyD;QACzD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/discovery.test.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,yDAAyD;QACzD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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":"AAAA,gCAAgC;AAChC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAMlC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAiBzC;;GAEG;AACH,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACd,KAA0B,CAAC,IAAI,KAAK,UAAU,CAChD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB;IAElB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAEpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE3C,yCAAyC;YACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAiC,CAAC,EAAE,CAAC;gBACrE,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACtB,MAAM,CAAC,wBAAwB;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,2BAA2B,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACd,KAA0B,CAAC,IAAI,KAAK,MAAM,CAC5C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,KAAK,GAAkC,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mBAAmB;QACnB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU;YAAE,SAAS;QAEzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE3C,kCAAkC;YAClC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAiC,CAAC,EAAE,CAAC;gBACrE,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,uBAAuB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACd,KAA0B,CAAC,IAAI,KAAK,OAAO,CAC7C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAE5F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mBAAmB;QACnB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU;YAAE,SAAS;QAEzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE3C,mCAAmC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAiC,CAAC,EAAE,CAAC;gBACrE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,wBAAwB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
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,16 +3,18 @@ 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
- import { runInstall, runUninstall } from "./install.js";
17
+ import { runRun } from "./run.js";
16
18
  // Read version from package.json
17
19
  const __dirname = dirname(fileURLToPath(import.meta.url));
18
20
  const pkgJsonPath = resolve(__dirname, "../../package.json");
@@ -63,11 +65,28 @@ 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")
69
81
  .description("CLI for 0pflow workflow engine")
70
82
  .version(version);
83
+ // ============ Run command ============
84
+ program
85
+ .command("run")
86
+ .description("Create a new project or launch an existing one")
87
+ .action(async () => {
88
+ await runRun();
89
+ });
71
90
  // ============ Workflow commands ============
72
91
  const workflow = program.command("workflow").description("Workflow commands");
73
92
  workflow
@@ -117,6 +136,7 @@ workflow
117
136
  .option("-i, --input <json>", "JSON input for the workflow", "{}")
118
137
  .option("--json", "Output result as JSON")
119
138
  .action(async (workflowName, options) => {
139
+ const writeJson = options.json ? captureStdout() : null;
120
140
  try {
121
141
  // Load environment (all .env vars into process.env)
122
142
  resolveEnv();
@@ -166,16 +186,18 @@ workflow
166
186
  }
167
187
  const pflow = await create0pflow({
168
188
  databaseUrl: process.env.DATABASE_URL,
169
- appName: getAppName(),
189
+ appName: getAppSchema(),
170
190
  workflows: workflowRegistry,
171
191
  nodes,
172
192
  });
173
193
  try {
174
- const result = await pflow.triggerWorkflow(wf.name, inputs);
175
- if (options.json) {
176
- console.log(JSON.stringify(result, null, 2));
194
+ const runId = randomUUID();
195
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerWorkflow(wf.name, inputs));
196
+ if (writeJson) {
197
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
177
198
  }
178
199
  else {
200
+ console.log(pc.dim(`Run ID: ${runId}`));
179
201
  console.log(pc.green("\nResult:"));
180
202
  console.log(JSON.stringify(result, null, 2));
181
203
  }
@@ -185,7 +207,13 @@ workflow
185
207
  }
186
208
  }
187
209
  catch (err) {
188
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
210
+ const msg = err instanceof Error ? err.message : String(err);
211
+ if (writeJson) {
212
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
213
+ }
214
+ else {
215
+ console.error(pc.red(`Error: ${msg}`));
216
+ }
189
217
  process.exit(1);
190
218
  }
191
219
  });
@@ -237,8 +265,10 @@ node
237
265
  .command("run <name>")
238
266
  .description("Run a node (wrapped in workflow for durability)")
239
267
  .option("-i, --input <json>", "JSON input for the node", "{}")
268
+ .option("-w, --workflow <name>", "Workflow name for connection resolution")
240
269
  .option("--json", "Output result as JSON")
241
270
  .action(async (nodeName, options) => {
271
+ const writeJson = options.json ? captureStdout() : null;
242
272
  try {
243
273
  // Load environment
244
274
  resolveEnv();
@@ -283,15 +313,17 @@ node
283
313
  }
284
314
  const pflow = await create0pflow({
285
315
  databaseUrl: process.env.DATABASE_URL,
286
- appName: getAppName(),
316
+ appName: getAppSchema(),
287
317
  nodes,
288
318
  });
289
319
  try {
290
- const result = await pflow.triggerNode(nodeName, inputs);
291
- if (options.json) {
292
- console.log(JSON.stringify(result, null, 2));
320
+ const runId = randomUUID();
321
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerNode(nodeName, inputs, { workflowName: options.workflow }));
322
+ if (writeJson) {
323
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
293
324
  }
294
325
  else {
326
+ console.log(pc.dim(`Run ID: ${runId}`));
295
327
  console.log(pc.green("\nResult:"));
296
328
  console.log(JSON.stringify(result, null, 2));
297
329
  }
@@ -301,7 +333,13 @@ node
301
333
  }
302
334
  }
303
335
  catch (err) {
304
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
336
+ const msg = err instanceof Error ? err.message : String(err);
337
+ if (writeJson) {
338
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
339
+ }
340
+ else {
341
+ console.error(pc.red(`Error: ${msg}`));
342
+ }
305
343
  process.exit(1);
306
344
  }
307
345
  });
@@ -417,6 +455,41 @@ program
417
455
  process.exit(1);
418
456
  }
419
457
  });
458
+ // ============ Dev UI command ============
459
+ program
460
+ .command("dev")
461
+ .description("Start the Dev UI (visual workflow DAG viewer)")
462
+ .option("-p, --port <number>", "Port to serve on", "4173")
463
+ .option("--host", "Expose to network")
464
+ .option("--dangerously-skip-permissions", "Pass --dangerously-skip-permissions to Claude Code")
465
+ .option("--claude-prompt <text>", "Initial prompt to send to Claude Code")
466
+ .option("--verbose", "Show detailed startup information")
467
+ .action(async (options) => {
468
+ // Load .env for DATABASE_URL and NANGO_SECRET_KEY
469
+ try {
470
+ resolveEnv();
471
+ }
472
+ catch {
473
+ // Dev UI can work without env (connections API just won't be available)
474
+ }
475
+ // Detect dev mode (running from monorepo source) for --plugin-dir
476
+ const { packageRoot } = await import("./mcp/config.js");
477
+ const monorepoRoot = resolve(packageRoot, "..", "..");
478
+ const { existsSync } = await import("node:fs");
479
+ const pluginDir = existsSync(resolve(monorepoRoot, "packages", "core")) ? monorepoRoot : undefined;
480
+ const { startDevServer } = await import("../dev-ui/index.js");
481
+ await startDevServer({
482
+ projectRoot: process.cwd(),
483
+ port: parseInt(options.port, 10),
484
+ host: options.host,
485
+ databaseUrl: process.env.DATABASE_URL,
486
+ nangoSecretKey: process.env.NANGO_SECRET_KEY,
487
+ claudePluginDir: pluginDir,
488
+ claudeSkipPermissions: options.dangerouslySkipPermissions,
489
+ claudePrompt: options.claudePrompt,
490
+ verbose: options.verbose,
491
+ });
492
+ });
420
493
  // ============ MCP commands ============
421
494
  const mcp = program.command("mcp").description("MCP server commands");
422
495
  mcp
@@ -425,21 +498,44 @@ mcp
425
498
  .action(async () => {
426
499
  await startMcpServer();
427
500
  });
428
- // ============ Install/Uninstall commands ============
501
+ // ============ Auth commands ============
429
502
  program
430
- .command("install")
431
- .description("Install 0pflow plugin to Claude Code")
432
- .option("-f, --force", "Force reinstall even if already installed")
433
- .option("-v, --verbose", "Show detailed output")
434
- .action(async (options) => {
435
- await runInstall({ force: options.force, verbose: options.verbose });
503
+ .command("login")
504
+ .description("Authenticate with 0pflow cloud (opens browser)")
505
+ .action(async () => {
506
+ const { authenticate, isAuthenticated, AuthRequiredError } = await import("../connections/cloud-auth.js");
507
+ if (isAuthenticated()) {
508
+ console.log(pc.green("Already logged in."));
509
+ return;
510
+ }
511
+ try {
512
+ console.log(pc.dim("Opening browser for authentication..."));
513
+ await authenticate();
514
+ console.log(pc.green("Logged in successfully."));
515
+ }
516
+ catch (err) {
517
+ if (err instanceof AuthRequiredError) {
518
+ console.log(`\n${pc.yellow("Waiting for browser approval...")}\n\n` +
519
+ `If the browser didn't open, visit:\n${pc.cyan(err.authUrl)}\n\n` +
520
+ `Then run ${pc.bold("0pflow login")} again.`);
521
+ }
522
+ else {
523
+ console.error(pc.red(`Login failed: ${err instanceof Error ? err.message : err}`));
524
+ process.exit(1);
525
+ }
526
+ }
436
527
  });
437
528
  program
438
- .command("uninstall")
439
- .description("Uninstall 0pflow plugin from Claude Code")
440
- .option("-v, --verbose", "Show detailed output")
441
- .action(async (options) => {
442
- await runUninstall({ verbose: options.verbose });
529
+ .command("logout")
530
+ .description("Remove stored 0pflow cloud credentials")
531
+ .action(async () => {
532
+ const { logout, isAuthenticated } = await import("../connections/cloud-auth.js");
533
+ if (!isAuthenticated()) {
534
+ console.log(pc.dim("Not logged in."));
535
+ return;
536
+ }
537
+ logout();
538
+ console.log(pc.green("Logged out. Credentials removed from ~/.0pflow/credentials"));
443
539
  });
444
540
  program.parse();
445
541
  //# sourceMappingURL=index.js.map