@plitzi/sdk-server 0.32.25 → 0.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +326 -162
  3. package/dist/adapters/authAdapters.d.ts +21 -0
  4. package/dist/adapters/authAdapters.js +12 -0
  5. package/dist/adapters/jsonAdapters.d.ts +15 -0
  6. package/dist/adapters/jsonAdapters.js +9 -4
  7. package/dist/core/auth/api.d.ts +148 -0
  8. package/dist/core/auth/api.js +286 -0
  9. package/dist/core/auth/authorize.d.ts +96 -0
  10. package/dist/core/auth/authorize.js +92 -0
  11. package/dist/core/auth/createAuth.d.ts +165 -0
  12. package/dist/core/auth/createAuth.js +105 -0
  13. package/dist/core/auth/credentials.d.ts +29 -0
  14. package/dist/core/auth/credentials.js +48 -0
  15. package/dist/core/auth/domains.d.ts +41 -0
  16. package/dist/core/auth/domains.js +78 -0
  17. package/dist/core/auth/identity.d.ts +108 -0
  18. package/dist/core/auth/identity.js +164 -0
  19. package/dist/core/auth/oauth/client.d.ts +5 -0
  20. package/dist/core/auth/oauth/client.js +47 -0
  21. package/dist/core/auth/oauth/index.d.ts +78 -0
  22. package/dist/core/auth/oauth/index.js +113 -0
  23. package/dist/core/auth/oauth/providers/github.d.ts +2 -0
  24. package/dist/core/auth/oauth/providers/github.js +48 -0
  25. package/dist/core/auth/oauth/providers/google.d.ts +2 -0
  26. package/dist/core/auth/oauth/providers/google.js +30 -0
  27. package/dist/core/auth/oauth/state.d.ts +23 -0
  28. package/dist/core/auth/oauth/state.js +55 -0
  29. package/dist/core/auth/oauth/types.d.ts +51 -0
  30. package/dist/core/auth/oauth/types.js +13 -0
  31. package/dist/core/auth/routes.d.ts +50 -0
  32. package/dist/core/auth/routes.js +129 -0
  33. package/dist/core/auth/session.d.ts +128 -0
  34. package/dist/core/auth/session.js +165 -0
  35. package/dist/core/auth/spaceTokens.d.ts +137 -0
  36. package/dist/core/auth/spaceTokens.js +212 -0
  37. package/dist/core/auth/tokens.d.ts +151 -0
  38. package/dist/core/auth/tokens.js +221 -0
  39. package/dist/core/createServer.d.ts +29 -0
  40. package/dist/core/createServer.js +28 -14
  41. package/dist/core/handlers/authMiddleware.d.ts +27 -0
  42. package/dist/core/handlers/authMiddleware.js +38 -0
  43. package/dist/core/handlers/authRouteHandlers.d.ts +46 -0
  44. package/dist/core/handlers/authRouteHandlers.js +75 -0
  45. package/dist/core/handlers/types.d.ts +37 -0
  46. package/dist/{src/core → core}/http/dispatcher.d.ts +2 -2
  47. package/dist/core/http/dispatcher.js +8 -6
  48. package/dist/core/http/navigation.d.ts +11 -0
  49. package/dist/core/http/navigation.js +16 -0
  50. package/dist/core/http/securityHeaders.js +6 -4
  51. package/dist/core/http/stages/authApi.d.ts +17 -0
  52. package/dist/core/http/stages/authApi.js +66 -0
  53. package/dist/core/http/stages/authRoutes.js +40 -11
  54. package/dist/core/http/stages/exchangeRoute.d.ts +15 -0
  55. package/dist/core/http/stages/exchangeRoute.js +67 -0
  56. package/dist/core/http/stages/health.d.ts +11 -0
  57. package/dist/core/http/stages/health.js +25 -3
  58. package/dist/core/http/stages/middlewares.d.ts +2 -0
  59. package/dist/core/http/stages/static.d.ts +13 -0
  60. package/dist/core/http/stages/static.js +21 -6
  61. package/dist/core/http/types.d.ts +35 -0
  62. package/dist/{modules/mcp/constants.js → core/previewToken.js} +1 -1
  63. package/dist/core/sdkAssets.d.ts +16 -0
  64. package/dist/core/sdkAssets.js +46 -0
  65. package/dist/core/server/baseServer.js +40 -5
  66. package/dist/core/server/pageServer.d.ts +7 -0
  67. package/dist/core/server/pageServer.js +13 -17
  68. package/dist/core/services/action.d.ts +9 -0
  69. package/dist/core/services/action.js +21 -0
  70. package/dist/core/services/registry.d.ts +3 -0
  71. package/dist/core/services/registry.js +9 -19
  72. package/dist/{src/core → core}/services/resolve.d.ts +1 -0
  73. package/dist/core/services/resolve.js +6 -4
  74. package/dist/core/services/rsc.js +3 -2
  75. package/dist/core/staticFiles.js +1 -1
  76. package/dist/{src/core → core}/transports.d.ts +3 -0
  77. package/dist/core/transports.js +7 -6
  78. package/dist/handlers.d.ts +58 -0
  79. package/dist/handlers.js +3 -0
  80. package/dist/{src/helpers → helpers}/buildResponseHelpers.d.ts +2 -1
  81. package/dist/helpers/buildResponseHelpers.js +13 -4
  82. package/dist/helpers/buildServerInfo.d.ts +3 -0
  83. package/dist/helpers/buildServerInfo.js +25 -3
  84. package/dist/{src/helpers → helpers}/cache/keys.d.ts +5 -1
  85. package/dist/helpers/cache/keys.js +1 -1
  86. package/dist/helpers/compress.d.ts +18 -0
  87. package/dist/helpers/compress.js +47 -11
  88. package/dist/helpers/offlineDataLoader.d.ts +11 -0
  89. package/dist/helpers/offlineDataLoader.js +15 -0
  90. package/dist/helpers/resolveDebugMode.d.ts +10 -0
  91. package/dist/helpers/resolveDebugMode.js +13 -0
  92. package/dist/index.d.ts +16 -2
  93. package/dist/index.js +9 -20
  94. package/dist/kernel.d.ts +41 -0
  95. package/dist/kernel.js +22 -0
  96. package/dist/middlewares/spaceDeployment.d.ts +2 -0
  97. package/dist/middlewares/spaceDeployment.js +2 -1
  98. package/dist/modules/actions/handler.d.ts +11 -0
  99. package/dist/modules/actions/handler.js +77 -0
  100. package/dist/modules/connectors/engine.d.ts +42 -0
  101. package/dist/modules/connectors/engine.js +221 -0
  102. package/dist/modules/connectors/getByPath.d.ts +8 -0
  103. package/dist/modules/connectors/getByPath.js +21 -0
  104. package/dist/modules/connectors/index.d.ts +7 -0
  105. package/dist/modules/connectors/projection.d.ts +18 -0
  106. package/dist/modules/connectors/projection.js +108 -0
  107. package/dist/modules/connectors/resolver.d.ts +18 -0
  108. package/dist/modules/connectors/resolver.js +68 -0
  109. package/dist/modules/connectors/types.d.ts +19 -0
  110. package/dist/{src/modules → modules}/rsc/handler.d.ts +2 -2
  111. package/dist/modules/rsc/handler.js +54 -2
  112. package/dist/modules/rsc/resolveRscData.d.ts +35 -0
  113. package/dist/modules/rsc/resolveRscData.js +74 -0
  114. package/dist/{src/modules → modules}/ssr/Component.d.ts +4 -1
  115. package/dist/modules/ssr/Component.js +10 -3
  116. package/dist/modules/ssr/buildBody.d.ts +9 -0
  117. package/dist/modules/ssr/handler.d.ts +4 -0
  118. package/dist/modules/ssr/handler.js +18 -1
  119. package/dist/{src/modules → modules}/ssr/loadPluginComponents.d.ts +5 -2
  120. package/dist/modules/ssr/loadPluginComponents.js +20 -2
  121. package/dist/{src/modules → modules}/ssr/prepareRender.d.ts +2 -2
  122. package/dist/modules/ssr/prepareRender.js +24 -7
  123. package/dist/modules/ssr/preview.d.ts +10 -0
  124. package/dist/modules/ssr/preview.js +5 -78
  125. package/dist/modules/ssr/registerExternalPlugins.js +1 -1
  126. package/dist/modules/ssr/streamBody.d.ts +5 -0
  127. package/dist/modules/ssr/streamBody.js +1 -1
  128. package/dist/modules/ssr/template.d.ts +2 -0
  129. package/dist/modules/ssr/template.js +1 -1
  130. package/dist/plugins/compile.js +1 -1
  131. package/dist/plugins/manager.js +12 -8
  132. package/dist/ssr.d.ts +15 -0
  133. package/dist/ssr.js +4 -0
  134. package/package.json +29 -25
  135. package/dist/.gitkeep +0 -0
  136. package/dist/core/server/mcpServer.js +0 -29
  137. package/dist/core/services/mcp.js +0 -27
  138. package/dist/core/services/oauth.js +0 -116
  139. package/dist/core/services/preview.js +0 -37
  140. package/dist/core/services/proxy.js +0 -12
  141. package/dist/mcp.d.ts +0 -2
  142. package/dist/mcp.js +0 -7
  143. package/dist/modules/ai/AIEngine.js +0 -120
  144. package/dist/modules/ai/toolkit.js +0 -59
  145. package/dist/modules/mcp/apps/example/view/index.tsx +0 -70
  146. package/dist/modules/mcp/apps/index.js +0 -16
  147. package/dist/modules/mcp/apps/render/index.js +0 -17
  148. package/dist/modules/mcp/apps/render/styles.js +0 -54
  149. package/dist/modules/mcp/apps/render/view/heldBatch.ts +0 -107
  150. package/dist/modules/mcp/apps/render/view/index.tsx +0 -314
  151. package/dist/modules/mcp/apps/render/view/streamProgress.ts +0 -137
  152. package/dist/modules/mcp/apps/shared/assets.js +0 -10
  153. package/dist/modules/mcp/apps/shared/bundle.js +0 -23
  154. package/dist/modules/mcp/apps/shared/page.js +0 -34
  155. package/dist/modules/mcp/apps/shared/registerApp.js +0 -43
  156. package/dist/modules/mcp/apps/shared/resolve.js +0 -5
  157. package/dist/modules/mcp/apps/shared/shell.ejs +0 -59
  158. package/dist/modules/mcp/apps/shared/zodEnglishOnly.js +0 -23
  159. package/dist/modules/mcp/catalogs/builtinCallbacks.js +0 -204
  160. package/dist/modules/mcp/catalogs/builtinComponents.js +0 -170
  161. package/dist/modules/mcp/catalogs/builtinElementCallbacks.js +0 -50
  162. package/dist/modules/mcp/catalogs/builtinTransformers.js +0 -148
  163. package/dist/modules/mcp/catalogs/builtinUtilities.js +0 -90
  164. package/dist/modules/mcp/catalogs/cssCatalog/border.js +0 -30
  165. package/dist/modules/mcp/catalogs/cssCatalog/box.js +0 -31
  166. package/dist/modules/mcp/catalogs/cssCatalog/helpers.js +0 -185
  167. package/dist/modules/mcp/catalogs/cssCatalog/index.js +0 -131
  168. package/dist/modules/mcp/catalogs/cssCatalog/layout.js +0 -98
  169. package/dist/modules/mcp/catalogs/cssCatalog/visual.js +0 -144
  170. package/dist/modules/mcp/catalogs/observed.js +0 -90
  171. package/dist/modules/mcp/catalogs/paramSpec.js +0 -69
  172. package/dist/modules/mcp/catalogs/registry.js +0 -89
  173. package/dist/modules/mcp/handler.js +0 -83
  174. package/dist/modules/mcp/helpers/agentPrompt.js +0 -104
  175. package/dist/modules/mcp/helpers/computeVersion.js +0 -16
  176. package/dist/modules/mcp/helpers/guide.js +0 -467
  177. package/dist/modules/mcp/helpers/interactions.js +0 -123
  178. package/dist/modules/mcp/helpers/log.js +0 -64
  179. package/dist/modules/mcp/helpers/opResult.js +0 -18
  180. package/dist/modules/mcp/helpers/space.js +0 -300
  181. package/dist/modules/mcp/helpers/uris.js +0 -44
  182. package/dist/modules/mcp/previewClient.js +0 -31
  183. package/dist/modules/mcp/proxy/config.js +0 -63
  184. package/dist/modules/mcp/proxy/fetch.js +0 -91
  185. package/dist/modules/mcp/proxy/grant.js +0 -67
  186. package/dist/modules/mcp/proxy/guard.js +0 -38
  187. package/dist/modules/mcp/proxy/handler.js +0 -99
  188. package/dist/modules/mcp/proxy/payload.js +0 -29
  189. package/dist/modules/mcp/proxy/rewrite.js +0 -138
  190. package/dist/modules/mcp/proxy/sign.js +0 -15
  191. package/dist/modules/mcp/proxy/types.js +0 -9
  192. package/dist/modules/mcp/resources/canonical.js +0 -30
  193. package/dist/modules/mcp/resources/core.js +0 -18
  194. package/dist/modules/mcp/resources/envelope.js +0 -14
  195. package/dist/modules/mcp/resources/primer.js +0 -31
  196. package/dist/modules/mcp/resources/register.js +0 -190
  197. package/dist/modules/mcp/resources/renderGuide.js +0 -451
  198. package/dist/modules/mcp/resources/router.js +0 -37
  199. package/dist/modules/mcp/resources/schema.js +0 -43
  200. package/dist/modules/mcp/resources/style.js +0 -34
  201. package/dist/modules/mcp/screenshotClient.js +0 -47
  202. package/dist/modules/mcp/server.js +0 -113
  203. package/dist/modules/mcp/tools/apply/dispatch.js +0 -105
  204. package/dist/modules/mcp/tools/apply/index.js +0 -150
  205. package/dist/modules/mcp/tools/apply/writeResult.js +0 -37
  206. package/dist/modules/mcp/tools/index.js +0 -24
  207. package/dist/modules/mcp/tools/operations/index.js +0 -45
  208. package/dist/modules/mcp/tools/operations/schema/bindings/deleteBinding.js +0 -32
  209. package/dist/modules/mcp/tools/operations/schema/bindings/patchBinding.js +0 -36
  210. package/dist/modules/mcp/tools/operations/schema/bindings/upsertBinding.js +0 -47
  211. package/dist/modules/mcp/tools/operations/schema/elements/deleteElement.js +0 -29
  212. package/dist/modules/mcp/tools/operations/schema/elements/moveElement.js +0 -41
  213. package/dist/modules/mcp/tools/operations/schema/elements/patchElement.js +0 -58
  214. package/dist/modules/mcp/tools/operations/schema/elements/repeatElement.js +0 -148
  215. package/dist/modules/mcp/tools/operations/schema/elements/upsertElement.js +0 -65
  216. package/dist/modules/mcp/tools/operations/schema/folders/deleteFolder.js +0 -30
  217. package/dist/modules/mcp/tools/operations/schema/folders/upsertFolder.js +0 -49
  218. package/dist/modules/mcp/tools/operations/schema/interactions/deleteInteraction.js +0 -52
  219. package/dist/modules/mcp/tools/operations/schema/interactions/patchInteractionNode.js +0 -47
  220. package/dist/modules/mcp/tools/operations/schema/interactions/upsertInteractionFlow.js +0 -44
  221. package/dist/modules/mcp/tools/operations/schema/operations.js +0 -41
  222. package/dist/modules/mcp/tools/operations/schema/pages/deletePage.js +0 -25
  223. package/dist/modules/mcp/tools/operations/schema/pages/upsertPage.js +0 -75
  224. package/dist/modules/mcp/tools/operations/schema/settings/patchSettings.js +0 -45
  225. package/dist/modules/mcp/tools/operations/schema/shared.js +0 -122
  226. package/dist/modules/mcp/tools/operations/schema/translator.js +0 -215
  227. package/dist/modules/mcp/tools/operations/schema/variables/deleteVariable.js +0 -18
  228. package/dist/modules/mcp/tools/operations/schema/variables/upsertVariable.js +0 -42
  229. package/dist/modules/mcp/tools/operations/schema/write.js +0 -109
  230. package/dist/modules/mcp/tools/operations/schemaIds.js +0 -54
  231. package/dist/modules/mcp/tools/operations/style/definitions/deleteDefinition.js +0 -21
  232. package/dist/modules/mcp/tools/operations/style/definitions/patchDefinition.js +0 -28
  233. package/dist/modules/mcp/tools/operations/style/definitions/upsertDefinition.js +0 -24
  234. package/dist/modules/mcp/tools/operations/style/definitions/upsertDefinitions.js +0 -40
  235. package/dist/modules/mcp/tools/operations/style/globalStyles/deleteGlobalStyle.js +0 -21
  236. package/dist/modules/mcp/tools/operations/style/globalStyles/patchGlobalStyle.js +0 -28
  237. package/dist/modules/mcp/tools/operations/style/globalStyles/upsertGlobalStyle.js +0 -24
  238. package/dist/modules/mcp/tools/operations/style/idStyles/deleteIdStyle.js +0 -21
  239. package/dist/modules/mcp/tools/operations/style/idStyles/patchIdStyle.js +0 -28
  240. package/dist/modules/mcp/tools/operations/style/idStyles/upsertIdStyle.js +0 -24
  241. package/dist/modules/mcp/tools/operations/style/operations.js +0 -29
  242. package/dist/modules/mcp/tools/operations/style/shared.js +0 -59
  243. package/dist/modules/mcp/tools/operations/style/translator.js +0 -101
  244. package/dist/modules/mcp/tools/operations/style/variables/deleteStyleVariable.js +0 -21
  245. package/dist/modules/mcp/tools/operations/style/variables/upsertStyleVariable.js +0 -22
  246. package/dist/modules/mcp/tools/operations/style/write.js +0 -108
  247. package/dist/modules/mcp/tools/preview.js +0 -37
  248. package/dist/modules/mcp/tools/read.js +0 -51
  249. package/dist/modules/mcp/tools/render.js +0 -184
  250. package/dist/modules/mcp/tools/screenshot.js +0 -83
  251. package/dist/modules/mcp/tools/search.js +0 -115
  252. package/dist/modules/mcp/tools/shared/expandOperations.js +0 -44
  253. package/dist/modules/mcp/tools/shared/tool.js +0 -33
  254. package/dist/modules/mcp/tools/shared/validator/audit.js +0 -124
  255. package/dist/modules/mcp/tools/shared/validator/batch.js +0 -39
  256. package/dist/modules/mcp/tools/shared/validator/bindings.js +0 -70
  257. package/dist/modules/mcp/tools/shared/validator/context.js +0 -35
  258. package/dist/modules/mcp/tools/shared/validator/css.js +0 -39
  259. package/dist/modules/mcp/tools/shared/validator/elements.js +0 -68
  260. package/dist/modules/mcp/tools/shared/validator/index.js +0 -246
  261. package/dist/modules/mcp/tools/shared/validator/interactions.js +0 -103
  262. package/dist/modules/mcp/tools/shared/validator/refs.js +0 -28
  263. package/dist/modules/mcp/tools/validate.js +0 -47
  264. package/dist/modules/oauth/authorize.js +0 -177
  265. package/dist/modules/oauth/challenge.js +0 -33
  266. package/dist/modules/oauth/consentPage.js +0 -118
  267. package/dist/modules/oauth/metadata.js +0 -69
  268. package/dist/modules/oauth/params.js +0 -5
  269. package/dist/modules/oauth/pkce.js +0 -15
  270. package/dist/modules/oauth/records.js +0 -46
  271. package/dist/modules/oauth/register.js +0 -55
  272. package/dist/modules/oauth/respond.js +0 -44
  273. package/dist/modules/oauth/token.js +0 -100
  274. package/dist/public/.gitkeep +0 -0
  275. package/dist/src/adapters/jsonAdapters.d.ts +0 -7
  276. package/dist/src/core/createServer.d.ts +0 -14
  277. package/dist/src/core/http/stages/health.d.ts +0 -2
  278. package/dist/src/core/http/stages/middlewares.d.ts +0 -2
  279. package/dist/src/core/http/stages/static.d.ts +0 -5
  280. package/dist/src/core/http/types.d.ts +0 -22
  281. package/dist/src/core/server/mcpServer.d.ts +0 -2
  282. package/dist/src/core/server/pageServer.d.ts +0 -10
  283. package/dist/src/core/services/mcp.d.ts +0 -3
  284. package/dist/src/core/services/oauth.d.ts +0 -18
  285. package/dist/src/core/services/preview.d.ts +0 -2
  286. package/dist/src/core/services/proxy.d.ts +0 -2
  287. package/dist/src/core/services/registry.d.ts +0 -4
  288. package/dist/src/helpers/buildServerInfo.d.ts +0 -2
  289. package/dist/src/helpers/compress.d.ts +0 -3
  290. package/dist/src/index.d.ts +0 -15
  291. package/dist/src/mcp.d.ts +0 -14
  292. package/dist/src/middlewares/spaceDeployment.d.ts +0 -2
  293. package/dist/src/modules/ai/AIEngine.d.ts +0 -20
  294. package/dist/src/modules/ai/index.d.ts +0 -4
  295. package/dist/src/modules/ai/toolkit.d.ts +0 -17
  296. package/dist/src/modules/mcp/apps/example/index.d.ts +0 -8
  297. package/dist/src/modules/mcp/apps/index.d.ts +0 -11
  298. package/dist/src/modules/mcp/apps/render/index.d.ts +0 -4
  299. package/dist/src/modules/mcp/apps/render/styles.d.ts +0 -10
  300. package/dist/src/modules/mcp/apps/shared/assets.d.ts +0 -10
  301. package/dist/src/modules/mcp/apps/shared/bundle.d.ts +0 -4
  302. package/dist/src/modules/mcp/apps/shared/index.d.ts +0 -3
  303. package/dist/src/modules/mcp/apps/shared/page.d.ts +0 -2
  304. package/dist/src/modules/mcp/apps/shared/registerApp.d.ts +0 -5
  305. package/dist/src/modules/mcp/apps/shared/resolve.d.ts +0 -1
  306. package/dist/src/modules/mcp/apps/shared/zodEnglishOnly.d.ts +0 -4
  307. package/dist/src/modules/mcp/catalogs/builtinCallbacks.d.ts +0 -23
  308. package/dist/src/modules/mcp/catalogs/builtinComponents.d.ts +0 -4
  309. package/dist/src/modules/mcp/catalogs/builtinElementCallbacks.d.ts +0 -20
  310. package/dist/src/modules/mcp/catalogs/builtinTransformers.d.ts +0 -28
  311. package/dist/src/modules/mcp/catalogs/builtinUtilities.d.ts +0 -18
  312. package/dist/src/modules/mcp/catalogs/cssCatalog/border.d.ts +0 -4
  313. package/dist/src/modules/mcp/catalogs/cssCatalog/box.d.ts +0 -4
  314. package/dist/src/modules/mcp/catalogs/cssCatalog/helpers.d.ts +0 -34
  315. package/dist/src/modules/mcp/catalogs/cssCatalog/index.d.ts +0 -19
  316. package/dist/src/modules/mcp/catalogs/cssCatalog/layout.d.ts +0 -9
  317. package/dist/src/modules/mcp/catalogs/cssCatalog/visual.d.ts +0 -8
  318. package/dist/src/modules/mcp/catalogs/index.d.ts +0 -9
  319. package/dist/src/modules/mcp/catalogs/observed.d.ts +0 -48
  320. package/dist/src/modules/mcp/catalogs/paramSpec.d.ts +0 -42
  321. package/dist/src/modules/mcp/catalogs/registry.d.ts +0 -35
  322. package/dist/src/modules/mcp/e2e/index.d.ts +0 -6
  323. package/dist/src/modules/mcp/e2e/mcpEndpoint.d.ts +0 -27
  324. package/dist/src/modules/mcp/e2e/postMessageChannel.d.ts +0 -22
  325. package/dist/src/modules/mcp/e2e/renderingHost.d.ts +0 -34
  326. package/dist/src/modules/mcp/handler.d.ts +0 -22
  327. package/dist/src/modules/mcp/helpers/agentPrompt.d.ts +0 -4
  328. package/dist/src/modules/mcp/helpers/computeVersion.d.ts +0 -1
  329. package/dist/src/modules/mcp/helpers/guide.d.ts +0 -4
  330. package/dist/src/modules/mcp/helpers/index.d.ts +0 -8
  331. package/dist/src/modules/mcp/helpers/interactions.d.ts +0 -30
  332. package/dist/src/modules/mcp/helpers/log.d.ts +0 -8
  333. package/dist/src/modules/mcp/helpers/opResult.d.ts +0 -13
  334. package/dist/src/modules/mcp/helpers/space.d.ts +0 -115
  335. package/dist/src/modules/mcp/helpers/uris.d.ts +0 -28
  336. package/dist/src/modules/mcp/index.d.ts +0 -13
  337. package/dist/src/modules/mcp/previewClient.d.ts +0 -13
  338. package/dist/src/modules/mcp/proxy/config.d.ts +0 -19
  339. package/dist/src/modules/mcp/proxy/fetch.d.ts +0 -18
  340. package/dist/src/modules/mcp/proxy/grant.d.ts +0 -25
  341. package/dist/src/modules/mcp/proxy/guard.d.ts +0 -6
  342. package/dist/src/modules/mcp/proxy/handler.d.ts +0 -8
  343. package/dist/src/modules/mcp/proxy/index.d.ts +0 -8
  344. package/dist/src/modules/mcp/proxy/payload.d.ts +0 -8
  345. package/dist/src/modules/mcp/proxy/rewrite.d.ts +0 -18
  346. package/dist/src/modules/mcp/proxy/sign.d.ts +0 -6
  347. package/dist/src/modules/mcp/proxy/types.d.ts +0 -45
  348. package/dist/src/modules/mcp/resources/canonical.d.ts +0 -6
  349. package/dist/src/modules/mcp/resources/core.d.ts +0 -5
  350. package/dist/src/modules/mcp/resources/envelope.d.ts +0 -10
  351. package/dist/src/modules/mcp/resources/index.d.ts +0 -8
  352. package/dist/src/modules/mcp/resources/primer.d.ts +0 -7
  353. package/dist/src/modules/mcp/resources/register.d.ts +0 -10
  354. package/dist/src/modules/mcp/resources/renderGuide.d.ts +0 -10
  355. package/dist/src/modules/mcp/resources/router.d.ts +0 -10
  356. package/dist/src/modules/mcp/resources/schema.d.ts +0 -5
  357. package/dist/src/modules/mcp/resources/style.d.ts +0 -5
  358. package/dist/src/modules/mcp/screenshotClient.d.ts +0 -13
  359. package/dist/src/modules/mcp/server.d.ts +0 -31
  360. package/dist/src/modules/mcp/tests/helpers.d.ts +0 -13
  361. package/dist/src/modules/mcp/tools/apply/dispatch.d.ts +0 -6
  362. package/dist/src/modules/mcp/tools/apply/index.d.ts +0 -470
  363. package/dist/src/modules/mcp/tools/apply/writeResult.d.ts +0 -8
  364. package/dist/src/modules/mcp/tools/index.d.ts +0 -18
  365. package/dist/src/modules/mcp/tools/operations/index.d.ts +0 -928
  366. package/dist/src/modules/mcp/tools/operations/schema/bindings/deleteBinding.d.ts +0 -17
  367. package/dist/src/modules/mcp/tools/operations/schema/bindings/patchBinding.d.ts +0 -25
  368. package/dist/src/modules/mcp/tools/operations/schema/bindings/upsertBinding.d.ts +0 -27
  369. package/dist/src/modules/mcp/tools/operations/schema/elements/deleteElement.d.ts +0 -10
  370. package/dist/src/modules/mcp/tools/operations/schema/elements/moveElement.d.ts +0 -16
  371. package/dist/src/modules/mcp/tools/operations/schema/elements/patchElement.d.ts +0 -22
  372. package/dist/src/modules/mcp/tools/operations/schema/elements/repeatElement.d.ts +0 -55
  373. package/dist/src/modules/mcp/tools/operations/schema/elements/upsertElement.d.ts +0 -16
  374. package/dist/src/modules/mcp/tools/operations/schema/folders/deleteFolder.d.ts +0 -9
  375. package/dist/src/modules/mcp/tools/operations/schema/folders/upsertFolder.d.ts +0 -12
  376. package/dist/src/modules/mcp/tools/operations/schema/index.d.ts +0 -21
  377. package/dist/src/modules/mcp/tools/operations/schema/interactions/deleteInteraction.d.ts +0 -12
  378. package/dist/src/modules/mcp/tools/operations/schema/interactions/patchInteractionNode.d.ts +0 -18
  379. package/dist/src/modules/mcp/tools/operations/schema/interactions/upsertInteractionFlow.d.ts +0 -27
  380. package/dist/src/modules/mcp/tools/operations/schema/operations.d.ts +0 -229
  381. package/dist/src/modules/mcp/tools/operations/schema/pages/deletePage.d.ts +0 -9
  382. package/dist/src/modules/mcp/tools/operations/schema/pages/upsertPage.d.ts +0 -14
  383. package/dist/src/modules/mcp/tools/operations/schema/settings/patchSettings.d.ts +0 -34
  384. package/dist/src/modules/mcp/tools/operations/schema/shared.d.ts +0 -92
  385. package/dist/src/modules/mcp/tools/operations/schema/translator.d.ts +0 -12
  386. package/dist/src/modules/mcp/tools/operations/schema/variables/deleteVariable.d.ts +0 -9
  387. package/dist/src/modules/mcp/tools/operations/schema/variables/upsertVariable.d.ts +0 -16
  388. package/dist/src/modules/mcp/tools/operations/schema/write.d.ts +0 -42
  389. package/dist/src/modules/mcp/tools/operations/schemaIds.d.ts +0 -6
  390. package/dist/src/modules/mcp/tools/operations/style/definitions/deleteDefinition.d.ts +0 -9
  391. package/dist/src/modules/mcp/tools/operations/style/definitions/patchDefinition.d.ts +0 -37
  392. package/dist/src/modules/mcp/tools/operations/style/definitions/upsertDefinition.d.ts +0 -37
  393. package/dist/src/modules/mcp/tools/operations/style/definitions/upsertDefinitions.d.ts +0 -41
  394. package/dist/src/modules/mcp/tools/operations/style/globalStyles/deleteGlobalStyle.d.ts +0 -9
  395. package/dist/src/modules/mcp/tools/operations/style/globalStyles/patchGlobalStyle.d.ts +0 -37
  396. package/dist/src/modules/mcp/tools/operations/style/globalStyles/upsertGlobalStyle.d.ts +0 -37
  397. package/dist/src/modules/mcp/tools/operations/style/idStyles/deleteIdStyle.d.ts +0 -9
  398. package/dist/src/modules/mcp/tools/operations/style/idStyles/patchIdStyle.d.ts +0 -37
  399. package/dist/src/modules/mcp/tools/operations/style/idStyles/upsertIdStyle.d.ts +0 -37
  400. package/dist/src/modules/mcp/tools/operations/style/index.d.ts +0 -15
  401. package/dist/src/modules/mcp/tools/operations/style/operations.d.ts +0 -264
  402. package/dist/src/modules/mcp/tools/operations/style/shared.d.ts +0 -116
  403. package/dist/src/modules/mcp/tools/operations/style/translator.d.ts +0 -12
  404. package/dist/src/modules/mcp/tools/operations/style/variables/deleteStyleVariable.d.ts +0 -15
  405. package/dist/src/modules/mcp/tools/operations/style/variables/upsertStyleVariable.d.ts +0 -20
  406. package/dist/src/modules/mcp/tools/operations/style/write.d.ts +0 -12
  407. package/dist/src/modules/mcp/tools/preview.d.ts +0 -465
  408. package/dist/src/modules/mcp/tools/read.d.ts +0 -9
  409. package/dist/src/modules/mcp/tools/render.d.ts +0 -499
  410. package/dist/src/modules/mcp/tools/render.test.d.ts +0 -1
  411. package/dist/src/modules/mcp/tools/screenshot.d.ts +0 -470
  412. package/dist/src/modules/mcp/tools/search.d.ts +0 -15
  413. package/dist/src/modules/mcp/tools/shared/expandOperations.d.ts +0 -13
  414. package/dist/src/modules/mcp/tools/shared/tool.d.ts +0 -72
  415. package/dist/src/modules/mcp/tools/shared/validator/audit.d.ts +0 -4
  416. package/dist/src/modules/mcp/tools/shared/validator/batch.d.ts +0 -5
  417. package/dist/src/modules/mcp/tools/shared/validator/bindings.d.ts +0 -6
  418. package/dist/src/modules/mcp/tools/shared/validator/context.d.ts +0 -38
  419. package/dist/src/modules/mcp/tools/shared/validator/css.d.ts +0 -4
  420. package/dist/src/modules/mcp/tools/shared/validator/elements.d.ts +0 -7
  421. package/dist/src/modules/mcp/tools/shared/validator/index.d.ts +0 -8
  422. package/dist/src/modules/mcp/tools/shared/validator/interactions.d.ts +0 -3
  423. package/dist/src/modules/mcp/tools/shared/validator/refs.d.ts +0 -4
  424. package/dist/src/modules/mcp/tools/validate.d.ts +0 -467
  425. package/dist/src/modules/mcp/types/aiSchema.d.ts +0 -218
  426. package/dist/src/modules/mcp/types/appTypes.d.ts +0 -26
  427. package/dist/src/modules/mcp/types/index.d.ts +0 -5
  428. package/dist/src/modules/mcp/types/previewTypes.d.ts +0 -25
  429. package/dist/src/modules/mcp/types/screenshotTypes.d.ts +0 -29
  430. package/dist/src/modules/mcp/types/toolTypes.d.ts +0 -138
  431. package/dist/src/modules/oauth/authorize.d.ts +0 -7
  432. package/dist/src/modules/oauth/challenge.d.ts +0 -11
  433. package/dist/src/modules/oauth/consentPage.d.ts +0 -7
  434. package/dist/src/modules/oauth/metadata.d.ts +0 -40
  435. package/dist/src/modules/oauth/params.d.ts +0 -5
  436. package/dist/src/modules/oauth/pkce.d.ts +0 -6
  437. package/dist/src/modules/oauth/records.d.ts +0 -71
  438. package/dist/src/modules/oauth/register.d.ts +0 -5
  439. package/dist/src/modules/oauth/respond.d.ts +0 -13
  440. package/dist/src/modules/oauth/token.d.ts +0 -5
  441. package/dist/src/modules/ssr/buildBody.d.ts +0 -9
  442. package/dist/src/modules/ssr/handler.d.ts +0 -4
  443. package/dist/src/modules/ssr/preview.d.ts +0 -16
  444. package/dist/src/modules/ssr/streamBody.d.ts +0 -5
  445. package/dist/src/modules/ssr/template.d.ts +0 -6
  446. package/dist/src/standalone/alias-loader.d.mts +0 -2
  447. package/dist/src/standalone/plugins/ClientInfo.d.ts +0 -2
  448. package/dist/src/standalone/plugins/ServerInfo.d.ts +0 -2
  449. package/dist/src/standalone/plugins/SharedInfo.d.ts +0 -2
  450. package/dist/src/standalone/plugins/styles.d.ts +0 -5
  451. package/dist/src/standalone/register-alias.d.mts +0 -1
  452. package/dist/src/standalone/server.d.ts +0 -1
  453. package/dist/src/standalone/stubs/react-syntax-highlighter.d.mts +0 -31
  454. package/skills/plitzi-render/SKILL.md +0 -174
  455. /package/dist/{src/core/http/dispatcher.test.d.ts → core/auth/api.test.d.ts} +0 -0
  456. /package/dist/{src/core/server/mcpServer.test.d.ts → core/auth/authorize.test.d.ts} +0 -0
  457. /package/dist/{src/modules/ai/toolkit.test.d.ts → core/auth/createAuth.test.d.ts} +0 -0
  458. /package/dist/{src/modules/mcp/apps/apps.test.d.ts → core/auth/domains.test.d.ts} +0 -0
  459. /package/dist/{src/modules/mcp/apps/render/styles.test.d.ts → core/auth/identity.test.d.ts} +0 -0
  460. /package/dist/{src/modules → core/auth}/oauth/oauth.test.d.ts +0 -0
  461. /package/dist/{src/modules/mcp/catalogs/builtinTransformers.test.d.ts → core/auth/routes.test.d.ts} +0 -0
  462. /package/dist/{src/modules/mcp/catalogs/cssCatalog/cssCatalog.test.d.ts → core/auth/session.test.d.ts} +0 -0
  463. /package/dist/{src/modules/mcp/e2e/connector.test.d.ts → core/auth/spaceTokens.test.d.ts} +0 -0
  464. /package/dist/{src/modules/mcp/e2e/host.test.d.ts → core/auth/tokens.test.d.ts} +0 -0
  465. /package/dist/{src/modules/mcp/e2e/oauthConnector.test.d.ts → core/createServer.test.d.ts} +0 -0
  466. /package/dist/{src/modules/mcp/helpers/log.test.d.ts → core/handlers/handlers.test.d.ts} +0 -0
  467. /package/dist/{src/core → core}/health.d.ts +0 -0
  468. /package/dist/{src/modules/mcp/mcp.bench.d.ts → core/http/dispatcher.test.d.ts} +0 -0
  469. /package/dist/{src/core → core}/http/securityHeaders.d.ts +0 -0
  470. /package/dist/{src/core → core}/http/stages/authRoutes.d.ts +0 -0
  471. /package/dist/{src/core → core}/http/stages/pluginAssets.d.ts +0 -0
  472. /package/dist/{src/core → core}/mimeTypes.d.ts +0 -0
  473. /package/dist/{src/modules/mcp/constants.d.ts → core/previewToken.d.ts} +0 -0
  474. /package/dist/{src/core → core}/requestParser.d.ts +0 -0
  475. /package/dist/{src/core → core}/server/baseServer.d.ts +0 -0
  476. /package/dist/{src/modules/mcp/proxy/endpoint.test.d.ts → core/server/baseServer.test.d.ts} +0 -0
  477. /package/dist/{src/modules/mcp/proxy/proxy.test.d.ts → core/services/resolve.test.d.ts} +0 -0
  478. /package/dist/{src/core → core}/services/rsc.d.ts +0 -0
  479. /package/dist/{src/core → core}/services/ssr.d.ts +0 -0
  480. /package/dist/{src/core → core}/staticFiles.d.ts +0 -0
  481. /package/dist/{src/modules/mcp/proxy/wiring.test.d.ts → helpers/buildResponseHelpers.test.d.ts} +0 -0
  482. /package/dist/{src/helpers → helpers}/cache/TtlCache.d.ts +0 -0
  483. /package/dist/{src/helpers → helpers}/cache/cacheManager.d.ts +0 -0
  484. /package/dist/{src/helpers → helpers}/cache/defaults.d.ts +0 -0
  485. /package/dist/{src/helpers → helpers}/cache/index.d.ts +0 -0
  486. /package/dist/{src/modules/mcp/tests/apply.test.d.ts → helpers/cache/keys.test.d.ts} +0 -0
  487. /package/dist/{src/helpers → helpers}/cache/serverCaches.d.ts +0 -0
  488. /package/dist/{src/modules/mcp/tests/bindings.test.d.ts → helpers/compress.test.d.ts} +0 -0
  489. /package/dist/{src/helpers → helpers}/escapeJson.d.ts +0 -0
  490. /package/dist/{src/helpers → helpers}/metrics.d.ts +0 -0
  491. /package/dist/{src/helpers → helpers}/normalizePlugins.d.ts +0 -0
  492. /package/dist/{src/modules/mcp/tests/css.test.d.ts → helpers/offlineDataLoader.test.d.ts} +0 -0
  493. /package/dist/{src/helpers → helpers}/readCookie.d.ts +0 -0
  494. /package/dist/{src/modules/mcp/tests/interactions.test.d.ts → helpers/resolveDebugMode.test.d.ts} +0 -0
  495. /package/dist/{src/helpers → helpers}/runMiddlewares.d.ts +0 -0
  496. /package/dist/{src/helpers → helpers}/serverLog.d.ts +0 -0
  497. /package/dist/{src/middlewares → middlewares}/auth.d.ts +0 -0
  498. /package/dist/{src/middlewares → middlewares}/basicAuth.d.ts +0 -0
  499. /package/dist/{src/modules/mcp/tests/pages.test.d.ts → middlewares/spaceDeployment.test.d.ts} +0 -0
  500. /package/dist/{src/modules/mcp/tests/reads.test.d.ts → modules/actions/handler.test.d.ts} +0 -0
  501. /package/dist/{src/modules/mcp/tests/schemaIds.test.d.ts → modules/connectors/engine.test.d.ts} +0 -0
  502. /package/dist/{src/modules/mcp/tests/search.test.d.ts → modules/connectors/projection.test.d.ts} +0 -0
  503. /package/dist/{src/modules/mcp/tests/skill.test.d.ts → modules/connectors/resolver.test.d.ts} +0 -0
  504. /package/dist/{src/modules/mcp/tests/styles.test.d.ts → modules/rsc/resolveRscData.test.d.ts} +0 -0
  505. /package/dist/{src/modules → modules}/ssr/applySSRResult.d.ts +0 -0
  506. /package/dist/{src/modules/mcp/tests/tools.test.d.ts → modules/ssr/loadPluginComponents.test.d.ts} +0 -0
  507. /package/dist/{src/modules/mcp/tests/validation.test.d.ts → modules/ssr/metering.test.d.ts} +0 -0
  508. /package/dist/{src/modules → modules}/ssr/registerExternalPlugins.d.ts +0 -0
  509. /package/dist/{src/plugins → plugins}/compile.d.ts +0 -0
  510. /package/dist/{src/plugins → plugins}/copy.d.ts +0 -0
  511. /package/dist/{src/plugins → plugins}/detect.d.ts +0 -0
  512. /package/dist/{src/plugins → plugins}/manager.d.ts +0 -0
  513. /package/dist/{src/plugins → plugins}/validate.d.ts +0 -0
  514. /package/dist/{src/plugins → plugins}/validate.test.d.ts +0 -0
@@ -1,314 +0,0 @@
1
- /* eslint-disable react-refresh/only-export-components -- one bundled entry: components cannot move out. */
2
- import { useApp, useHostStyles } from '@modelcontextprotocol/ext-apps/react';
3
- import PlitziSdk from '@plitzi/plitzi-sdk';
4
- import { Component, useEffect, useRef, useState } from 'react';
5
- import { createRoot } from 'react-dom/client';
6
-
7
- import { readHeldBatch, writeHeldBatch } from './heldBatch';
8
- import { mergeProgress, streamProgress } from './streamProgress';
9
-
10
- import type { StreamProgress } from './streamProgress';
11
- import type { App, McpUiHostContext } from '@modelcontextprotocol/ext-apps';
12
- import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
13
- import type { OfflineDataRaw } from '@plitzi/sdk-shared';
14
- import type { ReactNode } from 'react';
15
-
16
- /** The view for plitzi_render: the entry the server bundles (React, the MCP Apps runtime and the Plitzi SDK
17
- * included) and inlines in the shared ui:// page shell — which is what lets it run in a sandbox that can fetch
18
- * nothing. It mounts on `#app`, the shell's root. */
19
-
20
- const panelStyle = { padding: 16, font: '13px/1.5 system-ui, sans-serif', color: '#b91c1c' } as const;
21
-
22
- // Every failure ends up here: an iframe left on its placeholder would hide the reason in the sandbox's console.
23
- const ErrorPanel = ({ title, details }: { title: string; details: string }) => (
24
- <div style={panelStyle}>
25
- <strong>{title}</strong>
26
- <pre style={{ margin: '8px 0 0', whiteSpace: 'pre-wrap', color: '#7f1d1d', fontSize: 12 }}>{details}</pre>
27
- </div>
28
- );
29
-
30
- /** The wait a user reads as "this is slow" is the model TYPING the batch: the tool only runs once the last brace
31
- * is written, and until then the page shows its static "Rendering…". The host streams the arguments as they
32
- * arrive, so this stands in for the widget meanwhile — bars that grow with the elements already authored, and the
33
- * widget's own title as soon as the batch names it. It never shows a half-built widget: the real one replaces it
34
- * wholesale when the result lands. A host that streams nothing paints none of this and keeps the static text. */
35
- const SKELETON_BAR_WIDTHS = ['92%', '78%', '85%', '64%', '88%', '72%'];
36
-
37
- // The deployment's own switch (mcpAi.renderStreaming), handed over by the page. Absent means on: a page built
38
- // before the setting existed carries none, and a host that streams no arguments paints the same either way.
39
- const streamingEnabled =
40
- (globalThis as { __PLITZI_VIEW__?: { streaming?: boolean } }).__PLITZI_VIEW__?.streaming !== false;
41
-
42
- const skeletonBarStyle = {
43
- height: 10,
44
- borderRadius: 5,
45
- backgroundColor: 'var(--color-background-tertiary, light-dark(#e2e8f0, #333a48))',
46
- animation: 'plitzi-skeleton-pulse 1.4s ease-in-out infinite'
47
- } as const;
48
-
49
- // One bar per few elements, so the block visibly grows while the model writes, and a ceiling so a 200-element
50
- // widget does not fill the panel with grey. Total by construction: this paints a wait, and a placeholder that
51
- // renders nothing at all (an empty slice off a NaN) would read as the view having died.
52
- const barCount = (elements: number): number => {
53
- const bars = Math.ceil(elements / 3);
54
-
55
- return Number.isFinite(bars) ? Math.min(Math.max(bars, 2), 6) : 2;
56
- };
57
-
58
- const StreamSkeleton = ({ progress }: { progress: StreamProgress }) => {
59
- const caption = progress.patch ? 'Updating the widget…' : 'Building the widget…';
60
-
61
- return (
62
- <div
63
- role="status"
64
- aria-live="polite"
65
- style={{
66
- display: 'flex',
67
- flexDirection: 'column',
68
- gap: 10,
69
- padding: 16,
70
- font: '13px/1.5 var(--font-sans, system-ui, sans-serif)'
71
- }}
72
- >
73
- <style>{'@keyframes plitzi-skeleton-pulse { 0%, 100% { opacity: 0.5 } 50% { opacity: 1 } }'}</style>
74
- {progress.title && <strong style={{ fontSize: 15 }}>{progress.title}</strong>}
75
- {SKELETON_BAR_WIDTHS.slice(0, barCount(progress.elements)).map(width => (
76
- <div key={width} style={{ ...skeletonBarStyle, width }} />
77
- ))}
78
- <span style={{ color: 'var(--color-text-tertiary, light-dark(#64748b, #9aa4b2))' }}>
79
- {caption}
80
- {progress.elements > 0 && ` ${progress.elements} elements so far`}
81
- </span>
82
- </div>
83
- );
84
- };
85
-
86
- class RenderBoundary extends Component<{ children: ReactNode }, { error?: Error }> {
87
- state: { error?: Error } = {};
88
-
89
- static getDerivedStateFromError(error: Error) {
90
- return { error };
91
- }
92
-
93
- render() {
94
- if (this.state.error) {
95
- return <ErrorPanel title="Widget failed to render" details={this.state.error.message} />;
96
- }
97
-
98
- return this.props.children;
99
- }
100
- }
101
-
102
- /** The batch the widget on screen was built from. It lives on the HOST side — this ref plus localStorage — because
103
- * the server keeps nothing between calls, which is what lets any replica (or an edge deployment) answer any
104
- * request. A patch is merged into it and sent back through `callServerTool`, so the full batch never enters the
105
- * model's context. The ref alone would not do: the host gives each tool call its own view, so a patch usually
106
- * starts from an empty instance and reads the batch back from storage by renderId (see heldBatch.ts). */
107
- type Held = { renderId?: string; operations: unknown[] };
108
-
109
- const summarise = (result: CallToolResult): string => {
110
- const text = result.content.find(entry => entry.type === 'text');
111
-
112
- return text?.text ?? 'no summary';
113
- };
114
-
115
- const RenderApp = () => {
116
- const [result, setResult] = useState<CallToolResult | null>(null);
117
- const [progress, setProgress] = useState<StreamProgress | undefined>(undefined);
118
- const [cancelled, setCancelled] = useState<string | undefined>(undefined);
119
- const [context, setContext] = useState<McpUiHostContext | undefined>(undefined);
120
- const held = useRef<Held>({ operations: [] });
121
- const appRef = useRef<App | null>(null);
122
- // The handlers are registered once, so they close over the FIRST render's state: a ref is the only way they can
123
- // tell whether a widget is already on screen.
124
- const painted = useRef(false);
125
-
126
- const showWidget = (toolResult: CallToolResult): void => {
127
- painted.current = true;
128
- setResult(toolResult);
129
- };
130
-
131
- /** Streamed arguments are the one input here nobody validated: healed JSON, from a host, about a call that does
132
- * not exist yet. So it is fenced off — it feeds the placeholder and NOTHING else (never the held batch, never
133
- * storage, never the server), it cannot run once a widget is up, and it cannot throw: a notification handler
134
- * that raises would break the App's dispatch, and this one exists only to decorate a wait. */
135
- const trackInput = (args: unknown): void => {
136
- if (painted.current) {
137
- return;
138
- }
139
-
140
- try {
141
- const next = streamProgress(args);
142
- setProgress(previous => mergeProgress(previous, next));
143
- } catch {
144
- // A placeholder that stops growing is a non-event; the widget is still on its way.
145
- }
146
- };
147
-
148
- // A patch carries only what changed. Merging it onto the held batch and re-calling the tool is what keeps the
149
- // server stateless: it re-renders the WHOLE widget (so refs, integrity and the audit are all checked as usual)
150
- // from a payload that travelled host↔server, and the model hears the outcome through updateModelContext.
151
- const applyPatch = async (renderId: string, delta: unknown[]): Promise<void> => {
152
- const app = appRef.current;
153
- if (!app) {
154
- return;
155
- }
156
-
157
- const base = held.current.renderId === renderId ? held.current.operations : (readHeldBatch(renderId) ?? []);
158
- if (base.length === 0) {
159
- await app.updateModelContext({
160
- content: [
161
- {
162
- type: 'text',
163
- text: `The widget ${renderId} could not be recovered, so nothing was patched. Call plitzi_render again with the complete batch and without \`patch\`.`
164
- }
165
- ]
166
- });
167
-
168
- return;
169
- }
170
-
171
- const merged = [...base, ...delta];
172
- // The round trip can fail on its own: a host that forwards no tool calls, a connection dropped mid-patch, a
173
- // view torn down while the answer is in flight. Unreported it would surface as an unhandled rejection inside
174
- // the sandbox and the model would wait forever for a widget that is never coming.
175
- try {
176
- const rendered = await app.callServerTool({
177
- name: 'plitzi_render',
178
- arguments: { operations: merged, renderId }
179
- });
180
- const offlineData = rendered.structuredContent?.offlineData;
181
- if (offlineData) {
182
- const applied = (rendered.structuredContent?.operations as unknown[] | undefined) ?? merged;
183
- held.current = { renderId, operations: applied };
184
- writeHeldBatch(renderId, applied);
185
- showWidget(rendered);
186
- }
187
-
188
- await app.updateModelContext({
189
- content: [
190
- {
191
- type: 'text',
192
- text: offlineData
193
- ? `Widget updated: ${summarise(rendered)}`
194
- : `The patch did not apply, the widget is unchanged: ${summarise(rendered)}`
195
- }
196
- ]
197
- });
198
- } catch (reason) {
199
- await app
200
- .updateModelContext({
201
- content: [
202
- {
203
- type: 'text',
204
- text: `The patch could not be delivered (${reason instanceof Error ? reason.message : String(reason)}), so the widget is unchanged. Re-send the full batch without \`patch\` if it needs to change.`
205
- }
206
- ]
207
- })
208
- .catch(() => undefined);
209
- }
210
- };
211
-
212
- // useApp creates the App, runs onAppCreated so every handler is in place BEFORE the handshake, and connects.
213
- const { app, error } = useApp({
214
- appInfo: { name: 'Plitzi Widget', version: '1.0.0' },
215
- capabilities: {},
216
- onAppCreated: instance => {
217
- appRef.current = instance;
218
- // Streaming arguments (sent zero or more times while the model writes) and then the complete ones, which the
219
- // host MUST send before the result: the last frame the placeholder gets covers the server render itself.
220
- // The `on*` setters are the deprecated half of the API, kept because every other handler here uses them —
221
- // mixing addEventListener for one of them would hide the lifecycle this component is built around.
222
- if (streamingEnabled) {
223
- instance.ontoolinputpartial = params => trackInput(params.arguments);
224
- instance.ontoolinput = params => trackInput(params.arguments);
225
- }
226
-
227
- instance.ontoolresult = toolResult => {
228
- const renderId = toolResult.structuredContent?.renderId as string | undefined;
229
- if (toolResult.structuredContent?.patch === true && renderId) {
230
- void applyPatch(renderId, (toolResult.structuredContent.operations as unknown[] | undefined) ?? []);
231
-
232
- return;
233
- }
234
-
235
- // A result carrying no widget is a failed render or a refused patch. The model already reads its reasons
236
- // as text, so it must not blank a widget that is on screen — nor drop the batch that widget was built
237
- // from, which is the only copy of it anywhere. With nothing on screen yet, the error IS the view.
238
- if (!toolResult.structuredContent?.offlineData && held.current.operations.length > 0) {
239
- return;
240
- }
241
-
242
- const operations = (toolResult.structuredContent?.operations as unknown[] | undefined) ?? [];
243
- held.current = { renderId, operations };
244
- if (renderId && operations.length > 0) {
245
- writeHeldBatch(renderId, operations);
246
- }
247
-
248
- showWidget(toolResult);
249
- };
250
- instance.ontoolcancelled = params => setCancelled(params.reason ?? 'The host cancelled the render.');
251
- instance.onhostcontextchanged = params => setContext(previous => ({ ...previous, ...params }));
252
- instance.onteardown = () => ({});
253
- }
254
- });
255
-
256
- // The context the host sent in its initialize result predates any change notification.
257
- useEffect(() => {
258
- if (app) {
259
- setContext(app.getHostContext());
260
- }
261
- }, [app]);
262
-
263
- useHostStyles(app, context);
264
-
265
- const failure = error?.message ?? cancelled;
266
- if (failure) {
267
- return <ErrorPanel title="Could not render the widget" details={failure} />;
268
- }
269
-
270
- // Waiting for the result. Once the host has streamed any of the arguments the skeleton stands in for the widget
271
- // being written; before that (and on a host that streams nothing) the page's own CSS placeholder covers it.
272
- if (!result) {
273
- if (progress) {
274
- return <StreamSkeleton progress={progress} />;
275
- }
276
-
277
- return null;
278
- }
279
-
280
- // The payload rides in structuredContent, which the protocol types as unknown-valued; plitzi_render is the one
281
- // guaranteeing the shape, and the SDK validates it again when it renders.
282
- const offlineData = result.structuredContent?.offlineData as OfflineDataRaw | undefined;
283
- if (!offlineData) {
284
- // A failed render answers with its (already compact) reasons as the tool's JSON text summary.
285
- const text = result.content.find(entry => entry.type === 'text');
286
-
287
- return <ErrorPanel title="Render failed" details={text?.text ?? 'The tool returned no widget data.'} />;
288
- }
289
-
290
- const insets = context?.safeAreaInsets;
291
- // The icon fonts, ~330 KB of base64 woff2, are not in the page: they arrive with the widgets that draw an icon,
292
- // so every other widget's iframe has that much less to load before it paints (see ../styles.ts).
293
- const iconCss = result.structuredContent?.iconCss as string | undefined;
294
-
295
- return (
296
- <div
297
- style={{
298
- padding: `${insets?.top ?? 0}px ${insets?.right ?? 0}px ${insets?.bottom ?? 0}px ${insets?.left ?? 0}px`
299
- }}
300
- >
301
- {iconCss && <style>{iconCss}</style>}
302
- <RenderBoundary>
303
- <PlitziSdk offlineData={offlineData} offlineMode environment="main" renderMode="raw" branding={false} />
304
- </RenderBoundary>
305
- </div>
306
- );
307
- };
308
-
309
- const root = document.getElementById('app');
310
- if (root) {
311
- // The SDK styles its tree from this container class down.
312
- root.className = 'plitzi-root-container';
313
- createRoot(root).render(<RenderApp />);
314
- }
@@ -1,137 +0,0 @@
1
- /** What the host has streamed of the tool call so far, reduced to the little a placeholder can honestly show.
2
- *
3
- * The wait a user sees is almost entirely the model TYPING this batch — the server render takes milliseconds —
4
- * so the only way to look alive is to read the arguments while they are still arriving. The host sends them as
5
- * "healed" JSON (it closes the braces the model has not written yet), which means every field may be missing and
6
- * the last operation is usually half-written: nothing here may assume a shape, and a fragment it cannot read
7
- * simply contributes nothing.
8
- *
9
- * Two properties this module owes the view, because a placeholder that misbehaves is worse than none:
10
- * - it is TOTAL — no input throws, and every number it returns is a finite count;
11
- * - it only ever moves FORWARD (see mergeProgress) — healing is best-effort and the spec warns that fields may
12
- * change between notifications, so a frame that recovers less than the one before it must not shrink the
13
- * placeholder, which the eye reads as flicker. */
14
- export type StreamProgress = { elements: number; title?: string; patch: boolean };
15
-
16
- const isRecord = (value: unknown): value is Record<string, unknown> =>
17
- typeof value === 'object' && value !== null && !Array.isArray(value);
18
-
19
- const asArray = (value: unknown): unknown[] => (Array.isArray(value) ? value : []);
20
-
21
- // The walk is over a structure this code did not build, so it is bounded rather than trusted: a pathological
22
- // nesting would otherwise turn a placeholder into a stack overflow, which kills the view for good — including
23
- // the widget that was on its way. Far beyond anything a real widget nests.
24
- const MAX_DEPTH = 64;
25
-
26
- // A title is a label in a small panel: whitespace collapsed so a multi-line heading cannot push the bars off
27
- // screen, and cut where it stops being a label.
28
- const MAX_TITLE = 80;
29
-
30
- // A repeat renders its template once per row, so the rows are what the user will actually count on screen. An
31
- // items list that has not started streaming yet still stands for at least the one template being written.
32
- const rowsOf = (items: unknown): number => Math.max(asArray(items).length, 1);
33
-
34
- const countElements = (node: unknown, depth = 0): number => {
35
- if (!isRecord(node) || depth > MAX_DEPTH) {
36
- return 0;
37
- }
38
-
39
- const repeat = isRecord(node.repeat) ? node.repeat : undefined;
40
- const nested = repeat ? countElements(repeat.template, depth + 1) * rowsOf(repeat.items) : 0;
41
-
42
- return asArray(node.children).reduce<number>((total, child) => total + countElements(child, depth + 1), 1 + nested);
43
- };
44
-
45
- // A heading's content arrives one fragment at a time, so this runs against half-written text: `{{` rules out a
46
- // repeat template's placeholder (a literal "{{item.name}}" on screen reads as a bug, not as progress), and an
47
- // empty string is what a heading looks like before its content exists at all.
48
- const titleOf = (content: unknown): string | undefined => {
49
- if (typeof content !== 'string' || content.includes('{{')) {
50
- return undefined;
51
- }
52
-
53
- const text = content.replace(/\s+/gu, ' ').trim();
54
- if (text === '') {
55
- return undefined;
56
- }
57
-
58
- return text.length > MAX_TITLE ? `${text.slice(0, MAX_TITLE)}…` : text;
59
- };
60
-
61
- // The first heading the batch declares is the widget's own title far more often than not, so showing it turns the
62
- // placeholder from "something is happening" into "your pricing table is coming".
63
- const findTitle = (node: unknown, depth = 0): string | undefined => {
64
- if (!isRecord(node) || depth > MAX_DEPTH) {
65
- return undefined;
66
- }
67
-
68
- const props = isRecord(node.props) ? node.props : undefined;
69
- if (node.type === 'heading') {
70
- const title = titleOf(props?.content);
71
- if (title !== undefined) {
72
- return title;
73
- }
74
- }
75
-
76
- for (const child of asArray(node.children)) {
77
- const found = findTitle(child, depth + 1);
78
- if (found !== undefined) {
79
- return found;
80
- }
81
- }
82
-
83
- return undefined;
84
- };
85
-
86
- // An op either builds a tree (upsertElement) or repeats one (repeatElement); anything else — a definition, a
87
- // binding, the truncated tail — adds no elements to count.
88
- const treeOf = (op: Record<string, unknown>): unknown => {
89
- if (isRecord(op.element)) {
90
- return op.element;
91
- }
92
-
93
- return isRecord(op.template) ? op.template : undefined;
94
- };
95
-
96
- export const streamProgress = (args: unknown): StreamProgress => {
97
- const record = isRecord(args) ? args : {};
98
- let elements = 0;
99
- let title: string | undefined;
100
-
101
- for (const op of asArray(record.operations)) {
102
- if (!isRecord(op)) {
103
- continue;
104
- }
105
-
106
- const tree = treeOf(op);
107
- if (tree === undefined) {
108
- continue;
109
- }
110
-
111
- elements += countElements(tree) * (isRecord(op.template) ? rowsOf(op.items) : 1);
112
- title ??= findTitle(tree);
113
- }
114
-
115
- return { elements: Number.isFinite(elements) ? elements : 0, title, patch: record.patch === true };
116
- };
117
-
118
- /** Fold a freshly read frame into what the placeholder already shows. Monotonic on purpose — the count never goes
119
- * down and a title, once read, is never taken away — because the healed JSON of frame N+1 can legitimately
120
- * recover LESS than frame N, and a placeholder that shrinks and grows is the flicker this whole thing exists to
121
- * avoid. Returns the previous object unchanged when nothing moved, so an unchanged frame costs no re-render. */
122
- export const mergeProgress = (previous: StreamProgress | undefined, next: StreamProgress): StreamProgress => {
123
- if (!previous) {
124
- return next;
125
- }
126
-
127
- const merged: StreamProgress = {
128
- elements: Math.max(previous.elements, next.elements),
129
- title: next.title ?? previous.title,
130
- patch: previous.patch || next.patch
131
- };
132
- if (merged.elements === previous.elements && merged.title === previous.title && merged.patch === previous.patch) {
133
- return previous;
134
- }
135
-
136
- return merged;
137
- };
@@ -1,10 +0,0 @@
1
- import "node:path";
2
- //#region src/modules/mcp/apps/shared/assets.ts
3
- /** The one folder of an app that ships to dist as SOURCE: its browser entry (`view/index.tsx`) and every module
4
- * that entry bundles. The server builds it with esbuild at request time, so none of it is in the module graph the
5
- * library build compiles — a view-side module that does not travel verbatim is simply missing at runtime, which
6
- * the package only finds out when a host asks for the page. Everything else in an app (its definition) compiles
7
- * like any other module. */
8
- var VIEW_DIR = "view";
9
- //#endregion
10
- export { VIEW_DIR };
@@ -1,23 +0,0 @@
1
- import { require } from "./resolve.js";
2
- import { zodEnglishOnly } from "./zodEnglishOnly.js";
3
- import { build } from "esbuild";
4
- //#region src/modules/mcp/apps/shared/bundle.ts
5
- var options = (entry) => ({
6
- entryPoints: [entry],
7
- bundle: true,
8
- write: false,
9
- format: "iife",
10
- platform: "browser",
11
- target: "es2022",
12
- jsx: "automatic",
13
- minify: true,
14
- alias: { "@plitzi/plitzi-sdk": require.resolve("@plitzi/plitzi-sdk") },
15
- define: { "process.env.NODE_ENV": "\"production\"" },
16
- plugins: [zodEnglishOnly],
17
- logLevel: "silent"
18
- });
19
- var bundle = async (entry) => {
20
- return (await build(options(entry))).outputFiles[0].text;
21
- };
22
- //#endregion
23
- export { bundle };
@@ -1,34 +0,0 @@
1
- import { bundle } from "./bundle.js";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
4
- import { readFileSync } from "node:fs";
5
- import ejs from "ejs";
6
- //#region src/modules/mcp/apps/shared/page.ts
7
- var SHELL = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "shell.ejs");
8
- var template = () => ejs.compile(readFileSync(SHELL, "utf-8"), { filename: SHELL });
9
- var scripts = /* @__PURE__ */ new Map();
10
- var pages = /* @__PURE__ */ new Map();
11
- var script = (entry) => {
12
- let built = scripts.get(entry);
13
- if (!built) {
14
- built = bundle(entry);
15
- scripts.set(entry, built);
16
- }
17
- return built;
18
- };
19
- var page = (app, settings) => {
20
- const key = `${app.uri}|${JSON.stringify(settings)}`;
21
- let html = pages.get(key);
22
- if (!html) {
23
- html = script(app.entry).then((code) => template()({
24
- title: app.title,
25
- app: code,
26
- css: (app.styles?.() ?? []).join("\n"),
27
- settings: JSON.stringify(settings)
28
- }));
29
- pages.set(key, html);
30
- }
31
- return html;
32
- };
33
- //#endregion
34
- export { page };
@@ -1,43 +0,0 @@
1
- import { page } from "./page.js";
2
- import { RESOURCE_MIME_TYPE, registerAppResource } from "@modelcontextprotocol/ext-apps/server";
3
- //#region src/modules/mcp/apps/shared/registerApp.ts
4
- var WILDCARDS = [
5
- "*",
6
- "https:",
7
- "https://*"
8
- ];
9
- var defaultCsp = (proxyOrigin) => proxyOrigin ? {
10
- resourceDomains: [proxyOrigin],
11
- connectDomains: [proxyOrigin]
12
- } : {
13
- resourceDomains: [
14
- ...WILDCARDS,
15
- "data:",
16
- "blob:"
17
- ],
18
- connectDomains: [...WILDCARDS]
19
- };
20
- var originOf = (endpoint) => {
21
- if (!endpoint) return;
22
- try {
23
- return new URL(endpoint).origin;
24
- } catch {
25
- return;
26
- }
27
- };
28
- /** Serves the app as a self-contained page: no import map, no asset mounts, no cross-origin fetches, so the
29
- * strictest host sandbox runs it and no deployment has to serve anything extra. */
30
- var registerApp = (server, app, settings) => {
31
- const meta = { ui: { csp: app.csp ?? defaultCsp(originOf(settings.proxyEndpoint)) } };
32
- registerAppResource(server, app.name, app.uri, {
33
- description: app.description,
34
- _meta: meta
35
- }, async () => ({ contents: [{
36
- uri: app.uri,
37
- mimeType: RESOURCE_MIME_TYPE,
38
- text: await page(app, settings),
39
- _meta: meta
40
- }] }));
41
- };
42
- //#endregion
43
- export { registerApp };
@@ -1,5 +0,0 @@
1
- import { createRequire } from "node:module";
2
- //#region src/modules/mcp/apps/shared/resolve.ts
3
- var require = createRequire(import.meta.url);
4
- //#endregion
5
- export { require };
@@ -1,59 +0,0 @@
1
- <%#
2
- The page shell every MCP App shares. The host renders it in a sandboxed iframe on ITS OWN origin: the app and
3
- its styles are inlined, so the page fetches NOTHING and runs under a deny-by-default sandbox CSP.
4
- -%>
5
- <!doctype html>
6
- <html lang="en">
7
- <head>
8
- <meta charset="utf-8" />
9
- <meta name="viewport" content="width=device-width, initial-scale=1" />
10
- <title><%= title %></title>
11
-
12
- <style>
13
- /*
14
- The page inherits the HOST's theme, which may be dark: nothing here paints a surface, so an app that sets no
15
- colours would otherwise draw the browser's black default text over the host's own background — unreadable in
16
- a dark chat. `light-dark()` picks the right side of every pair; `color-scheme` is what tells it which side,
17
- and it follows the OS until useHostStyles replaces it with the theme the host actually reported (that hook
18
- also fills the --color-* variables in, so the var() fallbacks below only apply on a host that sends none).
19
- */
20
- html {
21
- color-scheme: light dark;
22
- }
23
-
24
- html,
25
- body {
26
- margin: 0;
27
- }
28
-
29
- body {
30
- background-color: transparent;
31
- color: var(--color-text-primary, light-dark(#0f172a, #e8eaed));
32
- font-family: var(--font-sans, system-ui, sans-serif);
33
- }
34
- /* The app renders nothing until the host pushes the tool result in. */
35
- #app:empty::after {
36
- content: 'Rendering…';
37
- display: block;
38
- padding: 16px;
39
- font-size: 14px;
40
- color: var(--color-text-tertiary, light-dark(#64748b, #9aa4b2));
41
- }
42
- </style>
43
- <style>
44
- <%- css %>
45
- </style>
46
- </head>
47
- <body>
48
- <div id="app"></div>
49
-
50
- <%# Deployment switches, before the app so the view reads them as it mounts. They ride in the page, not the
51
- bundle, so a server serving both settings still builds the browser bundle once. -%>
52
- <script id="plitzi-view-settings">
53
- window.__PLITZI_VIEW__ = <%- settings %>;
54
- </script>
55
- <script>
56
- <%- app %>
57
- </script>
58
- </body>
59
- </html>
@@ -1,23 +0,0 @@
1
- //#region src/modules/mcp/apps/shared/zodEnglishOnly.ts
2
- var NAMESPACE = "zod-locales-stub";
3
- var ZOD_PACKAGE = /node_modules[/\\]zod[/\\]/u;
4
- /** Drops zod's ~40 translations (194 KB): they are re-exported as a namespace, which no bundler can tree-shake.
5
- * English survives because zod imports `locales/en.js` directly, not through this index. */
6
- var zodEnglishOnly = {
7
- name: "zod-english-only",
8
- setup(builder) {
9
- builder.onResolve({ filter: /locales[/\\]index\.js$/ }, (args) => ZOD_PACKAGE.test(args.importer) ? {
10
- path: args.path,
11
- namespace: NAMESPACE
12
- } : void 0);
13
- builder.onLoad({
14
- filter: /.*/,
15
- namespace: NAMESPACE
16
- }, () => ({
17
- contents: "export {};",
18
- loader: "js"
19
- }));
20
- }
21
- };
22
- //#endregion
23
- export { zodEnglishOnly };