@minicor/mcp-server 4.18.1 → 4.19.1

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 (100) hide show
  1. package/README.md +32 -12
  2. package/dist/__tests__/appmap-tools.test.d.ts +2 -0
  3. package/dist/__tests__/appmap-tools.test.d.ts.map +1 -0
  4. package/dist/__tests__/appmap-tools.test.js +254 -0
  5. package/dist/__tests__/appmap-tools.test.js.map +1 -0
  6. package/dist/__tests__/config-stores.test.js +5 -2
  7. package/dist/__tests__/config-stores.test.js.map +1 -1
  8. package/dist/__tests__/jobs-tools.test.js +2 -0
  9. package/dist/__tests__/jobs-tools.test.js.map +1 -1
  10. package/dist/__tests__/laminar-client.test.js +33 -0
  11. package/dist/__tests__/laminar-client.test.js.map +1 -1
  12. package/dist/__tests__/middleware-service-client.test.js +15 -0
  13. package/dist/__tests__/middleware-service-client.test.js.map +1 -1
  14. package/dist/__tests__/resource-id.test.d.ts +2 -0
  15. package/dist/__tests__/resource-id.test.d.ts.map +1 -0
  16. package/dist/__tests__/resource-id.test.js +15 -0
  17. package/dist/__tests__/resource-id.test.js.map +1 -0
  18. package/dist/__tests__/server-surface.test.js +131 -2
  19. package/dist/__tests__/server-surface.test.js.map +1 -1
  20. package/dist/__tests__/skills.test.d.ts +2 -0
  21. package/dist/__tests__/skills.test.d.ts.map +1 -0
  22. package/dist/__tests__/skills.test.js +18 -0
  23. package/dist/__tests__/skills.test.js.map +1 -0
  24. package/dist/bootstrap-perms.d.ts.map +1 -1
  25. package/dist/bootstrap-perms.js +19 -0
  26. package/dist/bootstrap-perms.js.map +1 -1
  27. package/dist/helpers.js +1 -1
  28. package/dist/helpers.js.map +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/laminar-client.d.ts +62 -46
  33. package/dist/laminar-client.d.ts.map +1 -1
  34. package/dist/laminar-client.js +47 -46
  35. package/dist/laminar-client.js.map +1 -1
  36. package/dist/lib.d.ts.map +1 -1
  37. package/dist/lib.js +2 -2
  38. package/dist/lib.js.map +1 -1
  39. package/dist/middleware/tool-error.d.ts +9 -0
  40. package/dist/middleware/tool-error.d.ts.map +1 -0
  41. package/dist/middleware/tool-error.js +17 -0
  42. package/dist/middleware/tool-error.js.map +1 -0
  43. package/dist/middleware-service-client.d.ts +72 -7
  44. package/dist/middleware-service-client.d.ts.map +1 -1
  45. package/dist/middleware-service-client.js +26 -8
  46. package/dist/middleware-service-client.js.map +1 -1
  47. package/dist/resource-id.d.ts +5 -0
  48. package/dist/resource-id.d.ts.map +1 -0
  49. package/dist/resource-id.js +13 -0
  50. package/dist/resource-id.js.map +1 -0
  51. package/dist/server-surface.d.ts +1 -10
  52. package/dist/server-surface.d.ts.map +1 -1
  53. package/dist/server-surface.js +41 -10
  54. package/dist/server-surface.js.map +1 -1
  55. package/dist/sync.d.ts +11 -9
  56. package/dist/sync.d.ts.map +1 -1
  57. package/dist/sync.js +12 -4
  58. package/dist/sync.js.map +1 -1
  59. package/dist/tools/appmap.d.ts +256 -0
  60. package/dist/tools/appmap.d.ts.map +1 -0
  61. package/dist/tools/appmap.js +326 -0
  62. package/dist/tools/appmap.js.map +1 -0
  63. package/dist/tools/config-stores.js +11 -11
  64. package/dist/tools/config-stores.js.map +1 -1
  65. package/dist/tools/configuration-references.d.ts +3 -0
  66. package/dist/tools/configuration-references.d.ts.map +1 -0
  67. package/dist/tools/configuration-references.js +30 -0
  68. package/dist/tools/configuration-references.js.map +1 -0
  69. package/dist/tools/core.d.ts.map +1 -1
  70. package/dist/tools/core.js +56 -55
  71. package/dist/tools/core.js.map +1 -1
  72. package/dist/tools/discovery.d.ts.map +1 -1
  73. package/dist/tools/discovery.js +2 -1
  74. package/dist/tools/discovery.js.map +1 -1
  75. package/dist/tools/drafts.d.ts +3 -0
  76. package/dist/tools/drafts.d.ts.map +1 -0
  77. package/dist/tools/drafts.js +35 -0
  78. package/dist/tools/drafts.js.map +1 -0
  79. package/dist/tools/job-webhook-defaults.d.ts +3 -0
  80. package/dist/tools/job-webhook-defaults.d.ts.map +1 -0
  81. package/dist/tools/job-webhook-defaults.js +25 -0
  82. package/dist/tools/job-webhook-defaults.js.map +1 -0
  83. package/dist/tools/jobs.d.ts.map +1 -1
  84. package/dist/tools/jobs.js +109 -70
  85. package/dist/tools/jobs.js.map +1 -1
  86. package/dist/tools/recording-common.d.ts +3 -2
  87. package/dist/tools/recording-common.d.ts.map +1 -1
  88. package/dist/tools/recording-common.js.map +1 -1
  89. package/dist/tools/recording.d.ts.map +1 -1
  90. package/dist/tools/recording.js +10 -12
  91. package/dist/tools/recording.js.map +1 -1
  92. package/dist/tools/sync-tools.d.ts.map +1 -1
  93. package/dist/tools/sync-tools.js +6 -7
  94. package/dist/tools/sync-tools.js.map +1 -1
  95. package/dist/tools/workflow-ops.d.ts.map +1 -1
  96. package/dist/tools/workflow-ops.js +9 -8
  97. package/dist/tools/workflow-ops.js.map +1 -1
  98. package/package.json +1 -1
  99. package/skills/general/job-webhooks.md +2 -2
  100. package/skills/general/rpa-build-framework.md +87 -0
package/README.md CHANGED
@@ -348,17 +348,19 @@ Two drift directions keep the spec and the job honest: `spec_stale` (the library
348
348
 
349
349
  ## Jobs (RPA orchestration)
350
350
 
351
- A **Job** is a middleware route whose behavior is a structured `definition` (a step graph) instead of freeform handler code. Jobs sit **above** workflows: a job step either calls an entire Minicor workflow (`kind: "workflow"`, by `workflowId`) or runs a code block (`kind: "code"`). The job never touches a workflow's internal steps - a workflow is an opaque callable with an input and an output. A job is the **macro zoom** (what ran, status, replays); a workflow → step is the **microscope**. This is the layer that turns one or more workflows into a versioned, testable, observable API endpoint. When a route is owned by a Blueprint (see above), drive changes through the spec, not the direct job tools.
351
+ A **Job** is a middleware route whose behavior is a structured `definition` (a step graph) instead of freeform handler code. Jobs sit **above** workflows and can contain native or legacy workflow calls, storage operations, code, and registered durable executor steps. A job is the **macro zoom** (what ran, status, replays); a workflow → step is the **microscope**. This is the layer that turns one or more workflows into a versioned, testable, observable API endpoint. When a route is owned by a Blueprint (see above), drive changes through the spec, not the direct job tools.
352
352
 
353
353
  ### The job tools
354
354
 
355
355
  | Tool | What it does |
356
356
  | --- | --- |
357
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
+ | `list_configuration_references` | List safe workspace configuration metadata: native `configurationId`, exact case-sensitive `externalId`, name, and property names. Values, credentials, citation IDs, and alias fallbacks are never returned. |
359
+ | `validate_job_draft` | Validate the persisted draft for `phase: "framing"`, or `phase: "populating"` with one positive safe-integer `workflowId` (forbidden for framing), without execution. Population evidence also pins phase and workflow ID. |
358
360
  | `list_middlewares` | List the routers (middlewares) in a workspace - jobs attach to one of these. |
359
361
  | `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
362
  | `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. On a blueprint-linked route, pass `acknowledgeJobAhead: true` for an intentional direct edit; the response carries a `job_ahead` warning with fold-back options. |
363
+ | `update_job` | Update a job's `definition`, path, method, or description. `variant: "draft"` writes the draft definition; `expectedDraftRevision` protects repair writes from overwriting a newer draft. `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. |
362
364
  | `get_job` | Get a job (route) incl. its `definition` (and `draftDefinition` when one exists); omit `routeId` to list all routes on the router. |
363
365
  | `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
366
  | `list_job_webhooks` | List reusable webhook destinations on a router (url, masked auth, `workflowIds`, `includeJob`, plus subscribed `eventTypes`). |
@@ -367,6 +369,7 @@ A **Job** is a middleware route whose behavior is a structured `definition` (a s
367
369
  | `get_job_webhook` | Get one destination. Secrets are never returned. |
368
370
  | `update_job_webhook` | Update url, auth, `workflowIds`, and/or `includeJob`. |
369
371
  | `delete_job_webhook` | Delete a destination. |
372
+ | `get_job_default_webhook` / `set_job_default_webhook` | Get or set the inherited destination; `webhookId: null` clears it. Explicit run webhooks win; draft/test/teach runs do not inherit it. |
370
373
  | `stop_job_execution` | Stop a queued/running execution. This is a cooperative cancel (there is no pause): a queued run cancels immediately; a running one stops at the runner's next checkpoint (between steps, between `forEach` items, or while waiting on a workflow). A workflow already running on the VM is not killed - it finishes on its own; the job just stops waiting. Idempotent for already-cancelled runs. |
371
374
  | `list_job_executions` | List a job's executions (paginated summaries, newest first). Filter by `status` (`queued`/`running`/`succeeded`/`partial`/`failed`/`cancelled`) and/or `trigger` (`test` = suite runs; `api,mcp,cron` = live traffic). Use to find a prior run to seed a range run from, a running execution to stop, or the latest failure to inspect. |
372
375
  | `get_job_execution` | Fetch one past execution's full trace: status, input, output, `ctx`, per-step results. |
@@ -433,7 +436,7 @@ A job step supports `saveAs`, `when` (conditional skip), `forEach` (fan-out), `o
433
436
 
434
437
  - **Stopping:** there is no pause/resume. `stop_job_execution` is a cooperative cancel: a queued run cancels immediately; a running one stops at the runner's next checkpoint (between steps, between `forEach` items, or while waiting on a workflow). A workflow already running on a VM is not killed - it finishes on its own; the job just stops waiting and starts no new steps.
435
438
  - **Long or risky runs:** `run_job` with `waitForResult: false` returns the `jobExecutionId` immediately - poll it with `get_job_execution`, stop it with `stop_job_execution`.
436
- - **Progress webhooks:** destinations live on the router (`register_job_webhook` / `list_job_webhooks`). Pass `webhookId` on `run_job` to publish `workflow.started`, `workflow.step.started`, `workflow.step.completed` (failures included), `workflow.completed`, and optionally `job.completed` for that run. `workflowIds: null` means every workflow the router runs; `[]` means none; a list is an allow-list. `includeJob` (default true on create) adds `job.completed`. There is no `workflow.step.failed` - a failed flow is `workflow.step.completed` with `workflowStep.status: "FAILED"`. Call `get_job_webhook_events` (or `get_skill("job-webhooks")`) for the shared envelope and a full example of each payload.
439
+ - **Progress webhooks:** destinations live on the router (`register_job_webhook` / `list_job_webhooks`). `set_job_default_webhook` attaches one to every published api/mcp/cron run of a job; an explicit `run_job.webhookId` wins, and draft/test/teach runs do not inherit it. `webhookId: null` clears the default. `workflowIds: null` means every workflow the router runs; `[]` means none; a list is an allow-list. `includeJob` (default true on create) adds `job.completed`. There is no `workflow.step.failed` - a failed flow is `workflow.step.completed` with `workflowStep.status: "FAILED"`. Call `get_job_webhook_events` (or `get_skill("job-webhooks")`) for the shared envelope and a full example of each payload.
437
440
  - **Step-range replays:** `run_job` with `fromStepId` / `toStepId` runs only a slice of the step graph (both inclusive, by step id). For any mid-graph start, pass `seedExecutionId` - it hydrates `ctx` from that prior execution so steps you aren't re-running still have their `ctx.*` values. The job's `output` block only runs when the range covers the last step.
438
441
  - **Finding runs:** `list_job_executions` returns paginated summaries with `status` and `trigger` filters - `trigger: "test"` isolates suite runs, `trigger: "api,mcp,cron"` isolates live traffic (the same split as the platform's Development/Production lenses).
439
442
  - **Autonomous builds:** watch with `get_build_status`, unblock with `answer_build_question`, take over with `cancel_build`. Don't edit the draft while a build is running - coordinate or cancel first.
@@ -468,13 +471,13 @@ The `definition` you pass to `register_job` (see `register_job`'s `definition` p
468
471
 
469
472
  ```ts
470
473
  {
471
- region: "us" | "ca", // region awareness - also auto-detected from workspace
472
- resource?: { configStoreId?, lockKey? }, // configStoreId = which VM/desktop; lockKey serializes runs
473
- inputSchema: JSONSchema,
474
- outputSchema: JSONSchema,
474
+ region?: "us" | "ca", // optional region hint
475
+ resource?: { configurationId?, configStoreId?, lockKey? }, // native UUID or exact legacy alias; lockKey serializes runs
476
+ inputSchema?: JSONSchema,
477
+ outputSchema?: JSONSchema,
475
478
  steps: [ { id, name, kind, saveAs?, when?, forEach?, onError?, retry?, cache?,
476
- // kind:"workflow" → workflowId + input (object with {{ctx.x}} OR a (ctx)=>({...}) code block)
477
- // kind:"code" code: "(ctx) => ..."
479
+ // kind:"native-workflow" → workflow: { workflowDraftId | workflowId | workflowVersionId }
480
+ // kind:"workflow" legacy workflowId; storage uses operation; durable kinds retain their fields
478
481
  } ],
479
482
  output?: "(ctx) => response", // builds the job's response from the final ctx
480
483
  }
@@ -636,16 +639,29 @@ On multi-session (broker) VMs every execute/screenshot call must name a `targetU
636
639
 
637
640
  See the **Blueprints (the spec front door)** section above for the loop and the ownership rule.
638
641
 
642
+ ### App Map (per-blueprint screen memory)
643
+
644
+ One arctic-vault document per blueprint (kind `appmap`): the app's named screen states (`detect` predicates incl. `ocr`, `reachedBy` routes, `elements` incl. verified OCR `region`s, `blockers`, `screens`, screenshot refs), `login`/`teardown` workflow refs, and the gotchas ledger. Written by the Mapper/Fixer, read by the Author/Verifier; the second build of the same app maps nothing. `version` is the vault revision (CAS on write). Served by middleware-service's blueprint sub-resource (`/api/workspaces/:ws/blueprints/:id/appmap…`) with the user's bearer — no vault wiring on the MCP side; authorization is "may read this blueprint". The tool schemas mirror middleware's `appmap.schema.ts` field for field; backend failures (4xx/5xx other than the structured 409/404 blocks) come back with `isError: true`.
645
+
646
+ | Tool | What it does |
647
+ | ----------------------------- | ---------------------------------------------------------------------------------------------- |
648
+ | `appmap_get` | Read the map (optionally sliced to `states`, or a historical `version`); `absent` when unmapped |
649
+ | `appmap_upsert_state` | Write one state (merge or replace; creates the map with `app` on first write); CAS on `baseVersion`, `rev_conflict` block on a race, `tombstoned` block (revive with `baseVersion=currentVersion`; content is at `appmap_history`'s `lastLiveVersion`) after a delete |
650
+ | `appmap_find_element` | Resolve an element ref in a state to its locator; misses list the states/refs that DO exist |
651
+ | `appmap_history` | The map's version ledger (version, reason, who, when, `tombstoned`), newest first, plus `lastLiveVersion` — a delete is itself a revision, so recover a deleted map from the last live one |
652
+
639
653
  ### Jobs & Test Cases
640
654
 
641
655
 
642
656
  | Tool | What it does |
643
657
  | --------------------- | -------------------------------------------------------------------------------------------- |
644
658
  | `resolve_job_state` | "Where am I in the build loop?" - job state + `nextActions`; flags blueprint-owned routes |
659
+ | `list_configuration_references` | List safe native/alias reference metadata and property names |
660
+ | `validate_job_draft` | Validate persisted framing or populating (requires workflowId) and return scoped evidence |
645
661
  | `list_middlewares` | List the routers (middlewares) in a workspace - jobs attach to one of these |
646
662
  | `register_middleware` | Create a router (middleware) jobs attach to; `autoConfigure` populates its workspace API key |
647
663
  | `register_job` | Create a job - a middleware route backed by a structured `definition` (step graph) |
648
- | `update_job` | Update a job's `definition`, path, method, or description; `variant: "draft"` writes the draft |
664
+ | `update_job` | Update a job; repair writes can require `expectedDraftRevision` |
649
665
  | `get_job` | Get a job (route) incl. its `definition`; omit `routeId` to list all routes on the router |
650
666
  | `run_job` | Run a job once, poll to completion; `variant: "draft"` runs the draft. Step-range replays via `fromStepId`/`toStepId` + `seedExecutionId`; `webhookId` publishes progress events; `waitForResult: false` returns the execution id immediately |
651
667
  | `list_job_webhooks` | List reusable webhook destinations on a router |
@@ -654,6 +670,7 @@ See the **Blueprints (the spec front door)** section above for the loop and the
654
670
  | `get_job_webhook` | Get one destination (secrets never returned) |
655
671
  | `update_job_webhook` | Update url, auth, `workflowIds`, and/or `includeJob` |
656
672
  | `delete_job_webhook` | Delete a destination |
673
+ | `get_job_default_webhook` / `set_job_default_webhook` | Get/set the inherited destination; explicit run webhooks win and draft/test/teach do not inherit it |
657
674
  | `stop_job_execution` | Cooperative cancel of a queued/running execution (no pause; VM workflows finish on their own) |
658
675
  | `list_job_executions` | Paginated execution summaries with `status`/`trigger` filters (test vs live traffic) |
659
676
  | `get_job_execution` | Fetch one execution's full trace (status, input, output, `ctx`, per-step results) |
@@ -698,15 +715,18 @@ See the **Jobs (RPA orchestration)** section above for the build loop and job/ct
698
715
 
699
716
  Workflows that encounter 2FA prompts use these tools to auto-resolve OTP challenges. Provision channels once per workspace, store the IDs in config stores, and reference them with `{{config.sms_channel_id}}` or `{{config.totp_secret_id}}` at runtime.
700
717
 
701
- ### Config Stores
718
+ ### Configurations
702
719
 
703
720
 
704
721
  | Tool | What it does |
705
722
  | --------------------------------------------------- | --------------------------------------------------- |
706
- | `create_config_store` | Create a credential store with key-value properties |
723
+ | `create_config_store` | Create a configuration with key-value properties. Use the returned `externalId` with configuration tools; native configurations also return a UUID `id` for execution. |
707
724
  | `list_config_stores` / `get_config_store` | Browse stores |
708
725
  | `update_config_property` / `remove_config_property` | Manage individual properties |
709
726
 
727
+ Workflow and execution IDs are opaque. Use the existing workflow tools for native and legacy workflows; do not infer the execution engine from an ID's format. Use `create_job_draft` and `update_job_workflow_draft` for job-owned, isolated edits, then `run_job variant=draft` to execute them. `list_job_executions variant=draft|published` selects the history; `trigger` selects how a run started. A `run_job configurationId` override applies only to that run.
728
+
729
+ Standalone drafts use `create_workflow_draft`, `get_workflow_draft`, `update_workflow_draft`, and `run_workflow_draft`. Inspect the returned execution ID with `get_native_execution`. Discard unused drafts with `discard_job_draft` or `discard_workflow_draft`.
710
730
 
711
731
  Scripts reference credentials as `{{config.propertyKey}}` - resolved at runtime by the workflow engine.
712
732
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=appmap-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appmap-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/appmap-tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Tool-level tests for the appmap_* suite over middleware-service: the
3
+ * request shapes (blueprint sub-resource paths, user bearer, PUT body), the
4
+ * mapping of middleware's structured errors (rev_conflict / tombstoned /
5
+ * app_required / invalid_state / *_not_found) onto the blocks agents know,
6
+ * schema rejection at the tool boundary, and pass-through of the read
7
+ * shapes. In-memory transport + mocked fetch, mirroring
8
+ * blueprints-tools.test.ts.
9
+ */
10
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
11
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
12
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
13
+ import { createMinicorServer } from "../lib.js";
14
+ const MW_BASE = "https://mw.test";
15
+ const BP = "5668a1ae-3912-4713-b269-f98817b9ccd9";
16
+ const WS = 11;
17
+ const APPMAP = `/api/workspaces/${WS}/blueprints/${BP}/appmap`;
18
+ function jsonResponse(body, status = 200) {
19
+ return new Response(JSON.stringify(body), {
20
+ status,
21
+ headers: { "Content-Type": "application/json" },
22
+ });
23
+ }
24
+ async function startServer() {
25
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
26
+ const embedded = await createMinicorServer(serverTransport, {
27
+ localTools: false,
28
+ credentials: {
29
+ access_token: "test-token",
30
+ refresh_token: "test-refresh-token",
31
+ expires_at: Date.now() + 3_600_000,
32
+ },
33
+ baseUrl: "https://api.test.com",
34
+ codeMode: false,
35
+ });
36
+ const client = new Client({ name: "test-client", version: "1.0.0" });
37
+ await client.connect(clientTransport);
38
+ return { client, embedded };
39
+ }
40
+ const parse = (result) => JSON.parse(result.content[0].text);
41
+ /** The §4.1 example as middleware serves it (status ok + stateIds). */
42
+ const MAP = {
43
+ status: "ok",
44
+ blueprintId: BP,
45
+ version: 7,
46
+ app: "HCHB (Citrix)",
47
+ login: { workflowId: 2525, outputState: "HCHB_READY" },
48
+ states: {
49
+ HCHB_READY: {
50
+ detect: { window: { titlePrefix: "HCHB", zoomed: true }, anchor: "ee9691f532dc4a73" },
51
+ reachedBy: [{ from: "LOGIN", via: "workflow:2525" }],
52
+ elements: {},
53
+ blockers: [],
54
+ },
55
+ PATIENT_SEARCH: {
56
+ detect: { dom: "input#patient-search:visible" },
57
+ reachedBy: [],
58
+ elements: { searchBox: { dom: "input#patient-search" }, goBtn: { uia: { AutomationId: "btnGo" } } },
59
+ blockers: [{ kind: "modal", text: "Password will expire", dismiss: "key:Escape" }],
60
+ },
61
+ },
62
+ gotchas: [{ symptom: "first click after focus is eaten", fix: "focus_then_click()" }],
63
+ stateIds: ["HCHB_READY", "PATIENT_SEARCH"],
64
+ };
65
+ async function call(name, args) {
66
+ const { client, embedded } = await startServer();
67
+ try {
68
+ return await client.callTool({
69
+ name,
70
+ arguments: { workspaceId: WS, blueprintId: BP, ...args },
71
+ });
72
+ }
73
+ finally {
74
+ await client.close();
75
+ await embedded.close();
76
+ }
77
+ }
78
+ describe("appmap tools", () => {
79
+ const savedMwUrl = process.env.MIDDLEWARE_SERVICE_URL;
80
+ beforeEach(() => {
81
+ process.env.MIDDLEWARE_SERVICE_URL = MW_BASE;
82
+ });
83
+ afterEach(() => {
84
+ if (savedMwUrl === undefined)
85
+ delete process.env.MIDDLEWARE_SERVICE_URL;
86
+ else
87
+ process.env.MIDDLEWARE_SERVICE_URL = savedMwUrl;
88
+ vi.unstubAllGlobals();
89
+ });
90
+ it("appmap_get reads the blueprint sub-resource with the user bearer and passes the map through (states slice, summary, version as query)", async () => {
91
+ const fetchMock = vi.fn(async () => jsonResponse(MAP));
92
+ vi.stubGlobal("fetch", fetchMock);
93
+ const out = parse(await call("appmap_get", { states: ["PATIENT_SEARCH", "NOPE"], version: 3, summary: true }));
94
+ const [url, init] = fetchMock.mock.calls[0];
95
+ const u = new URL(String(url));
96
+ expect(`${u.origin}${u.pathname}`).toBe(`${MW_BASE}${APPMAP}`);
97
+ expect(u.searchParams.get("version")).toBe("3");
98
+ expect(u.searchParams.get("states")).toBe("PATIENT_SEARCH,NOPE");
99
+ expect(u.searchParams.get("summary")).toBe("true");
100
+ expect(init.method).toBe("GET");
101
+ expect(init.headers.Authorization).toBe("Bearer test-token");
102
+ expect(out).toEqual(MAP);
103
+ });
104
+ it("appmap_get: absent and tombstoned come back with the create / revive hints", async () => {
105
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ status: "absent", blueprintId: BP })));
106
+ const absent = parse(await call("appmap_get", {}));
107
+ expect(absent.status).toBe("absent");
108
+ expect(absent.nextActions[0]).toContain("appmap_upsert_state");
109
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ status: "tombstoned", blueprintId: BP, currentVersion: 4 })));
110
+ const gone = parse(await call("appmap_get", {}));
111
+ expect(gone).toMatchObject({ status: "tombstoned", currentVersion: 4 });
112
+ // Recovery points at the last LIVE version via appmap_history, never at the tombstone revision itself.
113
+ expect(gone.nextActions[0]).toMatch(/appmap_history.*appmap_get version=<lastLiveVersion>.*Do NOT read version=4/);
114
+ expect(gone.nextActions[1]).toContain("baseVersion=4");
115
+ expect(gone.nextActions[1]).toContain("app=");
116
+ });
117
+ /** Every field middleware's appmap.schema.ts accepts: ocr detect (ref + region forms), region/read/verified elements (region-only, dom + region), screens. */
118
+ const REGION = { x: 400, y: 200, w: 80, h: 24, relativeTo: "screen" }, VERIFIED = { at: "2026-09-20T10:00:00.000Z", text: 10, scale: 2, pad: 8 };
119
+ const FULL_STATE = {
120
+ detect: { window: { titlePrefix: "MES", zoomed: true }, ocr: { ref: "title", pattern: "^Shell\\s+Home", scale: 2, pad: 8 } },
121
+ screenshot: "vault://blob/abc123", reachedBy: [{ from: "MES_LOGON", via: "workflow:2525" }], screens: ["Shell+Home", "Home"],
122
+ elements: { title: { region: { ...REGION, relativeTo: "window" }, read: { kind: "line", scale: 2, pad: 8 }, verified: VERIFIED, description: "screen title" }, qty: { region: REGION, read: { kind: "number" } }, search: { dom: "input#q", region: REGION, verified: VERIFIED }, go: { uia: { AutomationId: "btnGo" } } },
123
+ blockers: [{ kind: "modal", text: "Session expired", detect: { ocr: { region: REGION, pattern: "expired" } }, dismiss: "key:Escape" }],
124
+ };
125
+ it("schema parity: a complete state (ocr detect, region/read/verified elements, screens) round-trips byte-identical through appmap_upsert_state and appmap_get; an invalid ocr regex is rejected client-side", async () => {
126
+ const saved = { status: "saved", blueprintId: BP, version: 8, stateId: "SHELL_HOME", state: FULL_STATE, stateIds: ["SHELL_HOME"] };
127
+ const putMock = vi.fn(async () => jsonResponse(saved));
128
+ vi.stubGlobal("fetch", putMock);
129
+ expect(parse(await call("appmap_upsert_state", { stateId: "SHELL_HOME", app: "MES", state: FULL_STATE }))).toEqual(saved);
130
+ expect(JSON.parse(putMock.mock.calls[0][1].body).state).toEqual(FULL_STATE); // nothing stripped, nothing added
131
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ ...MAP, states: { SHELL_HOME: FULL_STATE }, stateIds: ["SHELL_HOME"] })));
132
+ expect(parse(await call("appmap_get", {})).states.SHELL_HOME).toEqual(FULL_STATE);
133
+ const badRegex = await call("appmap_upsert_state", { stateId: "X", state: { detect: { ocr: { ref: "title", pattern: "(" } } } });
134
+ expect(badRegex.isError).toBe(true);
135
+ expect(badRegex.content[0].text).toContain("valid regex");
136
+ });
137
+ it("appmap_upsert_state PUTs the state body (baseVersion, mode, app, login, gotchas) and returns the saved shape", async () => {
138
+ const saved = { status: "saved", blueprintId: BP, version: 8, stateId: "PATIENT_SEARCH", state: MAP.states.PATIENT_SEARCH, stateIds: MAP.stateIds };
139
+ const fetchMock = vi.fn(async () => jsonResponse(saved));
140
+ vi.stubGlobal("fetch", fetchMock);
141
+ const out = parse(await call("appmap_upsert_state", {
142
+ stateId: "PATIENT_SEARCH",
143
+ baseVersion: 7,
144
+ state: { elements: { clearBtn: { dom: "#clear" } } },
145
+ gotchas: [{ symptom: "modal steals focus", fix: "dismiss_blockers()" }],
146
+ login: { workflowId: 2525, outputState: "HCHB_READY" },
147
+ }));
148
+ expect(out).toEqual(saved);
149
+ const [url, init] = fetchMock.mock.calls[0];
150
+ expect(String(url)).toBe(`${MW_BASE}${APPMAP}/states/PATIENT_SEARCH`);
151
+ expect(init.method).toBe("PUT");
152
+ expect(JSON.parse(init.body)).toMatchObject({
153
+ baseVersion: 7,
154
+ mode: "merge",
155
+ state: { elements: { clearBtn: { dom: "#clear" } } },
156
+ gotchas: [{ symptom: "modal steals focus", fix: "dismiss_blockers()" }],
157
+ login: { workflowId: 2525, outputState: "HCHB_READY" },
158
+ });
159
+ });
160
+ it("appmap_upsert_state maps middleware's 409s to rev_conflict / tombstoned blocks with currentVersion", async () => {
161
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "rev_conflict", currentVersion: 9 }, 409)));
162
+ const staleRaw = await call("appmap_upsert_state", { stateId: "X", baseVersion: 5, state: { detect: { dom: "#x" } } });
163
+ expect(staleRaw.isError).toBeUndefined();
164
+ const stale = parse(staleRaw);
165
+ expect(stale.status).toBe("blocked");
166
+ expect(stale.blocked).toMatchObject({ reason: "rev_conflict", retryable: true, currentVersion: 9 });
167
+ expect(stale.blocked.message).toContain("You read version 5");
168
+ expect(stale.nextActions[0]).toContain("appmap_get");
169
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "tombstoned", currentVersion: 4 }, 409)));
170
+ const raw = await call("appmap_upsert_state", { app: "HCHB", stateId: "X", state: { detect: { dom: "#x" } } });
171
+ expect(raw.isError).toBeUndefined(); // a 409 is a structured block, not a failed call
172
+ const gone = parse(raw);
173
+ expect(gone.blocked).toMatchObject({ reason: "tombstoned", retryable: true, currentVersion: 4 });
174
+ expect(gone.nextActions[0]).toContain("appmap_history");
175
+ expect(gone.nextActions[0]).not.toContain("appmap_get version=4");
176
+ expect(gone.nextActions[1]).toContain("baseVersion=4");
177
+ });
178
+ it("failures are MCP errors (isError) on every appmap tool — 400/401/503 — while absent/tombstoned/409/not-found stay ordinary results", async () => {
179
+ const TOOLS = [["appmap_get", {}], ["appmap_upsert_state", { stateId: "X", state: { detect: { dom: "#x" } } }], ["appmap_find_element", { stateId: "X", ref: "y" }], ["appmap_history", {}]];
180
+ for (const [status, body] of [[400, { error: "invalid_state_id", stateId: "x" }], [401, "Unauthorized"], [503, { error: "vault_unconfigured" }]]) {
181
+ vi.stubGlobal("fetch", vi.fn(async () => (typeof body === "string" ? new Response(body, { status }) : jsonResponse(body, status))));
182
+ for (const [tool, args] of TOOLS) {
183
+ const res = await call(tool, args);
184
+ expect(res.isError, `${tool} ${status}`).toBe(true);
185
+ expect(parse(res).statusCode, `${tool} ${status}`).toBe(status);
186
+ }
187
+ }
188
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ status: "absent", blueprintId: BP })));
189
+ expect((await call("appmap_get", {})).isError).toBeUndefined();
190
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "element_not_found", stateId: "X", ref: "y", knownRefs: [], elsewhere: [] }, 404)));
191
+ expect((await call("appmap_find_element", { stateId: "X", ref: "y" })).isError).toBeUndefined();
192
+ });
193
+ it("appmap_upsert_state: app_required and invalid_state keep their guidance text but are errors; a bad stateId is rejected before any request", async () => {
194
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "app_required" }, 400)));
195
+ const noApp = await call("appmap_upsert_state", { stateId: "X", state: { detect: { dom: "#x" } } });
196
+ expect(noApp.content[0].text).toContain("pass `app`");
197
+ expect(noApp.isError).toBe(true);
198
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "invalid_state", issues: ["detect: Invalid input"] }, 400)));
199
+ const noDetect = await call("appmap_upsert_state", { stateId: "VISIT_NOTE", state: { elements: { save: { dom: "#save" } } } });
200
+ expect(noDetect.content[0].text).toMatch(/Invalid state: detect/);
201
+ expect(noDetect.isError).toBe(true);
202
+ const fetchMock = vi.fn();
203
+ vi.stubGlobal("fetch", fetchMock);
204
+ const badId = await call("appmap_upsert_state", { stateId: "visit note", state: { detect: { dom: "#x" } } });
205
+ expect(badId.isError).toBe(true);
206
+ expect(badId.content[0].text).toContain("UPPER_SNAKE");
207
+ expect(fetchMock).not.toHaveBeenCalled();
208
+ });
209
+ it("appmap_find_element returns the locator, or names the states/refs that exist from middleware's 404 body", async () => {
210
+ const hit = { found: true, stateId: "PATIENT_SEARCH", ref: "goBtn", element: { uia: { AutomationId: "btnGo" } }, version: 7 };
211
+ const fetchMock = vi.fn(async () => jsonResponse(hit));
212
+ vi.stubGlobal("fetch", fetchMock);
213
+ expect(parse(await call("appmap_find_element", { stateId: "PATIENT_SEARCH", ref: "goBtn" }))).toEqual(hit);
214
+ expect(String(fetchMock.mock.calls[0][0])).toBe(`${MW_BASE}${APPMAP}/elements/PATIENT_SEARCH/goBtn`);
215
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "state_not_found", stateId: "NOPE", knownStates: MAP.stateIds }, 404)));
216
+ expect(parse(await call("appmap_find_element", { stateId: "NOPE", ref: "goBtn" }))).toEqual({
217
+ found: false,
218
+ reason: "state_not_found",
219
+ stateId: "NOPE",
220
+ knownStates: ["HCHB_READY", "PATIENT_SEARCH"],
221
+ });
222
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "element_not_found", stateId: "HCHB_READY", ref: "goBtn", knownRefs: [], elsewhere: ["PATIENT_SEARCH"] }, 404)));
223
+ expect(parse(await call("appmap_find_element", { stateId: "HCHB_READY", ref: "goBtn" }))).toEqual({
224
+ found: false,
225
+ reason: "element_not_found",
226
+ stateId: "HCHB_READY",
227
+ ref: "goBtn",
228
+ knownRefs: [],
229
+ elsewhere: ["PATIENT_SEARCH"],
230
+ });
231
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ error: "appmap_absent", blueprintId: BP }, 404)));
232
+ expect(parse(await call("appmap_find_element", { stateId: "X", ref: "y" }))).toEqual({ found: false, reason: "appmap_absent", blueprintId: BP });
233
+ });
234
+ it("appmap_history lists the version ledger newest first, flags tombstoned revisions and names the last live one; head 0 is status=absent", async () => {
235
+ const versions = [
236
+ { version: 2, reason: "edited", createdBy: null, createdAt: "t2" },
237
+ { version: 1, reason: "created", createdBy: "mapper", createdAt: "t1" },
238
+ ];
239
+ const fetchMock = vi.fn(async () => jsonResponse({ head: 2, versions }));
240
+ vi.stubGlobal("fetch", fetchMock);
241
+ const out = parse(await call("appmap_history", {}));
242
+ expect(String(fetchMock.mock.calls[0][0])).toBe(`${MW_BASE}${APPMAP}/versions`);
243
+ expect(out).toEqual({ status: "ok", blueprintId: BP, head: 2, lastLiveVersion: 2, versions: versions.map((v) => ({ ...v, tombstoned: false })) });
244
+ // Deleting appends a `tombstoned` revision: head 3 is the tombstone, the content to recover is version 2.
245
+ const deleted = [{ version: 3, reason: "tombstoned", createdBy: "fixer", createdAt: "t3" }, ...versions];
246
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ head: 3, versions: deleted })));
247
+ const gone = parse(await call("appmap_history", {}));
248
+ expect(gone).toMatchObject({ status: "tombstoned", head: 3, lastLiveVersion: 2 });
249
+ expect(gone.versions.map((v) => v.tombstoned)).toEqual([true, false, false]);
250
+ vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({ head: 0, versions: [] })));
251
+ expect(parse(await call("appmap_history", {}))).toEqual({ status: "absent", blueprintId: BP, head: 0, lastLiveVersion: null, versions: [] });
252
+ });
253
+ });
254
+ //# sourceMappingURL=appmap-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appmap-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/appmap-tools.test.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,9 @@ function setup() {
15
15
  getConfigProperty: vi.fn().mockResolvedValue({}),
16
16
  updateConfigProperty: vi.fn().mockResolvedValue({}),
17
17
  removeConfigProperty: vi.fn().mockResolvedValue(undefined),
18
- createConfigStore: vi.fn().mockResolvedValue({ externalId: "dev-test" }),
18
+ createConfigStore: vi.fn().mockResolvedValue({
19
+ id: "11111111-1111-4111-8111-111111111111", workspaceId: 11, name: "Development test", externalId: "dev-test", properties: [],
20
+ }),
19
21
  deleteConfigStore: vi.fn().mockResolvedValue(undefined),
20
22
  restoreConfigStore: vi.fn().mockResolvedValue({}),
21
23
  };
@@ -60,13 +62,14 @@ describe("configuration-store tools", () => {
60
62
  const { client, clientForRegion, state, handlers } = setup();
61
63
  state.setWorkspaceRegion(11, "ca");
62
64
  const properties = [{ key: "baseUrl", value: "https://example.test" }];
63
- await call(handlers, "create_config_store", {
65
+ const result = await call(handlers, "create_config_store", {
64
66
  workspaceId: 11,
65
67
  name: "Development test",
66
68
  externalId: "dev-test",
67
69
  properties,
68
70
  });
69
71
  expect(clientForRegion).toHaveBeenCalledWith("ca");
72
+ expect(JSON.parse(result.content[0].text)).toMatchObject({ id: "11111111-1111-4111-8111-111111111111", externalId: "dev-test" });
70
73
  expect(client.createConfigStore).toHaveBeenCalledWith({
71
74
  workspaceId: 11,
72
75
  name: "Development test",
@@ -1 +1 @@
1
- {"version":3,"file":"config-stores.test.js","sourceRoot":"","sources":["../../src/__tests__/config-stores.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-stores.test.js","sourceRoot":"","sources":["../../src/__tests__/config-stores.test.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,7 @@ describe("jobs tools (4.0 surface)", () => {
62
62
  routeId: "route-1",
63
63
  input: { a: 1 },
64
64
  variant: "draft",
65
+ configurationId: "11111111-1111-4111-8111-111111111111",
65
66
  fromStepId: "step-2",
66
67
  toStepId: "step-3",
67
68
  seedExecutionId: "je-prev",
@@ -76,6 +77,7 @@ describe("jobs tools (4.0 surface)", () => {
76
77
  input: { a: 1 },
77
78
  trigger: "mcp",
78
79
  variant: "draft",
80
+ configurationId: "11111111-1111-4111-8111-111111111111",
79
81
  fromStepId: "step-2",
80
82
  toStepId: "step-3",
81
83
  seedExecutionId: "je-prev",