0pflow 0.1.0-dev.00aaa03
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__/agent-parser.test.d.ts +2 -0
- package/dist/__tests__/agent-parser.test.d.ts.map +1 -0
- package/dist/__tests__/agent-parser.test.js +64 -0
- package/dist/__tests__/agent-parser.test.js.map +1 -0
- package/dist/__tests__/agent.e2e.test.d.ts +2 -0
- package/dist/__tests__/agent.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/agent.e2e.test.js +90 -0
- package/dist/__tests__/agent.e2e.test.js.map +1 -0
- package/dist/__tests__/agent.test.d.ts +2 -0
- package/dist/__tests__/agent.test.d.ts.map +1 -0
- package/dist/__tests__/agent.test.js +30 -0
- package/dist/__tests__/agent.test.js.map +1 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +53 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/dbos.test.d.ts +2 -0
- package/dist/__tests__/dbos.test.d.ts.map +1 -0
- package/dist/__tests__/dbos.test.js +35 -0
- package/dist/__tests__/dbos.test.js.map +1 -0
- package/dist/__tests__/factory.test.d.ts +2 -0
- package/dist/__tests__/factory.test.d.ts.map +1 -0
- package/dist/__tests__/factory.test.js +126 -0
- package/dist/__tests__/factory.test.js.map +1 -0
- package/dist/__tests__/integration.e2e.test.d.ts +2 -0
- package/dist/__tests__/integration.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/integration.e2e.test.js +127 -0
- package/dist/__tests__/integration.e2e.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +103 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/model-config.test.d.ts +2 -0
- package/dist/__tests__/model-config.test.d.ts.map +1 -0
- package/dist/__tests__/model-config.test.js +48 -0
- package/dist/__tests__/model-config.test.js.map +1 -0
- package/dist/__tests__/node-registry.test.d.ts +2 -0
- package/dist/__tests__/node-registry.test.d.ts.map +1 -0
- package/dist/__tests__/node-registry.test.js +63 -0
- package/dist/__tests__/node-registry.test.js.map +1 -0
- package/dist/__tests__/node.test.d.ts +2 -0
- package/dist/__tests__/node.test.d.ts.map +1 -0
- package/dist/__tests__/node.test.js +48 -0
- package/dist/__tests__/node.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +62 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/web-tool.test.d.ts +2 -0
- package/dist/__tests__/web-tool.test.d.ts.map +1 -0
- package/dist/__tests__/web-tool.test.js +99 -0
- package/dist/__tests__/web-tool.test.js.map +1 -0
- package/dist/__tests__/workflow.test.d.ts +2 -0
- package/dist/__tests__/workflow.test.d.ts.map +1 -0
- package/dist/__tests__/workflow.test.js +49 -0
- package/dist/__tests__/workflow.test.js.map +1 -0
- package/dist/agent.d.ts +46 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +75 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli/__tests__/discovery.test.d.ts +2 -0
- package/dist/cli/__tests__/discovery.test.d.ts.map +1 -0
- package/dist/cli/__tests__/discovery.test.js +26 -0
- package/dist/cli/__tests__/discovery.test.js.map +1 -0
- package/dist/cli/__tests__/env.test.d.ts +2 -0
- package/dist/cli/__tests__/env.test.d.ts.map +1 -0
- package/dist/cli/__tests__/env.test.js +32 -0
- package/dist/cli/__tests__/env.test.js.map +1 -0
- package/dist/cli/__tests__/runs.test.d.ts +2 -0
- package/dist/cli/__tests__/runs.test.d.ts.map +1 -0
- package/dist/cli/__tests__/runs.test.js +46 -0
- package/dist/cli/__tests__/runs.test.js.map +1 -0
- package/dist/cli/app.d.ts +6 -0
- package/dist/cli/app.d.ts.map +1 -0
- package/dist/cli/app.js +21 -0
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/discovery.d.ts +24 -0
- package/dist/cli/discovery.d.ts.map +1 -0
- package/dist/cli/discovery.js +88 -0
- package/dist/cli/discovery.js.map +1 -0
- package/dist/cli/env.d.ts +15 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +54 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +423 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +54 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +217 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/mcp/config.d.ts +5 -0
- package/dist/cli/mcp/config.d.ts.map +1 -0
- package/dist/cli/mcp/config.js +14 -0
- package/dist/cli/mcp/config.js.map +1 -0
- package/dist/cli/mcp/lib/templates.d.ts +12 -0
- package/dist/cli/mcp/lib/templates.d.ts.map +1 -0
- package/dist/cli/mcp/lib/templates.js +77 -0
- package/dist/cli/mcp/lib/templates.js.map +1 -0
- package/dist/cli/mcp/server.d.ts +5 -0
- package/dist/cli/mcp/server.d.ts.map +1 -0
- package/dist/cli/mcp/server.js +15 -0
- package/dist/cli/mcp/server.js.map +1 -0
- package/dist/cli/mcp/serverInfo.d.ts +7 -0
- package/dist/cli/mcp/serverInfo.d.ts.map +1 -0
- package/dist/cli/mcp/serverInfo.js +7 -0
- package/dist/cli/mcp/serverInfo.js.map +1 -0
- package/dist/cli/mcp/tools/createApp.d.ts +15 -0
- package/dist/cli/mcp/tools/createApp.d.ts.map +1 -0
- package/dist/cli/mcp/tools/createApp.js +81 -0
- package/dist/cli/mcp/tools/createApp.js.map +1 -0
- package/dist/cli/mcp/tools/createDatabase.d.ts +14 -0
- package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -0
- package/dist/cli/mcp/tools/createDatabase.js +66 -0
- package/dist/cli/mcp/tools/createDatabase.js.map +1 -0
- package/dist/cli/mcp/tools/index.d.ts +24 -0
- package/dist/cli/mcp/tools/index.d.ts.map +1 -0
- package/dist/cli/mcp/tools/index.js +11 -0
- package/dist/cli/mcp/tools/index.js.map +1 -0
- package/dist/cli/mcp/tools/setupAppSchema.d.ts +17 -0
- package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -0
- package/dist/cli/mcp/tools/setupAppSchema.js +157 -0
- package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -0
- package/dist/cli/mcp/types.d.ts +3 -0
- package/dist/cli/mcp/types.d.ts.map +1 -0
- package/dist/cli/mcp/types.js +2 -0
- package/dist/cli/mcp/types.js.map +1 -0
- package/dist/cli/runs.d.ts +28 -0
- package/dist/cli/runs.d.ts.map +1 -0
- package/dist/cli/runs.js +70 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/trace.d.ts +31 -0
- package/dist/cli/trace.d.ts.map +1 -0
- package/dist/cli/trace.js +264 -0
- package/dist/cli/trace.js.map +1 -0
- package/dist/context.d.ts +13 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +25 -0
- package/dist/context.js.map +1 -0
- package/dist/dbos.d.ts +15 -0
- package/dist/dbos.d.ts.map +1 -0
- package/dist/dbos.js +27 -0
- package/dist/dbos.js.map +1 -0
- package/dist/factory.d.ts +6 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +78 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +19 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +16 -0
- package/dist/node.js.map +1 -0
- package/dist/nodes/agent/executor.d.ts +70 -0
- package/dist/nodes/agent/executor.d.ts.map +1 -0
- package/dist/nodes/agent/executor.js +230 -0
- package/dist/nodes/agent/executor.js.map +1 -0
- package/dist/nodes/agent/index.d.ts +7 -0
- package/dist/nodes/agent/index.d.ts.map +1 -0
- package/dist/nodes/agent/index.js +5 -0
- package/dist/nodes/agent/index.js.map +1 -0
- package/dist/nodes/agent/model-config.d.ts +42 -0
- package/dist/nodes/agent/model-config.d.ts.map +1 -0
- package/dist/nodes/agent/model-config.js +58 -0
- package/dist/nodes/agent/model-config.js.map +1 -0
- package/dist/nodes/agent/parser.d.ts +22 -0
- package/dist/nodes/agent/parser.d.ts.map +1 -0
- package/dist/nodes/agent/parser.js +42 -0
- package/dist/nodes/agent/parser.js.map +1 -0
- package/dist/nodes/builtin/index.d.ts +9 -0
- package/dist/nodes/builtin/index.d.ts.map +1 -0
- package/dist/nodes/builtin/index.js +10 -0
- package/dist/nodes/builtin/index.js.map +1 -0
- package/dist/nodes/builtin/web.d.ts +25 -0
- package/dist/nodes/builtin/web.d.ts.map +1 -0
- package/dist/nodes/builtin/web.js +86 -0
- package/dist/nodes/builtin/web.js.map +1 -0
- package/dist/nodes/registry.d.ts +32 -0
- package/dist/nodes/registry.d.ts.map +1 -0
- package/dist/nodes/registry.js +58 -0
- package/dist/nodes/registry.js.map +1 -0
- package/dist/registry.d.ts +31 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +44 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow.d.ts +26 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +50 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createAppFactory } from "./createApp.js";
|
|
2
|
+
import { createDatabaseFactory } from "./createDatabase.js";
|
|
3
|
+
import { setupAppSchemaFactory } from "./setupAppSchema.js";
|
|
4
|
+
export async function getApiFactories() {
|
|
5
|
+
return [
|
|
6
|
+
createAppFactory,
|
|
7
|
+
createDatabaseFactory,
|
|
8
|
+
setupAppSchemaFactory,
|
|
9
|
+
];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO;QACL,gBAAgB;QAChB,qBAAqB;QACrB,qBAAqB;KACb,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ApiFactory } from "@tigerdata/mcp-boilerplate";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { ServerContext } from "../types.js";
|
|
4
|
+
declare const inputSchema: {
|
|
5
|
+
readonly application_directory: z.ZodString;
|
|
6
|
+
readonly service_id: z.ZodString;
|
|
7
|
+
readonly app_name: z.ZodString;
|
|
8
|
+
};
|
|
9
|
+
declare const outputSchema: {
|
|
10
|
+
readonly success: z.ZodBoolean;
|
|
11
|
+
readonly message: z.ZodString;
|
|
12
|
+
readonly schema_name: z.ZodOptional<z.ZodString>;
|
|
13
|
+
readonly user_name: z.ZodOptional<z.ZodString>;
|
|
14
|
+
};
|
|
15
|
+
export declare const setupAppSchemaFactory: ApiFactory<ServerContext, typeof inputSchema, typeof outputSchema>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=setupAppSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupAppSchema.d.ts","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/setupAppSchema.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,QAAA,MAAM,WAAW;;;;CAcP,CAAC;AAEX,QAAA,MAAM,YAAY;;;;;CAKR,CAAC;AAiCX,eAAO,MAAM,qBAAqB,EAAE,UAAU,CAC5C,aAAa,EACb,OAAO,WAAW,EAClB,OAAO,YAAY,CAyJpB,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import * as dotenv from "dotenv";
|
|
7
|
+
import postgres from "postgres";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
const execAsync = promisify(exec);
|
|
10
|
+
const inputSchema = {
|
|
11
|
+
application_directory: z
|
|
12
|
+
.string()
|
|
13
|
+
.describe("Path to the application directory"),
|
|
14
|
+
service_id: z.string().describe("Tiger Cloud service ID for the database"),
|
|
15
|
+
app_name: z
|
|
16
|
+
.string()
|
|
17
|
+
.regex(/^[a-z][a-z0-9_]*$/, "App name must be lowercase alphanumeric with underscores, starting with a letter")
|
|
18
|
+
.describe("Application name (used for schema and user name, must be lowercase with underscores)"),
|
|
19
|
+
};
|
|
20
|
+
const outputSchema = {
|
|
21
|
+
success: z.boolean().describe("Whether app schema setup succeeded"),
|
|
22
|
+
message: z.string().describe("Status message"),
|
|
23
|
+
schema_name: z.string().optional().describe("Name of the created schema"),
|
|
24
|
+
user_name: z.string().optional().describe("Name of the created user"),
|
|
25
|
+
};
|
|
26
|
+
function generatePassword(length = 24) {
|
|
27
|
+
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
28
|
+
let password = "";
|
|
29
|
+
for (let i = 0; i < length; i++) {
|
|
30
|
+
password += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
31
|
+
}
|
|
32
|
+
return password;
|
|
33
|
+
}
|
|
34
|
+
function buildConnectionString(originalUrl, user, password) {
|
|
35
|
+
const parsed = new URL(originalUrl);
|
|
36
|
+
parsed.username = user;
|
|
37
|
+
parsed.password = encodeURIComponent(password);
|
|
38
|
+
if (!parsed.searchParams.has("uselibpqcompat")) {
|
|
39
|
+
parsed.searchParams.set("uselibpqcompat", "true");
|
|
40
|
+
}
|
|
41
|
+
return parsed.toString();
|
|
42
|
+
}
|
|
43
|
+
export const setupAppSchemaFactory = () => {
|
|
44
|
+
return {
|
|
45
|
+
name: "setup_app_schema",
|
|
46
|
+
config: {
|
|
47
|
+
title: "Setup App Schema",
|
|
48
|
+
description: "Set up database schema and user for the application. Creates a PostgreSQL schema and user named after the app, with appropriate permissions, and writes DATABASE_URL to .env.",
|
|
49
|
+
inputSchema,
|
|
50
|
+
outputSchema,
|
|
51
|
+
},
|
|
52
|
+
fn: async ({ application_directory, service_id, app_name, }) => {
|
|
53
|
+
const appDir = resolve(process.cwd(), application_directory);
|
|
54
|
+
const envPath = join(appDir, ".env");
|
|
55
|
+
// Check if we've already run this tool (DATABASE_SCHEMA is only set by us)
|
|
56
|
+
if (existsSync(envPath)) {
|
|
57
|
+
const envContent = await readFile(envPath, "utf-8");
|
|
58
|
+
const env = dotenv.parse(envContent);
|
|
59
|
+
if (env.DATABASE_SCHEMA) {
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
message: "DATABASE_SCHEMA already set in .env. Delete it and re-run if you need to regenerate.",
|
|
63
|
+
schema_name: app_name,
|
|
64
|
+
user_name: app_name,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Get database connection string from Tiger
|
|
69
|
+
let adminConnectionString;
|
|
70
|
+
try {
|
|
71
|
+
const { stdout: serviceJson } = await execAsync(`tiger service get ${service_id} --with-password -o json`);
|
|
72
|
+
const serviceDetails = JSON.parse(serviceJson);
|
|
73
|
+
if (!serviceDetails.connection_string) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
message: "connection_string not found in service details",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
adminConnectionString = serviceDetails.connection_string;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const error = err;
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
message: `Failed to get service details: ${error.message}`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Connect using postgres.js as admin
|
|
89
|
+
const sql = postgres(adminConnectionString);
|
|
90
|
+
try {
|
|
91
|
+
// Check if user already exists
|
|
92
|
+
const existingUser = await sql `
|
|
93
|
+
SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = ${app_name}
|
|
94
|
+
`;
|
|
95
|
+
if (existingUser.length > 0) {
|
|
96
|
+
await sql.end();
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
message: `User '${app_name}' already exists. Choose a different app name or delete the existing user.`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// Create new user
|
|
103
|
+
const appPassword = generatePassword();
|
|
104
|
+
await sql.unsafe(`CREATE ROLE ${app_name} WITH LOGIN PASSWORD '${appPassword}'`);
|
|
105
|
+
// Grant app role to tsdbadmin so admin can access app objects
|
|
106
|
+
await sql.unsafe(`GRANT ${app_name} TO tsdbadmin WITH INHERIT TRUE`);
|
|
107
|
+
// Create app schema owned by the app user
|
|
108
|
+
await sql.unsafe(`CREATE SCHEMA IF NOT EXISTS ${app_name} AUTHORIZATION ${app_name}`);
|
|
109
|
+
// Allow using extensions in public schema, but not creating objects there
|
|
110
|
+
await sql.unsafe(`REVOKE CREATE ON SCHEMA public FROM ${app_name}`);
|
|
111
|
+
await sql.unsafe(`GRANT USAGE ON SCHEMA public TO ${app_name}`);
|
|
112
|
+
// Set search_path for app user (app schema first, then public for extensions)
|
|
113
|
+
await sql.unsafe(`ALTER ROLE ${app_name} SET search_path TO ${app_name}, public`);
|
|
114
|
+
// Append app schema to tsdbadmin's search_path
|
|
115
|
+
const currentPath = await sql `
|
|
116
|
+
SELECT setting FROM pg_settings WHERE name = 'search_path'
|
|
117
|
+
`;
|
|
118
|
+
const existingPath = currentPath[0]?.setting ?? "public";
|
|
119
|
+
if (!existingPath.includes(app_name)) {
|
|
120
|
+
await sql.unsafe(`ALTER ROLE tsdbadmin SET search_path TO ${existingPath}, ${app_name}`);
|
|
121
|
+
}
|
|
122
|
+
await sql.end();
|
|
123
|
+
// Build app connection string
|
|
124
|
+
const appDatabaseUrl = buildConnectionString(adminConnectionString, app_name, appPassword);
|
|
125
|
+
// Write or update .env file
|
|
126
|
+
let envContent = "";
|
|
127
|
+
if (existsSync(envPath)) {
|
|
128
|
+
envContent = await readFile(envPath, "utf-8");
|
|
129
|
+
}
|
|
130
|
+
// Update or add DATABASE_URL and DATABASE_SCHEMA
|
|
131
|
+
const env = dotenv.parse(envContent);
|
|
132
|
+
env.DATABASE_URL = appDatabaseUrl;
|
|
133
|
+
env.DATABASE_SCHEMA = app_name;
|
|
134
|
+
// Rebuild .env content
|
|
135
|
+
const newEnvContent = Object.entries(env)
|
|
136
|
+
.map(([key, value]) => `${key}="${value}"`)
|
|
137
|
+
.join("\n");
|
|
138
|
+
await writeFile(envPath, `${newEnvContent}\n`);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
await sql.end();
|
|
142
|
+
const error = err;
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
message: `Failed to set up app schema: ${error.message}`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
success: true,
|
|
150
|
+
message: `Created schema '${app_name}' and user '${app_name}'. DATABASE_URL and DATABASE_SCHEMA written to .env.`,
|
|
151
|
+
schema_name: app_name,
|
|
152
|
+
user_name: app_name,
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=setupAppSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupAppSchema.js","sourceRoot":"","sources":["../../../../src/cli/mcp/tools/setupAppSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,WAAW,GAAG;IAClB,qBAAqB,EAAE,CAAC;SACrB,MAAM,EAAE;SACR,QAAQ,CAAC,mCAAmC,CAAC;IAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC1E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,KAAK,CACJ,mBAAmB,EACnB,kFAAkF,CACnF;SACA,QAAQ,CACP,sFAAsF,CACvF;CACK,CAAC;AAEX,MAAM,YAAY,GAAG;IACnB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACnE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACzE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC7D,CAAC;AASX,SAAS,gBAAgB,CAAC,MAAM,GAAG,EAAE;IACnC,MAAM,KAAK,GACT,gEAAgE,CAAC;IACnE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAC5B,WAAmB,EACnB,IAAY,EACZ,QAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAI9B,GAAG,EAAE;IACP,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EACT,+KAA+K;YACjL,WAAW;YACX,YAAY;SACb;QACD,EAAE,EAAE,KAAK,EAAE,EACT,qBAAqB,EACrB,UAAU,EACV,QAAQ,GACT,EAAyB,EAAE;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAErC,2EAA2E;YAC3E,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACrC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EACL,sFAAsF;wBACxF,WAAW,EAAE,QAAQ;wBACrB,SAAS,EAAE,QAAQ;qBACpB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,IAAI,qBAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAC7C,qBAAqB,UAAU,0BAA0B,CAC1D,CAAC;gBACF,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAE5C,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC;oBACtC,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,gDAAgD;qBAC1D,CAAC;gBACJ,CAAC;gBACD,qBAAqB,GAAG,cAAc,CAAC,iBAAiB,CAAC;YAC3D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,GAAY,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,kCAAkC,KAAK,CAAC,OAAO,EAAE;iBAC3D,CAAC;YACJ,CAAC;YAED,qCAAqC;YACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YAE5C,IAAI,CAAC;gBACH,+BAA+B;gBAC/B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAA;8DACwB,QAAQ;SAC7D,CAAC;gBAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;oBAChB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,SAAS,QAAQ,4EAA4E;qBACvG,CAAC;gBACJ,CAAC;gBAED,kBAAkB;gBAClB,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;gBACvC,MAAM,GAAG,CAAC,MAAM,CACd,eAAe,QAAQ,yBAAyB,WAAW,GAAG,CAC/D,CAAC;gBAEF,8DAA8D;gBAC9D,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,QAAQ,iCAAiC,CAAC,CAAC;gBAErE,0CAA0C;gBAC1C,MAAM,GAAG,CAAC,MAAM,CACd,+BAA+B,QAAQ,kBAAkB,QAAQ,EAAE,CACpE,CAAC;gBAEF,0EAA0E;gBAC1E,MAAM,GAAG,CAAC,MAAM,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;gBACpE,MAAM,GAAG,CAAC,MAAM,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;gBAEhE,8EAA8E;gBAC9E,MAAM,GAAG,CAAC,MAAM,CACd,cAAc,QAAQ,uBAAuB,QAAQ,UAAU,CAChE,CAAC;gBAEF,+CAA+C;gBAC/C,MAAM,WAAW,GAAG,MAAM,GAAG,CAAA;;SAE5B,CAAC;gBACF,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAC;gBACzD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrC,MAAM,GAAG,CAAC,MAAM,CACd,2CAA2C,YAAY,KAAK,QAAQ,EAAE,CACvE,CAAC;gBACJ,CAAC;gBAED,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;gBAEhB,8BAA8B;gBAC9B,MAAM,cAAc,GAAG,qBAAqB,CAC1C,qBAAqB,EACrB,QAAQ,EACR,WAAW,CACZ,CAAC;gBAEF,4BAA4B;gBAC5B,IAAI,UAAU,GAAG,EAAE,CAAC;gBACpB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAChD,CAAC;gBAED,iDAAiD;gBACjD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACrC,GAAG,CAAC,YAAY,GAAG,cAAc,CAAC;gBAClC,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC;gBAE/B,uBAAuB;gBACvB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;qBACtC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;qBAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,aAAa,IAAI,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,GAAY,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,gCAAgC,KAAK,CAAC,OAAO,EAAE;iBACzD,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,mBAAmB,QAAQ,eAAe,QAAQ,sDAAsD;gBACjH,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,QAAQ;aACpB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/mcp/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAE7D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/mcp/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface WorkflowRun {
|
|
2
|
+
workflow_uuid: string;
|
|
3
|
+
name: string;
|
|
4
|
+
status: string;
|
|
5
|
+
created_at: Date;
|
|
6
|
+
updated_at: Date;
|
|
7
|
+
output: unknown;
|
|
8
|
+
error: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface ListRunsOptions {
|
|
11
|
+
limit?: number;
|
|
12
|
+
workflowName?: string;
|
|
13
|
+
schema?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* List recent workflow runs from DBOS tables
|
|
17
|
+
*/
|
|
18
|
+
export declare function listRuns(databaseUrl: string, options?: ListRunsOptions): Promise<WorkflowRun[]>;
|
|
19
|
+
export interface GetRunResult {
|
|
20
|
+
run: WorkflowRun | null;
|
|
21
|
+
ambiguous?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a specific workflow run by ID or ID prefix (like git short hashes)
|
|
25
|
+
* Returns { run, ambiguous } where ambiguous is true if prefix matched multiple runs
|
|
26
|
+
*/
|
|
27
|
+
export declare function getRun(databaseUrl: string, runId: string, schemaOverride?: string): Promise<GetRunResult>;
|
|
28
|
+
//# sourceMappingURL=runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/cli/runs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,WAAW,EAAE,CAAC,CA4BxB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,YAAY,CAAC,CA0CvB"}
|
package/dist/cli/runs.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// packages/cli/src/runs.ts
|
|
2
|
+
import pg from "pg";
|
|
3
|
+
import { getSchemaName } from "../index.js";
|
|
4
|
+
import { getAppName } from "./app.js";
|
|
5
|
+
/**
|
|
6
|
+
* List recent workflow runs from DBOS tables
|
|
7
|
+
*/
|
|
8
|
+
export async function listRuns(databaseUrl, options = {}) {
|
|
9
|
+
const { limit = 20, workflowName, schema: schemaOverride } = options;
|
|
10
|
+
const schema = schemaOverride ?? getSchemaName(getAppName());
|
|
11
|
+
const client = new pg.Client({ connectionString: databaseUrl });
|
|
12
|
+
await client.connect();
|
|
13
|
+
try {
|
|
14
|
+
// Exclude child workflows (they have -N suffix after the 36-char UUID)
|
|
15
|
+
let query = `
|
|
16
|
+
SELECT workflow_uuid, name, status, created_at, updated_at, output, error
|
|
17
|
+
FROM ${schema}.workflow_status
|
|
18
|
+
WHERE LENGTH(workflow_uuid) = 36
|
|
19
|
+
`;
|
|
20
|
+
const params = [];
|
|
21
|
+
if (workflowName) {
|
|
22
|
+
query += ` AND name = $1`;
|
|
23
|
+
params.push(workflowName);
|
|
24
|
+
}
|
|
25
|
+
query += ` ORDER BY created_at DESC LIMIT $${params.length + 1}`;
|
|
26
|
+
params.push(limit);
|
|
27
|
+
const result = await client.query(query, params);
|
|
28
|
+
return result.rows;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await client.end();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get a specific workflow run by ID or ID prefix (like git short hashes)
|
|
36
|
+
* Returns { run, ambiguous } where ambiguous is true if prefix matched multiple runs
|
|
37
|
+
*/
|
|
38
|
+
export async function getRun(databaseUrl, runId, schemaOverride) {
|
|
39
|
+
const schema = schemaOverride ?? getSchemaName(getAppName());
|
|
40
|
+
const client = new pg.Client({ connectionString: databaseUrl });
|
|
41
|
+
await client.connect();
|
|
42
|
+
try {
|
|
43
|
+
// Try exact match first
|
|
44
|
+
const exact = await client.query(`SELECT workflow_uuid, name, status, created_at, updated_at, output, error
|
|
45
|
+
FROM ${schema}.workflow_status
|
|
46
|
+
WHERE workflow_uuid = $1`, [runId]);
|
|
47
|
+
if (exact.rows[0]) {
|
|
48
|
+
return { run: exact.rows[0] };
|
|
49
|
+
}
|
|
50
|
+
// Try prefix match (like git short hashes)
|
|
51
|
+
// Exclude child workflows (they have -N suffix after the 36-char UUID)
|
|
52
|
+
const prefix = await client.query(`SELECT workflow_uuid, name, status, created_at, updated_at, output, error
|
|
53
|
+
FROM ${schema}.workflow_status
|
|
54
|
+
WHERE workflow_uuid LIKE $1
|
|
55
|
+
AND LENGTH(workflow_uuid) = 36
|
|
56
|
+
ORDER BY created_at DESC
|
|
57
|
+
LIMIT 2`, [runId + "%"]);
|
|
58
|
+
if (prefix.rows.length === 0) {
|
|
59
|
+
return { run: null };
|
|
60
|
+
}
|
|
61
|
+
if (prefix.rows.length > 1) {
|
|
62
|
+
return { run: null, ambiguous: true };
|
|
63
|
+
}
|
|
64
|
+
return { run: prefix.rows[0] };
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await client.end();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/cli/runs.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAkBtC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,WAAmB,EACnB,UAA2B,EAAE;IAE7B,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,MAAM,GAAG,cAAc,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAEhE,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,uEAAuE;QACvE,IAAI,KAAK,GAAG;;aAEH,MAAM;;KAEd,CAAC;QACF,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,IAAI,gBAAgB,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,IAAI,oCAAoC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAOD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,WAAmB,EACnB,KAAa,EACb,cAAuB;IAEvB,MAAM,MAAM,GAAG,cAAc,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAEhE,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAC9B;cACQ,MAAM;gCACY,EAC1B,CAAC,KAAK,CAAC,CACR,CAAC;QAEF,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,CAAC;QAED,2CAA2C;QAC3C,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;cACQ,MAAM;;;;eAIL,EACT,CAAC,KAAK,GAAG,GAAG,CAAC,CACd,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type WorkflowRun } from "./runs.js";
|
|
2
|
+
export interface WorkflowTrace extends WorkflowRun {
|
|
3
|
+
duration_ms: number | null;
|
|
4
|
+
inputs: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface OperationTrace {
|
|
7
|
+
workflow_uuid: string;
|
|
8
|
+
depth: number;
|
|
9
|
+
function_id: number;
|
|
10
|
+
function_name: string;
|
|
11
|
+
child_workflow_id: string | null;
|
|
12
|
+
started_at_epoch_ms: number;
|
|
13
|
+
completed_at_epoch_ms: number | null;
|
|
14
|
+
duration_ms: number | null;
|
|
15
|
+
output_preview: string | null;
|
|
16
|
+
error: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface TraceResult {
|
|
19
|
+
workflow: WorkflowTrace | null;
|
|
20
|
+
operations: OperationTrace[];
|
|
21
|
+
ambiguous?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get workflow trace including all operations and child workflows
|
|
25
|
+
*/
|
|
26
|
+
export declare function getTrace(databaseUrl: string, runId: string, schemaOverride?: string): Promise<TraceResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Print a workflow trace as a tree to stdout
|
|
29
|
+
*/
|
|
30
|
+
export declare function printTrace(trace: TraceResult): void;
|
|
31
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +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;AAkJD;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAiInD"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
// packages/cli/src/trace.ts
|
|
2
|
+
import pg from "pg";
|
|
3
|
+
import pc from "picocolors";
|
|
4
|
+
import { getSchemaName } from "../index.js";
|
|
5
|
+
import { getAppName } from "./app.js";
|
|
6
|
+
import { getRun } from "./runs.js";
|
|
7
|
+
/**
|
|
8
|
+
* Get workflow trace including all operations and child workflows
|
|
9
|
+
*/
|
|
10
|
+
export async function getTrace(databaseUrl, runId, schemaOverride) {
|
|
11
|
+
// Use getRun for ID resolution (reuses existing short hash logic)
|
|
12
|
+
const { run, ambiguous } = await getRun(databaseUrl, runId, schemaOverride);
|
|
13
|
+
if (ambiguous) {
|
|
14
|
+
return { workflow: null, operations: [], ambiguous: true };
|
|
15
|
+
}
|
|
16
|
+
if (!run) {
|
|
17
|
+
return { workflow: null, operations: [] };
|
|
18
|
+
}
|
|
19
|
+
// Get trace data using resolved ID
|
|
20
|
+
return getTraceData(databaseUrl, run.workflow_uuid, schemaOverride);
|
|
21
|
+
}
|
|
22
|
+
async function getTraceData(databaseUrl, workflowUuid, schemaOverride) {
|
|
23
|
+
const schema = schemaOverride ?? getSchemaName(getAppName());
|
|
24
|
+
const client = new pg.Client({ connectionString: databaseUrl });
|
|
25
|
+
await client.connect();
|
|
26
|
+
try {
|
|
27
|
+
// Get workflow metadata with additional trace fields (inputs, duration)
|
|
28
|
+
const workflowResult = await client.query(`SELECT
|
|
29
|
+
workflow_uuid,
|
|
30
|
+
name,
|
|
31
|
+
status,
|
|
32
|
+
created_at,
|
|
33
|
+
updated_at,
|
|
34
|
+
(updated_at - created_at) as duration_ms,
|
|
35
|
+
inputs::text,
|
|
36
|
+
output::text,
|
|
37
|
+
error
|
|
38
|
+
FROM ${schema}.workflow_status
|
|
39
|
+
WHERE workflow_uuid = $1`, [workflowUuid]);
|
|
40
|
+
if (workflowResult.rows.length === 0) {
|
|
41
|
+
return { workflow: null, operations: [] };
|
|
42
|
+
}
|
|
43
|
+
const workflow = workflowResult.rows[0];
|
|
44
|
+
// Get all operations with hierarchy using recursive CTE
|
|
45
|
+
const operationsResult = await client.query(`WITH RECURSIVE workflow_tree AS (
|
|
46
|
+
-- Start with the main workflow
|
|
47
|
+
SELECT workflow_uuid, workflow_uuid as root_uuid, 0 as depth
|
|
48
|
+
FROM ${schema}.workflow_status
|
|
49
|
+
WHERE workflow_uuid = $1
|
|
50
|
+
|
|
51
|
+
UNION
|
|
52
|
+
|
|
53
|
+
-- Find child workflows via child_workflow_id references (UNION dedupes)
|
|
54
|
+
SELECT ws.workflow_uuid, wt.root_uuid, wt.depth + 1
|
|
55
|
+
FROM ${schema}.workflow_status ws
|
|
56
|
+
JOIN ${schema}.operation_outputs oo ON oo.child_workflow_id = ws.workflow_uuid
|
|
57
|
+
JOIN workflow_tree wt ON oo.workflow_uuid = wt.workflow_uuid
|
|
58
|
+
)
|
|
59
|
+
SELECT
|
|
60
|
+
oo.workflow_uuid,
|
|
61
|
+
wt.depth,
|
|
62
|
+
oo.function_id,
|
|
63
|
+
oo.function_name,
|
|
64
|
+
oo.child_workflow_id,
|
|
65
|
+
oo.started_at_epoch_ms,
|
|
66
|
+
oo.completed_at_epoch_ms,
|
|
67
|
+
(oo.completed_at_epoch_ms - oo.started_at_epoch_ms) as duration_ms,
|
|
68
|
+
oo.output::text as output_preview,
|
|
69
|
+
oo.error
|
|
70
|
+
FROM workflow_tree wt
|
|
71
|
+
JOIN ${schema}.operation_outputs oo ON oo.workflow_uuid = wt.workflow_uuid
|
|
72
|
+
ORDER BY oo.started_at_epoch_ms, wt.depth, oo.function_id`, [workflowUuid]);
|
|
73
|
+
return {
|
|
74
|
+
workflow,
|
|
75
|
+
operations: operationsResult.rows,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await client.end();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ---- Formatting and display ----
|
|
83
|
+
function formatStatus(status) {
|
|
84
|
+
switch (status) {
|
|
85
|
+
case "SUCCESS":
|
|
86
|
+
return pc.green(status);
|
|
87
|
+
case "ERROR":
|
|
88
|
+
return pc.red(status);
|
|
89
|
+
case "PENDING":
|
|
90
|
+
return pc.yellow(status);
|
|
91
|
+
default:
|
|
92
|
+
return status;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function formatDuration(ms) {
|
|
96
|
+
if (ms === null)
|
|
97
|
+
return pc.dim("pending");
|
|
98
|
+
if (ms < 1000)
|
|
99
|
+
return `${ms}ms`;
|
|
100
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Parse and unwrap DBOS/superjson output format
|
|
104
|
+
* Handles: raw values, JSON strings, and {"json": ..., "__dbos_serializer": "superjson"} wrappers
|
|
105
|
+
*/
|
|
106
|
+
function parseOutput(output) {
|
|
107
|
+
if (output === null || output === undefined)
|
|
108
|
+
return null;
|
|
109
|
+
try {
|
|
110
|
+
const parsed = typeof output === "string" ? JSON.parse(output) : output;
|
|
111
|
+
// Unwrap superjson/DBOS wrapper if present
|
|
112
|
+
if (parsed && typeof parsed === "object" && "json" in parsed) {
|
|
113
|
+
return parsed.json;
|
|
114
|
+
}
|
|
115
|
+
return parsed;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return output;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function formatOutputPreview(output) {
|
|
122
|
+
if (!output)
|
|
123
|
+
return "";
|
|
124
|
+
try {
|
|
125
|
+
let value = parseOutput(output);
|
|
126
|
+
// For tool call recordings, show tool name and inputs
|
|
127
|
+
if (value && typeof value === "object" && "toolName" in value) {
|
|
128
|
+
const record = value;
|
|
129
|
+
const toolName = record.toolName;
|
|
130
|
+
// Inputs may be at top level or nested in result.action
|
|
131
|
+
const inputs = record.inputs ?? record.result?.action;
|
|
132
|
+
if (inputs !== undefined) {
|
|
133
|
+
const inputStr = JSON.stringify(inputs);
|
|
134
|
+
const truncated = inputStr.length > 60 ? inputStr.slice(0, 57) + "..." : inputStr;
|
|
135
|
+
return `${toolName}(${truncated})`;
|
|
136
|
+
}
|
|
137
|
+
return String(toolName);
|
|
138
|
+
}
|
|
139
|
+
const str = JSON.stringify(value);
|
|
140
|
+
// Truncate long output
|
|
141
|
+
if (str.length > 80) {
|
|
142
|
+
return str.slice(0, 77) + "...";
|
|
143
|
+
}
|
|
144
|
+
return str;
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return output.slice(0, 80);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Print a workflow trace as a tree to stdout
|
|
152
|
+
*/
|
|
153
|
+
export function printTrace(trace) {
|
|
154
|
+
const { workflow, operations } = trace;
|
|
155
|
+
if (!workflow)
|
|
156
|
+
return;
|
|
157
|
+
console.log();
|
|
158
|
+
console.log(`Workflow: ${pc.cyan(workflow.name)} ${pc.dim(`(${workflow.workflow_uuid})`)}`);
|
|
159
|
+
console.log(`Status: ${formatStatus(workflow.status)} | Duration: ${formatDuration(workflow.duration_ms)}`);
|
|
160
|
+
console.log();
|
|
161
|
+
if (operations.length === 0) {
|
|
162
|
+
console.log(pc.dim("No operations recorded"));
|
|
163
|
+
console.log();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Group operations by parent workflow
|
|
167
|
+
const byWorkflow = new Map();
|
|
168
|
+
for (const op of operations) {
|
|
169
|
+
const list = byWorkflow.get(op.workflow_uuid) || [];
|
|
170
|
+
list.push(op);
|
|
171
|
+
byWorkflow.set(op.workflow_uuid, list);
|
|
172
|
+
}
|
|
173
|
+
// Get main workflow operations, filtering out agent start ops (show only DBOS.getResult for child workflows)
|
|
174
|
+
const mainOps = byWorkflow.get(workflow.workflow_uuid) || [];
|
|
175
|
+
// Find child workflow IDs that have a DBOS.getResult - we'll show child ops there instead of at start
|
|
176
|
+
const childWorkflowsWithGetResult = new Set();
|
|
177
|
+
for (const op of mainOps) {
|
|
178
|
+
if (op.function_name === "DBOS.getResult" && op.child_workflow_id) {
|
|
179
|
+
childWorkflowsWithGetResult.add(op.child_workflow_id);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Filter out operations that just start a child workflow (no output, DBOS.getResult will show it)
|
|
183
|
+
const filteredOps = mainOps.filter((op) => {
|
|
184
|
+
// Keep if not a child workflow start
|
|
185
|
+
if (!op.child_workflow_id)
|
|
186
|
+
return true;
|
|
187
|
+
// Keep if it's DBOS.getResult (this is where we show child ops)
|
|
188
|
+
if (op.function_name === "DBOS.getResult")
|
|
189
|
+
return true;
|
|
190
|
+
// Skip agent start ops if there's a corresponding DBOS.getResult
|
|
191
|
+
if (childWorkflowsWithGetResult.has(op.child_workflow_id))
|
|
192
|
+
return false;
|
|
193
|
+
// Keep otherwise (no DBOS.getResult for this child)
|
|
194
|
+
return true;
|
|
195
|
+
});
|
|
196
|
+
const totalOps = filteredOps.length;
|
|
197
|
+
for (let i = 0; i < filteredOps.length; i++) {
|
|
198
|
+
const op = filteredOps[i];
|
|
199
|
+
const isLast = i === totalOps - 1;
|
|
200
|
+
const prefix = isLast ? "└─" : "├─";
|
|
201
|
+
const continuePrefix = isLast ? " " : "│ ";
|
|
202
|
+
// For DBOS.getResult with child workflow, show the child workflow name instead
|
|
203
|
+
let displayName = op.function_name;
|
|
204
|
+
if (op.function_name === "DBOS.getResult" && op.child_workflow_id) {
|
|
205
|
+
// Find the corresponding start operation to get the agent name
|
|
206
|
+
const startOp = mainOps.find((o) => o.child_workflow_id === op.child_workflow_id && o.function_name !== "DBOS.getResult");
|
|
207
|
+
if (startOp) {
|
|
208
|
+
displayName = startOp.function_name;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Print operation line with duration right-aligned
|
|
212
|
+
const duration = formatDuration(op.duration_ms);
|
|
213
|
+
const padding = Math.max(1, 50 - displayName.length);
|
|
214
|
+
console.log(`${prefix} ${pc.bold(displayName)}${" ".repeat(padding)}${pc.yellow(duration)}`);
|
|
215
|
+
// Print error if present
|
|
216
|
+
if (op.error) {
|
|
217
|
+
console.log(`${continuePrefix} ${pc.red("✗ " + op.error)}`);
|
|
218
|
+
}
|
|
219
|
+
// Print child workflow operations if this is a child workflow call
|
|
220
|
+
if (op.child_workflow_id) {
|
|
221
|
+
const childOps = byWorkflow.get(op.child_workflow_id) || [];
|
|
222
|
+
for (let j = 0; j < childOps.length; j++) {
|
|
223
|
+
const childOp = childOps[j];
|
|
224
|
+
const childIsLast = j === childOps.length - 1;
|
|
225
|
+
const childPrefix = childIsLast ? "└─" : "├─";
|
|
226
|
+
const childContinuePrefix = childIsLast ? " " : "│ ";
|
|
227
|
+
const childName = childOp.function_name;
|
|
228
|
+
const childDuration = formatDuration(childOp.duration_ms);
|
|
229
|
+
const childPadding = Math.max(1, 47 - childName.length);
|
|
230
|
+
console.log(`${continuePrefix} ${childPrefix} ${childName}${" ".repeat(childPadding)}${pc.yellow(childDuration)}`);
|
|
231
|
+
if (childOp.error) {
|
|
232
|
+
console.log(`${continuePrefix} ${childContinuePrefix} ${pc.red("✗ " + childOp.error)}`);
|
|
233
|
+
}
|
|
234
|
+
const childPreview = formatOutputPreview(childOp.output_preview);
|
|
235
|
+
if (childPreview && !childOp.error) {
|
|
236
|
+
console.log(`${continuePrefix} ${childContinuePrefix} ${pc.dim("→")} ${pc.dim(childPreview)}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Show the agent/child workflow result after its operations
|
|
240
|
+
const agentResult = formatOutputPreview(op.output_preview);
|
|
241
|
+
if (agentResult && !op.error) {
|
|
242
|
+
console.log(`${continuePrefix} ${pc.dim("Result:")} ${pc.dim(agentResult)}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Print output preview if present (only for non-child-workflow operations)
|
|
246
|
+
const preview = formatOutputPreview(op.output_preview);
|
|
247
|
+
if (preview && !op.error && !op.child_workflow_id) {
|
|
248
|
+
console.log(`${continuePrefix} ${pc.dim("→")} ${pc.dim(preview)}`);
|
|
249
|
+
}
|
|
250
|
+
// Add blank line between operations for readability (except after last)
|
|
251
|
+
if (!isLast) {
|
|
252
|
+
console.log("│");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Print final output (full, pretty-printed)
|
|
256
|
+
if (workflow.output) {
|
|
257
|
+
console.log();
|
|
258
|
+
console.log(pc.green("Final:"));
|
|
259
|
+
const value = parseOutput(workflow.output);
|
|
260
|
+
console.log(JSON.stringify(value, null, 2));
|
|
261
|
+
}
|
|
262
|
+
console.log();
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/cli/trace.ts"],"names":[],"mappings":"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"}
|