0pflow 0.1.0-dev.00aaa03 → 0.1.0-dev.036b6f3

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 (236) 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 +5 -1
  28. package/dist/cli/index.d.ts.map +1 -1
  29. package/dist/cli/index.js +149 -14
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/cli/install.d.ts +13 -4
  32. package/dist/cli/install.d.ts.map +1 -1
  33. package/dist/cli/install.js +124 -72
  34. package/dist/cli/install.js.map +1 -1
  35. package/dist/cli/mcp/config.d.ts +0 -1
  36. package/dist/cli/mcp/config.d.ts.map +1 -1
  37. package/dist/cli/mcp/config.js +2 -4
  38. package/dist/cli/mcp/config.js.map +1 -1
  39. package/dist/cli/mcp/lib/scaffolding.d.ts +33 -0
  40. package/dist/cli/mcp/lib/scaffolding.d.ts.map +1 -0
  41. package/dist/cli/mcp/lib/scaffolding.js +219 -0
  42. package/dist/cli/mcp/lib/scaffolding.js.map +1 -0
  43. package/dist/cli/mcp/lib/templates.d.ts +1 -0
  44. package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
  45. package/dist/cli/mcp/lib/templates.js.map +1 -1
  46. package/dist/cli/mcp/tools/createApp.d.ts +1 -0
  47. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -1
  48. package/dist/cli/mcp/tools/createApp.js +12 -55
  49. package/dist/cli/mcp/tools/createApp.js.map +1 -1
  50. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -1
  51. package/dist/cli/mcp/tools/createDatabase.js +2 -41
  52. package/dist/cli/mcp/tools/createDatabase.js.map +1 -1
  53. package/dist/cli/mcp/tools/getConnectionInfo.d.ts +19 -0
  54. package/dist/cli/mcp/tools/getConnectionInfo.d.ts.map +1 -0
  55. package/dist/cli/mcp/tools/getConnectionInfo.js +111 -0
  56. package/dist/cli/mcp/tools/getConnectionInfo.js.map +1 -0
  57. package/dist/cli/mcp/tools/getRun.d.ts +22 -0
  58. package/dist/cli/mcp/tools/getRun.d.ts.map +1 -0
  59. package/dist/cli/mcp/tools/getRun.js +80 -0
  60. package/dist/cli/mcp/tools/getRun.js.map +1 -0
  61. package/dist/cli/mcp/tools/getTrace.d.ts +32 -0
  62. package/dist/cli/mcp/tools/getTrace.d.ts.map +1 -0
  63. package/dist/cli/mcp/tools/getTrace.js +104 -0
  64. package/dist/cli/mcp/tools/getTrace.js.map +1 -0
  65. package/dist/cli/mcp/tools/index.d.ts +94 -1
  66. package/dist/cli/mcp/tools/index.d.ts.map +1 -1
  67. package/dist/cli/mcp/tools/index.js +16 -0
  68. package/dist/cli/mcp/tools/index.js.map +1 -1
  69. package/dist/cli/mcp/tools/listIntegrations.d.ts +14 -0
  70. package/dist/cli/mcp/tools/listIntegrations.d.ts.map +1 -0
  71. package/dist/cli/mcp/tools/listIntegrations.js +53 -0
  72. package/dist/cli/mcp/tools/listIntegrations.js.map +1 -0
  73. package/dist/cli/mcp/tools/listRuns.d.ts +21 -0
  74. package/dist/cli/mcp/tools/listRuns.d.ts.map +1 -0
  75. package/dist/cli/mcp/tools/listRuns.js +72 -0
  76. package/dist/cli/mcp/tools/listRuns.js.map +1 -0
  77. package/dist/cli/mcp/tools/listWorkflows.d.ts +15 -0
  78. package/dist/cli/mcp/tools/listWorkflows.d.ts.map +1 -0
  79. package/dist/cli/mcp/tools/listWorkflows.js +45 -0
  80. package/dist/cli/mcp/tools/listWorkflows.js.map +1 -0
  81. package/dist/cli/mcp/tools/runNode.d.ts +17 -0
  82. package/dist/cli/mcp/tools/runNode.d.ts.map +1 -0
  83. package/dist/cli/mcp/tools/runNode.js +74 -0
  84. package/dist/cli/mcp/tools/runNode.js.map +1 -0
  85. package/dist/cli/mcp/tools/runWorkflow.d.ts +16 -0
  86. package/dist/cli/mcp/tools/runWorkflow.d.ts.map +1 -0
  87. package/dist/cli/mcp/tools/runWorkflow.js +66 -0
  88. package/dist/cli/mcp/tools/runWorkflow.js.map +1 -0
  89. package/dist/cli/mcp/tools/setupAppSchema.d.ts +1 -1
  90. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -1
  91. package/dist/cli/mcp/tools/setupAppSchema.js +11 -129
  92. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
  93. package/dist/cli/mcp/tools/utils.d.ts +7 -0
  94. package/dist/cli/mcp/tools/utils.d.ts.map +1 -0
  95. package/dist/cli/mcp/tools/utils.js +28 -0
  96. package/dist/cli/mcp/tools/utils.js.map +1 -0
  97. package/dist/cli/run.d.ts +2 -0
  98. package/dist/cli/run.d.ts.map +1 -0
  99. package/dist/cli/run.js +481 -0
  100. package/dist/cli/run.js.map +1 -0
  101. package/dist/cli/trace.d.ts +5 -0
  102. package/dist/cli/trace.d.ts.map +1 -1
  103. package/dist/cli/trace.js +1 -1
  104. package/dist/cli/trace.js.map +1 -1
  105. package/dist/connections/cloud-auth.d.ts +46 -0
  106. package/dist/connections/cloud-auth.d.ts.map +1 -0
  107. package/dist/connections/cloud-auth.js +243 -0
  108. package/dist/connections/cloud-auth.js.map +1 -0
  109. package/dist/connections/cloud-client.d.ts +25 -0
  110. package/dist/connections/cloud-client.d.ts.map +1 -0
  111. package/dist/connections/cloud-client.js +59 -0
  112. package/dist/connections/cloud-client.js.map +1 -0
  113. package/dist/connections/cloud-integration-provider.d.ts +21 -0
  114. package/dist/connections/cloud-integration-provider.d.ts.map +1 -0
  115. package/dist/connections/cloud-integration-provider.js +26 -0
  116. package/dist/connections/cloud-integration-provider.js.map +1 -0
  117. package/dist/connections/index.d.ts +11 -0
  118. package/dist/connections/index.d.ts.map +1 -0
  119. package/dist/connections/index.js +9 -0
  120. package/dist/connections/index.js.map +1 -0
  121. package/dist/connections/integration-provider.d.ts +38 -0
  122. package/dist/connections/integration-provider.d.ts.map +1 -0
  123. package/dist/connections/integration-provider.js +20 -0
  124. package/dist/connections/integration-provider.js.map +1 -0
  125. package/dist/connections/local-integration-provider.d.ts +28 -0
  126. package/dist/connections/local-integration-provider.d.ts.map +1 -0
  127. package/dist/connections/local-integration-provider.js +54 -0
  128. package/dist/connections/local-integration-provider.js.map +1 -0
  129. package/dist/connections/nango-client.d.ts +14 -0
  130. package/dist/connections/nango-client.d.ts.map +1 -0
  131. package/dist/connections/nango-client.js +50 -0
  132. package/dist/connections/nango-client.js.map +1 -0
  133. package/dist/connections/resolver.d.ts +26 -0
  134. package/dist/connections/resolver.d.ts.map +1 -0
  135. package/dist/connections/resolver.js +48 -0
  136. package/dist/connections/resolver.js.map +1 -0
  137. package/dist/connections/schema.d.ts +8 -0
  138. package/dist/connections/schema.d.ts.map +1 -0
  139. package/dist/connections/schema.js +31 -0
  140. package/dist/connections/schema.js.map +1 -0
  141. package/dist/context.d.ts.map +1 -1
  142. package/dist/context.js +4 -0
  143. package/dist/context.js.map +1 -1
  144. package/dist/dev-ui/api.d.ts +16 -0
  145. package/dist/dev-ui/api.d.ts.map +1 -0
  146. package/dist/dev-ui/api.js +237 -0
  147. package/dist/dev-ui/api.js.map +1 -0
  148. package/dist/dev-ui/dag/extractor.d.ts +19 -0
  149. package/dist/dev-ui/dag/extractor.d.ts.map +1 -0
  150. package/dist/dev-ui/dag/extractor.js +716 -0
  151. package/dist/dev-ui/dag/extractor.js.map +1 -0
  152. package/dist/dev-ui/dag/types.d.ts +42 -0
  153. package/dist/dev-ui/dag/types.d.ts.map +1 -0
  154. package/dist/dev-ui/dag/types.js +2 -0
  155. package/dist/dev-ui/dag/types.js.map +1 -0
  156. package/dist/dev-ui/dev-server.d.ts +18 -0
  157. package/dist/dev-ui/dev-server.d.ts.map +1 -0
  158. package/dist/dev-ui/dev-server.js +222 -0
  159. package/dist/dev-ui/dev-server.js.map +1 -0
  160. package/dist/dev-ui/index.d.ts +3 -0
  161. package/dist/dev-ui/index.d.ts.map +1 -0
  162. package/dist/dev-ui/index.js +2 -0
  163. package/dist/dev-ui/index.js.map +1 -0
  164. package/dist/dev-ui/pty.d.ts +16 -0
  165. package/dist/dev-ui/pty.d.ts.map +1 -0
  166. package/dist/dev-ui/pty.js +87 -0
  167. package/dist/dev-ui/pty.js.map +1 -0
  168. package/dist/dev-ui/watcher.d.ts +12 -0
  169. package/dist/dev-ui/watcher.d.ts.map +1 -0
  170. package/dist/dev-ui/watcher.js +162 -0
  171. package/dist/dev-ui/watcher.js.map +1 -0
  172. package/dist/dev-ui/ws.d.ts +52 -0
  173. package/dist/dev-ui/ws.d.ts.map +1 -0
  174. package/dist/dev-ui/ws.js +32 -0
  175. package/dist/dev-ui/ws.js.map +1 -0
  176. package/dist/dev-ui-client/assets/index-C-LxzUII.css +32 -0
  177. package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
  178. package/dist/dev-ui-client/assets/index-aAIwXl4O.js +127 -0
  179. package/dist/dev-ui-client/index.html +13 -0
  180. package/dist/discover.d.ts +15 -0
  181. package/dist/discover.d.ts.map +1 -0
  182. package/dist/discover.js +29 -0
  183. package/dist/discover.js.map +1 -0
  184. package/dist/factory.d.ts.map +1 -1
  185. package/dist/factory.js +25 -12
  186. package/dist/factory.js.map +1 -1
  187. package/dist/index.d.ts +5 -1
  188. package/dist/index.d.ts.map +1 -1
  189. package/dist/index.js +4 -0
  190. package/dist/index.js.map +1 -1
  191. package/dist/node.d.ts +1 -0
  192. package/dist/node.d.ts.map +1 -1
  193. package/dist/node.js +1 -0
  194. package/dist/node.js.map +1 -1
  195. package/dist/nodes/agent/executor.d.ts +2 -0
  196. package/dist/nodes/agent/executor.d.ts.map +1 -1
  197. package/dist/nodes/agent/executor.js +11 -1
  198. package/dist/nodes/agent/executor.js.map +1 -1
  199. package/dist/types.d.ts +21 -3
  200. package/dist/types.d.ts.map +1 -1
  201. package/dist/workflow.d.ts +22 -0
  202. package/dist/workflow.d.ts.map +1 -1
  203. package/dist/workflow.js +97 -2
  204. package/dist/workflow.js.map +1 -1
  205. package/package.json +28 -6
  206. package/templates/app/.env.example +13 -0
  207. package/templates/app/README.md +29 -0
  208. package/templates/app/biome.jsonc +81 -0
  209. package/templates/app/dbos-config.yaml +6 -0
  210. package/templates/app/drizzle.config.ts +12 -0
  211. package/templates/app/next.config.js +10 -0
  212. package/templates/app/package.json +55 -0
  213. package/templates/app/postcss.config.js +5 -0
  214. package/templates/app/public/favicon.ico +0 -0
  215. package/templates/app/src/app/_components/.gitkeep +0 -0
  216. package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
  217. package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
  218. package/templates/app/src/app/layout.tsx +29 -0
  219. package/templates/app/src/app/page.tsx +18 -0
  220. package/templates/app/src/env.js +46 -0
  221. package/templates/app/src/instrumentation.ts +6 -0
  222. package/templates/app/src/lib/pflow.ts +29 -0
  223. package/templates/app/src/server/api/root.ts +21 -0
  224. package/templates/app/src/server/api/routers/.gitkeep +0 -0
  225. package/templates/app/src/server/api/trpc.ts +106 -0
  226. package/templates/app/src/server/db/index.ts +18 -0
  227. package/templates/app/src/server/db/schema.ts +14 -0
  228. package/templates/app/src/styles/globals.css +6 -0
  229. package/templates/app/src/styles/globals.css.orange +126 -0
  230. package/templates/app/src/trpc/query-client.ts +25 -0
  231. package/templates/app/src/trpc/react.tsx +78 -0
  232. package/templates/app/src/trpc/server.ts +30 -0
  233. package/templates/app/tsconfig.check.json +23 -0
  234. package/templates/app/tsconfig.json +42 -0
  235. package/templates/app/tsconfig.server.json +5 -0
  236. package/templates/app/tsconfig.test.json +21 -0
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":"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"}
@@ -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":"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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,3 +1,7 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export declare let version: string;
3
+ /**
4
+ * Get the npm version for MCP command (exact version to keep skills and MCP server in sync)
5
+ */
6
+ export declare function getNpmVersionForMcp(): string;
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
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
@@ -2,14 +2,37 @@
2
2
  import { Command } from "commander";
3
3
  import pc from "picocolors";
4
4
  import Table from "cli-table3";
5
+ import { readFileSync } from "node:fs";
6
+ import { randomUUID } from "node:crypto";
7
+ import { dirname, resolve } from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+ import { DBOS } from "@dbos-inc/dbos-sdk";
5
10
  import { create0pflow } from "../index.js";
6
11
  import { discoverWorkflows, discoverNodes } from "./discovery.js";
7
12
  import { resolveEnv } from "./env.js";
8
13
  import { listRuns, getRun } from "./runs.js";
9
14
  import { getTrace, printTrace } from "./trace.js";
10
- import { getAppName } from "./app.js";
15
+ import { getAppSchema } from "./app.js";
11
16
  import { startMcpServer } from "./mcp/server.js";
12
17
  import { runInstall, runUninstall } from "./install.js";
18
+ import { runRun } from "./run.js";
19
+ // Read version from package.json
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+ const pkgJsonPath = resolve(__dirname, "../../package.json");
22
+ export let version = "0.0.0";
23
+ try {
24
+ const pkgJson = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
25
+ version = pkgJson.version || version;
26
+ }
27
+ catch {
28
+ // Fallback if we can't read package.json
29
+ }
30
+ /**
31
+ * Get the npm version for MCP command (exact version to keep skills and MCP server in sync)
32
+ */
33
+ export function getNpmVersionForMcp() {
34
+ return version;
35
+ }
13
36
  function formatStatus(status) {
14
37
  switch (status) {
15
38
  case "SUCCESS":
@@ -43,11 +66,28 @@ function formatOutput(output) {
43
66
  return String(output);
44
67
  }
45
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
+ }
46
79
  const program = new Command();
47
80
  program
48
81
  .name("0pflow")
49
82
  .description("CLI for 0pflow workflow engine")
50
- .version("0.1.0");
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
+ });
51
91
  // ============ Workflow commands ============
52
92
  const workflow = program.command("workflow").description("Workflow commands");
53
93
  workflow
@@ -97,6 +137,7 @@ workflow
97
137
  .option("-i, --input <json>", "JSON input for the workflow", "{}")
98
138
  .option("--json", "Output result as JSON")
99
139
  .action(async (workflowName, options) => {
140
+ const writeJson = options.json ? captureStdout() : null;
100
141
  try {
101
142
  // Load environment (all .env vars into process.env)
102
143
  resolveEnv();
@@ -146,16 +187,18 @@ workflow
146
187
  }
147
188
  const pflow = await create0pflow({
148
189
  databaseUrl: process.env.DATABASE_URL,
149
- appName: getAppName(),
190
+ appName: getAppSchema(),
150
191
  workflows: workflowRegistry,
151
192
  nodes,
152
193
  });
153
194
  try {
154
- const result = await pflow.triggerWorkflow(wf.name, inputs);
155
- if (options.json) {
156
- console.log(JSON.stringify(result, null, 2));
195
+ const runId = randomUUID();
196
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerWorkflow(wf.name, inputs));
197
+ if (writeJson) {
198
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
157
199
  }
158
200
  else {
201
+ console.log(pc.dim(`Run ID: ${runId}`));
159
202
  console.log(pc.green("\nResult:"));
160
203
  console.log(JSON.stringify(result, null, 2));
161
204
  }
@@ -165,7 +208,13 @@ workflow
165
208
  }
166
209
  }
167
210
  catch (err) {
168
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
211
+ const msg = err instanceof Error ? err.message : String(err);
212
+ if (writeJson) {
213
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
214
+ }
215
+ else {
216
+ console.error(pc.red(`Error: ${msg}`));
217
+ }
169
218
  process.exit(1);
170
219
  }
171
220
  });
@@ -217,8 +266,10 @@ node
217
266
  .command("run <name>")
218
267
  .description("Run a node (wrapped in workflow for durability)")
219
268
  .option("-i, --input <json>", "JSON input for the node", "{}")
269
+ .option("-w, --workflow <name>", "Workflow name for connection resolution")
220
270
  .option("--json", "Output result as JSON")
221
271
  .action(async (nodeName, options) => {
272
+ const writeJson = options.json ? captureStdout() : null;
222
273
  try {
223
274
  // Load environment
224
275
  resolveEnv();
@@ -263,15 +314,17 @@ node
263
314
  }
264
315
  const pflow = await create0pflow({
265
316
  databaseUrl: process.env.DATABASE_URL,
266
- appName: getAppName(),
317
+ appName: getAppSchema(),
267
318
  nodes,
268
319
  });
269
320
  try {
270
- const result = await pflow.triggerNode(nodeName, inputs);
271
- if (options.json) {
272
- console.log(JSON.stringify(result, null, 2));
321
+ const runId = randomUUID();
322
+ const result = await DBOS.withNextWorkflowID(runId, () => pflow.triggerNode(nodeName, inputs, { workflowName: options.workflow }));
323
+ if (writeJson) {
324
+ writeJson(JSON.stringify({ run_id: runId, status: "SUCCESS", result }));
273
325
  }
274
326
  else {
327
+ console.log(pc.dim(`Run ID: ${runId}`));
275
328
  console.log(pc.green("\nResult:"));
276
329
  console.log(JSON.stringify(result, null, 2));
277
330
  }
@@ -281,7 +334,13 @@ node
281
334
  }
282
335
  }
283
336
  catch (err) {
284
- console.error(pc.red(`Error: ${err instanceof Error ? err.message : err}`));
337
+ const msg = err instanceof Error ? err.message : String(err);
338
+ if (writeJson) {
339
+ writeJson(JSON.stringify({ status: "ERROR", error: msg }));
340
+ }
341
+ else {
342
+ console.error(pc.red(`Error: ${msg}`));
343
+ }
285
344
  process.exit(1);
286
345
  }
287
346
  });
@@ -397,6 +456,41 @@ program
397
456
  process.exit(1);
398
457
  }
399
458
  });
459
+ // ============ Dev UI command ============
460
+ program
461
+ .command("dev")
462
+ .description("Start the Dev UI (visual workflow DAG viewer)")
463
+ .option("-p, --port <number>", "Port to serve on", "4173")
464
+ .option("--host", "Expose to network")
465
+ .option("--dangerously-skip-permissions", "Pass --dangerously-skip-permissions to Claude Code")
466
+ .option("--claude-prompt <text>", "Initial prompt to send to Claude Code")
467
+ .option("--verbose", "Show detailed startup information")
468
+ .action(async (options) => {
469
+ // Load .env for DATABASE_URL and NANGO_SECRET_KEY
470
+ try {
471
+ resolveEnv();
472
+ }
473
+ catch {
474
+ // Dev UI can work without env (connections API just won't be available)
475
+ }
476
+ // Detect dev mode (running from monorepo source) for --plugin-dir
477
+ const { packageRoot } = await import("./mcp/config.js");
478
+ const monorepoRoot = resolve(packageRoot, "..", "..");
479
+ const { existsSync } = await import("node:fs");
480
+ const pluginDir = existsSync(resolve(monorepoRoot, "packages", "core")) ? monorepoRoot : undefined;
481
+ const { startDevServer } = await import("../dev-ui/index.js");
482
+ await startDevServer({
483
+ projectRoot: process.cwd(),
484
+ port: parseInt(options.port, 10),
485
+ host: options.host,
486
+ databaseUrl: process.env.DATABASE_URL,
487
+ nangoSecretKey: process.env.NANGO_SECRET_KEY,
488
+ claudePluginDir: pluginDir,
489
+ claudeSkipPermissions: options.dangerouslySkipPermissions,
490
+ claudePrompt: options.claudePrompt,
491
+ verbose: options.verbose,
492
+ });
493
+ });
400
494
  // ============ MCP commands ============
401
495
  const mcp = program.command("mcp").description("MCP server commands");
402
496
  mcp
@@ -410,14 +504,55 @@ program
410
504
  .command("install")
411
505
  .description("Install 0pflow plugin to Claude Code")
412
506
  .option("-f, --force", "Force reinstall even if already installed")
507
+ .option("-v, --verbose", "Show detailed output")
413
508
  .action(async (options) => {
414
- await runInstall({ force: options.force });
509
+ await runInstall({ force: options.force, verbose: options.verbose });
415
510
  });
416
511
  program
417
512
  .command("uninstall")
418
513
  .description("Uninstall 0pflow plugin from Claude Code")
514
+ .option("-v, --verbose", "Show detailed output")
515
+ .action(async (options) => {
516
+ await runUninstall({ verbose: options.verbose });
517
+ });
518
+ // ============ Auth commands ============
519
+ program
520
+ .command("login")
521
+ .description("Authenticate with 0pflow cloud (opens browser)")
419
522
  .action(async () => {
420
- await runUninstall();
523
+ const { authenticate, isAuthenticated, AuthRequiredError } = await import("../connections/cloud-auth.js");
524
+ if (isAuthenticated()) {
525
+ console.log(pc.green("Already logged in."));
526
+ return;
527
+ }
528
+ try {
529
+ console.log(pc.dim("Opening browser for authentication..."));
530
+ await authenticate();
531
+ console.log(pc.green("Logged in successfully."));
532
+ }
533
+ catch (err) {
534
+ if (err instanceof AuthRequiredError) {
535
+ console.log(`\n${pc.yellow("Waiting for browser approval...")}\n\n` +
536
+ `If the browser didn't open, visit:\n${pc.cyan(err.authUrl)}\n\n` +
537
+ `Then run ${pc.bold("0pflow login")} again.`);
538
+ }
539
+ else {
540
+ console.error(pc.red(`Login failed: ${err instanceof Error ? err.message : err}`));
541
+ process.exit(1);
542
+ }
543
+ }
544
+ });
545
+ program
546
+ .command("logout")
547
+ .description("Remove stored 0pflow cloud credentials")
548
+ .action(async () => {
549
+ const { logout, isAuthenticated } = await import("../connections/cloud-auth.js");
550
+ if (!isAuthenticated()) {
551
+ console.log(pc.dim("Not logged in."));
552
+ return;
553
+ }
554
+ logout();
555
+ console.log(pc.green("Logged out. Credentials removed from ~/.0pflow/credentials"));
421
556
  });
422
557
  program.parse();
423
558
  //# sourceMappingURL=index.js.map