@supportbridge/sdk 0.8.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 (79) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +13 -0
  3. package/README.md +326 -0
  4. package/SECURITY.md +26 -0
  5. package/dist/agent.d.ts +9 -0
  6. package/dist/agent.d.ts.map +1 -0
  7. package/dist/agent.js +73 -0
  8. package/dist/agent.js.map +1 -0
  9. package/dist/client.d.ts +68 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +254 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/context.d.ts +4 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +9 -0
  16. package/dist/context.js.map +1 -0
  17. package/dist/control-plane.d.ts +37 -0
  18. package/dist/control-plane.d.ts.map +1 -0
  19. package/dist/control-plane.js +43 -0
  20. package/dist/control-plane.js.map +1 -0
  21. package/dist/doctor.d.ts +17 -0
  22. package/dist/doctor.d.ts.map +1 -0
  23. package/dist/doctor.js +49 -0
  24. package/dist/doctor.js.map +1 -0
  25. package/dist/index.d.ts +30 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +16 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/install.d.ts +42 -0
  30. package/dist/install.d.ts.map +1 -0
  31. package/dist/install.js +215 -0
  32. package/dist/install.js.map +1 -0
  33. package/dist/mcp-app.d.ts +50 -0
  34. package/dist/mcp-app.d.ts.map +1 -0
  35. package/dist/mcp-app.js +44 -0
  36. package/dist/mcp-app.js.map +1 -0
  37. package/dist/mcp.d.ts +44 -0
  38. package/dist/mcp.d.ts.map +1 -0
  39. package/dist/mcp.js +117 -0
  40. package/dist/mcp.js.map +1 -0
  41. package/dist/offer-app.d.ts +41 -0
  42. package/dist/offer-app.d.ts.map +1 -0
  43. package/dist/offer-app.js +21 -0
  44. package/dist/offer-app.js.map +1 -0
  45. package/dist/policy-app.d.ts +41 -0
  46. package/dist/policy-app.d.ts.map +1 -0
  47. package/dist/policy-app.js +49 -0
  48. package/dist/policy-app.js.map +1 -0
  49. package/dist/policy-store.d.ts +79 -0
  50. package/dist/policy-store.d.ts.map +1 -0
  51. package/dist/policy-store.js +137 -0
  52. package/dist/policy-store.js.map +1 -0
  53. package/dist/policy.d.ts +226 -0
  54. package/dist/policy.d.ts.map +1 -0
  55. package/dist/policy.js +420 -0
  56. package/dist/policy.js.map +1 -0
  57. package/dist/sanitize.d.ts +9 -0
  58. package/dist/sanitize.d.ts.map +1 -0
  59. package/dist/sanitize.js +83 -0
  60. package/dist/sanitize.js.map +1 -0
  61. package/dist/state.d.ts +31 -0
  62. package/dist/state.d.ts.map +1 -0
  63. package/dist/state.js +29 -0
  64. package/dist/state.js.map +1 -0
  65. package/dist/transport.d.ts +57 -0
  66. package/dist/transport.d.ts.map +1 -0
  67. package/dist/transport.js +132 -0
  68. package/dist/transport.js.map +1 -0
  69. package/dist/triggers.d.ts +19 -0
  70. package/dist/triggers.d.ts.map +1 -0
  71. package/dist/triggers.js +132 -0
  72. package/dist/triggers.js.map +1 -0
  73. package/dist/types.d.ts +221 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/dist/types.js +2 -0
  76. package/dist/types.js.map +1 -0
  77. package/docs/policy-engine.md +47 -0
  78. package/docs/telemetry-contract.md +29 -0
  79. package/package.json +53 -0
@@ -0,0 +1,215 @@
1
+ import { registerAppResource, registerAppTool } from "@modelcontextprotocol/ext-apps/server";
2
+ import { z } from "zod";
3
+ import { SupportBridgeClient } from "./client.js";
4
+ import { SupportBridgeControlPlane } from "./control-plane.js";
5
+ import { createSupportChatApp, workingConversation } from "./mcp-app.js";
6
+ import { createPolicyBuilderApp } from "./policy-app.js";
7
+ import { instrumentMcpTool, supportDecisionTools } from "./mcp.js";
8
+ export class SupportBridge {
9
+ static install(server, options) {
10
+ return installSupportBridge(server, options);
11
+ }
12
+ }
13
+ export function installSupportBridge(server, options) {
14
+ const baseUrl = (options.baseUrl ?? "https://supportbridge-control-plane.onrender.com").replace(/\/$/, "");
15
+ const client = new SupportBridgeClient({
16
+ source: options.source,
17
+ endpoint: `${baseUrl}/v1/events`,
18
+ apiKey: options.apiKey,
19
+ ...(options.environment ? { environment: options.environment } : {}),
20
+ ...(options.serviceVersion ? { serviceVersion: options.serviceVersion } : {}),
21
+ ...(options.privacy ? { privacy: options.privacy } : {}),
22
+ ...options.client
23
+ });
24
+ const controlPlane = new SupportBridgeControlPlane(client, {
25
+ baseUrl,
26
+ apiKey: options.apiKey,
27
+ ...(options.policyRefreshIntervalMs ? { refreshIntervalMs: options.policyRefreshIntervalMs } : {}),
28
+ ...(options.fetch ? { fetch: options.fetch } : {})
29
+ });
30
+ const app = createSupportChatApp(controlPlane, options.app);
31
+ const policyApp = createPolicyBuilderApp(options.policyApp?.resourceUri ? { resourceUri: options.policyApp.resourceUri } : {});
32
+ const decisions = supportDecisionTools(client, options.identify, { controlPlane, appMeta: app.toolMeta });
33
+ registerAppTool(server, "talk_to_support", {
34
+ title: "Talk to human support",
35
+ description: "Open a live human-support request. Call only after the user agrees to contact support. Returns a session ID used by the support messaging tools.",
36
+ inputSchema: z.object({
37
+ issue_summary: z.string().min(1).max(2_000),
38
+ customer: z.string().max(300).optional(),
39
+ error_code: z.string().max(300).optional(),
40
+ priority: z.enum(["normal", "urgent"]).optional()
41
+ }),
42
+ _meta: app.toolMeta
43
+ }, async (arguments_, context) => {
44
+ const identity = await options.identify(context);
45
+ if (!identity)
46
+ return { isError: true, content: [{ type: "text", text: "An authenticated user is required to open support." }] };
47
+ const brief = client.buildSupportBrief(identity, arguments_.issue_summary);
48
+ const ticket = await controlPlane.createTicket({
49
+ identity,
50
+ issue: arguments_.issue_summary ?? brief.issue,
51
+ ...(arguments_.customer ?? brief.customer ? { customer: arguments_.customer ?? brief.customer } : {}),
52
+ ...(arguments_.error_code ?? brief.errorCode ? { errorCode: arguments_.error_code ?? brief.errorCode } : {}),
53
+ ...(arguments_.priority ? { priority: arguments_.priority } : {})
54
+ });
55
+ return {
56
+ content: [{ type: "text", text: `Support chat ${ticket.id} opened.` }],
57
+ structuredContent: workingConversation({ ticket, messages: [] }, ticket.id),
58
+ _meta: app.toolMeta
59
+ };
60
+ });
61
+ registerAppTool(server, "request_assistance", {
62
+ title: "Request available representative",
63
+ description: "Accept an available sales, success, or support representative's assistance offer and open the live conversation. Call only after the user agrees.",
64
+ inputSchema: z.object({
65
+ trigger_id: z.string().min(1),
66
+ issue_summary: z.string().min(1).max(2_000),
67
+ customer: z.string().max(300).optional(),
68
+ priority: z.enum(["normal", "urgent"]).optional()
69
+ }),
70
+ _meta: app.toolMeta
71
+ }, async (arguments_, context) => {
72
+ const identity = await options.identify(context);
73
+ if (!identity)
74
+ return { isError: true, content: [{ type: "text", text: "An authenticated user is required to request assistance." }] };
75
+ await client.decideSupport(arguments_.trigger_id, identity, "accepted");
76
+ const ticket = await controlPlane.createTicket({ identity, issue: arguments_.issue_summary, triggerId: arguments_.trigger_id, requestType: "assistance", ...(arguments_.customer ? { customer: arguments_.customer } : {}), ...(arguments_.priority ? { priority: arguments_.priority } : {}) });
77
+ return { content: [{ type: "text", text: `Live assistance ${ticket.id} opened.` }], structuredContent: workingConversation({ ticket, messages: [] }, ticket.id), _meta: app.toolMeta };
78
+ });
79
+ registerAppTool(server, "open_support_chat", {
80
+ title: "Open existing support chat",
81
+ description: "Reopen the embedded live-chat window for an existing support session. This does not create a new ticket.",
82
+ inputSchema: z.object({ session_id: z.string().min(1) }),
83
+ _meta: app.toolMeta
84
+ }, async ({ session_id }) => ({
85
+ content: [{ type: "text", text: `Support chat ${session_id} opened.` }],
86
+ structuredContent: workingConversation(await controlPlane.getChat(session_id), session_id),
87
+ _meta: app.toolMeta
88
+ }));
89
+ registerAppTool(server, "accept_support_offer", {
90
+ title: "Open support chat",
91
+ description: "Accept a pending human-support offer and open the live support conversation. Call only after the user agrees.",
92
+ inputSchema: z.object({
93
+ trigger_id: z.string().min(1),
94
+ issue_summary: z.string().max(2_000).optional(),
95
+ customer: z.string().max(300).optional(),
96
+ error_code: z.string().max(300).optional(),
97
+ priority: z.enum(["normal", "urgent"]).optional()
98
+ }),
99
+ _meta: app.toolMeta
100
+ }, decisions.accept_support_offer);
101
+ registerAppTool(server, "dismiss_support_offer", {
102
+ title: "Decline support",
103
+ description: "Decline a pending human-support offer, allowing the original request to be retried.",
104
+ inputSchema: z.object({ trigger_id: z.string().min(1), reason: z.string().max(1_000).optional() }),
105
+ _meta: { ui: { visibility: ["model"] } }
106
+ }, decisions.dismiss_support_offer);
107
+ const appOnlyMeta = { ui: { resourceUri: app.resourceUri, visibility: ["app"] } };
108
+ registerAppTool(server, "get_support_chat", {
109
+ title: "Refresh support chat",
110
+ inputSchema: z.object({ ticket_id: z.string().min(1) }),
111
+ _meta: appOnlyMeta
112
+ }, app.tools.get_support_chat);
113
+ registerAppTool(server, "send_support_message", {
114
+ title: "Send support message",
115
+ inputSchema: z.object({
116
+ ticket_id: z.string().min(1), text: z.string().min(1).max(4_000), sender_name: z.string().max(200).optional()
117
+ }),
118
+ _meta: appOnlyMeta
119
+ }, app.tools.send_support_message);
120
+ const workingToolMeta = { ui: { visibility: ["model", "app"] } };
121
+ registerAppTool(server, "support_get_messages", {
122
+ title: "Check support messages",
123
+ description: "Check a support session for replies and return the complete transcript and status.",
124
+ inputSchema: z.object({ session_id: z.string().min(1) }),
125
+ _meta: workingToolMeta
126
+ }, app.tools.support_get_messages);
127
+ registerAppTool(server, "support_send_message", {
128
+ title: "Message support",
129
+ description: "Send a message from the MCP user to the human representative.",
130
+ inputSchema: z.object({ session_id: z.string().min(1), message: z.string().min(1).max(4_000) }),
131
+ _meta: workingToolMeta
132
+ }, app.tools.support_send_message);
133
+ registerAppTool(server, "support_end_session", {
134
+ title: "End support chat",
135
+ description: "End the user's human-support session.",
136
+ inputSchema: z.object({ session_id: z.string().min(1) }),
137
+ _meta: workingToolMeta
138
+ }, app.tools.support_end_session);
139
+ registerAppTool(server, "support_reopen_session", {
140
+ title: "Reopen support chat",
141
+ description: "Reopen a resolved human-support session.",
142
+ inputSchema: z.object({ session_id: z.string().min(1) }),
143
+ _meta: workingToolMeta
144
+ }, app.tools.support_reopen_session);
145
+ registerAppResource(server, "SupportBridge chat", app.resourceUri, {
146
+ mimeType: app.mimeType,
147
+ _meta: app.resourceMeta
148
+ }, async () => app.resourceContents());
149
+ if (options.policyApp?.enabled !== false) {
150
+ registerAppTool(server, "open_policy_builder", {
151
+ title: "Open policy builder",
152
+ description: "Open the interactive SupportBridge policy builder. Generated policies are drafts only and require explicit review and approval.",
153
+ inputSchema: z.object({ prompt: z.string().max(4_000).optional() }),
154
+ _meta: policyApp.toolMeta
155
+ }, async ({ prompt }, context) => {
156
+ const identity = await options.identify(context);
157
+ if (!identity?.workspaceId)
158
+ return { isError: true, content: [{ type: "text", text: "An authenticated workspace administrator is required." }] };
159
+ const generated = await policyApp.tools.generate_policy_draft({ prompt: prompt ?? "Create a new policy", workspace_id: identity.workspaceId, environment_id: options.environment, actor_id: identity.userId });
160
+ return { ...generated, _meta: policyApp.toolMeta };
161
+ });
162
+ const policyAppOnlyMeta = { ui: { resourceUri: policyApp.resourceUri, visibility: ["app"] } };
163
+ registerAppTool(server, "generate_policy_draft", {
164
+ title: "Generate policy draft",
165
+ inputSchema: z.object({ prompt: z.string().min(1).max(4_000), workspace_id: z.string().min(1), environment_id: z.string().optional(), actor_id: z.string().min(1) }),
166
+ _meta: policyAppOnlyMeta
167
+ }, policyApp.tools.generate_policy_draft);
168
+ registerAppTool(server, "validate_policy_draft", {
169
+ title: "Validate policy draft",
170
+ inputSchema: z.object({ policy: z.unknown() }),
171
+ _meta: policyAppOnlyMeta
172
+ }, async ({ policy }) => policyApp.tools.validate_policy_draft({ policy: policy }));
173
+ registerAppTool(server, "simulate_policy_draft", {
174
+ title: "Simulate policy draft",
175
+ inputSchema: z.object({ policy: z.unknown(), facts: z.record(z.unknown()), event_type: z.string().optional() }),
176
+ _meta: policyAppOnlyMeta
177
+ }, async ({ policy, ...arguments_ }) => policyApp.tools.simulate_policy_draft({ policy: policy, ...arguments_ }));
178
+ registerAppResource(server, "SupportBridge policy builder", policyApp.resourceUri, {
179
+ mimeType: policyApp.mimeType,
180
+ _meta: policyApp.resourceMeta
181
+ }, async () => policyApp.resourceContents());
182
+ }
183
+ controlPlane.startPolicySync();
184
+ client.recordDiagnostic("installation_verified", "SupportBridge MCP integration installed", {
185
+ telemetry: true,
186
+ policies: true,
187
+ mcpApp: true,
188
+ chat: true,
189
+ policyEngine: true,
190
+ policyBuilderApp: options.policyApp?.enabled !== false,
191
+ sdkVersion: "0.8.1",
192
+ resourceUri: app.resourceUri
193
+ });
194
+ const shutdown = () => void installation.close();
195
+ const installation = {
196
+ client,
197
+ controlPlane,
198
+ resourceUri: app.resourceUri,
199
+ ...(options.policyApp?.enabled !== false ? { policyResourceUri: policyApp.resourceUri } : {}),
200
+ instrumentTool: (toolName, handler, localOptions = {}) => instrumentMcpTool(client, toolName, handler, {
201
+ ...localOptions,
202
+ identify: (_arguments, context) => options.identify(context)
203
+ }),
204
+ close: async () => {
205
+ process.off("SIGTERM", shutdown);
206
+ process.off("SIGINT", shutdown);
207
+ controlPlane.stopPolicySync();
208
+ await client.close();
209
+ }
210
+ };
211
+ process.once("SIGTERM", shutdown);
212
+ process.once("SIGINT", shutdown);
213
+ return installation;
214
+ }
215
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { SupportBridgeControlPlane } from "./control-plane.js";
2
+ import type { McpToolResult } from "./mcp.js";
3
+ export declare const SUPPORT_CHAT_RESOURCE_URI = "ui://supportbridge/chat-v0.8.1.html";
4
+ export declare const SUPPORT_CHAT_MIME_TYPE = "text/html;profile=mcp-app";
5
+ export interface SupportChatAppOptions {
6
+ resourceUri?: string;
7
+ title?: string;
8
+ pollIntervalMs?: number;
9
+ }
10
+ export interface SupportChatApp {
11
+ resourceUri: string;
12
+ mimeType: typeof SUPPORT_CHAT_MIME_TYPE;
13
+ toolMeta: Record<string, unknown>;
14
+ resourceMeta: Record<string, unknown>;
15
+ resourceContents(): {
16
+ contents: Array<{
17
+ uri: string;
18
+ mimeType: string;
19
+ text: string;
20
+ _meta: Record<string, unknown>;
21
+ }>;
22
+ };
23
+ tools: {
24
+ get_support_chat(arguments_: {
25
+ ticket_id: string;
26
+ }): Promise<McpToolResult>;
27
+ send_support_message(arguments_: {
28
+ ticket_id: string;
29
+ text: string;
30
+ sender_name?: string | undefined;
31
+ }): Promise<McpToolResult>;
32
+ support_get_messages(arguments_: {
33
+ session_id: string;
34
+ }): Promise<McpToolResult>;
35
+ support_send_message(arguments_: {
36
+ session_id: string;
37
+ message: string;
38
+ }): Promise<McpToolResult>;
39
+ support_end_session(arguments_: {
40
+ session_id: string;
41
+ }): Promise<McpToolResult>;
42
+ support_reopen_session(arguments_: {
43
+ session_id: string;
44
+ }): Promise<McpToolResult>;
45
+ };
46
+ }
47
+ /** Implements the protocol contract used by the known-working SupportBridge connector. */
48
+ export declare function createSupportChatApp(controlPlane: SupportBridgeControlPlane, options?: SupportChatAppOptions): SupportChatApp;
49
+ export declare function workingConversation(value: unknown, fallbackId?: string): Record<string, unknown>;
50
+ //# sourceMappingURL=mcp-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-app.d.ts","sourceRoot":"","sources":["../src/mcp-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,yBAAyB,wCAAwC,CAAC;AAC/E,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAElE,MAAM,WAAW,qBAAqB;IAAG,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAAE;AACzG,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,sBAAsB,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,gBAAgB,IAAI;QAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACzH,KAAK,EAAE;QACL,gBAAgB,CAAC,UAAU,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAC5E,oBAAoB,CAAC,UAAU,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAChI,oBAAoB,CAAC,UAAU,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACjF,oBAAoB,CAAC,UAAU,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAClG,mBAAmB,CAAC,UAAU,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAChF,sBAAsB,CAAC,UAAU,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;KACpF,CAAC;CACH;AAED,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,yBAAyB,EAAE,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAqBjI;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMhG"}
@@ -0,0 +1,44 @@
1
+ export const SUPPORT_CHAT_RESOURCE_URI = "ui://supportbridge/chat-v0.8.1.html";
2
+ export const SUPPORT_CHAT_MIME_TYPE = "text/html;profile=mcp-app";
3
+ /** Implements the protocol contract used by the known-working SupportBridge connector. */
4
+ export function createSupportChatApp(controlPlane, options = {}) {
5
+ const resourceUri = options.resourceUri ?? SUPPORT_CHAT_RESOURCE_URI;
6
+ const title = options.title ?? "Talk to Support";
7
+ const pollIntervalMs = Math.max(1_000, options.pollIntervalMs ?? 2_000);
8
+ const toolMeta = { ui: { resourceUri, visibility: ["model", "app"] }, "ui/resourceUri": resourceUri };
9
+ const getConversation = async (ticketId) => workingConversation(await controlPlane.getChat(ticketId), ticketId);
10
+ return {
11
+ resourceUri,
12
+ mimeType: SUPPORT_CHAT_MIME_TYPE,
13
+ toolMeta,
14
+ resourceMeta: { ui: { preferredFrameSize: { width: 680, height: 540 } } },
15
+ resourceContents: () => ({ contents: [{ uri: resourceUri, mimeType: SUPPORT_CHAT_MIME_TYPE, text: supportChatHtml(title, pollIntervalMs), _meta: { ui: { preferredFrameSize: { width: 680, height: 540 } } } }] }),
16
+ tools: {
17
+ get_support_chat: async ({ ticket_id }) => result("Support conversation refreshed.", await getConversation(ticket_id)),
18
+ send_support_message: async ({ ticket_id, text, sender_name }) => { await controlPlane.sendUserMessage(ticket_id, text, sender_name); return result("Message sent to support.", await getConversation(ticket_id)); },
19
+ support_get_messages: async ({ session_id }) => result("Support conversation refreshed.", await getConversation(session_id)),
20
+ support_send_message: async ({ session_id, message }) => { await controlPlane.sendUserMessage(session_id, message); return result("Message sent to support.", await getConversation(session_id)); },
21
+ support_end_session: async ({ session_id }) => result("Support conversation ended.", workingConversation(await controlPlane.endChat(session_id), session_id)),
22
+ support_reopen_session: async ({ session_id }) => result("Support conversation reopened.", workingConversation(await controlPlane.reopenChat(session_id), session_id))
23
+ }
24
+ };
25
+ }
26
+ export function workingConversation(value, fallbackId) {
27
+ const body = record(value), sourceSession = record(body.session ?? body.ticket);
28
+ const sessionId = string(sourceSession.id) || string(body.session_id) || string(body.ticketId) || fallbackId || "";
29
+ const session = { ...sourceSession, id: sessionId, status: string(sourceSession.status) || string(body.status) || "queued", ...(sourceSession.assignedTo && !sourceSession.agent_name ? { agent_name: sourceSession.assignedTo } : {}) };
30
+ const messages = Array.isArray(body.messages) ? body.messages.map(item => { const message = record(item); return { ...message, created_at: message.created_at ?? message.createdAt ?? new Date().toISOString(), sender_name: message.sender_name ?? message.senderName }; }) : [];
31
+ return { session_id: sessionId, status: session.status, session, messages };
32
+ }
33
+ function result(text, structuredContent) { return { content: [{ type: "text", text }], structuredContent }; }
34
+ function record(value) { return value && typeof value === "object" && !Array.isArray(value) ? value : {}; }
35
+ function string(value) { return typeof value === "string" ? value : ""; }
36
+ function supportChatHtml(title, pollIntervalMs) {
37
+ const config = JSON.stringify({ title, pollIntervalMs }).replace(/</g, "\\u003c");
38
+ return `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><style>
39
+ :root{font:14px Inter,ui-sans-serif,system-ui,-apple-system,sans-serif;color:#17211b;color-scheme:light;--brand:#176b49;--brand-soft:#dff3e8;--line:#dde5df;--muted:#68766d;--surface:#fff;--chat:#f6f8f6}*{box-sizing:border-box}body{margin:0;background:transparent}.app{position:relative;border:1px solid var(--line);border-radius:18px;overflow:hidden;background:var(--surface);min-height:480px;box-shadow:0 8px 28px rgba(31,54,41,.08);transition:min-height .2s ease}.head{display:flex;align-items:center;gap:12px;padding:14px 16px;border-bottom:1px solid var(--line);min-height:72px}.avatar{width:38px;height:38px;border-radius:50%;display:grid;place-items:center;background:var(--brand);color:#fff;font-weight:800;box-shadow:inset 0 0 0 2px rgba(255,255,255,.35)}.identity{min-width:0;flex:1}.brand{font-weight:800;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.presence{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:12px;margin-top:3px}.dot{width:7px;height:7px;border-radius:50%;background:#2aa66a}.dot.waiting{background:#e4a832}.dot.closed{background:#9aa49d}.head-actions{display:flex;align-items:center;gap:5px}.icon-button,.send-button{border:0;cursor:pointer;display:grid;place-items:center}.icon-button{width:34px;height:34px;border-radius:9px;background:transparent;color:#536158;font-size:17px}.icon-button:hover{background:#eef2ef}.details{position:relative}.details summary{list-style:none}.details summary::-webkit-details-marker{display:none}.details-card{position:absolute;right:0;top:40px;z-index:4;width:230px;padding:12px;border:1px solid var(--line);border-radius:12px;background:#fff;box-shadow:0 10px 30px rgba(20,40,28,.15);font-size:12px;color:var(--muted)}.details-card code{display:block;margin-top:4px;color:#34443a;overflow-wrap:anywhere}.chat-wrap{position:relative}.chat{height:334px;overflow:auto;padding:16px;background:var(--chat);scroll-behavior:smooth}.empty{text-align:center;color:var(--muted);padding:90px 20px}.row{display:flex;gap:8px;align-items:flex-end;margin:11px 0}.row.user{justify-content:flex-end}.row.support{justify-content:flex-start}.message-avatar{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;flex:0 0 auto;background:#d9e8de;color:#26573e;font-size:11px;font-weight:800}.message-wrap{max-width:74%}.sender{font-size:11px;font-weight:700;color:#657269;margin:0 0 4px 3px}.bubble{padding:10px 12px;border-radius:15px 15px 15px 5px;background:#fff;border:1px solid #e2e8e3;box-shadow:0 1px 2px rgba(26,46,34,.04);white-space:pre-wrap;overflow-wrap:anywhere}.user .bubble{border:0;border-radius:15px 15px 5px 15px;background:var(--brand);color:#fff}.meta{display:flex;gap:5px;align-items:center;margin-top:4px;padding:0 3px;color:#849087;font-size:10px}.user .meta{justify-content:flex-end}.system-row{text-align:center;margin:14px 0}.system-pill{display:inline-flex;align-items:center;gap:5px;max-width:90%;padding:5px 9px;border-radius:999px;background:#e9eeea;color:#6b786f;font-size:11px}.unread{position:absolute;left:50%;bottom:12px;transform:translateX(-50%);border:1px solid #cfe0d4;border-radius:999px;padding:7px 11px;background:#fff;color:var(--brand);font-weight:750;box-shadow:0 4px 14px rgba(24,57,38,.13);cursor:pointer}.composer-area{border-top:1px solid var(--line);background:#fff}.composer{display:flex;align-items:flex-end;gap:8px;padding:11px 12px 7px}.composer textarea{flex:1;min-width:0;max-height:110px;resize:none;padding:11px 13px;border:1px solid #cbd6ce;border-radius:13px;background:#fff;color:#17211b;font:inherit;line-height:20px;outline:none}.composer textarea:focus{border-color:#4a9970;box-shadow:0 0 0 3px rgba(36,126,78,.1)}.send-button{width:42px;height:42px;flex:0 0 auto;border-radius:12px;background:var(--brand);color:#fff;font-size:19px}.send-button:disabled{opacity:.42;cursor:default}.composer-foot{display:flex;align-items:center;justify-content:space-between;min-height:29px;padding:0 13px 8px;color:#879188;font-size:11px}.close-button,.reopen-button{border:0;background:transparent;color:#657169;font:inherit;font-weight:700;cursor:pointer}.reopen-panel{display:none;padding:15px;text-align:center;border-top:1px solid var(--line);background:#fff}.reopen-panel p{margin:0 0 9px;color:var(--muted);font-size:12px}.reopen-button{padding:9px 14px;border-radius:10px;background:#e5f2e9;color:var(--brand)}.app.closed .composer-area{display:none}.app.closed .reopen-panel{display:block}.app.compact{min-height:0}.app.compact .chat-wrap,.app.compact .composer-area,.app.compact .reopen-panel,.app.compact .details{display:none}.app.compact .head{border-bottom:0}.compact-summary{display:none;color:var(--muted);font-size:12px}.app.compact .compact-summary{display:block}.app.compact .presence{display:none}@media(max-width:480px){.chat{height:310px}.message-wrap{max-width:84%}.head{padding:12px}.details-card{right:-36px}}
40
+ </style></head><body><main class="app" id="app"><header class="head"><div class="avatar" id="avatar">S</div><div class="identity"><div class="brand" id="title"></div><div class="presence"><span class="dot waiting" id="dot"></span><span id="status">Connecting to support…</span></div><div class="compact-summary" id="compactSummary">Support chat active</div></div><div class="head-actions"><details class="details"><summary class="icon-button" aria-label="Conversation details">•••</summary><div class="details-card">Conversation ID<code id="session">Creating session…</code></div></details><button class="icon-button" id="collapse" aria-label="Collapse support chat" title="Collapse">⌃</button></div></header><div class="chat-wrap"><section class="chat" id="chat"><div class="empty">Connecting you with human support…</div></section><button class="unread" id="unread" hidden>↓ New messages</button></div><footer class="composer-area"><div class="composer"><textarea id="message" rows="1" placeholder="Message support…" aria-label="Message support"></textarea><button class="send-button" id="send" aria-label="Send message" title="Send">➤</button></div><div class="composer-foot"><span id="delivery">Enter to send · Shift+Enter for a new line</span><button class="close-button" id="end">Close chat</button></div></footer><section class="reopen-panel"><p>This conversation is closed.</p><button class="reopen-button" id="reopen">Reopen conversation</button></section></main><script>
41
+ (()=>{const CONFIG=${config};let nextId=1,sessionId="",polling=false,lastCount=0,unreadCount=0,latestSession=null;const pending=new Map(),q=s=>document.querySelector(s),app=q("#app"),status=q("#status"),dot=q("#dot"),chat=q("#chat"),input=q("#message"),send=q("#send"),end=q("#end"),reopen=q("#reopen"),delivery=q("#delivery"),unread=q("#unread"),collapse=q("#collapse"),summary=q("#compactSummary");q("#title").textContent=CONFIG.title;const post=message=>window.parent.postMessage(message,"*");const request=(method,params)=>new Promise((resolve,reject)=>{const id=nextId++;pending.set(id,{resolve,reject});post({jsonrpc:"2.0",id,method,params});window.setTimeout(()=>{if(pending.delete(id))reject(new Error(method+" timed out"))},30000)});const notify=(method,params)=>post({jsonrpc:"2.0",method,...(params?{params}:{})});const callTool=(name,args)=>request("tools/call",{name,arguments:args});const sendSize=()=>notify("ui/notifications/size-changed",{width:Math.ceil(document.documentElement.getBoundingClientRect().width),height:Math.ceil(document.documentElement.getBoundingClientRect().height)});const esc=value=>String(value??"").replace(/[&<>\"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'\"':"&quot;","'":"&#39;"}[c]));const time=value=>{const date=new Date(value);return Number.isNaN(date.getTime())?"":date.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})};const friendlyAgent=value=>{const name=String(value??"").trim();return !name||name.startsWith("slack:")||name.toUpperCase().startsWith("SLACK:")?"Support team":name};const systemText=value=>{const text=String(value??"");if(/claimed this conversation/i.test(text))return text.replace(/ claimed this conversation.*$/i," joined the conversation");if(/resolved this conversation/i.test(text))return "Conversation closed";if(/reopened this conversation/i.test(text))return "Conversation reopened";if(/support request created/i.test(text))return "Support request created";return text};const atBottom=()=>chat.scrollHeight-chat.scrollTop-chat.clientHeight<48;function messageHtml(message,agent){const sender=message.sender==="user"?"user":message.sender==="system"?"system":"support";if(sender==="system")return '<div class="system-row"><span class="system-pill">'+esc(systemText(message.text))+'</span></div>';const name=sender==="support"?friendlyAgent(message.sender_name||agent):"You";const avatar=name.charAt(0).toUpperCase()||"S";return '<div class="row '+sender+'">'+(sender==="support"?'<div class="message-avatar">'+esc(avatar)+'</div>':"")+'<div class="message-wrap">'+(sender==="support"?'<div class="sender">'+esc(name)+'</div>':"")+'<div class="bubble">'+esc(message.text)+'</div><div class="meta"><span>'+esc(time(message.created_at))+'</span></div></div></div>'}function render(session,messages){latestSession=session;const wasBottom=atBottom(),newMessages=Math.max(0,messages.length-lastCount),supportMessage=[...messages].reverse().find(message=>message.sender==="support"),agent=friendlyAgent(supportMessage?.sender_name||session.agent_name);q("#avatar").textContent=agent.charAt(0).toUpperCase()||"S";const closed=session.status==="resolved",waiting=session.status==="queued";status.textContent=closed?"Conversation closed":waiting?"Waiting for a support specialist":agent+" · Online";dot.className="dot "+(closed?"closed":waiting?"waiting":"");app.classList.toggle("closed",closed);summary.textContent=closed?"Conversation closed":unreadCount?unreadCount+" new "+(unreadCount===1?"reply":"replies"):"Support chat active";chat.innerHTML=messages.length?messages.map(message=>messageHtml(message,agent)).join(""):'<div class="empty">Your support conversation is ready.</div>';if(wasBottom||lastCount===0){chat.scrollTop=chat.scrollHeight;unreadCount=0;unread.hidden=true}else if(newMessages){unreadCount+=newMessages;unread.textContent="↓ "+unreadCount+" new "+(unreadCount===1?"message":"messages");unread.hidden=false}lastCount=messages.length;input.disabled=send.disabled=closed;sendSize()}async function refresh(){if(!sessionId)return;try{const result=await callTool("support_get_messages",{session_id:sessionId}),data=result.structuredContent;if(data?.session&&Array.isArray(data.messages))render(data.session,data.messages)}catch(_){status.textContent="Reconnecting…";dot.className="dot waiting"}}function receiveToolResult(params){const data=params?.structuredContent;if(!data?.session_id)return;sessionId=data.session_id;q("#session").textContent=sessionId;if(data.session&&Array.isArray(data.messages))render(data.session,data.messages);if(!polling){polling=true;void refresh();window.setInterval(()=>void refresh(),CONFIG.pollIntervalMs)}}window.addEventListener("message",event=>{if(event.source!==window.parent)return;const message=event.data;if(!message||message.jsonrpc!=="2.0")return;if(message.id!==undefined&&(message.result!==undefined||message.error)){const waiter=pending.get(message.id);if(!waiter)return;pending.delete(message.id);message.error?waiter.reject(new Error(message.error.message)):waiter.resolve(message.result)}else if(message.method==="ui/notifications/tool-result")receiveToolResult(message.params);else if(message.method==="ping"&&message.id!==undefined)post({jsonrpc:"2.0",id:message.id,result:{}});else if(message.method==="ui/resource-teardown"&&message.id!==undefined)post({jsonrpc:"2.0",id:message.id,result:{}})});async function sendMessage(){const message=input.value.trim();if(!message||!sessionId)return;input.value="";input.style.height="auto";send.disabled=true;delivery.textContent="Sending…";try{await callTool("support_send_message",{session_id:sessionId,message});delivery.textContent="Sent";await refresh();window.setTimeout(()=>{if(delivery.textContent==="Sent")delivery.textContent="Enter to send · Shift+Enter for a new line"},1800)}catch(_){input.value=message;delivery.textContent="Message failed · Press send to retry"}finally{send.disabled=latestSession?.status==="resolved"}}send.addEventListener("click",()=>void sendMessage());input.addEventListener("input",()=>{input.style.height="auto";input.style.height=Math.min(input.scrollHeight,110)+"px"});input.addEventListener("keydown",event=>{if(event.key==="Enter"&&!event.shiftKey){event.preventDefault();void sendMessage()}});end.addEventListener("click",async()=>{if(!sessionId)return;end.disabled=true;delivery.textContent="Closing conversation…";try{const result=await callTool("support_end_session",{session_id:sessionId}),data=result.structuredContent;if(data?.session)render(data.session,data.messages||[])}finally{end.disabled=false}});reopen.addEventListener("click",async()=>{if(!sessionId)return;reopen.disabled=true;try{const result=await callTool("support_reopen_session",{session_id:sessionId}),data=result.structuredContent;if(data?.session)render(data.session,data.messages||[])}finally{reopen.disabled=false}});unread.addEventListener("click",()=>{chat.scrollTop=chat.scrollHeight;unreadCount=0;unread.hidden=true;summary.textContent="Support chat active"});chat.addEventListener("scroll",()=>{if(atBottom()){unreadCount=0;unread.hidden=true;summary.textContent=latestSession?.status==="resolved"?"Conversation closed":"Support chat active"}});collapse.addEventListener("click",()=>{const compact=app.classList.toggle("compact");collapse.textContent=compact?"⌄":"⌃";collapse.setAttribute("aria-label",compact?"Open support chat":"Collapse support chat");sendSize()});request("ui/initialize",{appInfo:{name:"SupportBridge Chat",version:"0.5.0"},appCapabilities:{availableDisplayModes:["inline"]},protocolVersion:"2026-01-26"}).then(()=>{notify("ui/notifications/initialized");sendSize();new ResizeObserver(sendSize).observe(document.documentElement);status.textContent="Connecting to support…"}).catch(()=>{status.textContent="This host could not initialize the support app"})})();
42
+ </script></body></html>`;
43
+ }
44
+ //# sourceMappingURL=mcp-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-app.js","sourceRoot":"","sources":["../src/mcp-app.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,yBAAyB,GAAG,qCAAqC,CAAC;AAC/E,MAAM,CAAC,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAmBlE,0FAA0F;AAC1F,MAAM,UAAU,oBAAoB,CAAC,YAAuC,EAAE,UAAiC,EAAE;IAC/G,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;IACtG,MAAM,eAAe,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACxH,OAAO;QACL,WAAW;QACX,QAAQ,EAAE,sBAAsB;QAChC,QAAQ;QACR,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;QACzE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAClN,KAAK,EAAE;YACL,gBAAgB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;YACtH,oBAAoB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,0BAA0B,EAAE,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACpN,oBAAoB,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;YAC5H,oBAAoB,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,0BAA0B,EAAE,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACnM,mBAAmB,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,6BAA6B,EAAE,mBAAmB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;YAC7J,sBAAsB,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,gCAAgC,EAAE,mBAAmB,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;SACvK;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,UAAmB;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,EAAE,CAAC;IACnH,MAAM,OAAO,GAAG,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,GAAG,CAAC,aAAa,CAAC,UAAU,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzO,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClR,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,iBAA0C,IAAmB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;AAC7J,SAAS,MAAM,CAAC,KAAc,IAA6B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxK,SAAS,MAAM,CAAC,KAAc,IAAY,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1F,SAAS,eAAe,CAAC,KAAa,EAAE,cAAsB;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClF,OAAO;;;qBAGY,MAAM;wBACH,CAAC;AACzB,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { SupportBridgeClient, type InstrumentToolOptions } from "./client.js";
2
+ import type { SupportBridgeControlPlane, CreateSupportTicketInput } from "./control-plane.js";
3
+ import type { SupportIdentity } from "./types.js";
4
+ export interface McpToolResult {
5
+ [key: string]: unknown;
6
+ content: Array<{
7
+ type: "text";
8
+ text: string;
9
+ }>;
10
+ structuredContent?: Record<string, unknown>;
11
+ isError?: boolean;
12
+ _meta?: Record<string, unknown>;
13
+ }
14
+ export type McpToolHandler<TArguments> = (arguments_: TArguments, context?: unknown) => Promise<McpToolResult> | McpToolResult;
15
+ export interface McpInstrumentationOptions<TArguments> extends InstrumentToolOptions<McpToolResult> {
16
+ identify: (arguments_: TArguments, context?: unknown) => Promise<SupportIdentity | undefined> | SupportIdentity | undefined;
17
+ requestId?: (context?: unknown) => string | undefined;
18
+ }
19
+ export interface SupportDecisionToolOptions {
20
+ controlPlane?: SupportBridgeControlPlane;
21
+ ticket?: (arguments_: {
22
+ trigger_id: string;
23
+ issue_summary?: string | undefined;
24
+ customer?: string | undefined;
25
+ error_code?: string | undefined;
26
+ priority?: "normal" | "urgent" | undefined;
27
+ }, identity: SupportIdentity, context?: unknown) => Omit<CreateSupportTicketInput, "identity" | "triggerId">;
28
+ appMeta?: Record<string, unknown>;
29
+ }
30
+ export declare function instrumentMcpTool<TArguments>(client: SupportBridgeClient, toolName: string, handler: McpToolHandler<TArguments>, options: McpInstrumentationOptions<TArguments>): McpToolHandler<TArguments>;
31
+ export declare function supportDecisionTools(client: SupportBridgeClient, identify: (context?: unknown) => Promise<SupportIdentity | undefined> | SupportIdentity | undefined, options?: SupportDecisionToolOptions): {
32
+ dismiss_support_offer: (arguments_: {
33
+ trigger_id: string;
34
+ reason?: string | undefined;
35
+ }, context?: unknown) => Promise<McpToolResult>;
36
+ accept_support_offer: (arguments_: {
37
+ trigger_id: string;
38
+ issue_summary?: string | undefined;
39
+ customer?: string | undefined;
40
+ error_code?: string | undefined;
41
+ priority?: "normal" | "urgent" | undefined;
42
+ }, context?: unknown) => Promise<McpToolResult>;
43
+ };
44
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
package/dist/mcp.js ADDED
@@ -0,0 +1,117 @@
1
+ import { SupportBridgeToolError } from "./client.js";
2
+ export function instrumentMcpTool(client, toolName, handler, options) {
3
+ return async (arguments_, context) => {
4
+ const identity = await options.identify(arguments_, context);
5
+ const requestId = options.requestId?.(context);
6
+ const invocation = {
7
+ toolName, arguments: arguments_, ...(identity ? { identity } : {}),
8
+ ...(requestId ? { requestId } : {})
9
+ };
10
+ try {
11
+ const result = await client.instrumentTool(invocation, () => handler(arguments_, context), options);
12
+ return toMcpResult(result);
13
+ }
14
+ catch (error) {
15
+ if (!(error instanceof SupportBridgeToolError))
16
+ throw error;
17
+ const details = { error: error.message, ...(error.supportOffer ? supportOfferData(error.supportOffer) : {}) };
18
+ return {
19
+ isError: true,
20
+ content: [{ type: "text", text: error.supportOffer ? blockingNotice(error.supportOffer) : error.message }],
21
+ structuredContent: details
22
+ };
23
+ }
24
+ };
25
+ }
26
+ export function supportDecisionTools(client, identify, options = {}) {
27
+ return {
28
+ dismiss_support_offer: async (arguments_, context) => {
29
+ const identity = await identify(context);
30
+ await client.decideSupport(arguments_.trigger_id, identity, "dismissed");
31
+ return {
32
+ content: [{ type: "text", text: "Support offer dismissed. Retry the original request." }],
33
+ structuredContent: { dismissed: true, trigger_id: arguments_.trigger_id, retry_original_request: true }
34
+ };
35
+ },
36
+ accept_support_offer: async (arguments_, context) => {
37
+ const identity = await identify(context);
38
+ await client.decideSupport(arguments_.trigger_id, identity, "accepted");
39
+ if (options.controlPlane && identity) {
40
+ const brief = client.buildSupportBrief(identity, arguments_.issue_summary);
41
+ const configured = options.ticket?.(arguments_, identity, context) ?? {
42
+ issue: arguments_.issue_summary ?? brief.issue,
43
+ ...(arguments_.customer ?? brief.customer ? { customer: arguments_.customer ?? brief.customer } : {}),
44
+ ...(arguments_.error_code ?? brief.errorCode ? { errorCode: arguments_.error_code ?? brief.errorCode } : {}),
45
+ ...(arguments_.priority ? { priority: arguments_.priority } : {})
46
+ };
47
+ const ticket = await options.controlPlane.createTicket({
48
+ ...configured,
49
+ identity,
50
+ triggerId: arguments_.trigger_id
51
+ });
52
+ return {
53
+ content: [{ type: "text", text: `Support chat ${ticket.id} opened.` }],
54
+ structuredContent: { accepted: true, trigger_id: arguments_.trigger_id, session_id: ticket.id, status: ticket.status, session: { ...ticket, id: ticket.id }, messages: [] },
55
+ ...(options.appMeta ? { _meta: options.appMeta } : {})
56
+ };
57
+ }
58
+ return {
59
+ content: [{ type: "text", text: "Support offer accepted. Open the vendor support experience." }],
60
+ structuredContent: { accepted: true, trigger_id: arguments_.trigger_id },
61
+ ...(options.appMeta ? { _meta: options.appMeta } : {})
62
+ };
63
+ }
64
+ };
65
+ }
66
+ function toMcpResult(result) {
67
+ if (result.kind === "support_offer") {
68
+ return {
69
+ isError: true,
70
+ content: [{ type: "text", text: blockingNotice(result.offer) }],
71
+ structuredContent: supportOfferData(result.offer)
72
+ };
73
+ }
74
+ if (!result.offer)
75
+ return result.value;
76
+ const offerData = supportOfferData(result.offer);
77
+ const visibleOffer = result.offer.requiresAcknowledgement
78
+ ? [{ type: "text", text: acknowledgementNotice(result.offer) }]
79
+ : [];
80
+ return {
81
+ ...result.value,
82
+ content: [...result.value.content, ...visibleOffer],
83
+ structuredContent: { ...(result.value.structuredContent ?? {}), ...offerData }
84
+ };
85
+ }
86
+ function supportOfferData(offer) {
87
+ return {
88
+ support_available: true,
89
+ support_offer_blocking: offer.blocking,
90
+ support_offer_status: "pending",
91
+ support_offer_requires_acknowledgement: offer.requiresAcknowledgement,
92
+ support_trigger_id: offer.triggerId,
93
+ support_reason: offer.reason,
94
+ suggested_message: offer.message,
95
+ requires_user_permission: true,
96
+ accept_tool: offer.motion === "assistance" ? "request_assistance" : "accept_support_offer",
97
+ ...(offer.motion ? { support_motion: offer.motion } : {}),
98
+ ...(offer.assignedRep ? { available_representative: offer.assignedRep } : {}),
99
+ decline_tool: "dismiss_support_offer",
100
+ retry_original_request_after_response: offer.retryOriginalRequestAfterDecision
101
+ };
102
+ }
103
+ function acknowledgementNotice(offer) {
104
+ const representative = offer.assignedRep?.name ? `${offer.assignedRep.name} is currently available` : "Human assistance is currently available";
105
+ const acceptTool = offer.motion === "assistance" ? "request_assistance" : "accept_support_offer";
106
+ return [
107
+ "LIVE ASSISTANCE AVAILABLE — USER RESPONSE REQUESTED",
108
+ "The requested tool result is included above.",
109
+ `${representative}. ${offer.reason}`,
110
+ "Clearly offer the user the choice to connect or decline. Do not contact anyone without the user's explicit consent.",
111
+ `If accepted, call ${acceptTool} with trigger_id '${offer.triggerId}'. If declined, call dismiss_support_offer with the same trigger_id.`
112
+ ].join("\n\n");
113
+ }
114
+ function blockingNotice(offer) {
115
+ return `REQUEST PAUSED — USER RESPONSE REQUIRED: ${offer.message} If the user declines, call dismiss_support_offer with trigger_id '${offer.triggerId}', then retry the original request.`;
116
+ }
117
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export declare const SUPPORT_OFFER_RESOURCE_URI = "ui://supportbridge/offer-v1.0.1.html";
2
+ export declare const SUPPORT_OFFER_MIME_TYPE = "text/html;profile=mcp-app";
3
+ export interface SupportOfferAppOptions {
4
+ resourceUri?: string;
5
+ title?: string;
6
+ }
7
+ export declare function createSupportOfferApp(options?: SupportOfferAppOptions): {
8
+ resourceUri: string;
9
+ mimeType: string;
10
+ toolMeta: {
11
+ ui: {
12
+ resourceUri: string;
13
+ visibility: string[];
14
+ };
15
+ "ui/resourceUri": string;
16
+ };
17
+ resourceMeta: {
18
+ ui: {
19
+ preferredFrameSize: {
20
+ width: number;
21
+ height: number;
22
+ };
23
+ };
24
+ };
25
+ resourceContents: () => {
26
+ contents: {
27
+ uri: string;
28
+ mimeType: string;
29
+ text: string;
30
+ _meta: {
31
+ ui: {
32
+ preferredFrameSize: {
33
+ width: number;
34
+ height: number;
35
+ };
36
+ };
37
+ };
38
+ }[];
39
+ };
40
+ };
41
+ //# sourceMappingURL=offer-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offer-app.d.ts","sourceRoot":"","sources":["../src/offer-app.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,yCAAyC,CAAC;AACjF,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IAAG,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AAEjF,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASzE"}