@minicor/mcp-server 4.10.0 → 4.12.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.
package/README.md CHANGED
@@ -298,7 +298,7 @@ After a successful build:
298
298
 
299
299
  ## Blueprints (the spec front door)
300
300
 
301
- A **Blueprint** is the living spec + context library that owns a job. Instead of hand-writing a job definition, you feed the blueprint's library (SOPs, Loom videos, notes, transcripts, VM walkthrough sessions), let the service synthesize a spec proposal, review and apply it, then `blueprint_build` syncs the spec into a Job and hands the jobs toolset its coordinates (`middlewareId`/`routeId`/`buildId`). One ownership rule: when a route is blueprint-linked, never `register_job` / `update_job` / `add_test_case` on it directly - that trips reverse-drift detection (state `job_ahead`). Drive changes through the spec.
301
+ A **Blueprint** is the living spec + context library that owns a job. Instead of hand-writing a job definition, you feed the blueprint's library (SOPs, Loom videos, notes, transcripts, VM walkthrough sessions), let the service synthesize a spec proposal, review and apply it, then `blueprint_build` syncs the spec into a Job and hands the jobs toolset its coordinates (`middlewareId`/`routeId`/`buildId`). One ownership rule: when a route is blueprint-linked, never `register_job` / `update_job` / `add_test_case` on it directly - that trips reverse-drift detection (state `job_ahead`). Drive changes through the spec. Sanctioned escape hatch for intentional direct edits (e.g. bulk job edits): pass `acknowledgeJobAhead: true` to `update_job` / `add_test_case`; the tool proceeds and the response carries a `job_ahead` warning with the fold-back options (`blueprint_import_cases`, or `blueprint_build` which overwrites the direct edits).
302
302
 
303
303
  ### The blueprint tools
304
304
 
@@ -354,11 +354,11 @@ A **Job** is a middleware route whose behavior is a structured `definition` (a s
354
354
 
355
355
  | Tool | What it does |
356
356
  | --- | --- |
357
- | `resolve_job_state` | The first call to make when picking up a job. Returns the job's state (draft vs published, test cases, latest test run, recent executions, active build) plus `nextActions` - the concrete next tool calls. A red test run is drilled automatically: failing case → failing step → its `workflowId` (a `dev_mode_load` hint) → a seeded `fromStepId` replay command. Blueprint-owned routes come back with a `blueprint` block: edit those through the spec (`resolve_blueprint_state`), not `update_job`/`add_test_case`. |
357
+ | `resolve_job_state` | The first call to make when picking up a job. Returns the job's state (draft vs published, test cases, latest test run, recent executions, active build) plus `nextActions` - the concrete next tool calls. A red test run is drilled automatically: failing case → failing step → its `workflowId` (a `dev_mode_load` hint) → a seeded `fromStepId` replay command. Blueprint-owned routes come back with a `blueprint` block: edit those through the spec (`resolve_blueprint_state`), not `update_job`/`add_test_case` - or pass `acknowledgeJobAhead: true` to those tools for a sanctioned direct edit that returns a `job_ahead` warning with fold-back options. |
358
358
  | `list_middlewares` | List the routers (middlewares) in a workspace - jobs attach to one of these. |
359
359
  | `register_middleware` | Create a router jobs attach to. `autoConfigure` (default true) populates the router's `workspaceApiKey` from the workspace's first key; or pass `workspaceApiKey` explicitly. |
360
360
  | `register_job` | Create a job - a route backed by a structured `definition` (step graph). |
361
- | `update_job` | Update a job's `definition`, path, method, or description. `variant: "draft"` writes the draft definition (the teach/build working copy); `variant: "published"` (default) edits the live definition and snapshots a new route version. |
361
+ | `update_job` | Update a job's `definition`, path, method, or description. `variant: "draft"` writes the draft definition (the teach/build working copy); `variant: "published"` (default) edits the live definition and snapshots a new route version. On a blueprint-linked route, pass `acknowledgeJobAhead: true` for an intentional direct edit; the response carries a `job_ahead` warning with fold-back options. |
362
362
  | `get_job` | Get a job (route) incl. its `definition` (and `draftDefinition` when one exists); omit `routeId` to list all routes on the router. |
363
363
  | `run_job` | Run a job once with an input, poll to completion, return the full `JobExecution` (per-step Minicor deep-links). `variant: "draft"` runs the draft definition. For step-range debugging, `fromStepId` / `toStepId` (both inclusive) run a slice of the step graph, and `seedExecutionId` hydrates `ctx` from a prior execution so mid-graph starts still resolve earlier steps' values. `waitForResult: false` returns the `jobExecutionId` immediately for runs you want to stop or monitor. `webhookId` publishes workflow progress and `job.completed` to a registered destination for that run. |
364
364
  | `list_job_webhooks` | List reusable webhook destinations on a router (url, masked auth, `workflowIds`, `includeJob`, plus subscribed `eventTypes`). |
@@ -377,7 +377,7 @@ A **Job** is a middleware route whose behavior is a structured `definition` (a s
377
377
  | `answer_build_question` | Answer a `needs_input` question on a build run (credentials choice, ambiguity, 2FA policy). When no open questions remain the build re-queues automatically. |
378
378
  | `cancel_build` | Stop a queued/running autonomous build run. The build flips to `failed` with a "stopped by user" summary; the job's draft definition is left as-is. Use it to take the loop over manually. |
379
379
  | `update_build_run` | Builder-facing: update a build run's lifecycle (`running` when you start, `green`/`failed` with a summary when done, `needs_input` with questions when blocked). |
380
- | `add_test_case` | Attach a test case to a job: named `input` + assertions (the green-gate). A test case is one sample API call; group it into a scenario with `scenarioId` (cases in a scenario share identical assertions; the legacy `scenario:<slug>` tag is dual-written). Assertions are `expr` (sandbox boolean) or `judge` (an LLM grades the execution against a natural-language `intent`). |
380
+ | `add_test_case` | Attach a test case to a job: named `input` + assertions (the green-gate). A test case is one sample API call; group it into a scenario with `scenarioId` (cases in a scenario share identical assertions; the legacy `scenario:<slug>` tag is dual-written). Assertions are `expr` (sandbox boolean) or `judge` (an LLM grades the execution against a natural-language `intent`). On a blueprint-linked route, pass `acknowledgeJobAhead: true` for an intentional direct add; the response carries a `job_ahead` warning with fold-back options. |
381
381
  | `update_test_case` | Update an existing test case: tighten assertions as behavior firms up, move a case into a different scenario (`scenarioId`; `null` ungroups), or set `enabled: false` to disable a case without deleting its history. |
382
382
  | `list_scenarios` | List a job's scenarios, each with its member test cases embedded. Auto-created scenarios (from execution-path grouping) carry a `pathFingerprint` — rename them to describe the behavior. |
383
383
  | `create_scenario` | Create a scenario (name + optional slug/description; slug unique per route). Name it after the path/outcome, not the input. |
@@ -740,6 +740,19 @@ Read it before building or debugging workflows; write to it when you learn somet
740
740
 
741
741
  Agents are autonomous runners that execute tasks on VMs using MCP tools. After building a workflow, the `build-rpa-workflow` prompt offers to create a monitoring agent that watches for failures and auto-recovers.
742
742
 
743
+ ### Agent Harness (staff)
744
+
745
+
746
+ | Tool | What it does |
747
+ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
748
+ | `list_agent_catalog` | Discover what is spawnable: catalog agents (runMode + input schema), session task manifests like `worker`, and the informational session runtimes |
749
+ | `spawn_agent` | Spawn a catalog agent (background run) or `worker`/session manifest (task run) into a workspace, with optional per-run `model`/`budgets`/`promptAddendum` overrides and thread lineage |
750
+ | `agent_thread` | Compact thread chronology: every run on the thread (agent, status, terminal reason, cost, parked question) plus an optional task run's activity |
751
+ | `answer_agent` | Answer a parked (`needs_input`) engine run positionally; the run resumes in the background |
752
+ | `await_agent` | Poll a run or task run to terminal (default 300s, max 1800s) and return the compact result; returns early when a run parks on `needs_input` |
753
+
754
+ Spawns are staff-gated and spend-guarded server-side; every harness spawn carries `source: "mcp"` and lands on a thread visible in the staff console.
755
+
743
756
  ### Skills
744
757
 
745
758
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-harness-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-harness-tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Harness tool tests: the spawn payload contract (idempotency key, source marker, nested overrides,
3
+ * thread stamp), worker routing via the task door, the answers body shape, await_agent's needs_input
4
+ * early return, and the catalog merge. Mirrors jobs-tools.test.ts (in-memory transport, routed fetch).
5
+ */
6
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
7
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
8
+ import { afterEach, describe, expect, it, vi } from "vitest";
9
+ import { createMinicorServer } from "../lib.js";
10
+ const WORKER_TASKS = { tasks: [{ slug: "worker", name: "Worker", description: "d", input_schema: {} }] };
11
+ const jsonResponse = (body) => new Response(JSON.stringify(body), { status: 200, headers: { "Content-Type": "application/json" } });
12
+ function routedFetch(routes) {
13
+ return vi.fn(async (input, _init) => {
14
+ const path = new URL(String(input)).pathname;
15
+ for (const [suffix, body] of Object.entries(routes))
16
+ if (path.endsWith(suffix))
17
+ return jsonResponse(body);
18
+ throw new Error(`Unexpected fetch: ${String(input)}`);
19
+ });
20
+ }
21
+ async function startServer() {
22
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
23
+ const embedded = await createMinicorServer(serverTransport, {
24
+ localTools: false,
25
+ credentials: { access_token: "test-token", refresh_token: "r", expires_at: Date.now() + 3_600_000 },
26
+ baseUrl: "https://api.test.com",
27
+ codeMode: false,
28
+ });
29
+ const client = new Client({ name: "test-client", version: "1.0.0" });
30
+ await client.connect(clientTransport);
31
+ return { client, embedded };
32
+ }
33
+ const parse = (result) => JSON.parse(result.content[0].text);
34
+ const bodyOf = (fetchMock, suffix) => JSON.parse(String(fetchMock.mock.calls.find(([u]) => String(u).endsWith(suffix))[1].body));
35
+ async function callTool(routes, name, args) {
36
+ const fetchMock = routedFetch(routes);
37
+ vi.stubGlobal("fetch", fetchMock);
38
+ const { client, embedded } = await startServer();
39
+ try {
40
+ return { payload: parse(await client.callTool({ name, arguments: args })), fetchMock };
41
+ }
42
+ finally {
43
+ await client.close();
44
+ await embedded.close();
45
+ }
46
+ }
47
+ afterEach(() => vi.unstubAllGlobals());
48
+ describe("agent harness tools", () => {
49
+ it("spawn_agent posts the plan's run-door contract for catalog agents", async () => {
50
+ const { payload, fetchMock } = await callTool({ "/api/agents/tasks": WORKER_TASKS, "/agents/job-builder/run": { run: { id: "run-1", status: "queued", thread_id: "th-1" } } }, "spawn_agent", { workspaceId: 11, agentId: "job-builder", input: { goal: "g" }, region: "us", model: "gpt-x", budgets: { maxSteps: 5, maxCostUsd: 2 }, promptAddendum: "care", thread: { threadId: "th-1", parentRunId: "run-0" } });
51
+ const body = bodyOf(fetchMock, "/run");
52
+ expect(body).toMatchObject({
53
+ workspace_id: 11, input: { goal: "g" }, region: "us", source: "mcp", thread: { thread_id: "th-1", parent_run_id: "run-0" },
54
+ overrides: { model: "gpt-x", budgets: { maxSteps: 5, maxCostUsd: 2 }, promptAddendum: "care" },
55
+ });
56
+ expect(body.model).toBeUndefined(); // harness-contract nests every override
57
+ expect(body.idempotency_key).toMatch(/^mcp:[0-9a-f-]{36}$/);
58
+ expect(payload).toMatchObject({ runId: "run-1", threadId: "th-1", status: "queued" });
59
+ });
60
+ it("spawn_agent routes session manifests through the task door with source: mcp", async () => {
61
+ const { payload, fetchMock } = await callTool({ "/api/agents/tasks": WORKER_TASKS, "/tasks/worker/runs": { run_id: "trun-1", session_id: "sess-1", run: { thread_id: "th-9", status: "running" } } }, "spawn_agent", { workspaceId: 11, agentId: "worker", brief: "do x", toolProfile: "readonly", budgets: { maxSteps: 9 }, region: "us" });
62
+ // Worker budgets ride input (workerInputSchema), not overrides:
63
+ expect(bodyOf(fetchMock, "/tasks/worker/runs")).toEqual({ workspaceId: 11, region: "us", source: "mcp", input: { brief: "do x", toolProfile: "readonly", budgets: { maxSteps: 9 } } });
64
+ expect(payload).toMatchObject({ taskRunId: "trun-1", sessionId: "sess-1", threadId: "th-9" });
65
+ });
66
+ it("answer_agent posts positional answers then reports the run compactly", async () => {
67
+ const { payload, fetchMock } = await callTool({ "/runs/run-1/answers": {}, "/api/agents/runs/run-1": { run: { id: "run-1", agent_id: "job-builder", status: "queued", created_at: 1 } } }, "answer_agent", { runId: "run-1", answers: ["yes", "42"], region: "us" });
68
+ expect(bodyOf(fetchMock, "/answers")).toEqual({ answers: ["yes", "42"], region: "us" });
69
+ expect(payload).toMatchObject({ answered: true, run: { runId: "run-1", status: "queued" } });
70
+ });
71
+ it("await_agent returns early with the parked question on needs_input", async () => {
72
+ const { payload, fetchMock } = await callTool({ "/api/agents/runs/run-1": { run: { id: "run-1", agent_id: "job-builder", status: "needs_input", needs_input_json: JSON.stringify({ questions: ["Which env?"] }), result_text: null } } }, "await_agent", { runId: "run-1", timeoutSeconds: 1 });
73
+ expect(payload).toMatchObject({ status: "needs_input", parkedQuestion: "Which env?" });
74
+ expect(fetchMock).toHaveBeenCalledTimes(1);
75
+ });
76
+ it("list_agent_catalog merges catalog, tasks, and session runtimes", async () => {
77
+ const { payload } = await callTool({
78
+ "/api/agents/agent-catalog": { agents: [{ id: "job-builder", run_mode: "background-job", input_schema: { type: "object" } }] },
79
+ "/api/agents/session-runtimes": { runtimes: [{ id: "session-copilot" }] },
80
+ "/api/agents/tasks": WORKER_TASKS,
81
+ }, "list_agent_catalog", {});
82
+ expect(payload.spawnable.map((s) => [s.id, s.kind])).toEqual([["job-builder", "run"], ["worker", "task"]]);
83
+ expect(payload.sessionRuntimes).toEqual([{ id: "session-copilot" }]);
84
+ });
85
+ });
86
+ //# sourceMappingURL=agent-harness-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-harness-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-harness-tools.test.ts"],"names":[],"mappings":"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"}