@casys/mcp-bridge 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/esm/_dnt.shims.d.ts +2 -0
  2. package/esm/_dnt.shims.d.ts.map +1 -0
  3. package/esm/_dnt.shims.js +57 -0
  4. package/esm/adapters/base-adapter.d.ts +25 -0
  5. package/esm/adapters/base-adapter.d.ts.map +1 -0
  6. package/esm/adapters/base-adapter.js +86 -0
  7. package/esm/adapters/line/adapter.d.ts +11 -0
  8. package/esm/adapters/line/adapter.d.ts.map +1 -0
  9. package/esm/adapters/line/adapter.js +10 -0
  10. package/esm/adapters/line/types.d.ts +25 -0
  11. package/esm/adapters/line/types.d.ts.map +1 -0
  12. package/esm/adapters/line/types.js +4 -0
  13. package/esm/adapters/telegram/adapter.d.ts +11 -0
  14. package/esm/adapters/telegram/adapter.d.ts.map +1 -0
  15. package/esm/adapters/telegram/adapter.js +10 -0
  16. package/esm/adapters/telegram/platform-adapter.d.ts +40 -0
  17. package/esm/adapters/telegram/platform-adapter.d.ts.map +1 -0
  18. package/esm/adapters/telegram/platform-adapter.js +214 -0
  19. package/esm/adapters/telegram/sdk-bridge.d.ts +8 -0
  20. package/esm/adapters/telegram/sdk-bridge.d.ts.map +1 -0
  21. package/esm/adapters/telegram/sdk-bridge.js +22 -0
  22. package/esm/adapters/telegram/types.d.ts +93 -0
  23. package/esm/adapters/telegram/types.d.ts.map +1 -0
  24. package/esm/adapters/telegram/types.js +6 -0
  25. package/esm/client/bridge.js +424 -0
  26. package/esm/core/adapter.d.ts +88 -0
  27. package/esm/core/adapter.d.ts.map +1 -0
  28. package/esm/core/adapter.js +10 -0
  29. package/esm/core/bridge-client.d.ts +77 -0
  30. package/esm/core/bridge-client.d.ts.map +1 -0
  31. package/esm/core/bridge-client.js +275 -0
  32. package/esm/core/message-router.d.ts +71 -0
  33. package/esm/core/message-router.d.ts.map +1 -0
  34. package/esm/core/message-router.js +187 -0
  35. package/esm/core/protocol.d.ts +116 -0
  36. package/esm/core/protocol.d.ts.map +1 -0
  37. package/esm/core/protocol.js +203 -0
  38. package/esm/core/resource-resolver.d.ts +27 -0
  39. package/esm/core/resource-resolver.d.ts.map +1 -0
  40. package/esm/core/resource-resolver.js +85 -0
  41. package/esm/core/transport.d.ts +46 -0
  42. package/esm/core/transport.d.ts.map +1 -0
  43. package/esm/core/transport.js +85 -0
  44. package/esm/core/types.d.ts +187 -0
  45. package/esm/core/types.d.ts.map +1 -0
  46. package/esm/core/types.js +35 -0
  47. package/esm/mod.d.ts +36 -0
  48. package/esm/mod.d.ts.map +1 -0
  49. package/esm/mod.js +33 -0
  50. package/esm/package.json +3 -0
  51. package/esm/resource-server/csp.d.ts +36 -0
  52. package/esm/resource-server/csp.d.ts.map +1 -0
  53. package/esm/resource-server/csp.js +36 -0
  54. package/esm/resource-server/injector.d.ts +18 -0
  55. package/esm/resource-server/injector.d.ts.map +1 -0
  56. package/esm/resource-server/injector.js +39 -0
  57. package/esm/resource-server/server.d.ts +107 -0
  58. package/esm/resource-server/server.d.ts.map +1 -0
  59. package/esm/resource-server/server.js +483 -0
  60. package/esm/resource-server/session.d.ts +60 -0
  61. package/esm/resource-server/session.d.ts.map +1 -0
  62. package/esm/resource-server/session.js +86 -0
  63. package/esm/resource-server/telegram-auth.d.ts +45 -0
  64. package/esm/resource-server/telegram-auth.d.ts.map +1 -0
  65. package/esm/resource-server/telegram-auth.js +161 -0
  66. package/package.json +31 -0
  67. package/script/_dnt.shims.d.ts +2 -0
  68. package/script/_dnt.shims.d.ts.map +1 -0
  69. package/script/_dnt.shims.js +60 -0
  70. package/script/adapters/base-adapter.d.ts +25 -0
  71. package/script/adapters/base-adapter.d.ts.map +1 -0
  72. package/script/adapters/base-adapter.js +113 -0
  73. package/script/adapters/line/adapter.d.ts +11 -0
  74. package/script/adapters/line/adapter.d.ts.map +1 -0
  75. package/script/adapters/line/adapter.js +14 -0
  76. package/script/adapters/line/types.d.ts +25 -0
  77. package/script/adapters/line/types.d.ts.map +1 -0
  78. package/script/adapters/line/types.js +5 -0
  79. package/script/adapters/telegram/adapter.d.ts +11 -0
  80. package/script/adapters/telegram/adapter.d.ts.map +1 -0
  81. package/script/adapters/telegram/adapter.js +14 -0
  82. package/script/adapters/telegram/platform-adapter.d.ts +40 -0
  83. package/script/adapters/telegram/platform-adapter.d.ts.map +1 -0
  84. package/script/adapters/telegram/platform-adapter.js +241 -0
  85. package/script/adapters/telegram/sdk-bridge.d.ts +8 -0
  86. package/script/adapters/telegram/sdk-bridge.d.ts.map +1 -0
  87. package/script/adapters/telegram/sdk-bridge.js +48 -0
  88. package/script/adapters/telegram/types.d.ts +93 -0
  89. package/script/adapters/telegram/types.d.ts.map +1 -0
  90. package/script/adapters/telegram/types.js +7 -0
  91. package/script/client/bridge.js +424 -0
  92. package/script/core/adapter.d.ts +88 -0
  93. package/script/core/adapter.d.ts.map +1 -0
  94. package/script/core/adapter.js +11 -0
  95. package/script/core/bridge-client.d.ts +77 -0
  96. package/script/core/bridge-client.d.ts.map +1 -0
  97. package/script/core/bridge-client.js +302 -0
  98. package/script/core/message-router.d.ts +71 -0
  99. package/script/core/message-router.d.ts.map +1 -0
  100. package/script/core/message-router.js +191 -0
  101. package/script/core/protocol.d.ts +116 -0
  102. package/script/core/protocol.d.ts.map +1 -0
  103. package/script/core/protocol.js +230 -0
  104. package/script/core/resource-resolver.d.ts +27 -0
  105. package/script/core/resource-resolver.d.ts.map +1 -0
  106. package/script/core/resource-resolver.js +89 -0
  107. package/script/core/transport.d.ts +46 -0
  108. package/script/core/transport.d.ts.map +1 -0
  109. package/script/core/transport.js +112 -0
  110. package/script/core/types.d.ts +187 -0
  111. package/script/core/types.d.ts.map +1 -0
  112. package/script/core/types.js +38 -0
  113. package/script/mod.d.ts +36 -0
  114. package/script/mod.d.ts.map +1 -0
  115. package/script/mod.js +76 -0
  116. package/script/package.json +3 -0
  117. package/script/resource-server/csp.d.ts +36 -0
  118. package/script/resource-server/csp.d.ts.map +1 -0
  119. package/script/resource-server/csp.js +39 -0
  120. package/script/resource-server/injector.d.ts +18 -0
  121. package/script/resource-server/injector.d.ts.map +1 -0
  122. package/script/resource-server/injector.js +42 -0
  123. package/script/resource-server/server.d.ts +107 -0
  124. package/script/resource-server/server.d.ts.map +1 -0
  125. package/script/resource-server/server.js +487 -0
  126. package/script/resource-server/session.d.ts +60 -0
  127. package/script/resource-server/session.d.ts.map +1 -0
  128. package/script/resource-server/session.js +90 -0
  129. package/script/resource-server/telegram-auth.d.ts +45 -0
  130. package/script/resource-server/telegram-auth.d.ts.map +1 -0
  131. package/script/resource-server/telegram-auth.js +164 -0
@@ -0,0 +1,2 @@
1
+ export declare const dntGlobalThis: Omit<typeof globalThis, never>;
2
+ //# sourceMappingURL=_dnt.shims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dnt.shims.d.ts","sourceRoot":"","sources":["../src/_dnt.shims.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,gCAA2C,CAAC"}
@@ -0,0 +1,57 @@
1
+ const dntGlobals = {};
2
+ export const dntGlobalThis = createMergeProxy(globalThis, dntGlobals);
3
+ function createMergeProxy(baseObj, extObj) {
4
+ return new Proxy(baseObj, {
5
+ get(_target, prop, _receiver) {
6
+ if (prop in extObj) {
7
+ return extObj[prop];
8
+ }
9
+ else {
10
+ return baseObj[prop];
11
+ }
12
+ },
13
+ set(_target, prop, value) {
14
+ if (prop in extObj) {
15
+ delete extObj[prop];
16
+ }
17
+ baseObj[prop] = value;
18
+ return true;
19
+ },
20
+ deleteProperty(_target, prop) {
21
+ let success = false;
22
+ if (prop in extObj) {
23
+ delete extObj[prop];
24
+ success = true;
25
+ }
26
+ if (prop in baseObj) {
27
+ delete baseObj[prop];
28
+ success = true;
29
+ }
30
+ return success;
31
+ },
32
+ ownKeys(_target) {
33
+ const baseKeys = Reflect.ownKeys(baseObj);
34
+ const extKeys = Reflect.ownKeys(extObj);
35
+ const extKeysSet = new Set(extKeys);
36
+ return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];
37
+ },
38
+ defineProperty(_target, prop, desc) {
39
+ if (prop in extObj) {
40
+ delete extObj[prop];
41
+ }
42
+ Reflect.defineProperty(baseObj, prop, desc);
43
+ return true;
44
+ },
45
+ getOwnPropertyDescriptor(_target, prop) {
46
+ if (prop in extObj) {
47
+ return Reflect.getOwnPropertyDescriptor(extObj, prop);
48
+ }
49
+ else {
50
+ return Reflect.getOwnPropertyDescriptor(baseObj, prop);
51
+ }
52
+ },
53
+ has(_target, prop) {
54
+ return prop in extObj || prop in baseObj;
55
+ },
56
+ });
57
+ }
@@ -0,0 +1,25 @@
1
+ import type { McpAppsAdapter, MessageHandler } from "../core/adapter.js";
2
+ import type { AdapterConfig, McpAppsMessage } from "../core/types.js";
3
+ /**
4
+ * Abstract base for postMessage-based platform adapters.
5
+ *
6
+ * Handles the common lifecycle:
7
+ * - `init()`: set up `message` event listener, derive targetOrigin from config
8
+ * - `sendToHost()`: forward JSON-RPC to parent frame via postMessage
9
+ * - `onMessageFromHost()`: register message handlers
10
+ * - `destroy()`: tear down listener and handlers
11
+ *
12
+ * Concrete adapters (Telegram, LINE) extend this and set `platform`.
13
+ */
14
+ export declare abstract class BasePostMessageAdapter implements McpAppsAdapter {
15
+ abstract readonly platform: string;
16
+ private initialized;
17
+ private handlers;
18
+ private boundListener;
19
+ private targetOrigin;
20
+ init(config: AdapterConfig): Promise<void>;
21
+ sendToHost(message: McpAppsMessage): void;
22
+ onMessageFromHost(handler: MessageHandler): void;
23
+ destroy(): void;
24
+ }
25
+ //# sourceMappingURL=base-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/base-adapter.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMtE;;;;;;;;;;GAUG;AACH,8BAAsB,sBAAuB,YAAW,cAAc;IACpE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,YAAY,CAAO;IAE3B,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C1C,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAYzC,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIhD,OAAO,IAAI,IAAI;CAQhB"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Base postMessage adapter for platform integrations.
3
+ *
4
+ * Provides the common message interception and dispatch logic shared by
5
+ * all platform adapters that communicate via `window.parent.postMessage`.
6
+ *
7
+ * Subclasses only need to set their `platform` identifier.
8
+ */
9
+ import * as dntShim from "../_dnt.shims.js";
10
+ // Cast globalThis to access browser-only APIs at runtime.
11
+ // deno-lint-ignore no-explicit-any
12
+ const _global = dntShim.dntGlobalThis;
13
+ /**
14
+ * Abstract base for postMessage-based platform adapters.
15
+ *
16
+ * Handles the common lifecycle:
17
+ * - `init()`: set up `message` event listener, derive targetOrigin from config
18
+ * - `sendToHost()`: forward JSON-RPC to parent frame via postMessage
19
+ * - `onMessageFromHost()`: register message handlers
20
+ * - `destroy()`: tear down listener and handlers
21
+ *
22
+ * Concrete adapters (Telegram, LINE) extend this and set `platform`.
23
+ */
24
+ export class BasePostMessageAdapter {
25
+ initialized = false;
26
+ handlers = [];
27
+ boundListener = null;
28
+ targetOrigin = "*";
29
+ init(config) {
30
+ if (this.initialized) {
31
+ throw new Error(`[${this.platform}Adapter] Already initialized.`);
32
+ }
33
+ // Use resourceBaseUrl as targetOrigin instead of "*" (security)
34
+ if (config.resourceBaseUrl) {
35
+ try {
36
+ const url = new URL(config.resourceBaseUrl);
37
+ this.targetOrigin = url.origin;
38
+ }
39
+ catch {
40
+ console.warn(`[${this.platform}Adapter] Invalid resourceBaseUrl, falling back to '*' targetOrigin:`, config.resourceBaseUrl);
41
+ }
42
+ }
43
+ this.boundListener = ((event) => {
44
+ try {
45
+ // deno-lint-ignore no-explicit-any
46
+ const msgEvent = event;
47
+ const raw = msgEvent.data;
48
+ const data = typeof raw === "string" ? JSON.parse(raw) : raw;
49
+ if (data && typeof data === "object" && data.jsonrpc === "2.0") {
50
+ const message = data;
51
+ for (const handler of this.handlers) {
52
+ handler(message);
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // Non-JSON messages are expected (other postMessage traffic),
58
+ // silently ignore to avoid log noise.
59
+ }
60
+ });
61
+ if (typeof _global.addEventListener === "function") {
62
+ _global.addEventListener("message", this.boundListener);
63
+ }
64
+ this.initialized = true;
65
+ return Promise.resolve();
66
+ }
67
+ sendToHost(message) {
68
+ if (!this.initialized) {
69
+ throw new Error(`[${this.platform}Adapter] Not initialized. Call init() first.`);
70
+ }
71
+ if (typeof _global.parent?.postMessage === "function") {
72
+ _global.parent.postMessage(JSON.stringify(message), this.targetOrigin);
73
+ }
74
+ }
75
+ onMessageFromHost(handler) {
76
+ this.handlers.push(handler);
77
+ }
78
+ destroy() {
79
+ if (this.boundListener && typeof _global.removeEventListener === "function") {
80
+ _global.removeEventListener("message", this.boundListener);
81
+ }
82
+ this.boundListener = null;
83
+ this.handlers = [];
84
+ this.initialized = false;
85
+ }
86
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * LINE LIFF adapter for MCP Apps Bridge.
3
+ *
4
+ * Uses `postMessage` / `message` events to communicate with the LINE
5
+ * host WebView.
6
+ */
7
+ import { BasePostMessageAdapter } from "../base-adapter.js";
8
+ export declare class LineAdapter extends BasePostMessageAdapter {
9
+ readonly platform: "line";
10
+ }
11
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/line/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,qBAAa,WAAY,SAAQ,sBAAsB;IACrD,QAAQ,CAAC,QAAQ,SAAmB;CACrC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * LINE LIFF adapter for MCP Apps Bridge.
3
+ *
4
+ * Uses `postMessage` / `message` events to communicate with the LINE
5
+ * host WebView.
6
+ */
7
+ import { BasePostMessageAdapter } from "../base-adapter.js";
8
+ export class LineAdapter extends BasePostMessageAdapter {
9
+ platform = "line";
10
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * LINE LIFF specific types.
3
+ */
4
+ import type { AdapterConfig } from "../../core/types.js";
5
+ /** Configuration for the LINE LIFF adapter. */
6
+ export interface LineAdapterConfig extends AdapterConfig {
7
+ readonly platformOptions?: {
8
+ /** LINE LIFF App ID. */
9
+ readonly liffId?: string;
10
+ };
11
+ }
12
+ /**
13
+ * Subset of the LIFF SDK API.
14
+ * @see https://developers.line.biz/en/reference/liff/
15
+ */
16
+ export interface LiffSdk {
17
+ init(config: {
18
+ liffId: string;
19
+ }): Promise<void>;
20
+ isLoggedIn(): boolean;
21
+ getAccessToken(): string | null;
22
+ sendMessages(messages: readonly Record<string, unknown>[]): Promise<void>;
23
+ closeWindow(): void;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/line/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,+CAA+C;AAC/C,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,QAAQ,CAAC,eAAe,CAAC,EAAE;QACzB,wBAAwB;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,IAAI,OAAO,CAAC;IACtB,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,QAAQ,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,WAAW,IAAI,IAAI,CAAC;CACrB"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * LINE LIFF specific types.
3
+ */
4
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Telegram Mini App adapter for MCP Apps Bridge.
3
+ *
4
+ * Uses `postMessage` / `message` events to communicate with the Telegram
5
+ * host WebView.
6
+ */
7
+ import { BasePostMessageAdapter } from "../base-adapter.js";
8
+ export declare class TelegramAdapter extends BasePostMessageAdapter {
9
+ readonly platform: "telegram";
10
+ }
11
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,qBAAa,eAAgB,SAAQ,sBAAsB;IACzD,QAAQ,CAAC,QAAQ,aAAuB;CACzC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Telegram Mini App adapter for MCP Apps Bridge.
3
+ *
4
+ * Uses `postMessage` / `message` events to communicate with the Telegram
5
+ * host WebView.
6
+ */
7
+ import { BasePostMessageAdapter } from "../base-adapter.js";
8
+ export class TelegramAdapter extends BasePostMessageAdapter {
9
+ platform = "telegram";
10
+ }
@@ -0,0 +1,40 @@
1
+ import type { LifecycleEventHandler, PlatformAdapter } from "../../core/adapter.js";
2
+ import type { ContainerDimensions, HostContext } from "../../core/types.js";
3
+ /**
4
+ * Maps Telegram WebApp SDK to the MCP Apps PlatformAdapter interface.
5
+ *
6
+ * Usage:
7
+ * ```ts
8
+ * const adapter = new TelegramPlatformAdapter();
9
+ * const client = new BridgeClient({ platform: adapter, ... });
10
+ * ```
11
+ */
12
+ export declare class TelegramPlatformAdapter implements PlatformAdapter {
13
+ readonly name: "telegram";
14
+ private tg;
15
+ private lifecycleHandlers;
16
+ private boundThemeHandler;
17
+ private boundViewportHandler;
18
+ private boundActivatedHandler;
19
+ private boundDeactivatedHandler;
20
+ initialize(): Promise<HostContext>;
21
+ getTheme(): "light" | "dark";
22
+ getContainerDimensions(): ContainerDimensions;
23
+ onLifecycleEvent(handler: LifecycleEventHandler): void;
24
+ openLink(url: string): Promise<void>;
25
+ sendMessage(text: string): Promise<void>;
26
+ getAuthData(): Record<string, unknown>;
27
+ /**
28
+ * Clean up Telegram event listeners.
29
+ * Call this when the bridge is destroyed.
30
+ */
31
+ destroy(): void;
32
+ private buildHostContext;
33
+ private buildStyles;
34
+ private buildSafeAreaInsets;
35
+ private getLocale;
36
+ private getTimeZone;
37
+ private setupEventListeners;
38
+ private emitLifecycleEvent;
39
+ }
40
+ //# sourceMappingURL=platform-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/platform-adapter.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EAIZ,MAAM,qBAAqB,CAAC;AAI7B;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,aAAuB;IAEpC,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,uBAAuB,CAA6B;IAE5D,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAiBlC,QAAQ,IAAI,OAAO,GAAG,MAAM;IAO5B,sBAAsB,IAAI,mBAAmB;IAY7C,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAItD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAuBf,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,WAAW;IA2CnB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,kBAAkB;CAK3B"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Telegram PlatformAdapter for the MCP Apps Bridge.
3
+ *
4
+ * Implements the high-level PlatformAdapter interface by wrapping the
5
+ * Telegram WebApp SDK. Maps Telegram theme, viewport, and lifecycle
6
+ * events to MCP Apps HostContext and LifecycleEvents.
7
+ *
8
+ * This runs client-side inside the Telegram Mini App WebView.
9
+ */
10
+ import * as dntShim from "../../_dnt.shims.js";
11
+ import { getTelegramWebApp } from "./sdk-bridge.js";
12
+ /**
13
+ * Maps Telegram WebApp SDK to the MCP Apps PlatformAdapter interface.
14
+ *
15
+ * Usage:
16
+ * ```ts
17
+ * const adapter = new TelegramPlatformAdapter();
18
+ * const client = new BridgeClient({ platform: adapter, ... });
19
+ * ```
20
+ */
21
+ export class TelegramPlatformAdapter {
22
+ name = "telegram";
23
+ tg = null;
24
+ lifecycleHandlers = [];
25
+ boundThemeHandler = null;
26
+ boundViewportHandler = null;
27
+ boundActivatedHandler = null;
28
+ boundDeactivatedHandler = null;
29
+ initialize() {
30
+ this.tg = getTelegramWebApp();
31
+ // Signal to Telegram that the app is ready
32
+ this.tg.ready();
33
+ // Expand to full viewport by default
34
+ if (!this.tg.isExpanded) {
35
+ this.tg.expand();
36
+ }
37
+ // Register event listeners
38
+ this.setupEventListeners();
39
+ return Promise.resolve(this.buildHostContext());
40
+ }
41
+ getTheme() {
42
+ if (!this.tg) {
43
+ throw new Error("[TelegramPlatformAdapter] Not initialized.");
44
+ }
45
+ return this.tg.colorScheme;
46
+ }
47
+ getContainerDimensions() {
48
+ if (!this.tg) {
49
+ throw new Error("[TelegramPlatformAdapter] Not initialized.");
50
+ }
51
+ // deno-lint-ignore no-explicit-any
52
+ const _global = dntShim.dntGlobalThis;
53
+ return {
54
+ width: _global.innerWidth ?? 0,
55
+ maxHeight: this.tg.viewportStableHeight,
56
+ };
57
+ }
58
+ onLifecycleEvent(handler) {
59
+ this.lifecycleHandlers.push(handler);
60
+ }
61
+ openLink(url) {
62
+ if (!this.tg) {
63
+ throw new Error("[TelegramPlatformAdapter] Not initialized.");
64
+ }
65
+ this.tg.openLink(url);
66
+ return Promise.resolve();
67
+ }
68
+ sendMessage(text) {
69
+ if (!this.tg) {
70
+ throw new Error("[TelegramPlatformAdapter] Not initialized.");
71
+ }
72
+ // WARNING: sendData() closes the Mini App!
73
+ this.tg.sendData(text);
74
+ return Promise.resolve();
75
+ }
76
+ getAuthData() {
77
+ if (!this.tg) {
78
+ throw new Error("[TelegramPlatformAdapter] Not initialized. Call initialize() first.");
79
+ }
80
+ return {
81
+ initData: this.tg.initData,
82
+ initDataUnsafe: this.tg.initDataUnsafe,
83
+ platform: this.tg.platform,
84
+ version: this.tg.version,
85
+ };
86
+ }
87
+ /**
88
+ * Clean up Telegram event listeners.
89
+ * Call this when the bridge is destroyed.
90
+ */
91
+ destroy() {
92
+ if (this.tg) {
93
+ if (this.boundThemeHandler) {
94
+ this.tg.offEvent("themeChanged", this.boundThemeHandler);
95
+ }
96
+ if (this.boundViewportHandler) {
97
+ this.tg.offEvent("viewportChanged", this.boundViewportHandler);
98
+ }
99
+ if (this.boundActivatedHandler) {
100
+ this.tg.offEvent("activated", this.boundActivatedHandler);
101
+ }
102
+ if (this.boundDeactivatedHandler) {
103
+ this.tg.offEvent("deactivated", this.boundDeactivatedHandler);
104
+ }
105
+ }
106
+ this.lifecycleHandlers = [];
107
+ this.tg = null;
108
+ }
109
+ // -------------------------------------------------------------------------
110
+ // Private helpers
111
+ // -------------------------------------------------------------------------
112
+ buildHostContext() {
113
+ if (!this.tg) {
114
+ throw new Error("[TelegramPlatformAdapter] Not initialized.");
115
+ }
116
+ return {
117
+ theme: this.tg.colorScheme,
118
+ styles: this.buildStyles(this.tg.themeParams),
119
+ containerDimensions: this.getContainerDimensions(),
120
+ platform: "mobile",
121
+ locale: this.getLocale(),
122
+ timeZone: this.getTimeZone(),
123
+ safeAreaInsets: this.buildSafeAreaInsets(),
124
+ };
125
+ }
126
+ buildStyles(params) {
127
+ const variables = {};
128
+ if (params.bg_color) {
129
+ variables["--color-background-primary"] = params.bg_color;
130
+ }
131
+ if (params.secondary_bg_color) {
132
+ variables["--color-background-secondary"] = params.secondary_bg_color;
133
+ }
134
+ if (params.text_color) {
135
+ variables["--color-text-primary"] = params.text_color;
136
+ }
137
+ if (params.subtitle_text_color) {
138
+ variables["--color-text-secondary"] = params.subtitle_text_color;
139
+ }
140
+ if (params.section_separator_color) {
141
+ variables["--color-border-primary"] = params.section_separator_color;
142
+ }
143
+ if (params.accent_text_color) {
144
+ variables["--color-ring-primary"] = params.accent_text_color;
145
+ }
146
+ if (params.hint_color) {
147
+ variables["--color-text-hint"] = params.hint_color;
148
+ }
149
+ if (params.link_color) {
150
+ variables["--color-text-link"] = params.link_color;
151
+ }
152
+ if (params.button_color) {
153
+ variables["--color-button-primary"] = params.button_color;
154
+ }
155
+ if (params.button_text_color) {
156
+ variables["--color-button-text"] = params.button_text_color;
157
+ }
158
+ if (params.header_bg_color) {
159
+ variables["--color-background-header"] = params.header_bg_color;
160
+ }
161
+ if (params.section_bg_color) {
162
+ variables["--color-background-section"] = params.section_bg_color;
163
+ }
164
+ return { variables };
165
+ }
166
+ buildSafeAreaInsets() {
167
+ const inset = this.tg?.safeAreaInset;
168
+ return {
169
+ top: inset?.top ?? 0,
170
+ right: inset?.right ?? 0,
171
+ bottom: inset?.bottom ?? 0,
172
+ left: inset?.left ?? 0,
173
+ };
174
+ }
175
+ getLocale() {
176
+ // deno-lint-ignore no-explicit-any
177
+ const nav = dntShim.dntGlobalThis.navigator;
178
+ return nav?.language ?? "en";
179
+ }
180
+ getTimeZone() {
181
+ try {
182
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
183
+ }
184
+ catch {
185
+ // Intl may not be available in all webview runtimes; UTC is safe default
186
+ return "UTC";
187
+ }
188
+ }
189
+ setupEventListeners() {
190
+ if (!this.tg)
191
+ return;
192
+ this.boundThemeHandler = () => {
193
+ this.emitLifecycleEvent({ type: "theme-changed" });
194
+ };
195
+ this.boundViewportHandler = () => {
196
+ this.emitLifecycleEvent({ type: "viewport-changed" });
197
+ };
198
+ this.boundActivatedHandler = () => {
199
+ this.emitLifecycleEvent({ type: "activated" });
200
+ };
201
+ this.boundDeactivatedHandler = () => {
202
+ this.emitLifecycleEvent({ type: "deactivated" });
203
+ };
204
+ this.tg.onEvent("themeChanged", this.boundThemeHandler);
205
+ this.tg.onEvent("viewportChanged", this.boundViewportHandler);
206
+ this.tg.onEvent("activated", this.boundActivatedHandler);
207
+ this.tg.onEvent("deactivated", this.boundDeactivatedHandler);
208
+ }
209
+ emitLifecycleEvent(event) {
210
+ for (const handler of this.lifecycleHandlers) {
211
+ handler(event);
212
+ }
213
+ }
214
+ }
@@ -0,0 +1,8 @@
1
+ import type { TelegramWebApp } from "./types.js";
2
+ /**
3
+ * Attempt to get the Telegram WebApp instance from the global scope.
4
+ *
5
+ * @throws {Error} if running outside a Telegram Mini App context.
6
+ */
7
+ export declare function getTelegramWebApp(): TelegramWebApp;
8
+ //# sourceMappingURL=sdk-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-bridge.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/sdk-bridge.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAWlD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Bridge between the Telegram WebApp SDK and the MCP Apps protocol.
3
+ *
4
+ * Wraps `window.Telegram.WebApp` to provide send/receive capabilities
5
+ * for JSON-RPC messages.
6
+ */
7
+ import * as dntShim from "../../_dnt.shims.js";
8
+ /**
9
+ * Attempt to get the Telegram WebApp instance from the global scope.
10
+ *
11
+ * @throws {Error} if running outside a Telegram Mini App context.
12
+ */
13
+ export function getTelegramWebApp() {
14
+ // deno-lint-ignore no-explicit-any
15
+ const global = dntShim.dntGlobalThis;
16
+ const tg = global?.Telegram?.WebApp;
17
+ if (!tg) {
18
+ throw new Error("[TelegramSdkBridge] Telegram.WebApp not found. " +
19
+ "This code must run inside a Telegram Mini App WebView.");
20
+ }
21
+ return tg;
22
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Telegram Mini App specific types.
3
+ *
4
+ * @see https://core.telegram.org/bots/webapps
5
+ */
6
+ import type { AdapterConfig } from "../../core/types.js";
7
+ /** Configuration for the Telegram Mini App adapter. */
8
+ export interface TelegramAdapterConfig extends AdapterConfig {
9
+ readonly platformOptions?: {
10
+ /** Telegram Bot token (used server-side for validation). */
11
+ readonly botToken?: string;
12
+ /** If true, validate `initData` signature from Telegram. Defaults to true. */
13
+ readonly validateInitData?: boolean;
14
+ };
15
+ }
16
+ /**
17
+ * Telegram WebApp theme parameters.
18
+ * @see https://core.telegram.org/bots/webapps#themeparams
19
+ */
20
+ export interface TelegramThemeParams {
21
+ readonly bg_color?: string;
22
+ readonly text_color?: string;
23
+ readonly hint_color?: string;
24
+ readonly link_color?: string;
25
+ readonly button_color?: string;
26
+ readonly button_text_color?: string;
27
+ readonly secondary_bg_color?: string;
28
+ readonly header_bg_color?: string;
29
+ readonly bottom_bar_bg_color?: string;
30
+ readonly accent_text_color?: string;
31
+ readonly section_bg_color?: string;
32
+ readonly section_header_text_color?: string;
33
+ readonly section_separator_color?: string;
34
+ readonly subtitle_text_color?: string;
35
+ readonly destructive_text_color?: string;
36
+ readonly [key: string]: string | undefined;
37
+ }
38
+ /** Safe area inset values from Telegram. */
39
+ export interface TelegramSafeAreaInset {
40
+ readonly top?: number;
41
+ readonly bottom?: number;
42
+ readonly left?: number;
43
+ readonly right?: number;
44
+ }
45
+ /**
46
+ * Subset of the Telegram WebApp API exposed to Mini Apps.
47
+ * @see https://core.telegram.org/bots/webapps#initializing-mini-apps
48
+ */
49
+ export interface TelegramWebApp {
50
+ readonly initData: string;
51
+ readonly initDataUnsafe: Record<string, unknown>;
52
+ readonly version: string;
53
+ readonly platform: string;
54
+ readonly colorScheme: "light" | "dark";
55
+ readonly themeParams: TelegramThemeParams;
56
+ readonly viewportHeight: number;
57
+ readonly viewportStableHeight: number;
58
+ readonly isExpanded: boolean;
59
+ readonly safeAreaInset?: TelegramSafeAreaInset;
60
+ readonly contentSafeAreaInset?: TelegramSafeAreaInset;
61
+ sendData(data: string): void;
62
+ ready(): void;
63
+ close(): void;
64
+ expand(): void;
65
+ requestFullscreen?(): void;
66
+ openLink(url: string, options?: {
67
+ try_instant_view?: boolean;
68
+ }): void;
69
+ openTelegramLink?(url: string): void;
70
+ onEvent(eventType: string, handler: () => void): void;
71
+ offEvent(eventType: string, handler: () => void): void;
72
+ MainButton?: {
73
+ text: string;
74
+ isVisible: boolean;
75
+ show(): void;
76
+ hide(): void;
77
+ onClick(handler: () => void): void;
78
+ offClick(handler: () => void): void;
79
+ };
80
+ BackButton?: {
81
+ isVisible: boolean;
82
+ show(): void;
83
+ hide(): void;
84
+ onClick(handler: () => void): void;
85
+ offClick(handler: () => void): void;
86
+ };
87
+ }
88
+ /**
89
+ * Telegram event types.
90
+ * @see https://core.telegram.org/bots/webapps#events-available-for-mini-apps
91
+ */
92
+ export type TelegramEventType = "themeChanged" | "viewportChanged" | "mainButtonClicked" | "backButtonClicked" | "settingsButtonClicked" | "invoiceClosed" | "popupClosed" | "qrTextReceived" | "clipboardTextReceived" | "writeAccessRequested" | "contactRequested" | "activated" | "deactivated" | "fullscreenChanged" | "fullscreenFailed" | "homeScreenAdded" | "homeScreenChecked" | "accelerometerStarted" | "accelerometerStopped" | "accelerometerChanged" | "deviceOrientationStarted" | "deviceOrientationStopped" | "deviceOrientationChanged" | "gyroscopeStarted" | "gyroscopeStopped" | "gyroscopeChanged" | "locationManagerUpdated" | "locationRequested" | "emojiStatusSet" | "emojiStatusFailed" | "emojiStatusAccessRequested" | "fileDownloadRequested" | "shareMessageSent" | "shareMessageFailed";
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/types.ts"],"names":[],"mappings":"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"}