@clipform/mcp-server 4.2.3 → 4.2.5

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.
@@ -142,6 +142,15 @@ var FEATURES = {
142
142
  status: "planned",
143
143
  category: "builder"
144
144
  },
145
+ draw_target_shape: {
146
+ name: "Draw target shape",
147
+ description: "Score a drawing against a builder-drawn target outline (match-to-shape game)",
148
+ // Flagged off for the Draw GA pass (#5052/#5060): existing config.game data
149
+ // is left in place and returns when the flag flips.
150
+ enabled: false,
151
+ status: "beta",
152
+ category: "builder"
153
+ },
145
154
  // -- Node types --
146
155
  node_start: {
147
156
  name: "Start node",
@@ -667,6 +676,15 @@ var FEATURES = {
667
676
  status: "planned",
668
677
  category: "integrations"
669
678
  },
679
+ // Intentionally undated: shipped incrementally (API import routes 2026-05-25,
680
+ // /try paste lane #3409 2026-08-30), so it stays out of the What's New feed.
681
+ import_google_forms: {
682
+ name: "Google Forms importer",
683
+ description: "Import forms from Google Forms into Clipform",
684
+ enabled: true,
685
+ status: "live",
686
+ category: "integrations"
687
+ },
670
688
  import_typeform: {
671
689
  name: "Typeform importer",
672
690
  description: "Import forms from Typeform into Clipform",
@@ -680,6 +698,26 @@ var FEATURES = {
680
698
  enabled: false,
681
699
  status: "planned",
682
700
  category: "integrations"
701
+ },
702
+ // Went live globally (#4929); gated in the dashboard via companyHasTranscriptCopy.
703
+ transcript_copy: {
704
+ name: "Copy response transcripts",
705
+ description: "Copy a whole response transcript, or a single line, as plain text",
706
+ enabled: true,
707
+ status: "live",
708
+ category: "responses",
709
+ wentLiveAt: "2026-10-15"
710
+ },
711
+ // Went live globally (#4920); gated in the dashboard via companyHasMediaPlayer
712
+ // (kill switch: set enabled:false + status:'beta' - 'live' with enabled:false throws
713
+ // at load - to fall back to the native audio/video controls).
714
+ media_player: {
715
+ name: "Response media player",
716
+ description: "Play voice and video answers in the Responses view with playback speed, volume and seek controls",
717
+ enabled: true,
718
+ status: "live",
719
+ category: "responses",
720
+ wentLiveAt: "2026-10-16"
683
721
  }
684
722
  };
685
723
  for (const [key, f] of Object.entries(FEATURES)) {
@@ -1032,8 +1070,11 @@ var NODE_TYPES = {
1032
1070
  storage_path: { type: "string" },
1033
1071
  original_storage_path: { type: "string" },
1034
1072
  thumbnail_storage_path: { type: "string" },
1073
+ mp3_storage_path: { type: "string" },
1035
1074
  duration_s: { type: "number" },
1036
1075
  processed_at: { type: "string" },
1076
+ // Processor-stamped: is the saved video mirrored (#5021)? Absent = legacy.
1077
+ saved_mirrored: { type: "boolean" },
1037
1078
  facing_mode: { enum: ["user", "environment"], type: "string" },
1038
1079
  preview_crop: {
1039
1080
  type: "object",
@@ -1524,9 +1565,26 @@ var NODE_TYPES = {
1524
1565
  stroke_widths: [3, 6, 12],
1525
1566
  background: { fit: "contain", opacity: 1 }
1526
1567
  },
1568
+ // Named one-click setups shown as extra rows in the dashboard node picker
1569
+ // (#5060). Same node type (no new id, no migration): a preset only overlays
1570
+ // default_config. `open_media_picker` opens the template-image picker on the
1571
+ // new node straight away. Each config key must exist in config_schema and
1572
+ // `icon` must be a known node icon (packages/config/test/node-type-picker-presets.test.js).
1573
+ picker_presets: [
1574
+ {
1575
+ id: "markup",
1576
+ label: "Mark up",
1577
+ icon: "Highlighter",
1578
+ description: "Respondents mark a spot on a template image - one red pen, undo and clear",
1579
+ config: { stroke_colors: ["#EF4444"], stroke_widths: [6] },
1580
+ open_media_picker: true
1581
+ }
1582
+ ],
1527
1583
  config_schema: {
1528
1584
  type: "object",
1529
1585
  properties: {
1586
+ title: { type: "string", label: "Heading", maxLength: 80, description: "Heading shown above the drawing canvas" },
1587
+ description: { type: "string", label: "Description", maxLength: 140, description: "Body text shown below the heading" },
1530
1588
  paper_color: { type: "string", label: "Paper colour", default: "#FAF9F6", description: "Canvas background colour (off-white paper by default)" },
1531
1589
  stroke_colors: {
1532
1590
  type: "array",
@@ -1696,31 +1754,81 @@ var NODE_TYPES = {
1696
1754
  config_schema: {
1697
1755
  type: "object",
1698
1756
  properties: {
1757
+ title: { type: "string", label: "Heading", description: "Heading shown above the capture area" },
1758
+ description: { type: "string", label: "Description", description: "Body text shown below the heading" },
1699
1759
  camera_facing: {
1700
1760
  type: "string",
1701
1761
  enum: ["user", "environment"],
1702
1762
  default: "user",
1703
- label: "Default camera",
1704
- description: "Which camera the device opens by default (a hint only - the respondent can still switch)",
1763
+ label: "Phone camera default",
1764
+ description: "Where the camera opens on phones - respondents can still switch",
1705
1765
  enumLabels: { user: "Front (selfie)", environment: "Rear" }
1706
1766
  },
1767
+ // The respondent's buttons (see cameraCaptureSources): Take a photo /
1768
+ // Record a video from camera_capture, Choose from library from
1769
+ // allow_library_upload accepting allowed_capture. At least one button
1770
+ // stays on (the builder enforces it).
1771
+ allowed_capture: {
1772
+ type: "array",
1773
+ items: { type: "string", enum: ["photo", "video"] },
1774
+ default: ["photo"],
1775
+ label: "Library accepts",
1776
+ // Existing nodes have no value and stay photo-only (the default). Also
1777
+ // the camera buttons while camera_capture is unset.
1778
+ description: "What respondents can pick from their library - photos, videos, or both.",
1779
+ enumLabels: { photo: "Photos", video: "Videos" }
1780
+ },
1781
+ // Absent = allowed_capture, so existing nodes keep a camera button per type.
1782
+ camera_capture: {
1783
+ type: "array",
1784
+ items: { type: "string", enum: ["photo", "video"] },
1785
+ label: "Camera buttons",
1786
+ description: "Which camera buttons respondents get - take a photo, record a video, or both"
1787
+ },
1707
1788
  allow_library_upload: {
1708
1789
  type: "boolean",
1709
1790
  default: true,
1710
- label: "Allow choosing from photo library",
1711
- description: "Show a secondary option to pick an existing photo instead of taking a new one"
1791
+ label: "Library button",
1792
+ description: "Whether respondents can pick existing photos or videos from their device"
1712
1793
  },
1713
- allowed_capture: {
1794
+ // Display order of the three capture buttons respondents see. Lists all
1795
+ // three, enabled or not, so a disabled tile keeps its slot (Open's
1796
+ // `formats` model). The enable flags stay allowed_capture /
1797
+ // allow_library_upload; existing nodes have no value and keep today's order.
1798
+ capture_order: {
1714
1799
  type: "array",
1715
- items: { type: "string", enum: ["photo", "video"] },
1716
- default: ["photo"],
1717
- label: "What can respondents capture?",
1718
- description: "Which capture types this node accepts - photo, video, or both (existing nodes stay photo-only)",
1719
- enumLabels: { photo: "Photo", video: "Video" }
1800
+ items: { type: "string", enum: ["photo", "video", "library"] },
1801
+ default: ["photo", "video", "library"],
1802
+ // Labels the builder's button tile row, which the creator toggles and
1803
+ // drags to set this order.
1804
+ label: "Respondents can",
1805
+ description: "The buttons respondents get. Turn each on or off, and drag to set their order.",
1806
+ enumLabels: { photo: "Take a photo", video: "Record a video", library: "Choose from library" }
1807
+ },
1808
+ // Same meaning and 20 cap as file_upload's max_files (a cap on the
1809
+ // `files` array). Default 1 keeps every existing node single-capture (#3737).
1810
+ max_files: {
1811
+ type: "number",
1812
+ min: 1,
1813
+ max: 20,
1814
+ default: 1,
1815
+ label: "Media items",
1816
+ shortLabel: "Max",
1817
+ description: "How many photos or videos one answer can hold (1 = a single capture). Set Max above 1 to also set a minimum."
1818
+ },
1819
+ // Clamped to <= max_files by the builder; enforced client-side like max_files.
1820
+ min_files: {
1821
+ type: "number",
1822
+ min: 1,
1823
+ max: 20,
1824
+ default: 1,
1825
+ label: "Minimum media items",
1826
+ shortLabel: "Min",
1827
+ description: "Fewest photos or videos a respondent must add before continuing"
1720
1828
  }
1721
1829
  }
1722
1830
  },
1723
- // Reuses file_upload's response shape verbatim (single-item array) so
1831
+ // Reuses file_upload's response shape verbatim (array of 1..max_files files) so
1724
1832
  // Results/exports/webhooks treat it the same way (scaffold skill: shape reuse).
1725
1833
  // A video submission carries a video mime_type - the shape doesn't change (#2759).
1726
1834
  response_schema: {
@@ -1743,8 +1851,8 @@ var NODE_TYPES = {
1743
1851
  }
1744
1852
  },
1745
1853
  minItems: 1,
1746
- maxItems: 1,
1747
- description: "The captured photo or video (single-item array, mirroring file_upload)"
1854
+ maxItems: 20,
1855
+ description: "The captured photos and videos, in capture order (1 to max_files items, mirroring file_upload)"
1748
1856
  }
1749
1857
  }
1750
1858
  },
@@ -1755,7 +1863,7 @@ var NODE_TYPES = {
1755
1863
  node_type: { type: "string", const: "camera" },
1756
1864
  files: {
1757
1865
  type: "array",
1758
- description: "The captured photo, as a canonical media object with a fresh signed link.",
1866
+ description: "The captured photos and videos in capture order, each as a canonical media object with a fresh signed link.",
1759
1867
  items: {
1760
1868
  type: "object",
1761
1869
  properties: {
@@ -3337,4 +3445,4 @@ export {
3337
3445
  textResult,
3338
3446
  structuredResult
3339
3447
  };
3340
- //# sourceMappingURL=chunk-ZRBMT7BF.js.map
3448
+ //# sourceMappingURL=chunk-GY5QLQOU.js.map