@migma/mcp 1.7.2 → 1.7.4

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 (79) hide show
  1. package/README.md +71 -0
  2. package/build/index.d.ts +4 -0
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +15 -8
  5. package/build/index.js.map +1 -1
  6. package/build/profiles.d.ts +3 -0
  7. package/build/profiles.d.ts.map +1 -0
  8. package/build/profiles.js +10 -0
  9. package/build/profiles.js.map +1 -0
  10. package/build/prompts/index.d.ts.map +1 -1
  11. package/build/prompts/index.js +22 -9
  12. package/build/prompts/index.js.map +1 -1
  13. package/build/tools/__tests__/brand.test.d.ts +2 -0
  14. package/build/tools/__tests__/brand.test.d.ts.map +1 -0
  15. package/build/tools/__tests__/brand.test.js +36 -0
  16. package/build/tools/__tests__/brand.test.js.map +1 -0
  17. package/build/tools/__tests__/campaign-recipients.test.d.ts +2 -0
  18. package/build/tools/__tests__/campaign-recipients.test.d.ts.map +1 -0
  19. package/build/tools/__tests__/campaign-recipients.test.js +61 -0
  20. package/build/tools/__tests__/campaign-recipients.test.js.map +1 -0
  21. package/build/tools/__tests__/catalog.test.js +40 -4
  22. package/build/tools/__tests__/catalog.test.js.map +1 -1
  23. package/build/tools/__tests__/context.test.d.ts +2 -0
  24. package/build/tools/__tests__/context.test.d.ts.map +1 -0
  25. package/build/tools/__tests__/context.test.js +98 -0
  26. package/build/tools/__tests__/context.test.js.map +1 -0
  27. package/build/tools/__tests__/email-edit.test.d.ts +2 -0
  28. package/build/tools/__tests__/email-edit.test.d.ts.map +1 -0
  29. package/build/tools/__tests__/email-edit.test.js +82 -0
  30. package/build/tools/__tests__/email-edit.test.js.map +1 -0
  31. package/build/tools/__tests__/openai-profile.test.d.ts +2 -0
  32. package/build/tools/__tests__/openai-profile.test.d.ts.map +1 -0
  33. package/build/tools/__tests__/openai-profile.test.js +56 -0
  34. package/build/tools/__tests__/openai-profile.test.js.map +1 -0
  35. package/build/tools/__tests__/segments.test.d.ts +2 -0
  36. package/build/tools/__tests__/segments.test.d.ts.map +1 -0
  37. package/build/tools/__tests__/segments.test.js +149 -0
  38. package/build/tools/__tests__/segments.test.js.map +1 -0
  39. package/build/tools/annotations.d.ts +7 -0
  40. package/build/tools/annotations.d.ts.map +1 -1
  41. package/build/tools/annotations.js +2 -2
  42. package/build/tools/annotations.js.map +1 -1
  43. package/build/tools/billing.d.ts +2 -1
  44. package/build/tools/billing.d.ts.map +1 -1
  45. package/build/tools/billing.js +4 -3
  46. package/build/tools/billing.js.map +1 -1
  47. package/build/tools/brand.d.ts.map +1 -1
  48. package/build/tools/brand.js +12 -7
  49. package/build/tools/brand.js.map +1 -1
  50. package/build/tools/campaigns.d.ts.map +1 -1
  51. package/build/tools/campaigns.js +13 -1
  52. package/build/tools/campaigns.js.map +1 -1
  53. package/build/tools/capabilities.d.ts +5 -2
  54. package/build/tools/capabilities.d.ts.map +1 -1
  55. package/build/tools/capabilities.js +31 -16
  56. package/build/tools/capabilities.js.map +1 -1
  57. package/build/tools/contacts.js +5 -5
  58. package/build/tools/contacts.js.map +1 -1
  59. package/build/tools/context.d.ts +2 -1
  60. package/build/tools/context.d.ts.map +1 -1
  61. package/build/tools/context.js +57 -33
  62. package/build/tools/context.js.map +1 -1
  63. package/build/tools/domains.d.ts +2 -1
  64. package/build/tools/domains.d.ts.map +1 -1
  65. package/build/tools/domains.js +14 -11
  66. package/build/tools/domains.js.map +1 -1
  67. package/build/tools/email-edit-client.d.ts +15 -0
  68. package/build/tools/email-edit-client.d.ts.map +1 -0
  69. package/build/tools/email-edit-client.js +38 -0
  70. package/build/tools/email-edit-client.js.map +1 -0
  71. package/build/tools/generate.d.ts.map +1 -1
  72. package/build/tools/generate.js +36 -12
  73. package/build/tools/generate.js.map +1 -1
  74. package/build/tools/projects.js +6 -6
  75. package/build/tools/projects.js.map +1 -1
  76. package/build/tools/segments.d.ts.map +1 -1
  77. package/build/tools/segments.js +34 -2
  78. package/build/tools/segments.js.map +1 -1
  79. package/package.json +7 -3
@@ -0,0 +1,98 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { registerContextTools } from "../context.js";
5
+ const ok = (data) => Promise.resolve({ data, error: null });
6
+ const failed = () => Promise.resolve({ data: null, error: { message: "Unavailable" } });
7
+ const kit = {
8
+ _id: "brand-1", name: "Acme", colors: { accent: "#ff0000" },
9
+ fonts: [{ family: "Inter" }], logoUrls: { primary: "https://example.com/logo.png" },
10
+ };
11
+ function clientStub() {
12
+ return {
13
+ workspaces: { list: () => ok({ workspaces: [] }) },
14
+ projects: {
15
+ list: () => ok({ projects: [kit], pagination: { total: 1 } }),
16
+ get: (_id) => ok(kit),
17
+ references: (_id) => ok({ total: 0, references: [] }),
18
+ },
19
+ contacts: { list: (_params) => ok({ data: [], count: 0 }) },
20
+ domains: { list: () => ok([]) },
21
+ billing: { credits: () => ok({ hasCredits: true }) },
22
+ };
23
+ }
24
+ async function context(client, permissions, projectId, profile = "general") {
25
+ const server = new McpServer({ name: "test", version: "1" });
26
+ registerContextTools(server, client, permissions, undefined, profile);
27
+ const { migma_get_context } = server._registeredTools;
28
+ const result = await migma_get_context.handler({ projectId }, {});
29
+ return JSON.parse(result.content[0].text);
30
+ }
31
+ test("a complete brand kit without standing rules is not called missing", async () => {
32
+ const result = await context(clientStub());
33
+ assert.equal(result.setup.brandKit, "ready");
34
+ assert.equal(result.setup.guidelines, false);
35
+ assert.equal(result.setup.audience, 0);
36
+ assert.match(result.suggestions.join(" "), /brand guidelines/);
37
+ });
38
+ test("failed reads remain unknown and never trigger empty-account onboarding", async () => {
39
+ const client = clientStub();
40
+ client.projects.list = failed;
41
+ client.projects.get = failed;
42
+ client.projects.references = failed;
43
+ client.contacts.list = failed;
44
+ client.domains.list = failed;
45
+ const result = await context(client, undefined, "brand-1");
46
+ assert.equal(result.brandCount, null);
47
+ for (const key of ["brandKit", "guidelines", "references", "audience", "sendingDomain"]) {
48
+ assert.equal(result.setup[key], null, key);
49
+ }
50
+ assert.doesNotMatch(result.suggestions.join(" "), /No brand kit|Import it|migma_save_reference|migma_setup_domain/);
51
+ assert.ok(result.unavailable.includes("audience"));
52
+ });
53
+ test("read-only credentials never suggest hidden write tools", async () => {
54
+ const result = await context(clientStub(), ["email:read", "audience:read", "domain:read"]);
55
+ assert.doesNotMatch(result.suggestions.join(" "), /migma_(save_reference|update_brand_guidelines|create_contact_import|create_managed_domain|setup_domain)/);
56
+ });
57
+ test("multiple brands require a choice and use the full account count", async () => {
58
+ const client = clientStub();
59
+ client.projects.list = () => ok({ projects: [kit], pagination: { total: 101 } });
60
+ client.projects.get = () => { throw new Error("Must not pick first brand"); };
61
+ const result = await context(client);
62
+ assert.equal(result.brandCount, 101);
63
+ assert.equal(result.setup.brandId, null);
64
+ assert.match(result.suggestions[0], /which brand/);
65
+ });
66
+ test("explicit brand beyond first page drives every setup read", async () => {
67
+ const client = clientStub();
68
+ const calls = [];
69
+ client.projects.get = (id) => { calls.push(id); return ok({ ...kit, _id: id, name: "Selected" }); };
70
+ client.projects.references = (id) => { calls.push(id); return ok({ total: 3 }); };
71
+ client.contacts.list = (params) => { calls.push(params); return ok({ count: 12 }); };
72
+ const result = await context(client, undefined, "brand-200");
73
+ assert.deepEqual(calls, ["brand-200", "brand-200", { projectId: "brand-200", limit: 1 }]);
74
+ assert.equal(result.setup.brandName, "Selected");
75
+ assert.equal(result.setup.references, 3);
76
+ assert.equal(result.setup.audience, 12);
77
+ });
78
+ test("unavailable reference SDK and absent read permissions stay unknown", async () => {
79
+ const client = clientStub();
80
+ Reflect.deleteProperty(client.projects, "references");
81
+ client.contacts.list = () => { throw new Error("No audience read access"); };
82
+ client.domains.list = () => { throw new Error("No domain read access"); };
83
+ const result = await context(client, ["email:read", "project:write"]);
84
+ assert.equal(result.setup.references, null);
85
+ assert.equal(result.setup.audience, null);
86
+ assert.equal(result.setup.sendingDomain, null);
87
+ assert.doesNotMatch(result.suggestions.join(" "), /migma_save_reference|migma_create_contact_import|migma_setup_domain/);
88
+ });
89
+ test("OpenAI account context explains missing credits without suggesting checkout", async () => {
90
+ const client = clientStub();
91
+ client.billing.credits = () => ok({ hasCredits: false });
92
+ const general = await context(client);
93
+ assert.match(general.suggestions.join(" "), /migma_get_upgrade_link/);
94
+ const openai = await context(client, undefined, undefined, "openai");
95
+ assert.match(openai.suggestions.join(" "), /generation needs more credits/);
96
+ assert.doesNotMatch(openai.suggestions.join(" "), /upgrade|checkout|migma_get_upgrade_link/);
97
+ });
98
+ //# sourceMappingURL=context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/context.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=email-edit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-edit.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/email-edit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { createMigmaMcpServer } from "../../index.js";
4
+ function tools(emails, config = { apiKey: "test", baseUrl: "https://api.example.test/v1" }) {
5
+ const server = createMigmaMcpServer({ client: { emails }, config });
6
+ return server._registeredTools;
7
+ }
8
+ const data = (reply) => {
9
+ for (const item of reply.content) {
10
+ if (item.type !== 'text' || !item.text)
11
+ continue;
12
+ try {
13
+ return JSON.parse(item.text);
14
+ }
15
+ catch { /* Preview guidance precedes JSON. */ }
16
+ }
17
+ throw new Error('Missing JSON payload');
18
+ };
19
+ test('edit returns a queued handle without waiting, legacy editing, or preview fetch', async () => {
20
+ let starts = 0;
21
+ const registry = tools({
22
+ edit: () => { throw new Error('legacy edit must never run'); },
23
+ startEdit: async (emailId, params, options) => {
24
+ starts++;
25
+ assert.deepEqual(params, { prompt: 'Add Cursor + Grok Bot', label: undefined });
26
+ assert.deepEqual(options, { idempotencyKey: 'weekly-v2' });
27
+ return { data: { emailId, editId: 'edit-1', conversationId: 'conv-1', status: 'pending' } };
28
+ },
29
+ });
30
+ const result = data(await registry.migma_edit_email.handler({ emailId: 'email-1', prompt: 'Add Cursor + Grok Bot', idempotency_key: 'weekly-v2' }));
31
+ assert.equal(starts, 1);
32
+ assert.equal(result.status, 'pending');
33
+ assert.equal(result.editId, 'edit-1');
34
+ assert.equal(result.appUrl, 'https://migma.ai/chat?c=conv-1');
35
+ assert.match(result.nextStep, /migma_get_email_edit_status/);
36
+ });
37
+ test('status follows exact edit and exposes failures without another rewrite', async () => {
38
+ let state = 'processing';
39
+ const registry = tools({ getEditStatus: async (email, edit) => {
40
+ assert.equal(email, 'email-1');
41
+ assert.equal(edit, 'edit-1');
42
+ return { data: { editId: edit, status: state, ...(state === 'failed' ? { error: 'Provider failed', changesMayHaveBeenSaved: true }
43
+ : state === 'completed' ? { result: { emailId: email, conversationId: 'conv', html: '<p>updated</p>' } } : {}) } };
44
+ } });
45
+ const poll = (includeHtml = false) => registry.migma_get_email_edit_status.handler({ emailId: 'email-1', editId: 'edit-1', includeHtml });
46
+ assert.equal(data(await poll()).status, 'processing');
47
+ state = 'failed';
48
+ assert.equal(data(await poll()).error, 'Provider failed');
49
+ state = 'completed';
50
+ assert.equal(data(await poll()).result.html, undefined);
51
+ assert.equal(data(await poll(true)).result.html, '<p>updated</p>');
52
+ });
53
+ test('older SDK uses async REST with bounded wait and same replay key, never synchronous fallback', async () => {
54
+ const original = globalThis.fetch;
55
+ const calls = [];
56
+ globalThis.fetch = async (url, init) => {
57
+ calls.push({ url: String(url), init });
58
+ return new Response(JSON.stringify({ success: true, data: { editId: 'edit-1', emailId: 'email-1', status: 'pending' } }), { status: 202 });
59
+ };
60
+ try {
61
+ const registry = tools({ edit: () => { throw new Error('unsafe legacy call'); } });
62
+ await registry.migma_edit_email.handler({ emailId: 'email-1', prompt: 'Update', idempotency_key: 'stable-key' });
63
+ assert.equal(calls[0].url, 'https://api.example.test/v1/emails/email-1/edit');
64
+ assert.deepEqual(JSON.parse(String(calls[0].init?.body)), { prompt: 'Update', async: true });
65
+ assert.equal((calls[0].init?.headers)['Idempotency-Key'], 'stable-key');
66
+ assert.ok(calls[0].init?.signal);
67
+ await registry.migma_get_email_edit_status.handler({ emailId: 'email-1', editId: 'edit-1' });
68
+ assert.equal(calls[1].init?.method, 'GET');
69
+ assert.equal(calls[1].url, 'https://api.example.test/v1/emails/email-1/edits/edit-1');
70
+ }
71
+ finally {
72
+ globalThis.fetch = original;
73
+ }
74
+ });
75
+ test('uncertain submission preserves retry key and never claims processing', async () => {
76
+ const registry = tools({ startEdit: async () => ({ error: { message: 'Connection closed' } }) });
77
+ const reply = await registry.migma_edit_email.handler({ emailId: 'email-1', prompt: 'Update', idempotency_key: 'keep-me' });
78
+ assert.equal(reply.isError, true);
79
+ assert.equal(data(reply).idempotency_key, 'keep-me');
80
+ assert.equal(data(reply).status, undefined);
81
+ });
82
+ //# sourceMappingURL=email-edit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-edit.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/email-edit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openai-profile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-profile.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/openai-profile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
5
+ import { createMigmaMcpServer, createOpenAIMcpServer } from "../../index.js";
6
+ import { buildCapabilitiesPayload, TOOL_CATALOG } from "../capabilities.js";
7
+ const excluded = ["migma_search_buyable_domains", "migma_buy_domain", "migma_get_upgrade_link"];
8
+ test("OpenAI wire surface excludes commerce and rejects direct calls without accessing SDK", async () => {
9
+ const server = createOpenAIMcpServer({
10
+ getClient: () => { throw new Error("Must not call SDK"); },
11
+ });
12
+ const client = new Client({ name: "profile-test", version: "1" });
13
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
14
+ try {
15
+ await server.connect(serverTransport);
16
+ await client.connect(clientTransport);
17
+ const { tools } = await client.listTools();
18
+ const names = tools.map(tool => tool.name).sort();
19
+ assert.deepEqual(names, TOOL_CATALOG.map(tool => tool.name).filter(name => !excluded.includes(name)).sort());
20
+ for (const name of excluded) {
21
+ const result = await client.callTool({ name, arguments: {} });
22
+ assert.equal(result.isError, true, name);
23
+ assert.match(JSON.stringify(result), /not found/);
24
+ assert.doesNotMatch(JSON.stringify(result), /Must not call SDK/);
25
+ }
26
+ assert.doesNotMatch(JSON.stringify(tools), /migma_buy_domain|migma_search_buyable_domains|migma_get_upgrade_link/);
27
+ const capabilities = await client.callTool({ name: "migma_get_capabilities", arguments: {} });
28
+ assert.doesNotMatch(JSON.stringify(capabilities), /migma_buy_domain|migma_search_buyable_domains|migma_get_upgrade_link/);
29
+ assert.equal(client.getInstructions()?.includes("Checkout links"), false);
30
+ }
31
+ finally {
32
+ await client.close();
33
+ await server.close();
34
+ }
35
+ });
36
+ test("OpenAI catalog retains scope checks without advertising excluded tools as unlockable", () => {
37
+ const permissions = ["email:read", "domain:read", "billing:read"];
38
+ const payload = buildCapabilitiesPayload("test", permissions, "openai");
39
+ assert.equal(payload.tools.some(tool => tool.name === "migma_generate_email"), false);
40
+ assert.equal(payload.tools.some(tool => tool.name === "migma_get_domain_purchases"), true);
41
+ assert.equal(payload.tools.some(tool => tool.name === "migma_get_credits"), true);
42
+ assert.doesNotMatch(JSON.stringify(payload), /migma_buy_domain|migma_search_buyable_domains|migma_get_upgrade_link/);
43
+ const server = createOpenAIMcpServer({ permissions });
44
+ const tools = server._registeredTools;
45
+ assert.deepEqual(Object.keys(tools).sort(), payload.tools.map(tool => tool.name).sort());
46
+ });
47
+ test("general MCP retains commerce operations", () => {
48
+ const server = createMigmaMcpServer();
49
+ const tools = server._registeredTools;
50
+ const payload = buildCapabilitiesPayload("test");
51
+ for (const name of excluded) {
52
+ assert.ok(tools[name], name);
53
+ assert.ok(payload.tools.some(tool => tool.name === name), name);
54
+ }
55
+ });
56
+ //# sourceMappingURL=openai-profile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-profile.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/openai-profile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=segments.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segments.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/segments.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,149 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
5
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
6
+ import { registerSegmentTools } from "../segments.js";
7
+ function createTool() {
8
+ const calls = [];
9
+ const client = {
10
+ segments: {
11
+ create: async (body) => {
12
+ calls.push(body);
13
+ return { data: { id: "segment-1" } };
14
+ },
15
+ },
16
+ };
17
+ const server = new McpServer({ name: "test", version: "1" });
18
+ registerSegmentTools(server, client, { apiKey: "test", projectId: "brand-1" });
19
+ const registered = server._registeredTools;
20
+ return { tool: registered.migma_create_segment, calls, server };
21
+ }
22
+ const fields = [{ key: "country", mode: "is", values: ["US"] }];
23
+ test("create segment preserves omitted filters and legacy/all matching", async () => {
24
+ const { tool, calls } = createTool();
25
+ for (const filters of [undefined, { fields }, { match: "all", fields }]) {
26
+ const args = tool.inputSchema.parse({ name: "Readers", filters });
27
+ await tool.handler(args, {});
28
+ assert.deepEqual(calls.at(-1), {
29
+ name: "Readers", description: undefined, filters, projectId: "brand-1",
30
+ });
31
+ }
32
+ });
33
+ test("create segment accepts any global activity and forwards complete parsed filters", async () => {
34
+ const { tool, calls } = createTool();
35
+ const filters = {
36
+ match: "any", fields, tags: ["customers"], excludeTags: ["staff"],
37
+ activity: [{ action: "opened", mode: "within", unit: "days", amount: 30 }],
38
+ };
39
+ const args = tool.inputSchema.parse({ name: "Engaged readers", filters, projectId: "brand-2" });
40
+ await tool.handler(args, {});
41
+ assert.deepEqual(calls, [{
42
+ name: "Engaged readers", description: undefined, filters, projectId: "brand-2",
43
+ }]);
44
+ });
45
+ test("create segment rejects campaign-specific any while preserving campaign all", () => {
46
+ const { tool, calls } = createTool();
47
+ const filters = {
48
+ match: "any", fields,
49
+ activity: [{ action: "clicked", mode: "never", campaignId: "campaign-1" }],
50
+ };
51
+ const result = tool.inputSchema.safeParse({ name: "Readers", filters });
52
+ assert.equal(result.success, false);
53
+ if (!result.success)
54
+ assert.deepEqual(result.error.issues[0].path, ["filters", "match"]);
55
+ assert.equal(tool.inputSchema.safeParse({ name: "Readers", filters: { ...filters, match: "all" } }).success, true);
56
+ assert.deepEqual(calls, []);
57
+ });
58
+ test("create segment forwards nested mixed groups without flattening or dropping conditions", async () => {
59
+ const { tool, calls } = createTool();
60
+ const filters = {
61
+ match: "all",
62
+ status: "subscribed",
63
+ groups: [{
64
+ match: "any",
65
+ fields,
66
+ groups: [{
67
+ tags: ["customers"], excludeTags: ["staff"], validationStatus: "valid",
68
+ customFields: { tier: ["premium"] },
69
+ groups: [{ activity: [{ action: "clicked", mode: "within", unit: "days", amount: 7 }] }],
70
+ }],
71
+ }],
72
+ };
73
+ const args = tool.inputSchema.parse({ name: "Mixed audience", filters });
74
+ await tool.handler(args, {});
75
+ assert.deepEqual(calls, [{
76
+ name: "Mixed audience", description: undefined, filters, projectId: "brand-1",
77
+ }]);
78
+ });
79
+ test("campaign activity requires all ancestors but allows an unrelated any sibling", () => {
80
+ const { tool } = createTool();
81
+ const campaign = { activity: [{ action: "clicked", mode: "never", campaignId: "campaign-1" }] };
82
+ for (const { filters, path } of [
83
+ { filters: { match: "any", groups: [campaign] }, path: ["filters", "match"] },
84
+ { filters: { groups: [{ match: "any", groups: [campaign] }] }, path: ["filters", "groups", 0, "match"] },
85
+ { filters: { groups: [{ ...campaign, match: "any" }] }, path: ["filters", "groups", 0, "match"] },
86
+ ]) {
87
+ const result = tool.inputSchema.safeParse({ name: "Readers", filters });
88
+ assert.equal(result.success, false);
89
+ if (!result.success) {
90
+ assert.deepEqual(result.error.issues[0].path, path);
91
+ }
92
+ }
93
+ assert.equal(tool.inputSchema.safeParse({
94
+ name: "Readers", filters: { groups: [campaign, { match: "any", tags: ["customers"], fields }] },
95
+ }).success, true);
96
+ });
97
+ test("root may be empty but nested groups must contain a condition", () => {
98
+ const { tool } = createTool();
99
+ for (const empty of [{}, { match: "any" }, { groups: [] }, { tags: [], excludeTags: [], customFields: { tier: [] } }]) {
100
+ assert.equal(tool.inputSchema.safeParse({ name: "Everyone", filters: empty }).success, true);
101
+ const result = tool.inputSchema.safeParse({ name: "Empty group", filters: { groups: [empty] } });
102
+ assert.equal(result.success, false);
103
+ if (!result.success)
104
+ assert.deepEqual(result.error.issues[0].path, ["filters", "groups", 0]);
105
+ }
106
+ });
107
+ test("nested group depth and child count are bounded", () => {
108
+ const { tool } = createTool();
109
+ const atDepthThree = { groups: [{ groups: [{ groups: [{ status: "subscribed" }] }] }] };
110
+ assert.equal(tool.inputSchema.safeParse({ name: "Three levels", filters: atDepthThree }).success, true);
111
+ assert.equal(tool.inputSchema.safeParse({ name: "Four levels", filters: { groups: [atDepthThree] } }).success, false);
112
+ assert.equal(tool.inputSchema.safeParse({ name: "Invalid fourth level", filters: {
113
+ groups: [{ groups: [{ groups: [{ groups: [null] }] }] }],
114
+ } }).success, false);
115
+ const groups = Array.from({ length: 10 }, () => ({ status: "subscribed" }));
116
+ assert.equal(tool.inputSchema.safeParse({ name: "Ten children", filters: { groups } }).success, true);
117
+ assert.equal(tool.inputSchema.safeParse({ name: "Eleven children", filters: { groups: [...groups, groups[0]] } }).success, false);
118
+ });
119
+ test("condition cap counts leaves across groups, not array values or group containers", () => {
120
+ const { tool } = createTool();
121
+ const groups = Array.from({ length: 5 }, () => ({ fields: Array.from({ length: 10 }, () => fields[0]) }));
122
+ assert.equal(tool.inputSchema.safeParse({ name: "Fifty conditions", filters: { groups } }).success, true);
123
+ assert.equal(tool.inputSchema.safeParse({ name: "Fifty-one conditions", filters: { status: "subscribed", groups } }).success, false);
124
+ const manyValues = Array.from({ length: 100 }, (_, index) => `list-${index}`);
125
+ assert.equal(tool.inputSchema.safeParse({ name: "One condition", filters: { groups: [{ tags: manyValues }] } }).success, true);
126
+ const fiftyCustomFields = Object.fromEntries(Array.from({ length: 50 }, (_, index) => [`key-${index}`, ["value"]]));
127
+ assert.equal(tool.inputSchema.safeParse({ name: "Fifty fields", filters: { customFields: fiftyCustomFields } }).success, true);
128
+ assert.equal(tool.inputSchema.safeParse({ name: "Fifty-one fields", filters: { customFields: fiftyCustomFields, excludeTags: ["staff"] } }).success, false);
129
+ });
130
+ test("MCP advertises bounded nested groups in the create tool JSON schema", async () => {
131
+ const { server } = createTool();
132
+ const client = new Client({ name: "test-client", version: "1" });
133
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
134
+ await server.connect(serverTransport);
135
+ await client.connect(clientTransport);
136
+ try {
137
+ const { tools } = await client.listTools();
138
+ const schema = tools.find((tool) => tool.name === "migma_create_segment")?.inputSchema;
139
+ assert.ok(schema);
140
+ const serialized = JSON.stringify(schema);
141
+ assert.match(serialized, /"groups"/);
142
+ assert.match(serialized, /"maxItems":0/);
143
+ }
144
+ finally {
145
+ await client.close();
146
+ await server.close();
147
+ }
148
+ });
149
+ //# sourceMappingURL=segments.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segments.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/segments.test.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,13 @@ export declare const READ_ONLY_TOOL: {
5
5
  idempotentHint?: boolean | undefined;
6
6
  openWorldHint?: boolean | undefined;
7
7
  };
8
+ export declare const OPEN_WORLD_READ_ONLY_TOOL: {
9
+ title?: string | undefined;
10
+ readOnlyHint?: boolean | undefined;
11
+ destructiveHint?: boolean | undefined;
12
+ idempotentHint?: boolean | undefined;
13
+ openWorldHint?: boolean | undefined;
14
+ };
8
15
  export declare const MUTATING_TOOL: {
9
16
  title?: string | undefined;
10
17
  readOnlyHint?: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,cAAc;;;;;;CAAwC,CAAC;AACpE,eAAO,MAAM,aAAa;;;;;;CAA0C,CAAC;AACrE,eAAO,MAAM,wBAAwB;;;;;;CAAyC,CAAC;AAC/E,eAAO,MAAM,wBAAwB;;;;;;CAAyC,CAAC;AAC/E,eAAO,MAAM,mCAAmC;;;;;;CAK/C,CAAC;AACF,eAAO,MAAM,gBAAgB;;;;;;CAAyC,CAAC;AACvE,eAAO,MAAM,2BAA2B;;;;;;CAAwC,CAAC;AACjF,eAAO,MAAM,sCAAsC;;;;;;CAKlD,CAAC"}
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,cAAc;;;;;;CAAwC,CAAC;AACpE,eAAO,MAAM,yBAAyB;;;;;;CAAuC,CAAC;AAC9E,eAAO,MAAM,aAAa;;;;;;CAA0C,CAAC;AACrE,eAAO,MAAM,wBAAwB;;;;;;CAAyC,CAAC;AAC/E,eAAO,MAAM,wBAAwB;;;;;;CAAyC,CAAC;AAC/E,eAAO,MAAM,mCAAmC;;;;;;CAK/C,CAAC;AACF,eAAO,MAAM,gBAAgB;;;;;;CAAyC,CAAC;AACvE,eAAO,MAAM,2BAA2B;;;;;;CAAwC,CAAC;AACjF,eAAO,MAAM,sCAAsC;;;;;;CAKlD,CAAC"}
@@ -6,9 +6,9 @@ function annotations(readOnlyHint, destructiveHint, idempotentHint, openWorldHin
6
6
  openWorldHint,
7
7
  };
8
8
  }
9
- // Keep every hint explicit. OpenAI's plugin review asks for a justification for
10
- // each advertised value, and omitted hints can be interpreted as unsafe defaults.
9
+ // Keep every hint explicit and tied to behavior; omitted hints use MCP defaults.
11
10
  export const READ_ONLY_TOOL = annotations(true, false, true, false);
11
+ export const OPEN_WORLD_READ_ONLY_TOOL = annotations(true, false, true, true);
12
12
  export const MUTATING_TOOL = annotations(false, false, false, false);
13
13
  export const IDEMPOTENT_MUTATING_TOOL = annotations(false, false, true, false);
14
14
  export const OPEN_WORLD_MUTATING_TOOL = annotations(false, false, false, true);
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAClB,YAAqB,EACrB,eAAwB,EACxB,cAAuB,EACvB,aAAsB;IAEtB,OAAO;QACL,YAAY;QACZ,eAAe;QACf,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,mCAAmC,GAAG,WAAW,CAC5D,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,CACL,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,2BAA2B,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACjF,MAAM,CAAC,MAAM,sCAAsC,GAAG,WAAW,CAC/D,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC"}
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAClB,YAAqB,EACrB,eAAwB,EACxB,cAAuB,EACvB,aAAsB;IAEtB,OAAO;QACL,YAAY;QACZ,eAAe;QACf,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,mCAAmC,GAAG,WAAW,CAC5D,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,CACL,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,2BAA2B,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACjF,MAAM,CAAC,MAAM,sCAAsC,GAAG,WAAW,CAC/D,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import type { Migma } from "migma";
3
- export declare function registerBillingTools(server: McpServer, client: Migma, grantedPermissions?: string[]): void;
3
+ import { type MigmaMcpProfile } from "../profiles.js";
4
+ export declare function registerBillingTools(server: McpServer, client: Migma, grantedPermissions?: string[], profile?: MigmaMcpProfile): void;
4
5
  //# sourceMappingURL=billing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAcnC,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,kBAAkB,CAAC,EAAE,MAAM,EAAE,QA2C9B"}
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAGnC,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAYvE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAC7B,OAAO,GAAE,eAA2B,QA2CrC"}
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { canUse } from "../permissions.js";
3
+ import { isToolInProfile } from "../profiles.js";
3
4
  import { OPEN_WORLD_MUTATING_TOOL, READ_ONLY_TOOL } from "./annotations.js";
4
5
  const UPGRADE_PLANS = [
5
6
  "basic",
@@ -9,7 +10,7 @@ const UPGRADE_PLANS = [
9
10
  "premium_annual",
10
11
  "business_annual",
11
12
  ];
12
- export function registerBillingTools(server, client, grantedPermissions) {
13
+ export function registerBillingTools(server, client, grantedPermissions, profile = "general") {
13
14
  if (canUse(grantedPermissions, ["billing:read"])) {
14
15
  server.registerTool("migma_get_credits", {
15
16
  title: "Get Plan & Credits",
@@ -22,11 +23,11 @@ export function registerBillingTools(server, client, grantedPermissions) {
22
23
  return toolResult(data);
23
24
  });
24
25
  }
25
- if (canUse(grantedPermissions, ["billing:write"])) {
26
+ if (isToolInProfile("migma_get_upgrade_link", profile) && canUse(grantedPermissions, ["billing:write"])) {
26
27
  server.registerTool("migma_get_upgrade_link", {
27
28
  title: "Get Upgrade Link",
28
29
  annotations: OPEN_WORLD_MUTATING_TOOL,
29
- description: "Mint a Stripe link the user opens in their browser to upgrade or manage their Migma subscription. Nothing is charged by this call. Pass plan for a checkout link (new subscribers); omit plan to get the billing portal (existing subscribers). Use when the user is out of credits or needs a paid plan (e.g. to buy a domain). The user completes checkout in their own browser.",
30
+ description: "Mint a Stripe link the user opens in their browser to upgrade or manage their Migma subscription. Nothing is charged by this call. Pass plan for a checkout link (new subscribers); omit plan to get the billing portal (existing subscribers). Use when the user asks to upgrade or manage their subscription. The user completes checkout in their own browser.",
30
31
  inputSchema: z.object({
31
32
  plan: z
32
33
  .enum(UPGRADE_PLANS)
@@ -1 +1 @@
1
- {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,aAAa,GAAG;IACpB,OAAO;IACP,SAAS;IACT,UAAU;IACV,cAAc;IACd,gBAAgB;IAChB,iBAAiB;CACT,CAAC;AAEX,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAa,EACb,kBAA6B;IAE7B,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;YACE,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE,cAAc;YAC3B,WAAW,EACT,4LAA4L;SAC/L,EACD,KAAK,IAAI,EAAE;YACT,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvD,IAAI,KAAK;gBAAE,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;YACE,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,wBAAwB;YACrC,WAAW,EACT,oXAAoX;YACtX,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,IAAI,EAAE,CAAC;qBACJ,IAAI,CAAC,aAAa,CAAC;qBACnB,QAAQ,EAAE;qBACV,QAAQ,CACP,0HAA0H,CAC3H;aACJ,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,IAAI,KAAK;gBAAE,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SAC/D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/tools/billing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,aAAa,GAAG;IACpB,OAAO;IACP,SAAS;IACT,UAAU;IACV,cAAc;IACd,gBAAgB;IAChB,iBAAiB;CACT,CAAC;AAEX,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,MAAa,EACb,kBAA6B,EAC7B,UAA2B,SAAS;IAEpC,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;YACE,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE,cAAc;YAC3B,WAAW,EACT,4LAA4L;SAC/L,EACD,KAAK,IAAI,EAAE;YACT,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvD,IAAI,KAAK;gBAAE,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,CAAC,wBAAwB,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACxG,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;YACE,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE,wBAAwB;YACrC,WAAW,EACT,mWAAmW;YACrW,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,IAAI,EAAE,CAAC;qBACJ,IAAI,CAAC,aAAa,CAAC;qBACnB,QAAQ,EAAE;qBACV,QAAQ,CACP,0HAA0H,CAC3H;aACJ,CAAC;SACH,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,IAAI,KAAK;gBAAE,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;SAC/D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/tools/brand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA6D3C,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,QA+H9B"}
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/tools/brand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA6D3C,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAoI9B"}