@minicor/mcp-server 3.6.0 → 3.8.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 +34 -1
- package/dist/__tests__/laminar-client.test.js +24 -0
- package/dist/__tests__/laminar-client.test.js.map +1 -1
- package/dist/__tests__/paths.test.d.ts +2 -0
- package/dist/__tests__/paths.test.d.ts.map +1 -0
- package/dist/__tests__/paths.test.js +55 -0
- package/dist/__tests__/paths.test.js.map +1 -0
- package/dist/__tests__/recording-frames.test.d.ts +2 -0
- package/dist/__tests__/recording-frames.test.d.ts.map +1 -0
- package/dist/__tests__/recording-frames.test.js +46 -0
- package/dist/__tests__/recording-frames.test.js.map +1 -0
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -13
- package/dist/index.js.map +1 -1
- package/dist/laminar-client.d.ts +6 -0
- package/dist/laminar-client.d.ts.map +1 -1
- package/dist/laminar-client.js +6 -0
- package/dist/laminar-client.js.map +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +38 -8
- package/dist/lib.js.map +1 -1
- package/dist/paths.d.ts +4 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +33 -0
- package/dist/paths.js.map +1 -1
- package/dist/prompts/debug-execution.d.ts.map +1 -1
- package/dist/prompts/debug-execution.js +3 -2
- package/dist/prompts/debug-execution.js.map +1 -1
- package/dist/recording-frames.d.ts +58 -0
- package/dist/recording-frames.d.ts.map +1 -0
- package/dist/recording-frames.js +244 -0
- package/dist/recording-frames.js.map +1 -0
- package/dist/seed-skills.js +3 -2
- package/dist/seed-skills.js.map +1 -1
- package/dist/setup.js +67 -31
- package/dist/setup.js.map +1 -1
- package/dist/tools/core.d.ts.map +1 -1
- package/dist/tools/core.js +114 -0
- package/dist/tools/core.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/lib.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
16
16
|
import { LaminarClient } from "./laminar-client.js";
|
|
17
|
-
import {
|
|
17
|
+
import { apiBaseToRegion, resolveApiBase, validateApiBaseUrl, } from "./paths.js";
|
|
18
18
|
import { TokenProvider } from "./token-provider.js";
|
|
19
19
|
import { CodeModeToolRegistry, asMcpServer, buildCodeModeInstructions, shouldUseCodeMode, } from "./codemode.js";
|
|
20
20
|
import { register as registerCore } from "./tools/core.js";
|
|
@@ -52,7 +52,6 @@ function registerAllTools(deps) {
|
|
|
52
52
|
registerTfaGuide(deps);
|
|
53
53
|
registerWorkspaceSession(deps);
|
|
54
54
|
}
|
|
55
|
-
const DEFAULT_BASE_URL = "https://api.laminar.run";
|
|
56
55
|
const MINICOR_INSTRUCTIONS = `You are connected to the Minicor MCP server for RPA workflow automation.
|
|
57
56
|
|
|
58
57
|
CRITICAL: If the current directory contains a minicor.json file, you are in a workspace clone.
|
|
@@ -102,7 +101,7 @@ function buildProvider(creds, apiBase, onUpdate) {
|
|
|
102
101
|
*/
|
|
103
102
|
export async function createMinicorServer(transport, opts = {}) {
|
|
104
103
|
const codeModeEnabled = opts.codeMode ?? shouldUseCodeMode();
|
|
105
|
-
const server = new McpServer({ name: "minicor", version: "3.
|
|
104
|
+
const server = new McpServer({ name: "minicor", version: "3.8.0" }, {
|
|
106
105
|
instructions: codeModeEnabled
|
|
107
106
|
? buildCodeModeInstructions(MINICOR_INSTRUCTIONS)
|
|
108
107
|
: MINICOR_INSTRUCTIONS,
|
|
@@ -110,27 +109,35 @@ export async function createMinicorServer(transport, opts = {}) {
|
|
|
110
109
|
const clients = new Map();
|
|
111
110
|
const tokens = new Map();
|
|
112
111
|
const baseUrls = new Map();
|
|
112
|
+
const apiBaseOverrides = new Map();
|
|
113
|
+
const tokenProviders = new Map();
|
|
114
|
+
function rebuildRegionClient(region, baseUrl) {
|
|
115
|
+
clients.set(region, new LaminarClient({ type: "bearer", token: tokens.get(region) ?? "" }, baseUrl, tokenProviders.get(region)));
|
|
116
|
+
baseUrls.set(region, baseUrl);
|
|
117
|
+
}
|
|
113
118
|
if (opts.regionCredentials) {
|
|
114
119
|
for (const [r, creds] of Object.entries(opts.regionCredentials)) {
|
|
115
120
|
if (!creds)
|
|
116
121
|
continue;
|
|
117
|
-
const base = creds.baseUrl ||
|
|
122
|
+
const base = creds.baseUrl || resolveApiBase(r);
|
|
118
123
|
const provider = buildProvider(creds, base, (t) => tokens.set(r, t));
|
|
119
124
|
clients.set(r, new LaminarClient({ type: "bearer", token: creds.access_token }, base, provider));
|
|
120
125
|
tokens.set(r, creds.access_token);
|
|
126
|
+
tokenProviders.set(r, provider);
|
|
121
127
|
baseUrls.set(r, base);
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
if (clients.size === 0 && opts.credentials) {
|
|
125
|
-
const baseUrl = opts.baseUrl ||
|
|
126
|
-
const region = baseUrl
|
|
131
|
+
const baseUrl = opts.baseUrl || resolveApiBase("us");
|
|
132
|
+
const region = apiBaseToRegion(baseUrl);
|
|
127
133
|
const provider = buildProvider(opts.credentials, baseUrl, (t) => tokens.set(region, t));
|
|
128
134
|
clients.set(region, new LaminarClient({ type: "bearer", token: opts.credentials.access_token }, baseUrl, provider));
|
|
129
135
|
tokens.set(region, opts.credentials.access_token);
|
|
136
|
+
tokenProviders.set(region, provider);
|
|
130
137
|
baseUrls.set(region, baseUrl);
|
|
131
138
|
}
|
|
132
139
|
if (clients.size === 0) {
|
|
133
|
-
const baseUrl = opts.baseUrl ||
|
|
140
|
+
const baseUrl = opts.baseUrl || resolveApiBase("us");
|
|
134
141
|
clients.set("us", new LaminarClient({ type: "bearer", token: "" }, baseUrl));
|
|
135
142
|
tokens.set("us", "");
|
|
136
143
|
baseUrls.set("us", baseUrl);
|
|
@@ -161,7 +168,30 @@ export async function createMinicorServer(transport, opts = {}) {
|
|
|
161
168
|
},
|
|
162
169
|
getApiBase: (region) => {
|
|
163
170
|
const r = region ?? getDefaultRegion();
|
|
164
|
-
return baseUrls.get(r) ??
|
|
171
|
+
return baseUrls.get(r) ?? resolveApiBase(r);
|
|
172
|
+
},
|
|
173
|
+
getStoredApiBase: (region) => {
|
|
174
|
+
const r = region ?? getDefaultRegion();
|
|
175
|
+
return apiBaseOverrides.get(r);
|
|
176
|
+
},
|
|
177
|
+
setApiBase: async (region, baseUrl) => {
|
|
178
|
+
if (!clients.has(region)) {
|
|
179
|
+
throw new Error(`No client configured for ${region.toUpperCase()} region.`);
|
|
180
|
+
}
|
|
181
|
+
const storedApiBase = validateApiBaseUrl(baseUrl);
|
|
182
|
+
apiBaseOverrides.set(region, storedApiBase);
|
|
183
|
+
const effectiveApiBase = resolveApiBase(region, storedApiBase);
|
|
184
|
+
rebuildRegionClient(region, effectiveApiBase);
|
|
185
|
+
return { storedApiBase, effectiveApiBase };
|
|
186
|
+
},
|
|
187
|
+
unsetApiBase: async (region) => {
|
|
188
|
+
if (!clients.has(region)) {
|
|
189
|
+
throw new Error(`No client configured for ${region.toUpperCase()} region.`);
|
|
190
|
+
}
|
|
191
|
+
apiBaseOverrides.delete(region);
|
|
192
|
+
const effectiveApiBase = resolveApiBase(region);
|
|
193
|
+
rebuildRegionClient(region, effectiveApiBase);
|
|
194
|
+
return { storedApiBase: undefined, effectiveApiBase };
|
|
165
195
|
},
|
|
166
196
|
getVmServiceBase: () => vmServiceBase,
|
|
167
197
|
getAuthToken: (region) => tokens.get(region ?? getDefaultRegion()) ?? "",
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -13,5 +13,9 @@ export declare function getConfigPath(): string;
|
|
|
13
13
|
export declare function getWriteConfigPath(): string;
|
|
14
14
|
export type Region = "us" | "ca";
|
|
15
15
|
export declare function regionToApiBase(region: Region): string;
|
|
16
|
+
export declare function normalizeBaseUrl(baseUrl: string): string;
|
|
17
|
+
export declare function validateApiBaseUrl(baseUrl: string): string;
|
|
18
|
+
export declare function resolveDefaultApiBase(region: Region): string;
|
|
19
|
+
export declare function resolveApiBase(region: Region, storedApiBase?: string | null): string;
|
|
16
20
|
export declare function apiBaseToRegion(apiBase: string): Region;
|
|
17
21
|
//# sourceMappingURL=paths.d.ts.map
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,QAAA,MAAM,WAAW,QAAsC,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,QAAA,MAAM,WAAW,QAAsC,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,wBAAgB,YAAY,IAAI,MAAM,CAMrC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAe1D;AAWD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,CAMR;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
package/dist/paths.js
CHANGED
|
@@ -40,6 +40,39 @@ export function regionToApiBase(region) {
|
|
|
40
40
|
? "https://ca.api.laminar.run"
|
|
41
41
|
: "https://api.laminar.run";
|
|
42
42
|
}
|
|
43
|
+
export function normalizeBaseUrl(baseUrl) {
|
|
44
|
+
return baseUrl.trim().replace(/\/+$/, "");
|
|
45
|
+
}
|
|
46
|
+
export function validateApiBaseUrl(baseUrl) {
|
|
47
|
+
const normalized = normalizeBaseUrl(baseUrl);
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = new URL(normalized);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw new Error("Backend API URL must be a valid URL.");
|
|
54
|
+
}
|
|
55
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
56
|
+
throw new Error("Backend API URL must start with http:// or https://.");
|
|
57
|
+
}
|
|
58
|
+
return normalized;
|
|
59
|
+
}
|
|
60
|
+
function envApiBase(region) {
|
|
61
|
+
const regional = region === "ca"
|
|
62
|
+
? process.env.MINICOR_API_BASE_URL_CA
|
|
63
|
+
: process.env.MINICOR_API_BASE_URL_US;
|
|
64
|
+
const base = regional ?? process.env.MINICOR_API_BASE_URL;
|
|
65
|
+
return base && base.trim() !== "" ? normalizeBaseUrl(base) : undefined;
|
|
66
|
+
}
|
|
67
|
+
export function resolveDefaultApiBase(region) {
|
|
68
|
+
return envApiBase(region) ?? regionToApiBase(region);
|
|
69
|
+
}
|
|
70
|
+
export function resolveApiBase(region, storedApiBase) {
|
|
71
|
+
const stored = storedApiBase && storedApiBase.trim() !== ""
|
|
72
|
+
? normalizeBaseUrl(storedApiBase)
|
|
73
|
+
: undefined;
|
|
74
|
+
return envApiBase(region) ?? stored ?? regionToApiBase(region);
|
|
75
|
+
}
|
|
43
76
|
export function apiBaseToRegion(apiBase) {
|
|
44
77
|
return apiBase.includes("ca.api") ? "ca" : "us";
|
|
45
78
|
}
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,MAAM,UAAU,YAAY;IAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAID,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,KAAK,IAAI;QACpB,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,yBAAyB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-execution.d.ts","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"debug-execution.d.ts","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,QA4EpD"}
|
|
@@ -52,8 +52,9 @@ Analyze the execution, identify failures, explain root causes, and suggest speci
|
|
|
52
52
|
- Look at preceding successful steps for context
|
|
53
53
|
|
|
54
54
|
### 2. Check for video recordings
|
|
55
|
-
-
|
|
56
|
-
-
|
|
55
|
+
- To visually inspect what happened, use \`get_recording_frames\` — it samples full-resolution still frames (as images) from the execution recording, or from a single step when you pass its flow run ID. Great for confirming the on-screen state at the point of failure
|
|
56
|
+
- To hand a full video to a human (or embed it), use \`get_execution_recording\` for a 24h signed URL to the full recording, or \`get_flow_run_recording\` for a single step's recording
|
|
57
|
+
- RPA step executions also include \`recording.blobName\` in their response data (e.g. \`rpa_1_step-name.mp4\`)
|
|
57
58
|
|
|
58
59
|
### 3. If a VM is connected — reproduce on the live VM
|
|
59
60
|
- Use \`replay_execution_step\` with the failed flow run ID to re-run the exact script with before/after screenshots
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-execution.js","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAY;IACnD,MAAM,CAAC,MAAM,CACX,0BAA0B,EAC1B,uDAAuD,EACvD;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,MAA4B,CAAC;QACvC,IAAI,aAAkB,CAAC;QACvB,IAAI,SAAc,CAAC;QAEnB,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,SAAS,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAe;wBACrB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,mCAAmC,CAAC,CAAC,OAAO,EAAE;yBACrD;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;;;EAGlB,IAAI,CAAC,SAAS,CAAC;;;EAGf,IAAI,CAAC,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"debug-execution.js","sourceRoot":"","sources":["../../src/prompts/debug-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAY;IACnD,MAAM,CAAC,MAAM,CACX,0BAA0B,EAC1B,uDAAuD,EACvD;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC5D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,MAA4B,CAAC;QACvC,IAAI,aAAkB,CAAC;QACvB,IAAI,SAAc,CAAC;QAEnB,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvD,SAAS,GAAG,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAe;wBACrB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,mCAAmC,CAAC,CAAC,OAAO,EAAE;yBACrD;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;;;EAGlB,IAAI,CAAC,SAAS,CAAC;;;EAGf,IAAI,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;wEAwBmD;qBAC3D;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts sampled still frames from a recording (MP4) so that a vision-capable
|
|
3
|
+
* model can visually verify or debug an execution.
|
|
4
|
+
*
|
|
5
|
+
* The recording endpoints return a signed URL to an MP4. A model cannot "watch"
|
|
6
|
+
* a video URL, so this module downloads the video and uses ffmpeg to sample a
|
|
7
|
+
* handful of frames, returned as base64 JPEGs. ffmpeg (and ideally ffprobe) must
|
|
8
|
+
* be available on the MCP host; when they are missing we throw a clear error so
|
|
9
|
+
* the caller can fall back to handing the raw URL to a human.
|
|
10
|
+
*/
|
|
11
|
+
export interface ExtractedFrame {
|
|
12
|
+
/** Human-readable label, e.g. "t=12.3s" or "frame 2". */
|
|
13
|
+
label: string;
|
|
14
|
+
/** Frame position in seconds when known, otherwise null. */
|
|
15
|
+
timestampSeconds: number | null;
|
|
16
|
+
/** Base64-encoded JPEG (no data: prefix). */
|
|
17
|
+
base64: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ExtractFramesOptions {
|
|
20
|
+
/** Number of evenly-spaced frames to sample. Default 4. */
|
|
21
|
+
count?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Optional max output width in px. When omitted (the default) frames keep the
|
|
24
|
+
* recording's ORIGINAL resolution — important for reading fine on-screen detail.
|
|
25
|
+
* Only set this if you explicitly want to trade resolution for smaller frames.
|
|
26
|
+
*/
|
|
27
|
+
maxWidth?: number;
|
|
28
|
+
/** Max bytes to download before aborting. Default 200 MB. */
|
|
29
|
+
maxBytes?: number;
|
|
30
|
+
/** Overall download timeout in ms. Default 60s. */
|
|
31
|
+
downloadTimeoutMs?: number;
|
|
32
|
+
/** Per-ffmpeg/ffprobe command timeout in ms. Default 30s. */
|
|
33
|
+
commandTimeoutMs?: number;
|
|
34
|
+
ffmpegPath?: string;
|
|
35
|
+
ffprobePath?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Computes evenly-spaced sample timestamps centered within the duration, so we
|
|
39
|
+
* avoid black/blank frames at the very start and end.
|
|
40
|
+
*/
|
|
41
|
+
export declare function computeSampleTimestamps(durationSeconds: number, count: number): number[];
|
|
42
|
+
/**
|
|
43
|
+
* Builds an ffmpeg scale filter that caps width while preserving aspect ratio.
|
|
44
|
+
* Returns null when no cap is requested, so frames keep their original resolution.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildScaleFilter(maxWidth?: number): string | null;
|
|
47
|
+
export interface CommandResult {
|
|
48
|
+
code: number | null;
|
|
49
|
+
stdout: string;
|
|
50
|
+
stderr: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function runCommand(command: string, args: string[], timeoutMs: number): Promise<CommandResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Downloads the recording at `url` and returns sampled JPEG frames.
|
|
55
|
+
* Throws with a clear message when ffmpeg is unavailable.
|
|
56
|
+
*/
|
|
57
|
+
export declare function extractFramesFromUrl(url: string, options?: ExtractFramesOptions): Promise<ExtractedFrame[]>;
|
|
58
|
+
//# sourceMappingURL=recording-frames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-frames.d.ts","sourceRoot":"","sources":["../src/recording-frames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASxF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKjE;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CA4CxB;AAqHD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,cAAc,EAAE,CAAC,CAuF3B"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts sampled still frames from a recording (MP4) so that a vision-capable
|
|
3
|
+
* model can visually verify or debug an execution.
|
|
4
|
+
*
|
|
5
|
+
* The recording endpoints return a signed URL to an MP4. A model cannot "watch"
|
|
6
|
+
* a video URL, so this module downloads the video and uses ffmpeg to sample a
|
|
7
|
+
* handful of frames, returned as base64 JPEGs. ffmpeg (and ideally ffprobe) must
|
|
8
|
+
* be available on the MCP host; when they are missing we throw a clear error so
|
|
9
|
+
* the caller can fall back to handing the raw URL to a human.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
import { mkdtemp, open, readFile, readdir, rm } from "node:fs/promises";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
const DEFAULTS = {
|
|
16
|
+
count: 4,
|
|
17
|
+
maxBytes: 200 * 1024 * 1024,
|
|
18
|
+
downloadTimeoutMs: 60_000,
|
|
19
|
+
commandTimeoutMs: 30_000,
|
|
20
|
+
ffmpegPath: "ffmpeg",
|
|
21
|
+
ffprobePath: "ffprobe",
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Computes evenly-spaced sample timestamps centered within the duration, so we
|
|
25
|
+
* avoid black/blank frames at the very start and end.
|
|
26
|
+
*/
|
|
27
|
+
export function computeSampleTimestamps(durationSeconds, count) {
|
|
28
|
+
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0 || count <= 0) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const n = Math.min(count, Math.max(1, Math.floor(count)));
|
|
32
|
+
return Array.from({ length: n }, (_, i) => {
|
|
33
|
+
const fraction = (i + 0.5) / n;
|
|
34
|
+
return Number((durationSeconds * fraction).toFixed(3));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds an ffmpeg scale filter that caps width while preserving aspect ratio.
|
|
39
|
+
* Returns null when no cap is requested, so frames keep their original resolution.
|
|
40
|
+
*/
|
|
41
|
+
export function buildScaleFilter(maxWidth) {
|
|
42
|
+
if (maxWidth == null || !Number.isFinite(maxWidth) || maxWidth <= 0) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return `scale='min(${maxWidth},iw)':-2`;
|
|
46
|
+
}
|
|
47
|
+
class CommandNotFoundError extends Error {
|
|
48
|
+
}
|
|
49
|
+
export function runCommand(command, args, timeoutMs) {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
52
|
+
let stdout = "";
|
|
53
|
+
let stderr = "";
|
|
54
|
+
let settled = false;
|
|
55
|
+
const timer = setTimeout(() => {
|
|
56
|
+
if (settled)
|
|
57
|
+
return;
|
|
58
|
+
settled = true;
|
|
59
|
+
child.kill("SIGKILL");
|
|
60
|
+
reject(new Error(`${command} timed out after ${timeoutMs}ms`));
|
|
61
|
+
}, timeoutMs);
|
|
62
|
+
child.stdout?.on("data", (d) => (stdout += d.toString()));
|
|
63
|
+
child.stderr?.on("data", (d) => (stderr += d.toString()));
|
|
64
|
+
child.on("error", (err) => {
|
|
65
|
+
if (settled)
|
|
66
|
+
return;
|
|
67
|
+
settled = true;
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
if (err.code === "ENOENT") {
|
|
70
|
+
reject(new CommandNotFoundError(`'${command}' not found on the MCP host`));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
reject(err);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
child.on("close", (code) => {
|
|
77
|
+
if (settled)
|
|
78
|
+
return;
|
|
79
|
+
settled = true;
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
if (code !== 0) {
|
|
82
|
+
const detail = stderr.trim().split("\n").slice(-3).join("; ");
|
|
83
|
+
reject(new Error(`${command} exited with code ${code}${detail ? `: ${detail}` : ""}`));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
resolve({ code, stdout, stderr });
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async function downloadToFile(url, dest, maxBytes, timeoutMs) {
|
|
91
|
+
const controller = new AbortController();
|
|
92
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
93
|
+
try {
|
|
94
|
+
const res = await fetch(url, { signal: controller.signal });
|
|
95
|
+
if (!res.ok) {
|
|
96
|
+
throw new Error(`failed to download recording (${res.status})`);
|
|
97
|
+
}
|
|
98
|
+
const contentLength = Number(res.headers.get("content-length") ?? "0");
|
|
99
|
+
if (contentLength && contentLength > maxBytes) {
|
|
100
|
+
throw new Error(`recording too large (${contentLength} bytes > ${maxBytes} limit)`);
|
|
101
|
+
}
|
|
102
|
+
if (!res.body) {
|
|
103
|
+
throw new Error("recording download returned an empty body");
|
|
104
|
+
}
|
|
105
|
+
const handle = await open(dest, "w");
|
|
106
|
+
try {
|
|
107
|
+
let total = 0;
|
|
108
|
+
for await (const chunk of res.body) {
|
|
109
|
+
total += chunk.length;
|
|
110
|
+
if (total > maxBytes) {
|
|
111
|
+
throw new Error(`recording exceeded max size (${maxBytes} bytes)`);
|
|
112
|
+
}
|
|
113
|
+
await handle.write(chunk);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
await handle.close();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
clearTimeout(timer);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function probeDurationSeconds(file, ffprobePath, timeoutMs) {
|
|
125
|
+
try {
|
|
126
|
+
const { stdout } = await runCommand(ffprobePath, ["-v", "error", "-show_entries", "format=duration", "-of", "default=nw=1:nk=1", file], timeoutMs);
|
|
127
|
+
const duration = parseFloat(stdout.trim());
|
|
128
|
+
return Number.isFinite(duration) && duration > 0 ? duration : null;
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
if (e instanceof CommandNotFoundError) {
|
|
132
|
+
return null; // ffprobe missing; caller falls back to thumbnail sampling
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function extractFrameAt(file, timestampSeconds, outPath, scaleFilter, ffmpegPath, timeoutMs) {
|
|
138
|
+
const args = ["-ss", String(timestampSeconds), "-i", file, "-frames:v", "1"];
|
|
139
|
+
if (scaleFilter) {
|
|
140
|
+
args.push("-vf", scaleFilter);
|
|
141
|
+
}
|
|
142
|
+
// -q:v 2 = highest-quality JPEG, so the original resolution is preserved with minimal artifacts.
|
|
143
|
+
args.push("-q:v", "2", "-y", outPath);
|
|
144
|
+
await runCommand(ffmpegPath, args, timeoutMs);
|
|
145
|
+
}
|
|
146
|
+
async function extractThumbnails(file, count, outPattern, scaleFilter, ffmpegPath, timeoutMs) {
|
|
147
|
+
const vf = scaleFilter ? `thumbnail,${scaleFilter}` : "thumbnail";
|
|
148
|
+
await runCommand(ffmpegPath, [
|
|
149
|
+
"-i",
|
|
150
|
+
file,
|
|
151
|
+
"-vf",
|
|
152
|
+
vf,
|
|
153
|
+
"-frames:v",
|
|
154
|
+
String(count),
|
|
155
|
+
"-vsync",
|
|
156
|
+
"vfr",
|
|
157
|
+
"-q:v",
|
|
158
|
+
"2",
|
|
159
|
+
"-y",
|
|
160
|
+
outPattern,
|
|
161
|
+
], timeoutMs);
|
|
162
|
+
}
|
|
163
|
+
async function readJpegBase64(file) {
|
|
164
|
+
try {
|
|
165
|
+
const buf = await readFile(file);
|
|
166
|
+
return buf.length > 0 ? buf.toString("base64") : null;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Downloads the recording at `url` and returns sampled JPEG frames.
|
|
174
|
+
* Throws with a clear message when ffmpeg is unavailable.
|
|
175
|
+
*/
|
|
176
|
+
export async function extractFramesFromUrl(url, options = {}) {
|
|
177
|
+
const opts = { ...DEFAULTS, ...options };
|
|
178
|
+
const scaleFilter = buildScaleFilter(opts.maxWidth);
|
|
179
|
+
const workDir = await mkdtemp(path.join(tmpdir(), "laminar-frames-"));
|
|
180
|
+
const videoPath = path.join(workDir, "recording.mp4");
|
|
181
|
+
try {
|
|
182
|
+
await downloadToFile(url, videoPath, opts.maxBytes, opts.downloadTimeoutMs);
|
|
183
|
+
const duration = await probeDurationSeconds(videoPath, opts.ffprobePath, opts.commandTimeoutMs);
|
|
184
|
+
const frames = [];
|
|
185
|
+
try {
|
|
186
|
+
if (duration != null) {
|
|
187
|
+
const timestamps = computeSampleTimestamps(duration, opts.count);
|
|
188
|
+
let lastError = null;
|
|
189
|
+
for (let i = 0; i < timestamps.length; i++) {
|
|
190
|
+
const outPath = path.join(workDir, `frame-${i}.jpg`);
|
|
191
|
+
try {
|
|
192
|
+
await extractFrameAt(videoPath, timestamps[i], outPath, scaleFilter, opts.ffmpegPath, opts.commandTimeoutMs);
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
// ffmpeg missing is fatal; a single bad frame (e.g. a seek that lands
|
|
196
|
+
// past the end) should not abort the whole sample — record it and move on.
|
|
197
|
+
if (e instanceof CommandNotFoundError)
|
|
198
|
+
throw e;
|
|
199
|
+
lastError = e;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const base64 = await readJpegBase64(outPath);
|
|
203
|
+
if (base64) {
|
|
204
|
+
frames.push({
|
|
205
|
+
label: `t=${timestamps[i].toFixed(1)}s`,
|
|
206
|
+
timestampSeconds: timestamps[i],
|
|
207
|
+
base64,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Surface a genuine failure instead of pretending nothing was recorded.
|
|
212
|
+
if (frames.length === 0 && lastError) {
|
|
213
|
+
throw lastError;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
// No duration (ffprobe missing) — fall back to thumbnail sampling.
|
|
218
|
+
const outPattern = path.join(workDir, "thumb-%03d.jpg");
|
|
219
|
+
await extractThumbnails(videoPath, opts.count, outPattern, scaleFilter, opts.ffmpegPath, opts.commandTimeoutMs);
|
|
220
|
+
const files = (await readdir(workDir))
|
|
221
|
+
.filter((f) => f.startsWith("thumb-") && f.endsWith(".jpg"))
|
|
222
|
+
.sort();
|
|
223
|
+
for (let i = 0; i < files.length; i++) {
|
|
224
|
+
const base64 = await readJpegBase64(path.join(workDir, files[i]));
|
|
225
|
+
if (base64) {
|
|
226
|
+
frames.push({ label: `frame ${i + 1}`, timestampSeconds: null, base64 });
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
if (e instanceof CommandNotFoundError) {
|
|
233
|
+
throw new Error("ffmpeg is not installed on the MCP host, so frames cannot be extracted. " +
|
|
234
|
+
"Install ffmpeg, or use get_execution_recording / get_flow_run_recording to get the raw video URL.");
|
|
235
|
+
}
|
|
236
|
+
throw e;
|
|
237
|
+
}
|
|
238
|
+
return frames;
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
await rm(workDir, { recursive: true, force: true }).catch(() => { });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=recording-frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-frames.js","sourceRoot":"","sources":["../src/recording-frames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AA8B7B,MAAM,QAAQ,GAAG;IACf,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAC3B,iBAAiB,EAAE,MAAM;IACzB,gBAAgB,EAAE,MAAM;IACxB,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,SAAS;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,eAAuB,EAAE,KAAa;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,CAAC,eAAe,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,cAAc,QAAQ,UAAU,CAAC;AAC1C,CAAC;AAED,MAAM,oBAAqB,SAAQ,KAAK;CAAG;AAQ3C,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,SAAiB;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE1D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,oBAAoB,CAAC,IAAI,OAAO,6BAA6B,CAAC,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9D,MAAM,CACJ,IAAI,KAAK,CACP,GAAG,OAAO,qBAAqB,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACpE,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,IAAY,EACZ,QAAgB,EAChB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;QACvE,IAAI,aAAa,IAAI,aAAa,GAAG,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,wBAAwB,aAAa,YAAY,QAAQ,SAAS,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,IAA4C,EAAE,CAAC;gBAC3E,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBACtB,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,SAAS,CAAC,CAAC;gBACrE,CAAC;gBACD,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAY,EACZ,WAAmB,EACnB,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CACjC,WAAW,EACX,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,CAAC,EACrF,SAAS,CACV,CAAC;QACF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,oBAAoB,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,CAAC,2DAA2D;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,gBAAwB,EACxB,OAAe,EACf,WAA0B,EAC1B,UAAkB,EAClB,SAAiB;IAEjB,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IAC7E,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAChC,CAAC;IACD,iGAAiG;IACjG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,KAAa,EACb,UAAkB,EAClB,WAA0B,EAC1B,UAAkB,EAClB,SAAiB;IAEjB,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAClE,MAAM,UAAU,CACd,UAAU,EACV;QACE,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,EAAE;QACF,WAAW;QACX,MAAM,CAAC,KAAK,CAAC;QACb,QAAQ;QACR,KAAK;QACL,MAAM;QACN,GAAG;QACH,IAAI;QACJ,UAAU;KACX,EACD,SAAS,CACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW,EACX,UAAgC,EAAE;IAElC,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE5E,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CACzC,SAAS,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,gBAAgB,CACtB,CAAC;QAEF,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjE,IAAI,SAAS,GAAY,IAAI,CAAC;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;oBACrD,IAAI,CAAC;wBACH,MAAM,cAAc,CAClB,SAAS,EACT,UAAU,CAAC,CAAC,CAAC,EACb,OAAO,EACP,WAAW,EACX,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,CACtB,CAAC;oBACJ,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,sEAAsE;wBACtE,2EAA2E;wBAC3E,IAAI,CAAC,YAAY,oBAAoB;4BAAE,MAAM,CAAC,CAAC;wBAC/C,SAAS,GAAG,CAAC,CAAC;wBACd,SAAS;oBACX,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC7C,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,CAAC,IAAI,CAAC;4BACV,KAAK,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;4BACvC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;4BAC/B,MAAM;yBACP,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,wEAAwE;gBACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;oBACrC,MAAM,SAAS,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,mEAAmE;gBACnE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;gBACxD,MAAM,iBAAiB,CACrB,SAAS,EACT,IAAI,CAAC,KAAK,EACV,UAAU,EACV,WAAW,EACX,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,gBAAgB,CACtB,CAAC;gBACF,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;qBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;qBAC3D,IAAI,EAAE,CAAC;gBACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClE,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,oBAAoB,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,0EAA0E;oBACxE,mGAAmG,CACtG,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
package/dist/seed-skills.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import fs from "node:fs";
|
|
13
13
|
import { loadAllSkills } from "./skills.js";
|
|
14
14
|
import { apiToPlatformBase } from "./agent-service-client.js";
|
|
15
|
-
import { getTokenPath } from "./paths.js";
|
|
15
|
+
import { getTokenPath, resolveApiBase } from "./paths.js";
|
|
16
16
|
const adminKey = process.env.SKILLS_ADMIN_KEY;
|
|
17
17
|
if (!adminKey) {
|
|
18
18
|
console.error("SKILLS_ADMIN_KEY is required");
|
|
@@ -25,11 +25,12 @@ function loadAuthToken() {
|
|
|
25
25
|
return null;
|
|
26
26
|
const raw = JSON.parse(fs.readFileSync(tokenPath, "utf-8"));
|
|
27
27
|
const region = raw.us || raw.ca || raw;
|
|
28
|
+
const regionKey = raw.ca || region.region === "ca" ? "ca" : "us";
|
|
28
29
|
if (!region?.access_token)
|
|
29
30
|
return null;
|
|
30
31
|
return {
|
|
31
32
|
token: region.access_token,
|
|
32
|
-
apiBase: region.api_base
|
|
33
|
+
apiBase: resolveApiBase(regionKey, region.api_base),
|
|
33
34
|
};
|
|
34
35
|
}
|
|
35
36
|
catch {
|
package/dist/seed-skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-skills.js","sourceRoot":"","sources":["../src/seed-skills.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"seed-skills.js","sourceRoot":"","sources":["../src/seed-skills.ts"],"names":[],"mappings":"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"}
|