@minicor/mcp-server 3.3.5 → 3.5.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.
Files changed (35) hide show
  1. package/README.md +104 -4
  2. package/dist/__tests__/middleware-service-client.test.d.ts +2 -0
  3. package/dist/__tests__/middleware-service-client.test.d.ts.map +1 -0
  4. package/dist/__tests__/middleware-service-client.test.js +293 -0
  5. package/dist/__tests__/middleware-service-client.test.js.map +1 -0
  6. package/dist/helpers.d.ts +10 -0
  7. package/dist/helpers.d.ts.map +1 -1
  8. package/dist/helpers.js +59 -0
  9. package/dist/helpers.js.map +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/middleware-service-client.d.ts +266 -0
  14. package/dist/middleware-service-client.d.ts.map +1 -0
  15. package/dist/middleware-service-client.js +272 -0
  16. package/dist/middleware-service-client.js.map +1 -0
  17. package/dist/prompts/build-rpa.d.ts.map +1 -1
  18. package/dist/prompts/build-rpa.js +17 -0
  19. package/dist/prompts/build-rpa.js.map +1 -1
  20. package/dist/prompts/nestjs-to-job.d.ts +11 -0
  21. package/dist/prompts/nestjs-to-job.d.ts.map +1 -0
  22. package/dist/prompts/nestjs-to-job.js +110 -0
  23. package/dist/prompts/nestjs-to-job.js.map +1 -0
  24. package/dist/tools/jobs.d.ts +21 -0
  25. package/dist/tools/jobs.d.ts.map +1 -0
  26. package/dist/tools/jobs.js +624 -0
  27. package/dist/tools/jobs.js.map +1 -0
  28. package/dist/tools/vm-rpa.d.ts.map +1 -1
  29. package/dist/tools/vm-rpa.js +109 -25
  30. package/dist/tools/vm-rpa.js.map +1 -1
  31. package/dist/tools/workflow-ops.d.ts.map +1 -1
  32. package/dist/tools/workflow-ops.js +2 -55
  33. package/dist/tools/workflow-ops.js.map +1 -1
  34. package/package.json +1 -1
  35. package/skills/general/nestjs-middleware-to-job.md +82 -0
@@ -40,6 +40,20 @@ ${appName}
40
40
  ID: ${workspaceId}${workflowId ? `\nExisting workflow ID: ${workflowId} (add steps to this workflow)` : "\nCreate a new workflow for this automation."}
41
41
  ${modeSection}
42
42
 
43
+ ## WORK BACKWARDS — Define the Test Case FIRST
44
+
45
+ Before building anything, write down what "done" means as a concrete, runnable test:
46
+
47
+ 1. **State the contract.** What input does this automation take, and what output proves it worked? Write the input JSON and the expected output shape.
48
+ 2. **Author the green-gate.** A workflow's behavior is locked in by a **Job** with **test cases**. As the very first build artifact:
49
+ - Register a thin Job for this automation: \`register_job\` with a \`definition\` whose single \`workflow\` step calls this workflow (use a placeholder \`workflowId\` you'll fill in, or the existing one). The job is the testable wrapper above the workflow.
50
+ - Add the test case NOW: \`add_test_case\` with the input from step 1 and assertions \`[{ name, expr }]\` describing the expected output (e.g. \`output.patientId != null\`, \`output.status === "ok"\`). \`expr\` is a TS boolean over \`{ input, output, ctx, steps }\`.
51
+ 3. **The test is RED.** It will fail until the workflow exists and is correct. That red test is your target.
52
+ 4. **Build the workflow** (the loop below) to turn the test GREEN.
53
+ 5. **Green-gate:** the build is NOT done until \`run_tests\` reports \`green: true\`. Re-run \`run_tests\` after every meaningful change.
54
+
55
+ Use test patients only — never real patient data. Pick inputs/slots far in the future so tests don't collide with real schedules.
56
+
43
57
  ## MANDATORY FIRST STEP — Load Testing Skill
44
58
 
45
59
  Before doing ANYTHING else, run: \`get_skill("rpa-testing-workflow")\`
@@ -121,6 +135,9 @@ b. Poll \`get_execution_status\` every 5-10s, \`vm_screenshot\` at intervals to
121
135
  c. On failure → \`diagnose_execution\` + \`vm_screenshot\`, fix with \`update_flow\`, re-run FULL workflow
122
136
  d. Iterate until full workflow passes. **Do NOT declare done until it passes.**${isProduction ? "\ne. Run the workflow a SECOND time to verify idempotency." : ""}
123
137
 
138
+ ### 6b. GREEN-GATE — run_tests
139
+ The workflow passing once is not enough. Point the Job's workflow step at the finished \`workflowId\` (\`update_job\` if needed), then run \`run_tests\` for the job. **The build is done ONLY when \`run_tests\` returns \`green: true\`** and every test case passes. On a red result, drill into the failing case's job execution → step → Minicor run, fix, and re-run \`run_tests\`. Add more \`add_test_case\` entries for edge cases (empty results, not-found, second-run idempotency) and keep them green.
140
+
124
141
  ### 7. Iterate with the User
125
142
  ${isProduction ? `
126
143
  ### 8. Production Hardening
@@ -1 +1 @@
1
- {"version":3,"file":"build-rpa.js","sourceRoot":"","sources":["../../src/prompts/build-rpa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAY;IAC3C,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB,wSAAwS,EACxS;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACxD,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CACP,iHAAiH,CAClH;QACH,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,CACP,uFAAuF,CACxF;QACH,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,sEAAsE,CACvE;QACH,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;aAC3B,QAAQ,EAAE;aACV,QAAQ,CACP,4HAA4H,CAC7H;KACJ,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;QACzD,MAAM,YAAY,GAAG,IAAI,KAAK,YAAY,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI;YACtB,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,iFAAiF,EAAE;YAC9K,CAAC,CAAC,yIAAyI,CAAC;QAE9I,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;;;EAGlB,IAAI;;;EAGJ,OAAO;;;MAGH,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,2BAA2B,UAAU,+BAA+B,CAAC,CAAC,CAAC,8CAA8C;EACpJ,WAAW;;;;;;;;;;;;;;;;;;;;;;;0EAuB6D,YAAY,CAAC,CAAC,CAAC,sGAAsG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oGAAoG;;;;;;;;;;;;;;;;;;;;;;;;;YAyBvS,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iFAiC8D,YAAY,CAAC,CAAC,CAAC,4DAA4D,CAAC,CAAC,CAAC,EAAE;;;EAG/J,YAAY,CAAC,CAAC,CAAC;;;;;;CAMhB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;;;CAIhB;;;qFAGoF,YAAY,CAAC,CAAC,CAAC,8EAA8E,CAAC,CAAC,CAAC,EAAE;;sIAEjD;qBACzH;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"build-rpa.js","sourceRoot":"","sources":["../../src/prompts/build-rpa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAY;IAC3C,MAAM,CAAC,MAAM,CACX,oBAAoB,EACpB,wSAAwS,EACxS;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACxD,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CACP,iHAAiH,CAClH;QACH,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,CACP,uFAAuF,CACxF;QACH,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,sEAAsE,CACvE;QACH,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;aAC3B,QAAQ,EAAE;aACV,QAAQ,CACP,4HAA4H,CAC7H;KACJ,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;QACzD,MAAM,YAAY,GAAG,IAAI,KAAK,YAAY,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI;YACtB,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,iFAAiF,EAAE;YAC9K,CAAC,CAAC,yIAAyI,CAAC;QAE9I,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;;;EAGlB,IAAI;;;EAGJ,OAAO;;;MAGH,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,2BAA2B,UAAU,+BAA+B,CAAC,CAAC,CAAC,8CAA8C;EACpJ,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0EAqC6D,YAAY,CAAC,CAAC,CAAC,sGAAsG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oGAAoG;;;;;;;;;;;;;;;;;;;;;;;;;YAyBvS,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iFAiC8D,YAAY,CAAC,CAAC,CAAC,4DAA4D,CAAC,CAAC,CAAC,EAAE;;;;;;EAM/J,YAAY,CAAC,CAAC,CAAC;;;;;;CAMhB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;;;CAIhB;;;qFAGoF,YAAY,CAAC,CAAC,CAAC,8EAA8E,CAAC,CAAC,CAAC,EAAE;;sIAEjD;qBACzH;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ToolDeps } from "../types.js";
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 declare function register({ server }: ToolDeps): void;
11
+ //# sourceMappingURL=nestjs-to-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs-to-job.d.ts","sourceRoot":"","sources":["../../src/prompts/nestjs-to-job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,QAwG5C"}
@@ -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;AAQH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmG5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAqqBtC"}