@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.
- package/README.md +71 -0
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +15 -8
- package/build/index.js.map +1 -1
- package/build/profiles.d.ts +3 -0
- package/build/profiles.d.ts.map +1 -0
- package/build/profiles.js +10 -0
- package/build/profiles.js.map +1 -0
- package/build/prompts/index.d.ts.map +1 -1
- package/build/prompts/index.js +22 -9
- package/build/prompts/index.js.map +1 -1
- package/build/tools/__tests__/brand.test.d.ts +2 -0
- package/build/tools/__tests__/brand.test.d.ts.map +1 -0
- package/build/tools/__tests__/brand.test.js +36 -0
- package/build/tools/__tests__/brand.test.js.map +1 -0
- package/build/tools/__tests__/campaign-recipients.test.d.ts +2 -0
- package/build/tools/__tests__/campaign-recipients.test.d.ts.map +1 -0
- package/build/tools/__tests__/campaign-recipients.test.js +61 -0
- package/build/tools/__tests__/campaign-recipients.test.js.map +1 -0
- package/build/tools/__tests__/catalog.test.js +40 -4
- package/build/tools/__tests__/catalog.test.js.map +1 -1
- package/build/tools/__tests__/context.test.d.ts +2 -0
- package/build/tools/__tests__/context.test.d.ts.map +1 -0
- package/build/tools/__tests__/context.test.js +98 -0
- package/build/tools/__tests__/context.test.js.map +1 -0
- package/build/tools/__tests__/email-edit.test.d.ts +2 -0
- package/build/tools/__tests__/email-edit.test.d.ts.map +1 -0
- package/build/tools/__tests__/email-edit.test.js +82 -0
- package/build/tools/__tests__/email-edit.test.js.map +1 -0
- package/build/tools/__tests__/openai-profile.test.d.ts +2 -0
- package/build/tools/__tests__/openai-profile.test.d.ts.map +1 -0
- package/build/tools/__tests__/openai-profile.test.js +56 -0
- package/build/tools/__tests__/openai-profile.test.js.map +1 -0
- package/build/tools/__tests__/segments.test.d.ts +2 -0
- package/build/tools/__tests__/segments.test.d.ts.map +1 -0
- package/build/tools/__tests__/segments.test.js +149 -0
- package/build/tools/__tests__/segments.test.js.map +1 -0
- package/build/tools/annotations.d.ts +7 -0
- package/build/tools/annotations.d.ts.map +1 -1
- package/build/tools/annotations.js +2 -2
- package/build/tools/annotations.js.map +1 -1
- package/build/tools/billing.d.ts +2 -1
- package/build/tools/billing.d.ts.map +1 -1
- package/build/tools/billing.js +4 -3
- package/build/tools/billing.js.map +1 -1
- package/build/tools/brand.d.ts.map +1 -1
- package/build/tools/brand.js +12 -7
- package/build/tools/brand.js.map +1 -1
- package/build/tools/campaigns.d.ts.map +1 -1
- package/build/tools/campaigns.js +13 -1
- package/build/tools/campaigns.js.map +1 -1
- package/build/tools/capabilities.d.ts +5 -2
- package/build/tools/capabilities.d.ts.map +1 -1
- package/build/tools/capabilities.js +31 -16
- package/build/tools/capabilities.js.map +1 -1
- package/build/tools/contacts.js +5 -5
- package/build/tools/contacts.js.map +1 -1
- package/build/tools/context.d.ts +2 -1
- package/build/tools/context.d.ts.map +1 -1
- package/build/tools/context.js +57 -33
- package/build/tools/context.js.map +1 -1
- package/build/tools/domains.d.ts +2 -1
- package/build/tools/domains.d.ts.map +1 -1
- package/build/tools/domains.js +14 -11
- package/build/tools/domains.js.map +1 -1
- package/build/tools/email-edit-client.d.ts +15 -0
- package/build/tools/email-edit-client.d.ts.map +1 -0
- package/build/tools/email-edit-client.js +38 -0
- package/build/tools/email-edit-client.js.map +1 -0
- package/build/tools/generate.d.ts.map +1 -1
- package/build/tools/generate.js +36 -12
- package/build/tools/generate.js.map +1 -1
- package/build/tools/projects.js +6 -6
- package/build/tools/projects.js.map +1 -1
- package/build/tools/segments.d.ts.map +1 -1
- package/build/tools/segments.js +34 -2
- package/build/tools/segments.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"
|
|
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
|
|
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,
|
|
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"}
|
package/build/tools/billing.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { Migma } from "migma";
|
|
3
|
-
|
|
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;
|
|
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"}
|
package/build/tools/billing.js
CHANGED
|
@@ -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
|
|
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;
|
|
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,
|
|
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"}
|