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