@plitzi/sdk-server 0.32.16 → 0.32.18

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 (62) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/helpers/serverLog.js +3 -3
  3. package/dist/modules/mcp/apps/render/view.tsx +107 -3
  4. package/dist/modules/mcp/apps/shared/shell.ejs +19 -2
  5. package/dist/modules/mcp/helpers/guide.js +9 -2
  6. package/dist/modules/mcp/helpers/space.js +1 -1
  7. package/dist/modules/mcp/resources/renderGuide.js +205 -18
  8. package/dist/modules/mcp/server.js +1 -1
  9. package/dist/modules/mcp/tools/apply/dispatch.js +2 -0
  10. package/dist/modules/mcp/tools/apply/index.js +17 -3
  11. package/dist/modules/mcp/tools/operations/index.js +4 -0
  12. package/dist/modules/mcp/tools/operations/schema/elements/patchElement.js +1 -1
  13. package/dist/modules/mcp/tools/operations/schema/elements/repeatElement.js +148 -0
  14. package/dist/modules/mcp/tools/operations/schema/interactions/deleteInteraction.js +1 -1
  15. package/dist/modules/mcp/tools/operations/schema/interactions/patchInteractionNode.js +1 -1
  16. package/dist/modules/mcp/tools/operations/schema/interactions/upsertInteractionFlow.js +1 -1
  17. package/dist/modules/mcp/tools/operations/schema/operations.js +2 -0
  18. package/dist/modules/mcp/tools/operations/schema/pages/upsertPage.js +1 -1
  19. package/dist/modules/mcp/tools/operations/schema/shared.js +8 -5
  20. package/dist/modules/mcp/tools/operations/schemaIds.js +54 -0
  21. package/dist/modules/mcp/tools/operations/style/definitions/patchDefinition.js +1 -1
  22. package/dist/modules/mcp/tools/operations/style/definitions/upsertDefinition.js +1 -1
  23. package/dist/modules/mcp/tools/operations/style/definitions/upsertDefinitions.js +40 -0
  24. package/dist/modules/mcp/tools/operations/style/globalStyles/patchGlobalStyle.js +1 -1
  25. package/dist/modules/mcp/tools/operations/style/globalStyles/upsertGlobalStyle.js +1 -1
  26. package/dist/modules/mcp/tools/operations/style/idStyles/patchIdStyle.js +1 -1
  27. package/dist/modules/mcp/tools/operations/style/idStyles/upsertIdStyle.js +1 -1
  28. package/dist/modules/mcp/tools/operations/style/operations.js +2 -0
  29. package/dist/modules/mcp/tools/operations/style/shared.js +1 -1
  30. package/dist/modules/mcp/tools/render.js +70 -8
  31. package/dist/modules/mcp/tools/shared/expandOperations.js +44 -0
  32. package/dist/modules/mcp/tools/shared/validator/audit.js +3 -0
  33. package/dist/modules/mcp/tools/shared/validator/batch.js +13 -4
  34. package/dist/modules/mcp/tools/shared/validator/index.js +15 -0
  35. package/dist/modules/mcp/tools/validate.js +11 -3
  36. package/dist/modules/oauth/metadata.js +11 -4
  37. package/dist/src/helpers/serverLog.d.ts +1 -1
  38. package/dist/src/modules/mcp/apps/render/heldBatch.d.ts +10 -0
  39. package/dist/src/modules/mcp/apps/render/heldBatch.test.d.ts +1 -0
  40. package/dist/src/modules/mcp/e2e/index.d.ts +2 -2
  41. package/dist/src/modules/mcp/e2e/renderingHost.d.ts +16 -1
  42. package/dist/src/modules/mcp/helpers/guide.d.ts +1 -1
  43. package/dist/src/modules/mcp/helpers/space.d.ts +1 -1
  44. package/dist/src/modules/mcp/tests/schemaIds.test.d.ts +1 -0
  45. package/dist/src/modules/mcp/tools/apply/index.d.ts +50 -0
  46. package/dist/src/modules/mcp/tools/operations/index.d.ts +100 -0
  47. package/dist/src/modules/mcp/tools/operations/schema/elements/repeatElement.d.ts +55 -0
  48. package/dist/src/modules/mcp/tools/operations/schema/index.d.ts +1 -0
  49. package/dist/src/modules/mcp/tools/operations/schema/operations.d.ts +19 -0
  50. package/dist/src/modules/mcp/tools/operations/schema/shared.d.ts +15 -0
  51. package/dist/src/modules/mcp/tools/operations/schemaIds.d.ts +6 -0
  52. package/dist/src/modules/mcp/tools/operations/style/definitions/upsertDefinitions.d.ts +41 -0
  53. package/dist/src/modules/mcp/tools/operations/style/index.d.ts +1 -0
  54. package/dist/src/modules/mcp/tools/operations/style/operations.d.ts +33 -0
  55. package/dist/src/modules/mcp/tools/operations/style/shared.d.ts +4 -3
  56. package/dist/src/modules/mcp/tools/preview.d.ts +50 -0
  57. package/dist/src/modules/mcp/tools/render.d.ts +421 -363
  58. package/dist/src/modules/mcp/tools/screenshot.d.ts +50 -0
  59. package/dist/src/modules/mcp/tools/shared/expandOperations.d.ts +13 -0
  60. package/dist/src/modules/mcp/tools/validate.d.ts +50 -0
  61. package/dist/src/modules/oauth/metadata.d.ts +11 -4
  62. package/package.json +5 -5
@@ -11,6 +11,24 @@ export declare const screenshotShape: {
11
11
  before: "before";
12
12
  after: "after";
13
13
  }>>;
14
+ }, z.core.$strip>, z.ZodObject<{
15
+ type: z.ZodLiteral<"repeatElement">;
16
+ pageRef: z.ZodString;
17
+ ref: z.ZodString;
18
+ elementType: z.ZodOptional<z.ZodString>;
19
+ label: z.ZodOptional<z.ZodString>;
20
+ style: z.ZodOptional<z.ZodObject<{
21
+ base: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
23
+ }, z.core.$strip>>;
24
+ parentRef: z.ZodOptional<z.ZodString>;
25
+ position: z.ZodOptional<z.ZodEnum<{
26
+ inside: "inside";
27
+ before: "before";
28
+ after: "after";
29
+ }>>;
30
+ template: z.ZodType<import('./operations/schema').TemplateElement, unknown, z.core.$ZodTypeInternals<import('./operations/schema').TemplateElement, unknown>>;
31
+ items: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
14
32
  }, z.core.$strip>, z.ZodObject<{
15
33
  type: z.ZodLiteral<"patchElement">;
16
34
  pageRef: z.ZodString;
@@ -223,6 +241,38 @@ export declare const screenshotShape: {
223
241
  }, z.core.$strip>>>;
224
242
  type: z.ZodLiteral<"upsertDefinition">;
225
243
  ref: z.ZodString;
244
+ }, z.core.$strip>, z.ZodObject<{
245
+ type: z.ZodLiteral<"upsertDefinitions">;
246
+ definitions: z.ZodRecord<z.ZodString, z.ZodObject<{
247
+ desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
248
+ tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
249
+ mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
250
+ states: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
251
+ desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
252
+ tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
253
+ mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
254
+ }, z.core.$strip>>>;
255
+ variants: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
256
+ desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
257
+ tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
258
+ mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
259
+ }, z.core.$strip>>>;
260
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
261
+ desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
262
+ tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
263
+ mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
264
+ states: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
265
+ desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
266
+ tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
267
+ mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
268
+ }, z.core.$strip>>>;
269
+ variants: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
270
+ desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
271
+ tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
272
+ mobile: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
273
+ }, z.core.$strip>>>;
274
+ }, z.core.$strip>>>;
275
+ }, z.core.$strip>>;
226
276
  }, z.core.$strip>, z.ZodObject<{
227
277
  desktop: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodNull]>>>;
228
278
  tablet: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodNull]>>>;
@@ -0,0 +1,13 @@
1
+ import { ValidationError } from '../../types';
2
+ import { Operation } from '../operations';
3
+ /** Rewrites the sugar ops into the vocabulary the rest of the pipeline knows, BEFORE validation — today that is
4
+ * `repeatElement`, which stands for the `upsertElement` its template + rows expand to. Everything downstream
5
+ * (validator, dispatch, audit, versions) therefore stays unaware of it, and a row that renders a bad element is
6
+ * reported by the ordinary element checks.
7
+ *
8
+ * One op in, one op out: the indices the agent sent are the indices every error path names, so `operations[3]`
9
+ * still means the fourth operation it wrote. */
10
+ export declare const expandOperations: (ops: Operation[]) => {
11
+ operations: Operation[];
12
+ errors: ValidationError[];
13
+ };
@@ -12,6 +12,24 @@ export declare const validateShape: {
12
12
  before: "before";
13
13
  after: "after";
14
14
  }>>;
15
+ }, import('zod/v4/core').$strip>, import('zod').ZodObject<{
16
+ type: import('zod').ZodLiteral<"repeatElement">;
17
+ pageRef: import('zod').ZodString;
18
+ ref: import('zod').ZodString;
19
+ elementType: import('zod').ZodOptional<import('zod').ZodString>;
20
+ label: import('zod').ZodOptional<import('zod').ZodString>;
21
+ style: import('zod').ZodOptional<import('zod').ZodObject<{
22
+ base: import('zod').ZodOptional<import('zod').ZodArray<import('zod').ZodString>>;
23
+ slots: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodArray<import('zod').ZodString>>>;
24
+ }, import('zod/v4/core').$strip>>;
25
+ parentRef: import('zod').ZodOptional<import('zod').ZodString>;
26
+ position: import('zod').ZodOptional<import('zod').ZodEnum<{
27
+ inside: "inside";
28
+ before: "before";
29
+ after: "after";
30
+ }>>;
31
+ template: import('zod').ZodType<import('./operations/schema').TemplateElement, unknown, import('zod/v4/core').$ZodTypeInternals<import('./operations/schema').TemplateElement, unknown>>;
32
+ items: import('zod').ZodArray<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnknown>>;
15
33
  }, import('zod/v4/core').$strip>, import('zod').ZodObject<{
16
34
  type: import('zod').ZodLiteral<"patchElement">;
17
35
  pageRef: import('zod').ZodString;
@@ -224,6 +242,38 @@ export declare const validateShape: {
224
242
  }, import('zod/v4/core').$strip>>>;
225
243
  type: import('zod').ZodLiteral<"upsertDefinition">;
226
244
  ref: import('zod').ZodString;
245
+ }, import('zod/v4/core').$strip>, import('zod').ZodObject<{
246
+ type: import('zod').ZodLiteral<"upsertDefinitions">;
247
+ definitions: import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodObject<{
248
+ desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
249
+ tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
250
+ mobile: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
251
+ states: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodObject<{
252
+ desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
253
+ tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
254
+ mobile: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
255
+ }, import('zod/v4/core').$strip>>>;
256
+ variants: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodObject<{
257
+ desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
258
+ tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
259
+ mobile: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
260
+ }, import('zod/v4/core').$strip>>>;
261
+ slots: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodObject<{
262
+ desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
263
+ tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
264
+ mobile: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
265
+ states: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodObject<{
266
+ desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
267
+ tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
268
+ mobile: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
269
+ }, import('zod/v4/core').$strip>>>;
270
+ variants: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodObject<{
271
+ desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
272
+ tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
273
+ mobile: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber]>>>;
274
+ }, import('zod/v4/core').$strip>>>;
275
+ }, import('zod/v4/core').$strip>>>;
276
+ }, import('zod/v4/core').$strip>>;
227
277
  }, import('zod/v4/core').$strip>, import('zod').ZodObject<{
228
278
  desktop: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodNull]>>>;
229
279
  tablet: import('zod').ZodOptional<import('zod').ZodRecord<import('zod').ZodString, import('zod').ZodUnion<readonly [import('zod').ZodString, import('zod').ZodNumber, import('zod').ZodNull]>>>;
@@ -22,10 +22,17 @@ export declare const resourceMetadataUrl: (config: OAuthConfig, req: SSRRequest)
22
22
  * describes `https://host/mcp` while the bare path describes the origin.
23
23
  *
24
24
  * A server mounted at the ORIGIN is `https://host/`, WITH the trailing slash: a host parses the URL the user
25
- * typed before it does anything with it, and an empty path renders as `/` — that normalized form is what the
26
- * client sends back as the `resource` parameter (asserted in the connector e2e). A document claiming to be
27
- * `https://host` then disagrees with the request made against it, and Claude's connector drops the grant it
28
- * just completed it takes the token and never opens the session. */
25
+ * typed before it does anything with it, and an empty path renders as `/` — Claude's connector was observed
26
+ * asking for exactly `resource=https%3A%2F%2Fhost%2F`, so that is the form the document must claim.
27
+ *
28
+ * It does NOT make a bare-origin connector work, and nothing here can. Claude's remote-connector service will
29
+ * not open a session against an MCP endpoint whose URL has no path: the whole grant succeeds — discovery,
30
+ * registration, consent, a 200 from /token with the scope it asked for — and then it reports
31
+ * `McpAuthorizationError` ("the integration rejected the credentials it just issued") without ever presenting
32
+ * the bearer. Verified against the same deployment, minutes apart: at /mcp the token is followed by
33
+ * `initialize`, at / nothing follows it, in the ingress log as well as this server's. Claiming `https://host/mcp`
34
+ * from the bare document would only fail sooner — a client checks that the resource it is handed is no MORE
35
+ * specific than the URL it holds. Publish the connector URL WITH its path. */
29
36
  export declare const protectedResourceMetadata: (config: OAuthConfig, req: SSRRequest) => Record<string, unknown>;
30
37
  /** RFC 8414. Public clients with PKCE only: a desktop host stores no secret, so `none` is the sole endpoint auth
31
38
  * method and S256 the sole challenge method. `offline_access` is advertised whenever refresh grants are issued,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plitzi/sdk-server",
3
- "version": "0.32.16",
3
+ "version": "0.32.18",
4
4
  "license": "AGPL-3.0",
5
5
  "files": [
6
6
  "dist"
@@ -29,9 +29,9 @@
29
29
  "dependencies": {
30
30
  "@modelcontextprotocol/ext-apps": "^1.7.5",
31
31
  "@modelcontextprotocol/sdk": "^1.30.0",
32
- "@plitzi/plitzi-sdk": "0.32.16",
33
- "@plitzi/sdk-schema": "0.32.16",
34
- "@plitzi/sdk-shared": "0.32.16",
32
+ "@plitzi/plitzi-sdk": "0.32.18",
33
+ "@plitzi/sdk-schema": "0.32.18",
34
+ "@plitzi/sdk-shared": "0.32.18",
35
35
  "ejs": "^6.0.1",
36
36
  "esbuild": "^0.28.1",
37
37
  "zod": "^4.4.3"
@@ -44,7 +44,7 @@
44
44
  "@types/ejs": "^3.1.5",
45
45
  "@types/jsdom": "^28.0.3",
46
46
  "@types/node": "^26.1.2",
47
- "@types/react": "^19.2.17",
47
+ "@types/react": "^19.2.18",
48
48
  "@vitejs/plugin-react": "^6.0.5",
49
49
  "@vitest/coverage-v8": "^4.1.10",
50
50
  "eslint": "^9.39.5",