callman-mcp 0.8.0 → 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 (101) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +25 -9
  3. package/dist/client/api.d.ts +39 -1
  4. package/dist/client/api.d.ts.map +1 -1
  5. package/dist/client/api.js +53 -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 +28 -1
  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 +92 -1
  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 +8 -0
  23. package/dist/context.d.ts.map +1 -1
  24. package/dist/context.js +1 -0
  25. package/dist/context.js.map +1 -1
  26. package/dist/index.js +17 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/resources/docs/mocks.d.ts +1 -1
  29. package/dist/resources/docs/mocks.d.ts.map +1 -1
  30. package/dist/resources/docs/mocks.js +349 -114
  31. package/dist/resources/docs/mocks.js.map +1 -1
  32. package/dist/resources/docs/overview.d.ts +1 -1
  33. package/dist/resources/docs/overview.d.ts.map +1 -1
  34. package/dist/resources/docs/overview.js +5 -1
  35. package/dist/resources/docs/overview.js.map +1 -1
  36. package/dist/resources/generated/aiPacks.d.ts +1 -1
  37. package/dist/resources/generated/aiPacks.js +2 -2
  38. package/dist/resources/index.js +1 -1
  39. package/dist/resources/index.js.map +1 -1
  40. package/dist/server.d.ts +3 -1
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +2 -0
  43. package/dist/server.js.map +1 -1
  44. package/dist/tools/catalog.d.ts.map +1 -1
  45. package/dist/tools/catalog.js +15 -1
  46. package/dist/tools/catalog.js.map +1 -1
  47. package/dist/tools/import.d.ts.map +1 -1
  48. package/dist/tools/import.js +7 -1
  49. package/dist/tools/import.js.map +1 -1
  50. package/dist/tools/mockData.d.ts +4 -0
  51. package/dist/tools/mockData.d.ts.map +1 -0
  52. package/dist/tools/mockData.js +384 -0
  53. package/dist/tools/mockData.js.map +1 -0
  54. package/dist/tools/mockEngine.d.ts +129 -0
  55. package/dist/tools/mockEngine.d.ts.map +1 -0
  56. package/dist/tools/mockEngine.js +225 -0
  57. package/dist/tools/mockEngine.js.map +1 -0
  58. package/dist/tools/mockImport.d.ts +5 -0
  59. package/dist/tools/mockImport.d.ts.map +1 -0
  60. package/dist/tools/mockImport.js +298 -0
  61. package/dist/tools/mockImport.js.map +1 -0
  62. package/dist/tools/mockSchemas.d.ts +12272 -0
  63. package/dist/tools/mockSchemas.d.ts.map +1 -0
  64. package/dist/tools/mockSchemas.js +247 -0
  65. package/dist/tools/mockSchemas.js.map +1 -0
  66. package/dist/tools/mockShared.d.ts +5449 -77
  67. package/dist/tools/mockShared.d.ts.map +1 -1
  68. package/dist/tools/mockShared.js +101 -43
  69. package/dist/tools/mockShared.js.map +1 -1
  70. package/dist/tools/mocks.d.ts.map +1 -1
  71. package/dist/tools/mocks.js +117 -35
  72. package/dist/tools/mocks.js.map +1 -1
  73. package/dist/tools/mocksLocal.d.ts +27 -3
  74. package/dist/tools/mocksLocal.d.ts.map +1 -1
  75. package/dist/tools/mocksLocal.js +118 -26
  76. package/dist/tools/mocksLocal.js.map +1 -1
  77. package/dist/tools/uiTestAdmin.d.ts.map +1 -1
  78. package/dist/tools/uiTestAdmin.js +3 -1
  79. package/dist/tools/uiTestAdmin.js.map +1 -1
  80. package/dist-cjs/client/api.js +53 -0
  81. package/dist-cjs/client/errors.js +28 -1
  82. package/dist-cjs/client/http.js +4 -2
  83. package/dist-cjs/client/types.js +0 -3
  84. package/dist-cjs/config.js +2 -0
  85. package/dist-cjs/context.js +1 -0
  86. package/dist-cjs/resources/docs/mocks.js +349 -114
  87. package/dist-cjs/resources/docs/overview.js +5 -1
  88. package/dist-cjs/resources/generated/aiPacks.js +2 -2
  89. package/dist-cjs/resources/index.js +1 -1
  90. package/dist-cjs/server.js +2 -0
  91. package/dist-cjs/tools/catalog.js +15 -1
  92. package/dist-cjs/tools/import.js +7 -1
  93. package/dist-cjs/tools/mockData.js +387 -0
  94. package/dist-cjs/tools/mockEngine.js +243 -0
  95. package/dist-cjs/tools/mockImport.js +302 -0
  96. package/dist-cjs/tools/mockSchemas.js +253 -0
  97. package/dist-cjs/tools/mockShared.js +113 -53
  98. package/dist-cjs/tools/mocks.js +121 -39
  99. package/dist-cjs/tools/mocksLocal.js +133 -35
  100. package/dist-cjs/tools/uiTestAdmin.js +3 -1
  101. package/package.json +3 -3
@@ -0,0 +1,384 @@
1
+ import { normalizeResource } from "callman-core/mock-engine";
2
+ import { z } from "zod";
3
+ import { ToolInputError } from "../client/errors.js";
4
+ import { resolvedSummary } from "../domain/resolve.js";
5
+ import { LIMITS, safeStringify } from "../lib/truncate.js";
6
+ import { mockEngineOf, requireEngine, resourceCalls, resourceView, toServerResource } from "./mockEngine.js";
7
+ import { resourceInputSchema, resourcePatchSchema, sessionArg, strictObject } from "./mockSchemas.js";
8
+ import { findMock, localBaseUrl, mockRefArg, targetArg } from "./mockShared.js";
9
+ import { findLocal, localDefinitionOf, localRedefine, runLocalMockV2 } from "./mocksLocal.js";
10
+ import { workspaceTag } from "./lookups.js";
11
+ import { confirmArg, DESTRUCTIVE, dryRunArg, failureOf, guarded, IDEMPOTENT_WRITE, ok, READ, requireConfirm, WRITE, workspaceArg } from "./shared.js";
12
+ // Mock engine v2 data tools: a mock's resources (a small database with auto
13
+ // CRUD endpoints), their records, resetting the data and the test sessions
14
+ // callers open with X-Mock-Session. Server mocks use the management API
15
+ // (/api/mocks/:id/resources|data|sessions); target "desktop" sends the relay's
16
+ // define / records / sessions ops to the user's desktop app.
17
+ const mockArg = mockRefArg("Mock");
18
+ const resourceRefArg = z.string().trim().min(1).max(64).describe("The resource's name (or id)");
19
+ const desktop = { target: "desktop" };
20
+ // A server mock on an engine v2 server that offers `feature` (for `tool`).
21
+ const serverMock = async (ctx, workspace, ref, tool, feature, options = {}) => {
22
+ const { ws, value: resolved } = await findMock(ctx, workspace, ref, options);
23
+ requireEngine(await mockEngineOf(ctx, ws.id), [[tool, feature]]);
24
+ const summary = resolved.item.summary;
25
+ // The mock's access token stays masked in curl lines (<token>).
26
+ return { ws, resolved, mockId: resolved.item.id, publicUrl: summary.publicUrl, token: summary.auth.type === "token" ? null : undefined };
27
+ };
28
+ const findResource = (resources, ref) => {
29
+ const hit = resources.find((resource) => resource.name === ref || resource.resourceId === ref);
30
+ if (!hit) {
31
+ throw new ToolInputError("MOCK_RESOURCE_NOT_FOUND", `The mock has no resource "${ref}".`, { candidates: resources.map((resource) => ({ name: resource.name, basePath: resource.basePath })) });
32
+ }
33
+ return hit;
34
+ };
35
+ const resourceOut = (definition, resource, baseUrl, token, recordCount) => ({
36
+ resource: resourceView(resource, recordCount),
37
+ calls: resourceCalls(baseUrl, [resource], definition.userAuth, token),
38
+ });
39
+ // Records the model reads: whole while they fit, else the first ones.
40
+ const recordsOut = (items) => {
41
+ if (safeStringify(items).length <= LIMITS.FULL_BODY)
42
+ return { records: items };
43
+ const kept = [];
44
+ let size = 2;
45
+ for (const item of items) {
46
+ size += safeStringify(item).length + 1;
47
+ if (size > LIMITS.FULL_BODY)
48
+ break;
49
+ kept.push(item);
50
+ }
51
+ return { records: kept, truncated: true, truncatedNote: `Only the first ${kept.length} of ${items.length} records fit — ask for fewer (limit) or fewer fields (fields: [...]).` };
52
+ };
53
+ // ── the list query language as arguments ────────────────────────────────
54
+ const scalar = z.union([z.string().max(2000), z.number(), z.boolean(), z.null()]);
55
+ const scalarOrList = z.union([scalar, z.array(scalar).min(1).max(100)]);
56
+ // core: the query suffixes (`field_gte=…`); eq is the bare field.
57
+ const FILTER_OPS = ["eq", "ne", "gt", "gte", "lt", "lte", "in", "nin", "exists", "contains", "like"];
58
+ const fieldPath = z.string().trim().min(1).max(200).regex(/^[A-Za-z0-9_.-]+$/, "A field name or dotted path (address.city)");
59
+ const queryShape = {
60
+ id: z.string().min(1).max(512).optional().describe("Read ONE record by its id (or the resource's lookupField) instead of a list"),
61
+ where: z.record(scalarOrList).optional().describe('Equality filters: { "status": "paid", "userId": 3 }; a list matches any of its values'),
62
+ filters: z
63
+ .array(strictObject({ field: fieldPath, op: z.enum(FILTER_OPS), value: scalarOrList.describe("exists: true / false; in / nin: a list") }, "filter"))
64
+ .max(20)
65
+ .optional()
66
+ .describe("Comparisons: ne gt gte lt lte, in / nin (a list), exists, contains (array field holds the value), like (case-insensitive substring)"),
67
+ q: z.string().max(200).optional().describe("Full-text search (resources with list.searchable or no fields)"),
68
+ sort: z.string().max(200).optional().describe('Fields, - for descending: "-createdAt,name"'),
69
+ page: z.number().int().min(1).optional(),
70
+ limit: z.number().int().min(1).max(1000).optional().describe("Page size (default 20)"),
71
+ start: z.number().int().min(0).optional().describe("Slice instead of pages: records start…end"),
72
+ end: z.number().int().min(0).optional(),
73
+ expand: z.array(z.string().max(64)).max(3).optional().describe('Inline the record a ref field points to: ["user"] for orders.userId'),
74
+ embed: z.array(z.string().max(64)).max(3).optional().describe('Inline the records pointing here: ["orders"] on users'),
75
+ fields: z.array(z.string().max(200)).max(50).optional().describe("Return only these fields"),
76
+ query: z.string().max(4000).optional().describe("Or the raw query string a client would send to the list endpoint: status=paid&total_gte=10&_sort=-total&_expand=user"),
77
+ };
78
+ const text = (value) => (value === null ? "null" : String(value));
79
+ const queryPairs = (args) => {
80
+ const pairs = [];
81
+ for (const [field, value] of Object.entries(args.where ?? {}))
82
+ for (const one of Array.isArray(value) ? value : [value])
83
+ pairs.push([field, text(one)]);
84
+ for (const filter of args.filters ?? []) {
85
+ const key = filter.op === "eq" ? filter.field : `${filter.field}_${filter.op}`;
86
+ if (!Array.isArray(filter.value))
87
+ pairs.push([key, text(filter.value)]);
88
+ else if (filter.op === "in" || filter.op === "nin")
89
+ pairs.push([key, filter.value.map(text).join(",")]);
90
+ else
91
+ for (const one of filter.value)
92
+ pairs.push([key, text(one)]);
93
+ }
94
+ if (args.q)
95
+ pairs.push(["q", args.q]);
96
+ if (args.sort)
97
+ pairs.push(["_sort", args.sort]);
98
+ if (args.page !== undefined)
99
+ pairs.push(["_page", String(args.page)]);
100
+ if (args.limit !== undefined)
101
+ pairs.push(["_limit", String(args.limit)]);
102
+ if (args.start !== undefined)
103
+ pairs.push(["_start", String(args.start)]);
104
+ if (args.end !== undefined)
105
+ pairs.push(["_end", String(args.end)]);
106
+ for (const name of args.expand ?? [])
107
+ pairs.push(["_expand", name]);
108
+ for (const name of args.embed ?? [])
109
+ pairs.push(["_embed", name]);
110
+ if (args.fields?.length)
111
+ pairs.push(["_fields", args.fields.join(",")]);
112
+ if (args.query)
113
+ for (const [key, value] of new URLSearchParams(args.query.trim().replace(/^\?/, "")))
114
+ pairs.push([key, value]);
115
+ // A smaller first page than the engine's 50 — the total says if there is more.
116
+ if (!pairs.some(([key]) => ["_limit", "_per_page", "_start", "_end"].includes(key)))
117
+ pairs.push(["_limit", "20"]);
118
+ return pairs;
119
+ };
120
+ export const registerMockDataTools = (server, ctx) => {
121
+ // ── resources ─────────────────────────────────────────────────────────
122
+ server.registerTool("add_mock_resource", {
123
+ title: "Add a resource to a mock API",
124
+ description: "Mock engine v2: add a resource — a small database inside the mock — and get its auto CRUD endpoints with a curl line each: GET /<name> (list: filter ?field=v, ?total_gte=10, ?q=, sort ?_sort=-createdAt, page ?_page=2&_limit=10, relations ?_expand=user / ?_embed=orders), POST /<name>, GET / PUT / PATCH / DELETE /<name>/:id, plus /<parent>/:<fk>/<name> for ref fields. Typed fields validate writes (400 with the invalid fields, 409 on a unique clash); seed records or generated data fill it. Start from a template (users, products, orders, todos, posts) or describe the fields. Endpoints are not stored as routes and do not count against the route limit. Server mocks need a mock engine v2 server; target \"desktop\" a desktop app with mock engine v2.",
125
+ inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, resource: resourceInputSchema, dryRun: dryRunArg },
126
+ annotations: WRITE,
127
+ }, guarded(async ({ workspace, mock, target, resource, dryRun }) => {
128
+ const body = toServerResource(resource, "resource");
129
+ const preview = (baseUrl) => ok({ ...(target === "desktop" ? desktop : {}), dryRun: true, resource: body, calls: resourceCalls(baseUrl, [normalizeResource(body)], null, undefined) });
130
+ if (target === "desktop") {
131
+ if (dryRun)
132
+ return preview("http://127.0.0.1:<port>");
133
+ const { mock: local, resolved } = await localRedefine(ctx, workspace, mock, "add_mock_resource", (definition) => {
134
+ if (definition.resources.some((entry) => entry.name === body.name))
135
+ throw new ToolInputError("MOCK_RESOURCE_CONFLICT", `The local mock already has a resource named "${String(body.name)}".`);
136
+ return { ...definition, resources: [...definition.resources, body] };
137
+ });
138
+ const definition = localDefinitionOf(local);
139
+ return ok({ ...desktop, ...resourceOut(definition, findResource(definition.resources, String(body.name)), localBaseUrl(local), undefined, local.recordCounts?.[String(body.name)]), mock: { id: local.id, name: local.name }, resolved: [resolvedSummary(mock, resolved)] });
140
+ }
141
+ const { ws, resolved, mockId, publicUrl, token } = await serverMock(ctx, workspace, mock, "add_mock_resource", "resources");
142
+ if (dryRun)
143
+ return preview(publicUrl);
144
+ const view = await ctx.api.addMockResource(ws.id, mockId, body);
145
+ ctx.invalidate("mocks");
146
+ const added = findResource(view.definition.resources, String(body.name));
147
+ return ok({ ...resourceOut(view.definition, added, publicUrl, token, view.recordCounts?.[added.name]), definitionRev: view.definitionRev, workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
148
+ }));
149
+ server.registerTool("update_mock_resource", {
150
+ title: "Change a resource of a mock API",
151
+ description: "Mock engine v2: change a resource of a mock — rename it, move its basePath, change fields (`fields` replaces the whole list: read it with get_mock, edit, send all), id strategy, protection, endpoints, list settings or seed. Keys you leave out stay. Its records are kept (they are keyed by the resource's id, not its name); a new seed applies after reset_mock_data.",
152
+ inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, resource: resourceRefArg, changes: resourcePatchSchema },
153
+ annotations: IDEMPOTENT_WRITE,
154
+ }, guarded(async ({ workspace, mock, target, resource, changes }) => {
155
+ const body = toServerResource(changes, "changes", { partial: true });
156
+ if (Object.keys(body).length === 0)
157
+ throw new ToolInputError("NOTHING_TO_UPDATE", "Pass at least one key to change in `changes`.");
158
+ const newName = typeof body.name === "string" ? body.name : undefined;
159
+ if (target === "desktop") {
160
+ let resourceId = "";
161
+ const { mock: local, resolved } = await localRedefine(ctx, workspace, mock, "update_mock_resource", (definition) => {
162
+ const current = findResource(definition.resources, resource);
163
+ if (newName && newName !== current.name && definition.resources.some((entry) => entry.name === newName))
164
+ throw new ToolInputError("MOCK_RESOURCE_CONFLICT", `The local mock already has a resource named "${newName}".`);
165
+ resourceId = current.resourceId;
166
+ return { ...definition, resources: definition.resources.map((entry) => (entry.resourceId === current.resourceId ? { ...entry, ...body, resourceId: current.resourceId } : entry)) };
167
+ });
168
+ const definition = localDefinitionOf(local);
169
+ const updated = findResource(definition.resources, resourceId || newName || resource);
170
+ return ok({ ...desktop, ...resourceOut(definition, updated, localBaseUrl(local), undefined, local.recordCounts?.[updated.name]), mock: { id: local.id, name: local.name }, resolved: [resolvedSummary(mock, resolved)] });
171
+ }
172
+ const { ws, resolved, mockId, publicUrl, token } = await serverMock(ctx, workspace, mock, "update_mock_resource", "resources");
173
+ const before = (await ctx.api.getMockDefinition(ws.id, mockId)).definition;
174
+ const current = findResource(before.resources ?? [], resource);
175
+ const view = await ctx.api.updateMockResource(ws.id, mockId, current.resourceId, body);
176
+ ctx.invalidate("mocks");
177
+ const updated = findResource(view.definition.resources, current.resourceId);
178
+ return ok({ ...resourceOut(view.definition, updated, publicUrl, token, view.recordCounts?.[updated.name]), definitionRev: view.definitionRev, workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
179
+ }));
180
+ server.registerTool("delete_mock_resource", {
181
+ title: "Delete a resource of a mock API",
182
+ description: "Mock engine v2: remove a resource from a mock together with ALL its records (shared data and every test session); its endpoints answer 404 at once. Refused while something still uses it (a ref field of another resource, a data route, the user sign-in) — the error names it. Needs the exact resource name or id.",
183
+ inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, resource: resourceRefArg, confirm: confirmArg },
184
+ annotations: DESTRUCTIVE,
185
+ }, guarded(async ({ workspace, mock, target, resource, confirm }) => {
186
+ requireConfirm(confirm, "a mock resource and its records");
187
+ if (target === "desktop") {
188
+ let removed = "";
189
+ const { mock: local, resolved } = await localRedefine(ctx, workspace, mock, "delete_mock_resource", (definition) => {
190
+ const current = findResource(definition.resources, resource);
191
+ removed = current.name;
192
+ return { ...definition, resources: definition.resources.filter((entry) => entry.resourceId !== current.resourceId) };
193
+ });
194
+ return ok({ ...desktop, deleted: { resource: removed }, resources: localDefinitionOf(local).resources.map((entry) => entry.name), mock: { id: local.id, name: local.name }, resolved: [resolvedSummary(mock, resolved)] });
195
+ }
196
+ const { ws, resolved, mockId } = await serverMock(ctx, workspace, mock, "delete_mock_resource", "resources", { exact: true });
197
+ const view = await ctx.api.deleteMockResource(ws.id, mockId, resource);
198
+ ctx.invalidate("mocks");
199
+ return ok({ deleted: { resource }, resources: view.definition.resources.map((entry) => entry.name), definitionRev: view.definitionRev, workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
200
+ }));
201
+ // ── records ───────────────────────────────────────────────────────────
202
+ server.registerTool("query_mock_records", {
203
+ title: "Query the records of a mock resource",
204
+ description: "Mock engine v2: read the data of a resource — what the mock's clients created, changed or deleted — with the same list query language its GET /<resource> endpoint takes: where (equality), filters (ne gt gte lt lte in nin exists contains like), q (search), sort, page / limit (default 20) or start / end, expand / embed (relations) and fields; or `id` for one record. `session` reads that test session's own copy (X-Mock-Session) instead of the shared data. Returns the records, the total and the query string (to reuse with curl).",
205
+ inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, resource: resourceRefArg, ...queryShape, session: sessionArg },
206
+ annotations: READ,
207
+ }, guarded(async ({ workspace, mock, target, resource, session, ...args }) => {
208
+ const { id, ...listArgs } = args;
209
+ if (id !== undefined && Object.values(listArgs).some((value) => value !== undefined)) {
210
+ throw new ToolInputError("MOCK_QUERY_CONFLICT", "`id` reads one record — leave out the list arguments (where, filters, sort, page …), or drop `id` to query a list.");
211
+ }
212
+ const pairs = id === undefined ? queryPairs(listArgs) : [];
213
+ const queryString = new URLSearchParams(pairs).toString();
214
+ const extra = { resource, ...(session ? { session } : {}) };
215
+ if (target === "desktop") {
216
+ if (pairs.length > 50)
217
+ throw new ToolInputError("LOCAL_MOCK_QUERY_TOO_LONG", "A local mock query takes at most 50 query parameters.");
218
+ const { ws, resolved, record } = await findLocal(ctx, workspace, mock);
219
+ const payload = { mockId: record.id, resource, action: id === undefined ? "list" : "get", ...(session ? { session } : {}), ...(id === undefined ? { query: pairs } : { id }) };
220
+ const result = await runLocalMockV2(ctx, ws, "records", payload, "query_mock_records");
221
+ if (id !== undefined)
222
+ return ok({ ...desktop, ...extra, record: result, resolved: [resolvedSummary(mock, resolved)] });
223
+ const page = result;
224
+ return ok({ ...desktop, ...extra, total: page.total ?? 0, page: page.page, limit: page.limit, returned: page.items?.length ?? 0, ...recordsOut(page.items ?? []), query: queryString, resolved: [resolvedSummary(mock, resolved)] });
225
+ }
226
+ const { ws, resolved, mockId, publicUrl } = await serverMock(ctx, workspace, mock, "query_mock_records", "resources");
227
+ if (id !== undefined)
228
+ return ok({ ...extra, record: await ctx.api.getMockRecord(ws.id, mockId, resource, id, session), workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
229
+ const page = await ctx.api.listMockRecords(ws.id, mockId, resource, pairs, session);
230
+ return ok({
231
+ ...extra,
232
+ total: page.total,
233
+ page: page.page,
234
+ limit: page.limit,
235
+ returned: page.items.length,
236
+ ...recordsOut(page.items),
237
+ query: queryString,
238
+ publicUrl,
239
+ workspace: workspaceTag(ws),
240
+ resolved: [resolvedSummary(mock, resolved)],
241
+ });
242
+ }));
243
+ server.registerTool("insert_mock_records", {
244
+ title: "Insert records into a mock resource",
245
+ description: "Mock engine v2: add records to a resource (up to 1000 per call) — test data, or the state a test needs. Each record is validated like a POST to the resource (types, required, unique, refs); ids and timestamps are generated unless given. Records that fail come back in `errors` with their index; the others are inserted. `session` writes into that test session's copy instead of the shared data.",
246
+ inputSchema: {
247
+ workspace: workspaceArg,
248
+ mock: mockArg,
249
+ target: targetArg,
250
+ resource: resourceRefArg,
251
+ records: z.array(z.record(z.unknown())).min(1).max(1000),
252
+ session: sessionArg,
253
+ },
254
+ annotations: WRITE,
255
+ }, guarded(async ({ workspace, mock, target, resource, records, session }) => {
256
+ const extra = { resource, ...(session ? { session } : {}) };
257
+ const summarize = (result) => {
258
+ const inserted = result.inserted ?? [];
259
+ const { records: shown, ...clipped } = recordsOut(inserted);
260
+ return { inserted: inserted.length, failed: result.errors?.length ?? 0, records: shown, ...clipped, ...(result.errors?.length ? { errors: result.errors.slice(0, 50) } : {}) };
261
+ };
262
+ if (target === "desktop") {
263
+ const { ws, resolved, record } = await findLocal(ctx, workspace, mock);
264
+ const result = await runLocalMockV2(ctx, ws, "records", { mockId: record.id, resource, action: "insert", records, ...(session ? { session } : {}) }, "insert_mock_records");
265
+ return ok({ ...desktop, ...extra, ...summarize(result), resolved: [resolvedSummary(mock, resolved)] });
266
+ }
267
+ const { ws, resolved, mockId } = await serverMock(ctx, workspace, mock, "insert_mock_records", "resources");
268
+ const result = await ctx.api.insertMockRecords(ws.id, mockId, resource, { records, ...(session ? { session } : {}) });
269
+ return ok({ ...extra, ...summarize(result), workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
270
+ }));
271
+ const recordUpdate = strictObject({ id: z.string().min(1).max(512), record: z.record(z.unknown()) }, "update");
272
+ server.registerTool("update_mock_records", {
273
+ title: "Change records of a mock resource",
274
+ description: "Mock engine v2: change records of a resource by id — `id` + `record` for one, or `updates: [{ id, record }]` (up to 100). mode \"patch\" (default) changes only the given fields; \"replace\" swaps the whole record (the id stays). Validated like PATCH / PUT on the resource. `session` changes that test session's copy.",
275
+ inputSchema: {
276
+ workspace: workspaceArg,
277
+ mock: mockArg,
278
+ target: targetArg,
279
+ resource: resourceRefArg,
280
+ id: z.string().min(1).max(512).optional(),
281
+ record: z.record(z.unknown()).optional().describe("With id: the fields to change (patch) or the new record (replace)"),
282
+ updates: z.array(recordUpdate).min(1).max(100).optional(),
283
+ mode: z.enum(["patch", "replace"]).optional(),
284
+ session: sessionArg,
285
+ },
286
+ annotations: IDEMPOTENT_WRITE,
287
+ }, guarded(async ({ workspace, mock, target, resource, id, record, updates, mode, session }) => {
288
+ if ((id === undefined) !== (record === undefined))
289
+ throw new ToolInputError("MOCK_UPDATE_INCOMPLETE", "Give `id` together with `record`.");
290
+ if (Boolean(id) === Boolean(updates))
291
+ throw new ToolInputError("MOCK_UPDATE_INCOMPLETE", "Give either `id` + `record` (one record) or `updates` (several).");
292
+ const list = updates ?? [{ id: id, record: record }];
293
+ const effectiveMode = mode ?? "patch";
294
+ const extra = { resource, mode: effectiveMode, ...(session ? { session } : {}) };
295
+ const updated = [];
296
+ const failed = [];
297
+ if (target === "desktop") {
298
+ const { ws, resolved, record: local } = await findLocal(ctx, workspace, mock);
299
+ for (const entry of list) {
300
+ try {
301
+ updated.push(await runLocalMockV2(ctx, ws, "records", { mockId: local.id, resource, action: "update", id: entry.id, record: entry.record, mode: effectiveMode, ...(session ? { session } : {}) }, "update_mock_records"));
302
+ }
303
+ catch (error) {
304
+ if (list.length === 1)
305
+ throw error;
306
+ failed.push({ id: entry.id, error: failureOf(error) });
307
+ }
308
+ }
309
+ return ok({ ...desktop, ...extra, updated: updated.length, ...recordsOut(updated), ...(failed.length ? { failed } : {}), resolved: [resolvedSummary(mock, resolved)] });
310
+ }
311
+ const { ws, resolved, mockId } = await serverMock(ctx, workspace, mock, "update_mock_records", "resources");
312
+ for (const entry of list) {
313
+ try {
314
+ updated.push(await ctx.api.updateMockRecord(ws.id, mockId, resource, entry.id, { record: entry.record, mode: effectiveMode, ...(session ? { session } : {}) }));
315
+ }
316
+ catch (error) {
317
+ if (list.length === 1)
318
+ throw error;
319
+ failed.push({ id: entry.id, error: failureOf(error) });
320
+ }
321
+ }
322
+ return ok({ ...extra, updated: updated.length, ...recordsOut(updated), ...(failed.length ? { failed } : {}), workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
323
+ }));
324
+ server.registerTool("delete_mock_records", {
325
+ title: "Delete records of a mock resource",
326
+ description: "Mock engine v2: delete records of a resource by id (up to 1000), or ids: \"all\" to empty it. Relations apply: records that reference them are deleted too (cascade), set to null (nullify), or the delete is refused (restrict). `session` deletes from that test session's copy. reset_mock_data brings the seed back.",
327
+ inputSchema: {
328
+ workspace: workspaceArg,
329
+ mock: mockArg,
330
+ target: targetArg,
331
+ resource: resourceRefArg,
332
+ ids: z.union([z.array(z.string().min(1).max(512)).min(1).max(1000), z.literal("all")]),
333
+ session: sessionArg,
334
+ confirm: confirmArg,
335
+ },
336
+ annotations: DESTRUCTIVE,
337
+ }, guarded(async ({ workspace, mock, target, resource, ids, session, confirm }) => {
338
+ requireConfirm(confirm, ids === "all" ? "every record of a resource" : "mock records");
339
+ const extra = { resource, ...(session ? { session } : {}) };
340
+ if (target === "desktop") {
341
+ const { ws, resolved, record } = await findLocal(ctx, workspace, mock);
342
+ const result = (await runLocalMockV2(ctx, ws, "records", { mockId: record.id, resource, action: "delete", ids, ...(session ? { session } : {}) }, "delete_mock_records"));
343
+ return ok({ ...desktop, ...extra, deleted: result?.deleted ?? 0, resolved: [resolvedSummary(mock, resolved)] });
344
+ }
345
+ const { ws, resolved, mockId } = await serverMock(ctx, workspace, mock, "delete_mock_records", "resources");
346
+ const result = await ctx.api.deleteMockRecords(ws.id, mockId, resource, { ids, ...(session ? { session } : {}) });
347
+ return ok({ ...extra, deleted: result.deleted, workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
348
+ }));
349
+ // ── data reset and test sessions ──────────────────────────────────────
350
+ server.registerTool("reset_mock_data", {
351
+ title: "Reset a mock API's data",
352
+ description: "Mock engine v2: put every resource of the mock back to its seed (seed records + generated ones) and restart the fault call counters (failFirst) — do it between test runs. `session` resets only that test session's copy. The legacy builder state is separate (reset_mock_state).",
353
+ inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, session: sessionArg },
354
+ annotations: IDEMPOTENT_WRITE,
355
+ }, guarded(async ({ workspace, mock, target, session }) => {
356
+ const extra = { reset: true, ...(session ? { session } : { scope: "shared data" }) };
357
+ if (target === "desktop") {
358
+ const { ws, resolved, record } = await findLocal(ctx, workspace, mock);
359
+ // `records … reset` resets the whole mock; the op names a resource.
360
+ const anyResource = localDefinitionOf(record).resources[0]?.name ?? "*";
361
+ await runLocalMockV2(ctx, ws, "records", { mockId: record.id, resource: anyResource, action: "reset", ...(session ? { session } : {}) }, "reset_mock_data");
362
+ return ok({ ...desktop, ...extra, resolved: [resolvedSummary(mock, resolved)] });
363
+ }
364
+ const { ws, resolved, mockId } = await serverMock(ctx, workspace, mock, "reset_mock_data", "resources");
365
+ await ctx.api.resetMockData(ws.id, mockId, session ? { session } : {});
366
+ return ok({ ...extra, workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
367
+ }));
368
+ server.registerTool("list_mock_sessions", {
369
+ title: "List a mock API's test sessions",
370
+ description: "Mock engine v2: the test sessions of a mock — every caller that sends X-Mock-Session: <id> gets its own copy of the data (seeded on first use, dropped after being idle), so parallel test runs never see each other's writes. Shows each session's id, when it was created / last used / expires and its record count. Read one session's data with query_mock_records { session }; reset it with reset_mock_data { session }.",
371
+ inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg },
372
+ annotations: READ,
373
+ }, guarded(async ({ workspace, mock, target }) => {
374
+ if (target === "desktop") {
375
+ const { ws, resolved, record } = await findLocal(ctx, workspace, mock);
376
+ const result = (await runLocalMockV2(ctx, ws, "sessions", { mockId: record.id, action: "list" }, "list_mock_sessions"));
377
+ return ok({ ...desktop, sessions: (result?.items ?? []).slice(0, LIMITS.LIST_MAX), total: result?.items?.length ?? 0, resolved: [resolvedSummary(mock, resolved)] });
378
+ }
379
+ const { ws, resolved, mockId } = await serverMock(ctx, workspace, mock, "list_mock_sessions", "sessions");
380
+ const { items } = await ctx.api.listMockSessions(ws.id, mockId);
381
+ return ok({ sessions: items.slice(0, LIMITS.LIST_MAX), total: items.length, header: "X-Mock-Session", workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
382
+ }));
383
+ };
384
+ //# sourceMappingURL=mockData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockData.js","sourceRoot":"","sources":["../../src/tools/mockData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import { type MockResource, type MockUserAuthConfig } from "callman-core/mock-engine";
2
+ import { z } from "zod";
3
+ import type { MockApiDetail } from "../client/types.js";
4
+ import type { ToolContext } from "../context.js";
5
+ import { type CurlRoute, type MockRouteInput } from "./mockShared.js";
6
+ import { type ResourceInput, type ResourcePatch, type SimpleFaultsInput, type UserAuthInput } from "./mockSchemas.js";
7
+ export interface MockEngine {
8
+ version: number;
9
+ features: string[];
10
+ limits: Record<string, number>;
11
+ }
12
+ export declare const mockEngineOf: (ctx: ToolContext, wsId: string) => Promise<MockEngine>;
13
+ export declare const requireEngine: (engine: MockEngine, used: Array<[string, string]>) => void;
14
+ export declare const requireRelayEngine: (ctx: ToolContext, wsId: string, what: string) => Promise<void>;
15
+ export declare const toServerResource: (input: ResourceInput | ResourcePatch, where: string, options?: {
16
+ partial?: boolean;
17
+ }) => Record<string, unknown>;
18
+ export declare const toServerUserAuth: (input: UserAuthInput, where: string) => Record<string, unknown>;
19
+ export interface DefinitionInput {
20
+ routes?: MockRouteInput[];
21
+ resources?: ResourceInput[];
22
+ userAuth?: UserAuthInput;
23
+ faults?: SimpleFaultsInput;
24
+ }
25
+ export declare const definitionFeatures: (input: DefinitionInput) => Array<[string, string]>;
26
+ export declare const toServerDefinition: (input: DefinitionInput) => Record<string, unknown>;
27
+ export declare const definitionIssues: (draft: Record<string, unknown>) => import("callman-core/mock-engine").MockDefinitionIssue[];
28
+ export declare const resourceView: (resource: MockResource, recordCount?: number) => {
29
+ recordCount?: number | undefined;
30
+ seed?: {
31
+ salt?: string | undefined;
32
+ generate?: number | undefined;
33
+ records?: string | undefined;
34
+ } | undefined;
35
+ endpoints: {
36
+ [k: string]: unknown;
37
+ };
38
+ list: import("callman-core/mock-engine").MockResourceListConfig;
39
+ protected?: boolean | {
40
+ roles: string[];
41
+ } | undefined;
42
+ ownerField?: string | undefined;
43
+ fields: import("callman-core/mock-engine").MockField[];
44
+ additionalFields: "strip" | "allow" | "reject";
45
+ timestamps: {
46
+ createdAt: string | null;
47
+ updatedAt: string | null;
48
+ };
49
+ allowClientId?: boolean | undefined;
50
+ lookupField?: string | undefined;
51
+ name: string;
52
+ resourceId: string;
53
+ basePath: string;
54
+ idField: string;
55
+ idStrategy: import("callman-core/mock-engine").MockIdStrategy;
56
+ };
57
+ export declare const userAuthView: (userAuth: (MockUserAuthConfig & {
58
+ hasSecret?: boolean;
59
+ }) | null | undefined) => {
60
+ enabled: boolean;
61
+ usersResource: string;
62
+ identityField: string;
63
+ passwordField: string;
64
+ tokenTtlSeconds: number;
65
+ issuer?: string;
66
+ audience?: string;
67
+ roleClaim?: string;
68
+ claims?: Record<string, string>;
69
+ protect: "none" | "resources" | "all";
70
+ endpoints: {
71
+ login: {
72
+ enabled: boolean;
73
+ path: string;
74
+ };
75
+ register: {
76
+ enabled: boolean;
77
+ path: string;
78
+ };
79
+ me: {
80
+ enabled: boolean;
81
+ path: string;
82
+ };
83
+ };
84
+ responses?: Partial<Record<"loginSuccess" | "loginFailure" | "unauthorized" | "forbidden", import("callman-core/mock-engine").MockOutcomeResponse>>;
85
+ } | undefined;
86
+ export declare const mockEngineView: (mock: MockApiDetail) => Record<string, unknown>;
87
+ export declare const resourceCalls: (baseUrl: string, resources: MockResource[], userAuth: MockUserAuthConfig | null | undefined, token: string | null | undefined) => {
88
+ resource: string;
89
+ endpoint: import("callman-core/mock-engine").MockResourceEndpointName;
90
+ route: string;
91
+ curl: string;
92
+ }[];
93
+ interface CallableRoute extends CurlRoute {
94
+ auth?: unknown;
95
+ }
96
+ export declare const definitionCalls: (baseUrl: string, definition: {
97
+ routes?: CallableRoute[];
98
+ resources?: MockResource[];
99
+ userAuth?: MockUserAuthConfig | null;
100
+ }, token: string | null | undefined) => {
101
+ route: string;
102
+ curl: string;
103
+ }[];
104
+ export declare const MOCK_TOKEN_HEADER = "X-Mock-Token";
105
+ export declare const mockAuthArg: z.ZodEnum<["public", "token"]>;
106
+ export declare const mockAuthView: (mock: MockApiDetail, token?: string | null, note?: string) => {
107
+ note?: string | undefined;
108
+ token: string;
109
+ type: string;
110
+ header: string;
111
+ } | {
112
+ note?: string | undefined;
113
+ tokenMasked: boolean;
114
+ type: string;
115
+ header: string;
116
+ } | {
117
+ type: string;
118
+ };
119
+ export declare const mockCalls: (mock: MockApiDetail, token?: string | null) => {
120
+ route: string;
121
+ curl: string;
122
+ }[];
123
+ export declare const userAuthCalls: (baseUrl: string, userAuth: MockUserAuthConfig | null | undefined, resources: MockResource[], token: string | null | undefined) => {
124
+ signIn: "login" | "register" | "me";
125
+ route: string;
126
+ curl: string;
127
+ }[];
128
+ export {};
129
+ //# sourceMappingURL=mockEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockEngine.d.ts","sourceRoot":"","sources":["../../src/tools/mockEngine.ts"],"names":[],"mappings":"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"}