callman-mcp 0.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/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/client/api.d.ts +109 -0
- package/dist/client/api.d.ts.map +1 -0
- package/dist/client/api.js +180 -0
- package/dist/client/api.js.map +1 -0
- package/dist/client/errors.d.ts +27 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +98 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/http.d.ts +34 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +121 -0
- package/dist/client/http.js.map +1 -0
- package/dist/client/types.d.ts +327 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +5 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +69 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +35 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +91 -0
- package/dist/context.js.map +1 -0
- package/dist/domain/diagram/build.d.ts +260 -0
- package/dist/domain/diagram/build.d.ts.map +1 -0
- package/dist/domain/diagram/build.js +160 -0
- package/dist/domain/diagram/build.js.map +1 -0
- package/dist/domain/diagram/layout.d.ts +17 -0
- package/dist/domain/diagram/layout.d.ts.map +1 -0
- package/dist/domain/diagram/layout.js +61 -0
- package/dist/domain/diagram/layout.js.map +1 -0
- package/dist/domain/diagram/patch.d.ts +330 -0
- package/dist/domain/diagram/patch.d.ts.map +1 -0
- package/dist/domain/diagram/patch.js +176 -0
- package/dist/domain/diagram/patch.js.map +1 -0
- package/dist/domain/diagram/summarize.d.ts +41 -0
- package/dist/domain/diagram/summarize.d.ts.map +1 -0
- package/dist/domain/diagram/summarize.js +47 -0
- package/dist/domain/diagram/summarize.js.map +1 -0
- package/dist/domain/importDetect.d.ts +6 -0
- package/dist/domain/importDetect.d.ts.map +1 -0
- package/dist/domain/importDetect.js +32 -0
- package/dist/domain/importDetect.js.map +1 -0
- package/dist/domain/requestShape.d.ts +796 -0
- package/dist/domain/requestShape.d.ts.map +1 -0
- package/dist/domain/requestShape.js +250 -0
- package/dist/domain/requestShape.js.map +1 -0
- package/dist/domain/resolve.d.ts +30 -0
- package/dist/domain/resolve.d.ts.map +1 -0
- package/dist/domain/resolve.js +56 -0
- package/dist/domain/resolve.js.map +1 -0
- package/dist/domain/scenario/build.d.ts +270 -0
- package/dist/domain/scenario/build.d.ts.map +1 -0
- package/dist/domain/scenario/build.js +135 -0
- package/dist/domain/scenario/build.js.map +1 -0
- package/dist/domain/scenario/summarize.d.ts +206 -0
- package/dist/domain/scenario/summarize.d.ts.map +1 -0
- package/dist/domain/scenario/summarize.js +138 -0
- package/dist/domain/scenario/summarize.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +142 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache.d.ts +12 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +40 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/ids.d.ts +5 -0
- package/dist/lib/ids.d.ts.map +1 -0
- package/dist/lib/ids.js +19 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/lib/log.d.ts +10 -0
- package/dist/lib/log.d.ts.map +1 -0
- package/dist/lib/log.js +25 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/mask.d.ts +24 -0
- package/dist/lib/mask.d.ts.map +1 -0
- package/dist/lib/mask.js +63 -0
- package/dist/lib/mask.js.map +1 -0
- package/dist/lib/pagination.d.ts +21 -0
- package/dist/lib/pagination.d.ts.map +1 -0
- package/dist/lib/pagination.js +40 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/truncate.d.ts +25 -0
- package/dist/lib/truncate.d.ts.map +1 -0
- package/dist/lib/truncate.js +45 -0
- package/dist/lib/truncate.js.map +1 -0
- package/dist/main.d.ts +9 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +12 -0
- package/dist/main.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +72 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/docs/diagramSchema.d.ts +2 -0
- package/dist/resources/docs/diagramSchema.d.ts.map +1 -0
- package/dist/resources/docs/diagramSchema.js +65 -0
- package/dist/resources/docs/diagramSchema.js.map +1 -0
- package/dist/resources/docs/overview.d.ts +2 -0
- package/dist/resources/docs/overview.d.ts.map +1 -0
- package/dist/resources/docs/overview.js +46 -0
- package/dist/resources/docs/overview.js.map +1 -0
- package/dist/resources/docs/requestSchema.d.ts +2 -0
- package/dist/resources/docs/requestSchema.d.ts.map +1 -0
- package/dist/resources/docs/requestSchema.js +70 -0
- package/dist/resources/docs/requestSchema.js.map +1 -0
- package/dist/resources/generated/aiPacks.d.ts +3 -0
- package/dist/resources/generated/aiPacks.d.ts.map +1 -0
- package/dist/resources/generated/aiPacks.js +11 -0
- package/dist/resources/generated/aiPacks.js.map +1 -0
- package/dist/resources/index.d.ts +4 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +114 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/run/executeCollection.d.ts +19 -0
- package/dist/run/executeCollection.d.ts.map +1 -0
- package/dist/run/executeCollection.js +89 -0
- package/dist/run/executeCollection.js.map +1 -0
- package/dist/run/loadBundle.d.ts +9 -0
- package/dist/run/loadBundle.d.ts.map +1 -0
- package/dist/run/loadBundle.js +242 -0
- package/dist/run/loadBundle.js.map +1 -0
- package/dist/run/resolveTemplate.d.ts +2 -0
- package/dist/run/resolveTemplate.d.ts.map +1 -0
- package/dist/run/resolveTemplate.js +12 -0
- package/dist/run/resolveTemplate.js.map +1 -0
- package/dist/run/summarize.d.ts +73 -0
- package/dist/run/summarize.d.ts.map +1 -0
- package/dist/run/summarize.js +69 -0
- package/dist/run/summarize.js.map +1 -0
- package/dist/run/types.d.ts +46 -0
- package/dist/run/types.d.ts.map +1 -0
- package/dist/run/types.js +2 -0
- package/dist/run/types.js.map +1 -0
- package/dist/server.d.ts +23 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +25 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/catalog.d.ts +18 -0
- package/dist/tools/catalog.d.ts.map +1 -0
- package/dist/tools/catalog.js +66 -0
- package/dist/tools/catalog.js.map +1 -0
- package/dist/tools/collections.d.ts +4 -0
- package/dist/tools/collections.d.ts.map +1 -0
- package/dist/tools/collections.js +201 -0
- package/dist/tools/collections.js.map +1 -0
- package/dist/tools/diagrams.d.ts +4 -0
- package/dist/tools/diagrams.d.ts.map +1 -0
- package/dist/tools/diagrams.js +226 -0
- package/dist/tools/diagrams.js.map +1 -0
- package/dist/tools/environments.d.ts +4 -0
- package/dist/tools/environments.d.ts.map +1 -0
- package/dist/tools/environments.js +150 -0
- package/dist/tools/environments.js.map +1 -0
- package/dist/tools/import.d.ts +6 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +144 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +26 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lookups.d.ts +33 -0
- package/dist/tools/lookups.d.ts.map +1 -0
- package/dist/tools/lookups.js +132 -0
- package/dist/tools/lookups.js.map +1 -0
- package/dist/tools/meta.d.ts +4 -0
- package/dist/tools/meta.d.ts.map +1 -0
- package/dist/tools/meta.js +78 -0
- package/dist/tools/meta.js.map +1 -0
- package/dist/tools/requests.d.ts +4 -0
- package/dist/tools/requests.d.ts.map +1 -0
- package/dist/tools/requests.js +247 -0
- package/dist/tools/requests.js.map +1 -0
- package/dist/tools/run.d.ts +4 -0
- package/dist/tools/run.d.ts.map +1 -0
- package/dist/tools/run.js +167 -0
- package/dist/tools/run.js.map +1 -0
- package/dist/tools/scenarios.d.ts +4 -0
- package/dist/tools/scenarios.d.ts.map +1 -0
- package/dist/tools/scenarios.js +242 -0
- package/dist/tools/scenarios.js.map +1 -0
- package/dist/tools/shared.d.ts +20 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +74 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/workspaces.d.ts +4 -0
- package/dist/tools/workspaces.d.ts.map +1 -0
- package/dist/tools/workspaces.js +80 -0
- package/dist/tools/workspaces.js.map +1 -0
- package/dist-cjs/client/api.js +183 -0
- package/dist-cjs/client/errors.js +104 -0
- package/dist-cjs/client/http.js +124 -0
- package/dist-cjs/client/types.js +5 -0
- package/dist-cjs/config.js +73 -0
- package/dist-cjs/context.js +94 -0
- package/dist-cjs/domain/diagram/build.js +164 -0
- package/dist-cjs/domain/diagram/layout.js +98 -0
- package/dist-cjs/domain/diagram/patch.js +179 -0
- package/dist-cjs/domain/diagram/summarize.js +52 -0
- package/dist-cjs/domain/importDetect.js +40 -0
- package/dist-cjs/domain/requestShape.js +260 -0
- package/dist-cjs/domain/resolve.js +63 -0
- package/dist-cjs/domain/scenario/build.js +140 -0
- package/dist-cjs/domain/scenario/summarize.js +144 -0
- package/dist-cjs/lib/cache.js +43 -0
- package/dist-cjs/lib/ids.js +24 -0
- package/dist-cjs/lib/log.js +28 -0
- package/dist-cjs/lib/mask.js +72 -0
- package/dist-cjs/lib/pagination.js +48 -0
- package/dist-cjs/lib/truncate.js +52 -0
- package/dist-cjs/main.js +31 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/prompts/index.js +75 -0
- package/dist-cjs/resources/docs/diagramSchema.js +67 -0
- package/dist-cjs/resources/docs/overview.js +48 -0
- package/dist-cjs/resources/docs/requestSchema.js +72 -0
- package/dist-cjs/resources/generated/aiPacks.js +13 -0
- package/dist-cjs/resources/index.js +117 -0
- package/dist-cjs/run/executeCollection.js +93 -0
- package/dist-cjs/run/loadBundle.js +246 -0
- package/dist-cjs/run/resolveTemplate.js +15 -0
- package/dist-cjs/run/summarize.js +73 -0
- package/dist-cjs/run/types.js +2 -0
- package/dist-cjs/server.js +28 -0
- package/dist-cjs/tools/catalog.js +69 -0
- package/dist-cjs/tools/collections.js +204 -0
- package/dist-cjs/tools/diagrams.js +229 -0
- package/dist-cjs/tools/environments.js +153 -0
- package/dist-cjs/tools/import.js +147 -0
- package/dist-cjs/tools/index.js +31 -0
- package/dist-cjs/tools/lookups.js +149 -0
- package/dist-cjs/tools/meta.js +81 -0
- package/dist-cjs/tools/requests.js +250 -0
- package/dist-cjs/tools/run.js +203 -0
- package/dist-cjs/tools/scenarios.js +245 -0
- package/dist-cjs/tools/shared.js +81 -0
- package/dist-cjs/tools/workspaces.js +83 -0
- package/package.json +80 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CallmanApiError, ToolInputError } from "../client/errors.js";
|
|
3
|
+
import { resolvedSummary } from "../domain/resolve.js";
|
|
4
|
+
import { buildScenarioCreateBody, buildScenarioGraph, scenarioEdgeInputSchema, scenarioEnvironmentInputSchema, scenarioInputSchema, scenarioNodeInputSchema } from "../domain/scenario/build.js";
|
|
5
|
+
import { compactReportView, scenarioFullView, scenarioGraphView, scenarioSummaryView } from "../domain/scenario/summarize.js";
|
|
6
|
+
import { sequentialIds } from "../lib/ids.js";
|
|
7
|
+
import { sliceWithCursor } from "../lib/pagination.js";
|
|
8
|
+
import { loadScenarioCatalog, resolveScenario, resolveScenarioFolder } from "./lookups.js";
|
|
9
|
+
import { confirmArg, cursorArgs, DESTRUCTIVE, dryRunArg, guarded, IDEMPOTENT_WRITE, ok, READ, refArg, requireConfirm, RUN, workspaceArg, WRITE } from "./shared.js";
|
|
10
|
+
const TERMINAL_STATUSES = new Set(["success", "failed", "completed_with_failures", "stopped"]);
|
|
11
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
12
|
+
export const registerScenarioTools = (server, ctx) => {
|
|
13
|
+
server.registerTool("list_scenarios", {
|
|
14
|
+
title: "List scenarios",
|
|
15
|
+
description: "List API test scenarios (multi-step flows) with their folder, review status and version. `query` filters by name. Scenarios are scoped by edition (on-prem: your groups), not strictly by workspace.",
|
|
16
|
+
inputSchema: { workspace: workspaceArg, query: z.string().max(200).optional(), folder: z.string().max(200).optional(), ...cursorArgs },
|
|
17
|
+
annotations: READ,
|
|
18
|
+
}, guarded(async ({ workspace, query, folder, cursor, limit }) => {
|
|
19
|
+
const ws = await ctx.resolveWorkspaceOrNull(workspace);
|
|
20
|
+
const { scenarios, folders } = await loadScenarioCatalog(ctx, ws?.id ?? null);
|
|
21
|
+
const folderName = new Map(folders.map((entry) => [entry.id, entry.name]));
|
|
22
|
+
const scope = folder ? await resolveScenarioFolder(ctx, ws?.id ?? null, folder) : null;
|
|
23
|
+
const needle = query?.trim().toLowerCase();
|
|
24
|
+
const filtered = scenarios
|
|
25
|
+
.filter((scenario) => !scope || scenario.folderId === scope.item.id)
|
|
26
|
+
.filter((scenario) => !needle || scenario.name.toLowerCase().includes(needle));
|
|
27
|
+
const page = sliceWithCursor(filtered, cursor, limit);
|
|
28
|
+
return ok({
|
|
29
|
+
...(ws ? { workspace: { id: ws.id, name: ws.name } } : {}),
|
|
30
|
+
folders: folders.map((entry) => ({ id: entry.id, name: entry.name })),
|
|
31
|
+
scenarios: page.items.map((scenario) => scenarioSummaryView(scenario, scenario.folderId ? (folderName.get(scenario.folderId) ?? null) : null)),
|
|
32
|
+
total: page.total,
|
|
33
|
+
nextCursor: page.nextCursor,
|
|
34
|
+
});
|
|
35
|
+
}));
|
|
36
|
+
server.registerTool("get_scenario", {
|
|
37
|
+
title: "Get a scenario",
|
|
38
|
+
description: "Read a scenario: `summary` (metadata), `graph` (nodes with type/label and the edges — enough to understand the flow) or `full` (node configs, secrets masked, clipped at 2 KB per node). Use `graph` before editing with update_scenario.",
|
|
39
|
+
inputSchema: {
|
|
40
|
+
workspace: workspaceArg,
|
|
41
|
+
scenario: refArg("Scenario"),
|
|
42
|
+
view: z.enum(["summary", "graph", "full"]).default("graph"),
|
|
43
|
+
reveal: z.boolean().optional().describe("full view: return environment values and auth secrets unmasked (needs environments:reveal)"),
|
|
44
|
+
},
|
|
45
|
+
annotations: READ,
|
|
46
|
+
}, guarded(async ({ workspace, scenario, view, reveal }) => {
|
|
47
|
+
const ws = await ctx.resolveWorkspaceOrNull(workspace);
|
|
48
|
+
const resolved = await resolveScenario(ctx, ws?.id ?? null, scenario);
|
|
49
|
+
const fresh = resolved.matched === "id" && !reveal ? resolved.item : await ctx.api.getScenario(ws?.id ?? null, resolved.item.id, reveal ?? false);
|
|
50
|
+
const body = view === "summary" ? scenarioSummaryView(fresh) : view === "graph" ? scenarioGraphView(fresh) : scenarioFullView(fresh, { reveal });
|
|
51
|
+
return ok({ scenario: body, ...(resolved.annotation ? { resolved: [resolvedSummary(scenario, resolved)] } : {}) });
|
|
52
|
+
}));
|
|
53
|
+
server.registerTool("get_scenario_report", {
|
|
54
|
+
title: "Get a scenario run report",
|
|
55
|
+
description: "The result of a scenario run: status, summary counts and a per-node timeline (status, duration, HTTP status, failed tests) with the first failed node expanded. Defaults to the latest run.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
workspace: workspaceArg,
|
|
58
|
+
scenario: refArg("Scenario"),
|
|
59
|
+
report: z.string().max(64).optional().describe("Report id; omit for the latest run"),
|
|
60
|
+
},
|
|
61
|
+
annotations: READ,
|
|
62
|
+
}, guarded(async ({ workspace, scenario, report }) => {
|
|
63
|
+
const ws = await ctx.resolveWorkspaceOrNull(workspace);
|
|
64
|
+
const resolved = await resolveScenario(ctx, ws?.id ?? null, scenario);
|
|
65
|
+
let reportId = report;
|
|
66
|
+
if (!reportId) {
|
|
67
|
+
const list = await ctx.api.listScenarioReports(ws?.id ?? null, resolved.item.id, 5);
|
|
68
|
+
const latest = list.items[0];
|
|
69
|
+
if (!latest)
|
|
70
|
+
return ok({ scenario: { id: resolved.item.id, name: resolved.item.name }, report: null, note: "This scenario has not been run on the server yet. Use run_scenario." });
|
|
71
|
+
reportId = latest.reportId;
|
|
72
|
+
}
|
|
73
|
+
const detail = await ctx.api.getScenarioReport(ws?.id ?? null, resolved.item.id, reportId);
|
|
74
|
+
return ok({ report: compactReportView(detail), ...(resolved.annotation ? { resolved: [resolvedSummary(scenario, resolved)] } : {}) });
|
|
75
|
+
}));
|
|
76
|
+
server.registerTool("create_scenario", {
|
|
77
|
+
title: "Create a scenario",
|
|
78
|
+
description: "Create a multi-step API test scenario from compact nodes and edges. Node configs are merged over the type's defaults, so partial configs are fine (a request node needs at least method + url). Read callman://docs/scenario-nodes for every node type and config field. Positions are laid out automatically. dryRun: true returns the resolved graph without saving. On-prem: new scenarios start as drafts and need approval before scheduled/CI runs.",
|
|
79
|
+
inputSchema: {
|
|
80
|
+
workspace: workspaceArg,
|
|
81
|
+
folder: z.string().max(200).optional().describe("Scenario folder id or name"),
|
|
82
|
+
...scenarioInputSchema.shape,
|
|
83
|
+
dryRun: dryRunArg,
|
|
84
|
+
},
|
|
85
|
+
annotations: WRITE,
|
|
86
|
+
}, guarded(async ({ workspace, folder, dryRun, ...input }) => {
|
|
87
|
+
const ws = await ctx.resolveWorkspace(workspace);
|
|
88
|
+
const targetFolder = folder ? await resolveScenarioFolder(ctx, ws.id, folder) : null;
|
|
89
|
+
const body = buildScenarioCreateBody(input, targetFolder?.item.id ?? null);
|
|
90
|
+
if (dryRun) {
|
|
91
|
+
const nodes = body.nodes;
|
|
92
|
+
return ok({ dryRun: true, scenario: { name: body.name, nodeCount: nodes.length, edgeCount: body.edges.length, nodes: nodes.map((node) => ({ id: node.id, type: node.type, label: node.data.label ?? null })), edges: body.edges } });
|
|
93
|
+
}
|
|
94
|
+
const created = await ctx.api.createScenario(ws.id, body);
|
|
95
|
+
ctx.invalidate("scenarios:");
|
|
96
|
+
return ok({
|
|
97
|
+
scenario: scenarioGraphView(created),
|
|
98
|
+
...(created.graph?.warnings?.length ? { warnings: created.graph.warnings } : {}),
|
|
99
|
+
note: created.reviewStatus === "draft" ? "Created as a draft. Run it with run_scenario; on-prem, submit it for approval in the desktop app before scheduling." : "Created.",
|
|
100
|
+
...(targetFolder ? { resolved: [resolvedSummary(folder, targetFolder)] } : {}),
|
|
101
|
+
});
|
|
102
|
+
}));
|
|
103
|
+
server.registerTool("update_scenario", {
|
|
104
|
+
title: "Update a scenario",
|
|
105
|
+
description: "Update a scenario's name/description/priority/folder and/or replace its graph (send nodes AND edges together; node configs merge over defaults like create_scenario). Version-checked: pass the `version` you read (expectedVersion) or it is fetched first; a 409 conflict comes back structured — re-read and retry. On-prem: editing an approved scenario returns it to draft.",
|
|
106
|
+
inputSchema: {
|
|
107
|
+
workspace: workspaceArg,
|
|
108
|
+
scenario: refArg("Scenario"),
|
|
109
|
+
expectedVersion: z.number().int().nonnegative().optional(),
|
|
110
|
+
force: z.boolean().optional().describe("Overwrite even if someone changed it since expectedVersion"),
|
|
111
|
+
name: z.string().min(1).max(200).optional(),
|
|
112
|
+
description: z.string().max(5000).optional(),
|
|
113
|
+
priority: z.enum(["critical", "high", "medium", "low"]).optional(),
|
|
114
|
+
folder: z.string().max(200).nullable().optional().describe("Scenario folder id or name; null = no folder"),
|
|
115
|
+
nodes: z.array(scenarioNodeInputSchema).min(1).max(1000).optional(),
|
|
116
|
+
edges: z.array(scenarioEdgeInputSchema).max(2000).optional(),
|
|
117
|
+
environments: z.array(scenarioEnvironmentInputSchema).max(20).optional(),
|
|
118
|
+
},
|
|
119
|
+
annotations: IDEMPOTENT_WRITE,
|
|
120
|
+
}, guarded(async ({ workspace, scenario, expectedVersion, force, name, description, priority, folder, nodes, edges, environments }) => {
|
|
121
|
+
if ((nodes === undefined) !== (edges === undefined)) {
|
|
122
|
+
throw new ToolInputError("GRAPH_INCOMPLETE", "Send nodes and edges together when replacing the graph.");
|
|
123
|
+
}
|
|
124
|
+
const ws = await ctx.resolveWorkspaceOrNull(workspace);
|
|
125
|
+
const resolved = await resolveScenario(ctx, ws?.id ?? null, scenario);
|
|
126
|
+
const current = resolved.item;
|
|
127
|
+
const targetFolder = folder ? await resolveScenarioFolder(ctx, ws?.id ?? null, folder) : null;
|
|
128
|
+
const body = {
|
|
129
|
+
...(name !== undefined ? { name: name.trim() } : {}),
|
|
130
|
+
...(description !== undefined ? { description } : {}),
|
|
131
|
+
...(priority !== undefined ? { priority } : {}),
|
|
132
|
+
...(folder !== undefined ? { folderId: targetFolder?.item.id ?? null } : {}),
|
|
133
|
+
expectedVersion: expectedVersion ?? current.version,
|
|
134
|
+
...(force ? { force: true } : {}),
|
|
135
|
+
};
|
|
136
|
+
if (nodes && edges) {
|
|
137
|
+
const graph = buildScenarioGraph(nodes, edges);
|
|
138
|
+
body.nodes = graph.nodes;
|
|
139
|
+
body.edges = graph.edges;
|
|
140
|
+
}
|
|
141
|
+
if (environments) {
|
|
142
|
+
const nextEnvId = sequentialIds("env", current.environments.map((environment) => environment.id));
|
|
143
|
+
body.environments = environments.map((environment) => {
|
|
144
|
+
const nextVarId = sequentialIds("v");
|
|
145
|
+
return {
|
|
146
|
+
id: environment.id ?? nextEnvId(),
|
|
147
|
+
name: environment.name,
|
|
148
|
+
variables: environment.variables.filter((variable) => variable.key.trim()).map((variable) => ({ id: nextVarId(), key: variable.key.trim(), value: variable.value ?? "", enabled: variable.enabled ?? true })),
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (Object.keys(body).filter((key) => key !== "expectedVersion" && key !== "force").length === 0) {
|
|
153
|
+
throw new ToolInputError("NOTHING_TO_UPDATE", "Pass at least one field to change.");
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const updated = await ctx.api.patchScenario(ws?.id ?? null, current.id, body);
|
|
157
|
+
ctx.invalidate("scenarios:");
|
|
158
|
+
return ok({
|
|
159
|
+
scenario: scenarioGraphView(updated),
|
|
160
|
+
previousVersion: current.version,
|
|
161
|
+
...(current.reviewStatus === "approved" && updated.reviewStatus !== "approved" ? { note: "The scenario was approved and is now a draft again; schedules keep using the last approved version until it is re-approved." } : {}),
|
|
162
|
+
...(resolved.annotation ? { resolved: [resolvedSummary(scenario, resolved)] } : {}),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error instanceof CallmanApiError && error.code === "SCENARIO_VERSION_CONFLICT") {
|
|
167
|
+
const details = (error.details ?? {});
|
|
168
|
+
return ok({
|
|
169
|
+
conflict: true,
|
|
170
|
+
code: error.code,
|
|
171
|
+
message: error.message,
|
|
172
|
+
currentVersion: details.currentScenario?.version ?? null,
|
|
173
|
+
hint: "Re-read the scenario (get_scenario view:graph), reapply your change and call update_scenario with expectedVersion set to currentVersion — or force: true to overwrite.",
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
}));
|
|
179
|
+
server.registerTool("delete_scenario", {
|
|
180
|
+
title: "Delete a scenario",
|
|
181
|
+
description: "Delete a scenario and its run history. Permanent — confirm with the user first.",
|
|
182
|
+
inputSchema: { workspace: workspaceArg, scenario: refArg("Scenario"), confirm: confirmArg },
|
|
183
|
+
annotations: DESTRUCTIVE,
|
|
184
|
+
}, guarded(async ({ workspace, scenario, confirm }) => {
|
|
185
|
+
requireConfirm(confirm, "a scenario");
|
|
186
|
+
const ws = await ctx.resolveWorkspaceOrNull(workspace);
|
|
187
|
+
const resolved = await resolveScenario(ctx, ws?.id ?? null, scenario);
|
|
188
|
+
await ctx.api.deleteScenario(ws?.id ?? null, resolved.item.id);
|
|
189
|
+
ctx.invalidate("scenarios:");
|
|
190
|
+
return ok({ deleted: { id: resolved.item.id, name: resolved.item.name }, resolved: [resolvedSummary(scenario, resolved)] });
|
|
191
|
+
}));
|
|
192
|
+
server.registerTool("run_scenario", {
|
|
193
|
+
title: "Run a scenario on the server",
|
|
194
|
+
description: "Start a server-side run of a scenario (with one of its inline environments, by name or id) and wait for the result (default up to 5 minutes, max 30). Returns the compact report; if it times out you get the reportId to check later with get_scenario_report.",
|
|
195
|
+
inputSchema: {
|
|
196
|
+
workspace: workspaceArg,
|
|
197
|
+
scenario: refArg("Scenario"),
|
|
198
|
+
environment: z.string().max(200).optional().describe("One of the scenario's own environments (name or id)"),
|
|
199
|
+
wait: z.boolean().default(true),
|
|
200
|
+
timeoutSec: z.number().int().min(5).max(1800).default(300),
|
|
201
|
+
},
|
|
202
|
+
annotations: RUN,
|
|
203
|
+
}, guarded(async ({ workspace, scenario, environment, wait, timeoutSec }) => {
|
|
204
|
+
const ws = await ctx.resolveWorkspaceOrNull(workspace);
|
|
205
|
+
const resolved = await resolveScenario(ctx, ws?.id ?? null, scenario);
|
|
206
|
+
let environmentId;
|
|
207
|
+
if (environment) {
|
|
208
|
+
const environments = resolved.item.environments ?? [];
|
|
209
|
+
const match = environments.find((entry) => entry.id === environment) ?? environments.filter((entry) => entry.name.trim().toLowerCase() === environment.trim().toLowerCase());
|
|
210
|
+
const picked = Array.isArray(match) ? (match.length === 1 ? match[0] : null) : match;
|
|
211
|
+
if (!picked) {
|
|
212
|
+
throw new ToolInputError("SCENARIO_ENV_NOT_FOUND", `The scenario has no environment "${environment}".`, { candidates: environments.map((entry) => ({ id: entry.id, name: entry.name })) });
|
|
213
|
+
}
|
|
214
|
+
environmentId = picked.id;
|
|
215
|
+
}
|
|
216
|
+
const trigger = await ctx.api.runScenario(ws?.id ?? null, resolved.item.id, environmentId ? { environmentId } : {});
|
|
217
|
+
if (!wait)
|
|
218
|
+
return ok({ scenario: { id: resolved.item.id, name: resolved.item.name }, reportId: trigger.reportId, status: trigger.status, note: "Check with get_scenario_report." });
|
|
219
|
+
const deadline = Date.now() + timeoutSec * 1000;
|
|
220
|
+
let polls = 0;
|
|
221
|
+
let last = null;
|
|
222
|
+
while (Date.now() < deadline) {
|
|
223
|
+
await sleep(polls < 5 ? ctx.pollDelaysMs.fast : ctx.pollDelaysMs.slow);
|
|
224
|
+
polls += 1;
|
|
225
|
+
try {
|
|
226
|
+
last = await ctx.api.getScenarioReport(ws?.id ?? null, resolved.item.id, trigger.reportId);
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
if (error instanceof CallmanApiError && error.status === 404)
|
|
230
|
+
continue; // placeholder not yet visible
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
if (TERMINAL_STATUSES.has(last.status))
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
if (!last || !TERMINAL_STATUSES.has(last.status)) {
|
|
237
|
+
return ok({ scenario: { id: resolved.item.id, name: resolved.item.name }, reportId: trigger.reportId, status: last?.status ?? "running", timedOut: true, note: `Still running after ${timeoutSec}s — call get_scenario_report with this reportId later.` });
|
|
238
|
+
}
|
|
239
|
+
return ok({ report: compactReportView(last), ...(resolved.annotation ? { resolved: [resolvedSummary(scenario, resolved)] } : {}) });
|
|
240
|
+
}));
|
|
241
|
+
};
|
|
242
|
+
//# sourceMappingURL=scenarios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../src/tools/scenarios.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CallToolResult, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare const ok: (structured: Record<string, unknown>, text?: string) => CallToolResult;
|
|
4
|
+
export declare const toolFailure: (error: unknown) => CallToolResult;
|
|
5
|
+
export declare const guarded: <A>(fn: (args: A) => Promise<CallToolResult>) => (args: A) => Promise<CallToolResult>;
|
|
6
|
+
export declare const READ: ToolAnnotations;
|
|
7
|
+
export declare const WRITE: ToolAnnotations;
|
|
8
|
+
export declare const IDEMPOTENT_WRITE: ToolAnnotations;
|
|
9
|
+
export declare const DESTRUCTIVE: ToolAnnotations;
|
|
10
|
+
export declare const RUN: ToolAnnotations;
|
|
11
|
+
export declare const workspaceArg: z.ZodOptional<z.ZodString>;
|
|
12
|
+
export declare const refArg: (what: string, extra?: string) => z.ZodString;
|
|
13
|
+
export declare const cursorArgs: {
|
|
14
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
15
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
};
|
|
17
|
+
export declare const confirmArg: z.ZodLiteral<true>;
|
|
18
|
+
export declare const dryRunArg: z.ZodOptional<z.ZodBoolean>;
|
|
19
|
+
export declare const requireConfirm: (confirm: unknown, what: string) => void;
|
|
20
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,eAAO,MAAM,EAAE,GAAI,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,KAAG,cAGtE,CAAC;AAEH,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,cAoB5C,CAAC;AAEF,eAAO,MAAM,OAAO,GACjB,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,MACrC,MAAM,CAAC,KAAG,OAAO,CAAC,cAAc,CAMtC,CAAC;AAIJ,eAAO,MAAM,IAAI,EAAE,eAA4G,CAAC;AAChI,eAAO,MAAM,KAAK,EAAE,eAA8G,CAAC;AACnI,eAAO,MAAM,gBAAgB,EAAE,eAA6G,CAAC;AAC7I,eAAO,MAAM,WAAW,EAAE,eAA4G,CAAC;AACvI,eAAO,MAAM,GAAG,EAAE,eAA6G,CAAC;AAIhI,eAAO,MAAM,YAAY,4BAI+G,CAAC;AAEzI,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,cAAU,gBACuC,CAAC;AAEvF,eAAO,MAAM,UAAU;;;CAGtB,CAAC;AAEF,eAAO,MAAM,UAAU,oBAE6G,CAAC;AAErI,eAAO,MAAM,SAAS,6BAA0F,CAAC;AAEjH,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,EAAE,MAAM,MAAM,KAAG,IAI/D,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CallmanApiError, CallmanNetworkError, hintFor, ToolInputError } from "../client/errors.js";
|
|
3
|
+
import { LIMITS, safeStringify } from "../lib/truncate.js";
|
|
4
|
+
// Conventions every tool follows:
|
|
5
|
+
// * `structuredContent` carries the typed result; `content[0].text` is the
|
|
6
|
+
// same JSON (compact) so clients without structured-output support see it.
|
|
7
|
+
// * Errors are never thrown to the client: they come back as
|
|
8
|
+
// `{ isError: true, structuredContent: { error: { code, message, hint, … } } }`
|
|
9
|
+
// with a hint the model can act on (which scope is missing, which
|
|
10
|
+
// candidates exist, what to call next).
|
|
11
|
+
// * Every tool takes an optional `workspace` (name or id) where it matters.
|
|
12
|
+
export const ok = (structured, text) => ({
|
|
13
|
+
content: [{ type: "text", text: text ?? safeStringify(structured) }],
|
|
14
|
+
structuredContent: structured,
|
|
15
|
+
});
|
|
16
|
+
export const toolFailure = (error) => {
|
|
17
|
+
let payload;
|
|
18
|
+
if (error instanceof CallmanApiError) {
|
|
19
|
+
payload = {
|
|
20
|
+
code: error.code,
|
|
21
|
+
status: error.status,
|
|
22
|
+
message: error.message,
|
|
23
|
+
hint: hintFor(error),
|
|
24
|
+
...(error.details !== undefined ? { details: error.details } : {}),
|
|
25
|
+
request: `${error.method} ${error.path}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else if (error instanceof ToolInputError) {
|
|
29
|
+
payload = { code: error.code, message: error.message, ...(error.data ?? {}) };
|
|
30
|
+
}
|
|
31
|
+
else if (error instanceof CallmanNetworkError) {
|
|
32
|
+
payload = { code: "NETWORK_UNREACHABLE", message: error.message, apiUrl: error.apiUrl };
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
payload = { code: "INTERNAL_ERROR", message: error instanceof Error ? error.message : String(error) };
|
|
36
|
+
}
|
|
37
|
+
const structured = { error: payload };
|
|
38
|
+
return { isError: true, content: [{ type: "text", text: safeStringify(structured) }], structuredContent: structured };
|
|
39
|
+
};
|
|
40
|
+
export const guarded = (fn) => async (args) => {
|
|
41
|
+
try {
|
|
42
|
+
return await fn(args);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return toolFailure(error);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
// ── annotations ────────────────────────────────────────────────────────
|
|
49
|
+
export const READ = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
50
|
+
export const WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false };
|
|
51
|
+
export const IDEMPOTENT_WRITE = { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
52
|
+
export const DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false };
|
|
53
|
+
export const RUN = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true };
|
|
54
|
+
// ── shared argument schemas ────────────────────────────────────────────
|
|
55
|
+
export const workspaceArg = z
|
|
56
|
+
.string()
|
|
57
|
+
.max(200)
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Workspace id or name. Defaults to CALLMAN_WORKSPACE_ID, or the only workspace you have; call list_workspaces to see them.");
|
|
60
|
+
export const refArg = (what, extra = "") => z.string().min(1).max(500).describe(`${what} id or name${extra ? ` ${extra}` : ""}`);
|
|
61
|
+
export const cursorArgs = {
|
|
62
|
+
cursor: z.string().max(200).optional().describe("Pass the previous result's nextCursor to get the next page"),
|
|
63
|
+
limit: z.number().int().min(1).max(LIMITS.LIST_MAX).optional().describe(`Page size (default ${LIMITS.LIST_DEFAULT})`),
|
|
64
|
+
};
|
|
65
|
+
export const confirmArg = z
|
|
66
|
+
.literal(true)
|
|
67
|
+
.describe("Must be exactly true. Confirms a permanent deletion — ask the user first unless they already asked for it explicitly.");
|
|
68
|
+
export const dryRunArg = z.boolean().optional().describe("true = validate and preview only; nothing is written");
|
|
69
|
+
export const requireConfirm = (confirm, what) => {
|
|
70
|
+
if (confirm !== true) {
|
|
71
|
+
throw new ToolInputError("CONFIRM_REQUIRED", `Deleting ${what} is permanent. Call again with confirm: true after the user agrees.`);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"workspaces.d.ts","sourceRoot":"","sources":["../../src/tools/workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAKjD,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,EAAE,KAAK,WAAW,KAAG,IA6F5E,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ToolInputError } from "../client/errors.js";
|
|
3
|
+
import { resolveRef } from "../domain/resolve.js";
|
|
4
|
+
import { normalizeName } from "../lib/ids.js";
|
|
5
|
+
import { confirmArg, DESTRUCTIVE, guarded, ok, READ, requireConfirm, workspaceArg, WRITE } from "./shared.js";
|
|
6
|
+
export const registerWorkspaceTools = (server, ctx) => {
|
|
7
|
+
server.registerTool("list_workspaces", {
|
|
8
|
+
title: "List workspaces",
|
|
9
|
+
description: "List the workspaces you belong to, with your role in each (owner / editor / viewer). A token keeps your role: writes are refused where you are a viewer.",
|
|
10
|
+
inputSchema: {},
|
|
11
|
+
annotations: READ,
|
|
12
|
+
}, guarded(async () => {
|
|
13
|
+
const workspaces = await ctx.listWorkspaces();
|
|
14
|
+
return ok({
|
|
15
|
+
workspaces: workspaces.map((workspace) => ({
|
|
16
|
+
id: workspace.id,
|
|
17
|
+
name: workspace.name,
|
|
18
|
+
role: workspace.role,
|
|
19
|
+
memberCount: workspace.memberCount ?? null,
|
|
20
|
+
isDefault: workspace.id === ctx.config.defaultWorkspaceId,
|
|
21
|
+
})),
|
|
22
|
+
});
|
|
23
|
+
}));
|
|
24
|
+
server.registerTool("list_workspace_members", {
|
|
25
|
+
title: "List workspace members",
|
|
26
|
+
description: "List the members of a workspace with their role and status (active / invited).",
|
|
27
|
+
inputSchema: { workspace: workspaceArg },
|
|
28
|
+
annotations: READ,
|
|
29
|
+
}, guarded(async ({ workspace }) => {
|
|
30
|
+
const target = await ctx.resolveWorkspace(workspace);
|
|
31
|
+
const { items } = await ctx.api.listMembers(target.id);
|
|
32
|
+
return ok({
|
|
33
|
+
workspace: { id: target.id, name: target.name },
|
|
34
|
+
members: items.map((member) => ({ id: member.id, userId: member.userId, email: member.email, role: member.role, status: member.status })),
|
|
35
|
+
});
|
|
36
|
+
}));
|
|
37
|
+
server.registerTool("add_workspace_member", {
|
|
38
|
+
title: "Add a workspace member",
|
|
39
|
+
description: "Add a person to a workspace by email with a role (editor can write collections/requests/scenarios; viewer is read-only; owner manages the workspace). Requires the owner role in that workspace. The person must already have a Callman account — the server does not send invitations to unknown emails.",
|
|
40
|
+
inputSchema: {
|
|
41
|
+
workspace: workspaceArg,
|
|
42
|
+
email: z.string().email().max(255),
|
|
43
|
+
role: z.enum(["owner", "editor", "viewer"]).default("editor"),
|
|
44
|
+
},
|
|
45
|
+
annotations: WRITE,
|
|
46
|
+
}, guarded(async ({ workspace, email, role }) => {
|
|
47
|
+
const target = await ctx.resolveWorkspace(workspace);
|
|
48
|
+
const member = await ctx.api.addMember(target.id, { email: email.trim().toLowerCase(), role });
|
|
49
|
+
ctx.invalidate(`members:${target.id}`);
|
|
50
|
+
return ok({
|
|
51
|
+
workspace: { id: target.id, name: target.name },
|
|
52
|
+
member: { id: member.id, email: member.email, role: member.role, status: member.status },
|
|
53
|
+
note: member.status === "invited" ? "Pending — the person gets access when they sign in." : "Added.",
|
|
54
|
+
});
|
|
55
|
+
}));
|
|
56
|
+
server.registerTool("remove_workspace_member", {
|
|
57
|
+
title: "Remove a workspace member",
|
|
58
|
+
description: "Remove a member from a workspace (by email or membership id). Requires the owner role. Permanent — confirm with the user first.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
workspace: workspaceArg,
|
|
61
|
+
member: z.string().min(1).max(255).describe("Member email or membership id"),
|
|
62
|
+
confirm: confirmArg,
|
|
63
|
+
},
|
|
64
|
+
annotations: DESTRUCTIVE,
|
|
65
|
+
}, guarded(async ({ workspace, member, confirm }) => {
|
|
66
|
+
requireConfirm(confirm, "a workspace member");
|
|
67
|
+
const target = await ctx.resolveWorkspace(workspace);
|
|
68
|
+
const { items } = await ctx.api.listMembers(target.id);
|
|
69
|
+
const needle = normalizeName(member);
|
|
70
|
+
const byEmail = items.filter((entry) => normalizeName(entry.email) === needle);
|
|
71
|
+
const resolved = byEmail.length === 1
|
|
72
|
+
? byEmail[0]
|
|
73
|
+
: resolveRef("member", member, items.map((entry) => ({ ...entry, name: entry.email }))).item;
|
|
74
|
+
if (!resolved)
|
|
75
|
+
throw new ToolInputError("REF_NOT_FOUND", `No member matches "${member}".`);
|
|
76
|
+
await ctx.api.removeMember(target.id, resolved.id);
|
|
77
|
+
return ok({ workspace: { id: target.id, name: target.name }, removed: { id: resolved.id, email: resolved.email } });
|
|
78
|
+
}));
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/tools/workspaces.ts"],"names":[],"mappings":"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"}
|