skybridge 0.0.0-dev.bfd7070 → 0.0.0-dev.bfdcccb

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 (526) hide show
  1. package/README.md +126 -116
  2. package/dist/cli/build-helpers.d.ts +11 -0
  3. package/dist/cli/build-helpers.js +107 -0
  4. package/dist/cli/build-helpers.js.map +1 -0
  5. package/dist/cli/build-helpers.test.js +132 -0
  6. package/dist/cli/build-helpers.test.js.map +1 -0
  7. package/dist/cli/build-steps.d.ts +2 -0
  8. package/dist/cli/build-steps.js +73 -0
  9. package/dist/cli/build-steps.js.map +1 -0
  10. package/dist/cli/build-steps.test.js +52 -0
  11. package/dist/cli/build-steps.test.js.map +1 -0
  12. package/dist/cli/detect-port.d.ts +2 -2
  13. package/dist/cli/detect-port.js +8 -20
  14. package/dist/cli/detect-port.js.map +1 -1
  15. package/dist/cli/header.d.ts +1 -1
  16. package/dist/cli/header.js +1 -1
  17. package/dist/cli/header.js.map +1 -1
  18. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  19. package/dist/cli/resolve-skybridge-config.js +18 -0
  20. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  21. package/dist/cli/run-command.js.map +1 -1
  22. package/dist/cli/run-plain.d.ts +18 -0
  23. package/dist/cli/run-plain.js +90 -0
  24. package/dist/cli/run-plain.js.map +1 -0
  25. package/dist/cli/telemetry.js +2 -0
  26. package/dist/cli/telemetry.js.map +1 -1
  27. package/dist/cli/tunnel-control-server.d.ts +9 -0
  28. package/dist/cli/tunnel-control-server.js +31 -0
  29. package/dist/cli/tunnel-control-server.js.map +1 -0
  30. package/dist/cli/tunnel-control-server.test.js +39 -0
  31. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  32. package/dist/cli/tunnel-handler.d.ts +3 -0
  33. package/dist/cli/tunnel-handler.js +48 -0
  34. package/dist/cli/tunnel-handler.js.map +1 -0
  35. package/dist/cli/tunnel-handler.test.js +105 -0
  36. package/dist/cli/tunnel-handler.test.js.map +1 -0
  37. package/dist/cli/tunnel.d.ts +57 -0
  38. package/dist/cli/tunnel.js +154 -0
  39. package/dist/cli/tunnel.js.map +1 -0
  40. package/dist/cli/tunnel.test.js +190 -0
  41. package/dist/cli/tunnel.test.js.map +1 -0
  42. package/dist/cli/types.d.ts +5 -0
  43. package/dist/cli/types.js +2 -0
  44. package/dist/cli/types.js.map +1 -0
  45. package/dist/cli/use-execute-steps.d.ts +1 -1
  46. package/dist/cli/use-execute-steps.js.map +1 -1
  47. package/dist/cli/use-messages.d.ts +3 -0
  48. package/dist/cli/use-messages.js +11 -0
  49. package/dist/cli/use-messages.js.map +1 -0
  50. package/dist/cli/use-nodemon.d.ts +26 -6
  51. package/dist/cli/use-nodemon.js +97 -60
  52. package/dist/cli/use-nodemon.js.map +1 -1
  53. package/dist/cli/use-open-browser.d.ts +1 -0
  54. package/dist/cli/use-open-browser.js +44 -0
  55. package/dist/cli/use-open-browser.js.map +1 -0
  56. package/dist/cli/use-tunnel.d.ts +14 -0
  57. package/dist/cli/use-tunnel.js +131 -0
  58. package/dist/cli/use-tunnel.js.map +1 -0
  59. package/dist/cli/use-typescript-check.d.ts +9 -2
  60. package/dist/cli/use-typescript-check.js +89 -51
  61. package/dist/cli/use-typescript-check.js.map +1 -1
  62. package/dist/commands/build.d.ts +0 -3
  63. package/dist/commands/build.js +3 -18
  64. package/dist/commands/build.js.map +1 -1
  65. package/dist/commands/create.d.ts +9 -0
  66. package/dist/commands/create.js +30 -0
  67. package/dist/commands/create.js.map +1 -0
  68. package/dist/commands/dev.d.ts +4 -1
  69. package/dist/commands/dev.js +96 -9
  70. package/dist/commands/dev.js.map +1 -1
  71. package/dist/commands/start.js +13 -10
  72. package/dist/commands/start.js.map +1 -1
  73. package/dist/commands/telemetry/disable.js.map +1 -1
  74. package/dist/commands/telemetry/enable.js.map +1 -1
  75. package/dist/commands/telemetry/status.js.map +1 -1
  76. package/dist/context-warnings.d.ts +5 -0
  77. package/dist/context-warnings.js +31 -0
  78. package/dist/context-warnings.js.map +1 -0
  79. package/dist/context-warnings.test.js +28 -0
  80. package/dist/context-warnings.test.js.map +1 -0
  81. package/dist/server/app.d.ts +220 -0
  82. package/dist/server/app.js +295 -0
  83. package/dist/server/app.js.map +1 -0
  84. package/dist/server/app.test.d.ts +1 -0
  85. package/dist/server/app.test.js +97 -0
  86. package/dist/server/app.test.js.map +1 -0
  87. package/dist/server/asset-base-url-transform-plugin.d.ts +6 -6
  88. package/dist/server/asset-base-url-transform-plugin.js +25 -11
  89. package/dist/server/asset-base-url-transform-plugin.js.map +1 -1
  90. package/dist/server/asset-base-url-transform-plugin.test.js +92 -14
  91. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -1
  92. package/dist/server/auth/discovery.d.ts +33 -0
  93. package/dist/server/auth/discovery.js +56 -0
  94. package/dist/server/auth/discovery.js.map +1 -0
  95. package/dist/server/auth/discovery.test.d.ts +1 -0
  96. package/dist/server/auth/discovery.test.js +93 -0
  97. package/dist/server/auth/discovery.test.js.map +1 -0
  98. package/dist/server/auth/index.d.ts +48 -0
  99. package/dist/server/auth/index.js +2 -0
  100. package/dist/server/auth/index.js.map +1 -0
  101. package/dist/server/auth/providers/auth0.d.ts +40 -0
  102. package/dist/server/auth/providers/auth0.js +36 -0
  103. package/dist/server/auth/providers/auth0.js.map +1 -0
  104. package/dist/server/auth/providers/auth0.test.d.ts +1 -0
  105. package/dist/server/auth/providers/auth0.test.js +50 -0
  106. package/dist/server/auth/providers/auth0.test.js.map +1 -0
  107. package/dist/server/auth/providers/authplane.d.ts +49 -0
  108. package/dist/server/auth/providers/authplane.js +57 -0
  109. package/dist/server/auth/providers/authplane.js.map +1 -0
  110. package/dist/server/auth/providers/authplane.test.d.ts +1 -0
  111. package/dist/server/auth/providers/authplane.test.js +143 -0
  112. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  113. package/dist/server/auth/providers/clerk.d.ts +51 -0
  114. package/dist/server/auth/providers/clerk.js +19 -0
  115. package/dist/server/auth/providers/clerk.js.map +1 -0
  116. package/dist/server/auth/providers/clerk.test.d.ts +1 -0
  117. package/dist/server/auth/providers/clerk.test.js +30 -0
  118. package/dist/server/auth/providers/clerk.test.js.map +1 -0
  119. package/dist/server/auth/providers/custom.d.ts +42 -0
  120. package/dist/server/auth/providers/custom.js +59 -0
  121. package/dist/server/auth/providers/custom.js.map +1 -0
  122. package/dist/server/auth/providers/custom.test.d.ts +1 -0
  123. package/dist/server/auth/providers/custom.test.js +161 -0
  124. package/dist/server/auth/providers/custom.test.js.map +1 -0
  125. package/dist/server/auth/providers/descope.d.ts +44 -0
  126. package/dist/server/auth/providers/descope.js +44 -0
  127. package/dist/server/auth/providers/descope.js.map +1 -0
  128. package/dist/server/auth/providers/descope.test.d.ts +1 -0
  129. package/dist/server/auth/providers/descope.test.js +62 -0
  130. package/dist/server/auth/providers/descope.test.js.map +1 -0
  131. package/dist/server/auth/providers/shared.d.ts +2 -0
  132. package/dist/server/auth/providers/shared.js +6 -0
  133. package/dist/server/auth/providers/shared.js.map +1 -0
  134. package/dist/server/auth/providers/shared.test.d.ts +1 -0
  135. package/dist/server/auth/providers/shared.test.js +10 -0
  136. package/dist/server/auth/providers/shared.test.js.map +1 -0
  137. package/dist/server/auth/providers/stytch.d.ts +25 -0
  138. package/dist/server/auth/providers/stytch.js +16 -0
  139. package/dist/server/auth/providers/stytch.js.map +1 -0
  140. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  141. package/dist/server/auth/providers/verify-spy.js +21 -0
  142. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  143. package/dist/server/auth/providers/workos.d.ts +34 -0
  144. package/dist/server/auth/providers/workos.js +16 -0
  145. package/dist/server/auth/providers/workos.js.map +1 -0
  146. package/dist/server/auth/security-schemes.d.ts +23 -0
  147. package/dist/server/auth/security-schemes.js +64 -0
  148. package/dist/server/auth/security-schemes.js.map +1 -0
  149. package/dist/server/auth/security-schemes.test.d.ts +1 -0
  150. package/dist/server/auth/security-schemes.test.js +99 -0
  151. package/dist/server/auth/security-schemes.test.js.map +1 -0
  152. package/dist/server/auth/setup.d.ts +6 -0
  153. package/dist/server/auth/setup.js +91 -0
  154. package/dist/server/auth/setup.js.map +1 -0
  155. package/dist/server/auth/setup.test.d.ts +1 -0
  156. package/dist/server/auth/setup.test.js +514 -0
  157. package/dist/server/auth/setup.test.js.map +1 -0
  158. package/dist/server/auth/verify.d.ts +48 -0
  159. package/dist/server/auth/verify.js +62 -0
  160. package/dist/server/auth/verify.js.map +1 -0
  161. package/dist/server/auth/verify.test.d.ts +1 -0
  162. package/dist/server/auth/verify.test.js +165 -0
  163. package/dist/server/auth/verify.test.js.map +1 -0
  164. package/dist/server/auth-extra.test-d.d.ts +1 -0
  165. package/dist/server/auth-extra.test-d.js +130 -0
  166. package/dist/server/auth-extra.test-d.js.map +1 -0
  167. package/dist/server/auth.d.ts +57 -0
  168. package/dist/server/auth.js +27 -0
  169. package/dist/server/auth.js.map +1 -0
  170. package/dist/server/build-manifest.test.d.ts +1 -0
  171. package/dist/server/build-manifest.test.js +28 -0
  172. package/dist/server/build-manifest.test.js.map +1 -0
  173. package/dist/server/content-helpers.d.ts +67 -0
  174. package/dist/server/content-helpers.js +79 -0
  175. package/dist/server/content-helpers.js.map +1 -0
  176. package/dist/server/content-helpers.test.d.ts +1 -0
  177. package/dist/server/content-helpers.test.js +70 -0
  178. package/dist/server/content-helpers.test.js.map +1 -0
  179. package/dist/server/events.d.ts +125 -0
  180. package/dist/server/events.js +449 -0
  181. package/dist/server/events.js.map +1 -0
  182. package/dist/server/events.test.d.ts +1 -0
  183. package/dist/server/events.test.js +142 -0
  184. package/dist/server/events.test.js.map +1 -0
  185. package/dist/server/express.d.ts +27 -5
  186. package/dist/server/express.js +78 -43
  187. package/dist/server/express.js.map +1 -1
  188. package/dist/server/express.test.js +556 -22
  189. package/dist/server/express.test.js.map +1 -1
  190. package/dist/server/file-ref.d.ts +28 -0
  191. package/dist/server/file-ref.js +27 -0
  192. package/dist/server/file-ref.js.map +1 -0
  193. package/dist/server/host.d.ts +2 -0
  194. package/dist/server/host.js +11 -0
  195. package/dist/server/host.js.map +1 -0
  196. package/dist/server/host.test.d.ts +1 -0
  197. package/dist/server/host.test.js +13 -0
  198. package/dist/server/host.test.js.map +1 -0
  199. package/dist/server/index.d.ts +22 -3
  200. package/dist/server/index.js +17 -2
  201. package/dist/server/index.js.map +1 -1
  202. package/dist/server/inferUtilityTypes.d.ts +6 -6
  203. package/dist/server/inferUtilityTypes.js.map +1 -1
  204. package/dist/server/mcp-errors.test.d.ts +1 -0
  205. package/dist/server/mcp-errors.test.js +41 -0
  206. package/dist/server/mcp-errors.test.js.map +1 -0
  207. package/dist/server/metric.d.ts +14 -0
  208. package/dist/server/metric.js +62 -0
  209. package/dist/server/metric.js.map +1 -0
  210. package/dist/server/middleware.d.ts +162 -0
  211. package/dist/server/middleware.js +126 -0
  212. package/dist/server/middleware.js.map +1 -0
  213. package/dist/server/middleware.test-d.d.ts +1 -0
  214. package/dist/server/middleware.test-d.js +75 -0
  215. package/dist/server/middleware.test-d.js.map +1 -0
  216. package/dist/server/middleware.test.d.ts +1 -0
  217. package/dist/server/middleware.test.js +601 -0
  218. package/dist/server/middleware.test.js.map +1 -0
  219. package/dist/server/register-tool.test.d.ts +1 -0
  220. package/dist/server/register-tool.test.js +110 -0
  221. package/dist/server/register-tool.test.js.map +1 -0
  222. package/dist/server/requestOrigin.d.ts +7 -0
  223. package/dist/server/requestOrigin.js +25 -0
  224. package/dist/server/requestOrigin.js.map +1 -0
  225. package/dist/server/server.d.ts +534 -70
  226. package/dist/server/server.js +623 -167
  227. package/dist/server/server.js.map +1 -1
  228. package/dist/server/skills-integration.test.d.ts +1 -0
  229. package/dist/server/skills-integration.test.js +86 -0
  230. package/dist/server/skills-integration.test.js.map +1 -0
  231. package/dist/server/skills.d.ts +27 -0
  232. package/dist/server/skills.js +188 -0
  233. package/dist/server/skills.js.map +1 -0
  234. package/dist/server/skills.test.d.ts +1 -0
  235. package/dist/server/skills.test.js +243 -0
  236. package/dist/server/skills.test.js.map +1 -0
  237. package/dist/server/templateHelper.d.ts +2 -8
  238. package/dist/server/templateHelper.js +3 -22
  239. package/dist/server/templateHelper.js.map +1 -1
  240. package/dist/server/templates.generated.d.ts +4 -0
  241. package/dist/server/templates.generated.js +43 -0
  242. package/dist/server/templates.generated.js.map +1 -0
  243. package/dist/server/tool-extra.test.d.ts +1 -0
  244. package/dist/server/tool-extra.test.js +88 -0
  245. package/dist/server/tool-extra.test.js.map +1 -0
  246. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  247. package/dist/server/tunnel-proxy-router.js +110 -0
  248. package/dist/server/tunnel-proxy-router.js.map +1 -0
  249. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  250. package/dist/server/tunnel-proxy-router.test.js +229 -0
  251. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  252. package/dist/server/view-name.test-d.d.ts +1 -0
  253. package/dist/server/view-name.test-d.js +8 -0
  254. package/dist/server/view-name.test-d.js.map +1 -0
  255. package/dist/server/view-resource-resolution.test.d.ts +6 -0
  256. package/dist/server/view-resource-resolution.test.js +176 -0
  257. package/dist/server/view-resource-resolution.test.js.map +1 -0
  258. package/dist/server/viewsDevServer.d.ts +14 -0
  259. package/dist/server/viewsDevServer.js +48 -0
  260. package/dist/server/viewsDevServer.js.map +1 -0
  261. package/dist/test/utils.d.ts +21 -31
  262. package/dist/test/utils.js +222 -198
  263. package/dist/test/utils.js.map +1 -1
  264. package/dist/test/view.test.d.ts +1 -0
  265. package/dist/test/view.test.js +540 -0
  266. package/dist/test/view.test.js.map +1 -0
  267. package/dist/version.d.ts +1 -0
  268. package/dist/version.js +3 -0
  269. package/dist/version.js.map +1 -0
  270. package/dist/views/index.d.ts +10 -0
  271. package/dist/views/index.js +3 -0
  272. package/dist/views/index.js.map +1 -0
  273. package/dist/views/scan-views.d.ts +16 -0
  274. package/dist/views/scan-views.js +88 -0
  275. package/dist/views/scan-views.js.map +1 -0
  276. package/dist/views/scan-views.test.d.ts +1 -0
  277. package/dist/views/scan-views.test.js +99 -0
  278. package/dist/views/scan-views.test.js.map +1 -0
  279. package/dist/views/validate-view.d.ts +1 -0
  280. package/dist/views/validate-view.js +9 -0
  281. package/dist/views/validate-view.js.map +1 -0
  282. package/dist/views/validate-view.test.d.ts +1 -0
  283. package/dist/views/validate-view.test.js +24 -0
  284. package/dist/views/validate-view.test.js.map +1 -0
  285. package/dist/web/bridges/adaptor.d.ts +56 -0
  286. package/dist/web/bridges/adaptor.js +397 -0
  287. package/dist/web/bridges/adaptor.js.map +1 -0
  288. package/dist/web/bridges/adaptor.test.d.ts +1 -0
  289. package/dist/web/bridges/adaptor.test.js +264 -0
  290. package/dist/web/bridges/adaptor.test.js.map +1 -0
  291. package/dist/web/bridges/apps-sdk/bridge.d.ts +7 -2
  292. package/dist/web/bridges/apps-sdk/bridge.js +15 -3
  293. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -1
  294. package/dist/web/bridges/apps-sdk/index.d.ts +1 -2
  295. package/dist/web/bridges/apps-sdk/index.js +0 -1
  296. package/dist/web/bridges/apps-sdk/index.js.map +1 -1
  297. package/dist/web/bridges/apps-sdk/types.d.ts +22 -9
  298. package/dist/web/bridges/apps-sdk/types.js.map +1 -1
  299. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +11 -0
  300. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +11 -0
  301. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -1
  302. package/dist/web/bridges/get-adaptor.d.ts +7 -0
  303. package/dist/web/bridges/get-adaptor.js +9 -7
  304. package/dist/web/bridges/get-adaptor.js.map +1 -1
  305. package/dist/web/bridges/get-adaptor.test.d.ts +1 -0
  306. package/dist/web/bridges/get-adaptor.test.js +32 -0
  307. package/dist/web/bridges/get-adaptor.test.js.map +1 -0
  308. package/dist/web/bridges/index.js.map +1 -1
  309. package/dist/web/bridges/mcp-app/bridge.d.ts +27 -31
  310. package/dist/web/bridges/mcp-app/bridge.js +118 -203
  311. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  312. package/dist/web/bridges/mcp-app/bridge.test.d.ts +1 -0
  313. package/dist/web/bridges/mcp-app/bridge.test.js +17 -0
  314. package/dist/web/bridges/mcp-app/bridge.test.js.map +1 -0
  315. package/dist/web/bridges/mcp-app/index.d.ts +0 -1
  316. package/dist/web/bridges/mcp-app/index.js +0 -1
  317. package/dist/web/bridges/mcp-app/index.js.map +1 -1
  318. package/dist/web/bridges/mcp-app/types.d.ts +19 -2
  319. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  320. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +17 -3
  321. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +14 -2
  322. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -1
  323. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +2 -42
  324. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -1
  325. package/dist/web/bridges/mcp-app/view-tools.test.d.ts +1 -0
  326. package/dist/web/bridges/mcp-app/view-tools.test.js +143 -0
  327. package/dist/web/bridges/mcp-app/view-tools.test.js.map +1 -0
  328. package/dist/web/bridges/types.d.ts +155 -12
  329. package/dist/web/bridges/types.js +14 -1
  330. package/dist/web/bridges/types.js.map +1 -1
  331. package/dist/web/bridges/types.test.d.ts +1 -0
  332. package/dist/web/bridges/types.test.js +19 -0
  333. package/dist/web/bridges/types.test.js.map +1 -0
  334. package/dist/web/bridges/use-host-context.d.ts +5 -0
  335. package/dist/web/bridges/use-host-context.js +5 -0
  336. package/dist/web/bridges/use-host-context.js.map +1 -1
  337. package/dist/web/components/modal-provider.d.ts +1 -1
  338. package/dist/web/components/modal-provider.js +5 -6
  339. package/dist/web/components/modal-provider.js.map +1 -1
  340. package/dist/web/create-store.d.ts +26 -0
  341. package/dist/web/create-store.js +43 -3
  342. package/dist/web/create-store.js.map +1 -1
  343. package/dist/web/create-store.test.js +31 -25
  344. package/dist/web/create-store.test.js.map +1 -1
  345. package/dist/web/data-llm.d.ts +35 -2
  346. package/dist/web/data-llm.js +34 -5
  347. package/dist/web/data-llm.js.map +1 -1
  348. package/dist/web/data-llm.test.js +50 -30
  349. package/dist/web/data-llm.test.js.map +1 -1
  350. package/dist/web/generate-helpers.d.ts +40 -32
  351. package/dist/web/generate-helpers.js +38 -30
  352. package/dist/web/generate-helpers.js.map +1 -1
  353. package/dist/web/generate-helpers.test-d.js +33 -31
  354. package/dist/web/generate-helpers.test-d.js.map +1 -1
  355. package/dist/web/generate-helpers.test.js +2 -2
  356. package/dist/web/generate-helpers.test.js.map +1 -1
  357. package/dist/web/helpers/state.d.ts +2 -2
  358. package/dist/web/helpers/state.js +11 -11
  359. package/dist/web/helpers/state.js.map +1 -1
  360. package/dist/web/helpers/state.test.js +9 -9
  361. package/dist/web/helpers/state.test.js.map +1 -1
  362. package/dist/web/hooks/index.d.ts +10 -2
  363. package/dist/web/hooks/index.js +10 -2
  364. package/dist/web/hooks/index.js.map +1 -1
  365. package/dist/web/hooks/openai-extensions.test.d.ts +1 -0
  366. package/dist/web/hooks/openai-extensions.test.js +107 -0
  367. package/dist/web/hooks/openai-extensions.test.js.map +1 -0
  368. package/dist/web/hooks/test/utils.d.ts +7 -2
  369. package/dist/web/hooks/test/utils.js +18 -3
  370. package/dist/web/hooks/test/utils.js.map +1 -1
  371. package/dist/web/hooks/use-call-tool.d.ts +47 -2
  372. package/dist/web/hooks/use-call-tool.js +43 -10
  373. package/dist/web/hooks/use-call-tool.js.map +1 -1
  374. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  375. package/dist/web/hooks/use-call-tool.test.js +75 -29
  376. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  377. package/dist/web/hooks/use-deep-link.d.ts +22 -0
  378. package/dist/web/hooks/use-deep-link.js +34 -0
  379. package/dist/web/hooks/use-deep-link.js.map +1 -0
  380. package/dist/web/hooks/use-display-mode.d.ts +20 -0
  381. package/dist/web/hooks/use-display-mode.js +20 -0
  382. package/dist/web/hooks/use-display-mode.js.map +1 -1
  383. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -1
  384. package/dist/web/hooks/use-display-mode.test.js +57 -21
  385. package/dist/web/hooks/use-display-mode.test.js.map +1 -1
  386. package/dist/web/hooks/use-download.d.ts +3 -0
  387. package/dist/web/hooks/use-download.js +7 -0
  388. package/dist/web/hooks/use-download.js.map +1 -0
  389. package/dist/web/hooks/use-download.test.d.ts +1 -0
  390. package/dist/web/hooks/use-download.test.js +103 -0
  391. package/dist/web/hooks/use-download.test.js.map +1 -0
  392. package/dist/web/hooks/use-files.d.ts +34 -1
  393. package/dist/web/hooks/use-files.js +33 -0
  394. package/dist/web/hooks/use-files.js.map +1 -1
  395. package/dist/web/hooks/use-files.test.js +31 -3
  396. package/dist/web/hooks/use-files.test.js.map +1 -1
  397. package/dist/web/hooks/use-host.d.ts +44 -0
  398. package/dist/web/hooks/use-host.js +45 -0
  399. package/dist/web/hooks/use-host.js.map +1 -0
  400. package/dist/web/hooks/use-host.test.d.ts +1 -0
  401. package/dist/web/hooks/use-host.test.js +59 -0
  402. package/dist/web/hooks/use-host.test.js.map +1 -0
  403. package/dist/web/hooks/use-model-context.d.ts +44 -0
  404. package/dist/web/hooks/use-model-context.js +63 -0
  405. package/dist/web/hooks/use-model-context.js.map +1 -0
  406. package/dist/web/hooks/use-open-external.d.ts +17 -0
  407. package/dist/web/hooks/use-open-external.js +16 -0
  408. package/dist/web/hooks/use-open-external.js.map +1 -1
  409. package/dist/web/hooks/use-open-external.test.js +30 -15
  410. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  411. package/dist/web/hooks/use-open-file.d.ts +20 -0
  412. package/dist/web/hooks/use-open-file.js +25 -0
  413. package/dist/web/hooks/use-open-file.js.map +1 -0
  414. package/dist/web/hooks/use-register-view-tool.d.ts +37 -0
  415. package/dist/web/hooks/use-register-view-tool.js +50 -0
  416. package/dist/web/hooks/use-register-view-tool.js.map +1 -0
  417. package/dist/web/hooks/use-request-close.d.ts +16 -0
  418. package/dist/web/hooks/use-request-close.js +21 -0
  419. package/dist/web/hooks/use-request-close.js.map +1 -0
  420. package/dist/web/hooks/use-request-close.test.d.ts +1 -0
  421. package/dist/web/hooks/use-request-close.test.js +47 -0
  422. package/dist/web/hooks/use-request-close.test.js.map +1 -0
  423. package/dist/web/hooks/use-request-modal.d.ts +16 -1
  424. package/dist/web/hooks/use-request-modal.js +19 -4
  425. package/dist/web/hooks/use-request-modal.js.map +1 -1
  426. package/dist/web/hooks/use-request-modal.test.js +16 -2
  427. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  428. package/dist/web/hooks/use-request-size.d.ts +20 -0
  429. package/dist/web/hooks/use-request-size.js +24 -0
  430. package/dist/web/hooks/use-request-size.js.map +1 -0
  431. package/dist/web/hooks/use-request-size.test.d.ts +1 -0
  432. package/dist/web/hooks/use-request-size.test.js +47 -0
  433. package/dist/web/hooks/use-request-size.test.js.map +1 -0
  434. package/dist/web/hooks/use-send-follow-up-message.d.ts +25 -1
  435. package/dist/web/hooks/use-send-follow-up-message.js +25 -2
  436. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -1
  437. package/dist/web/hooks/use-set-open-in-app-url.d.ts +17 -0
  438. package/dist/web/hooks/use-set-open-in-app-url.js +17 -0
  439. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -1
  440. package/dist/web/hooks/use-set-open-in-app-url.test.js +26 -12
  441. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -1
  442. package/dist/web/hooks/use-tool-info.d.ts +46 -14
  443. package/dist/web/hooks/use-tool-info.js +29 -7
  444. package/dist/web/hooks/use-tool-info.js.map +1 -1
  445. package/dist/web/hooks/use-tool-info.test-d.js +11 -34
  446. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -1
  447. package/dist/web/hooks/use-tool-info.test.js +43 -38
  448. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  449. package/dist/web/hooks/use-user.d.ts +5 -2
  450. package/dist/web/hooks/use-user.js +23 -4
  451. package/dist/web/hooks/use-user.js.map +1 -1
  452. package/dist/web/hooks/use-user.test.js +105 -29
  453. package/dist/web/hooks/use-user.test.js.map +1 -1
  454. package/dist/web/hooks/use-view-state.d.ts +25 -0
  455. package/dist/web/hooks/use-view-state.js +42 -0
  456. package/dist/web/hooks/use-view-state.js.map +1 -0
  457. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  458. package/dist/web/hooks/use-view-state.test.js +212 -0
  459. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  460. package/dist/web/hooks/use-viewport.d.ts +20 -0
  461. package/dist/web/hooks/use-viewport.js +21 -0
  462. package/dist/web/hooks/use-viewport.js.map +1 -0
  463. package/dist/web/hooks/use-viewport.test.d.ts +1 -0
  464. package/dist/web/hooks/use-viewport.test.js +109 -0
  465. package/dist/web/hooks/use-viewport.test.js.map +1 -0
  466. package/dist/web/index.d.ts +1 -2
  467. package/dist/web/index.js +1 -2
  468. package/dist/web/index.js.map +1 -1
  469. package/dist/web/mount-view.d.ts +21 -0
  470. package/dist/web/mount-view.js +43 -0
  471. package/dist/web/mount-view.js.map +1 -0
  472. package/dist/web/proxy.js.map +1 -1
  473. package/dist/web/types.d.ts +4 -0
  474. package/dist/web/types.js.map +1 -1
  475. package/package.json +48 -28
  476. package/tsconfig.base.json +5 -0
  477. package/dist/server/const.d.ts +0 -1
  478. package/dist/server/const.js +0 -2
  479. package/dist/server/const.js.map +0 -1
  480. package/dist/server/templates/development.hbs +0 -67
  481. package/dist/server/templates/production.hbs +0 -6
  482. package/dist/server/widgetsDevServer.d.ts +0 -12
  483. package/dist/server/widgetsDevServer.js +0 -63
  484. package/dist/server/widgetsDevServer.js.map +0 -1
  485. package/dist/test/widget.test.js +0 -261
  486. package/dist/test/widget.test.js.map +0 -1
  487. package/dist/web/bridges/apps-sdk/adaptor.d.ts +0 -22
  488. package/dist/web/bridges/apps-sdk/adaptor.js +0 -71
  489. package/dist/web/bridges/apps-sdk/adaptor.js.map +0 -1
  490. package/dist/web/bridges/mcp-app/adaptor.d.ts +0 -36
  491. package/dist/web/bridges/mcp-app/adaptor.js +0 -190
  492. package/dist/web/bridges/mcp-app/adaptor.js.map +0 -1
  493. package/dist/web/hooks/use-layout.d.ts +0 -22
  494. package/dist/web/hooks/use-layout.js +0 -23
  495. package/dist/web/hooks/use-layout.js.map +0 -1
  496. package/dist/web/hooks/use-layout.test.js +0 -96
  497. package/dist/web/hooks/use-layout.test.js.map +0 -1
  498. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  499. package/dist/web/hooks/use-widget-state.js +0 -32
  500. package/dist/web/hooks/use-widget-state.js.map +0 -1
  501. package/dist/web/hooks/use-widget-state.test.js +0 -62
  502. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  503. package/dist/web/mount-widget.d.ts +0 -1
  504. package/dist/web/mount-widget.js +0 -27
  505. package/dist/web/mount-widget.js.map +0 -1
  506. package/dist/web/plugin/data-llm.test.js +0 -81
  507. package/dist/web/plugin/data-llm.test.js.map +0 -1
  508. package/dist/web/plugin/plugin.d.ts +0 -2
  509. package/dist/web/plugin/plugin.js +0 -54
  510. package/dist/web/plugin/plugin.js.map +0 -1
  511. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  512. package/dist/web/plugin/transform-data-llm.js +0 -96
  513. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  514. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  515. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  516. package/dist/web/plugin/validate-widget.d.ts +0 -5
  517. package/dist/web/plugin/validate-widget.js +0 -27
  518. package/dist/web/plugin/validate-widget.js.map +0 -1
  519. package/dist/web/plugin/validate-widget.test.js +0 -42
  520. package/dist/web/plugin/validate-widget.test.js.map +0 -1
  521. /package/dist/{test/widget.test.d.ts → cli/build-helpers.test.d.ts} +0 -0
  522. /package/dist/{web/hooks/use-layout.test.d.ts → cli/build-steps.test.d.ts} +0 -0
  523. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  524. /package/dist/{web/plugin/data-llm.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  525. /package/dist/{web/plugin/transform-data-llm.test.d.ts → cli/tunnel.test.d.ts} +0 -0
  526. /package/dist/{web/plugin/validate-widget.test.d.ts → context-warnings.test.d.ts} +0 -0
@@ -0,0 +1,449 @@
1
+ import { createHash, createHmac, randomBytes, timingSafeEqual, } from "node:crypto";
2
+ import dns from "node:dns";
3
+ import http from "node:http";
4
+ import https from "node:https";
5
+ import net from "node:net";
6
+ import { INVALID_PARAMS, ProtocolError, } from "@modelcontextprotocol/server";
7
+ import { z } from "zod/v4";
8
+ const EVENTS_ERROR = {
9
+ NotFound: -32011,
10
+ Forbidden: -32012,
11
+ Unsupported: -32014,
12
+ CallbackEndpointError: -32015,
13
+ };
14
+ const MAX_PAYLOAD_BYTES = 256 * 1024;
15
+ const DELIVERY_TIMEOUT_MS = 10_000;
16
+ const RETRY_DELAYS_MS = [1_000, 5_000];
17
+ const VERIFICATION_CACHE_MS = 60 * 60_000;
18
+ const SECRET_ROTATION_GRACE_MS = 5 * 60_000;
19
+ const MIN_TTL_MS = 60_000;
20
+ const DEFAULT_TTL_MS = 30 * 60_000;
21
+ const MAX_TTL_MS = 24 * 60 * 60_000;
22
+ function toStandardSchema(schema) {
23
+ return "~standard" in schema
24
+ ? schema
25
+ : z.object(schema);
26
+ }
27
+ async function validate(schema, value, what) {
28
+ const result = await schema["~standard"].validate(value);
29
+ if (result.issues) {
30
+ throw new ProtocolError(INVALID_PARAMS, `Invalid ${what}: ${result.issues.map((issue) => issue.message).join(", ")}`);
31
+ }
32
+ return result.value;
33
+ }
34
+ function canonicalJson(value) {
35
+ if (Array.isArray(value)) {
36
+ return `[${value.map(canonicalJson).join(",")}]`;
37
+ }
38
+ if (value && typeof value === "object") {
39
+ return `{${Object.keys(value)
40
+ .sort()
41
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
42
+ .join(",")}}`;
43
+ }
44
+ return JSON.stringify(value);
45
+ }
46
+ function principalOf(ctx) {
47
+ const authInfo = ctx.http?.authInfo;
48
+ const subject = authInfo?.extra?.subject;
49
+ const principal = typeof subject === "string" ? subject : authInfo?.clientId;
50
+ if (!principal) {
51
+ throw new ProtocolError(EVENTS_ERROR.Forbidden, "Webhook subscriptions require an authenticated caller");
52
+ }
53
+ return principal;
54
+ }
55
+ function isValidSecret(secret) {
56
+ const encoded = secret.startsWith("whsec_") ? secret.slice(6) : "";
57
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(encoded)) {
58
+ return false;
59
+ }
60
+ const length = Buffer.from(encoded, "base64").length;
61
+ return length >= 24 && length <= 64;
62
+ }
63
+ function sign(secret, id, timestamp, body) {
64
+ const key = Buffer.from(secret.slice(6), "base64");
65
+ const digest = createHmac("sha256", key)
66
+ .update(`${id}.${timestamp}.${body}`)
67
+ .digest("base64");
68
+ return `v1,${digest}`;
69
+ }
70
+ const blockedAddresses = new net.BlockList();
71
+ for (const [address, prefix] of [
72
+ ["0.0.0.0", 8],
73
+ ["10.0.0.0", 8],
74
+ ["100.64.0.0", 10],
75
+ ["127.0.0.0", 8],
76
+ ["169.254.0.0", 16],
77
+ ["172.16.0.0", 12],
78
+ ["192.0.0.0", 24],
79
+ ["192.0.2.0", 24],
80
+ ["192.168.0.0", 16],
81
+ ["198.18.0.0", 15],
82
+ ["198.51.100.0", 24],
83
+ ["203.0.113.0", 24],
84
+ ["224.0.0.0", 4],
85
+ ["240.0.0.0", 4],
86
+ ]) {
87
+ blockedAddresses.addSubnet(address, prefix, "ipv4");
88
+ }
89
+ for (const [address, prefix] of [
90
+ ["::", 128],
91
+ ["::1", 128],
92
+ ["64:ff9b::", 96],
93
+ ["64:ff9b:1::", 48],
94
+ ["100::", 64],
95
+ ["2001::", 23],
96
+ ["2001:db8::", 32],
97
+ ["2002::", 16],
98
+ ["3fff::", 20],
99
+ ["5f00::", 16],
100
+ ["fc00::", 7],
101
+ ["fe80::", 10],
102
+ ["ff00::", 8],
103
+ ]) {
104
+ blockedAddresses.addSubnet(address, prefix, "ipv6");
105
+ }
106
+ /** @internal */
107
+ export function isPublicAddress(address) {
108
+ const family = net.isIP(address);
109
+ if (family === 0) {
110
+ return false;
111
+ }
112
+ return !blockedAddresses.check(address, family === 4 ? "ipv4" : "ipv6");
113
+ }
114
+ const insecureCallbacksAllowed = () => process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test";
115
+ function checkCallbackUrl(raw) {
116
+ let url;
117
+ try {
118
+ url = new URL(raw);
119
+ }
120
+ catch {
121
+ throw new ProtocolError(INVALID_PARAMS, "delivery.url is not a valid URL");
122
+ }
123
+ const allowed = url.protocol === "https:" ||
124
+ (url.protocol === "http:" && insecureCallbacksAllowed());
125
+ if (!allowed) {
126
+ throw new ProtocolError(INVALID_PARAMS, "delivery.url must use https");
127
+ }
128
+ return url.href;
129
+ }
130
+ const safeLookup = (hostname, options, callback) => {
131
+ dns.lookup(hostname, { ...options, all: true }, (error, addresses) => {
132
+ if (error) {
133
+ callback(error, "", 4);
134
+ return;
135
+ }
136
+ const resolved = addresses;
137
+ const blocked = resolved.find(({ address }) => !isPublicAddress(address));
138
+ if (blocked) {
139
+ callback(new Error(`Callback resolves to a non-public address (${blocked.address})`), "", 4);
140
+ return;
141
+ }
142
+ if (options.all) {
143
+ callback(null, resolved);
144
+ return;
145
+ }
146
+ const [first] = resolved;
147
+ callback(null, first?.address ?? "", first?.family ?? 4);
148
+ });
149
+ };
150
+ function post(url, headers, body) {
151
+ const insecure = insecureCallbacksAllowed();
152
+ const hostname = url.hostname.replace(/^\[|\]$/g, "");
153
+ if (!insecure && net.isIP(hostname) && !isPublicAddress(hostname)) {
154
+ return Promise.resolve({ ok: false, reason: "connection_refused" });
155
+ }
156
+ const signal = AbortSignal.timeout(DELIVERY_TIMEOUT_MS);
157
+ const failure = (error) => ({
158
+ ok: false,
159
+ reason: signal.aborted
160
+ ? "timeout"
161
+ : error?.code?.startsWith("ERR_TLS") || error?.code?.includes("CERT")
162
+ ? "tls_error"
163
+ : "connection_refused",
164
+ });
165
+ const client = url.protocol === "https:" ? https : http;
166
+ return new Promise((resolve) => {
167
+ const request = client.request(url, {
168
+ method: "POST",
169
+ headers: { ...headers, "content-length": Buffer.byteLength(body) },
170
+ signal,
171
+ ...(insecure ? {} : { lookup: safeLookup }),
172
+ }, (response) => {
173
+ const status = response.statusCode ?? 0;
174
+ const chunks = [];
175
+ let size = 0;
176
+ response.on("data", (chunk) => {
177
+ size += chunk.length;
178
+ if (size <= 64 * 1024) {
179
+ chunks.push(chunk);
180
+ }
181
+ });
182
+ response.on("end", () => {
183
+ if (status >= 200 && status < 300) {
184
+ resolve({
185
+ ok: true,
186
+ status,
187
+ body: Buffer.concat(chunks).toString(),
188
+ });
189
+ }
190
+ else {
191
+ resolve({
192
+ ok: false,
193
+ status,
194
+ reason: status >= 500 ? "http_5xx" : "http_4xx",
195
+ });
196
+ }
197
+ });
198
+ response.on("error", (error) => resolve(failure(error)));
199
+ response.on("close", () => resolve(failure()));
200
+ });
201
+ request.on("error", (error) => resolve(failure(error)));
202
+ request.end(body);
203
+ });
204
+ }
205
+ function signedPost(subscription, messageId, body) {
206
+ const timestamp = Math.floor(Date.now() / 1000);
207
+ const secrets = [subscription.secret];
208
+ if (subscription.previousSecret &&
209
+ subscription.previousSecret.until > Date.now()) {
210
+ secrets.push(subscription.previousSecret.secret);
211
+ }
212
+ return post(new URL(subscription.url), {
213
+ "content-type": "application/json",
214
+ "webhook-id": messageId,
215
+ "webhook-timestamp": String(timestamp),
216
+ "webhook-signature": secrets
217
+ .map((secret) => sign(secret, messageId, timestamp, body))
218
+ .join(" "),
219
+ "x-mcp-subscription-id": subscription.id,
220
+ }, body);
221
+ }
222
+ function memoryEventStore() {
223
+ const subscriptions = new Map();
224
+ return {
225
+ get: async (id) => subscriptions.get(id),
226
+ set: async (subscription) => {
227
+ subscriptions.set(subscription.id, subscription);
228
+ },
229
+ delete: async (id) => {
230
+ subscriptions.delete(id);
231
+ },
232
+ listByEvent: async (name) => {
233
+ const now = Date.now();
234
+ for (const [id, subscription] of subscriptions) {
235
+ if (subscription.expiresAt <= now) {
236
+ subscriptions.delete(id);
237
+ }
238
+ }
239
+ return [...subscriptions.values()].filter((sub) => sub.name === name);
240
+ },
241
+ };
242
+ }
243
+ const SubscriptionKeySchema = z.object({
244
+ name: z.string(),
245
+ arguments: z.record(z.string(), z.unknown()).optional(),
246
+ delivery: z.object({ url: z.string() }),
247
+ });
248
+ const SubscribeParamsSchema = SubscriptionKeySchema.extend({
249
+ delivery: z.object({
250
+ mode: z.string().optional(),
251
+ url: z.string(),
252
+ secret: z.string(),
253
+ }),
254
+ cursor: z.string().nullable().optional(),
255
+ ttlMs: z.number().nullable().optional(),
256
+ });
257
+ /**
258
+ * App-wide MCP Events state: the registered event types, the subscription
259
+ * store and the callback verification cache. One per {@link Skybridge} app,
260
+ * shared by every per-request server.
261
+ *
262
+ * @internal
263
+ */
264
+ export class EventsRuntime {
265
+ store;
266
+ events = new Map();
267
+ verifiedCallbacks = new Map();
268
+ constructor(options = {}) {
269
+ this.store = options.store ?? memoryEventStore();
270
+ }
271
+ register(config, hooks = {}) {
272
+ this.events.set(config.name, {
273
+ name: config.name,
274
+ description: config.description,
275
+ inputSchema: toStandardSchema(config.inputSchema ?? {}),
276
+ payloadSchema: toStandardSchema(config.payloadSchema),
277
+ _meta: config._meta,
278
+ hooks,
279
+ });
280
+ }
281
+ /** Install the `events/*` handlers on a per-request server. */
282
+ install(server) {
283
+ server.setRequestHandler("events/list", { params: z.object({ cursor: z.string().optional() }).optional() }, () => ({
284
+ events: [...this.events.values()].map((event) => ({
285
+ name: event.name,
286
+ ...(event.description && { description: event.description }),
287
+ delivery: ["webhook"],
288
+ inputSchema: event.inputSchema["~standard"].jsonSchema.input({
289
+ target: "draft-2020-12",
290
+ }),
291
+ payloadSchema: event.payloadSchema["~standard"].jsonSchema.output({
292
+ target: "draft-2020-12",
293
+ }),
294
+ ...(event._meta && { _meta: event._meta }),
295
+ })),
296
+ }));
297
+ server.setRequestHandler("events/subscribe", { params: SubscribeParamsSchema }, async (params, ctx) => {
298
+ if (params.delivery.mode && params.delivery.mode !== "webhook") {
299
+ throw new ProtocolError(EVENTS_ERROR.Unsupported, `Unsupported delivery mode: ${params.delivery.mode}`, { feature: "deliveryMode", value: params.delivery.mode });
300
+ }
301
+ if (!isValidSecret(params.delivery.secret)) {
302
+ throw new ProtocolError(INVALID_PARAMS, "delivery.secret must be whsec_ followed by base64 of 24 to 64 bytes");
303
+ }
304
+ const { event, subscription } = await this.resolve(params, ctx);
305
+ const ttl = params.ttlMs === null ? MAX_TTL_MS : (params.ttlMs ?? DEFAULT_TTL_MS);
306
+ const candidate = {
307
+ ...subscription,
308
+ secret: params.delivery.secret,
309
+ expiresAt: Date.now() + Math.min(Math.max(ttl, MIN_TTL_MS), MAX_TTL_MS),
310
+ };
311
+ await this.verifyCallback(candidate);
312
+ await event.hooks.onSubscribe?.(subscription.arguments, ctx);
313
+ const existing = await this.liveSubscription(subscription.id);
314
+ const previousSecret = existing && existing.secret !== candidate.secret
315
+ ? {
316
+ secret: existing.secret,
317
+ until: Date.now() + SECRET_ROTATION_GRACE_MS,
318
+ }
319
+ : existing?.previousSecret;
320
+ await this.store.set({
321
+ ...candidate,
322
+ ...(previousSecret && { previousSecret }),
323
+ });
324
+ return {
325
+ id: candidate.id,
326
+ refreshBefore: new Date(candidate.expiresAt).toISOString(),
327
+ cursor: null,
328
+ truncated: false,
329
+ };
330
+ });
331
+ server.setRequestHandler("events/unsubscribe", { params: SubscriptionKeySchema }, async (params, ctx) => {
332
+ const { subscription } = await this.resolve(params, ctx);
333
+ await this.store.delete(subscription.id);
334
+ return {};
335
+ });
336
+ }
337
+ /** Deliver one event to every live, matching subscription. */
338
+ async emit(name, emitted) {
339
+ const event = this.events.get(name);
340
+ if (!event) {
341
+ throw new Error(`Event "${name}" is not registered.`);
342
+ }
343
+ const data = await validate(event.payloadSchema, emitted.data, "payload");
344
+ const id = emitted.id ?? `evt_${randomBytes(12).toString("hex")}`;
345
+ const body = JSON.stringify({
346
+ eventId: id,
347
+ name,
348
+ timestamp: (emitted.timestamp ?? new Date()).toISOString(),
349
+ data,
350
+ cursor: null,
351
+ });
352
+ if (Buffer.byteLength(body) > MAX_PAYLOAD_BYTES) {
353
+ throw new Error(`Event "${name}" payload exceeds ${MAX_PAYLOAD_BYTES} bytes; send a summary and expose a tool to fetch the rest.`);
354
+ }
355
+ const now = Date.now();
356
+ const subscriptions = (await this.store.listByEvent(name)).filter((sub) => sub.expiresAt > now);
357
+ const results = await Promise.allSettled(subscriptions.map(async (subscription) => {
358
+ const matches = (await event.hooks.match?.({ id, data }, {
359
+ arguments: subscription.arguments,
360
+ principal: subscription.principal,
361
+ })) ?? true;
362
+ if (matches) {
363
+ await this.deliver(subscription, id, body, 0);
364
+ }
365
+ }));
366
+ const failures = results.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
367
+ if (failures.length > 0) {
368
+ throw new AggregateError(failures, `Event ${id} was not delivered to ${failures.length} subscription(s) whose match hook threw.`);
369
+ }
370
+ }
371
+ async resolve(params, ctx) {
372
+ const event = this.events.get(params.name);
373
+ if (!event) {
374
+ throw new ProtocolError(EVENTS_ERROR.NotFound, `Unknown event: ${params.name}`, { kind: "event" });
375
+ }
376
+ const url = checkCallbackUrl(params.delivery.url);
377
+ const principal = principalOf(ctx);
378
+ const rawArguments = params.arguments ?? {};
379
+ const args = (await validate(event.inputSchema, rawArguments, "arguments"));
380
+ const hash = createHash("sha256")
381
+ .update(canonicalJson([principal, url, event.name, rawArguments]))
382
+ .digest("hex");
383
+ return {
384
+ event,
385
+ subscription: {
386
+ id: `sub_${hash.slice(0, 32)}`,
387
+ principal,
388
+ name: event.name,
389
+ arguments: args,
390
+ url,
391
+ },
392
+ };
393
+ }
394
+ async deliver(subscription, eventId, body, attempt) {
395
+ const outcome = await signedPost(subscription, eventId, body);
396
+ if (outcome.ok) {
397
+ return;
398
+ }
399
+ const status = outcome.status ?? 0;
400
+ const retryable = status !== 410 && status !== 413 && (status < 300 || status >= 400);
401
+ const delay = RETRY_DELAYS_MS[attempt];
402
+ if (!retryable || delay === undefined) {
403
+ console.warn(`skybridge: dropped event ${eventId} for subscription ${subscription.id} (${outcome.reason})`);
404
+ return;
405
+ }
406
+ setTimeout(() => {
407
+ this.liveSubscription(subscription.id)
408
+ .then((live) => live && this.deliver(live, eventId, body, attempt + 1))
409
+ .catch(() => { });
410
+ }, delay).unref();
411
+ }
412
+ async liveSubscription(id) {
413
+ const subscription = await this.store.get(id);
414
+ if (subscription && subscription.expiresAt <= Date.now()) {
415
+ await this.store.delete(id);
416
+ return undefined;
417
+ }
418
+ return subscription;
419
+ }
420
+ async verifyCallback(subscription) {
421
+ const key = `${subscription.principal}\n${subscription.url}`;
422
+ const now = Date.now();
423
+ if ((this.verifiedCallbacks.get(key) ?? 0) > now) {
424
+ return;
425
+ }
426
+ const challenge = randomBytes(24).toString("base64url");
427
+ const outcome = await signedPost(subscription, `msg_verification_${randomBytes(12).toString("hex")}`, JSON.stringify({ type: "verification", challenge }));
428
+ let echoed;
429
+ if (outcome.ok) {
430
+ try {
431
+ echoed = JSON.parse(outcome.body)?.challenge;
432
+ }
433
+ catch { }
434
+ }
435
+ const matched = typeof echoed === "string" &&
436
+ echoed.length === challenge.length &&
437
+ timingSafeEqual(Buffer.from(echoed), Buffer.from(challenge));
438
+ if (!matched) {
439
+ throw new ProtocolError(EVENTS_ERROR.CallbackEndpointError, "Callback endpoint verification failed", { reason: outcome.ok ? "challenge_failed" : outcome.reason });
440
+ }
441
+ for (const [cached, until] of this.verifiedCallbacks) {
442
+ if (until <= now) {
443
+ this.verifiedCallbacks.delete(cached);
444
+ }
445
+ }
446
+ this.verifiedCallbacks.set(key, now + VERIFICATION_CACHE_MS);
447
+ }
448
+ }
449
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/server/events.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createHash,\n createHmac,\n randomBytes,\n timingSafeEqual,\n} from \"node:crypto\";\nimport dns from \"node:dns\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport {\n INVALID_PARAMS,\n ProtocolError,\n type McpServer as SdkMcpServer,\n type ServerContext,\n type StandardSchemaV1,\n type StandardSchemaWithJSON,\n} from \"@modelcontextprotocol/server\";\nimport { z } from \"zod/v4\";\n\nconst EVENTS_ERROR = {\n NotFound: -32011,\n Forbidden: -32012,\n Unsupported: -32014,\n CallbackEndpointError: -32015,\n} as const;\n\nconst MAX_PAYLOAD_BYTES = 256 * 1024;\nconst DELIVERY_TIMEOUT_MS = 10_000;\nconst RETRY_DELAYS_MS = [1_000, 5_000];\nconst VERIFICATION_CACHE_MS = 60 * 60_000;\nconst SECRET_ROTATION_GRACE_MS = 5 * 60_000;\nconst MIN_TTL_MS = 60_000;\nconst DEFAULT_TTL_MS = 30 * 60_000;\nconst MAX_TTL_MS = 24 * 60 * 60_000;\n\n/**\n * A webhook subscription as held by an {@link EventStore}. Skybridge creates,\n * refreshes and deletes these; a store only persists them.\n */\nexport interface EventSubscription {\n /** Deterministic over `(principal, url, name, arguments)`. */\n id: string;\n /** The authenticated subject that subscribed. */\n principal: string;\n /** Event type name. */\n name: string;\n /** Subscription arguments, validated against the event's `inputSchema`. */\n arguments: Record<string, unknown>;\n /** Callback URL deliveries are POSTed to. */\n url: string;\n /** Standard Webhooks signing secret (`whsec_…`). */\n secret: string;\n /** Secret being rotated out, still used to dual-sign until `until`. */\n previousSecret?: { secret: string; until: number };\n /** Expiry, in epoch milliseconds. */\n expiresAt: number;\n}\n\n/**\n * Where webhook subscriptions live between the `events/subscribe` request\n * that creates them and the {@link Skybridge.emit} call that delivers to them.\n * Skybridge ignores subscriptions past `expiresAt`, so a store only needs to\n * persist them; dropping expired entries is optional housekeeping.\n *\n * The default in-memory store is enough for a single long-lived process. Pass\n * your own when the app runs on several instances or restarts often.\n */\nexport interface EventStore {\n get(id: string): Promise<EventSubscription | undefined>;\n set(subscription: EventSubscription): Promise<void>;\n delete(id: string): Promise<void>;\n /** Every stored subscription to the event named `name`. */\n listByEvent(name: string): Promise<EventSubscription[]>;\n}\n\n/** Options for MCP Events, passed as `events` to {@link Skybridge}. */\nexport interface EventsOptions {\n /** Where subscriptions are kept. Defaults to an in-memory store. */\n store?: EventStore;\n}\n\n/** An event occurrence as passed to {@link Skybridge.emit}. */\nexport interface EmittedEvent<TData> {\n /** Stable identifier used for deduplication, ideally the upstream's. Generated when omitted. */\n id?: string;\n /** When the event happened. Defaults to now. */\n timestamp?: Date;\n /** Payload, validated against the event's `payloadSchema`. */\n data: TData;\n}\n\n/** Type marker for a registered event, produced by `registerEvent`. */\nexport type EventDef<TArguments = unknown, TPayload = unknown> = {\n arguments: TArguments;\n payload: TPayload;\n};\n\ntype EventSchema =\n | Record<string, StandardSchemaWithJSON>\n | StandardSchemaWithJSON;\n\nexport type InferEventSchema<T extends EventSchema> =\n T extends StandardSchemaWithJSON\n ? StandardSchemaV1.InferOutput<T>\n : T extends Record<string, StandardSchemaWithJSON>\n ? {\n [K in keyof T as undefined extends StandardSchemaV1.InferOutput<T[K]>\n ? never\n : K]: StandardSchemaV1.InferOutput<T[K]>;\n } & {\n [K in keyof T as undefined extends StandardSchemaV1.InferOutput<T[K]>\n ? K\n : never]?: StandardSchemaV1.InferOutput<T[K]>;\n }\n : never;\n\n/** The `registerEvent` config: how the event type is described in `events/list`. */\nexport interface EventConfig<\n TName extends string,\n TInput extends EventSchema,\n TPayload extends EventSchema,\n> {\n /** Stable, specific name such as `comment.created`. */\n name: TName;\n /** What the event is and when it fires. */\n description?: string;\n /** Subscription arguments (filters): a Zod shape or a Standard Schema object. */\n inputSchema?: TInput;\n /** Shape of the delivered `data`: a Zod shape or a Standard Schema object. */\n payloadSchema: TPayload;\n _meta?: Record<string, unknown>;\n}\n\n/** Optional per-event behavior passed as the second argument of `registerEvent`. */\nexport interface EventHooks<TArguments, TPayload, TExtra> {\n /**\n * Decide whether an emitted event goes to a given subscription. Without it,\n * every subscription to the event receives every emit.\n */\n match?(\n event: { id: string; data: TPayload },\n subscription: { arguments: TArguments; principal: string },\n ): boolean | Promise<boolean>;\n /**\n * Runs on every `events/subscribe`, including refreshes, once the callback\n * URL is verified and before the subscription is stored. Throw (e.g. a\n * `ProtocolError`) to reject it, for instance when the caller may not access\n * what the arguments point to.\n */\n onSubscribe?(args: TArguments, extra: TExtra): void | Promise<void>;\n}\n\ntype RegisteredEvent = {\n name: string;\n description?: string;\n inputSchema: StandardSchemaWithJSON;\n payloadSchema: StandardSchemaWithJSON;\n _meta?: Record<string, unknown>;\n hooks: EventHooks<Record<string, unknown>, unknown, ServerContext>;\n};\n\nfunction toStandardSchema(schema: EventSchema): StandardSchemaWithJSON {\n return \"~standard\" in schema\n ? (schema as StandardSchemaWithJSON)\n : z.object(schema as unknown as z.ZodRawShape);\n}\n\nasync function validate(\n schema: StandardSchemaWithJSON,\n value: unknown,\n what: string,\n): Promise<unknown> {\n const result = await schema[\"~standard\"].validate(value);\n if (result.issues) {\n throw new ProtocolError(\n INVALID_PARAMS,\n `Invalid ${what}: ${result.issues.map((issue) => issue.message).join(\", \")}`,\n );\n }\n return result.value;\n}\n\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(\",\")}]`;\n }\n if (value && typeof value === \"object\") {\n return `{${Object.keys(value)\n .sort()\n .map(\n (key) =>\n `${JSON.stringify(key)}:${canonicalJson((value as Record<string, unknown>)[key])}`,\n )\n .join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction principalOf(ctx: ServerContext): string {\n const authInfo = ctx.http?.authInfo;\n const subject = authInfo?.extra?.subject;\n const principal = typeof subject === \"string\" ? subject : authInfo?.clientId;\n if (!principal) {\n throw new ProtocolError(\n EVENTS_ERROR.Forbidden,\n \"Webhook subscriptions require an authenticated caller\",\n );\n }\n return principal;\n}\n\nfunction isValidSecret(secret: string): boolean {\n const encoded = secret.startsWith(\"whsec_\") ? secret.slice(6) : \"\";\n if (!/^[A-Za-z0-9+/]+={0,2}$/.test(encoded)) {\n return false;\n }\n const length = Buffer.from(encoded, \"base64\").length;\n return length >= 24 && length <= 64;\n}\n\nfunction sign(secret: string, id: string, timestamp: number, body: string) {\n const key = Buffer.from(secret.slice(6), \"base64\");\n const digest = createHmac(\"sha256\", key)\n .update(`${id}.${timestamp}.${body}`)\n .digest(\"base64\");\n return `v1,${digest}`;\n}\n\nconst blockedAddresses = new net.BlockList();\nfor (const [address, prefix] of [\n [\"0.0.0.0\", 8],\n [\"10.0.0.0\", 8],\n [\"100.64.0.0\", 10],\n [\"127.0.0.0\", 8],\n [\"169.254.0.0\", 16],\n [\"172.16.0.0\", 12],\n [\"192.0.0.0\", 24],\n [\"192.0.2.0\", 24],\n [\"192.168.0.0\", 16],\n [\"198.18.0.0\", 15],\n [\"198.51.100.0\", 24],\n [\"203.0.113.0\", 24],\n [\"224.0.0.0\", 4],\n [\"240.0.0.0\", 4],\n] as const) {\n blockedAddresses.addSubnet(address, prefix, \"ipv4\");\n}\nfor (const [address, prefix] of [\n [\"::\", 128],\n [\"::1\", 128],\n [\"64:ff9b::\", 96],\n [\"64:ff9b:1::\", 48],\n [\"100::\", 64],\n [\"2001::\", 23],\n [\"2001:db8::\", 32],\n [\"2002::\", 16],\n [\"3fff::\", 20],\n [\"5f00::\", 16],\n [\"fc00::\", 7],\n [\"fe80::\", 10],\n [\"ff00::\", 8],\n] as const) {\n blockedAddresses.addSubnet(address, prefix, \"ipv6\");\n}\n\n/** @internal */\nexport function isPublicAddress(address: string): boolean {\n const family = net.isIP(address);\n if (family === 0) {\n return false;\n }\n return !blockedAddresses.check(address, family === 4 ? \"ipv4\" : \"ipv6\");\n}\n\nconst insecureCallbacksAllowed = () =>\n process.env.NODE_ENV === \"development\" || process.env.NODE_ENV === \"test\";\n\nfunction checkCallbackUrl(raw: string): string {\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new ProtocolError(INVALID_PARAMS, \"delivery.url is not a valid URL\");\n }\n const allowed =\n url.protocol === \"https:\" ||\n (url.protocol === \"http:\" && insecureCallbacksAllowed());\n if (!allowed) {\n throw new ProtocolError(INVALID_PARAMS, \"delivery.url must use https\");\n }\n return url.href;\n}\n\nconst safeLookup: net.LookupFunction = (hostname, options, callback) => {\n dns.lookup(hostname, { ...options, all: true }, (error, addresses) => {\n if (error) {\n callback(error, \"\", 4);\n return;\n }\n const resolved = addresses as dns.LookupAddress[];\n const blocked = resolved.find(({ address }) => !isPublicAddress(address));\n if (blocked) {\n callback(\n new Error(\n `Callback resolves to a non-public address (${blocked.address})`,\n ),\n \"\",\n 4,\n );\n return;\n }\n if (options.all) {\n (callback as unknown as (e: null, a: dns.LookupAddress[]) => void)(\n null,\n resolved,\n );\n return;\n }\n const [first] = resolved;\n callback(null, first?.address ?? \"\", first?.family ?? 4);\n });\n};\n\ntype DeliveryOutcome =\n | { ok: true; status: number; body: string }\n | { ok: false; status?: number; reason: string };\n\nfunction post(\n url: URL,\n headers: Record<string, string>,\n body: string,\n): Promise<DeliveryOutcome> {\n const insecure = insecureCallbacksAllowed();\n const hostname = url.hostname.replace(/^\\[|\\]$/g, \"\");\n if (!insecure && net.isIP(hostname) && !isPublicAddress(hostname)) {\n return Promise.resolve({ ok: false, reason: \"connection_refused\" });\n }\n const signal = AbortSignal.timeout(DELIVERY_TIMEOUT_MS);\n const failure = (error?: NodeJS.ErrnoException): DeliveryOutcome => ({\n ok: false,\n reason: signal.aborted\n ? \"timeout\"\n : error?.code?.startsWith(\"ERR_TLS\") || error?.code?.includes(\"CERT\")\n ? \"tls_error\"\n : \"connection_refused\",\n });\n const client = url.protocol === \"https:\" ? https : http;\n return new Promise((resolve) => {\n const request = client.request(\n url,\n {\n method: \"POST\",\n headers: { ...headers, \"content-length\": Buffer.byteLength(body) },\n signal,\n ...(insecure ? {} : { lookup: safeLookup }),\n },\n (response) => {\n const status = response.statusCode ?? 0;\n const chunks: Buffer[] = [];\n let size = 0;\n response.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size <= 64 * 1024) {\n chunks.push(chunk);\n }\n });\n response.on(\"end\", () => {\n if (status >= 200 && status < 300) {\n resolve({\n ok: true,\n status,\n body: Buffer.concat(chunks).toString(),\n });\n } else {\n resolve({\n ok: false,\n status,\n reason: status >= 500 ? \"http_5xx\" : \"http_4xx\",\n });\n }\n });\n response.on(\"error\", (error) => resolve(failure(error)));\n response.on(\"close\", () => resolve(failure()));\n },\n );\n request.on(\"error\", (error) => resolve(failure(error)));\n request.end(body);\n });\n}\n\nfunction signedPost(\n subscription: EventSubscription,\n messageId: string,\n body: string,\n): Promise<DeliveryOutcome> {\n const timestamp = Math.floor(Date.now() / 1000);\n const secrets = [subscription.secret];\n if (\n subscription.previousSecret &&\n subscription.previousSecret.until > Date.now()\n ) {\n secrets.push(subscription.previousSecret.secret);\n }\n return post(\n new URL(subscription.url),\n {\n \"content-type\": \"application/json\",\n \"webhook-id\": messageId,\n \"webhook-timestamp\": String(timestamp),\n \"webhook-signature\": secrets\n .map((secret) => sign(secret, messageId, timestamp, body))\n .join(\" \"),\n \"x-mcp-subscription-id\": subscription.id,\n },\n body,\n );\n}\n\nfunction memoryEventStore(): EventStore {\n const subscriptions = new Map<string, EventSubscription>();\n return {\n get: async (id) => subscriptions.get(id),\n set: async (subscription) => {\n subscriptions.set(subscription.id, subscription);\n },\n delete: async (id) => {\n subscriptions.delete(id);\n },\n listByEvent: async (name) => {\n const now = Date.now();\n for (const [id, subscription] of subscriptions) {\n if (subscription.expiresAt <= now) {\n subscriptions.delete(id);\n }\n }\n return [...subscriptions.values()].filter((sub) => sub.name === name);\n },\n };\n}\n\nconst SubscriptionKeySchema = z.object({\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()).optional(),\n delivery: z.object({ url: z.string() }),\n});\n\nconst SubscribeParamsSchema = SubscriptionKeySchema.extend({\n delivery: z.object({\n mode: z.string().optional(),\n url: z.string(),\n secret: z.string(),\n }),\n cursor: z.string().nullable().optional(),\n ttlMs: z.number().nullable().optional(),\n});\n\n/**\n * App-wide MCP Events state: the registered event types, the subscription\n * store and the callback verification cache. One per {@link Skybridge} app,\n * shared by every per-request server.\n *\n * @internal\n */\nexport class EventsRuntime {\n private readonly store: EventStore;\n private readonly events = new Map<string, RegisteredEvent>();\n private readonly verifiedCallbacks = new Map<string, number>();\n\n constructor(options: EventsOptions = {}) {\n this.store = options.store ?? memoryEventStore();\n }\n\n register(\n config: EventConfig<string, EventSchema, EventSchema>,\n hooks: EventHooks<never, never, never> = {},\n ): void {\n this.events.set(config.name, {\n name: config.name,\n description: config.description,\n inputSchema: toStandardSchema(config.inputSchema ?? {}),\n payloadSchema: toStandardSchema(config.payloadSchema),\n _meta: config._meta,\n hooks,\n });\n }\n\n /** Install the `events/*` handlers on a per-request server. */\n install(server: Pick<SdkMcpServer[\"server\"], \"setRequestHandler\">): void {\n server.setRequestHandler(\n \"events/list\",\n { params: z.object({ cursor: z.string().optional() }).optional() },\n () => ({\n events: [...this.events.values()].map((event) => ({\n name: event.name,\n ...(event.description && { description: event.description }),\n delivery: [\"webhook\"],\n inputSchema: event.inputSchema[\"~standard\"].jsonSchema.input({\n target: \"draft-2020-12\",\n }),\n payloadSchema: event.payloadSchema[\"~standard\"].jsonSchema.output({\n target: \"draft-2020-12\",\n }),\n ...(event._meta && { _meta: event._meta }),\n })),\n }),\n );\n\n server.setRequestHandler(\n \"events/subscribe\",\n { params: SubscribeParamsSchema },\n async (params, ctx) => {\n if (params.delivery.mode && params.delivery.mode !== \"webhook\") {\n throw new ProtocolError(\n EVENTS_ERROR.Unsupported,\n `Unsupported delivery mode: ${params.delivery.mode}`,\n { feature: \"deliveryMode\", value: params.delivery.mode },\n );\n }\n if (!isValidSecret(params.delivery.secret)) {\n throw new ProtocolError(\n INVALID_PARAMS,\n \"delivery.secret must be whsec_ followed by base64 of 24 to 64 bytes\",\n );\n }\n const { event, subscription } = await this.resolve(params, ctx);\n const ttl =\n params.ttlMs === null ? MAX_TTL_MS : (params.ttlMs ?? DEFAULT_TTL_MS);\n const candidate: EventSubscription = {\n ...subscription,\n secret: params.delivery.secret,\n expiresAt:\n Date.now() + Math.min(Math.max(ttl, MIN_TTL_MS), MAX_TTL_MS),\n };\n await this.verifyCallback(candidate);\n await event.hooks.onSubscribe?.(subscription.arguments, ctx);\n\n const existing = await this.liveSubscription(subscription.id);\n const previousSecret =\n existing && existing.secret !== candidate.secret\n ? {\n secret: existing.secret,\n until: Date.now() + SECRET_ROTATION_GRACE_MS,\n }\n : existing?.previousSecret;\n await this.store.set({\n ...candidate,\n ...(previousSecret && { previousSecret }),\n });\n return {\n id: candidate.id,\n refreshBefore: new Date(candidate.expiresAt).toISOString(),\n cursor: null,\n truncated: false,\n };\n },\n );\n\n server.setRequestHandler(\n \"events/unsubscribe\",\n { params: SubscriptionKeySchema },\n async (params, ctx) => {\n const { subscription } = await this.resolve(params, ctx);\n await this.store.delete(subscription.id);\n return {};\n },\n );\n }\n\n /** Deliver one event to every live, matching subscription. */\n async emit(name: string, emitted: EmittedEvent<unknown>): Promise<void> {\n const event = this.events.get(name);\n if (!event) {\n throw new Error(`Event \"${name}\" is not registered.`);\n }\n const data = await validate(event.payloadSchema, emitted.data, \"payload\");\n const id = emitted.id ?? `evt_${randomBytes(12).toString(\"hex\")}`;\n const body = JSON.stringify({\n eventId: id,\n name,\n timestamp: (emitted.timestamp ?? new Date()).toISOString(),\n data,\n cursor: null,\n });\n if (Buffer.byteLength(body) > MAX_PAYLOAD_BYTES) {\n throw new Error(\n `Event \"${name}\" payload exceeds ${MAX_PAYLOAD_BYTES} bytes; send a summary and expose a tool to fetch the rest.`,\n );\n }\n const now = Date.now();\n const subscriptions = (await this.store.listByEvent(name)).filter(\n (sub) => sub.expiresAt > now,\n );\n const results = await Promise.allSettled(\n subscriptions.map(async (subscription) => {\n const matches =\n (await event.hooks.match?.(\n { id, data },\n {\n arguments: subscription.arguments,\n principal: subscription.principal,\n },\n )) ?? true;\n if (matches) {\n await this.deliver(subscription, id, body, 0);\n }\n }),\n );\n const failures = results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (failures.length > 0) {\n throw new AggregateError(\n failures,\n `Event ${id} was not delivered to ${failures.length} subscription(s) whose match hook threw.`,\n );\n }\n }\n\n private async resolve(\n params: z.infer<typeof SubscriptionKeySchema>,\n ctx: ServerContext,\n ) {\n const event = this.events.get(params.name);\n if (!event) {\n throw new ProtocolError(\n EVENTS_ERROR.NotFound,\n `Unknown event: ${params.name}`,\n { kind: \"event\" },\n );\n }\n const url = checkCallbackUrl(params.delivery.url);\n const principal = principalOf(ctx);\n const rawArguments = params.arguments ?? {};\n const args = (await validate(\n event.inputSchema,\n rawArguments,\n \"arguments\",\n )) as Record<string, unknown>;\n const hash = createHash(\"sha256\")\n .update(canonicalJson([principal, url, event.name, rawArguments]))\n .digest(\"hex\");\n return {\n event,\n subscription: {\n id: `sub_${hash.slice(0, 32)}`,\n principal,\n name: event.name,\n arguments: args,\n url,\n },\n };\n }\n\n private async deliver(\n subscription: EventSubscription,\n eventId: string,\n body: string,\n attempt: number,\n ): Promise<void> {\n const outcome = await signedPost(subscription, eventId, body);\n if (outcome.ok) {\n return;\n }\n const status = outcome.status ?? 0;\n const retryable =\n status !== 410 && status !== 413 && (status < 300 || status >= 400);\n const delay = RETRY_DELAYS_MS[attempt];\n if (!retryable || delay === undefined) {\n console.warn(\n `skybridge: dropped event ${eventId} for subscription ${subscription.id} (${outcome.reason})`,\n );\n return;\n }\n setTimeout(() => {\n this.liveSubscription(subscription.id)\n .then((live) => live && this.deliver(live, eventId, body, attempt + 1))\n .catch(() => {});\n }, delay).unref();\n }\n\n private async liveSubscription(id: string) {\n const subscription = await this.store.get(id);\n if (subscription && subscription.expiresAt <= Date.now()) {\n await this.store.delete(id);\n return undefined;\n }\n return subscription;\n }\n\n private async verifyCallback(subscription: EventSubscription): Promise<void> {\n const key = `${subscription.principal}\\n${subscription.url}`;\n const now = Date.now();\n if ((this.verifiedCallbacks.get(key) ?? 0) > now) {\n return;\n }\n const challenge = randomBytes(24).toString(\"base64url\");\n const outcome = await signedPost(\n subscription,\n `msg_verification_${randomBytes(12).toString(\"hex\")}`,\n JSON.stringify({ type: \"verification\", challenge }),\n );\n let echoed: unknown;\n if (outcome.ok) {\n try {\n echoed = JSON.parse(outcome.body)?.challenge;\n } catch {}\n }\n const matched =\n typeof echoed === \"string\" &&\n echoed.length === challenge.length &&\n timingSafeEqual(Buffer.from(echoed), Buffer.from(challenge));\n if (!matched) {\n throw new ProtocolError(\n EVENTS_ERROR.CallbackEndpointError,\n \"Callback endpoint verification failed\",\n { reason: outcome.ok ? \"challenge_failed\" : outcome.reason },\n );\n }\n for (const [cached, until] of this.verifiedCallbacks) {\n if (until <= now) {\n this.verifiedCallbacks.delete(cached);\n }\n }\n this.verifiedCallbacks.set(key, now + VERIFICATION_CACHE_MS);\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};