@clipform/mcp-server 2.1.0 → 2.1.2

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.
@@ -164,10 +164,12 @@ var FEATURES = {
164
164
  node_draw: {
165
165
  name: "Drawing",
166
166
  description: "Drawing canvas; respondents draw and it is saved as a PNG image",
167
- // Live (#1012): builder picker shows it, the API accepts it, the viewer renders
168
- // the canvas, and dashboard results render the saved PNG (#1012 results pass).
169
- enabled: true,
170
- status: "live",
167
+ // Went GA 2026-06-27 (#1012), pulled back behind the allowlist 2026-07-20
168
+ // (#2289) while pen options / match-to-shape mature. Prod usage at
169
+ // pull-back verified = Clipform Public only, zero external customers.
170
+ // Existing nodes still render (creation-gated only, camera precedent).
171
+ enabled: false,
172
+ status: "beta",
171
173
  wentLiveAt: "2026-06-27",
172
174
  category: "node-types"
173
175
  },
@@ -295,6 +297,21 @@ var FEATURES = {
295
297
  share_node: {
296
298
  name: "Share individual nodes",
297
299
  description: "Share a direct link to a specific node within a form",
300
+ enabled: true,
301
+ status: "live",
302
+ wentLiveAt: "2026-07-17",
303
+ category: "sharing"
304
+ },
305
+ public_results: {
306
+ name: "Public results portal",
307
+ description: "Share a live, read-only results page with anyone via a link",
308
+ // Ships dark (#2129): code lands ready, gated server-side (apps/api) on
309
+ // this flag OR the FEATURE_COMPANY_ALLOWLIST.public_results company
310
+ // allowlist below (companyHasPublicResults) for per-company dogfood ahead
311
+ // of the global flip - same flag-or-allowlist pattern as node_camera /
312
+ // companyHasNodeType. Flip enabled/status together for GA - the API
313
+ // re-checks this flag on every enable/rotate/read, so flipping it on/off
314
+ // (or editing the allowlist) takes effect immediately, no redeploy needed.
298
315
  enabled: false,
299
316
  status: "planned",
300
317
  category: "sharing"
@@ -514,6 +531,13 @@ for (const [key, f] of Object.entries(FEATURES)) {
514
531
  // ../config/node-types.js
515
532
  var RESPONSE_FORMATS = ["text", "audio", "video"];
516
533
  var CONSENT_TYPES = ["consent", "opt_in"];
534
+ var DRAW_GAME_DEFAULT_TIERS = [
535
+ { min_score: 0, label: "Scribble" },
536
+ { min_score: 35, label: "Warming up" },
537
+ { min_score: 55, label: "Nice try" },
538
+ { min_score: 75, label: "Great match" },
539
+ { min_score: 92, label: "Perfect" }
540
+ ];
517
541
  var NODE_TYPES = {
518
542
  start: {
519
543
  label: "Start",
@@ -1122,7 +1146,7 @@ var NODE_TYPES = {
1122
1146
  maxItems: 8,
1123
1147
  label: "Pen colours",
1124
1148
  default: ["#1F2937", "#EF4444", "#3B82F6", "#22C55E", "#FACC15"],
1125
- description: "Colour swatches the respondent can draw with"
1149
+ description: "Colour swatches the respondent can draw with. The first entry is the default selection; a single entry locks the pen to that colour and hides the picker."
1126
1150
  },
1127
1151
  stroke_widths: {
1128
1152
  type: "array",
@@ -1131,7 +1155,7 @@ var NODE_TYPES = {
1131
1155
  maxItems: 5,
1132
1156
  label: "Pen thicknesses",
1133
1157
  default: [3, 6, 12],
1134
- description: "Stroke widths (px) the respondent can choose"
1158
+ description: "Stroke widths (px) the respondent can choose. The first entry is the default selection; a single entry locks the pen to that width and hides the picker."
1135
1159
  },
1136
1160
  // The reference image itself is the node's attached media (media_id,
1137
1161
  // via the same media_asset/create-media.ts pipeline every other
@@ -1145,6 +1169,55 @@ var NODE_TYPES = {
1145
1169
  fit: { type: "string", enum: ["cover", "contain"], default: "contain", label: "Fit", description: "contain letterboxes the image, cover crops it to fill the canvas" },
1146
1170
  opacity: { type: "number", minimum: 0, maximum: 1, default: 1, label: "Opacity", description: "Background image opacity, from 0 (invisible) to 1 (fully opaque)" }
1147
1171
  }
1172
+ },
1173
+ // Optional match-to-shape game (#2148). Absent entirely by default
1174
+ // (not in default_config) - a node with no `game.target` behaves
1175
+ // exactly as it did before this key existed. `target.points` is
1176
+ // authored once in the builder (a simplified sketch modal, see
1177
+ // apps/dashboard) and stored pre-normalized to a [0,1] unit box so the
1178
+ // viewer's scorer (apps/viewer/lib/matchShape.ts) and the reveal
1179
+ // overlay share the same coordinate frame without re-deriving it.
1180
+ game: {
1181
+ type: "object",
1182
+ label: "Match-to-shape game",
1183
+ description: "Optional target shape the drawing is scored against on submit",
1184
+ properties: {
1185
+ target: {
1186
+ type: "object",
1187
+ label: "Target shape",
1188
+ description: "The outline the respondent is scored against, drawn once by the form builder",
1189
+ properties: {
1190
+ points: {
1191
+ type: "array",
1192
+ minItems: 2,
1193
+ maxItems: 500,
1194
+ items: {
1195
+ type: "object",
1196
+ properties: {
1197
+ x: { type: "number", minimum: 0, maximum: 1 },
1198
+ y: { type: "number", minimum: 0, maximum: 1 }
1199
+ }
1200
+ },
1201
+ description: "Closed polyline outline, normalized to a [0,1] unit box (aspect-preserving)"
1202
+ }
1203
+ }
1204
+ },
1205
+ tiers: {
1206
+ type: "array",
1207
+ label: "Score tiers",
1208
+ minItems: 1,
1209
+ maxItems: 10,
1210
+ items: {
1211
+ type: "object",
1212
+ properties: {
1213
+ min_score: { type: "number", minimum: 0, maximum: 100 },
1214
+ label: { type: "string" }
1215
+ }
1216
+ },
1217
+ default: DRAW_GAME_DEFAULT_TIERS,
1218
+ description: "Score bands shown in the reveal, ascending by min_score - defaults to a 5-band Scribble to Perfect scale"
1219
+ }
1220
+ }
1148
1221
  }
1149
1222
  }
1150
1223
  },
@@ -1166,6 +1239,17 @@ var NODE_TYPES = {
1166
1239
  mime_type: { type: "string", description: "Image MIME type (image/png)" }
1167
1240
  },
1168
1241
  description: "The exported sketch, stored as a single image in media-responses"
1242
+ },
1243
+ // Present only when the node has a configured game.target - absent for
1244
+ // every draw node published before #2148 and for one with no target.
1245
+ game: {
1246
+ type: "object",
1247
+ description: "Present when the node has a configured target shape - the respondent's match-to-shape score",
1248
+ properties: {
1249
+ score: { type: "number", minimum: 0, maximum: 100, description: "0-100 match score against the target outline" },
1250
+ avg_deviation: { type: "number", minimum: 0, description: "Average normalized deviation from the target outline (lower is better)" },
1251
+ tier: { type: "string", description: "The configured tier label the score falls into" }
1252
+ }
1169
1253
  }
1170
1254
  }
1171
1255
  },
@@ -1184,6 +1268,17 @@ var NODE_TYPES = {
1184
1268
  download_url: { type: "string", format: "uri", description: "Same link with a forced download (Content-Disposition: attachment)" },
1185
1269
  expires_at: { type: "string", format: "date-time", description: "When url/download_url stop working" }
1186
1270
  }
1271
+ },
1272
+ // Mirrors response_schema.game (piece 1 of #2148) - transformResponse
1273
+ // passes it through unchanged, so this describes the FINAL emitted shape.
1274
+ game: {
1275
+ type: "object",
1276
+ description: "Present when the node has a configured target shape - the respondent's match-to-shape score",
1277
+ properties: {
1278
+ score: { type: "number", minimum: 0, maximum: 100, description: "0-100 match score against the target outline" },
1279
+ avg_deviation: { type: "number", minimum: 0, description: "Average normalized deviation from the target outline (lower is better)" },
1280
+ tier: { type: "string", description: "The configured tier label the score falls into" }
1281
+ }
1187
1282
  }
1188
1283
  }
1189
1284
  }
@@ -2010,7 +2105,8 @@ var HELP_TOPICS = {
2010
2105
  cantGoLive: { path: "/help/sharing", anchor: "cant-go-live" },
2011
2106
  liveAndDraft: { path: "/help/managing-forms", anchor: "live-and-draft" },
2012
2107
  publishingChanges: { path: "/help/managing-forms", anchor: "publishing-changes" },
2013
- embedding: { path: "/help/embed", anchor: null }
2108
+ embedding: { path: "/help/embed", anchor: null },
2109
+ publicResults: { path: "/help/public-results", anchor: null }
2014
2110
  };
2015
2111
  function buildHelpLinks(docsBaseUrl) {
2016
2112
  const links = {};
@@ -2410,4 +2506,4 @@ export {
2410
2506
  getSessionContextWithAuth,
2411
2507
  getSessionContext
2412
2508
  };
2413
- //# sourceMappingURL=chunk-QF3V3TDS.js.map
2509
+ //# sourceMappingURL=chunk-CNEUXDNC.js.map