@clipform/mcp-server 4.2.4 → 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",
@@ -681,25 +699,25 @@ var FEATURES = {
681
699
  status: "planned",
682
700
  category: "integrations"
683
701
  },
684
- // Ships dark (#4890): gated in the dashboard on this flag OR the
685
- // FEATURE_COMPANY_ALLOWLIST.transcript_copy allowlist (companyHasTranscriptCopy).
686
- // Flip enabled/status together for GA.
702
+ // Went live globally (#4929); gated in the dashboard via companyHasTranscriptCopy.
687
703
  transcript_copy: {
688
704
  name: "Copy response transcripts",
689
705
  description: "Copy a whole response transcript, or a single line, as plain text",
690
- enabled: false,
691
- status: "planned",
692
- category: "responses"
693
- },
694
- // Ships dark (#4890): the atomic response audio player (Slider + play/pause)
695
- // replaces native <audio controls> only for allowlisted companies. Parity
696
- // follow-up (speed / download / volume): #4920. Flip enabled/status together for GA.
697
- audio_player: {
698
- name: "Response audio player",
699
- description: "A custom audio player for voice answers in the Responses view",
700
- enabled: false,
701
- status: "planned",
702
- category: "responses"
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"
703
721
  }
704
722
  };
705
723
  for (const [key, f] of Object.entries(FEATURES)) {
@@ -1052,8 +1070,11 @@ var NODE_TYPES = {
1052
1070
  storage_path: { type: "string" },
1053
1071
  original_storage_path: { type: "string" },
1054
1072
  thumbnail_storage_path: { type: "string" },
1073
+ mp3_storage_path: { type: "string" },
1055
1074
  duration_s: { type: "number" },
1056
1075
  processed_at: { type: "string" },
1076
+ // Processor-stamped: is the saved video mirrored (#5021)? Absent = legacy.
1077
+ saved_mirrored: { type: "boolean" },
1057
1078
  facing_mode: { enum: ["user", "environment"], type: "string" },
1058
1079
  preview_crop: {
1059
1080
  type: "object",
@@ -1544,9 +1565,26 @@ var NODE_TYPES = {
1544
1565
  stroke_widths: [3, 6, 12],
1545
1566
  background: { fit: "contain", opacity: 1 }
1546
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
+ ],
1547
1583
  config_schema: {
1548
1584
  type: "object",
1549
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" },
1550
1588
  paper_color: { type: "string", label: "Paper colour", default: "#FAF9F6", description: "Canvas background colour (off-white paper by default)" },
1551
1589
  stroke_colors: {
1552
1590
  type: "array",
@@ -1716,31 +1754,81 @@ var NODE_TYPES = {
1716
1754
  config_schema: {
1717
1755
  type: "object",
1718
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" },
1719
1759
  camera_facing: {
1720
1760
  type: "string",
1721
1761
  enum: ["user", "environment"],
1722
1762
  default: "user",
1723
- label: "Default camera",
1724
- 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",
1725
1765
  enumLabels: { user: "Front (selfie)", environment: "Rear" }
1726
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
+ },
1727
1788
  allow_library_upload: {
1728
1789
  type: "boolean",
1729
1790
  default: true,
1730
- label: "Allow choosing from photo library",
1731
- 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"
1732
1793
  },
1733
- 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: {
1734
1799
  type: "array",
1735
- items: { type: "string", enum: ["photo", "video"] },
1736
- default: ["photo"],
1737
- label: "What can respondents capture?",
1738
- description: "Which capture types this node accepts - photo, video, or both (existing nodes stay photo-only)",
1739
- 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"
1740
1828
  }
1741
1829
  }
1742
1830
  },
1743
- // 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
1744
1832
  // Results/exports/webhooks treat it the same way (scaffold skill: shape reuse).
1745
1833
  // A video submission carries a video mime_type - the shape doesn't change (#2759).
1746
1834
  response_schema: {
@@ -1763,8 +1851,8 @@ var NODE_TYPES = {
1763
1851
  }
1764
1852
  },
1765
1853
  minItems: 1,
1766
- maxItems: 1,
1767
- 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)"
1768
1856
  }
1769
1857
  }
1770
1858
  },
@@ -1775,7 +1863,7 @@ var NODE_TYPES = {
1775
1863
  node_type: { type: "string", const: "camera" },
1776
1864
  files: {
1777
1865
  type: "array",
1778
- 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.",
1779
1867
  items: {
1780
1868
  type: "object",
1781
1869
  properties: {
@@ -3357,4 +3445,4 @@ export {
3357
3445
  textResult,
3358
3446
  structuredResult
3359
3447
  };
3360
- //# sourceMappingURL=chunk-NZCRZDRQ.js.map
3448
+ //# sourceMappingURL=chunk-GY5QLQOU.js.map