@minicor/mcp-server 2.0.8 → 3.1.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 +29 -2
- package/dist/__tests__/state.test.d.ts +2 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +116 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/__tests__/vm-service-client.test.d.ts +2 -0
- package/dist/__tests__/vm-service-client.test.d.ts.map +1 -0
- package/dist/__tests__/vm-service-client.test.js +80 -0
- package/dist/__tests__/vm-service-client.test.js.map +1 -0
- package/dist/agent-service-client.d.ts +34 -0
- package/dist/agent-service-client.d.ts.map +1 -0
- package/dist/agent-service-client.js +64 -0
- package/dist/agent-service-client.js.map +1 -0
- package/dist/helpers.d.ts +1 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +1 -1
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +111 -44
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +10 -2
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +55 -6
- package/dist/lib.js.map +1 -1
- package/dist/prompts/build-rpa.d.ts.map +1 -1
- package/dist/prompts/build-rpa.js +39 -5
- package/dist/prompts/build-rpa.js.map +1 -1
- package/dist/prompts/debug-execution.d.ts.map +1 -1
- package/dist/prompts/debug-execution.js +5 -3
- package/dist/prompts/debug-execution.js.map +1 -1
- package/dist/setup.js +86 -32
- package/dist/setup.js.map +1 -1
- package/dist/state.d.ts +14 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +20 -0
- package/dist/state.js.map +1 -1
- package/dist/tools/{stats.d.ts → agents.d.ts} +1 -1
- package/dist/tools/agents.d.ts.map +1 -0
- package/dist/tools/agents.js +92 -0
- package/dist/tools/agents.js.map +1 -0
- package/dist/tools/config-stores.d.ts.map +1 -1
- package/dist/tools/config-stores.js +59 -11
- package/dist/tools/config-stores.js.map +1 -1
- package/dist/tools/core.d.ts.map +1 -1
- package/dist/tools/core.js +141 -33
- package/dist/tools/core.js.map +1 -1
- package/dist/tools/issues.d.ts.map +1 -1
- package/dist/tools/issues.js +51 -16
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/sync-tools.d.ts.map +1 -1
- package/dist/tools/sync-tools.js +29 -12
- package/dist/tools/sync-tools.js.map +1 -1
- package/dist/tools/tfa.d.ts.map +1 -1
- package/dist/tools/tfa.js +42 -22
- package/dist/tools/tfa.js.map +1 -1
- package/dist/tools/vm-rpa.d.ts.map +1 -1
- package/dist/tools/vm-rpa.js +15 -7
- package/dist/tools/vm-rpa.js.map +1 -1
- package/dist/tools/vm.d.ts.map +1 -1
- package/dist/tools/vm.js +380 -12
- package/dist/tools/vm.js.map +1 -1
- package/dist/tools/workflow-ops.d.ts.map +1 -1
- package/dist/tools/workflow-ops.js +46 -30
- package/dist/tools/workflow-ops.js.map +1 -1
- package/dist/types.d.ts +8 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vm-service-client.d.ts +24 -0
- package/dist/vm-service-client.d.ts.map +1 -0
- package/dist/vm-service-client.js +23 -0
- package/dist/vm-service-client.js.map +1 -0
- package/package.json +2 -2
- package/dist/browser-client.d.ts +0 -42
- package/dist/browser-client.d.ts.map +0 -1
- package/dist/browser-client.js +0 -66
- package/dist/browser-client.js.map +0 -1
- package/dist/prompts/build-browser-rpa.d.ts +0 -3
- package/dist/prompts/build-browser-rpa.d.ts.map +0 -1
- package/dist/prompts/build-browser-rpa.js +0 -90
- package/dist/prompts/build-browser-rpa.js.map +0 -1
- package/dist/prompts/build-nerve-rpa.d.ts +0 -3
- package/dist/prompts/build-nerve-rpa.d.ts.map +0 -1
- package/dist/prompts/build-nerve-rpa.js +0 -148
- package/dist/prompts/build-nerve-rpa.js.map +0 -1
- package/dist/services.d.ts +0 -61
- package/dist/services.d.ts.map +0 -1
- package/dist/services.js +0 -249
- package/dist/services.js.map +0 -1
- package/dist/tools/browser.d.ts +0 -3
- package/dist/tools/browser.d.ts.map +0 -1
- package/dist/tools/browser.js +0 -254
- package/dist/tools/browser.js.map +0 -1
- package/dist/tools/cron.d.ts +0 -3
- package/dist/tools/cron.d.ts.map +0 -1
- package/dist/tools/cron.js +0 -168
- package/dist/tools/cron.js.map +0 -1
- package/dist/tools/elasticsearch.d.ts +0 -3
- package/dist/tools/elasticsearch.d.ts.map +0 -1
- package/dist/tools/elasticsearch.js +0 -248
- package/dist/tools/elasticsearch.js.map +0 -1
- package/dist/tools/stats.d.ts.map +0 -1
- package/dist/tools/stats.js +0 -18
- package/dist/tools/stats.js.map +0 -1
package/README.md
CHANGED
|
@@ -71,7 +71,8 @@ Use the `get_lds_setup_guide` tool for detailed step-by-step instructions.
|
|
|
71
71
|
|
|
72
72
|
| Tool | What it does |
|
|
73
73
|
| ---------------------- | ------------------------------------------------------------------------------------------ |
|
|
74
|
-
| `
|
|
74
|
+
| `vm_list` | Discover available VMs (returns ID, name, status, tunnel URL) |
|
|
75
|
+
| `vm_connect` | Connect to VM via LDS Cloudflare tunnel URL or VM ID |
|
|
75
76
|
| `vm_disconnect` | Disconnect from VM |
|
|
76
77
|
| `vm_status` | Health check for the connected VM |
|
|
77
78
|
| `vm_screenshot` | Full-screen capture of the VM desktop |
|
|
@@ -138,6 +139,32 @@ Workflows that encounter 2FA prompts use these tools to auto-resolve OTP challen
|
|
|
138
139
|
|
|
139
140
|
Scripts reference credentials as `{{config.propertyKey}}` — resolved at runtime by the workflow engine.
|
|
140
141
|
|
|
142
|
+
### Issues
|
|
143
|
+
|
|
144
|
+
| Tool | What it does |
|
|
145
|
+
| -------------- | ---------------------------------------------- |
|
|
146
|
+
| `list_issues` | List all issues in a workspace |
|
|
147
|
+
| `get_issue` | Get a specific issue with full description |
|
|
148
|
+
| `create_issue` | Create an issue (supports Markdown) |
|
|
149
|
+
| `update_issue` | Update title, description, status, or assignee |
|
|
150
|
+
| `delete_issue` | Delete an issue |
|
|
151
|
+
|
|
152
|
+
Agents use Issues to persist context across runs with the `[Agent:<name>]` title convention:
|
|
153
|
+
|
|
154
|
+
- `[Agent:my-bot] Rules` — learned behaviors (e.g., "login page takes 15s to load")
|
|
155
|
+
- `[Agent:my-bot] Context` — persistent state (URLs, credential rotation dates)
|
|
156
|
+
- `[Agent:my-bot] Session 2026-04-09` — run summaries
|
|
157
|
+
|
|
158
|
+
### Agents
|
|
159
|
+
|
|
160
|
+
| Tool | What it does |
|
|
161
|
+
| -------------- | --------------------------------------------------------------- |
|
|
162
|
+
| `list_agents` | List agents in a workspace |
|
|
163
|
+
| `get_agent` | Get agent details (task, mode, VM, run stats) |
|
|
164
|
+
| `create_agent` | Create an agent (on-demand, scheduled, or workflow monitor mode) |
|
|
165
|
+
|
|
166
|
+
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.
|
|
167
|
+
|
|
141
168
|
### Workflow Sync
|
|
142
169
|
|
|
143
170
|
| Tool | What it does |
|
|
@@ -151,7 +178,7 @@ Scripts reference credentials as `{{config.propertyKey}}` — resolved at runtim
|
|
|
151
178
|
|
|
152
179
|
| Prompt | What it does |
|
|
153
180
|
| -------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
154
|
-
| `build-rpa-workflow` | Guided automation building: strategy selection, iterative build loop, Minicor testing,
|
|
181
|
+
| `build-rpa-workflow` | Guided automation building: strategy selection, iterative build loop, per-step Minicor testing, idempotency, context persistence, and agent setup |
|
|
155
182
|
| `debug-workflow-execution` | Analyze a failed execution with VM-aware debugging and replay |
|
|
156
183
|
| `minicor-workflow-guide` | Full workflow specification: step types, data access, keywords, libraries |
|
|
157
184
|
| `2fa-workflow-guide` | Handling 2FA in workflows: provisioning channels, TOTP secrets, auto-resolving OTP codes |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { ldsConnection, setLdsConnection, ldsAuth, vmCache, setVmCache, getCachedVm, setWorkspaceRegion, getWorkspaceRegion, clearWorkspaceRegionMap, } from "../state.js";
|
|
3
|
+
describe("LdsConnection", () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
setLdsConnection(null);
|
|
6
|
+
});
|
|
7
|
+
it("starts as null", () => {
|
|
8
|
+
expect(ldsConnection).toBeNull();
|
|
9
|
+
});
|
|
10
|
+
it("stores connection with vmId and vmName", () => {
|
|
11
|
+
setLdsConnection({
|
|
12
|
+
url: "https://vm.example.com",
|
|
13
|
+
apiKey: "key",
|
|
14
|
+
serviceId: "svc",
|
|
15
|
+
vmId: 1,
|
|
16
|
+
vmName: "test-vm",
|
|
17
|
+
});
|
|
18
|
+
expect(ldsConnection).toEqual({
|
|
19
|
+
url: "https://vm.example.com",
|
|
20
|
+
apiKey: "key",
|
|
21
|
+
serviceId: "svc",
|
|
22
|
+
vmId: 1,
|
|
23
|
+
vmName: "test-vm",
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it("returns auth when apiKey and serviceId are set", () => {
|
|
27
|
+
setLdsConnection({ url: "https://vm.example.com", apiKey: "k", serviceId: "s" });
|
|
28
|
+
expect(ldsAuth()).toEqual({ apiKey: "k", serviceId: "s" });
|
|
29
|
+
});
|
|
30
|
+
it("returns undefined auth when apiKey is missing", () => {
|
|
31
|
+
setLdsConnection({ url: "https://vm.example.com", serviceId: "s" });
|
|
32
|
+
expect(ldsAuth()).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
it("returns undefined auth when serviceId is missing", () => {
|
|
35
|
+
setLdsConnection({ url: "https://vm.example.com", apiKey: "k" });
|
|
36
|
+
expect(ldsAuth()).toBeUndefined();
|
|
37
|
+
});
|
|
38
|
+
it("clears connection on null", () => {
|
|
39
|
+
setLdsConnection({ url: "https://vm.example.com" });
|
|
40
|
+
setLdsConnection(null);
|
|
41
|
+
expect(ldsConnection).toBeNull();
|
|
42
|
+
expect(ldsAuth()).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("VM cache", () => {
|
|
46
|
+
const vm1 = {
|
|
47
|
+
id: 1,
|
|
48
|
+
vm_name: "alpha",
|
|
49
|
+
tunnel_url: "https://alpha.example.com",
|
|
50
|
+
api_key: "key-1",
|
|
51
|
+
service_id: "svc-1",
|
|
52
|
+
};
|
|
53
|
+
const vm2 = {
|
|
54
|
+
id: 2,
|
|
55
|
+
vm_name: "beta",
|
|
56
|
+
tunnel_url: null,
|
|
57
|
+
api_key: "key-2",
|
|
58
|
+
service_id: "svc-2",
|
|
59
|
+
};
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
setVmCache(null);
|
|
62
|
+
});
|
|
63
|
+
it("starts as null", () => {
|
|
64
|
+
expect(vmCache).toBeNull();
|
|
65
|
+
});
|
|
66
|
+
it("stores and retrieves VM cache", () => {
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
setVmCache({ vms: [vm1, vm2], fetchedAt: now });
|
|
69
|
+
expect(vmCache).toEqual({ vms: [vm1, vm2], fetchedAt: now });
|
|
70
|
+
});
|
|
71
|
+
it("getCachedVm finds a VM by id", () => {
|
|
72
|
+
setVmCache({ vms: [vm1, vm2], fetchedAt: Date.now() });
|
|
73
|
+
expect(getCachedVm(1)).toEqual(vm1);
|
|
74
|
+
expect(getCachedVm(2)).toEqual(vm2);
|
|
75
|
+
});
|
|
76
|
+
it("getCachedVm returns undefined for unknown id", () => {
|
|
77
|
+
setVmCache({ vms: [vm1], fetchedAt: Date.now() });
|
|
78
|
+
expect(getCachedVm(999)).toBeUndefined();
|
|
79
|
+
});
|
|
80
|
+
it("getCachedVm returns undefined when cache is empty", () => {
|
|
81
|
+
expect(getCachedVm(1)).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
it("clears cache on null", () => {
|
|
84
|
+
setVmCache({ vms: [vm1], fetchedAt: Date.now() });
|
|
85
|
+
setVmCache(null);
|
|
86
|
+
expect(vmCache).toBeNull();
|
|
87
|
+
expect(getCachedVm(1)).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("Workspace-region map", () => {
|
|
91
|
+
beforeEach(() => {
|
|
92
|
+
clearWorkspaceRegionMap();
|
|
93
|
+
});
|
|
94
|
+
it("returns undefined for unknown workspace", () => {
|
|
95
|
+
expect(getWorkspaceRegion(999)).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
it("stores and retrieves a workspace region", () => {
|
|
98
|
+
setWorkspaceRegion(1, "us");
|
|
99
|
+
setWorkspaceRegion(2, "ca");
|
|
100
|
+
expect(getWorkspaceRegion(1)).toBe("us");
|
|
101
|
+
expect(getWorkspaceRegion(2)).toBe("ca");
|
|
102
|
+
});
|
|
103
|
+
it("overwrites region for the same workspace", () => {
|
|
104
|
+
setWorkspaceRegion(1, "us");
|
|
105
|
+
setWorkspaceRegion(1, "ca");
|
|
106
|
+
expect(getWorkspaceRegion(1)).toBe("ca");
|
|
107
|
+
});
|
|
108
|
+
it("clears all mappings", () => {
|
|
109
|
+
setWorkspaceRegion(1, "us");
|
|
110
|
+
setWorkspaceRegion(2, "ca");
|
|
111
|
+
clearWorkspaceRegionMap();
|
|
112
|
+
expect(getWorkspaceRegion(1)).toBeUndefined();
|
|
113
|
+
expect(getWorkspaceRegion(2)).toBeUndefined();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../src/__tests__/state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,OAAO,EACP,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,UAAU,CAAC,GAAG,EAAE;QACd,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,gBAAgB,CAAC;YACf,GAAG,EAAE,wBAAwB;YAC7B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC;YAC5B,GAAG,EAAE,wBAAwB;YAC7B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,gBAAgB,CAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,gBAAgB,CAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,gBAAgB,CAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,gBAAgB,CAAC,EAAE,GAAG,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACpD,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,MAAM,GAAG,GAAW;QAClB,EAAE,EAAE,CAAC;QACL,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,2BAA2B;QACvC,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,OAAO;KACpB,CAAC;IAEF,MAAM,GAAG,GAAW;QAClB,EAAE,EAAE,CAAC;QACL,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,OAAO;KACpB,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,uBAAuB,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5B,uBAAuB,EAAE,CAAC;QAC1B,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9C,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-service-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/vm-service-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { listVms } from "../vm-service-client.js";
|
|
3
|
+
describe("listVms", () => {
|
|
4
|
+
const originalFetch = globalThis.fetch;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
globalThis.fetch = vi.fn();
|
|
7
|
+
});
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
globalThis.fetch = originalFetch;
|
|
10
|
+
});
|
|
11
|
+
const baseUrl = "https://vm-service.example.com";
|
|
12
|
+
const apiKey = "ws-api-key-123";
|
|
13
|
+
const mockVms = [
|
|
14
|
+
{
|
|
15
|
+
id: 1,
|
|
16
|
+
vm_name: "test-vm",
|
|
17
|
+
deployment_status: "registered",
|
|
18
|
+
tunnel_url: "https://test-vm.example.com",
|
|
19
|
+
api_key: "vm-key-1",
|
|
20
|
+
service_id: "svc-1",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 2,
|
|
24
|
+
vm_name: "dev-vm",
|
|
25
|
+
deployment_status: "registered",
|
|
26
|
+
tunnel_url: null,
|
|
27
|
+
api_key: "vm-key-2",
|
|
28
|
+
service_id: "svc-2",
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
const mockResponse = {
|
|
32
|
+
workspace_id: "1",
|
|
33
|
+
vms: mockVms,
|
|
34
|
+
total_vms: 2,
|
|
35
|
+
active_vms: 1,
|
|
36
|
+
};
|
|
37
|
+
const emptyResponse = { workspace_id: "1", vms: [], total_vms: 0, active_vms: 0 };
|
|
38
|
+
it("calls GET /vms/list with X-API-KEY header and extracts vms array", async () => {
|
|
39
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(new Response(JSON.stringify(mockResponse), { status: 200 }));
|
|
40
|
+
const result = await listVms(baseUrl, apiKey);
|
|
41
|
+
expect(globalThis.fetch).toHaveBeenCalledWith(`${baseUrl}/vms/list`, { headers: { "X-API-KEY": apiKey } });
|
|
42
|
+
expect(result).toEqual(mockVms);
|
|
43
|
+
});
|
|
44
|
+
it("appends region query param when provided", async () => {
|
|
45
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(new Response(JSON.stringify(emptyResponse), { status: 200 }));
|
|
46
|
+
await listVms(baseUrl, apiKey, { region: "us" });
|
|
47
|
+
const calledUrl = vi.mocked(globalThis.fetch).mock.calls[0][0];
|
|
48
|
+
expect(calledUrl).toBe(`${baseUrl}/vms/list?region=us`);
|
|
49
|
+
});
|
|
50
|
+
it("appends channel_id query param when provided", async () => {
|
|
51
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(new Response(JSON.stringify(emptyResponse), { status: 200 }));
|
|
52
|
+
await listVms(baseUrl, apiKey, { channelId: "ch-42" });
|
|
53
|
+
const calledUrl = vi.mocked(globalThis.fetch).mock.calls[0][0];
|
|
54
|
+
expect(calledUrl).toBe(`${baseUrl}/vms/list?channel_id=ch-42`);
|
|
55
|
+
});
|
|
56
|
+
it("appends both query params when provided", async () => {
|
|
57
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(new Response(JSON.stringify(emptyResponse), { status: 200 }));
|
|
58
|
+
await listVms(baseUrl, apiKey, { region: "ca", channelId: "ch-1" });
|
|
59
|
+
const calledUrl = vi.mocked(globalThis.fetch).mock.calls[0][0];
|
|
60
|
+
expect(calledUrl).toContain("region=ca");
|
|
61
|
+
expect(calledUrl).toContain("channel_id=ch-1");
|
|
62
|
+
});
|
|
63
|
+
it("omits query params when not provided", async () => {
|
|
64
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(new Response(JSON.stringify(emptyResponse), { status: 200 }));
|
|
65
|
+
await listVms(baseUrl, apiKey, {});
|
|
66
|
+
const calledUrl = vi.mocked(globalThis.fetch).mock.calls[0][0];
|
|
67
|
+
expect(calledUrl).toBe(`${baseUrl}/vms/list`);
|
|
68
|
+
});
|
|
69
|
+
it("throws on non-ok response with status and body", async () => {
|
|
70
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(new Response("Unauthorized", { status: 401 }));
|
|
71
|
+
await expect(listVms(baseUrl, apiKey)).rejects.toThrow("VM service returned 401: Unauthorized");
|
|
72
|
+
});
|
|
73
|
+
it("throws on non-ok response even if body read fails", async () => {
|
|
74
|
+
const res = new Response(null, { status: 500 });
|
|
75
|
+
vi.spyOn(res, "text").mockRejectedValue(new Error("read error"));
|
|
76
|
+
vi.mocked(globalThis.fetch).mockResolvedValue(res);
|
|
77
|
+
await expect(listVms(baseUrl, apiKey)).rejects.toThrow("VM service returned 500:");
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=vm-service-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-service-client.test.js","sourceRoot":"","sources":["../../src/__tests__/vm-service-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent management client that routes through the Minicor platform proxy.
|
|
3
|
+
*
|
|
4
|
+
* /api/agents/[...path] proxies to the agent service and handles auth —
|
|
5
|
+
* the MCP sends its existing bearer token.
|
|
6
|
+
*
|
|
7
|
+
* Platform URL is derived from the API base: api.minicor.com → app.minicor.com
|
|
8
|
+
*/
|
|
9
|
+
/** Derive platform base URL from API base URL. */
|
|
10
|
+
export declare function apiToPlatformBase(apiBase: string): string;
|
|
11
|
+
export declare class AgentServiceClient {
|
|
12
|
+
private platformBase;
|
|
13
|
+
private token;
|
|
14
|
+
constructor(apiBase: string, token: string);
|
|
15
|
+
private request;
|
|
16
|
+
listAgents(workspaceId?: number): Promise<any>;
|
|
17
|
+
getAgent(agentId: string): Promise<any>;
|
|
18
|
+
createAgent(data: {
|
|
19
|
+
name: string;
|
|
20
|
+
task: string;
|
|
21
|
+
vm_url: string;
|
|
22
|
+
workspace_id: number;
|
|
23
|
+
model?: string;
|
|
24
|
+
max_steps?: number;
|
|
25
|
+
mode?: "on-demand" | "scheduled" | "monitor";
|
|
26
|
+
service_id?: string;
|
|
27
|
+
watch_workflow_id?: number;
|
|
28
|
+
watch_workflow_name?: string;
|
|
29
|
+
recovery_task?: string;
|
|
30
|
+
slack_webhook_url?: string;
|
|
31
|
+
slack_channel?: string;
|
|
32
|
+
}): Promise<any>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=agent-service-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-service-client.d.ts","sourceRoot":"","sources":["../src/agent-service-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;YAK5B,OAAO;IAoCf,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM;IAS/B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAIxB,WAAW,CAAC,IAAI,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;QAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;CAGF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent management client that routes through the Minicor platform proxy.
|
|
3
|
+
*
|
|
4
|
+
* /api/agents/[...path] proxies to the agent service and handles auth —
|
|
5
|
+
* the MCP sends its existing bearer token.
|
|
6
|
+
*
|
|
7
|
+
* Platform URL is derived from the API base: api.minicor.com → app.minicor.com
|
|
8
|
+
*/
|
|
9
|
+
/** Derive platform base URL from API base URL. */
|
|
10
|
+
export function apiToPlatformBase(apiBase) {
|
|
11
|
+
// https://api.minicor.com → https://app.minicor.com
|
|
12
|
+
// https://ca.api.minicor.com → https://ca.app.minicor.com
|
|
13
|
+
// http://localhost:8000 → http://localhost:3000 (dev)
|
|
14
|
+
if (apiBase.includes("localhost")) {
|
|
15
|
+
return apiBase.replace(/:\d+/, ":3000");
|
|
16
|
+
}
|
|
17
|
+
return apiBase.replace("api.", "app.");
|
|
18
|
+
}
|
|
19
|
+
export class AgentServiceClient {
|
|
20
|
+
platformBase;
|
|
21
|
+
token;
|
|
22
|
+
constructor(apiBase, token) {
|
|
23
|
+
this.platformBase = apiToPlatformBase(apiBase).replace(/\/+$/, "");
|
|
24
|
+
this.token = token;
|
|
25
|
+
}
|
|
26
|
+
async request(method, path, body, queryParams) {
|
|
27
|
+
let url = `${this.platformBase}/api/agents${path}`;
|
|
28
|
+
if (queryParams) {
|
|
29
|
+
const params = new URLSearchParams();
|
|
30
|
+
for (const [k, v] of Object.entries(queryParams)) {
|
|
31
|
+
if (v !== undefined && v !== null)
|
|
32
|
+
params.set(k, String(v));
|
|
33
|
+
}
|
|
34
|
+
const qs = params.toString();
|
|
35
|
+
if (qs)
|
|
36
|
+
url += `?${qs}`;
|
|
37
|
+
}
|
|
38
|
+
const res = await fetch(url, {
|
|
39
|
+
method,
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
Authorization: `Bearer ${this.token}`,
|
|
43
|
+
},
|
|
44
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
45
|
+
});
|
|
46
|
+
if (!res.ok) {
|
|
47
|
+
const text = await res.text().catch(() => "");
|
|
48
|
+
throw new Error(`Agent Service ${method} ${path} failed (${res.status}): ${text}`);
|
|
49
|
+
}
|
|
50
|
+
if (res.status === 204)
|
|
51
|
+
return undefined;
|
|
52
|
+
return res.json();
|
|
53
|
+
}
|
|
54
|
+
async listAgents(workspaceId) {
|
|
55
|
+
return this.request("GET", "/agents", undefined, workspaceId ? { workspace_id: workspaceId } : undefined);
|
|
56
|
+
}
|
|
57
|
+
async getAgent(agentId) {
|
|
58
|
+
return this.request("GET", `/agents/${agentId}`);
|
|
59
|
+
}
|
|
60
|
+
async createAgent(data) {
|
|
61
|
+
return this.request("POST", "/agents", data);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=agent-service-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-service-client.js","sourceRoot":"","sources":["../src/agent-service-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kDAAkD;AAClD,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,oDAAoD;IACpD,0DAA0D;IAC1D,sDAAsD;IACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,OAAO,kBAAkB;IACrB,YAAY,CAAS;IACrB,KAAK,CAAS;IAEtB,YAAY,OAAe,EAAE,KAAa;QACxC,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,WAAyD;QAEzD,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,cAAc,IAAI,EAAE,CAAC;QACnD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,EAAE;gBAAE,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;aACtC;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAClE,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QAC9C,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAoB;QACnC,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,SAAS,EACT,SAAS,EACT,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAM,KAAK,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAcjB;QACC,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF"}
|
package/dist/helpers.d.ts
CHANGED
|
@@ -20,6 +20,6 @@ export declare function safe<T>(fn: () => Promise<T>): Promise<{
|
|
|
20
20
|
text: string;
|
|
21
21
|
}[];
|
|
22
22
|
}>;
|
|
23
|
-
export declare const NOT_CONNECTED_VM = "No VM connected.
|
|
23
|
+
export declare const NOT_CONNECTED_VM = "No VM connected. Use vm_list to discover available VMs, then vm_connect with the vmId. Or provide a Cloudflare Tunnel URL directly to vm_connect.";
|
|
24
24
|
export declare function buildRpaProgram(pythonScript: string, pattern: "cloudflare_tunnel" | "channel" | "browser", flowId: string, stepName: string, stepDescription: string, expectedPreState?: string, expectedPostState?: string): string;
|
|
25
25
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE1C;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO;;;;;EAE/B;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM;;;;;EAE/B;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;;;;;GAMjD;AAED,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE1C;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO;;;;;EAE/B;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM;;;;;EAE/B;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;;;;;GAMjD;AAED,eAAO,MAAM,gBAAgB,sJAAsJ,CAAC;AA0BpL,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,GAAG,SAAS,GAAG,SAAS,EACpD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,gBAAgB,CAAC,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,CA6CR"}
|
package/dist/helpers.js
CHANGED
|
@@ -18,7 +18,7 @@ export async function safe(fn) {
|
|
|
18
18
|
return text(`Error: ${e.message}`);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
export const NOT_CONNECTED_VM = `No VM connected.
|
|
21
|
+
export const NOT_CONNECTED_VM = `No VM connected. Use vm_list to discover available VMs, then vm_connect with the vmId. Or provide a Cloudflare Tunnel URL directly to vm_connect.`;
|
|
22
22
|
function escapeJsonStringValue(value) {
|
|
23
23
|
return value
|
|
24
24
|
.replace(/\\/g, "\\\\")
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,IAAI,CAAC,IAAa;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,IAAa;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAI,EAAoB;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Brings your Minicor workspace into Cursor / Claude Code.
|
|
6
6
|
* Build, deploy, and debug VM-based automations from your IDE.
|
|
7
|
+
*
|
|
8
|
+
* Supports simultaneous US and CA region connections — each region
|
|
9
|
+
* gets its own stored credentials and LaminarClient instance.
|
|
7
10
|
*/
|
|
8
|
-
|
|
11
|
+
import { type Region } from "./paths.js";
|
|
12
|
+
export declare function getApiBase(region?: Region): string;
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAOH,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AA2EpB,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlD"}
|