@clipform/mcp-server 2.16.0 → 2.16.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.
@@ -48,6 +48,19 @@ var FEATURES = {
48
48
  status: "live",
49
49
  category: "builder"
50
50
  },
51
+ // Backfilled (#4338): apps/viewer/components/FormViewer.tsx renders exactly
52
+ // one node at a time (`currentNode = nodes[currentIndex]`, single
53
+ // `AnimatePresence` block gating on `currentNode`) and transitions to the
54
+ // next on answer - never a scrollable list of every question. No
55
+ // enabled/status change (this has always been the viewer's shape), so no
56
+ // wentLiveAt.
57
+ one_question_at_a_time: {
58
+ name: "One question at a time",
59
+ description: "The viewer shows a single question and transitions to the next, never a scrollable list of every question",
60
+ enabled: true,
61
+ status: "live",
62
+ category: "builder"
63
+ },
51
64
  branching: {
52
65
  name: "Conditional branching",
53
66
  description: "Choice nodes route to different destinations based on which option is picked",
@@ -140,7 +153,12 @@ var FEATURES = {
140
153
  },
141
154
  node_details: {
142
155
  name: "Details",
143
- description: "Structured fields (name, email, phone, company) with consent checkboxes",
156
+ // Widened (#4338): the checkbox items are typed 'consent' (required,
157
+ // blocks submission until checked) or 'opt_in' (optional) - see
158
+ // CONSENT_TYPES in node-types.js and the viewer's Contact.tsx. Both are
159
+ // plain text checkboxes available to every creator with no gate; only
160
+ // attaching a PDF agreement document is gated (consent_documents, beta).
161
+ description: "Structured fields (name, email, phone, company) with consent and opt-in checkboxes",
144
162
  enabled: true,
145
163
  status: "live",
146
164
  category: "node-types"
@@ -201,18 +219,20 @@ var FEATURES = {
201
219
  },
202
220
  node_camera: {
203
221
  name: "Camera",
204
- description: "Capture a photo from the device camera",
205
- // Scaffolded disabled (#2097): code lands ready, but node.type's DB check
206
- // constraint doesn't accept 'camera' yet - that's a separate parked
207
- // holds-migration PR. Flip once the migration has merged (= applied to
208
- // prod) and the apps have deployed.
222
+ // Description mirrors NODE_TYPES.camera.description (the node SSOT) - the
223
+ // node captures photo OR video (allowed_capture, #2759), not photo only.
224
+ description: "Capture a photo or video from the device camera",
225
+ // Dogfooding in live via NODE_COMPANY_ALLOWLIST.node_camera below. The DB
226
+ // node_type_check constraint already accepts 'camera' in prod (migration
227
+ // #2103 merged + applied 2026-07-17), so GA is now a pure app-config flip:
228
+ // set enabled true + status 'live' and follow feature-lifecycle.
209
229
  enabled: false,
210
230
  status: "planned",
211
231
  category: "node-types"
212
232
  },
213
233
  node_conditional: {
214
- name: "Conditional",
215
- description: "Route the flow to different branches based on Score",
234
+ name: "If / then",
235
+ description: "Route the flow to different branches based on a score, max score, or category variable.",
216
236
  // Scaffolded disabled (#4105, phase 1 of the #4104 variables engine): code
217
237
  // lands ready, but node.type's DB check constraint doesn't accept
218
238
  // 'conditional' yet - that's a separate parked holds-migration PR. Flip
@@ -288,10 +308,26 @@ var FEATURES = {
288
308
  status: "live",
289
309
  category: "responses"
290
310
  },
311
+ // Backfilled (#4338): the respondent-facing recorder (packages/media-recorder)
312
+ // already device-detects and adapts - mobile-first cover framing by default,
313
+ // front/back camera flip control shown only on mobile, iOS Safari getUserMedia
314
+ // quirks handled (browser-detection.ts) - so recording on a phone has always
315
+ // worked and been tuned for it. No enabled/status change, so no wentLiveAt.
316
+ mobile_recording: {
317
+ name: "Mobile-optimized recording",
318
+ description: "Respondents recording audio/video/photo on a phone get a mobile-first layout and a front/back camera flip control",
319
+ enabled: true,
320
+ status: "live",
321
+ category: "responses"
322
+ },
291
323
  // -- Analytics --
292
324
  analytics_overview: {
293
325
  name: "Analytics dashboard",
294
- description: "Views, starts, completions with daily time series",
326
+ // Widened #4338: views/starts/completions update live (useInsightRealtime,
327
+ // apps/dashboard's analytics page) and NodeResultCard computes a per-node
328
+ // drop-off count (`total_views - answeredCount`, "N people dropped off"),
329
+ // not just an aggregate form-level funnel.
330
+ description: "Real-time views, starts, and completions with daily time series, plus per-question drop-off",
295
331
  enabled: true,
296
332
  status: "live",
297
333
  category: "analytics"
@@ -318,6 +354,35 @@ var FEATURES = {
318
354
  wentLiveAt: "2026-06-07",
319
355
  category: "analytics"
320
356
  },
357
+ // Backfilled (#4338): the Responses table's search box (DataSpreadsheet's
358
+ // globalFilter, TanStack default `includesString` across every visible
359
+ // column) already searches every node-response column's displayed value -
360
+ // for audio/video answers that value falls back to the transcription text
361
+ // (list_form_submissions / get_latest_responses_for_session's
362
+ // response_data->'transcription'->>'text', supabase/migrations
363
+ // 20260920190000_submission_grain_per_completion.sql) before the generic
364
+ // "Video/Audio response" label. So a transcribed response is genuinely
365
+ // full-text searchable today - this key just gives that existing behaviour
366
+ // a name marketing can cite. No enabled/status change (search has always
367
+ // been on), so deliberately no wentLiveAt.
368
+ //
369
+ // Scoped honestly (review follow-up, #4338): this is ONE form's Responses
370
+ // table, filtered client-side (TanStack's globalFilter over the rows
371
+ // already loaded for that form) - never cross-form, and a video/audio
372
+ // answer's transcript only becomes searchable once transcription finishes
373
+ // (checked: no write path ever sets response_data.display or .text on a
374
+ // media answer at submit time - only the async transcription pipeline
375
+ // adds `transcription.text` later, so nothing hides the transcript once it
376
+ // lands; transcription itself is not plan-gated, it runs on every
377
+ // audio/video response regardless of plan). It also never jumps playback
378
+ // to the matched moment in the recording - it only surfaces the row.
379
+ response_search: {
380
+ name: "Response search",
381
+ description: "Filter one form's responses table by keyword, including transcript text once transcription finishes - not cross-form, and does not jump to a moment in the recording",
382
+ enabled: true,
383
+ status: "live",
384
+ category: "analytics"
385
+ },
321
386
  tracked_links: {
322
387
  name: "Tracked links",
323
388
  description: "URL tracking and click-through analytics for shared form links",
@@ -406,10 +471,37 @@ var FEATURES = {
406
471
  status: "live",
407
472
  category: "sharing"
408
473
  },
474
+ // Backfilled (#4338): the public /templates gallery (apps/marketing/src/app/templates,
475
+ // apps/marketing/src/components/template-gallery) lets anyone browse and start
476
+ // from a real, live Clipform template - a curated core set, plus the rest
477
+ // (project_template_gallery_curated_core6). No enabled/status change, no wentLiveAt.
478
+ templates_gallery: {
479
+ name: "Template gallery",
480
+ description: "Browse and start a form from a real, prebuilt template",
481
+ enabled: true,
482
+ status: "live",
483
+ category: "sharing"
484
+ },
409
485
  // -- AI --
410
486
  ai_form_generation: {
411
487
  name: "AI form generation",
412
- description: "Generate complete forms from a text prompt via MCP or dashboard",
488
+ // Corrected twice (#4338): not MCP-only (round 4 found the public
489
+ // web AI builder). In practice this mostly means the ChatGPT/Claude
490
+ // connector (chat_connectors) - leading with that per the user.
491
+ description: "Generate complete forms from a text prompt, primarily via the ChatGPT and Claude connectors (see chat_connectors); also the public web AI builder on marketing pages; no in-dashboard entry point",
492
+ enabled: true,
493
+ status: "live",
494
+ category: "ai"
495
+ },
496
+ // Confirmed live by the user 2026-09-27: both the ChatGPT App Directory and
497
+ // Claude Connectors Directory listings are live. Implementation is
498
+ // packages/mcp-server (the same MCP server surfaced as a connector in both
499
+ // directories - see #797 /
500
+ // #3681). No enabled/status change
501
+ // pending, so no wentLiveAt.
502
+ chat_connectors: {
503
+ name: "ChatGPT and Claude connectors",
504
+ description: "Build and edit forms from ChatGPT and Claude via the Clipform connector, listed in both the ChatGPT App Directory and the Claude Connectors Directory",
413
505
  enabled: true,
414
506
  status: "live",
415
507
  category: "ai"
@@ -548,7 +640,7 @@ var FEATURES = {
548
640
  name: "Google Sheets",
549
641
  description: "Sync form responses to a Google Sheet, one row per submission",
550
642
  enabled: false,
551
- status: "planned",
643
+ status: "beta",
552
644
  category: "integrations"
553
645
  },
554
646
  notifications: {
@@ -1603,11 +1695,11 @@ var NODE_TYPES = {
1603
1695
  // branch is a node_options row (has_options:true); the branch edge is a
1604
1696
  // `jump` action anchored by the option's id (LogicAction.option_id).
1605
1697
  conditional: {
1606
- label: "Conditional",
1698
+ label: "If / then",
1607
1699
  shorthand: "If",
1608
1700
  icon: "Split",
1609
1701
  color: "#E0E7FF",
1610
- description: "Route the flow based on Score",
1702
+ description: "Route the flow to different branches based on a score, max score, or category variable.",
1611
1703
  category: "logic",
1612
1704
  sort_order: 6.7,
1613
1705
  has_options: true,
@@ -1621,6 +1713,10 @@ var NODE_TYPES = {
1621
1713
  supports_media: false,
1622
1714
  is_system: false,
1623
1715
  show_in_results: false,
1716
+ // Logic/routing node - no respondent answer to render in a channel
1717
+ // notification, same as the other control nodes (redirect, link_list,
1718
+ // end_screen). Required by the #4154 notify_inline invariant.
1719
+ notify_inline: false,
1624
1720
  default_config: {
1625
1721
  options: [
1626
1722
  { content: "Branch 1" },
@@ -3388,4 +3484,4 @@ export {
3388
3484
  getSessionContextWithAuth,
3389
3485
  getSessionContext
3390
3486
  };
3391
- //# sourceMappingURL=chunk-ZHXMQ2PV.js.map
3487
+ //# sourceMappingURL=chunk-Z4ZGF6OV.js.map