0pflow 0.1.0-dev.9050dad → 0.1.0-dev.a318c24
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/agent.d.ts +6 -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/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 +101 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +32 -2
- package/dist/cli/install.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 +13 -4
- package/dist/cli/mcp/tools/createApp.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 +117 -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 +101 -1
- package/dist/cli/mcp/tools/index.d.ts.map +1 -1
- package/dist/cli/mcp/tools/index.js +18 -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 +33 -33
- package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -1
- package/dist/cli/mcp/tools/startDevUi.d.ts +15 -0
- package/dist/cli/mcp/tools/startDevUi.d.ts.map +1 -0
- package/dist/cli/mcp/tools/startDevUi.js +92 -0
- package/dist/cli/mcp/tools/startDevUi.js.map +1 -0
- 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/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 +44 -0
- package/dist/connections/resolver.js.map +1 -0
- package/dist/connections/schema.d.ts +6 -0
- package/dist/connections/schema.d.ts.map +1 -0
- package/dist/connections/schema.js +25 -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 +13 -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 +728 -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 +14 -0
- package/dist/dev-ui/dev-server.d.ts.map +1 -0
- package/dist/dev-ui/dev-server.js +158 -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/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 +27 -0
- package/dist/dev-ui/ws.d.ts.map +1 -0
- package/dist/dev-ui/ws.js +19 -0
- package/dist/dev-ui/ws.js.map +1 -0
- package/dist/dev-ui-client/assets/index-B5wNJx8a.js +77 -0
- package/dist/dev-ui-client/assets/index-DAKTQEvj.js +1 -0
- package/dist/dev-ui-client/assets/index-DpOZNNnF.css +1 -0
- package/dist/dev-ui-client/index.html +13 -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 +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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/types.d.ts +19 -1
- 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 +90 -2
- package/dist/workflow.js.map +1 -1
- package/package.json +18 -3
- package/templates/app/package.json +2 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const inputSchema = {
|
|
6
|
+
port: z
|
|
7
|
+
.number()
|
|
8
|
+
.optional()
|
|
9
|
+
.describe("Preferred port (default 4173). Falls back to an available port if taken."),
|
|
10
|
+
};
|
|
11
|
+
const outputSchema = {
|
|
12
|
+
url: z.string().optional().describe("Dev UI URL (e.g. http://localhost:4173)"),
|
|
13
|
+
port: z.number().optional().describe("Actual port the server is running on"),
|
|
14
|
+
already_running: z
|
|
15
|
+
.boolean()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("True if the server was already running from a previous call"),
|
|
18
|
+
error: z.string().optional().describe("Error message if the server could not start"),
|
|
19
|
+
};
|
|
20
|
+
// Module-level singleton state
|
|
21
|
+
let devServer = null;
|
|
22
|
+
export const startDevUiFactory = () => {
|
|
23
|
+
return {
|
|
24
|
+
name: "start_dev_ui",
|
|
25
|
+
config: {
|
|
26
|
+
title: "Start Dev UI",
|
|
27
|
+
description: "Start the 0pflow Dev UI server for visualizing workflow DAGs. " +
|
|
28
|
+
"Returns the URL with the actual port. Idempotent — if already running, returns existing URL. " +
|
|
29
|
+
"Automatically picks an available port if the default (4173) is taken.",
|
|
30
|
+
inputSchema,
|
|
31
|
+
outputSchema,
|
|
32
|
+
},
|
|
33
|
+
fn: async ({ port }) => {
|
|
34
|
+
// Singleton: if already running, return existing info
|
|
35
|
+
if (devServer) {
|
|
36
|
+
return {
|
|
37
|
+
url: devServer.url,
|
|
38
|
+
port: devServer.port,
|
|
39
|
+
already_running: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Check that the dev-ui client has been built (find package root first)
|
|
43
|
+
let pkgRoot = dirname(fileURLToPath(import.meta.url));
|
|
44
|
+
while (!existsSync(resolve(pkgRoot, "package.json"))) {
|
|
45
|
+
const parent = dirname(pkgRoot);
|
|
46
|
+
if (parent === pkgRoot)
|
|
47
|
+
break;
|
|
48
|
+
pkgRoot = parent;
|
|
49
|
+
}
|
|
50
|
+
const clientIndex = resolve(pkgRoot, "dist/dev-ui-client/index.html");
|
|
51
|
+
if (!existsSync(clientIndex)) {
|
|
52
|
+
return {
|
|
53
|
+
error: "Dev UI client not built. Run: pnpm --filter 0pflow build",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Load .env for DATABASE_URL and NANGO_SECRET_KEY (best-effort)
|
|
57
|
+
try {
|
|
58
|
+
const { resolveEnv } = await import("../../env.js");
|
|
59
|
+
resolveEnv();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Dev UI works without env — connections API just won't be available
|
|
63
|
+
}
|
|
64
|
+
const { startDevServer } = await import("../../../dev-ui/index.js");
|
|
65
|
+
const result = await startDevServer({
|
|
66
|
+
projectRoot: process.cwd(),
|
|
67
|
+
port: port ?? 4173,
|
|
68
|
+
quiet: true, // Critical: suppress stdout in MCP stdio transport
|
|
69
|
+
databaseUrl: process.env.DATABASE_URL,
|
|
70
|
+
nangoSecretKey: process.env.NANGO_SECRET_KEY,
|
|
71
|
+
});
|
|
72
|
+
devServer = {
|
|
73
|
+
url: result.url,
|
|
74
|
+
port: result.port,
|
|
75
|
+
cleanup: result.cleanup,
|
|
76
|
+
};
|
|
77
|
+
// Safety net: clean up if stdin closes (Claude Code exited)
|
|
78
|
+
process.stdin.on("end", () => {
|
|
79
|
+
if (devServer) {
|
|
80
|
+
devServer.cleanup().catch(() => { });
|
|
81
|
+
devServer = null;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
url: result.url,
|
|
86
|
+
port: result.port,
|
|
87
|
+
already_running: false,
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=startDevUi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startDevUi.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/startDevUi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/utils.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAGD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import dotenv from "dotenv";
|
|
4
|
+
/**
|
|
5
|
+
* Load .env directly from cwd — NOT via resolveEnv() which walks up
|
|
6
|
+
* the directory tree and may find a parent .env instead of the app's.
|
|
7
|
+
* Uses override: true so the app's values always win.
|
|
8
|
+
*/
|
|
9
|
+
function loadProjectEnv() {
|
|
10
|
+
const envPath = join(process.cwd(), ".env");
|
|
11
|
+
if (existsSync(envPath)) {
|
|
12
|
+
dotenv.config({ path: envPath, override: true, quiet: true });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load .env from cwd and return DATABASE_URL.
|
|
17
|
+
* Throws with a helpful message if not found.
|
|
18
|
+
*/
|
|
19
|
+
export function requireDatabaseUrl() {
|
|
20
|
+
loadProjectEnv();
|
|
21
|
+
const url = process.env.DATABASE_URL;
|
|
22
|
+
if (!url)
|
|
23
|
+
throw new Error("DATABASE_URL not set in .env");
|
|
24
|
+
return url;
|
|
25
|
+
}
|
|
26
|
+
// Re-export parseOutput for MCP tools to unwrap superjson DB rows
|
|
27
|
+
export { parseOutput } from "../../trace.js";
|
|
28
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;;;GAIG;AACH,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,cAAc,EAAE,CAAC;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kEAAkE;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/cli/trace.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ export interface TraceResult {
|
|
|
24
24
|
* Get workflow trace including all operations and child workflows
|
|
25
25
|
*/
|
|
26
26
|
export declare function getTrace(databaseUrl: string, runId: string, schemaOverride?: string): Promise<TraceResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Parse and unwrap DBOS/superjson output format
|
|
29
|
+
* Handles: raw values, JSON strings, and {"json": ..., "__dbos_serializer": "superjson"} wrappers
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseOutput(output: unknown): unknown;
|
|
27
32
|
/**
|
|
28
33
|
* Print a workflow trace as a tree to stdout
|
|
29
34
|
*/
|
package/dist/cli/trace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/cli/trace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CAatB;
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/cli/trace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CAatB;AAkGD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAYpD;AAgCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAiInD"}
|
package/dist/cli/trace.js
CHANGED
|
@@ -103,7 +103,7 @@ function formatDuration(ms) {
|
|
|
103
103
|
* Parse and unwrap DBOS/superjson output format
|
|
104
104
|
* Handles: raw values, JSON strings, and {"json": ..., "__dbos_serializer": "superjson"} wrappers
|
|
105
105
|
*/
|
|
106
|
-
function parseOutput(output) {
|
|
106
|
+
export function parseOutput(output) {
|
|
107
107
|
if (output === null || output === undefined)
|
|
108
108
|
return null;
|
|
109
109
|
try {
|
package/dist/cli/trace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/cli/trace.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/cli/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the stored API token, or null if not authenticated.
|
|
3
|
+
*/
|
|
4
|
+
export declare function getToken(): string | null;
|
|
5
|
+
/**
|
|
6
|
+
* Save an API token and server URL to ~/.0pflow/credentials.
|
|
7
|
+
*/
|
|
8
|
+
export declare function saveToken(token: string, serverUrl?: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Check if the user is authenticated (has a stored token).
|
|
11
|
+
*/
|
|
12
|
+
export declare function isAuthenticated(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Get the server URL from stored credentials, or the default.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getServerUrl(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Open a URL in the user's default browser.
|
|
19
|
+
*/
|
|
20
|
+
export declare function openBrowser(url: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Error indicating the user needs to approve the auth session in their browser.
|
|
23
|
+
*/
|
|
24
|
+
export declare class AuthRequiredError extends Error {
|
|
25
|
+
readonly authUrl: string;
|
|
26
|
+
constructor(authUrl: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Perform browser-based CLI authentication (two-phase, non-blocking).
|
|
30
|
+
*
|
|
31
|
+
* Phase 1 (no pending session):
|
|
32
|
+
* - Creates a session, opens browser, polls briefly (~16s)
|
|
33
|
+
* - If approved quickly: saves token, returns
|
|
34
|
+
* - If not: saves pending session, throws AuthRequiredError with URL
|
|
35
|
+
*
|
|
36
|
+
* Phase 2 (pending session exists):
|
|
37
|
+
* - Checks if the pending session was approved
|
|
38
|
+
* - If approved: saves token, clears pending, returns
|
|
39
|
+
* - If not: throws AuthRequiredError with URL again
|
|
40
|
+
*/
|
|
41
|
+
export declare function authenticate(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Clear stored credentials (logout).
|
|
44
|
+
*/
|
|
45
|
+
export declare function logout(): void;
|
|
46
|
+
//# sourceMappingURL=cloud-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-auth.d.ts","sourceRoot":"","sources":["../../src/connections/cloud-auth.ts"],"names":[],"mappings":"AA+FA;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CAOxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAOjE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiB7C;AA0CD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAgB,OAAO,EAAE,MAAM,CAAC;gBAEpB,OAAO,EAAE,MAAM;CAS5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DlD;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAS7B"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI authentication for the 0pflow cloud server.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from the Pencil MCP auth pattern:
|
|
5
|
+
* /Users/cevian/Development/pencil/packages/mcp-server/src/auth.ts
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. MCP/CLI calls authenticate()
|
|
9
|
+
* 2. Creates session on server → gets {code, secret}
|
|
10
|
+
* 3. Opens browser to /auth/cli?cli_code=X
|
|
11
|
+
* 4. User signs in (GitHub OAuth) and approves
|
|
12
|
+
* 5. Polls server until approved → saves token to ~/.0pflow/credentials
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { exec } from "node:child_process";
|
|
18
|
+
const CREDENTIALS_DIR = join(homedir(), ".0pflow");
|
|
19
|
+
const CREDENTIALS_FILE = join(CREDENTIALS_DIR, "credentials");
|
|
20
|
+
const PENDING_AUTH_FILE = join(CREDENTIALS_DIR, "pending_auth");
|
|
21
|
+
const DEFAULT_SERVER_URL = process.env.OPFLOW_SERVER_URL ?? "https://auth-server-vert.vercel.app";
|
|
22
|
+
const POLL_INTERVAL_MS = 2000;
|
|
23
|
+
const QUICK_POLL_ATTEMPTS = 8; // ~16 seconds
|
|
24
|
+
function ensureDir() {
|
|
25
|
+
if (!existsSync(CREDENTIALS_DIR)) {
|
|
26
|
+
mkdirSync(CREDENTIALS_DIR, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function readCredentials() {
|
|
30
|
+
try {
|
|
31
|
+
if (!existsSync(CREDENTIALS_FILE)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const raw = readFileSync(CREDENTIALS_FILE, "utf-8");
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
if (!parsed.token) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function readPendingAuth() {
|
|
46
|
+
try {
|
|
47
|
+
if (!existsSync(PENDING_AUTH_FILE)) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const raw = readFileSync(PENDING_AUTH_FILE, "utf-8");
|
|
51
|
+
const parsed = JSON.parse(raw);
|
|
52
|
+
// Expire after 5 minutes
|
|
53
|
+
if (Date.now() - parsed.createdAt > 5 * 60 * 1000) {
|
|
54
|
+
unlinkSync(PENDING_AUTH_FILE);
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function savePendingAuth(pending) {
|
|
64
|
+
ensureDir();
|
|
65
|
+
writeFileSync(PENDING_AUTH_FILE, JSON.stringify(pending, null, 2), "utf-8");
|
|
66
|
+
}
|
|
67
|
+
function clearPendingAuth() {
|
|
68
|
+
try {
|
|
69
|
+
if (existsSync(PENDING_AUTH_FILE)) {
|
|
70
|
+
unlinkSync(PENDING_AUTH_FILE);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// ignore
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the stored API token, or null if not authenticated.
|
|
79
|
+
*/
|
|
80
|
+
export function getToken() {
|
|
81
|
+
// Environment variable takes precedence (for cloud deployments)
|
|
82
|
+
if (process.env.OPFLOW_TOKEN) {
|
|
83
|
+
return process.env.OPFLOW_TOKEN;
|
|
84
|
+
}
|
|
85
|
+
const creds = readCredentials();
|
|
86
|
+
return creds?.token ?? null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Save an API token and server URL to ~/.0pflow/credentials.
|
|
90
|
+
*/
|
|
91
|
+
export function saveToken(token, serverUrl) {
|
|
92
|
+
ensureDir();
|
|
93
|
+
const credentials = {
|
|
94
|
+
token,
|
|
95
|
+
serverUrl: serverUrl ?? DEFAULT_SERVER_URL,
|
|
96
|
+
};
|
|
97
|
+
writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), "utf-8");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if the user is authenticated (has a stored token).
|
|
101
|
+
*/
|
|
102
|
+
export function isAuthenticated() {
|
|
103
|
+
return getToken() !== null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the server URL from stored credentials, or the default.
|
|
107
|
+
*/
|
|
108
|
+
export function getServerUrl() {
|
|
109
|
+
const creds = readCredentials();
|
|
110
|
+
return creds?.serverUrl ?? DEFAULT_SERVER_URL;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Open a URL in the user's default browser.
|
|
114
|
+
*/
|
|
115
|
+
export function openBrowser(url) {
|
|
116
|
+
const platform = process.platform;
|
|
117
|
+
let command;
|
|
118
|
+
if (platform === "darwin") {
|
|
119
|
+
command = `open "${url}"`;
|
|
120
|
+
}
|
|
121
|
+
else if (platform === "win32") {
|
|
122
|
+
command = `start "" "${url}"`;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
command = `xdg-open "${url}"`;
|
|
126
|
+
}
|
|
127
|
+
exec(command, (error) => {
|
|
128
|
+
if (error) {
|
|
129
|
+
process.stderr.write(`Failed to open browser: ${error.message}\n`);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function sleep(ms) {
|
|
134
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check a pending auth session's status.
|
|
138
|
+
*/
|
|
139
|
+
async function checkPendingSession(serverUrl, code, secret) {
|
|
140
|
+
try {
|
|
141
|
+
const checkResponse = await fetch(`${serverUrl}/api/auth/cli/check?code=${encodeURIComponent(code)}&secret=${encodeURIComponent(secret)}`);
|
|
142
|
+
if (!checkResponse.ok)
|
|
143
|
+
return null;
|
|
144
|
+
const checkData = (await checkResponse.json());
|
|
145
|
+
if (checkData.data.status === "approved" && checkData.data.token) {
|
|
146
|
+
return { token: checkData.data.token };
|
|
147
|
+
}
|
|
148
|
+
if (checkData.data.status === "expired") {
|
|
149
|
+
clearPendingAuth();
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Error indicating the user needs to approve the auth session in their browser.
|
|
159
|
+
*/
|
|
160
|
+
export class AuthRequiredError extends Error {
|
|
161
|
+
authUrl;
|
|
162
|
+
constructor(authUrl) {
|
|
163
|
+
super(`Authentication required. I've opened your browser to authorize access.\n\n` +
|
|
164
|
+
`If the browser didn't open, visit this URL:\n${authUrl}\n\n` +
|
|
165
|
+
`After you approve access in the browser, retry this command.`);
|
|
166
|
+
this.name = "AuthRequiredError";
|
|
167
|
+
this.authUrl = authUrl;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Perform browser-based CLI authentication (two-phase, non-blocking).
|
|
172
|
+
*
|
|
173
|
+
* Phase 1 (no pending session):
|
|
174
|
+
* - Creates a session, opens browser, polls briefly (~16s)
|
|
175
|
+
* - If approved quickly: saves token, returns
|
|
176
|
+
* - If not: saves pending session, throws AuthRequiredError with URL
|
|
177
|
+
*
|
|
178
|
+
* Phase 2 (pending session exists):
|
|
179
|
+
* - Checks if the pending session was approved
|
|
180
|
+
* - If approved: saves token, clears pending, returns
|
|
181
|
+
* - If not: throws AuthRequiredError with URL again
|
|
182
|
+
*/
|
|
183
|
+
export async function authenticate() {
|
|
184
|
+
const serverUrl = DEFAULT_SERVER_URL;
|
|
185
|
+
// Phase 2: Check if a pending session was approved
|
|
186
|
+
const pending = readPendingAuth();
|
|
187
|
+
if (pending) {
|
|
188
|
+
const result = await checkPendingSession(pending.serverUrl, pending.code, pending.secret);
|
|
189
|
+
if (result) {
|
|
190
|
+
saveToken(result.token, pending.serverUrl);
|
|
191
|
+
clearPendingAuth();
|
|
192
|
+
process.stderr.write("Authentication successful! Token saved.\n");
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Still pending — tell user to approve
|
|
196
|
+
throw new AuthRequiredError(pending.authUrl);
|
|
197
|
+
}
|
|
198
|
+
// Phase 1: Create a new session
|
|
199
|
+
const createResponse = await fetch(`${serverUrl}/api/auth/cli/session`, {
|
|
200
|
+
method: "POST",
|
|
201
|
+
headers: { "Content-Type": "application/json" },
|
|
202
|
+
});
|
|
203
|
+
if (!createResponse.ok) {
|
|
204
|
+
const errorText = await createResponse.text();
|
|
205
|
+
throw new Error(`Failed to create auth session: ${errorText}`);
|
|
206
|
+
}
|
|
207
|
+
const createData = (await createResponse.json());
|
|
208
|
+
const { code, secret } = createData.data;
|
|
209
|
+
const authUrl = `${serverUrl}/auth/cli?cli_code=${code}`;
|
|
210
|
+
// Save pending session so Phase 2 can pick it up
|
|
211
|
+
savePendingAuth({ code, secret, authUrl, serverUrl, createdAt: Date.now() });
|
|
212
|
+
// Open browser and print URL
|
|
213
|
+
process.stderr.write(`\nOpen this URL to authenticate:\n ${authUrl}\n\n`);
|
|
214
|
+
openBrowser(authUrl);
|
|
215
|
+
// Quick poll: give the user ~16 seconds to approve
|
|
216
|
+
for (let attempt = 0; attempt < QUICK_POLL_ATTEMPTS; attempt++) {
|
|
217
|
+
await sleep(POLL_INTERVAL_MS);
|
|
218
|
+
const result = await checkPendingSession(serverUrl, code, secret);
|
|
219
|
+
if (result) {
|
|
220
|
+
saveToken(result.token, serverUrl);
|
|
221
|
+
clearPendingAuth();
|
|
222
|
+
process.stderr.write("Authentication successful! Token saved.\n");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Not approved yet — throw with helpful message
|
|
227
|
+
throw new AuthRequiredError(authUrl);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Clear stored credentials (logout).
|
|
231
|
+
*/
|
|
232
|
+
export function logout() {
|
|
233
|
+
try {
|
|
234
|
+
if (existsSync(CREDENTIALS_FILE)) {
|
|
235
|
+
unlinkSync(CREDENTIALS_FILE);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// ignore
|
|
240
|
+
}
|
|
241
|
+
clearPendingAuth();
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=cloud-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-auth.js","sourceRoot":"","sources":["../../src/connections/cloud-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the 0pflow cloud server.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from the Pencil MCP client pattern:
|
|
5
|
+
* /Users/cevian/Development/pencil/packages/mcp-server/src/client.ts
|
|
6
|
+
*
|
|
7
|
+
* Makes authenticated API calls using the token from cloud-auth.ts.
|
|
8
|
+
* Auto-triggers authenticate() when not authenticated.
|
|
9
|
+
*/
|
|
10
|
+
import { AuthRequiredError } from "./cloud-auth.js";
|
|
11
|
+
export declare class AuthError extends Error {
|
|
12
|
+
constructor(message?: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class ApiError extends Error {
|
|
15
|
+
readonly status: number;
|
|
16
|
+
constructor(status: number, message: string);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Make an authenticated HTTP call to the 0pflow cloud server.
|
|
20
|
+
* Returns the parsed response data (the `data` field from the response).
|
|
21
|
+
* Throws AuthError if not authenticated, ApiError if the request fails.
|
|
22
|
+
*/
|
|
23
|
+
export declare function apiCall(method: string, path: string, body?: Record<string, unknown>): Promise<unknown>;
|
|
24
|
+
export { AuthRequiredError };
|
|
25
|
+
//# sourceMappingURL=cloud-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../../src/connections/cloud-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAKL,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,CAAC,EAAE,MAAM;CAO7B;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the 0pflow cloud server.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from the Pencil MCP client pattern:
|
|
5
|
+
* /Users/cevian/Development/pencil/packages/mcp-server/src/client.ts
|
|
6
|
+
*
|
|
7
|
+
* Makes authenticated API calls using the token from cloud-auth.ts.
|
|
8
|
+
* Auto-triggers authenticate() when not authenticated.
|
|
9
|
+
*/
|
|
10
|
+
import { getToken, getServerUrl, isAuthenticated, authenticate, AuthRequiredError, } from "./cloud-auth.js";
|
|
11
|
+
export class AuthError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message ??
|
|
14
|
+
"Not authenticated with 0pflow cloud. Run `0pflow login` or set OPFLOW_TOKEN.");
|
|
15
|
+
this.name = "AuthError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class ApiError extends Error {
|
|
19
|
+
status;
|
|
20
|
+
constructor(status, message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "ApiError";
|
|
23
|
+
this.status = status;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Make an authenticated HTTP call to the 0pflow cloud server.
|
|
28
|
+
* Returns the parsed response data (the `data` field from the response).
|
|
29
|
+
* Throws AuthError if not authenticated, ApiError if the request fails.
|
|
30
|
+
*/
|
|
31
|
+
export async function apiCall(method, path, body) {
|
|
32
|
+
if (!isAuthenticated()) {
|
|
33
|
+
// Attempt browser-based authentication (non-blocking, ~16s max)
|
|
34
|
+
await authenticate();
|
|
35
|
+
if (!isAuthenticated()) {
|
|
36
|
+
throw new AuthError();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const token = getToken();
|
|
40
|
+
const serverUrl = getServerUrl();
|
|
41
|
+
const headers = {
|
|
42
|
+
Authorization: `Bearer ${token}`,
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
};
|
|
45
|
+
const response = await fetch(`${serverUrl}${path}`, {
|
|
46
|
+
method,
|
|
47
|
+
headers,
|
|
48
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
49
|
+
});
|
|
50
|
+
const responseData = (await response.json());
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const errorMessage = responseData.error ??
|
|
53
|
+
`HTTP ${response.status}: ${response.statusText}`;
|
|
54
|
+
throw new ApiError(response.status, errorMessage);
|
|
55
|
+
}
|
|
56
|
+
return responseData.data;
|
|
57
|
+
}
|
|
58
|
+
export { AuthRequiredError };
|
|
59
|
+
//# sourceMappingURL=cloud-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../../src/connections/cloud-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAgB;QAC1B,KAAK,CACH,OAAO;YACL,8EAA8E,CACjF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,MAAM,CAAS;IAE/B,YAAY,MAAc,EAAE,OAAe;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,IAAY,EACZ,IAA8B;IAE9B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,gEAAgE;QAChE,MAAM,YAAY,EAAE,CAAC;QAErB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,EAAG,CAAC;IAC1B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,KAAK,EAAE;QAChC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,IAAI,EAAE,EAAE;QAClD,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;IAExE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GACf,YAAY,CAAC,KAAgB;YAC9B,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC;AAC3B,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IntegrationProvider } from "./integration-provider.js";
|
|
2
|
+
import type { ConnectionCredentials } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* IntegrationProvider backed by the 0pflow cloud server (hosted mode).
|
|
5
|
+
* All Nango operations are proxied through the server — no NANGO_SECRET_KEY needed locally.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CloudIntegrationProvider implements IntegrationProvider {
|
|
8
|
+
fetchCredentials(integrationId: string, connectionId: string): Promise<ConnectionCredentials>;
|
|
9
|
+
listIntegrations(): Promise<Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
provider: string;
|
|
12
|
+
}>>;
|
|
13
|
+
listConnections(integrationId: string): Promise<Array<{
|
|
14
|
+
connection_id: string;
|
|
15
|
+
provider_config_key: string;
|
|
16
|
+
}>>;
|
|
17
|
+
createConnectSession(integrationId: string): Promise<{
|
|
18
|
+
token: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=cloud-integration-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-integration-provider.d.ts","sourceRoot":"","sources":["../../src/connections/cloud-integration-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAC5D,gBAAgB,CACpB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC;IAS3B,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAQpE,eAAe,CACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAQnE,oBAAoB,CACxB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAM9B"}
|