0pflow 0.1.0-dev.7aacb27 → 0.1.0-dev.8ac4d9e
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 +7 -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 +59 -9
- package/dist/agent.js.map +1 -1
- package/dist/cli/__tests__/discovery.test.js +1 -1
- package/dist/cli/__tests__/discovery.test.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 +5 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +154 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +61 -28
- package/dist/cli/install.js.map +1 -1
- package/dist/cli/mcp/config.d.ts +0 -1
- package/dist/cli/mcp/config.d.ts.map +1 -1
- package/dist/cli/mcp/config.js +2 -4
- package/dist/cli/mcp/config.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/lib/templates.d.ts +1 -0
- package/dist/cli/mcp/lib/templates.d.ts.map +1 -1
- package/dist/cli/mcp/lib/templates.js.map +1 -1
- 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 -55
- 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 -129
- 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 +222 -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 +25 -12
- 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 +97 -2
- package/dist/workflow.js.map +1 -1
- package/package.json +28 -6
- package/templates/app/.env.example +13 -0
- package/templates/app/README.md +29 -0
- package/templates/app/biome.jsonc +81 -0
- package/templates/app/dbos-config.yaml +6 -0
- package/templates/app/drizzle.config.ts +12 -0
- package/templates/app/generated/registry.ts +8 -0
- package/templates/app/next.config.js +12 -0
- package/templates/app/package.json +57 -0
- package/templates/app/postcss.config.js +5 -0
- package/templates/app/public/favicon.ico +0 -0
- package/templates/app/src/app/_components/.gitkeep +0 -0
- package/templates/app/src/app/api/trpc/[trpc]/route.ts +34 -0
- package/templates/app/src/app/api/workflow/[name]/route.ts +37 -0
- package/templates/app/src/app/layout.tsx +29 -0
- package/templates/app/src/app/page.tsx +18 -0
- package/templates/app/src/env.js +46 -0
- package/templates/app/src/instrumentation.ts +6 -0
- package/templates/app/src/lib/pflow.ts +28 -0
- package/templates/app/src/server/api/root.ts +21 -0
- package/templates/app/src/server/api/routers/.gitkeep +0 -0
- package/templates/app/src/server/api/trpc.ts +106 -0
- package/templates/app/src/server/db/index.ts +18 -0
- package/templates/app/src/server/db/schema.ts +14 -0
- package/templates/app/src/styles/globals.css +6 -0
- package/templates/app/src/styles/globals.css.orange +126 -0
- package/templates/app/src/trpc/query-client.ts +25 -0
- package/templates/app/src/trpc/react.tsx +78 -0
- package/templates/app/src/trpc/server.ts +30 -0
- package/templates/app/tsconfig.check.json +23 -0
- package/templates/app/tsconfig.json +42 -0
- package/templates/app/tsconfig.server.json +5 -0
- 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
|
-
|
|
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
|
},
|
|
@@ -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
|
-
|
|
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:
|
|
53
|
-
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
|
-
|
|
71
|
-
|
|
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;
|
|
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,
|
|
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
|
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
CHANGED
|
@@ -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
|
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
|
@@ -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 {
|
|
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,37 @@ 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(
|
|
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
|
+
});
|
|
51
100
|
// ============ Workflow commands ============
|
|
52
101
|
const workflow = program.command("workflow").description("Workflow commands");
|
|
53
102
|
workflow
|
|
@@ -97,6 +146,7 @@ workflow
|
|
|
97
146
|
.option("-i, --input <json>", "JSON input for the workflow", "{}")
|
|
98
147
|
.option("--json", "Output result as JSON")
|
|
99
148
|
.action(async (workflowName, options) => {
|
|
149
|
+
const writeJson = options.json ? captureStdout() : null;
|
|
100
150
|
try {
|
|
101
151
|
// Load environment (all .env vars into process.env)
|
|
102
152
|
resolveEnv();
|
|
@@ -146,16 +196,18 @@ workflow
|
|
|
146
196
|
}
|
|
147
197
|
const pflow = await create0pflow({
|
|
148
198
|
databaseUrl: process.env.DATABASE_URL,
|
|
149
|
-
appName:
|
|
199
|
+
appName: getAppSchema(),
|
|
150
200
|
workflows: workflowRegistry,
|
|
151
201
|
nodes,
|
|
152
202
|
});
|
|
153
203
|
try {
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
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 }));
|
|
157
208
|
}
|
|
158
209
|
else {
|
|
210
|
+
console.log(pc.dim(`Run ID: ${runId}`));
|
|
159
211
|
console.log(pc.green("\nResult:"));
|
|
160
212
|
console.log(JSON.stringify(result, null, 2));
|
|
161
213
|
}
|
|
@@ -165,7 +217,13 @@ workflow
|
|
|
165
217
|
}
|
|
166
218
|
}
|
|
167
219
|
catch (err) {
|
|
168
|
-
|
|
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
|
+
}
|
|
169
227
|
process.exit(1);
|
|
170
228
|
}
|
|
171
229
|
});
|
|
@@ -217,8 +275,10 @@ node
|
|
|
217
275
|
.command("run <name>")
|
|
218
276
|
.description("Run a node (wrapped in workflow for durability)")
|
|
219
277
|
.option("-i, --input <json>", "JSON input for the node", "{}")
|
|
278
|
+
.option("-w, --workflow <name>", "Workflow name for connection resolution")
|
|
220
279
|
.option("--json", "Output result as JSON")
|
|
221
280
|
.action(async (nodeName, options) => {
|
|
281
|
+
const writeJson = options.json ? captureStdout() : null;
|
|
222
282
|
try {
|
|
223
283
|
// Load environment
|
|
224
284
|
resolveEnv();
|
|
@@ -263,15 +323,17 @@ node
|
|
|
263
323
|
}
|
|
264
324
|
const pflow = await create0pflow({
|
|
265
325
|
databaseUrl: process.env.DATABASE_URL,
|
|
266
|
-
appName:
|
|
326
|
+
appName: getAppSchema(),
|
|
267
327
|
nodes,
|
|
268
328
|
});
|
|
269
329
|
try {
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
|
|
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 }));
|
|
273
334
|
}
|
|
274
335
|
else {
|
|
336
|
+
console.log(pc.dim(`Run ID: ${runId}`));
|
|
275
337
|
console.log(pc.green("\nResult:"));
|
|
276
338
|
console.log(JSON.stringify(result, null, 2));
|
|
277
339
|
}
|
|
@@ -281,7 +343,13 @@ node
|
|
|
281
343
|
}
|
|
282
344
|
}
|
|
283
345
|
catch (err) {
|
|
284
|
-
|
|
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
|
+
}
|
|
285
353
|
process.exit(1);
|
|
286
354
|
}
|
|
287
355
|
});
|
|
@@ -397,6 +465,41 @@ program
|
|
|
397
465
|
process.exit(1);
|
|
398
466
|
}
|
|
399
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
|
+
});
|
|
400
503
|
// ============ MCP commands ============
|
|
401
504
|
const mcp = program.command("mcp").description("MCP server commands");
|
|
402
505
|
mcp
|
|
@@ -421,5 +524,44 @@ program
|
|
|
421
524
|
.action(async (options) => {
|
|
422
525
|
await runUninstall({ verbose: options.verbose });
|
|
423
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
|
+
});
|
|
424
566
|
program.parse();
|
|
425
567
|
//# sourceMappingURL=index.js.map
|