@businessdash/sdk 0.9.60 → 0.9.80

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 (239) hide show
  1. package/README.md +991 -295
  2. package/assets/biab-sw.js +92 -0
  3. package/dist/account-core/index.d.ts +126 -0
  4. package/dist/account-core/index.d.ts.map +1 -0
  5. package/dist/account-core/index.js +191 -0
  6. package/dist/account-core/index.js.map +1 -0
  7. package/dist/account.d.ts +11 -0
  8. package/dist/account.d.ts.map +1 -0
  9. package/dist/account.js +11 -0
  10. package/dist/account.js.map +1 -0
  11. package/dist/auth-handler.d.ts +1 -1
  12. package/dist/auth-links.d.ts +33 -0
  13. package/dist/auth-links.d.ts.map +1 -0
  14. package/dist/auth-links.js +64 -0
  15. package/dist/auth-links.js.map +1 -0
  16. package/dist/blog-core/index.d.ts +112 -0
  17. package/dist/blog-core/index.d.ts.map +1 -0
  18. package/dist/blog-core/index.js +330 -0
  19. package/dist/blog-core/index.js.map +1 -0
  20. package/dist/blog.d.ts +11 -0
  21. package/dist/blog.d.ts.map +1 -0
  22. package/dist/blog.js +11 -0
  23. package/dist/blog.js.map +1 -0
  24. package/dist/chat-core/index.d.ts +97 -0
  25. package/dist/chat-core/index.d.ts.map +1 -0
  26. package/dist/chat-core/index.js +237 -0
  27. package/dist/chat-core/index.js.map +1 -0
  28. package/dist/chat.d.ts +11 -0
  29. package/dist/chat.d.ts.map +1 -0
  30. package/dist/chat.js +11 -0
  31. package/dist/chat.js.map +1 -0
  32. package/dist/checkout-core/index.d.ts +65 -0
  33. package/dist/checkout-core/index.d.ts.map +1 -0
  34. package/dist/checkout-core/index.js +159 -0
  35. package/dist/checkout-core/index.js.map +1 -0
  36. package/dist/checkout.d.ts +10 -0
  37. package/dist/checkout.d.ts.map +1 -0
  38. package/dist/checkout.js +10 -0
  39. package/dist/checkout.js.map +1 -0
  40. package/dist/cli.js +133 -25
  41. package/dist/cli.js.map +1 -1
  42. package/dist/client.d.ts +622 -1
  43. package/dist/client.d.ts.map +1 -1
  44. package/dist/client.js +888 -1
  45. package/dist/client.js.map +1 -1
  46. package/dist/consent-core/index.cjs +107 -0
  47. package/dist/consent-core/index.d.ts +103 -0
  48. package/dist/consent-core/index.d.ts.map +1 -0
  49. package/dist/consent-core/index.js +157 -0
  50. package/dist/consent-core/index.js.map +1 -0
  51. package/dist/contracts.d.ts +3526 -767
  52. package/dist/contracts.d.ts.map +1 -1
  53. package/dist/contracts.js +571 -4
  54. package/dist/contracts.js.map +1 -1
  55. package/dist/data-model-schema.d.ts +1 -1
  56. package/dist/data-model-schema.d.ts.map +1 -1
  57. package/dist/element.d.ts +30 -0
  58. package/dist/element.d.ts.map +1 -1
  59. package/dist/element.js +56 -0
  60. package/dist/element.js.map +1 -1
  61. package/dist/embed-protocol.d.ts +86 -0
  62. package/dist/embed-protocol.d.ts.map +1 -0
  63. package/dist/embed-protocol.js +60 -0
  64. package/dist/embed-protocol.js.map +1 -0
  65. package/dist/framework-support.d.ts +122 -0
  66. package/dist/framework-support.d.ts.map +1 -0
  67. package/dist/framework-support.js +323 -0
  68. package/dist/framework-support.js.map +1 -0
  69. package/dist/index.cjs +1355 -24
  70. package/dist/legal-core/index.cjs +115 -0
  71. package/dist/legal-core/index.d.ts +160 -0
  72. package/dist/legal-core/index.d.ts.map +1 -0
  73. package/dist/legal-core/index.js +220 -0
  74. package/dist/legal-core/index.js.map +1 -0
  75. package/dist/marketing-core/index.d.ts +66 -0
  76. package/dist/marketing-core/index.d.ts.map +1 -0
  77. package/dist/marketing-core/index.js +154 -0
  78. package/dist/marketing-core/index.js.map +1 -0
  79. package/dist/marketing.d.ts +7 -0
  80. package/dist/marketing.d.ts.map +1 -0
  81. package/dist/marketing.js +7 -0
  82. package/dist/marketing.js.map +1 -0
  83. package/dist/mcp-adapters/index.d.ts +135 -0
  84. package/dist/mcp-adapters/index.d.ts.map +1 -0
  85. package/dist/mcp-adapters/index.js +187 -0
  86. package/dist/mcp-adapters/index.js.map +1 -0
  87. package/dist/mcp-adapters.d.ts +7 -0
  88. package/dist/mcp-adapters.d.ts.map +1 -0
  89. package/dist/mcp-adapters.js +7 -0
  90. package/dist/mcp-adapters.js.map +1 -0
  91. package/dist/model3d-core/index.cjs +95 -0
  92. package/dist/model3d-core/index.d.ts +167 -0
  93. package/dist/model3d-core/index.d.ts.map +1 -0
  94. package/dist/model3d-core/index.js +158 -0
  95. package/dist/model3d-core/index.js.map +1 -0
  96. package/dist/notifications-core/index.cjs +315 -0
  97. package/dist/notifications-core/index.d.ts +229 -0
  98. package/dist/notifications-core/index.d.ts.map +1 -0
  99. package/dist/notifications-core/index.js +445 -0
  100. package/dist/notifications-core/index.js.map +1 -0
  101. package/dist/portal-core/index.d.ts +451 -0
  102. package/dist/portal-core/index.d.ts.map +1 -0
  103. package/dist/portal-core/index.js +819 -0
  104. package/dist/portal-core/index.js.map +1 -0
  105. package/dist/portal.d.ts +7 -0
  106. package/dist/portal.d.ts.map +1 -0
  107. package/dist/portal.js +7 -0
  108. package/dist/portal.js.map +1 -0
  109. package/dist/push-core/index.cjs +171 -0
  110. package/dist/push-core/index.d.ts +149 -0
  111. package/dist/push-core/index.d.ts.map +1 -0
  112. package/dist/push-core/index.js +231 -0
  113. package/dist/push-core/index.js.map +1 -0
  114. package/dist/react-marketing.d.ts +1 -17
  115. package/dist/react-marketing.d.ts.map +1 -1
  116. package/dist/react-marketing.js +4 -0
  117. package/dist/react-marketing.js.map +1 -1
  118. package/dist/react.d.ts +294 -101
  119. package/dist/react.d.ts.map +1 -1
  120. package/dist/react.js +302 -246
  121. package/dist/react.js.map +1 -1
  122. package/dist/seed-core/index.d.ts +354 -0
  123. package/dist/seed-core/index.d.ts.map +1 -0
  124. package/dist/seed-core/index.js +420 -0
  125. package/dist/seed-core/index.js.map +1 -0
  126. package/dist/seed.d.ts +7 -0
  127. package/dist/seed.d.ts.map +1 -0
  128. package/dist/seed.js +7 -0
  129. package/dist/seed.js.map +1 -0
  130. package/dist/seo-core/blog.d.ts +94 -0
  131. package/dist/seo-core/blog.d.ts.map +1 -0
  132. package/dist/seo-core/blog.js +149 -0
  133. package/dist/seo-core/blog.js.map +1 -0
  134. package/dist/seo-core/commerce.d.ts +64 -0
  135. package/dist/seo-core/commerce.d.ts.map +1 -0
  136. package/dist/seo-core/commerce.js +87 -0
  137. package/dist/seo-core/commerce.js.map +1 -0
  138. package/dist/seo-core/index.cjs +751 -0
  139. package/dist/seo-core/index.d.ts +226 -0
  140. package/dist/seo-core/index.d.ts.map +1 -0
  141. package/dist/seo-core/index.js +455 -0
  142. package/dist/seo-core/index.js.map +1 -0
  143. package/dist/seo-core/local.d.ts +181 -0
  144. package/dist/seo-core/local.d.ts.map +1 -0
  145. package/dist/seo-core/local.js +193 -0
  146. package/dist/seo-core/local.js.map +1 -0
  147. package/dist/sitemap-core/index.cjs +167 -0
  148. package/dist/sitemap-core/index.d.ts +155 -0
  149. package/dist/sitemap-core/index.d.ts.map +1 -0
  150. package/dist/sitemap-core/index.js +195 -0
  151. package/dist/sitemap-core/index.js.map +1 -0
  152. package/dist/social-core/index.d.ts +74 -0
  153. package/dist/social-core/index.d.ts.map +1 -0
  154. package/dist/social-core/index.js +72 -0
  155. package/dist/social-core/index.js.map +1 -0
  156. package/dist/social.d.ts +7 -0
  157. package/dist/social.d.ts.map +1 -0
  158. package/dist/social.js +7 -0
  159. package/dist/social.js.map +1 -0
  160. package/dist/solid-compat.d.ts +204 -0
  161. package/dist/solid-compat.d.ts.map +1 -0
  162. package/dist/solid-compat.js +221 -0
  163. package/dist/solid-compat.js.map +1 -0
  164. package/dist/store-core/index.d.ts +141 -0
  165. package/dist/store-core/index.d.ts.map +1 -0
  166. package/dist/store-core/index.js +277 -0
  167. package/dist/store-core/index.js.map +1 -0
  168. package/dist/store.d.ts +12 -0
  169. package/dist/store.d.ts.map +1 -0
  170. package/dist/store.js +12 -0
  171. package/dist/store.js.map +1 -0
  172. package/dist/vanilla.d.ts +111 -0
  173. package/dist/vanilla.d.ts.map +1 -1
  174. package/dist/vanilla.js +206 -0
  175. package/dist/vanilla.js.map +1 -1
  176. package/dist/verify-core/index.d.ts +98 -0
  177. package/dist/verify-core/index.d.ts.map +1 -0
  178. package/dist/verify-core/index.js +186 -0
  179. package/dist/verify-core/index.js.map +1 -0
  180. package/dist/verify.d.ts +8 -0
  181. package/dist/verify.d.ts.map +1 -0
  182. package/dist/verify.js +8 -0
  183. package/dist/verify.js.map +1 -0
  184. package/openapi.json +4516 -1311
  185. package/package.json +128 -11
  186. package/src/account-core/index.ts +309 -0
  187. package/src/account.ts +11 -0
  188. package/src/angular/headless.ts +519 -0
  189. package/src/angular/index.ts +3 -0
  190. package/src/auth-links.ts +76 -0
  191. package/src/blog-core/index.ts +423 -0
  192. package/src/blog.ts +11 -0
  193. package/src/chat-core/index.ts +335 -0
  194. package/src/chat.ts +11 -0
  195. package/src/checkout-core/index.ts +225 -0
  196. package/src/checkout.ts +10 -0
  197. package/src/cli.ts +184 -28
  198. package/src/client.ts +1097 -0
  199. package/src/consent-core/index.ts +213 -0
  200. package/src/contracts.ts +768 -11
  201. package/src/data-model-schema.ts +1 -1
  202. package/src/element.ts +102 -0
  203. package/src/embed-protocol.ts +100 -0
  204. package/src/framework-support.ts +440 -0
  205. package/src/legal-core/index.ts +276 -0
  206. package/src/marketing-core/index.ts +209 -0
  207. package/src/marketing.ts +7 -0
  208. package/src/mcp-adapters/index.ts +264 -0
  209. package/src/mcp-adapters.ts +7 -0
  210. package/src/model3d-core/index.ts +248 -0
  211. package/src/notifications-core/index.ts +650 -0
  212. package/src/portal-core/index.ts +1564 -0
  213. package/src/portal.ts +7 -0
  214. package/src/push-core/index.ts +335 -0
  215. package/src/qwik.tsx +602 -2
  216. package/src/react-marketing.tsx +5 -0
  217. package/src/react.tsx +434 -319
  218. package/src/seed-core/index.ts +735 -0
  219. package/src/seed.ts +7 -0
  220. package/src/seo-core/blog.ts +216 -0
  221. package/src/seo-core/commerce.ts +138 -0
  222. package/src/seo-core/index.ts +605 -0
  223. package/src/seo-core/local.ts +333 -0
  224. package/src/sitemap-core/index.ts +296 -0
  225. package/src/social-core/index.ts +103 -0
  226. package/src/social.ts +7 -0
  227. package/src/solid-compat.tsx +347 -0
  228. package/src/solid-surfaces.tsx +1311 -0
  229. package/src/solid.tsx +82 -60
  230. package/src/store-core/index.ts +426 -0
  231. package/src/store.ts +12 -0
  232. package/src/svelte/SocialLinks.svelte +84 -0
  233. package/src/svelte/headless.ts +435 -0
  234. package/src/svelte/index.ts +9 -0
  235. package/src/vanilla.ts +367 -0
  236. package/src/verify-core/index.ts +288 -0
  237. package/src/verify.ts +8 -0
  238. package/src/vue/headless.ts +527 -0
  239. package/src/vue/index.ts +3 -0
@@ -0,0 +1,154 @@
1
+ /**
2
+ * `@businessdash/sdk/marketing` — the headless marketing-page controller.
3
+ *
4
+ * Marketing pages were React-only, and the reason was accidental: the logic is
5
+ * a cache, a fetch and a status flag. This lifts it out so every binding can
6
+ * render a schema-driven page.
7
+ *
8
+ * ## Why the cache matters here specifically
9
+ *
10
+ * A site can have many marketing pages, and a visitor reads one. Fetching all
11
+ * of them to render one is the obvious mistake, so `open()` pulls a single page
12
+ * on demand, and `prefetch()` exists for the case where you know what is coming
13
+ * next (a nav hover, a likely next step) and want it warm before the click.
14
+ *
15
+ * The SDK client keeps its own cache; this controller does not duplicate it. It
16
+ * tracks WHICH page is showing and whether a request is in flight — the cache
17
+ * itself stays one layer down, where every framework already shares it.
18
+ *
19
+ * @module
20
+ */
21
+ function toError(cause, fallback) {
22
+ return cause instanceof Error ? cause : new Error(fallback);
23
+ }
24
+ export function createMarketingController(options) {
25
+ const { client, onError } = options;
26
+ let destroyed = false;
27
+ /** Guards against a slow page landing after the visitor moved on. */
28
+ let pageToken = 0;
29
+ const subscribers = new Set();
30
+ const state = {
31
+ status: "idle",
32
+ pages: [],
33
+ page: null,
34
+ pageKey: null,
35
+ error: null,
36
+ pending: { list: false, page: false },
37
+ };
38
+ let cached = null;
39
+ function snapshot() {
40
+ if (!cached) {
41
+ cached = {
42
+ status: state.status,
43
+ pages: state.pages,
44
+ page: state.page,
45
+ pageKey: state.pageKey,
46
+ error: state.error,
47
+ pending: state.pending,
48
+ };
49
+ }
50
+ return cached;
51
+ }
52
+ function notify() {
53
+ if (destroyed)
54
+ return;
55
+ cached = null;
56
+ const next = snapshot();
57
+ for (const cb of subscribers)
58
+ cb(next);
59
+ }
60
+ function fail(cause, fallback) {
61
+ const error = toError(cause, fallback);
62
+ state.error = error;
63
+ if (state.status !== "ready")
64
+ state.status = "error";
65
+ onError?.(error);
66
+ }
67
+ return {
68
+ snapshot,
69
+ subscribe(callback) {
70
+ subscribers.add(callback);
71
+ return () => {
72
+ subscribers.delete(callback);
73
+ };
74
+ },
75
+ async load() {
76
+ if (destroyed)
77
+ return;
78
+ state.pending.list = true;
79
+ state.error = null;
80
+ if (state.status === "idle")
81
+ state.status = "loading";
82
+ notify();
83
+ try {
84
+ const res = await client.marketingPages.list();
85
+ if (destroyed)
86
+ return;
87
+ state.pages = res.pages;
88
+ state.status = "ready";
89
+ }
90
+ catch (cause) {
91
+ if (!destroyed)
92
+ fail(cause, "Failed to load the page index.");
93
+ }
94
+ finally {
95
+ if (!destroyed) {
96
+ state.pending.list = false;
97
+ notify();
98
+ }
99
+ }
100
+ },
101
+ async open(pageKey = "home", openOptions) {
102
+ if (destroyed)
103
+ return;
104
+ const token = ++pageToken;
105
+ state.pending.page = true;
106
+ state.error = null;
107
+ state.pageKey = pageKey;
108
+ notify();
109
+ try {
110
+ const page = await client.marketingPages.get(pageKey, openOptions);
111
+ if (destroyed || token !== pageToken)
112
+ return;
113
+ state.page = page;
114
+ state.status = "ready";
115
+ }
116
+ catch (cause) {
117
+ if (destroyed || token !== pageToken)
118
+ return;
119
+ fail(cause, `Failed to load the "${pageKey}" page.`);
120
+ }
121
+ finally {
122
+ if (!destroyed && token === pageToken) {
123
+ state.pending.page = false;
124
+ notify();
125
+ }
126
+ }
127
+ },
128
+ async prefetch(pageKey = "home") {
129
+ if (destroyed)
130
+ return;
131
+ try {
132
+ await client.marketingPages.prefetch(pageKey);
133
+ }
134
+ catch {
135
+ // Prefetching is a guess about where the visitor is going. Being
136
+ // wrong, or failing, must never surface as an error on the page
137
+ // they are actually reading.
138
+ }
139
+ },
140
+ close() {
141
+ if (destroyed)
142
+ return;
143
+ pageToken += 1; // orphan any in-flight page request
144
+ state.page = null;
145
+ state.pageKey = null;
146
+ notify();
147
+ },
148
+ destroy() {
149
+ destroyed = true;
150
+ subscribers.clear();
151
+ },
152
+ };
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketing-core/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `@businessdash/sdk/marketing` — the framework-agnostic marketing-page core.
3
+ *
4
+ * @module
5
+ */
6
+ export * from "./marketing-core/index.js";
7
+ //# sourceMappingURL=marketing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing.d.ts","sourceRoot":"","sources":["../src/marketing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `@businessdash/sdk/marketing` — the framework-agnostic marketing-page core.
3
+ *
4
+ * @module
5
+ */
6
+ export * from "./marketing-core/index.js";
7
+ //# sourceMappingURL=marketing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing.js","sourceRoot":"","sources":["../src/marketing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * `@businessdash/sdk/mcp-adapters` — mount the MCP connector on any framework.
3
+ *
4
+ * `mcpHandler` returns Web-standard `(Request) => Promise<Response>`, which is
5
+ * exactly right for Next's App Router, Astro, Remix and TanStack Start, and
6
+ * exactly wrong for everything else: SvelteKit hands you `{ request }`,
7
+ * Nuxt/Nitro hands you an H3 `event`, Qwik City hands you a `RequestEvent` with
8
+ * `send()`, and Express hands you Node's `req`/`res`.
9
+ *
10
+ * So a consumer on four of the eight frameworks had to work out the bridging
11
+ * themselves, for a surface whose whole selling point is that an org hands
12
+ * Claude or ChatGPT a URL on their OWN domain. This module is that bridging,
13
+ * written once.
14
+ *
15
+ * Every adapter is a thin shape-change over the same handler — no adapter
16
+ * reimplements the proxy, the error mapping or the manifest caching, so a fix
17
+ * to any of those lands everywhere at once.
18
+ *
19
+ * @module
20
+ */
21
+ import { type McpProxyOptions } from "../mcp.js";
22
+ /**
23
+ * SvelteKit (and Astro, which has the same shape).
24
+ *
25
+ * ```ts
26
+ * // src/routes/api/mcp/+server.ts
27
+ * import { sveltekitMcpHandler } from '@businessdash/sdk/mcp-adapters'
28
+ * export const { POST, GET } = sveltekitMcpHandler({ siteId, baseUrl })
29
+ * ```
30
+ */
31
+ export declare function sveltekitMcpHandler(options: McpProxyOptions): {
32
+ POST: (event: {
33
+ request: Request;
34
+ }) => Promise<Response>;
35
+ GET: () => Promise<Response>;
36
+ };
37
+ /** SvelteKit / Astro manifest route for `.well-known/mcp.json`. */
38
+ export declare function sveltekitMcpManifestHandler(options: McpProxyOptions): (event: {
39
+ request: Request;
40
+ }) => Promise<Response>;
41
+ /** Astro is the same shape as SvelteKit; aliased so the import reads right. */
42
+ export declare const astroMcpHandler: typeof sveltekitMcpHandler;
43
+ export declare const astroMcpManifestHandler: typeof sveltekitMcpManifestHandler;
44
+ /**
45
+ * The minimum of H3's event we touch. Declared structurally rather than
46
+ * importing `h3`, so this module adds no dependency for consumers who are not
47
+ * on Nuxt.
48
+ */
49
+ type H3EventLike = {
50
+ node: {
51
+ req: {
52
+ method?: string | undefined;
53
+ };
54
+ };
55
+ web?: {
56
+ request?: Request;
57
+ } | undefined;
58
+ };
59
+ /**
60
+ * Nuxt / Nitro.
61
+ *
62
+ * ```ts
63
+ * // server/routes/api/mcp.post.ts
64
+ * import { nitroMcpHandler } from '@businessdash/sdk/mcp-adapters'
65
+ * export default defineEventHandler(nitroMcpHandler({ siteId, baseUrl }))
66
+ * ```
67
+ *
68
+ * Nitro exposes the original Web `Request` on `event.web.request` in recent
69
+ * versions. `toWebRequest` is passed in rather than imported so this stays
70
+ * dependency-free — on older Nitro, hand it `toWebRequest` from `h3`.
71
+ */
72
+ export declare function nitroMcpHandler(options: McpProxyOptions, deps?: {
73
+ toWebRequest?: (event: unknown) => Request;
74
+ }): (event: H3EventLike) => Promise<Response>;
75
+ /** Nuxt / Nitro manifest route. */
76
+ export declare function nitroMcpManifestHandler(options: McpProxyOptions, deps?: {
77
+ toWebRequest?: (event: unknown) => Request;
78
+ }): (event: H3EventLike) => Promise<Response>;
79
+ /** The slice of Qwik City's `RequestEvent` these adapters use. */
80
+ type QwikRequestEventLike = {
81
+ request: Request;
82
+ send: (response: Response) => void;
83
+ };
84
+ /**
85
+ * Qwik City.
86
+ *
87
+ * ```ts
88
+ * // src/routes/api/mcp/index.ts
89
+ * import { qwikMcpHandler } from '@businessdash/sdk/mcp-adapters'
90
+ * const mcp = qwikMcpHandler({ siteId, baseUrl })
91
+ * export const onPost = mcp.onPost
92
+ * export const onGet = mcp.onGet
93
+ * ```
94
+ *
95
+ * Qwik City returns a response by CALLING `send()` rather than returning it,
96
+ * which is the detail most people get wrong when wiring this by hand.
97
+ */
98
+ export declare function qwikMcpHandler(options: McpProxyOptions): {
99
+ onPost: (event: QwikRequestEventLike) => Promise<void>;
100
+ onGet: (event: QwikRequestEventLike) => Promise<void>;
101
+ };
102
+ /** Qwik City manifest route. */
103
+ export declare function qwikMcpManifestHandler(options: McpProxyOptions): (event: QwikRequestEventLike) => Promise<void>;
104
+ /** The Node req/res surface these adapters touch. */
105
+ type NodeRequestLike = {
106
+ method?: string | undefined;
107
+ url?: string | undefined;
108
+ headers: Record<string, string | string[] | undefined>;
109
+ on(event: string, listener: (chunk?: unknown) => void): unknown;
110
+ };
111
+ type NodeResponseLike = {
112
+ statusCode: number;
113
+ setHeader(name: string, value: string): void;
114
+ end(body?: string): void;
115
+ };
116
+ /**
117
+ * Express, and Angular Universal / Analog, which both run on Node's req/res.
118
+ *
119
+ * ```ts
120
+ * const mcp = expressMcpHandler({ siteId, baseUrl })
121
+ * app.post('/api/mcp', mcp)
122
+ * app.get('/api/mcp', mcp)
123
+ * app.get('/.well-known/mcp.json', expressMcpManifestHandler({ siteId, baseUrl }))
124
+ * ```
125
+ *
126
+ * Node gives a stream rather than a `Request`, so the body is collected first.
127
+ * `origin` matters for the manifest — it is what tells the platform which
128
+ * domain to advertise — so it is reconstructed from the Host header rather
129
+ * than guessed.
130
+ */
131
+ export declare function expressMcpHandler(options: McpProxyOptions): (req: NodeRequestLike, res: NodeResponseLike) => Promise<void>;
132
+ /** Express / Node manifest route for `.well-known/mcp.json`. */
133
+ export declare function expressMcpManifestHandler(options: McpProxyOptions): (req: NodeRequestLike, res: NodeResponseLike) => Promise<void>;
134
+ export {};
135
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * `@businessdash/sdk/mcp-adapters` — mount the MCP connector on any framework.
3
+ *
4
+ * `mcpHandler` returns Web-standard `(Request) => Promise<Response>`, which is
5
+ * exactly right for Next's App Router, Astro, Remix and TanStack Start, and
6
+ * exactly wrong for everything else: SvelteKit hands you `{ request }`,
7
+ * Nuxt/Nitro hands you an H3 `event`, Qwik City hands you a `RequestEvent` with
8
+ * `send()`, and Express hands you Node's `req`/`res`.
9
+ *
10
+ * So a consumer on four of the eight frameworks had to work out the bridging
11
+ * themselves, for a surface whose whole selling point is that an org hands
12
+ * Claude or ChatGPT a URL on their OWN domain. This module is that bridging,
13
+ * written once.
14
+ *
15
+ * Every adapter is a thin shape-change over the same handler — no adapter
16
+ * reimplements the proxy, the error mapping or the manifest caching, so a fix
17
+ * to any of those lands everywhere at once.
18
+ *
19
+ * @module
20
+ */
21
+ import { mcpHandler, mcpManifestHandler, } from "../mcp.js";
22
+ /**
23
+ * SvelteKit (and Astro, which has the same shape).
24
+ *
25
+ * ```ts
26
+ * // src/routes/api/mcp/+server.ts
27
+ * import { sveltekitMcpHandler } from '@businessdash/sdk/mcp-adapters'
28
+ * export const { POST, GET } = sveltekitMcpHandler({ siteId, baseUrl })
29
+ * ```
30
+ */
31
+ export function sveltekitMcpHandler(options) {
32
+ const handler = mcpHandler(options);
33
+ return {
34
+ POST: (event) => handler.POST(event.request),
35
+ GET: () => handler.GET(),
36
+ };
37
+ }
38
+ /** SvelteKit / Astro manifest route for `.well-known/mcp.json`. */
39
+ export function sveltekitMcpManifestHandler(options) {
40
+ const handler = mcpManifestHandler(options);
41
+ return (event) => handler(event.request);
42
+ }
43
+ /** Astro is the same shape as SvelteKit; aliased so the import reads right. */
44
+ export const astroMcpHandler = sveltekitMcpHandler;
45
+ export const astroMcpManifestHandler = sveltekitMcpManifestHandler;
46
+ /**
47
+ * Nuxt / Nitro.
48
+ *
49
+ * ```ts
50
+ * // server/routes/api/mcp.post.ts
51
+ * import { nitroMcpHandler } from '@businessdash/sdk/mcp-adapters'
52
+ * export default defineEventHandler(nitroMcpHandler({ siteId, baseUrl }))
53
+ * ```
54
+ *
55
+ * Nitro exposes the original Web `Request` on `event.web.request` in recent
56
+ * versions. `toWebRequest` is passed in rather than imported so this stays
57
+ * dependency-free — on older Nitro, hand it `toWebRequest` from `h3`.
58
+ */
59
+ export function nitroMcpHandler(options, deps = {}) {
60
+ const handler = mcpHandler(options);
61
+ return async (event) => {
62
+ const request = event.web?.request ?? deps.toWebRequest?.(event);
63
+ if (!request) {
64
+ // Failing loudly beats proxying an empty body and returning a
65
+ // confusing JSON-RPC error the consumer cannot trace.
66
+ throw new Error("nitroMcpHandler could not read a Web Request from the H3 event. On Nitro versions without `event.web.request`, pass `{ toWebRequest }` from `h3`.");
67
+ }
68
+ return (event.node.req.method ?? "GET").toUpperCase() === "POST"
69
+ ? handler.POST(request)
70
+ : handler.GET();
71
+ };
72
+ }
73
+ /** Nuxt / Nitro manifest route. */
74
+ export function nitroMcpManifestHandler(options, deps = {}) {
75
+ const handler = mcpManifestHandler(options);
76
+ return async (event) => {
77
+ const request = event.web?.request ?? deps.toWebRequest?.(event);
78
+ if (!request) {
79
+ throw new Error("nitroMcpManifestHandler could not read a Web Request from the H3 event. Pass `{ toWebRequest }` from `h3` on older Nitro.");
80
+ }
81
+ return handler(request);
82
+ };
83
+ }
84
+ /**
85
+ * Qwik City.
86
+ *
87
+ * ```ts
88
+ * // src/routes/api/mcp/index.ts
89
+ * import { qwikMcpHandler } from '@businessdash/sdk/mcp-adapters'
90
+ * const mcp = qwikMcpHandler({ siteId, baseUrl })
91
+ * export const onPost = mcp.onPost
92
+ * export const onGet = mcp.onGet
93
+ * ```
94
+ *
95
+ * Qwik City returns a response by CALLING `send()` rather than returning it,
96
+ * which is the detail most people get wrong when wiring this by hand.
97
+ */
98
+ export function qwikMcpHandler(options) {
99
+ const handler = mcpHandler(options);
100
+ return {
101
+ onPost: async (event) => {
102
+ event.send(await handler.POST(event.request));
103
+ },
104
+ onGet: async (event) => {
105
+ event.send(await handler.GET());
106
+ },
107
+ };
108
+ }
109
+ /** Qwik City manifest route. */
110
+ export function qwikMcpManifestHandler(options) {
111
+ const handler = mcpManifestHandler(options);
112
+ return async (event) => {
113
+ event.send(await handler(event.request));
114
+ };
115
+ }
116
+ /**
117
+ * Express, and Angular Universal / Analog, which both run on Node's req/res.
118
+ *
119
+ * ```ts
120
+ * const mcp = expressMcpHandler({ siteId, baseUrl })
121
+ * app.post('/api/mcp', mcp)
122
+ * app.get('/api/mcp', mcp)
123
+ * app.get('/.well-known/mcp.json', expressMcpManifestHandler({ siteId, baseUrl }))
124
+ * ```
125
+ *
126
+ * Node gives a stream rather than a `Request`, so the body is collected first.
127
+ * `origin` matters for the manifest — it is what tells the platform which
128
+ * domain to advertise — so it is reconstructed from the Host header rather
129
+ * than guessed.
130
+ */
131
+ export function expressMcpHandler(options) {
132
+ const handler = mcpHandler(options);
133
+ return async (req, res) => {
134
+ const method = (req.method ?? "GET").toUpperCase();
135
+ const response = method === "POST"
136
+ ? await handler.POST(new Request(reconstructUrl(req), {
137
+ method: "POST",
138
+ headers: {
139
+ "content-type": "application/json",
140
+ accept: headerValue(req.headers.accept) ?? "application/json",
141
+ },
142
+ body: await readBody(req),
143
+ }))
144
+ : await handler.GET();
145
+ await writeNodeResponse(res, response);
146
+ };
147
+ }
148
+ /** Express / Node manifest route for `.well-known/mcp.json`. */
149
+ export function expressMcpManifestHandler(options) {
150
+ const handler = mcpManifestHandler(options);
151
+ return async (req, res) => {
152
+ const response = await handler(new Request(reconstructUrl(req)));
153
+ await writeNodeResponse(res, response);
154
+ };
155
+ }
156
+ function headerValue(value) {
157
+ return Array.isArray(value) ? value[0] : value;
158
+ }
159
+ /**
160
+ * Rebuild the absolute URL Node does not give us.
161
+ *
162
+ * The manifest handler reads `new URL(request.url).origin` to tell the platform
163
+ * which domain to advertise, so a placeholder host here would publish the wrong
164
+ * connector URL — the one failure mode of this whole surface.
165
+ */
166
+ function reconstructUrl(req) {
167
+ const host = headerValue(req.headers.host) ?? "localhost";
168
+ const proto = headerValue(req.headers["x-forwarded-proto"]) ?? "https";
169
+ return `${proto}://${host}${req.url ?? "/"}`;
170
+ }
171
+ function readBody(req) {
172
+ return new Promise((resolve, reject) => {
173
+ const chunks = [];
174
+ req.on("data", (chunk) => chunks.push(String(chunk)));
175
+ req.on("end", () => resolve(chunks.join("")));
176
+ req.on("error", (error) => reject(error));
177
+ });
178
+ }
179
+ async function writeNodeResponse(res, response) {
180
+ res.statusCode = response.status;
181
+ response.headers.forEach((value, name) => {
182
+ res.setHeader(name, value);
183
+ });
184
+ const text = await response.text();
185
+ res.end(text.length > 0 ? text : undefined);
186
+ }
187
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `@businessdash/sdk/mcp-adapters` — mount the MCP connector on any framework.
3
+ *
4
+ * @module
5
+ */
6
+ export * from "./mcp-adapters/index.js";
7
+ //# sourceMappingURL=mcp-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-adapters.d.ts","sourceRoot":"","sources":["../src/mcp-adapters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `@businessdash/sdk/mcp-adapters` — mount the MCP connector on any framework.
3
+ *
4
+ * @module
5
+ */
6
+ export * from "./mcp-adapters/index.js";
7
+ //# sourceMappingURL=mcp-adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-adapters.js","sourceRoot":"","sources":["../src/mcp-adapters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/model3d-core/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ arLinkAttributes: () => arLinkAttributes,
24
+ cadFormat: () => cadFormat,
25
+ hasModel3dEntitlement: () => hasModel3dEntitlement,
26
+ planProductModel: () => planProductModel,
27
+ supportsArQuickLook: () => supportsArQuickLook,
28
+ webModelFormat: () => webModelFormat
29
+ });
30
+ module.exports = __toCommonJS(index_exports);
31
+ function extensionOf(url) {
32
+ const path = url.split(/[?#]/)[0] ?? "";
33
+ const last = path.slice(path.lastIndexOf("/") + 1);
34
+ const dot = last.lastIndexOf(".");
35
+ return dot === -1 ? "" : last.slice(dot + 1).toLowerCase();
36
+ }
37
+ function webModelFormat(url) {
38
+ if (!url) return null;
39
+ const ext = extensionOf(url);
40
+ return ext === "glb" || ext === "gltf" || ext === "obj" || ext === "stl" ? ext : null;
41
+ }
42
+ function cadFormat(url) {
43
+ if (!url) return null;
44
+ const ext = extensionOf(url);
45
+ if (ext === "step" || ext === "stp") return "step";
46
+ if (ext === "iges" || ext === "igs") return "iges";
47
+ return ext ? "native" : null;
48
+ }
49
+ function supportsArQuickLook() {
50
+ if (typeof document === "undefined") return false;
51
+ const anchor = document.createElement("a");
52
+ return Boolean(anchor.relList?.supports?.("ar"));
53
+ }
54
+ function planProductModel(product, options = {}) {
55
+ const arSupported = options.arSupported ?? supportsArQuickLook();
56
+ const usdz = product.model3dUsdzUrl?.trim() || null;
57
+ const ar = arSupported && usdz ? { url: usdz } : null;
58
+ const viewerUrl = product.model3dUrl?.trim() || null;
59
+ const format = webModelFormat(viewerUrl);
60
+ const viewer = viewerUrl && format ? {
61
+ url: viewerUrl,
62
+ format,
63
+ // .obj and .stl are geometry only. A viewer lighting them like
64
+ // a .glb renders a black silhouette.
65
+ neutralMaterial: format === "obj" || format === "stl"
66
+ } : null;
67
+ const cadName = product.model3dCadName?.trim() || null;
68
+ const cad = product.model3dCadAvailable ? cadFormat(cadName) ?? "native" : null;
69
+ const download = cad && options.cadDownloadUrl ? {
70
+ url: options.cadDownloadUrl,
71
+ label: cadName || defaultCadLabel(cad),
72
+ format: cad
73
+ } : null;
74
+ return { ar, viewer, download, empty: !ar && !viewer && !download && !usdz };
75
+ }
76
+ function defaultCadLabel(format) {
77
+ if (format === "step") return "Download STEP file";
78
+ if (format === "iges") return "Download IGES file";
79
+ return "Download CAD file";
80
+ }
81
+ function arLinkAttributes(url) {
82
+ return { href: url, rel: "ar" };
83
+ }
84
+ function hasModel3dEntitlement(product) {
85
+ return "model3dUrl" in product || "model3dUsdzUrl" in product || "model3dCadAvailable" in product;
86
+ }
87
+ // Annotate the CommonJS export names for ESM import in node:
88
+ 0 && (module.exports = {
89
+ arLinkAttributes,
90
+ cadFormat,
91
+ hasModel3dEntitlement,
92
+ planProductModel,
93
+ supportsArQuickLook,
94
+ webModelFormat
95
+ });