callman-mcp 0.4.0 → 0.6.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/CHANGELOG.md +70 -0
- package/README.md +43 -11
- package/dist/client/api.d.ts +104 -1
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +137 -0
- package/dist/client/api.js.map +1 -1
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +46 -11
- package/dist/client/errors.js.map +1 -1
- package/dist/client/types.d.ts +257 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/domain/diagram/patch.d.ts +32 -32
- package/dist/domain/scenario/build.d.ts.map +1 -1
- package/dist/domain/scenario/build.js +68 -17
- package/dist/domain/scenario/build.js.map +1 -1
- package/dist/domain/scenario/summarize.d.ts +1 -0
- package/dist/domain/scenario/summarize.d.ts.map +1 -1
- package/dist/domain/scenario/summarize.js +1 -0
- package/dist/domain/scenario/summarize.js.map +1 -1
- package/dist/domain/uiTest/compose.d.ts +55 -0
- package/dist/domain/uiTest/compose.d.ts.map +1 -0
- package/dist/domain/uiTest/compose.js +228 -0
- package/dist/domain/uiTest/compose.js.map +1 -0
- package/dist/domain/uiTest/summarize.d.ts +273 -0
- package/dist/domain/uiTest/summarize.d.ts.map +1 -0
- package/dist/domain/uiTest/summarize.js +145 -0
- package/dist/domain/uiTest/summarize.js.map +1 -0
- package/dist/lib/truncate.d.ts +1 -1
- package/dist/lib/truncate.d.ts.map +1 -1
- package/dist/lib/truncate.js.map +1 -1
- package/dist/resources/docs/diagramSchema.d.ts +2 -1
- package/dist/resources/docs/diagramSchema.d.ts.map +1 -1
- package/dist/resources/docs/diagramSchema.js +30 -3
- package/dist/resources/docs/diagramSchema.js.map +1 -1
- package/dist/resources/docs/overview.d.ts +1 -1
- package/dist/resources/docs/overview.d.ts.map +1 -1
- package/dist/resources/docs/overview.js +40 -7
- package/dist/resources/docs/overview.js.map +1 -1
- package/dist/resources/docs/uiTests.d.ts +2 -0
- package/dist/resources/docs/uiTests.d.ts.map +1 -0
- package/dist/resources/docs/uiTests.js +101 -0
- package/dist/resources/docs/uiTests.js.map +1 -0
- package/dist/resources/generated/aiPacks.d.ts +1 -1
- package/dist/resources/generated/aiPacks.js +4 -4
- package/dist/resources/generated/aiPacks.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +15 -4
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/catalog.d.ts +1 -1
- package/dist/tools/catalog.d.ts.map +1 -1
- package/dist/tools/catalog.js +37 -0
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/diagrams.d.ts.map +1 -1
- package/dist/tools/diagrams.js +4 -1
- package/dist/tools/diagrams.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lookups.d.ts +19 -1
- package/dist/tools/lookups.d.ts.map +1 -1
- package/dist/tools/lookups.js +77 -0
- package/dist/tools/lookups.js.map +1 -1
- package/dist/tools/scenarioAdmin.d.ts +4 -0
- package/dist/tools/scenarioAdmin.d.ts.map +1 -0
- package/dist/tools/scenarioAdmin.js +142 -0
- package/dist/tools/scenarioAdmin.js.map +1 -0
- package/dist/tools/scenarios.d.ts +4 -0
- package/dist/tools/scenarios.d.ts.map +1 -1
- package/dist/tools/scenarios.js +111 -16
- package/dist/tools/scenarios.js.map +1 -1
- package/dist/tools/shared.d.ts +5 -0
- package/dist/tools/shared.d.ts.map +1 -1
- package/dist/tools/shared.js +10 -0
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/uiTestAdmin.d.ts +4 -0
- package/dist/tools/uiTestAdmin.d.ts.map +1 -0
- package/dist/tools/uiTestAdmin.js +509 -0
- package/dist/tools/uiTestAdmin.js.map +1 -0
- package/dist/tools/uiTestRuns.d.ts +24 -0
- package/dist/tools/uiTestRuns.d.ts.map +1 -0
- package/dist/tools/uiTestRuns.js +367 -0
- package/dist/tools/uiTestRuns.js.map +1 -0
- package/dist/tools/uiTestShared.d.ts +236 -0
- package/dist/tools/uiTestShared.d.ts.map +1 -0
- package/dist/tools/uiTestShared.js +187 -0
- package/dist/tools/uiTestShared.js.map +1 -0
- package/dist/tools/uiTests.d.ts +4 -0
- package/dist/tools/uiTests.d.ts.map +1 -0
- package/dist/tools/uiTests.js +572 -0
- package/dist/tools/uiTests.js.map +1 -0
- package/dist-cjs/client/api.js +137 -0
- package/dist-cjs/client/errors.js +46 -11
- package/dist-cjs/domain/scenario/build.js +68 -17
- package/dist-cjs/domain/scenario/summarize.js +1 -0
- package/dist-cjs/domain/uiTest/compose.js +242 -0
- package/dist-cjs/domain/uiTest/summarize.js +155 -0
- package/dist-cjs/resources/docs/diagramSchema.js +32 -4
- package/dist-cjs/resources/docs/overview.js +40 -7
- package/dist-cjs/resources/docs/uiTests.js +103 -0
- package/dist-cjs/resources/generated/aiPacks.js +4 -4
- package/dist-cjs/resources/index.js +12 -1
- package/dist-cjs/server.js +2 -2
- package/dist-cjs/tools/catalog.js +37 -0
- package/dist-cjs/tools/diagrams.js +4 -1
- package/dist-cjs/tools/index.js +8 -0
- package/dist-cjs/tools/lookups.js +83 -1
- package/dist-cjs/tools/scenarioAdmin.js +145 -0
- package/dist-cjs/tools/scenarios.js +113 -17
- package/dist-cjs/tools/shared.js +12 -1
- package/dist-cjs/tools/uiTestAdmin.js +512 -0
- package/dist-cjs/tools/uiTestRuns.js +372 -0
- package/dist-cjs/tools/uiTestShared.js +202 -0
- package/dist-cjs/tools/uiTests.js +575 -0
- package/package.json +3 -3
package/dist/tools/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,kCAAkC;AAClC,6EAA6E;AAC7E,+EAA+E;AAC/E,+DAA+D;AAC/D,oFAAoF;AACpF,sEAAsE;AACtE,4CAA4C;AAC5C,8EAA8E;AAE9E,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,UAAmC,EAAE,IAAa,EAAkB,EAAE,CAAC,CAAC;IACzF,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;IACpE,iBAAiB,EAAE,UAAU;CAC9B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiTestAdmin.d.ts","sourceRoot":"","sources":["../../src/tools/uiTestAdmin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAqKjD,eAAO,MAAM,wBAAwB,GAAI,QAAQ,SAAS,EAAE,KAAK,WAAW,KAAG,IAsZ9E,CAAC"}
|
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CallmanApiError, ToolInputError } from "../client/errors.js";
|
|
3
|
+
import { resolvedSummary, resolveRef } from "../domain/resolve.js";
|
|
4
|
+
import { diffLines } from "../domain/uiTest/compose.js";
|
|
5
|
+
import { imageFromDataUrl, maskedDatasetKeys, runReportView, scheduleView } from "../domain/uiTest/summarize.js";
|
|
6
|
+
import { strictObject } from "../lib/strict.js";
|
|
7
|
+
import { byteLength, clipBytes, LIMITS } from "../lib/truncate.js";
|
|
8
|
+
import { loadConnections, loadUiTestFolders, loadUiTests, resolveUiTest, resolveUiTestFolder, uiTestFolderSubtree, workspacesForListing, workspaceTag } from "./lookups.js";
|
|
9
|
+
import { confirmArg, DESTRUCTIVE, dryRunArg, guarded, IDEMPOTENT_WRITE, ok, okWithImages, READ, refArg, requireConfirm, RUN, workspaceArg, WRITE } from "./shared.js";
|
|
10
|
+
import { flowArg, resolveGroupId, workspaceIdOf } from "./uiTestShared.js";
|
|
11
|
+
import { pollRun } from "./uiTestRuns.js";
|
|
12
|
+
// UI-test schedules (web flows on the server runner), the on-prem review
|
|
13
|
+
// workflow (submit / approve / reject, approved versions) and export/import
|
|
14
|
+
// of `callman.uitest` envelopes.
|
|
15
|
+
const EXPORT_MAX_BYTES = 2 * 1024 * 1024;
|
|
16
|
+
const ENVELOPE_MAX = 8 * 1024 * 1024;
|
|
17
|
+
const CLOUD_REVIEW_NOTE = "Callman cloud has no review workflow for UI tests — flows run and schedule as saved. Approval and versions exist on on-prem installations.";
|
|
18
|
+
const isReviewDisabled = (error) => error instanceof CallmanApiError && error.code === "REVIEW_DISABLED_CLOUD";
|
|
19
|
+
// ── schedules ──────────────────────────────────────────────────────────
|
|
20
|
+
const timesArg = z.array(z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "HH:mm")).min(1).max(24);
|
|
21
|
+
const scheduleFields = {
|
|
22
|
+
description: z.string().max(1000).nullable().optional(),
|
|
23
|
+
enabled: z.boolean().optional(),
|
|
24
|
+
triggerType: z.enum(["daily", "weekly", "monthly", "custom_cron"]).optional(),
|
|
25
|
+
times: timesArg.optional().describe('Times of day (HH:mm, 24h) for daily / weekly / monthly, e.g. ["09:00", "18:30"]'),
|
|
26
|
+
daysOfWeek: z.array(z.number().int().min(0).max(6)).min(1).max(7).optional().describe("weekly: 0 = Sunday … 6 = Saturday"),
|
|
27
|
+
daysOfMonth: z.array(z.number().int().min(1).max(31)).min(1).max(31).optional().describe("monthly: 1–31"),
|
|
28
|
+
cronExpression: z.string().max(120).optional().describe("custom_cron: a 5-field cron expression"),
|
|
29
|
+
timezone: z.string().max(100).optional().describe("IANA time zone, e.g. Asia/Baku (default: the server's)"),
|
|
30
|
+
executionPolicy: strictObject({
|
|
31
|
+
allowParallelRuns: z.boolean().optional(),
|
|
32
|
+
skipIfAlreadyRunning: z.boolean().optional(),
|
|
33
|
+
maxRuntimeMinutes: z.number().int().min(1).max(1440).nullable().optional(),
|
|
34
|
+
}, "execution policy field").optional(),
|
|
35
|
+
failurePolicy: strictObject({
|
|
36
|
+
retryCount: z.number().int().min(0).max(10).optional(),
|
|
37
|
+
retryIntervalMinutes: z.number().int().min(1).max(1440).optional(),
|
|
38
|
+
}, "failure policy field").optional(),
|
|
39
|
+
notification: strictObject({
|
|
40
|
+
notifyOnSuccess: z.boolean().optional(),
|
|
41
|
+
notifyOnFailure: z.boolean().optional(),
|
|
42
|
+
connection: z.string().max(200).nullable().optional().describe("Notification connection (Slack / Teams / email …) id or name"),
|
|
43
|
+
channelOverride: z.string().max(500).nullable().optional(),
|
|
44
|
+
}, "notification field")
|
|
45
|
+
.nullable()
|
|
46
|
+
.optional(),
|
|
47
|
+
};
|
|
48
|
+
// Flat tool arguments → the backend's trigger configs.
|
|
49
|
+
const scheduleBody = async (ctx, ws, input, current) => {
|
|
50
|
+
const body = {};
|
|
51
|
+
if (input.description !== undefined)
|
|
52
|
+
body.description = input.description;
|
|
53
|
+
if (input.enabled !== undefined)
|
|
54
|
+
body.enabled = input.enabled;
|
|
55
|
+
if (input.timezone !== undefined)
|
|
56
|
+
body.timezone = input.timezone;
|
|
57
|
+
if (input.executionPolicy)
|
|
58
|
+
body.executionPolicy = input.executionPolicy;
|
|
59
|
+
if (input.failurePolicy)
|
|
60
|
+
body.failurePolicy = input.failurePolicy;
|
|
61
|
+
const triggerTouched = input.triggerType !== undefined || input.times !== undefined || input.daysOfWeek !== undefined || input.daysOfMonth !== undefined || input.cronExpression !== undefined;
|
|
62
|
+
if (triggerTouched) {
|
|
63
|
+
const type = input.triggerType ?? current?.triggerType;
|
|
64
|
+
if (!type)
|
|
65
|
+
throw new ToolInputError("SCHEDULE_TRIGGER_REQUIRED", "Pass triggerType (daily, weekly, monthly or custom_cron).");
|
|
66
|
+
const times = input.times ?? current?.dailyConfig?.times ?? current?.weeklyConfig?.times ?? current?.monthlyConfig?.times;
|
|
67
|
+
body.triggerType = type;
|
|
68
|
+
if (type === "custom_cron") {
|
|
69
|
+
const cron = input.cronExpression ?? current?.customCronExpression;
|
|
70
|
+
if (!cron)
|
|
71
|
+
throw new ToolInputError("SCHEDULE_CRON_REQUIRED", "custom_cron needs cronExpression.");
|
|
72
|
+
body.customCronExpression = cron;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
if (!times)
|
|
76
|
+
throw new ToolInputError("SCHEDULE_TIMES_REQUIRED", `A ${type} schedule needs times (HH:mm).`);
|
|
77
|
+
if (type === "daily")
|
|
78
|
+
body.dailyConfig = { times };
|
|
79
|
+
if (type === "weekly") {
|
|
80
|
+
const days = input.daysOfWeek ?? current?.weeklyConfig?.daysOfWeek;
|
|
81
|
+
if (!days)
|
|
82
|
+
throw new ToolInputError("SCHEDULE_DAYS_REQUIRED", "A weekly schedule needs daysOfWeek (0 = Sunday … 6 = Saturday).");
|
|
83
|
+
body.weeklyConfig = { daysOfWeek: days, times };
|
|
84
|
+
}
|
|
85
|
+
if (type === "monthly") {
|
|
86
|
+
const days = input.daysOfMonth ?? current?.monthlyConfig?.daysOfMonth;
|
|
87
|
+
if (!days)
|
|
88
|
+
throw new ToolInputError("SCHEDULE_DAYS_REQUIRED", "A monthly schedule needs daysOfMonth (1–31).");
|
|
89
|
+
body.monthlyConfig = { daysOfMonth: days, times };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (input.notification !== undefined) {
|
|
94
|
+
if (input.notification === null)
|
|
95
|
+
body.notificationConfig = null;
|
|
96
|
+
else {
|
|
97
|
+
const { connection, ...rest } = input.notification;
|
|
98
|
+
let connectionId = connection === null ? null : undefined;
|
|
99
|
+
if (connection)
|
|
100
|
+
connectionId = resolveRef("connection", connection, await loadConnections(ctx, ws), { describe: (entry) => ({ type: entry.type }) }).item.id;
|
|
101
|
+
body.notificationConfig = { ...rest, ...(connectionId !== undefined ? { connectionId } : {}) };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return body;
|
|
105
|
+
};
|
|
106
|
+
const listSchedulesAcross = async (ctx, workspace, flowClientId) => {
|
|
107
|
+
const out = [];
|
|
108
|
+
for (const ws of await workspacesForListing(ctx, workspace)) {
|
|
109
|
+
try {
|
|
110
|
+
for (const schedule of await ctx.api.listUiTestSchedules(ws.id, flowClientId)) {
|
|
111
|
+
if (!out.some((entry) => entry.schedule.id === schedule.id))
|
|
112
|
+
out.push({ ws, schedule });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof CallmanApiError && (error.status === 403 || error.status === 404))
|
|
117
|
+
continue;
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
};
|
|
123
|
+
const resolveSchedule = async (ctx, workspace, ref, exact = false) => {
|
|
124
|
+
const all = await listSchedulesAcross(ctx, workspace);
|
|
125
|
+
const resolved = resolveRef("UI-test schedule", ref, all.map((entry) => ({ id: entry.schedule.id, name: entry.schedule.name, entry })), { describe: (item) => ({ flow: item.entry.schedule.flowName, triggerType: item.entry.schedule.triggerType }), aliases: (item) => [`${item.entry.schedule.flowName}/${item.entry.schedule.name}`], exact });
|
|
126
|
+
return { schedule: resolved.item.entry.schedule, ws: resolved.item.entry.ws, annotation: resolved.annotation };
|
|
127
|
+
};
|
|
128
|
+
const refuseMobile = (flows) => {
|
|
129
|
+
const mobile = flows.filter((flow) => flow.platform !== "web");
|
|
130
|
+
if (mobile.length > 0) {
|
|
131
|
+
throw new ToolInputError("UI_TEST_PLATFORM_UNSUPPORTED", `Schedules run on the server runner, which runs web flows only — not ${mobile.map((flow) => `"${flow.name}" (${flow.platform})`).join(", ")}. Run mobile flows with run_ui_test on your desktop app.`);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
// ── review helpers ─────────────────────────────────────────────────────
|
|
135
|
+
const flowStatus = (flow) => ({ id: flow.clientId, name: flow.name, reviewStatus: flow.reviewStatus ?? null, version: flow.version ?? null, activeVersionNumber: flow.activeVersionNumber ?? null, ...(flow.reviewNote ? { reviewNote: flow.reviewNote } : {}) });
|
|
136
|
+
export const registerUiTestAdminTools = (server, ctx) => {
|
|
137
|
+
// ── schedules ────────────────────────────────────────────────────────
|
|
138
|
+
server.registerTool("list_ui_test_schedules", {
|
|
139
|
+
title: "List UI-test schedules",
|
|
140
|
+
description: "Schedules that run UI tests on the server runner (web flows), across your workspaces or for one flow: trigger (daily / weekly / monthly / cron), times, enabled, last and next run.",
|
|
141
|
+
inputSchema: { workspace: workspaceArg, flow: flowArg.optional() },
|
|
142
|
+
annotations: READ,
|
|
143
|
+
}, guarded(async ({ workspace, flow }) => {
|
|
144
|
+
const resolved = flow ? await resolveUiTest(ctx, workspace, flow) : null;
|
|
145
|
+
const rows = await listSchedulesAcross(ctx, resolved ? resolved.item.workspaceId : workspace, resolved?.item.clientId);
|
|
146
|
+
const workspaces = await ctx.listWorkspaces();
|
|
147
|
+
return ok({
|
|
148
|
+
...(resolved ? { uiTest: { id: resolved.item.clientId, name: resolved.item.name } } : {}),
|
|
149
|
+
schedules: rows.map((entry) => ({ ...scheduleView(entry.schedule), ...(workspaces.length > 1 ? { workspace: workspaceTag(entry.ws) } : {}) })),
|
|
150
|
+
total: rows.length,
|
|
151
|
+
});
|
|
152
|
+
}));
|
|
153
|
+
server.registerTool("create_ui_test_schedule", {
|
|
154
|
+
title: "Schedule UI tests",
|
|
155
|
+
description: "Schedule one or many web UI tests to run on the server runner: triggerType daily / weekly / monthly (with times HH:mm, daysOfWeek 0–6 or daysOfMonth 1–31) or custom_cron (cronExpression), timezone, execution / failure (retries) policies and notifications. Many flows = one schedule each; conflictMode says what to do with flows that already have schedules (add — default, replace, skip). dryRun: true shows what would be created. Mobile flows cannot be scheduled. On-prem, schedules run the flow's APPROVED version.",
|
|
156
|
+
inputSchema: {
|
|
157
|
+
workspace: workspaceArg,
|
|
158
|
+
flows: z.array(flowArg).min(1).max(200),
|
|
159
|
+
name: z.string().trim().min(1).max(120),
|
|
160
|
+
...scheduleFields,
|
|
161
|
+
triggerType: z.enum(["daily", "weekly", "monthly", "custom_cron"]),
|
|
162
|
+
conflictMode: z.enum(["add", "replace", "skip"]).optional(),
|
|
163
|
+
dryRun: dryRunArg,
|
|
164
|
+
},
|
|
165
|
+
annotations: WRITE,
|
|
166
|
+
}, guarded(async ({ workspace, flows, name, conflictMode, dryRun, ...fields }) => {
|
|
167
|
+
const resolved = [];
|
|
168
|
+
for (const ref of flows)
|
|
169
|
+
resolved.push(await resolveUiTest(ctx, workspace, ref));
|
|
170
|
+
const targets = resolved.map((entry) => entry.item);
|
|
171
|
+
refuseMobile(targets);
|
|
172
|
+
const workspaceIds = [...new Set(targets.map((flow) => flow.workspaceId))];
|
|
173
|
+
if (workspaceIds.length > 1)
|
|
174
|
+
throw new ToolInputError("UI_TEST_SCHEDULE_WORKSPACES", "The flows are in different workspaces — create one schedule call per workspace.");
|
|
175
|
+
const ws = workspaceIdOf(targets[0]);
|
|
176
|
+
const base = { name, ...(await scheduleBody(ctx, ws, fields)) };
|
|
177
|
+
if (targets.length === 1 && !dryRun && !conflictMode) {
|
|
178
|
+
const created = await ctx.api.createUiTestSchedule(ws, { ...base, flowClientId: targets[0].clientId });
|
|
179
|
+
return ok({ schedule: scheduleView(created), ...(resolved[0].annotation ? { resolved: [resolvedSummary(flows[0], resolved[0])] } : {}) });
|
|
180
|
+
}
|
|
181
|
+
const result = await ctx.api.bulkCreateUiTestSchedules(ws, { ...base, flowClientIds: targets.map((flow) => flow.clientId), conflictMode: conflictMode ?? "add", dryRun: dryRun ?? false });
|
|
182
|
+
const nameOf = new Map(targets.map((flow) => [flow.clientId, flow.name]));
|
|
183
|
+
const names = (ids) => ids.map((id) => nameOf.get(id) ?? id);
|
|
184
|
+
return ok({
|
|
185
|
+
...(dryRun ? { dryRun: true } : {}),
|
|
186
|
+
created: result.created,
|
|
187
|
+
schedules: result.createdSchedules.map(scheduleView),
|
|
188
|
+
...(result.conflictIds.length ? { alreadyScheduled: names(result.conflictIds) } : {}),
|
|
189
|
+
...(result.skippedIds.length ? { skipped: names(result.skippedIds) } : {}),
|
|
190
|
+
...(result.replacedCount ? { replaced: result.replacedCount } : {}),
|
|
191
|
+
...(result.blockedIds.length ? { blocked: names(result.blockedIds), blockedReason: result.blockedReason } : {}),
|
|
192
|
+
...(result.failures.length ? { failed: result.failures.map((failure) => ({ ...failure, flow: nameOf.get(failure.flowClientId) ?? failure.flowClientId })) } : {}),
|
|
193
|
+
conflictMode: result.conflictMode,
|
|
194
|
+
});
|
|
195
|
+
}));
|
|
196
|
+
server.registerTool("update_ui_test_schedule", {
|
|
197
|
+
title: "Update a UI-test schedule",
|
|
198
|
+
description: "Change a UI-test schedule (id or name): name, enabled (enable / disable), trigger and times, timezone, policies, notifications. Only the fields you pass change.",
|
|
199
|
+
inputSchema: {
|
|
200
|
+
workspace: workspaceArg,
|
|
201
|
+
schedule: refArg("UI-test schedule"),
|
|
202
|
+
name: z.string().trim().min(1).max(120).optional(),
|
|
203
|
+
...scheduleFields,
|
|
204
|
+
},
|
|
205
|
+
annotations: IDEMPOTENT_WRITE,
|
|
206
|
+
}, guarded(async ({ workspace, schedule, name, ...fields }) => {
|
|
207
|
+
const found = await resolveSchedule(ctx, workspace, schedule);
|
|
208
|
+
const body = { ...(name !== undefined ? { name } : {}), ...(await scheduleBody(ctx, found.ws.id, fields, found.schedule)) };
|
|
209
|
+
if (Object.keys(body).length === 0)
|
|
210
|
+
throw new ToolInputError("NOTHING_TO_UPDATE", "Pass at least one field to change.");
|
|
211
|
+
const updated = Object.keys(body).length === 1 && body.enabled !== undefined
|
|
212
|
+
? await ctx.api.toggleUiTestSchedule(found.ws.id, found.schedule.id, body.enabled)
|
|
213
|
+
: await ctx.api.updateUiTestSchedule(found.ws.id, found.schedule.id, body);
|
|
214
|
+
return ok({ schedule: scheduleView(updated), ...(found.annotation ? { resolved: [{ input: schedule, matched: found.schedule.name, id: found.schedule.id, note: found.annotation }] } : {}) });
|
|
215
|
+
}));
|
|
216
|
+
server.registerTool("delete_ui_test_schedule", {
|
|
217
|
+
title: "Delete a UI-test schedule",
|
|
218
|
+
description: "Delete a UI-test schedule (exact name or id). The flow itself is kept. Confirm with the user first.",
|
|
219
|
+
inputSchema: { workspace: workspaceArg, schedule: refArg("UI-test schedule"), confirm: confirmArg },
|
|
220
|
+
annotations: DESTRUCTIVE,
|
|
221
|
+
}, guarded(async ({ workspace, schedule, confirm }) => {
|
|
222
|
+
requireConfirm(confirm, "a UI-test schedule");
|
|
223
|
+
const found = await resolveSchedule(ctx, workspace, schedule, true);
|
|
224
|
+
await ctx.api.deleteUiTestSchedule(found.ws.id, found.schedule.id);
|
|
225
|
+
return ok({ deleted: { id: found.schedule.id, name: found.schedule.name, flow: found.schedule.flowName } });
|
|
226
|
+
}));
|
|
227
|
+
server.registerTool("run_ui_test_schedule_now", {
|
|
228
|
+
title: "Run a UI-test schedule now",
|
|
229
|
+
description: "Trigger a UI-test schedule immediately (server runner, the flow's approved version on-prem) and wait for the result like run_ui_test. Refused while the schedule is already running.",
|
|
230
|
+
inputSchema: {
|
|
231
|
+
workspace: workspaceArg,
|
|
232
|
+
schedule: refArg("UI-test schedule"),
|
|
233
|
+
wait: z.boolean().default(true),
|
|
234
|
+
timeoutSec: z.number().int().min(5).max(1800).default(600),
|
|
235
|
+
includeScreenshots: z.boolean().default(false),
|
|
236
|
+
},
|
|
237
|
+
annotations: RUN,
|
|
238
|
+
}, guarded(async ({ workspace, schedule, wait, timeoutSec, includeScreenshots }) => {
|
|
239
|
+
const found = await resolveSchedule(ctx, workspace, schedule);
|
|
240
|
+
const trigger = await ctx.api.runUiTestScheduleNow(found.ws.id, found.schedule.id);
|
|
241
|
+
const header = { schedule: { id: found.schedule.id, name: found.schedule.name }, flow: { id: found.schedule.flowClientId, name: found.schedule.flowName }, reportId: trigger.reportId };
|
|
242
|
+
if (!wait)
|
|
243
|
+
return ok({ ...header, status: trigger.status, note: "Check it with get_ui_test_run." });
|
|
244
|
+
const { report, timedOut } = await pollRun(ctx, found.ws.id, trigger.reportId, timeoutSec);
|
|
245
|
+
if (timedOut || !report)
|
|
246
|
+
return ok({ ...header, status: report?.status ?? trigger.status, timedOut: true, note: `Still running after ${timeoutSec}s — call get_ui_test_run with this reportId later.` });
|
|
247
|
+
const structured = { ...header, run: runReportView(report) };
|
|
248
|
+
if (!includeScreenshots)
|
|
249
|
+
return ok(structured);
|
|
250
|
+
const images = [
|
|
251
|
+
{ caption: "Failure screenshot", image: imageFromDataUrl(report.failureScreenshot) },
|
|
252
|
+
{ caption: "Final screenshot", image: imageFromDataUrl(report.finalScreenshot) },
|
|
253
|
+
].flatMap((entry) => (entry.image ? [{ caption: entry.caption, ...entry.image }] : []));
|
|
254
|
+
return okWithImages(structured, images);
|
|
255
|
+
}));
|
|
256
|
+
// ── review (on-prem) ─────────────────────────────────────────────────
|
|
257
|
+
server.registerTool("submit_ui_test", {
|
|
258
|
+
title: "Submit a UI test for approval",
|
|
259
|
+
description: "Send a draft UI test for review (on-prem approval workflow — schedules run the APPROVED version). Optionally name approvers (email, name or user id; default: every eligible approver is notified). On cloud there is no review workflow and this says so.",
|
|
260
|
+
inputSchema: {
|
|
261
|
+
workspace: workspaceArg,
|
|
262
|
+
flow: flowArg,
|
|
263
|
+
approvers: z.array(z.string().max(255)).max(100).optional(),
|
|
264
|
+
},
|
|
265
|
+
annotations: WRITE,
|
|
266
|
+
}, guarded(async ({ workspace, flow, approvers }) => {
|
|
267
|
+
const resolved = await resolveUiTest(ctx, workspace, flow);
|
|
268
|
+
const ws = workspaceIdOf(resolved.item);
|
|
269
|
+
try {
|
|
270
|
+
let approverIds;
|
|
271
|
+
if (approvers && approvers.length > 0) {
|
|
272
|
+
const { items } = await ctx.api.uiTestApproverCandidates(ws, resolved.item.clientId);
|
|
273
|
+
approverIds = approvers.map((ref) => {
|
|
274
|
+
const needle = ref.trim().toLowerCase();
|
|
275
|
+
const match = items.find((candidate) => candidate.userId === ref.trim() || candidate.email.toLowerCase() === needle || (candidate.displayName ?? "").toLowerCase() === needle);
|
|
276
|
+
if (!match)
|
|
277
|
+
throw new ToolInputError("APPROVER_NOT_ELIGIBLE", `"${ref}" cannot approve this UI test.`, { candidates: items.map((candidate) => ({ email: candidate.email, name: candidate.displayName })) });
|
|
278
|
+
return match.userId;
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
const submitted = await ctx.api.submitUiTest(ws, resolved.item.clientId, approverIds ? { approverIds } : {});
|
|
282
|
+
ctx.invalidate("uitests:");
|
|
283
|
+
return ok({ uiTest: flowStatus(submitted), note: "Submitted — an approver approves it with review_ui_test or in the desktop app." });
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (!isReviewDisabled(error))
|
|
287
|
+
throw error;
|
|
288
|
+
return ok({ uiTest: { id: resolved.item.clientId, name: resolved.item.name }, reviewWorkflow: false, note: CLOUD_REVIEW_NOTE });
|
|
289
|
+
}
|
|
290
|
+
}));
|
|
291
|
+
server.registerTool("review_ui_test", {
|
|
292
|
+
title: "Approve or reject a UI test",
|
|
293
|
+
description: "As an approver (on-prem), approve a UI test waiting for review — its current content becomes the new approved version that schedules run — or reject it with a note explaining the changes needed. list_ui_tests awaitingMyReview: true lists what waits for you; list_ui_test_versions shows what changed.",
|
|
294
|
+
inputSchema: {
|
|
295
|
+
workspace: workspaceArg,
|
|
296
|
+
flow: flowArg,
|
|
297
|
+
decision: z.enum(["approve", "reject"]),
|
|
298
|
+
note: z.string().trim().max(2000).optional().describe("Required when rejecting"),
|
|
299
|
+
},
|
|
300
|
+
annotations: WRITE,
|
|
301
|
+
}, guarded(async ({ workspace, flow, decision, note }) => {
|
|
302
|
+
if (decision === "reject" && !note)
|
|
303
|
+
throw new ToolInputError("REVIEW_NOTE_REQUIRED", "Rejecting needs a `note` telling the author what to change.");
|
|
304
|
+
const resolved = await resolveUiTest(ctx, workspace, flow);
|
|
305
|
+
const ws = workspaceIdOf(resolved.item);
|
|
306
|
+
try {
|
|
307
|
+
const result = decision === "approve" ? await ctx.api.approveUiTest(ws, resolved.item.clientId) : await ctx.api.rejectUiTest(ws, resolved.item.clientId, note);
|
|
308
|
+
ctx.invalidate("uitests:");
|
|
309
|
+
return ok({ uiTest: flowStatus(result), decision, note: decision === "approve" ? `Approved — version ${result.activeVersionNumber ?? "?"} is what schedules run now.` : "Rejected — the author sees your note (changes requested)." });
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
if (!isReviewDisabled(error))
|
|
313
|
+
throw error;
|
|
314
|
+
return ok({ uiTest: { id: resolved.item.clientId, name: resolved.item.name }, reviewWorkflow: false, note: CLOUD_REVIEW_NOTE });
|
|
315
|
+
}
|
|
316
|
+
}));
|
|
317
|
+
server.registerTool("list_ui_test_versions", {
|
|
318
|
+
title: "UI-test approved versions",
|
|
319
|
+
description: "The approved versions of a UI test (on-prem): number, who submitted and approved it, when, and which one is active (what schedules run). With `version`: that version's snapshot (content, settings) and a line diff of its YAML against the current flow.",
|
|
320
|
+
inputSchema: {
|
|
321
|
+
workspace: workspaceArg,
|
|
322
|
+
flow: flowArg,
|
|
323
|
+
version: z.number().int().min(1).optional(),
|
|
324
|
+
},
|
|
325
|
+
annotations: READ,
|
|
326
|
+
}, guarded(async ({ workspace, flow, version }) => {
|
|
327
|
+
const resolved = await resolveUiTest(ctx, workspace, flow);
|
|
328
|
+
const ws = workspaceIdOf(resolved.item);
|
|
329
|
+
const head = { uiTest: { id: resolved.item.clientId, name: resolved.item.name, version: resolved.item.version ?? null, reviewStatus: resolved.item.reviewStatus ?? null } };
|
|
330
|
+
try {
|
|
331
|
+
if (version === undefined) {
|
|
332
|
+
const list = await ctx.api.listUiTestVersions(ws, resolved.item.clientId);
|
|
333
|
+
return ok({
|
|
334
|
+
...head,
|
|
335
|
+
activeVersionNumber: list.activeVersionNumber,
|
|
336
|
+
versions: list.items.map(({ snapshot: _snapshot, ...item }) => item),
|
|
337
|
+
...(list.items.length === 0 ? { note: "Never approved yet — submit_ui_test sends it for review." } : {}),
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
const [detail, current] = await Promise.all([ctx.api.getUiTestVersion(ws, resolved.item.clientId, version), ctx.api.getUiTest(resolved.item.clientId)]);
|
|
341
|
+
const snapshotContent = detail.snapshot?.content ?? "";
|
|
342
|
+
const { snapshot, ...meta } = detail;
|
|
343
|
+
return ok({
|
|
344
|
+
...head,
|
|
345
|
+
version: meta,
|
|
346
|
+
snapshot: snapshot ? { ...snapshot, content: clipBytes(snapshotContent, LIMITS.SCENARIO_FULL).text } : null,
|
|
347
|
+
diffAgainstCurrent: diffLines(snapshotContent, current.content ?? ""),
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
if (!isReviewDisabled(error))
|
|
352
|
+
throw error;
|
|
353
|
+
return ok({ ...head, reviewWorkflow: false, versions: [], note: CLOUD_REVIEW_NOTE });
|
|
354
|
+
}
|
|
355
|
+
}));
|
|
356
|
+
server.registerTool("restore_ui_test_version", {
|
|
357
|
+
title: "Restore an approved UI-test version",
|
|
358
|
+
description: "Make an earlier approved version the ACTIVE one again (on-prem; approvers): schedules run it from now on. The flow's current content, version and review status are not changed.",
|
|
359
|
+
inputSchema: { workspace: workspaceArg, flow: flowArg, version: z.number().int().min(1) },
|
|
360
|
+
annotations: IDEMPOTENT_WRITE,
|
|
361
|
+
}, guarded(async ({ workspace, flow, version }) => {
|
|
362
|
+
const resolved = await resolveUiTest(ctx, workspace, flow);
|
|
363
|
+
try {
|
|
364
|
+
const restored = await ctx.api.restoreUiTestVersion(workspaceIdOf(resolved.item), resolved.item.clientId, version);
|
|
365
|
+
ctx.invalidate("uitests:");
|
|
366
|
+
return ok({ uiTest: flowStatus(restored), note: `Version ${version} is active — schedules run it from now on.` });
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
if (!isReviewDisabled(error))
|
|
370
|
+
throw error;
|
|
371
|
+
return ok({ uiTest: { id: resolved.item.clientId, name: resolved.item.name }, reviewWorkflow: false, note: CLOUD_REVIEW_NOTE });
|
|
372
|
+
}
|
|
373
|
+
}));
|
|
374
|
+
// ── export / import ──────────────────────────────────────────────────
|
|
375
|
+
server.registerTool("export_ui_tests", {
|
|
376
|
+
title: "Export UI tests",
|
|
377
|
+
description: "Export UI tests (a list of flows, or a folder with its subfolders) as a `callman.uitest` envelope — the .callman.uitest file format the desktop app imports. Sub-flows they call with runFlow are bundled; connections they use are included as safe descriptions (never credentials). includeDataset: false leaves test data out; secret-looking dataset values are masked unless reveal: true (needs environments:reveal) — a masked envelope cannot be imported until those values are filled in. The envelope comes back in the result: save it yourself if a file is wanted.",
|
|
378
|
+
inputSchema: {
|
|
379
|
+
workspace: workspaceArg,
|
|
380
|
+
flows: z.array(flowArg).min(1).max(100).optional(),
|
|
381
|
+
folder: z.string().max(300).optional(),
|
|
382
|
+
includeDataset: z.boolean().default(true),
|
|
383
|
+
reveal: z.boolean().optional().describe("Export secret dataset values unmasked (needs environments:reveal)"),
|
|
384
|
+
},
|
|
385
|
+
annotations: READ,
|
|
386
|
+
}, guarded(async ({ workspace, flows, folder, includeDataset, reveal }) => {
|
|
387
|
+
if ((flows === undefined) === (folder === undefined))
|
|
388
|
+
throw new ToolInputError("EXPORT_SCOPE", "Pass `flows` or `folder` (one of them).");
|
|
389
|
+
let targets;
|
|
390
|
+
if (folder) {
|
|
391
|
+
const found = await resolveUiTestFolder(ctx, workspace, folder);
|
|
392
|
+
const scope = uiTestFolderSubtree(await loadUiTestFolders(ctx), found.item.id);
|
|
393
|
+
targets = (await loadUiTests(ctx)).filter((flow) => flow.folderId && scope.has(flow.folderId));
|
|
394
|
+
if (targets.length === 0)
|
|
395
|
+
throw new ToolInputError("UI_TEST_FOLDER_EMPTY", `Folder "${found.item.path}" has no UI tests.`);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
targets = [];
|
|
399
|
+
for (const ref of flows ?? [])
|
|
400
|
+
targets.push((await resolveUiTest(ctx, workspace, ref)).item);
|
|
401
|
+
}
|
|
402
|
+
if (targets.length > 100)
|
|
403
|
+
throw new ToolInputError("EXPORT_TOO_MANY", `${targets.length} flows (limit 100 per export).`);
|
|
404
|
+
const envelope = await ctx.api.exportUiTests(workspaceIdOf(targets[0]), { clientIds: targets.map((flow) => flow.clientId), includeDataset }, reveal ?? false);
|
|
405
|
+
const masked = envelope.flows.flatMap((entry) => maskedDatasetKeys(entry.dataset).map((key) => `${entry.name}: ${key}`));
|
|
406
|
+
const bytes = byteLength(envelope);
|
|
407
|
+
if (bytes > EXPORT_MAX_BYTES)
|
|
408
|
+
throw new ToolInputError("EXPORT_TOO_LARGE", `The export is ${bytes} bytes (limit ${EXPORT_MAX_BYTES}). Export fewer flows, or from the desktop app.`, { bytes });
|
|
409
|
+
return ok({
|
|
410
|
+
flows: envelope.flows.map((entry) => ({ name: entry.name, platform: entry.platform, ...(entry.isSubFlow ? { bundledSubFlow: true } : {}) })),
|
|
411
|
+
connections: (envelope.connections ?? []).map((connection) => ({ refId: connection.refId, name: connection.name, type: connection.type })),
|
|
412
|
+
bytes,
|
|
413
|
+
...(masked.length > 0
|
|
414
|
+
? { maskedDatasetValues: masked, note: "Secret dataset values are masked in this envelope — importing it is refused until they are replaced with real values (or export with reveal: true, which needs environments:reveal)." }
|
|
415
|
+
: includeDataset
|
|
416
|
+
? { note: "Dataset values are included as stored — treat the envelope as sensitive." }
|
|
417
|
+
: {}),
|
|
418
|
+
envelope: envelope,
|
|
419
|
+
});
|
|
420
|
+
}));
|
|
421
|
+
server.registerTool("import_ui_tests", {
|
|
422
|
+
title: "Import UI tests",
|
|
423
|
+
description: "Import a `callman.uitest` envelope (the JSON of a .callman.uitest file, as text or object) into a workspace. Connections it references are matched to the workspace's connections of the same type and name automatically; `connections` overrides per export connection (workspace connection id or name, or \"skip\"). dryRun: true shows the flows, name clashes and the connection plan without importing. On-prem, `group` picks the owning group.",
|
|
424
|
+
inputSchema: {
|
|
425
|
+
workspace: workspaceArg,
|
|
426
|
+
envelope: z.union([z.string().max(ENVELOPE_MAX), z.record(z.unknown())]).describe("The envelope (JSON text or object)"),
|
|
427
|
+
group: z.string().max(200).optional().describe('On-prem group (name or id, or "personal")'),
|
|
428
|
+
connections: z
|
|
429
|
+
.array(strictObject({
|
|
430
|
+
from: z.string().min(1).max(300).describe("The envelope's connection (refId or name)"),
|
|
431
|
+
to: z.string().min(1).max(200).describe('Workspace connection id or name, or "skip"'),
|
|
432
|
+
}, "connection mapping field"))
|
|
433
|
+
.max(200)
|
|
434
|
+
.optional(),
|
|
435
|
+
dryRun: dryRunArg,
|
|
436
|
+
},
|
|
437
|
+
annotations: WRITE,
|
|
438
|
+
}, guarded(async ({ workspace, envelope, group, connections: mapping, dryRun }) => {
|
|
439
|
+
const ws = await ctx.resolveWorkspace(workspace);
|
|
440
|
+
let parsed = envelope;
|
|
441
|
+
if (typeof envelope === "string") {
|
|
442
|
+
try {
|
|
443
|
+
parsed = JSON.parse(envelope);
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
throw new ToolInputError("IMPORT_INVALID_JSON", "The envelope is not valid JSON.");
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const record = parsed;
|
|
450
|
+
if (record?.kind !== "callman.uitest") {
|
|
451
|
+
throw new ToolInputError("IMPORT_NOT_UI_TESTS", `This is not a UI-test export (expected kind: "callman.uitest"${record?.kind ? `, got "${String(record.kind)}"` : ""}).${record?.kind === "callman.scenario" ? " Use import_scenario." : ""}`);
|
|
452
|
+
}
|
|
453
|
+
if (!Array.isArray(record.flows) || record.flows.length === 0)
|
|
454
|
+
throw new ToolInputError("IMPORT_EMPTY", "The envelope has no flows.");
|
|
455
|
+
const masked = record.flows.flatMap((entry) => maskedDatasetKeys(entry.dataset).map((key) => `${entry.name}: ${key}`));
|
|
456
|
+
if (masked.length > 0) {
|
|
457
|
+
throw new ToolInputError("MASKED_VALUE", `The envelope carries masked dataset values (${masked.join(", ")}) — replace them with the real values, or export again with reveal: true (needs environments:reveal).`, { keys: masked });
|
|
458
|
+
}
|
|
459
|
+
const exported = (record.connections ?? []).filter((connection) => connection.refId);
|
|
460
|
+
for (const entry of mapping ?? []) {
|
|
461
|
+
if (!exported.some((connection) => connection.refId === entry.from || connection.name === entry.from)) {
|
|
462
|
+
throw new ToolInputError("IMPORT_CONNECTION_UNKNOWN", `The envelope has no connection "${entry.from}".`, { exportConnections: exported.map((connection) => ({ refId: connection.refId, name: connection.name, type: connection.type })) });
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const available = exported.length > 0 ? await loadConnections(ctx, ws.id) : [];
|
|
466
|
+
const decisions = [];
|
|
467
|
+
const connectionMap = {};
|
|
468
|
+
for (const connection of exported) {
|
|
469
|
+
const override = (mapping ?? []).find((entry) => entry.from === connection.refId || entry.from === connection.name);
|
|
470
|
+
let target;
|
|
471
|
+
if (override && override.to.trim().toLowerCase() !== "skip") {
|
|
472
|
+
target = available.find((candidate) => candidate.id === override.to) ?? available.find((candidate) => candidate.name.toLowerCase() === override.to.toLowerCase());
|
|
473
|
+
if (!target)
|
|
474
|
+
throw new ToolInputError("CONNECTION_NOT_FOUND", `No workspace connection "${override.to}" (list_connections shows them).`);
|
|
475
|
+
if (connection.type && target.type !== connection.type)
|
|
476
|
+
throw new ToolInputError("CONNECTION_WRONG_TYPE", `"${target.name}" is a ${target.type} connection; the envelope's "${connection.name}" is ${connection.type}.`);
|
|
477
|
+
}
|
|
478
|
+
else if (!override) {
|
|
479
|
+
const sameName = available.filter((candidate) => candidate.type === connection.type && candidate.name.toLowerCase() === (connection.name ?? "").toLowerCase());
|
|
480
|
+
target = sameName.length === 1 ? sameName[0] : undefined;
|
|
481
|
+
}
|
|
482
|
+
connectionMap[connection.refId] = target ? { action: "map", connectionId: target.id } : { action: "skip" };
|
|
483
|
+
decisions.push({ export: connection.name ?? connection.refId, type: connection.type ?? null, mappedTo: target ? target.name : null });
|
|
484
|
+
}
|
|
485
|
+
const existingNames = new Set((await loadUiTests(ctx)).filter((flow) => flow.workspaceId === ws.id).map((flow) => flow.name.toLowerCase()));
|
|
486
|
+
const clashes = record.flows.filter((flow) => existingNames.has(String(flow.name).toLowerCase())).map((flow) => flow.name);
|
|
487
|
+
const targetGroup = await resolveGroupId(ctx, ws.id, group);
|
|
488
|
+
if (dryRun) {
|
|
489
|
+
return ok({
|
|
490
|
+
dryRun: true,
|
|
491
|
+
workspace: workspaceTag(ws),
|
|
492
|
+
flows: record.flows.map((flow) => ({ name: flow.name, platform: flow.platform, ...(flow.isSubFlow ? { bundledSubFlow: true } : {}) })),
|
|
493
|
+
connections: decisions,
|
|
494
|
+
...(clashes.length > 0 ? { nameClashes: clashes, note: "Flows with these names already exist in the workspace — the server resolves clashes (see its warnings after the import)." } : {}),
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
const result = await ctx.api.importUiTests(ws.id, { envelope: parsed, connectionMap, ...(targetGroup.id ? { groupId: targetGroup.id } : {}) });
|
|
498
|
+
ctx.invalidate("uitests:");
|
|
499
|
+
const skipped = decisions.filter((decision) => !decision.mappedTo);
|
|
500
|
+
return ok({
|
|
501
|
+
workspace: workspaceTag(ws),
|
|
502
|
+
imported: result.flows.map((flow) => ({ id: flow.clientId, name: flow.name, platform: flow.platform })),
|
|
503
|
+
connections: decisions,
|
|
504
|
+
warnings: [...(result.warnings ?? []), ...(targetGroup.note ? [targetGroup.note] : [])],
|
|
505
|
+
...(skipped.length > 0 ? { note: `Not connected: ${skipped.map((decision) => decision.export).join(", ")} — data steps using them need a workspace connection (validate_ui_test shows which; fix with patch_ui_test_steps).` } : {}),
|
|
506
|
+
});
|
|
507
|
+
}));
|
|
508
|
+
};
|
|
509
|
+
//# sourceMappingURL=uiTestAdmin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiTestAdmin.js","sourceRoot":"","sources":["../../src/tools/uiTestAdmin.ts"],"names":[],"mappings":"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"}
|