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.
Files changed (197) hide show
  1. package/dist/__tests__/agent-parser.test.d.ts +2 -0
  2. package/dist/__tests__/agent-parser.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-parser.test.js +64 -0
  4. package/dist/__tests__/agent-parser.test.js.map +1 -0
  5. package/dist/__tests__/agent.e2e.test.d.ts +2 -0
  6. package/dist/__tests__/agent.e2e.test.d.ts.map +1 -0
  7. package/dist/__tests__/agent.e2e.test.js +90 -0
  8. package/dist/__tests__/agent.e2e.test.js.map +1 -0
  9. package/dist/__tests__/agent.test.d.ts +2 -0
  10. package/dist/__tests__/agent.test.d.ts.map +1 -0
  11. package/dist/__tests__/agent.test.js +30 -0
  12. package/dist/__tests__/agent.test.js.map +1 -0
  13. package/dist/__tests__/context.test.d.ts +2 -0
  14. package/dist/__tests__/context.test.d.ts.map +1 -0
  15. package/dist/__tests__/context.test.js +53 -0
  16. package/dist/__tests__/context.test.js.map +1 -0
  17. package/dist/__tests__/dbos.test.d.ts +2 -0
  18. package/dist/__tests__/dbos.test.d.ts.map +1 -0
  19. package/dist/__tests__/dbos.test.js +35 -0
  20. package/dist/__tests__/dbos.test.js.map +1 -0
  21. package/dist/__tests__/factory.test.d.ts +2 -0
  22. package/dist/__tests__/factory.test.d.ts.map +1 -0
  23. package/dist/__tests__/factory.test.js +126 -0
  24. package/dist/__tests__/factory.test.js.map +1 -0
  25. package/dist/__tests__/integration.e2e.test.d.ts +2 -0
  26. package/dist/__tests__/integration.e2e.test.d.ts.map +1 -0
  27. package/dist/__tests__/integration.e2e.test.js +127 -0
  28. package/dist/__tests__/integration.e2e.test.js.map +1 -0
  29. package/dist/__tests__/integration.test.d.ts +2 -0
  30. package/dist/__tests__/integration.test.d.ts.map +1 -0
  31. package/dist/__tests__/integration.test.js +103 -0
  32. package/dist/__tests__/integration.test.js.map +1 -0
  33. package/dist/__tests__/model-config.test.d.ts +2 -0
  34. package/dist/__tests__/model-config.test.d.ts.map +1 -0
  35. package/dist/__tests__/model-config.test.js +48 -0
  36. package/dist/__tests__/model-config.test.js.map +1 -0
  37. package/dist/__tests__/node-registry.test.d.ts +2 -0
  38. package/dist/__tests__/node-registry.test.d.ts.map +1 -0
  39. package/dist/__tests__/node-registry.test.js +63 -0
  40. package/dist/__tests__/node-registry.test.js.map +1 -0
  41. package/dist/__tests__/node.test.d.ts +2 -0
  42. package/dist/__tests__/node.test.d.ts.map +1 -0
  43. package/dist/__tests__/node.test.js +48 -0
  44. package/dist/__tests__/node.test.js.map +1 -0
  45. package/dist/__tests__/registry.test.d.ts +2 -0
  46. package/dist/__tests__/registry.test.d.ts.map +1 -0
  47. package/dist/__tests__/registry.test.js +62 -0
  48. package/dist/__tests__/registry.test.js.map +1 -0
  49. package/dist/__tests__/web-tool.test.d.ts +2 -0
  50. package/dist/__tests__/web-tool.test.d.ts.map +1 -0
  51. package/dist/__tests__/web-tool.test.js +99 -0
  52. package/dist/__tests__/web-tool.test.js.map +1 -0
  53. package/dist/__tests__/workflow.test.d.ts +2 -0
  54. package/dist/__tests__/workflow.test.d.ts.map +1 -0
  55. package/dist/__tests__/workflow.test.js +49 -0
  56. package/dist/__tests__/workflow.test.js.map +1 -0
  57. package/dist/agent.d.ts +46 -0
  58. package/dist/agent.d.ts.map +1 -0
  59. package/dist/agent.js +75 -0
  60. package/dist/agent.js.map +1 -0
  61. package/dist/cli/__tests__/discovery.test.d.ts +2 -0
  62. package/dist/cli/__tests__/discovery.test.d.ts.map +1 -0
  63. package/dist/cli/__tests__/discovery.test.js +26 -0
  64. package/dist/cli/__tests__/discovery.test.js.map +1 -0
  65. package/dist/cli/__tests__/env.test.d.ts +2 -0
  66. package/dist/cli/__tests__/env.test.d.ts.map +1 -0
  67. package/dist/cli/__tests__/env.test.js +32 -0
  68. package/dist/cli/__tests__/env.test.js.map +1 -0
  69. package/dist/cli/__tests__/runs.test.d.ts +2 -0
  70. package/dist/cli/__tests__/runs.test.d.ts.map +1 -0
  71. package/dist/cli/__tests__/runs.test.js +46 -0
  72. package/dist/cli/__tests__/runs.test.js.map +1 -0
  73. package/dist/cli/app.d.ts +6 -0
  74. package/dist/cli/app.d.ts.map +1 -0
  75. package/dist/cli/app.js +21 -0
  76. package/dist/cli/app.js.map +1 -0
  77. package/dist/cli/discovery.d.ts +24 -0
  78. package/dist/cli/discovery.d.ts.map +1 -0
  79. package/dist/cli/discovery.js +88 -0
  80. package/dist/cli/discovery.js.map +1 -0
  81. package/dist/cli/env.d.ts +15 -0
  82. package/dist/cli/env.d.ts.map +1 -0
  83. package/dist/cli/env.js +54 -0
  84. package/dist/cli/env.js.map +1 -0
  85. package/dist/cli/index.d.ts +3 -0
  86. package/dist/cli/index.d.ts.map +1 -0
  87. package/dist/cli/index.js +423 -0
  88. package/dist/cli/index.js.map +1 -0
  89. package/dist/cli/install.d.ts +54 -0
  90. package/dist/cli/install.d.ts.map +1 -0
  91. package/dist/cli/install.js +217 -0
  92. package/dist/cli/install.js.map +1 -0
  93. package/dist/cli/mcp/config.d.ts +5 -0
  94. package/dist/cli/mcp/config.d.ts.map +1 -0
  95. package/dist/cli/mcp/config.js +14 -0
  96. package/dist/cli/mcp/config.js.map +1 -0
  97. package/dist/cli/mcp/lib/templates.d.ts +12 -0
  98. package/dist/cli/mcp/lib/templates.d.ts.map +1 -0
  99. package/dist/cli/mcp/lib/templates.js +77 -0
  100. package/dist/cli/mcp/lib/templates.js.map +1 -0
  101. package/dist/cli/mcp/server.d.ts +5 -0
  102. package/dist/cli/mcp/server.d.ts.map +1 -0
  103. package/dist/cli/mcp/server.js +15 -0
  104. package/dist/cli/mcp/server.js.map +1 -0
  105. package/dist/cli/mcp/serverInfo.d.ts +7 -0
  106. package/dist/cli/mcp/serverInfo.d.ts.map +1 -0
  107. package/dist/cli/mcp/serverInfo.js +7 -0
  108. package/dist/cli/mcp/serverInfo.js.map +1 -0
  109. package/dist/cli/mcp/tools/createApp.d.ts +15 -0
  110. package/dist/cli/mcp/tools/createApp.d.ts.map +1 -0
  111. package/dist/cli/mcp/tools/createApp.js +81 -0
  112. package/dist/cli/mcp/tools/createApp.js.map +1 -0
  113. package/dist/cli/mcp/tools/createDatabase.d.ts +14 -0
  114. package/dist/cli/mcp/tools/createDatabase.d.ts.map +1 -0
  115. package/dist/cli/mcp/tools/createDatabase.js +66 -0
  116. package/dist/cli/mcp/tools/createDatabase.js.map +1 -0
  117. package/dist/cli/mcp/tools/index.d.ts +24 -0
  118. package/dist/cli/mcp/tools/index.d.ts.map +1 -0
  119. package/dist/cli/mcp/tools/index.js +11 -0
  120. package/dist/cli/mcp/tools/index.js.map +1 -0
  121. package/dist/cli/mcp/tools/setupAppSchema.d.ts +17 -0
  122. package/dist/cli/mcp/tools/setupAppSchema.d.ts.map +1 -0
  123. package/dist/cli/mcp/tools/setupAppSchema.js +157 -0
  124. package/dist/cli/mcp/tools/setupAppSchema.js.map +1 -0
  125. package/dist/cli/mcp/types.d.ts +3 -0
  126. package/dist/cli/mcp/types.d.ts.map +1 -0
  127. package/dist/cli/mcp/types.js +2 -0
  128. package/dist/cli/mcp/types.js.map +1 -0
  129. package/dist/cli/runs.d.ts +28 -0
  130. package/dist/cli/runs.d.ts.map +1 -0
  131. package/dist/cli/runs.js +70 -0
  132. package/dist/cli/runs.js.map +1 -0
  133. package/dist/cli/trace.d.ts +31 -0
  134. package/dist/cli/trace.d.ts.map +1 -0
  135. package/dist/cli/trace.js +264 -0
  136. package/dist/cli/trace.js.map +1 -0
  137. package/dist/context.d.ts +13 -0
  138. package/dist/context.d.ts.map +1 -0
  139. package/dist/context.js +25 -0
  140. package/dist/context.js.map +1 -0
  141. package/dist/dbos.d.ts +15 -0
  142. package/dist/dbos.d.ts.map +1 -0
  143. package/dist/dbos.js +27 -0
  144. package/dist/dbos.js.map +1 -0
  145. package/dist/factory.d.ts +6 -0
  146. package/dist/factory.d.ts.map +1 -0
  147. package/dist/factory.js +78 -0
  148. package/dist/factory.js.map +1 -0
  149. package/dist/index.d.ts +20 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +18 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/node.d.ts +19 -0
  154. package/dist/node.d.ts.map +1 -0
  155. package/dist/node.js +16 -0
  156. package/dist/node.js.map +1 -0
  157. package/dist/nodes/agent/executor.d.ts +70 -0
  158. package/dist/nodes/agent/executor.d.ts.map +1 -0
  159. package/dist/nodes/agent/executor.js +230 -0
  160. package/dist/nodes/agent/executor.js.map +1 -0
  161. package/dist/nodes/agent/index.d.ts +7 -0
  162. package/dist/nodes/agent/index.d.ts.map +1 -0
  163. package/dist/nodes/agent/index.js +5 -0
  164. package/dist/nodes/agent/index.js.map +1 -0
  165. package/dist/nodes/agent/model-config.d.ts +42 -0
  166. package/dist/nodes/agent/model-config.d.ts.map +1 -0
  167. package/dist/nodes/agent/model-config.js +58 -0
  168. package/dist/nodes/agent/model-config.js.map +1 -0
  169. package/dist/nodes/agent/parser.d.ts +22 -0
  170. package/dist/nodes/agent/parser.d.ts.map +1 -0
  171. package/dist/nodes/agent/parser.js +42 -0
  172. package/dist/nodes/agent/parser.js.map +1 -0
  173. package/dist/nodes/builtin/index.d.ts +9 -0
  174. package/dist/nodes/builtin/index.d.ts.map +1 -0
  175. package/dist/nodes/builtin/index.js +10 -0
  176. package/dist/nodes/builtin/index.js.map +1 -0
  177. package/dist/nodes/builtin/web.d.ts +25 -0
  178. package/dist/nodes/builtin/web.d.ts.map +1 -0
  179. package/dist/nodes/builtin/web.js +86 -0
  180. package/dist/nodes/builtin/web.js.map +1 -0
  181. package/dist/nodes/registry.d.ts +32 -0
  182. package/dist/nodes/registry.d.ts.map +1 -0
  183. package/dist/nodes/registry.js +58 -0
  184. package/dist/nodes/registry.js.map +1 -0
  185. package/dist/registry.d.ts +31 -0
  186. package/dist/registry.d.ts.map +1 -0
  187. package/dist/registry.js +44 -0
  188. package/dist/registry.js.map +1 -0
  189. package/dist/types.d.ts +63 -0
  190. package/dist/types.d.ts.map +1 -0
  191. package/dist/types.js +2 -0
  192. package/dist/types.js.map +1 -0
  193. package/dist/workflow.d.ts +26 -0
  194. package/dist/workflow.d.ts.map +1 -0
  195. package/dist/workflow.js +50 -0
  196. package/dist/workflow.js.map +1 -0
  197. 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":"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"}
@@ -0,0 +1,3 @@
1
+ export interface ServerContext extends Record<string, unknown> {
2
+ }
3
+ //# sourceMappingURL=types.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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"}
@@ -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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"}