@minicor/mcp-server 3.3.5 → 3.4.0

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.
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Prompt: turn an existing NestJS customer middleware into a Job.
4
+ *
5
+ * Given a Nest.js controller that orchestrates Laminar workflows (login →
6
+ * lookup → create, with header munging and error mapping), this prompt walks
7
+ * the agent through mapping that endpoint into a structured JobDefinition step
8
+ * graph and registering it with register_job.
9
+ */
10
+ export function register({ server }) {
11
+ server.prompt("nestjs-middleware-to-job", "Convert an existing NestJS customer middleware endpoint (a controller method that orchestrates Minicor workflows) into a Job — a structured JobDefinition step graph (workflow steps + code blocks + when/forEach) registered via register_job, with test cases as the green-gate.", {
12
+ controllerPath: z
13
+ .string()
14
+ .describe("Path to the NestJS controller file (e.g. src/controllers/ams.controller.ts)"),
15
+ endpoint: z
16
+ .string()
17
+ .optional()
18
+ .describe("Which controller method/route to convert (e.g. POST /ams/account-lookup). Omit to convert all."),
19
+ workspaceId: z.string().describe("Minicor workspace ID"),
20
+ middlewareId: z
21
+ .string()
22
+ .optional()
23
+ .describe("Existing router (middleware) ID to attach the job route to. Omit to create one with create_router first."),
24
+ }, async ({ controllerPath, endpoint, workspaceId, middlewareId }) => {
25
+ return {
26
+ messages: [
27
+ {
28
+ role: "user",
29
+ content: {
30
+ type: "text",
31
+ text: `You are converting a NestJS customer middleware endpoint into a **Job**.
32
+
33
+ ## What you're converting
34
+ - Controller: \`${controllerPath}\`
35
+ - Endpoint: ${endpoint ?? "ALL methods in the controller"}
36
+ - Workspace: ${workspaceId}
37
+ - Router (middleware): ${middlewareId ?? "none yet — create one with create_router first, then use its id"}
38
+
39
+ ## Mental model (read this first)
40
+ - **A Job ≡ a middleware route** whose behavior is a structured \`definition\` (a step graph) instead of freeform handler code.
41
+ - A Job sits **above** workflows. A job step either **calls an entire Minicor workflow** (\`kind: "workflow"\`, by \`workflowId\`) or **runs a code block** (\`kind: "code"\`, a \`(ctx) => ...\` string). The job never touches a workflow's internal steps — a workflow is an opaque callable with an input and an output.
42
+ - Keep job graphs small: typically \`login → lookup/create → shape output\`.
43
+
44
+ ## How a NestJS controller maps to a JobDefinition
45
+ A typical controller method does: validate the body (DTO) → run a login workflow → run the target workflow → munge the result (headers, status) → return / throw. Map each piece:
46
+
47
+ | NestJS | JobDefinition |
48
+ | --- | --- |
49
+ | \`@Body() dto\` + DTO class | \`inputSchema\` (JSON Schema) |
50
+ | return type / DTO | \`outputSchema\` (JSON Schema) |
51
+ | \`await laminar.executeWorkflow({ workflowId: LOGIN, data:{} })\` | a \`kind:"workflow"\` step with \`cache\` (login gate) |
52
+ | \`await laminar.executeWorkflow({ workflowId: TARGET, data })\` | a \`kind:"workflow"\` step; \`input\` is \`{{ctx.input.*}}\` templating or a CodeBlock |
53
+ | header munging (e.g. \`x-recording-url\` → \`web_agent_video_url\`) | a \`kind:"code"\` step, or the \`output\` CodeBlock |
54
+ | \`if (cond) ...\` branching | step \`when\` (skip) / \`onError\` / \`{ goto }\` |
55
+ | looping over a collection | step \`forEach\` |
56
+ | \`throw new HttpException(...)\` mapping | engine sets failed on \`onError:"abort"\`; \`output\` block decides \`partial\`/\`review\` |
57
+ | serialize per desktop (login lands before run) | \`resource.lockKey\` |
58
+
59
+ ## Worked example — FurtherAI AMS360 \`runWithLogin\` → Job
60
+ A controller that does "ensure AMS360 login, then run the target workflow, then merge the recording URL header" becomes:
61
+
62
+ \`\`\`json
63
+ {
64
+ "region": "us",
65
+ "resource": { "lockKey": "ams360-desktop" },
66
+ "inputSchema": { "type": "object", "properties": { "insured_name": { "type": "string" } }, "required": ["insured_name"] },
67
+ "outputSchema": { "type": "object" },
68
+ "steps": [
69
+ {
70
+ "id": "login", "name": "AMS360 Login", "kind": "workflow",
71
+ "workflowId": 0,
72
+ "input": {},
73
+ "cache": { "key": "ams360-login", "ttlMs": 1800000 },
74
+ "onError": "abort"
75
+ },
76
+ {
77
+ "id": "lookup", "name": "Account Lookup", "kind": "workflow",
78
+ "workflowId": 2078,
79
+ "saveAs": "lookup",
80
+ "input": { "task_type": "ams_account_lookup", "insured_name": "{{ctx.input.insured_name}}" },
81
+ "onError": "abort"
82
+ }
83
+ ],
84
+ "output": "(ctx) => { const r = ctx.lookup?.data ?? ctx.lookup; const rec = ctx.lookup?.headers?.['x-recording-url']; return rec ? { ...r, web_agent_video_url: String(rec) } : r; }"
85
+ }
86
+ \`\`\`
87
+ (Replace the placeholder \`workflowId: 0\` login id and \`2078\` with the real ids from \`WORKFLOW_IDS\` / \`list_workflows\`. Map every constant in the controller's config to a real workflow id.)
88
+
89
+ ## Procedure
90
+ 1. **Read the controller** at \`${controllerPath}\` and its DTOs/constants. List each endpoint, the workflow ids it calls, the call order, and the result-shaping logic.
91
+ 2. **Resolve workflow ids** with \`list_workflows(workspaceId: ${workspaceId})\` — match the controller's \`WORKFLOW_IDS\`/constants to live ids.
92
+ 3. **Author inputSchema/outputSchema** from the DTOs.
93
+ 4. **Build the step graph** per the mapping table. Login/smart-launch → a \`cache\`d workflow step. Each downstream workflow → a workflow step with templated \`input\`. Header/result munging → the \`output\` CodeBlock (or a \`code\` step).
94
+ 5. **Define the green-gate FIRST**: \`add_test_case\` with a representative input (use test data only) and assertions over the expected output (e.g. \`output.web_agent_video_url != null\`, \`output.account != null\`).
95
+ 6. **Register** with \`register_job(workspaceId, middlewareId, path, definition)\`. Use ${middlewareId ? `middlewareId ${middlewareId}` : "the middlewareId of the router you created"}.
96
+ 7. **Run it**: \`run_job\` with the test input; inspect the returned JobExecution (per-step \`workflowExecutionId\`/\`region\` deep-link to the real Minicor runs).
97
+ 8. **Green-gate**: \`run_tests\` until \`green: true\`. Drill into any failing case → its job execution → step → Minicor run; fix \`update_job\` and re-run.
98
+
99
+ ## Rules
100
+ - One job per controller endpoint. Keep the graph shallow.
101
+ - Never hardcode credentials — keep secrets in the workflow's config store (\`resource.configStoreId\` / step \`configStoreId\`).
102
+ - Preserve the controller's ordering guarantees with \`resource.lockKey\` (serialize per desktop) so login always lands before the work.
103
+ - Test data only — never real patient/customer data.`,
104
+ },
105
+ },
106
+ ],
107
+ };
108
+ });
109
+ }
110
+ //# sourceMappingURL=nestjs-to-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs-to-job.js","sourceRoot":"","sources":["../../src/prompts/nestjs-to-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAY;IAC3C,MAAM,CAAC,MAAM,CACX,0BAA0B,EAC1B,oRAAoR,EACpR;QACE,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,QAAQ,CAAC,6EAA6E,CAAC;QAC1F,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,gGAAgG,CAAC;QAC7G,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACxD,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0GAA0G,CAAC;KACxH,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,EAAE;QAChE,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;;;kBAGF,cAAc;cAClB,QAAQ,IAAI,+BAA+B;eAC1C,WAAW;yBACD,YAAY,IAAI,iEAAiE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCAqDxE,cAAc;iEACiB,WAAW;;;;0FAIc,YAAY,CAAC,CAAC,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC,CAAC,4CAA4C;;;;;;;;qDAQjI;qBACxC;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP tools for Jobs + Test Cases.
3
+ *
4
+ * A Job is a middleware route whose behavior is a structured `definition`
5
+ * (step graph) instead of freeform handler code. Jobs sit *above* workflows: a
6
+ * job step calls an entire Minicor workflow (by workflowId) or runs a code
7
+ * block. Test cases attach to a job (route): a named input + code-block
8
+ * assertions `[{ name, expr }]` evaluated against the execution.
9
+ *
10
+ * See middlewares/JOBS-DESIGN.md for the full model + API contract (v1).
11
+ *
12
+ * Auth/transport is handled by MiddlewareServiceClient, which by default calls
13
+ * the region's public middleware-service Cloud Run directly with the MCP's user
14
+ * bearer token. Set MIDDLEWARE_SERVICE_PROXY_BASE to route through a deployed
15
+ * frontend proxy instead, or MIDDLEWARE_SERVICE_URL[_US|_CA] to hit a specific
16
+ * reachable instance (dev/local). See middleware-service-client.ts for the full
17
+ * precedence.
18
+ */
19
+ import type { ToolDeps } from "../types.js";
20
+ export declare function register(deps: ToolDeps): void;
21
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmG5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAsdtC"}
@@ -0,0 +1,470 @@
1
+ /**
2
+ * MCP tools for Jobs + Test Cases.
3
+ *
4
+ * A Job is a middleware route whose behavior is a structured `definition`
5
+ * (step graph) instead of freeform handler code. Jobs sit *above* workflows: a
6
+ * job step calls an entire Minicor workflow (by workflowId) or runs a code
7
+ * block. Test cases attach to a job (route): a named input + code-block
8
+ * assertions `[{ name, expr }]` evaluated against the execution.
9
+ *
10
+ * See middlewares/JOBS-DESIGN.md for the full model + API contract (v1).
11
+ *
12
+ * Auth/transport is handled by MiddlewareServiceClient, which by default calls
13
+ * the region's public middleware-service Cloud Run directly with the MCP's user
14
+ * bearer token. Set MIDDLEWARE_SERVICE_PROXY_BASE to route through a deployed
15
+ * frontend proxy instead, or MIDDLEWARE_SERVICE_URL[_US|_CA] to hit a specific
16
+ * reachable instance (dev/local). See middleware-service-client.ts for the full
17
+ * precedence.
18
+ */
19
+ import { z } from "zod";
20
+ import { ok, text } from "../helpers.js";
21
+ import { MiddlewareServiceClient } from "../middleware-service-client.js";
22
+ import { getWorkspaceRegion } from "../state.js";
23
+ const regionParam = z
24
+ .enum(["us", "ca"])
25
+ .optional()
26
+ .describe("Region (us or ca). Auto-detected from workspace if omitted.");
27
+ // ── Zod schemas mirroring the JobDefinition entities ───────────
28
+ const jobStepSchema = z
29
+ .object({
30
+ id: z.string().describe("Stable step id (referenced by goto/saveAs)"),
31
+ name: z.string().describe("Human-readable step name"),
32
+ kind: z.enum(["workflow", "code"]),
33
+ saveAs: z
34
+ .string()
35
+ .optional()
36
+ .describe("ctx key to store this step's result under"),
37
+ when: z
38
+ .string()
39
+ .optional()
40
+ .describe("Conditional-skip: TS expression over ctx that must be truthy"),
41
+ forEach: z
42
+ .string()
43
+ .optional()
44
+ .describe("Fan-out: TS expression over ctx yielding a collection"),
45
+ onError: z
46
+ .union([
47
+ z.enum(["abort", "skip", "continue"]),
48
+ z.object({ goto: z.string() }),
49
+ ])
50
+ .optional(),
51
+ retry: z
52
+ .object({ max: z.number(), backoffMs: z.number().optional() })
53
+ .optional(),
54
+ cache: z
55
+ .object({ key: z.string(), ttlMs: z.number() })
56
+ .optional()
57
+ .describe("Login / smart-launch gate — reuse a cached result"),
58
+ // workflow
59
+ workflowId: z
60
+ .number()
61
+ .optional()
62
+ .describe("kind=workflow: the Minicor workflow id to call"),
63
+ configStoreId: z
64
+ .string()
65
+ .optional()
66
+ .describe("kind=workflow: override resource.configStoreId"),
67
+ input: z
68
+ .union([z.record(z.string(), z.unknown()), z.string()])
69
+ .optional()
70
+ .describe("kind=workflow: input object with {{ctx.x}} templates, OR a CodeBlock '(ctx) => ({...})'"),
71
+ // code
72
+ code: z
73
+ .string()
74
+ .optional()
75
+ .describe("kind=code: a CodeBlock '(ctx) => { ... }' run in the vm sandbox"),
76
+ })
77
+ .describe("A single job step — calls a whole workflow or runs a code block");
78
+ const jobDefinitionSchema = z
79
+ .object({
80
+ region: z.enum(["us", "ca"]),
81
+ resource: z
82
+ .object({
83
+ configStoreId: z.string().optional(),
84
+ lockKey: z
85
+ .string()
86
+ .optional()
87
+ .describe("Serialize execution per desktop/VM"),
88
+ })
89
+ .optional(),
90
+ inputSchema: z
91
+ .record(z.string(), z.unknown())
92
+ .describe("JSON Schema for the job input"),
93
+ outputSchema: z
94
+ .record(z.string(), z.unknown())
95
+ .describe("JSON Schema for the job output"),
96
+ steps: z.array(jobStepSchema).describe("Ordered step graph"),
97
+ output: z
98
+ .string()
99
+ .optional()
100
+ .describe("CodeBlock '(ctx) => response' producing the final output; also where partial/review status is decided"),
101
+ })
102
+ .describe("The structured job definition (step graph)");
103
+ const assertionSchema = z.object({
104
+ name: z.string().describe("Assertion name shown in the report"),
105
+ expr: z
106
+ .string()
107
+ .describe("TS boolean expression over `{ input, output, ctx, steps }`, e.g. 'output.status === \"ok\"'"),
108
+ });
109
+ export function register(deps) {
110
+ const { server } = deps;
111
+ function getClient(region) {
112
+ const token = deps.getAuthToken?.(region) || "";
113
+ return new MiddlewareServiceClient(deps.getApiBase(region), token);
114
+ }
115
+ function resolveRegion(workspaceId, explicit) {
116
+ if (explicit)
117
+ return explicit;
118
+ return getWorkspaceRegion(workspaceId) ?? undefined;
119
+ }
120
+ /**
121
+ * Fetch the workspace's first API key value via the Laminar core API
122
+ * (`GET /workspaces/:ws/api-keys` -> `[{ id, apiKey, name }]`). Returns
123
+ * undefined if the workspace has no keys.
124
+ */
125
+ async function firstWorkspaceApiKey(workspaceId, region) {
126
+ const keys = await deps.client(region).listApiKeys(workspaceId);
127
+ const list = Array.isArray(keys)
128
+ ? keys
129
+ : (keys?.content ?? keys?.apiKeys ?? []);
130
+ const first = list.find((k) => !!k?.apiKey);
131
+ return first?.apiKey;
132
+ }
133
+ // ── list_middlewares ───────────────────────────────────────
134
+ server.tool("list_middlewares", "List the routers (middlewares) in a workspace. A Job is a route on a router, so you need a middlewareId (from here) before register_job. If none exist, create one with register_middleware.", {
135
+ workspaceId: z.number().describe("Workspace ID"),
136
+ region: regionParam,
137
+ }, async ({ workspaceId, region }) => {
138
+ const r = resolveRegion(workspaceId, region);
139
+ try {
140
+ const middlewares = await getClient(r).listMiddlewares(workspaceId);
141
+ return ok({ middlewares });
142
+ }
143
+ catch (e) {
144
+ return text(`Error listing middlewares: ${e.message}`);
145
+ }
146
+ });
147
+ // ── register_middleware ────────────────────────────────────
148
+ server.tool("register_middleware", "Create a router (middleware) that Jobs attach to. Returns the middleware (use its id with register_job). The router needs a workspaceApiKey so its job workflow steps can call the Laminar API: pass `workspaceApiKey` explicitly, or leave autoConfigure=true (default) to fetch + set the workspace's first API key automatically. `workspaceApiKeyConfigured` in the result reflects whether the key actually stuck.", {
149
+ workspaceId: z.number().describe("Workspace ID"),
150
+ name: z.string().describe("Human-readable router name"),
151
+ slug: z
152
+ .string()
153
+ .describe("URL-safe slug (used in the runtime path /m/<slug>/*)"),
154
+ description: z.string().optional(),
155
+ workspaceApiKey: z
156
+ .string()
157
+ .optional()
158
+ .describe("Explicit workspace API key to set on the router. Takes precedence over autoConfigure. Use list_workspace_api_keys to find one."),
159
+ autoConfigure: z
160
+ .boolean()
161
+ .optional()
162
+ .describe("Fetch + set the workspace's first API key after creating (default true). Ignored if workspaceApiKey is provided."),
163
+ region: regionParam,
164
+ }, async ({ workspaceId, name, slug, description, workspaceApiKey, autoConfigure, region }) => {
165
+ const r = resolveRegion(workspaceId, region);
166
+ try {
167
+ const client = getClient(r);
168
+ const middleware = await client.createMiddleware(workspaceId, {
169
+ name,
170
+ slug,
171
+ description,
172
+ });
173
+ // Resolve the key to set: explicit param wins; otherwise (autoConfigure)
174
+ // fetch the workspace's first API key.
175
+ let keyToSet = workspaceApiKey;
176
+ if (!keyToSet && autoConfigure !== false) {
177
+ try {
178
+ keyToSet = await firstWorkspaceApiKey(workspaceId, r);
179
+ }
180
+ catch {
181
+ /* non-fatal: fall through to "not configured" below */
182
+ }
183
+ }
184
+ let configured = false;
185
+ if (keyToSet) {
186
+ try {
187
+ const updated = await client.setWorkspaceApiKey(workspaceId, middleware.id, keyToSet);
188
+ configured = !!updated?.workspaceApiKey;
189
+ if (updated)
190
+ Object.assign(middleware, updated);
191
+ }
192
+ catch {
193
+ /* non-fatal: report not-configured below */
194
+ }
195
+ }
196
+ if (configured) {
197
+ return ok({ status: "created", middleware, workspaceApiKeyConfigured: true });
198
+ }
199
+ return ok({
200
+ status: "created",
201
+ middleware,
202
+ workspaceApiKeyConfigured: false,
203
+ note: "Router has no workspace API key set. Set one with set_middleware_api_key (find a key via list_workspace_api_keys) so job workflow steps can run.",
204
+ });
205
+ }
206
+ catch (e) {
207
+ return text(`Error creating middleware: ${e.message}`);
208
+ }
209
+ });
210
+ // ── list_workspace_api_keys ────────────────────────────────
211
+ server.tool("list_workspace_api_keys", "List a workspace's API keys (id, apiKey, name) via the Laminar core API. Use to find a key for set_middleware_api_key or register_middleware's workspaceApiKey param.", {
212
+ workspaceId: z.number().describe("Workspace ID"),
213
+ region: regionParam,
214
+ }, async ({ workspaceId, region }) => {
215
+ const r = resolveRegion(workspaceId, region);
216
+ try {
217
+ const apiKeys = await deps.client(r).listApiKeys(workspaceId);
218
+ return ok({ apiKeys });
219
+ }
220
+ catch (e) {
221
+ return text(`Error listing workspace API keys: ${e.message}`);
222
+ }
223
+ });
224
+ // ── set_middleware_api_key ─────────────────────────────────
225
+ server.tool("set_middleware_api_key", "Set a router (middleware)'s workspaceApiKey. PUTs the key to the middleware and re-reads it, returning the updated middleware so you can confirm workspaceApiKey is now set.", {
226
+ workspaceId: z.number().describe("Workspace ID"),
227
+ middlewareId: z.string().describe("Router (middleware) ID"),
228
+ workspaceApiKey: z
229
+ .string()
230
+ .describe("Workspace API key to set on the router (from list_workspace_api_keys)"),
231
+ region: regionParam,
232
+ }, async ({ workspaceId, middlewareId, workspaceApiKey, region }) => {
233
+ const r = resolveRegion(workspaceId, region);
234
+ try {
235
+ const middleware = await getClient(r).setWorkspaceApiKey(workspaceId, middlewareId, workspaceApiKey);
236
+ if (!middleware) {
237
+ return text(`No middleware found with id ${middlewareId} after update.`);
238
+ }
239
+ return ok({
240
+ status: "updated",
241
+ middleware,
242
+ workspaceApiKeyConfigured: !!middleware.workspaceApiKey,
243
+ });
244
+ }
245
+ catch (e) {
246
+ return text(`Error setting middleware API key: ${e.message}`);
247
+ }
248
+ });
249
+ // ── register_job ───────────────────────────────────────────
250
+ server.tool("register_job", "Create a Job — a middleware route backed by a structured `definition` (step graph) instead of freeform handler code. A job step calls an entire Minicor workflow (by workflowId) or runs a code block; the job layer never touches a workflow's internal steps. Returns the created route (the job). Use add_test_case + run_tests to verify it.", {
251
+ workspaceId: z.number().describe("Workspace ID"),
252
+ middlewareId: z
253
+ .string()
254
+ .describe("Router (middleware) ID this job/route belongs to"),
255
+ path: z
256
+ .string()
257
+ .describe("Route path for the job, e.g. '/coi' or '/account-lookup'"),
258
+ method: z
259
+ .string()
260
+ .optional()
261
+ .describe("HTTP method (default POST)"),
262
+ description: z.string().optional().describe("What this job does"),
263
+ definition: jobDefinitionSchema,
264
+ region: regionParam,
265
+ }, async ({ workspaceId, middlewareId, path, method, description, definition, region }) => {
266
+ const r = resolveRegion(workspaceId, region);
267
+ try {
268
+ const job = await getClient(r).createJob(workspaceId, middlewareId, {
269
+ path,
270
+ method,
271
+ description,
272
+ definition: definition,
273
+ });
274
+ return ok({ status: "created", job });
275
+ }
276
+ catch (e) {
277
+ return text(`Error registering job: ${e.message}`);
278
+ }
279
+ });
280
+ // ── update_job ─────────────────────────────────────────────
281
+ server.tool("update_job", "Update a Job's definition (step graph), path, method, or description. Versioning a job creates a new route_version snapshot.", {
282
+ workspaceId: z.number().describe("Workspace ID"),
283
+ middlewareId: z.string().describe("Router (middleware) ID"),
284
+ routeId: z.string().describe("Route ID (the job) to update"),
285
+ path: z.string().optional(),
286
+ method: z.string().optional(),
287
+ description: z.string().optional(),
288
+ definition: jobDefinitionSchema.optional(),
289
+ region: regionParam,
290
+ }, async ({ workspaceId, middlewareId, routeId, path, method, description, definition, region }) => {
291
+ const r = resolveRegion(workspaceId, region);
292
+ try {
293
+ const body = {};
294
+ if (path !== undefined)
295
+ body.path = path;
296
+ if (method !== undefined)
297
+ body.method = method;
298
+ if (description !== undefined)
299
+ body.description = description;
300
+ if (definition !== undefined)
301
+ body.definition = definition;
302
+ const job = await getClient(r).updateJob(workspaceId, middlewareId, routeId, body);
303
+ return ok({ status: "updated", job });
304
+ }
305
+ catch (e) {
306
+ return text(`Error updating job: ${e.message}`);
307
+ }
308
+ });
309
+ // ── get_job ────────────────────────────────────────────────
310
+ server.tool("get_job", "Get a Job (route) including its `definition`. The management API has no single-route GET, so this lists the router's routes and filters by routeId. Omit routeId to list all routes (job-backed ones have `definition` set).", {
311
+ workspaceId: z.number().describe("Workspace ID"),
312
+ middlewareId: z.string().describe("Router (middleware) ID"),
313
+ routeId: z
314
+ .string()
315
+ .optional()
316
+ .describe("Route ID (the job). Omit to list all routes on the router."),
317
+ region: regionParam,
318
+ }, async ({ workspaceId, middlewareId, routeId, region }) => {
319
+ const r = resolveRegion(workspaceId, region);
320
+ try {
321
+ const client = getClient(r);
322
+ if (!routeId) {
323
+ const routes = await client.listRoutes(workspaceId, middlewareId);
324
+ return ok({ routes });
325
+ }
326
+ const job = await client.getJob(workspaceId, middlewareId, routeId);
327
+ if (!job)
328
+ return text(`No route found with id ${routeId} on router ${middlewareId}.`);
329
+ return ok({ job });
330
+ }
331
+ catch (e) {
332
+ return text(`Error fetching job: ${e.message}`);
333
+ }
334
+ });
335
+ // ── run_job ────────────────────────────────────────────────
336
+ server.tool("run_job", "Run a Job once with the given input, then poll the job execution to completion and return the full JobExecution (status, output, per-step results with Minicor deep-links). Async under the hood — this tool waits for the result.", {
337
+ workspaceId: z.number().describe("Workspace ID"),
338
+ middlewareId: z.string().describe("Router (middleware) ID"),
339
+ routeId: z.string().describe("Route ID (the job) to run"),
340
+ input: z
341
+ .record(z.string(), z.unknown())
342
+ .describe("Input payload for the job (validated against inputSchema)"),
343
+ trigger: z
344
+ .enum(["mcp", "api", "test"])
345
+ .optional()
346
+ .describe("Trigger label recorded on the execution (default mcp)"),
347
+ timeoutMs: z
348
+ .number()
349
+ .optional()
350
+ .describe("Max ms to poll before giving up (default 300000)"),
351
+ region: regionParam,
352
+ }, async ({ workspaceId, middlewareId, routeId, input, trigger, timeoutMs, region }) => {
353
+ const r = resolveRegion(workspaceId, region);
354
+ try {
355
+ const client = getClient(r);
356
+ const { jobExecutionId } = await client.runJob(workspaceId, middlewareId, routeId, input, trigger ?? "mcp");
357
+ const execution = await client.pollExecution(workspaceId, middlewareId, routeId, jobExecutionId, { timeoutMs });
358
+ return ok({ jobExecutionId, execution });
359
+ }
360
+ catch (e) {
361
+ return text(`Error running job: ${e.message}`);
362
+ }
363
+ });
364
+ // ── get_job_execution ──────────────────────────────────────
365
+ server.tool("get_job_execution", "Fetch one past JobExecution by id — the full trace for playing detective on a test case or run: status, input, the final output, the accumulated `context` (the through-line of data between steps), and per-step results (status ran/skipped/failed, the runtime input/output each step received, `workflowRuns[]` = one Minicor execution + replay per forEach iteration, and any logs). Use the jobExecutionId from run_job / run_tests / a test result.", {
366
+ workspaceId: z.number().describe("Workspace ID"),
367
+ middlewareId: z.string().describe("Router (middleware) ID"),
368
+ routeId: z.string().describe("Route ID (the job)"),
369
+ executionId: z.string().describe("Job execution ID to fetch"),
370
+ region: regionParam,
371
+ }, async ({ workspaceId, middlewareId, routeId, executionId, region }) => {
372
+ const r = resolveRegion(workspaceId, region);
373
+ try {
374
+ const execution = await getClient(r).getExecution(workspaceId, middlewareId, routeId, executionId);
375
+ return ok({ execution });
376
+ }
377
+ catch (e) {
378
+ return text(`Error fetching job execution: ${e.message}`);
379
+ }
380
+ });
381
+ // ── add_test_case ──────────────────────────────────────────
382
+ server.tool("add_test_case", "Attach a test case to a Job (route): a named input + code-block assertions `[{ name, expr }]`. Each `expr` is a TS boolean over `{ input, output, ctx, steps }` evaluated against the job execution. This is the green-gate for the build loop — define the expected behavior, then build the job to satisfy it.", {
383
+ workspaceId: z.number().describe("Workspace ID"),
384
+ middlewareId: z.string().describe("Router (middleware) ID"),
385
+ routeId: z.string().describe("Route ID (the job) the case belongs to"),
386
+ name: z.string().describe("Test case name"),
387
+ description: z.string().optional(),
388
+ input: z
389
+ .record(z.string(), z.unknown())
390
+ .describe("Request payload to run the job with"),
391
+ assertions: z
392
+ .array(assertionSchema)
393
+ .describe("Code-block assertions: [{ name, expr }]"),
394
+ tags: z.array(z.string()).optional(),
395
+ enabled: z.boolean().optional().describe("Default true"),
396
+ region: regionParam,
397
+ }, async ({ workspaceId, middlewareId, routeId, name, description, input, assertions, tags, enabled, region }) => {
398
+ const r = resolveRegion(workspaceId, region);
399
+ try {
400
+ const testCase = await getClient(r).addTestCase(workspaceId, middlewareId, routeId, {
401
+ name,
402
+ description,
403
+ input,
404
+ assertions,
405
+ tags,
406
+ enabled,
407
+ });
408
+ return ok({ status: "created", testCase });
409
+ }
410
+ catch (e) {
411
+ return text(`Error adding test case: ${e.message}`);
412
+ }
413
+ });
414
+ // ── run_tests ──────────────────────────────────────────────
415
+ server.tool("run_tests", "Run a Job's test suite (all enabled cases, or a subset via testCaseIds), poll the test run to completion, and return the report (totals + per-case results with drill-down into the job execution). Use as the green-gate before declaring a job done.", {
416
+ workspaceId: z.number().describe("Workspace ID"),
417
+ middlewareId: z.string().describe("Router (middleware) ID"),
418
+ routeId: z.string().describe("Route ID (the job) to test"),
419
+ testCaseIds: z
420
+ .array(z.string())
421
+ .optional()
422
+ .describe("Specific test case IDs to run (omit = all enabled)"),
423
+ timeoutMs: z
424
+ .number()
425
+ .optional()
426
+ .describe("Max ms to poll before giving up (default 600000)"),
427
+ region: regionParam,
428
+ }, async ({ workspaceId, middlewareId, routeId, testCaseIds, timeoutMs, region }) => {
429
+ const r = resolveRegion(workspaceId, region);
430
+ try {
431
+ const client = getClient(r);
432
+ const { testRunId } = await client.startTestRun(workspaceId, middlewareId, routeId, testCaseIds);
433
+ const report = await client.pollTestRun(workspaceId, middlewareId, routeId, testRunId, { timeoutMs });
434
+ const passed = report.testRun.status === "passed";
435
+ return ok({
436
+ testRunId,
437
+ status: report.testRun.status,
438
+ green: passed,
439
+ totals: report.testRun.totals,
440
+ results: report.results,
441
+ });
442
+ }
443
+ catch (e) {
444
+ return text(`Error running tests: ${e.message}`);
445
+ }
446
+ });
447
+ // ── get_test_report ────────────────────────────────────────
448
+ server.tool("get_test_report", "Fetch a test run report by id (totals + per-case results, each linking to its job execution for step-level drill-down). Use after run_tests, or to re-read an older run.", {
449
+ workspaceId: z.number().describe("Workspace ID"),
450
+ middlewareId: z.string().describe("Router (middleware) ID"),
451
+ routeId: z.string().describe("Route ID (the job)"),
452
+ testRunId: z.string().describe("Test run ID"),
453
+ region: regionParam,
454
+ }, async ({ workspaceId, middlewareId, routeId, testRunId, region }) => {
455
+ const r = resolveRegion(workspaceId, region);
456
+ try {
457
+ const report = await getClient(r).getTestRun(workspaceId, middlewareId, routeId, testRunId);
458
+ return ok({
459
+ status: report.testRun.status,
460
+ green: report.testRun.status === "passed",
461
+ totals: report.testRun.totals,
462
+ results: report.results,
463
+ });
464
+ }
465
+ catch (e) {
466
+ return text(`Error fetching test report: ${e.message}`);
467
+ }
468
+ });
469
+ }
470
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"vm-rpa.d.ts","sourceRoot":"","sources":["../../src/tools/vm-rpa.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAY5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAudtC"}
1
+ {"version":3,"file":"vm-rpa.d.ts","sourceRoot":"","sources":["../../src/tools/vm-rpa.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAY5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAkjBtC"}