@retailcrm/embed-ui-v1-endpoint 0.9.21 → 0.9.22-alpha.1

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 (46) hide show
  1. package/README.md +70 -11
  2. package/bin/embed-ui-v1-endpoint-mcp.mjs +10 -0
  3. package/bin/embed-ui-v1-endpoint.mjs +416 -0
  4. package/dist/common/targets.cjs +61 -130
  5. package/dist/common/targets.d.ts +38 -27
  6. package/dist/common/targets.documentation.d.ts +302 -0
  7. package/dist/common/targets.js +61 -130
  8. package/dist/mcp/server.cjs +115 -0
  9. package/dist/mcp/server.d.ts +3 -0
  10. package/dist/mcp/server.js +97 -0
  11. package/dist/meta.json +618 -0
  12. package/docs/README.md +8 -6
  13. package/docs/create-endpoint.md +8 -10
  14. package/docs/define-page-runner.md +3 -3
  15. package/docs/define-widget-runner.md +2 -2
  16. package/docs/layout.md +14 -37
  17. package/docs/menu-placements.md +11 -13
  18. package/docs/page-routes.md +12 -14
  19. package/docs/run-endpoint.md +4 -4
  20. package/docs/targets/customer-card-communications-after.yml +48 -0
  21. package/docs/targets/customer-card-inwork-after.yml +48 -0
  22. package/docs/targets/customer-card-inwork-before.yml +48 -0
  23. package/docs/targets/customer-card-phone.yml +49 -0
  24. package/docs/targets/order-card-comment-manager-before.yml +51 -0
  25. package/docs/targets/order-card-common-after.yml +51 -0
  26. package/docs/targets/order-card-common-before.yml +51 -0
  27. package/docs/targets/order-card-customer-after.yml +51 -0
  28. package/docs/targets/order-card-customer-before.yml +51 -0
  29. package/docs/targets/order-card-customer-email.yml +51 -0
  30. package/docs/targets/order-card-customer-phone.yml +51 -0
  31. package/docs/targets/order-card-delivery-address.yml +51 -0
  32. package/docs/targets/order-card-delivery-after.yml +51 -0
  33. package/docs/targets/order-card-delivery-before.yml +51 -0
  34. package/docs/targets/order-card-dimensions-before.yml +51 -0
  35. package/docs/targets/order-card-list-after.yml +51 -0
  36. package/docs/targets/order-card-list-before.yml +51 -0
  37. package/docs/targets/order-card-payment-before.yml +51 -0
  38. package/docs/targets/order-card-store-before.yml +51 -0
  39. package/docs/targets/order-mg-delivery-after.yml +51 -0
  40. package/docs/targets/order-mg-delivery-before.yml +51 -0
  41. package/docs/targets/order-mg-list-after.yml +51 -0
  42. package/docs/targets/order-mg-list-before.yml +51 -0
  43. package/docs/targets/order-mg-payment-after.yml +51 -0
  44. package/docs/targets/order-mg-payment-before.yml +51 -0
  45. package/docs/targets.md +42 -17
  46. package/package.json +27 -7
@@ -1,140 +1,71 @@
1
- const defineTarget = (id, contexts) => ({
2
- id,
3
- contexts
4
- });
5
- const targets = {
6
- "customer/card:phone": defineTarget("customer/card:phone", [
7
- "customer/card",
8
- "customer/card:phone",
9
- "user/current",
10
- "settings"
11
- ]),
12
- "customer/card:communications.after": defineTarget("customer/card:communications.after", [
13
- "customer/card",
14
- "user/current",
15
- "settings"
16
- ]),
17
- "customer/card:inWork.before": defineTarget("customer/card:inWork.before", [
18
- "customer/card",
19
- "user/current",
20
- "settings"
21
- ]),
22
- "customer/card:inWork.after": defineTarget("customer/card:inWork.after", [
1
+ const isTargetConfig = (configOrContexts) => !Array.isArray(configOrContexts);
2
+ function defineTarget(id, configOrContexts) {
3
+ if (isTargetConfig(configOrContexts)) {
4
+ return {
5
+ id,
6
+ ...configOrContexts
7
+ };
8
+ }
9
+ return {
10
+ id,
11
+ contexts: configOrContexts,
12
+ customContexts: [],
13
+ actions: []
14
+ };
15
+ }
16
+ const customerCardTarget = {
17
+ contexts: [
23
18
  "customer/card",
24
19
  "user/current",
25
20
  "settings"
26
- ]),
27
- "order/card:common.before": defineTarget("order/card:common.before", [
28
- "order/card",
29
- "user/current",
30
- "settings"
31
- ]),
32
- "order/card:common.after": defineTarget("order/card:common.after", [
33
- "order/card",
34
- "user/current",
35
- "settings"
36
- ]),
37
- "order/card:customer.before": defineTarget("order/card:customer.before", [
38
- "order/card",
39
- "user/current",
40
- "settings"
41
- ]),
42
- "order/card:customer.after": defineTarget("order/card:customer.after", [
43
- "order/card",
44
- "user/current",
45
- "settings"
46
- ]),
47
- "order/card:customer.email": defineTarget("order/card:customer.email", [
48
- "order/card",
49
- "user/current",
50
- "settings"
51
- ]),
52
- "order/card:customer.phone": defineTarget("order/card:customer.phone", [
53
- "order/card",
54
- "user/current",
55
- "settings"
56
- ]),
57
- "order/card:list.before": defineTarget("order/card:list.before", [
58
- "order/card",
59
- "user/current",
60
- "settings"
61
- ]),
62
- "order/card:list.after": defineTarget("order/card:list.after", [
63
- "order/card",
64
- "user/current",
65
- "settings"
66
- ]),
67
- "order/card:store.before": defineTarget("order/card:store.before", [
68
- "order/card",
69
- "user/current",
70
- "settings"
71
- ]),
72
- "order/card:dimensions.before": defineTarget("order/card:dimensions.before", [
73
- "order/card",
74
- "user/current",
75
- "settings"
76
- ]),
77
- "order/card:delivery.before": defineTarget("order/card:delivery.before", [
78
- "order/card",
79
- "user/current",
80
- "settings"
81
- ]),
82
- "order/card:delivery.after": defineTarget("order/card:delivery.after", [
83
- "order/card",
84
- "user/current",
85
- "settings"
86
- ]),
87
- "order/card:delivery.address": defineTarget("order/card:delivery.address", [
88
- "order/card",
89
- "user/current",
90
- "settings"
91
- ]),
92
- "order/card:payment.before": defineTarget("order/card:payment.before", [
93
- "order/card",
94
- "user/current",
95
- "settings"
96
- ]),
97
- "order/card:comment.manager.before": defineTarget("order/card:comment.manager.before", [
98
- "order/card",
99
- "user/current",
100
- "settings"
101
- ]),
102
- "order/mg:list.before": defineTarget("order/mg:list.before", [
103
- "order/card",
104
- "order/card:settings",
105
- "user/current",
106
- "settings"
107
- ]),
108
- "order/mg:list.after": defineTarget("order/mg:list.after", [
109
- "order/card",
110
- "order/card:settings",
111
- "user/current",
112
- "settings"
113
- ]),
114
- "order/mg:delivery.before": defineTarget("order/mg:delivery.before", [
115
- "order/card",
116
- "order/card:settings",
117
- "user/current",
118
- "settings"
119
- ]),
120
- "order/mg:delivery.after": defineTarget("order/mg:delivery.after", [
121
- "order/card",
122
- "order/card:settings",
123
- "user/current",
124
- "settings"
125
- ]),
126
- "order/mg:payment.before": defineTarget("order/mg:payment.before", [
127
- "order/card",
128
- "order/card:settings",
129
- "user/current",
130
- "settings"
131
- ]),
132
- "order/mg:payment.after": defineTarget("order/mg:payment.after", [
21
+ ],
22
+ customContexts: ["customer"],
23
+ actions: []
24
+ };
25
+ const orderFormTarget = {
26
+ contexts: [
133
27
  "order/card",
134
28
  "order/card:settings",
135
29
  "user/current",
136
30
  "settings"
137
- ])
31
+ ],
32
+ customContexts: ["order"],
33
+ actions: ["order/card"]
34
+ };
35
+ const targets = {
36
+ "customer/card:phone": defineTarget("customer/card:phone", {
37
+ ...customerCardTarget,
38
+ contexts: [
39
+ "customer/card",
40
+ "customer/card:phone",
41
+ "user/current",
42
+ "settings"
43
+ ]
44
+ }),
45
+ "customer/card:communications.after": defineTarget("customer/card:communications.after", customerCardTarget),
46
+ "customer/card:inWork.before": defineTarget("customer/card:inWork.before", customerCardTarget),
47
+ "customer/card:inWork.after": defineTarget("customer/card:inWork.after", customerCardTarget),
48
+ "order/card:common.before": defineTarget("order/card:common.before", orderFormTarget),
49
+ "order/card:common.after": defineTarget("order/card:common.after", orderFormTarget),
50
+ "order/card:customer.before": defineTarget("order/card:customer.before", orderFormTarget),
51
+ "order/card:customer.after": defineTarget("order/card:customer.after", orderFormTarget),
52
+ "order/card:customer.email": defineTarget("order/card:customer.email", orderFormTarget),
53
+ "order/card:customer.phone": defineTarget("order/card:customer.phone", orderFormTarget),
54
+ "order/card:list.before": defineTarget("order/card:list.before", orderFormTarget),
55
+ "order/card:list.after": defineTarget("order/card:list.after", orderFormTarget),
56
+ "order/card:store.before": defineTarget("order/card:store.before", orderFormTarget),
57
+ "order/card:dimensions.before": defineTarget("order/card:dimensions.before", orderFormTarget),
58
+ "order/card:delivery.before": defineTarget("order/card:delivery.before", orderFormTarget),
59
+ "order/card:delivery.after": defineTarget("order/card:delivery.after", orderFormTarget),
60
+ "order/card:delivery.address": defineTarget("order/card:delivery.address", orderFormTarget),
61
+ "order/card:payment.before": defineTarget("order/card:payment.before", orderFormTarget),
62
+ "order/card:comment.manager.before": defineTarget("order/card:comment.manager.before", orderFormTarget),
63
+ "order/mg:list.before": defineTarget("order/mg:list.before", orderFormTarget),
64
+ "order/mg:list.after": defineTarget("order/mg:list.after", orderFormTarget),
65
+ "order/mg:delivery.before": defineTarget("order/mg:delivery.before", orderFormTarget),
66
+ "order/mg:delivery.after": defineTarget("order/mg:delivery.after", orderFormTarget),
67
+ "order/mg:payment.before": defineTarget("order/mg:payment.before", orderFormTarget),
68
+ "order/mg:payment.after": defineTarget("order/mg:payment.after", orderFormTarget)
138
69
  };
139
70
  export {
140
71
  defineTarget,
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const fs = require("node:fs");
4
+ const process = require("node:process");
5
+ const node_url = require("node:url");
6
+ const node_path = require("node:path");
7
+ const mcp_js = require("@modelcontextprotocol/sdk/server/mcp.js");
8
+ const stdio_js = require("@modelcontextprotocol/sdk/server/stdio.js");
9
+ var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
10
+ function _interopNamespaceDefault(e) {
11
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
12
+ if (e) {
13
+ for (const k in e) {
14
+ if (k !== "default") {
15
+ const d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: () => e[k]
19
+ });
20
+ }
21
+ }
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+ const fs__namespace = /* @__PURE__ */ _interopNamespaceDefault(fs);
27
+ const packageRoot = node_path.resolve(node_path.dirname(node_url.fileURLToPath(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("server.cjs", document.baseURI).href)), "../..");
28
+ const targetDocs = node_path.join(packageRoot, "docs/targets");
29
+ const packageJson = node_path.join(packageRoot, "package.json");
30
+ const targetUri = (target) => `embed-ui-v1-endpoint://targets/${encodeURIComponent(target)}`;
31
+ const readPackageVersion = () => {
32
+ const content = fs__namespace.readFileSync(packageJson, "utf8");
33
+ return JSON.parse(content).version;
34
+ };
35
+ const readTargetProfiles = () => {
36
+ if (!fs__namespace.existsSync(targetDocs)) {
37
+ return [];
38
+ }
39
+ return fs__namespace.readdirSync(targetDocs).filter((file) => file.endsWith(".yml")).sort().map((file) => {
40
+ const content = fs__namespace.readFileSync(node_path.join(targetDocs, file), "utf8");
41
+ const target = content.match(/^target: "(.+)"$/m)?.[1];
42
+ if (!target) {
43
+ throw new Error(`Target profile ${file} does not contain target field`);
44
+ }
45
+ return {
46
+ id: target,
47
+ file,
48
+ uri: targetUri(target),
49
+ content
50
+ };
51
+ });
52
+ };
53
+ const waitForCloseSignal = () => {
54
+ const keepAlive = setInterval(() => void 0, 2 ** 31 - 1);
55
+ process.stdin.resume();
56
+ return new Promise((resolve2) => {
57
+ const close = () => {
58
+ clearInterval(keepAlive);
59
+ resolve2();
60
+ };
61
+ process.once("SIGINT", close);
62
+ process.once("SIGTERM", close);
63
+ });
64
+ };
65
+ const createEndpointMcpServer = () => {
66
+ const server = new mcp_js.McpServer({
67
+ name: "@retailcrm/embed-ui-v1-endpoint",
68
+ version: readPackageVersion()
69
+ });
70
+ const targets = readTargetProfiles();
71
+ server.registerResource("v1-endpoint targets index", "embed-ui-v1-endpoint://targets", {
72
+ title: "v1-endpoint widget targets index",
73
+ description: "Machine-readable index of built-in widget targets provided by @retailcrm/embed-ui-v1-endpoint.",
74
+ mimeType: "application/json"
75
+ }, (uri) => ({
76
+ contents: [{
77
+ uri: uri.href,
78
+ mimeType: "application/json",
79
+ text: JSON.stringify({
80
+ package: "@retailcrm/embed-ui-v1-endpoint",
81
+ resources: targets.map((target) => ({
82
+ target: target.id,
83
+ uri: target.uri,
84
+ file: `docs/targets/${target.file}`
85
+ }))
86
+ }, null, 2)
87
+ }]
88
+ }));
89
+ for (const target of targets) {
90
+ server.registerResource(`v1-endpoint target ${target.id}`, target.uri, {
91
+ title: `Target ${target.id}`,
92
+ description: `AI-friendly YAML profile for widget target ${target.id}.`,
93
+ mimeType: "application/yaml",
94
+ annotations: {
95
+ audience: ["assistant"],
96
+ priority: 0.8
97
+ }
98
+ }, (uri) => ({
99
+ contents: [{
100
+ uri: uri.href,
101
+ mimeType: "application/yaml",
102
+ text: target.content
103
+ }]
104
+ }));
105
+ }
106
+ return server;
107
+ };
108
+ const runEndpointMcpServer = async () => {
109
+ const server = createEndpointMcpServer();
110
+ await server.connect(new stdio_js.StdioServerTransport());
111
+ await waitForCloseSignal();
112
+ await server.close();
113
+ };
114
+ exports.createEndpointMcpServer = createEndpointMcpServer;
115
+ exports.runEndpointMcpServer = runEndpointMcpServer;
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const createEndpointMcpServer: () => McpServer;
3
+ export declare const runEndpointMcpServer: () => Promise<void>;
@@ -0,0 +1,97 @@
1
+ import * as fs from "node:fs";
2
+ import process from "node:process";
3
+ import { fileURLToPath } from "node:url";
4
+ import { resolve, dirname, join } from "node:path";
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
8
+ const targetDocs = join(packageRoot, "docs/targets");
9
+ const packageJson = join(packageRoot, "package.json");
10
+ const targetUri = (target) => `embed-ui-v1-endpoint://targets/${encodeURIComponent(target)}`;
11
+ const readPackageVersion = () => {
12
+ const content = fs.readFileSync(packageJson, "utf8");
13
+ return JSON.parse(content).version;
14
+ };
15
+ const readTargetProfiles = () => {
16
+ if (!fs.existsSync(targetDocs)) {
17
+ return [];
18
+ }
19
+ return fs.readdirSync(targetDocs).filter((file) => file.endsWith(".yml")).sort().map((file) => {
20
+ const content = fs.readFileSync(join(targetDocs, file), "utf8");
21
+ const target = content.match(/^target: "(.+)"$/m)?.[1];
22
+ if (!target) {
23
+ throw new Error(`Target profile ${file} does not contain target field`);
24
+ }
25
+ return {
26
+ id: target,
27
+ file,
28
+ uri: targetUri(target),
29
+ content
30
+ };
31
+ });
32
+ };
33
+ const waitForCloseSignal = () => {
34
+ const keepAlive = setInterval(() => void 0, 2 ** 31 - 1);
35
+ process.stdin.resume();
36
+ return new Promise((resolve2) => {
37
+ const close = () => {
38
+ clearInterval(keepAlive);
39
+ resolve2();
40
+ };
41
+ process.once("SIGINT", close);
42
+ process.once("SIGTERM", close);
43
+ });
44
+ };
45
+ const createEndpointMcpServer = () => {
46
+ const server = new McpServer({
47
+ name: "@retailcrm/embed-ui-v1-endpoint",
48
+ version: readPackageVersion()
49
+ });
50
+ const targets = readTargetProfiles();
51
+ server.registerResource("v1-endpoint targets index", "embed-ui-v1-endpoint://targets", {
52
+ title: "v1-endpoint widget targets index",
53
+ description: "Machine-readable index of built-in widget targets provided by @retailcrm/embed-ui-v1-endpoint.",
54
+ mimeType: "application/json"
55
+ }, (uri) => ({
56
+ contents: [{
57
+ uri: uri.href,
58
+ mimeType: "application/json",
59
+ text: JSON.stringify({
60
+ package: "@retailcrm/embed-ui-v1-endpoint",
61
+ resources: targets.map((target) => ({
62
+ target: target.id,
63
+ uri: target.uri,
64
+ file: `docs/targets/${target.file}`
65
+ }))
66
+ }, null, 2)
67
+ }]
68
+ }));
69
+ for (const target of targets) {
70
+ server.registerResource(`v1-endpoint target ${target.id}`, target.uri, {
71
+ title: `Target ${target.id}`,
72
+ description: `AI-friendly YAML profile for widget target ${target.id}.`,
73
+ mimeType: "application/yaml",
74
+ annotations: {
75
+ audience: ["assistant"],
76
+ priority: 0.8
77
+ }
78
+ }, (uri) => ({
79
+ contents: [{
80
+ uri: uri.href,
81
+ mimeType: "application/yaml",
82
+ text: target.content
83
+ }]
84
+ }));
85
+ }
86
+ return server;
87
+ };
88
+ const runEndpointMcpServer = async () => {
89
+ const server = createEndpointMcpServer();
90
+ await server.connect(new StdioServerTransport());
91
+ await waitForCloseSignal();
92
+ await server.close();
93
+ };
94
+ export {
95
+ createEndpointMcpServer,
96
+ runEndpointMcpServer
97
+ };