callman-mcp 0.7.1 → 0.9.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +38 -5
  3. package/dist/client/api.d.ts +97 -1
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/api.js +120 -0
  6. package/dist/client/api.js.map +1 -1
  7. package/dist/client/errors.d.ts.map +1 -1
  8. package/dist/client/errors.js +45 -11
  9. package/dist/client/errors.js.map +1 -1
  10. package/dist/client/http.d.ts +2 -1
  11. package/dist/client/http.d.ts.map +1 -1
  12. package/dist/client/http.js +4 -2
  13. package/dist/client/http.js.map +1 -1
  14. package/dist/client/types.d.ts +196 -0
  15. package/dist/client/types.d.ts.map +1 -1
  16. package/dist/client/types.js +0 -3
  17. package/dist/client/types.js.map +1 -1
  18. package/dist/config.d.ts +1 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +2 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/context.d.ts +16 -0
  23. package/dist/context.d.ts.map +1 -1
  24. package/dist/context.js +2 -0
  25. package/dist/context.js.map +1 -1
  26. package/dist/domain/requestShape.d.ts +4 -4
  27. package/dist/index.js +17 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/resources/docs/mocks.d.ts +2 -0
  30. package/dist/resources/docs/mocks.d.ts.map +1 -0
  31. package/dist/resources/docs/mocks.js +445 -0
  32. package/dist/resources/docs/mocks.js.map +1 -0
  33. package/dist/resources/docs/overview.d.ts +1 -1
  34. package/dist/resources/docs/overview.d.ts.map +1 -1
  35. package/dist/resources/docs/overview.js +11 -1
  36. package/dist/resources/docs/overview.js.map +1 -1
  37. package/dist/resources/generated/aiPacks.d.ts +1 -1
  38. package/dist/resources/generated/aiPacks.js +2 -2
  39. package/dist/resources/index.d.ts.map +1 -1
  40. package/dist/resources/index.js +2 -0
  41. package/dist/resources/index.js.map +1 -1
  42. package/dist/server.d.ts +8 -2
  43. package/dist/server.d.ts.map +1 -1
  44. package/dist/server.js +5 -2
  45. package/dist/server.js.map +1 -1
  46. package/dist/tools/catalog.d.ts +1 -1
  47. package/dist/tools/catalog.d.ts.map +1 -1
  48. package/dist/tools/catalog.js +32 -0
  49. package/dist/tools/catalog.js.map +1 -1
  50. package/dist/tools/import.d.ts.map +1 -1
  51. package/dist/tools/import.js +7 -1
  52. package/dist/tools/import.js.map +1 -1
  53. package/dist/tools/index.d.ts.map +1 -1
  54. package/dist/tools/index.js +2 -0
  55. package/dist/tools/index.js.map +1 -1
  56. package/dist/tools/meta.d.ts.map +1 -1
  57. package/dist/tools/meta.js +29 -2
  58. package/dist/tools/meta.js.map +1 -1
  59. package/dist/tools/mockData.d.ts +4 -0
  60. package/dist/tools/mockData.d.ts.map +1 -0
  61. package/dist/tools/mockData.js +384 -0
  62. package/dist/tools/mockData.js.map +1 -0
  63. package/dist/tools/mockEngine.d.ts +129 -0
  64. package/dist/tools/mockEngine.d.ts.map +1 -0
  65. package/dist/tools/mockEngine.js +225 -0
  66. package/dist/tools/mockEngine.js.map +1 -0
  67. package/dist/tools/mockImport.d.ts +5 -0
  68. package/dist/tools/mockImport.d.ts.map +1 -0
  69. package/dist/tools/mockImport.js +298 -0
  70. package/dist/tools/mockImport.js.map +1 -0
  71. package/dist/tools/mockSchemas.d.ts +12272 -0
  72. package/dist/tools/mockSchemas.d.ts.map +1 -0
  73. package/dist/tools/mockSchemas.js +247 -0
  74. package/dist/tools/mockSchemas.js.map +1 -0
  75. package/dist/tools/mockShared.d.ts +6355 -0
  76. package/dist/tools/mockShared.d.ts.map +1 -0
  77. package/dist/tools/mockShared.js +445 -0
  78. package/dist/tools/mockShared.js.map +1 -0
  79. package/dist/tools/mocks.d.ts +4 -0
  80. package/dist/tools/mocks.d.ts.map +1 -0
  81. package/dist/tools/mocks.js +413 -0
  82. package/dist/tools/mocks.js.map +1 -0
  83. package/dist/tools/mocksLocal.d.ts +48 -0
  84. package/dist/tools/mocksLocal.d.ts.map +1 -0
  85. package/dist/tools/mocksLocal.js +261 -0
  86. package/dist/tools/mocksLocal.js.map +1 -0
  87. package/dist/tools/uiTestAdmin.d.ts.map +1 -1
  88. package/dist/tools/uiTestAdmin.js +3 -1
  89. package/dist/tools/uiTestAdmin.js.map +1 -1
  90. package/dist-cjs/client/api.js +120 -0
  91. package/dist-cjs/client/errors.js +45 -11
  92. package/dist-cjs/client/http.js +4 -2
  93. package/dist-cjs/client/types.js +0 -3
  94. package/dist-cjs/config.js +2 -0
  95. package/dist-cjs/context.js +2 -0
  96. package/dist-cjs/resources/docs/mocks.js +447 -0
  97. package/dist-cjs/resources/docs/overview.js +11 -1
  98. package/dist-cjs/resources/generated/aiPacks.js +2 -2
  99. package/dist-cjs/resources/index.js +2 -0
  100. package/dist-cjs/server.js +5 -2
  101. package/dist-cjs/tools/catalog.js +32 -0
  102. package/dist-cjs/tools/import.js +7 -1
  103. package/dist-cjs/tools/index.js +2 -0
  104. package/dist-cjs/tools/meta.js +28 -1
  105. package/dist-cjs/tools/mockData.js +387 -0
  106. package/dist-cjs/tools/mockEngine.js +243 -0
  107. package/dist-cjs/tools/mockImport.js +302 -0
  108. package/dist-cjs/tools/mockSchemas.js +253 -0
  109. package/dist-cjs/tools/mockShared.js +474 -0
  110. package/dist-cjs/tools/mocks.js +416 -0
  111. package/dist-cjs/tools/mocksLocal.js +277 -0
  112. package/dist-cjs/tools/uiTestAdmin.js +3 -1
  113. package/package.json +3 -3
@@ -0,0 +1,298 @@
1
+ import { z } from "zod";
2
+ import { ToolInputError } from "../client/errors.js";
3
+ import { resolvedSummary } from "../domain/resolve.js";
4
+ import { definitionCalls, mockAuthArg, mockAuthView, mockCalls, mockEngineOf, mockEngineView, requireEngine } from "./mockEngine.js";
5
+ import { strictObject } from "./mockSchemas.js";
6
+ import { findMock, localBaseUrl, localMockView, mockDetailView, mockRefArg, requireTarget, targetArg } from "./mockShared.js";
7
+ import { findLocal, localDefinitionOf, relayWorkspace, runLocalMockV2 } from "./mocksLocal.js";
8
+ import { findCollection, workspaceTag } from "./lookups.js";
9
+ import { dryRunArg, guarded, ok, WRITE, workspaceArg } from "./shared.js";
10
+ // import_mock: a mock from an OpenAPI 3.x / Swagger 2.0 document, a Postman
11
+ // collection (its saved examples) or a Callman collection (its newest recorded
12
+ // responses). The conversion runs on the server (POST /api/import/mocks), but
13
+ // the server never fetches anything: a URL or a file is read HERE, by this
14
+ // process, and sent as `content`. Files and URLs on this machine or a private
15
+ // network are refused unless CALLMAN_ALLOW_LOCAL_SOURCES is on — otherwise a
16
+ // prompt could have the model publish a local file or an intranet page as a
17
+ // public mock. A local mock (target "desktop") is converted the same way and
18
+ // written to the desktop app with the relay's `define`.
19
+ const DEFAULT_MAX_IMPORT_BYTES = 2 * 1024 * 1024;
20
+ const HARD_MAX_IMPORT_BYTES = 20 * 1024 * 1024;
21
+ const MAX_REDIRECTS = 5;
22
+ // ── local / private addresses ───────────────────────────────────────────
23
+ const PRIVATE_V4 = [/^127\./, /^10\./, /^192\.168\./, /^172\.(1[6-9]|2\d|3[01])\./, /^169\.254\./, /^0\./, /^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./];
24
+ const isIpLiteral = (host) => /^\d{1,3}(\.\d{1,3}){3}$/.test(host) || host.includes(":");
25
+ export const isPrivateAddress = (raw) => {
26
+ const address = raw.toLowerCase().replace(/^\[|\]$/g, "");
27
+ if (address.includes(":")) {
28
+ if (address === "::1" || address === "::")
29
+ return true;
30
+ const mapped = /^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/.exec(address);
31
+ if (mapped)
32
+ return isPrivateAddress(mapped[1]);
33
+ return /^f[cd]/.test(address) || /^fe[89ab]/.test(address);
34
+ }
35
+ return PRIVATE_V4.some((pattern) => pattern.test(address));
36
+ };
37
+ // Names that only mean something on this machine or a private network.
38
+ const isLocalName = (host) => host === "localhost" || !host.includes(".") || /\.(localhost|local|internal|lan|home|corp|intranet)$/.test(host);
39
+ const blocked = (what) => new ToolInputError("MOCK_IMPORT_SOURCE_BLOCKED", `${what} — import_mock reads local files and localhost / private-network URLs only when CALLMAN_ALLOW_LOCAL_SOURCES=1 is set for this MCP server.`, {
40
+ hint: "Read the document yourself and pass its text as `content`, or ask the user to set CALLMAN_ALLOW_LOCAL_SOURCES=1 in this MCP server's config and restart it.",
41
+ });
42
+ const assertReachableUrl = async (ctx, url) => {
43
+ if (url.protocol !== "http:" && url.protocol !== "https:")
44
+ throw new ToolInputError("MOCK_IMPORT_URL_INVALID", `Only http(s) URLs can be imported (got ${url.protocol}).`);
45
+ if (ctx.config.allowLocalSources)
46
+ return;
47
+ const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
48
+ if (isIpLiteral(host) ? isPrivateAddress(host) : isLocalName(host))
49
+ throw blocked(`${url.host} is on this machine or a private network`);
50
+ if (isIpLiteral(host) || !ctx.sources.resolveHost)
51
+ return;
52
+ let addresses = [];
53
+ try {
54
+ addresses = await ctx.sources.resolveHost(host);
55
+ }
56
+ catch {
57
+ return; // unresolvable: the fetch below says so
58
+ }
59
+ if (addresses.some(isPrivateAddress))
60
+ throw blocked(`${url.host} resolves to a private address`);
61
+ };
62
+ const tooLarge = (maxBytes) => new ToolInputError("MOCK_IMPORT_TOO_LARGE", `The document is larger than the ${Math.round(maxBytes / 1024)} KB this server imports.`, { limitBytes: maxBytes });
63
+ const readCapped = async (response, maxBytes) => {
64
+ if (!response.body)
65
+ return "";
66
+ const reader = response.body.getReader();
67
+ const chunks = [];
68
+ let total = 0;
69
+ for (;;) {
70
+ const { done, value } = await reader.read();
71
+ if (done)
72
+ break;
73
+ total += value.byteLength;
74
+ if (total > maxBytes) {
75
+ await reader.cancel().catch(() => undefined);
76
+ throw tooLarge(maxBytes);
77
+ }
78
+ chunks.push(value);
79
+ }
80
+ return Buffer.concat(chunks).toString("utf8");
81
+ };
82
+ // Fetch a document, following redirects by hand so every hop passes the
83
+ // local-address check. No credentials are sent.
84
+ const fetchDocument = async (ctx, raw, maxBytes) => {
85
+ let url;
86
+ try {
87
+ url = new URL(raw);
88
+ }
89
+ catch {
90
+ throw new ToolInputError("MOCK_IMPORT_URL_INVALID", `"${raw}" is not a URL.`);
91
+ }
92
+ for (let hop = 0; hop <= MAX_REDIRECTS; hop += 1) {
93
+ await assertReachableUrl(ctx, url);
94
+ let response;
95
+ try {
96
+ response = await ctx.sources.fetch(url, { redirect: "manual", headers: { Accept: "application/json, application/yaml, text/yaml, text/plain, */*" }, signal: AbortSignal.timeout(ctx.config.timeoutMs) });
97
+ }
98
+ catch (error) {
99
+ throw new ToolInputError("MOCK_IMPORT_FETCH_FAILED", `Could not fetch ${url.href} (${error instanceof Error ? error.message : String(error)}).`);
100
+ }
101
+ const location = response.headers.get("location");
102
+ if (response.status >= 300 && response.status < 400 && location) {
103
+ url = new URL(location, url);
104
+ continue;
105
+ }
106
+ if (!response.ok)
107
+ throw new ToolInputError("MOCK_IMPORT_FETCH_FAILED", `${url.href} answered HTTP ${response.status}.`, { status: response.status });
108
+ const declared = Number(response.headers.get("content-length") ?? Number.NaN);
109
+ if (Number.isFinite(declared) && declared > maxBytes)
110
+ throw tooLarge(maxBytes);
111
+ return { text: await readCapped(response, maxBytes), url: url.href };
112
+ }
113
+ throw new ToolInputError("MOCK_IMPORT_FETCH_FAILED", `${raw} redirects more than ${MAX_REDIRECTS} times.`);
114
+ };
115
+ const readDocumentFile = async (ctx, path, maxBytes) => {
116
+ if (!ctx.config.allowLocalSources)
117
+ throw blocked(`Reading the file ${path} is off`);
118
+ if (!ctx.sources.readFile)
119
+ throw new ToolInputError("MOCK_IMPORT_SOURCE_UNAVAILABLE", "This host cannot read files — pass the document as `content`.");
120
+ try {
121
+ return await ctx.sources.readFile(path, maxBytes);
122
+ }
123
+ catch (error) {
124
+ throw new ToolInputError("MOCK_IMPORT_FILE_UNREADABLE", `Could not read ${path}: ${error instanceof Error ? error.message : String(error)}`);
125
+ }
126
+ };
127
+ // ── views ───────────────────────────────────────────────────────────────
128
+ const REPORT_ITEMS = 60;
129
+ const reportView = (report) => report
130
+ ? { summary: report.summary, items: report.items.slice(0, REPORT_ITEMS), ...(report.items.length > REPORT_ITEMS ? { itemsNotShown: report.items.length - REPORT_ITEMS } : {}) }
131
+ : undefined;
132
+ // What a definition holds, one line per route / resource.
133
+ const definitionSummary = (definition) => {
134
+ const routes = (definition?.routes ?? []);
135
+ const resources = (definition?.resources ?? []);
136
+ return {
137
+ routes: routes.slice(0, 100).map((route) => ({
138
+ route: `${route.method} ${route.path}`,
139
+ ...(route.name ? { name: route.name } : {}),
140
+ ...(route.action ? { data: `${route.action.operation} ${route.action.resource}` } : { response: `${route.response?.type ?? "static"} ${route.response?.statusCode ?? ""}`.trim() }),
141
+ ...(route.variants?.length ? { variants: route.variants.length } : {}),
142
+ })),
143
+ ...(routes.length > 100 ? { routesNotShown: routes.length - 100 } : {}),
144
+ resources: resources.map((resource) => ({ name: resource.name, basePath: resource.basePath ?? `/${resource.name}`, fields: resource.fields?.length ?? 0, seedRecords: resource.seed?.records?.length ?? 0, ...(resource.seed?.generate ? { generate: resource.seed.generate } : {}) })),
145
+ ...(definition?.userAuth ? { userAuth: { usersResource: definition.userAuth.usersResource } } : {}),
146
+ };
147
+ };
148
+ // Merge like the server's `into: { strategy: "merge" }`: keep what the mock
149
+ // has, add the imported routes / resources it does not have yet.
150
+ const mergeDefinitions = (current, imported) => {
151
+ const routeKey = (route) => `${route.method} ${route.path}`;
152
+ const have = new Set(current.routes.map(routeKey));
153
+ const names = new Set(current.resources.map((resource) => resource.name));
154
+ return {
155
+ ...current,
156
+ routes: [...current.routes, ...(imported.routes ?? []).filter((route) => !have.has(routeKey(route)))],
157
+ resources: [...current.resources, ...(imported.resources ?? []).filter((resource) => !names.has(String(resource.name)))],
158
+ userAuth: current.userAuth ?? imported.userAuth ?? null,
159
+ faults: current.faults ?? imported.faults ?? null,
160
+ };
161
+ };
162
+ const mockOf = (result) => result.mock;
163
+ export const registerMockImportTool = (server, ctx) => {
164
+ server.registerTool("import_mock", {
165
+ title: "Import a mock API from a spec or collection",
166
+ description: "Mock engine v2: build a mock from an existing API description — an OpenAPI 3.x / Swagger 2.0 document (JSON or YAML), a Postman collection (its saved examples become the answers) or a Callman collection (`collection`: its requests with their newest recorded responses, secrets redacted). CRUD groups (GET/POST /pets + GET/PUT/DELETE /pets/{id}) become resources with seed data from the examples (mode \"auto\", default); everything else becomes routes, extra responses become variants (pick one with X-Mock-Response-Code / X-Mock-Response-Name). Give exactly one source: `content` (the document — e.g. a file you read), `url` (fetched by this MCP server, never by the Callman server) or `filePath` (a file on this machine). Files, and URLs on localhost or a private network, need CALLMAN_ALLOW_LOCAL_SOURCES=1. dryRun: true shows what would be created and the report (converted / needs attention / lost) without creating anything; `into` adds to an existing mock (merge: keep what it has; replace: swap routes and resources). target \"desktop\" creates a local mock in the user's desktop app (mock engine v2).",
167
+ inputSchema: {
168
+ workspace: workspaceArg,
169
+ target: targetArg,
170
+ content: z.union([z.string().min(1).max(HARD_MAX_IMPORT_BYTES), z.record(z.unknown())]).optional().describe("The document itself: JSON or YAML text, or the parsed JSON"),
171
+ url: z.string().min(1).max(2000).optional().describe("http(s) URL of the document (e.g. https://petstore3.swagger.io/api/v3/openapi.json)"),
172
+ filePath: z.string().min(1).max(1000).optional().describe("Path of the document on the machine running this MCP server (relative to where it was started); needs CALLMAN_ALLOW_LOCAL_SOURCES=1"),
173
+ collection: z.string().min(1).max(200).optional().describe("A Callman collection (name or id) — the server reads its requests and recorded responses"),
174
+ format: z.enum(["openapi", "postman", "callman"]).optional().describe("Detected when omitted"),
175
+ mode: z.enum(["auto", "routes"]).optional().describe("auto (default): CRUD groups become resources; routes: one route per operation"),
176
+ name: z.string().trim().min(1).max(50).optional().describe("Default: the document's title"),
177
+ description: z.string().max(200).optional(),
178
+ slug: z.string().min(3).max(48).optional().describe("Server: readable URL name (see create_mock)"),
179
+ auth: mockAuthArg.optional(),
180
+ ttlHours: z.number().int().min(1).max(8_760).optional(),
181
+ validateRequests: z.boolean().optional().describe("OpenAPI: check request bodies against the spec's schemas (default true)"),
182
+ keepServerBasePath: z.boolean().optional().describe("OpenAPI: keep the server's base path (/api/v3) in the mock paths (default false: /pet/1 stays /pet/1)"),
183
+ into: strictObject({ mock: mockRefArg("Mock to import into"), strategy: z.enum(["merge", "replace"]).optional().describe("merge (default): keep its routes / resources, add the new ones (same method + path or resource name is skipped); replace: the imported ones replace them") }, "into").optional(),
184
+ port: z.number().int().min(1024).max(65_535).optional().describe("target desktop: the port on 127.0.0.1"),
185
+ autoStart: z.boolean().optional().describe("target desktop: start whenever the desktop app launches"),
186
+ start: z.boolean().optional().describe("target desktop: start it right away (default true)"),
187
+ dryRun: dryRunArg,
188
+ },
189
+ annotations: WRITE,
190
+ }, guarded(async ({ workspace, target, content, url, filePath, collection, format, mode, name, description, slug, auth, ttlHours, validateRequests, keepServerBasePath, into, port, autoStart, start, dryRun }) => {
191
+ const sources = [content !== undefined && "content", url !== undefined && "url", filePath !== undefined && "filePath", collection !== undefined && "collection"].filter(Boolean);
192
+ if (sources.length !== 1) {
193
+ throw new ToolInputError("MOCK_IMPORT_SOURCE_REQUIRED", sources.length === 0 ? "Give the document: content, url, filePath or collection." : `Give ONE source, not ${sources.join(" and ")}.`);
194
+ }
195
+ const desktop = target === "desktop";
196
+ requireTarget(target ?? "server", { slug, description, ttlHours, auth }, "server", "a local mock has a name and a port.");
197
+ requireTarget(target ?? "server", { port, autoStart, start }, "desktop", 'pass target: "desktop" for a mock on the user\'s computer.');
198
+ // The workspace: the target mock's, the collection's, or the one named
199
+ // (a collection must live in the workspace of the mock it goes into).
200
+ let ws;
201
+ let serverInto;
202
+ let localInto;
203
+ let collectionId;
204
+ if (into && !desktop) {
205
+ const found = await findMock(ctx, workspace, into.mock);
206
+ ws = found.ws;
207
+ serverInto = { mockId: found.value.item.id, resolved: found.value };
208
+ }
209
+ else if (into && desktop) {
210
+ localInto = await findLocal(ctx, workspace, into.mock);
211
+ ws = localInto.ws;
212
+ }
213
+ else if (collection !== undefined) {
214
+ ws = (await findCollection(ctx, workspace, collection)).ws;
215
+ }
216
+ else
217
+ ws = desktop ? await relayWorkspace(ctx, workspace) : await ctx.resolveWorkspace(workspace);
218
+ if (collection !== undefined)
219
+ collectionId = (await findCollection(ctx, ws.id, collection)).value.item.id;
220
+ const engine = await mockEngineOf(ctx, ws.id);
221
+ requireEngine(engine, [["import_mock", "import"], ...(desktop ? [["target desktop", "definition"]] : [])]);
222
+ const maxBytes = Math.min(engine.limits.maxImportBytes ?? DEFAULT_MAX_IMPORT_BYTES, HARD_MAX_IMPORT_BYTES);
223
+ let document = content;
224
+ let fetchedFrom;
225
+ if (url !== undefined) {
226
+ const fetched = await fetchDocument(ctx, url, maxBytes);
227
+ document = fetched.text;
228
+ fetchedFrom = fetched.url;
229
+ }
230
+ else if (filePath !== undefined)
231
+ document = await readDocumentFile(ctx, filePath, maxBytes);
232
+ if (document !== undefined) {
233
+ if (typeof document === "string" && document.trim() === "")
234
+ throw new ToolInputError("MOCK_IMPORT_EMPTY", "The document is empty.");
235
+ if (Buffer.byteLength(typeof document === "string" ? document : JSON.stringify(document), "utf8") > maxBytes)
236
+ throw tooLarge(maxBytes);
237
+ }
238
+ const body = {
239
+ ...(document !== undefined ? { content: document } : { collectionId }),
240
+ ...(format ? { format } : {}),
241
+ ...(mode ? { mode } : {}),
242
+ ...(name ? { name } : {}),
243
+ ...(description ? { description } : {}),
244
+ ...(slug ? { slug } : {}),
245
+ ...(auth ? { auth: { type: auth } } : {}),
246
+ ...(ttlHours ? { ttlHours } : {}),
247
+ ...(validateRequests !== undefined ? { validateRequests } : {}),
248
+ ...(keepServerBasePath !== undefined ? { keepServerBasePath } : {}),
249
+ // A local mock: the server only converts; the desktop gets the result.
250
+ dryRun: desktop || Boolean(dryRun),
251
+ ...(serverInto ? { into: { mockId: serverInto.mockId, strategy: into?.strategy ?? "merge" } } : {}),
252
+ };
253
+ const result = await ctx.api.importMock(ws.id, body);
254
+ const source = { format: result.format, ...(fetchedFrom ? { fetchedFrom } : {}), ...(filePath ? { filePath } : {}), ...(collection ? { collection } : {}) };
255
+ const report = reportView(result.report);
256
+ if (desktop) {
257
+ const imported = (result.definition ?? {});
258
+ const definition = localInto && (into?.strategy ?? "merge") === "merge" ? mergeDefinitions(localDefinitionOf(localInto.record), imported) : { ...imported };
259
+ if (dryRun)
260
+ return ok({ target: "desktop", dryRun: true, ...source, ...(localInto ? { into: { id: localInto.record.id, name: localInto.record.name, strategy: into?.strategy ?? "merge" } } : {}), preview: definitionSummary(definition), report, stats: result.stats });
261
+ const payload = localInto
262
+ ? { mockId: localInto.record.id, definition, ...(localInto.record.definitionRev !== undefined ? { expectedRev: localInto.record.definitionRev } : {}) }
263
+ : { name: (name ?? result.name ?? "Imported mock").slice(0, 50), ...(port !== undefined ? { port } : {}), ...(autoStart !== undefined ? { autoStart } : {}), start: start ?? true, definition };
264
+ const mock = mockOf(await runLocalMockV2(ctx, ws, "define", payload, "import_mock"));
265
+ return ok({
266
+ target: "desktop",
267
+ ...source,
268
+ mock: localMockView(mock),
269
+ baseUrl: localBaseUrl(mock),
270
+ calls: mock.definition ? definitionCalls(localBaseUrl(mock), mock.definition, undefined).slice(0, 100) : [],
271
+ report,
272
+ stats: result.stats,
273
+ ...(localInto ? { resolved: [resolvedSummary(into?.mock ?? "", localInto.resolved)] } : {}),
274
+ });
275
+ }
276
+ if (result.dryRun) {
277
+ return ok({ dryRun: true, ...source, ...(result.name ? { name: result.name } : {}), ...(serverInto ? { into: { mockId: serverInto.mockId, strategy: into?.strategy ?? "merge" } } : {}), preview: definitionSummary(result.definition), report, stats: result.stats, workspace: workspaceTag(ws) });
278
+ }
279
+ ctx.invalidate("mocks");
280
+ // A new mock comes back whole (its access token shown once); an import
281
+ // into a mock returns its definition — read the mock for the view.
282
+ const created = result.mock;
283
+ const mock = created ?? (await ctx.api.getMock(ws.id, serverInto?.mockId ?? result.mockId ?? ""));
284
+ const token = created?.auth.type === "token" ? (created.auth.token ?? null) : null;
285
+ return ok({
286
+ ...source,
287
+ mock: mockDetailView(mock, ctx.config.apiUrl, mockAuthView(mock, token, token ? "Shown once: only a user with environments:reveal can read it again." : undefined), mockEngineView(mock)),
288
+ publicUrl: result.publicUrl ?? mock.publicUrl,
289
+ calls: mockCalls(mock, token).slice(0, 100),
290
+ report,
291
+ stats: result.stats,
292
+ workspace: workspaceTag(ws),
293
+ ...(serverInto ? { resolved: [resolvedSummary(into?.mock ?? "", serverInto.resolved)] } : {}),
294
+ note: report && report.summary.lost > 0 ? `${report.summary.lost} part(s) of the document could not be converted — see report.items with severity "lost".` : `Live now at ${result.publicUrl ?? mock.publicUrl}.`,
295
+ });
296
+ }));
297
+ };
298
+ //# sourceMappingURL=mockImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockImport.js","sourceRoot":"","sources":["../../src/tools/mockImport.ts"],"names":[],"mappings":"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"}