@seed-ship/mcp-ui-solid 6.17.0 → 6.18.0

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 (156) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +50 -3
  3. package/dist/adapters/index.d.ts +2 -0
  4. package/dist/adapters/index.d.ts.map +1 -1
  5. package/dist/adapters/presentation.cjs +141 -0
  6. package/dist/adapters/presentation.cjs.map +1 -0
  7. package/dist/adapters/presentation.d.ts +68 -0
  8. package/dist/adapters/presentation.d.ts.map +1 -0
  9. package/dist/adapters/presentation.js +141 -0
  10. package/dist/adapters/presentation.js.map +1 -0
  11. package/dist/adapters.cjs +4 -0
  12. package/dist/adapters.cjs.map +1 -1
  13. package/dist/adapters.d.cts +2 -0
  14. package/dist/adapters.d.ts +2 -0
  15. package/dist/adapters.js +4 -0
  16. package/dist/adapters.js.map +1 -1
  17. package/dist/components/ChartJSRenderer.cjs +165 -65
  18. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  19. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  20. package/dist/components/ChartJSRenderer.js +168 -68
  21. package/dist/components/ChartJSRenderer.js.map +1 -1
  22. package/dist/components/ComponentToolbar.cjs.map +1 -1
  23. package/dist/components/ComponentToolbar.d.ts.map +1 -1
  24. package/dist/components/ComponentToolbar.js.map +1 -1
  25. package/dist/components/EditableLayoutContext.cjs +17 -0
  26. package/dist/components/EditableLayoutContext.cjs.map +1 -0
  27. package/dist/components/EditableLayoutContext.d.ts +5 -0
  28. package/dist/components/EditableLayoutContext.d.ts.map +1 -0
  29. package/dist/components/EditableLayoutContext.js +17 -0
  30. package/dist/components/EditableLayoutContext.js.map +1 -0
  31. package/dist/components/EditableUIResourceRenderer.cjs +87 -84
  32. package/dist/components/EditableUIResourceRenderer.cjs.map +1 -1
  33. package/dist/components/EditableUIResourceRenderer.d.ts.map +1 -1
  34. package/dist/components/EditableUIResourceRenderer.js +87 -84
  35. package/dist/components/EditableUIResourceRenderer.js.map +1 -1
  36. package/dist/components/ElicitationForm.cjs.map +1 -1
  37. package/dist/components/ElicitationForm.js.map +1 -1
  38. package/dist/components/FeedbackInline.cjs +0 -1
  39. package/dist/components/FeedbackInline.cjs.map +1 -1
  40. package/dist/components/FeedbackInline.js +0 -1
  41. package/dist/components/FeedbackInline.js.map +1 -1
  42. package/dist/components/GraphRenderer.cjs.map +1 -1
  43. package/dist/components/GraphRenderer.d.ts.map +1 -1
  44. package/dist/components/GraphRenderer.js.map +1 -1
  45. package/dist/components/GridRenderer.cjs +12 -6
  46. package/dist/components/GridRenderer.cjs.map +1 -1
  47. package/dist/components/GridRenderer.d.ts.map +1 -1
  48. package/dist/components/GridRenderer.js +13 -7
  49. package/dist/components/GridRenderer.js.map +1 -1
  50. package/dist/components/MapRenderer.cjs.map +1 -1
  51. package/dist/components/MapRenderer.d.ts.map +1 -1
  52. package/dist/components/MapRenderer.js.map +1 -1
  53. package/dist/components/PresentationFeedback.cjs +0 -1
  54. package/dist/components/PresentationFeedback.cjs.map +1 -1
  55. package/dist/components/PresentationFeedback.js +0 -1
  56. package/dist/components/PresentationFeedback.js.map +1 -1
  57. package/dist/components/UIResourceRenderer.cjs +37 -22
  58. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  59. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  60. package/dist/components/UIResourceRenderer.js +38 -23
  61. package/dist/components/UIResourceRenderer.js.map +1 -1
  62. package/dist/components/VerifiedText.cjs +0 -4
  63. package/dist/components/VerifiedText.cjs.map +1 -1
  64. package/dist/components/VerifiedText.d.ts.map +1 -1
  65. package/dist/components/VerifiedText.js +0 -4
  66. package/dist/components/VerifiedText.js.map +1 -1
  67. package/dist/components/chart-data-table.cjs +73 -0
  68. package/dist/components/chart-data-table.cjs.map +1 -0
  69. package/dist/components/chart-data-table.d.ts +23 -0
  70. package/dist/components/chart-data-table.d.ts.map +1 -0
  71. package/dist/components/chart-data-table.js +73 -0
  72. package/dist/components/chart-data-table.js.map +1 -0
  73. package/dist/context/MCPUIStringsContext.cjs +10 -9
  74. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  75. package/dist/context/MCPUIStringsContext.d.ts +17 -5
  76. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  77. package/dist/context/MCPUIStringsContext.js +11 -10
  78. package/dist/context/MCPUIStringsContext.js.map +1 -1
  79. package/dist/hooks/createResponsiveGrid.cjs +37 -0
  80. package/dist/hooks/createResponsiveGrid.cjs.map +1 -0
  81. package/dist/hooks/createResponsiveGrid.d.ts +6 -0
  82. package/dist/hooks/createResponsiveGrid.d.ts.map +1 -0
  83. package/dist/hooks/createResponsiveGrid.js +37 -0
  84. package/dist/hooks/createResponsiveGrid.js.map +1 -0
  85. package/dist/index.cjs +1 -0
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.js +1 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/mcp-ui-spec/dist/schemas.cjs +13 -1
  90. package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
  91. package/dist/mcp-ui-spec/dist/schemas.js +13 -1
  92. package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
  93. package/dist/services/chat-bus.cjs.map +1 -1
  94. package/dist/services/chat-bus.d.ts.map +1 -1
  95. package/dist/services/chat-bus.js.map +1 -1
  96. package/dist/services/chat-prompt-controller.cjs.map +1 -1
  97. package/dist/services/chat-prompt-controller.d.ts.map +1 -1
  98. package/dist/services/chat-prompt-controller.js.map +1 -1
  99. package/dist/services/component-registry.cjs +162 -22
  100. package/dist/services/component-registry.cjs.map +1 -1
  101. package/dist/services/component-registry.d.ts +6 -3
  102. package/dist/services/component-registry.d.ts.map +1 -1
  103. package/dist/services/component-registry.js +162 -22
  104. package/dist/services/component-registry.js.map +1 -1
  105. package/dist/services/telemetry.cjs +0 -1
  106. package/dist/services/telemetry.cjs.map +1 -1
  107. package/dist/services/telemetry.js +0 -1
  108. package/dist/services/telemetry.js.map +1 -1
  109. package/dist/services/validation.cjs +21 -7
  110. package/dist/services/validation.cjs.map +1 -1
  111. package/dist/services/validation.d.ts.map +1 -1
  112. package/dist/services/validation.js +21 -7
  113. package/dist/services/validation.js.map +1 -1
  114. package/dist/types/index.d.ts +43 -8
  115. package/dist/types/index.d.ts.map +1 -1
  116. package/dist/types.d.cts +43 -8
  117. package/dist/types.d.ts +43 -8
  118. package/docs/briefs/VISUALIZATION-FOUNDATION-2026-09-14.md +105 -0
  119. package/package.json +4 -4
  120. package/src/adapters/index.ts +18 -0
  121. package/src/adapters/presentation.test.ts +114 -0
  122. package/src/adapters/presentation.ts +229 -0
  123. package/src/components/ChartJSRenderer.test.tsx +325 -0
  124. package/src/components/ChartJSRenderer.tsx +162 -27
  125. package/src/components/ChatPrompt.test.tsx +1 -1
  126. package/src/components/ComponentToolbar.tsx +1 -1
  127. package/src/components/EditableLayoutContext.tsx +12 -0
  128. package/src/components/EditableUIResourceRenderer.tsx +11 -8
  129. package/src/components/ElicitationForm.tsx +1 -1
  130. package/src/components/FeedbackInline.tsx +1 -1
  131. package/src/components/GraphRenderer.test.tsx +1 -2
  132. package/src/components/GraphRenderer.tsx +0 -2
  133. package/src/components/GridRenderer.tsx +6 -4
  134. package/src/components/MapRenderer.tsx +0 -3
  135. package/src/components/PresentationFeedback.tsx +1 -1
  136. package/src/components/ResponsiveGrid.test.tsx +166 -0
  137. package/src/components/TableRenderer.pagination.test.tsx +31 -0
  138. package/src/components/UIResourceRenderer.tsx +14 -9
  139. package/src/components/VerifiedText.tsx +0 -5
  140. package/src/components/chart-data-table.ts +97 -0
  141. package/src/context/MCPUIStringsContext.test.tsx +60 -0
  142. package/src/context/MCPUIStringsContext.tsx +31 -12
  143. package/src/hooks/createResponsiveGrid.ts +41 -0
  144. package/src/services/chat-bus.test.ts +1 -1
  145. package/src/services/chat-bus.ts +0 -2
  146. package/src/services/chat-prompt-controller.ts +0 -8
  147. package/src/services/component-registry.test.ts +81 -2
  148. package/src/services/component-registry.ts +167 -23
  149. package/src/services/telemetry.ts +1 -1
  150. package/src/services/validation.test.ts +1 -14
  151. package/src/services/validation.ts +23 -6
  152. package/src/services/visualization-validation.test.ts +42 -0
  153. package/src/types/index.ts +50 -9
  154. package/src/types/visualization-contracts.test.ts +66 -0
  155. package/src/utils/perf.test.ts +3 -3
  156. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sources":["../../../../mcp-ui-spec/dist/schemas.js"],"sourcesContent":["import { z } from \"zod\";\nconst GridPositionSchema = z.object({\n colStart: z.number().int().min(1).max(12),\n colSpan: z.number().int().min(1).max(12),\n rowStart: z.number().int().min(1).optional(),\n rowSpan: z.number().int().min(1).default(1).optional()\n});\nconst ComponentTypeSchema = z.enum([\n \"chart\",\n \"table\",\n \"metric\",\n \"text\",\n \"composite\",\n \"grid\",\n // Phase 5.0: Nested grid layouts\n \"iframe\",\n \"image\",\n \"link\",\n \"action\",\n // Phase 5.0: Tool call actions\n \"footer\",\n // Phase 5.0: Metadata footer\n \"carousel\",\n \"artifact\",\n \"form\",\n // Sprint 1: Form component\n \"modal\",\n // Sprint 3: Modal/dialog component\n \"action-group\",\n // Sprint 3: Action grouping component\n \"image-gallery\",\n // Sprint 5: Image gallery with lightbox\n \"video\",\n // Sprint 5: Video embed (YouTube, Vimeo, direct)\n \"code\",\n // Sprint 6: Syntax highlighted code block\n \"map\",\n // Sprint 6: Interactive map (Leaflet)\n \"graph\"\n // v5.0.4: node-link graph (peer @antv/g6)\n]);\nconst FormFieldOptionSchema = z.object({\n label: z.string().min(1),\n value: z.string(),\n disabled: z.boolean().optional()\n});\nconst FormFieldTypeSchema = z.enum([\n \"text\",\n \"email\",\n \"password\",\n \"number\",\n \"date\",\n \"textarea\",\n \"select\",\n \"checkbox\",\n \"radio\",\n \"autocomplete\",\n \"range\",\n \"tags\",\n \"toggle\",\n \"fieldset\"\n]);\nconst ShowWhenOperatorSchema = z.enum([\n \"equals\",\n \"notEquals\",\n \"in\",\n \"notIn\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"greaterThan\",\n \"lessThan\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"isTrue\",\n \"isFalse\"\n]);\nconst ShowWhenConditionSchema = z.object({\n field: z.string().min(1),\n operator: ShowWhenOperatorSchema,\n value: z.any().optional()\n});\nconst PrefillSourceSchema = z.enum([\"user\", \"detected\", \"inferred\", \"default\"]);\nconst FormFieldSchema = z.object({\n name: z.string().regex(/^[a-zA-Z][\\w.-]*$/),\n type: FormFieldTypeSchema,\n label: z.string().optional(),\n placeholder: z.string().optional(),\n helpText: z.string().optional(),\n required: z.boolean().optional(),\n disabled: z.boolean().optional(),\n defaultValue: z.any().optional(),\n // Prefill — pre-populated value with source tracking (v4.2.0)\n prefill: z.union([z.string(), z.array(z.string())]).optional(),\n displayHint: z.string().optional(),\n source: PrefillSourceSchema.optional(),\n muted: z.boolean().optional(),\n // Prefill mode for autocomplete fields (v4.3.0)\n prefillMode: z.enum([\"exact\", \"resolve\"]).optional(),\n // Value format validation (v4.3.0)\n valueFormat: z.string().optional(),\n valueFormatHint: z.string().optional(),\n // Text/textarea specific\n minLength: z.number().int().min(0).optional(),\n maxLength: z.number().int().min(1).optional(),\n pattern: z.string().optional(),\n // Number specific\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n // Date specific\n minDate: z.string().optional(),\n maxDate: z.string().optional(),\n // Select/Radio specific\n options: z.array(FormFieldOptionSchema).optional(),\n // Multi-select (v2.6.0)\n multiple: z.boolean().optional(),\n // Autocomplete specific (v2.6.0)\n apiUrl: z.string().url().optional(),\n searchParam: z.string().optional(),\n labelField: z.string().optional(),\n valueField: z.string().optional(),\n extraParams: z.record(z.string()).optional(),\n minChars: z.number().int().min(0).optional(),\n debounceMs: z.number().int().min(0).optional(),\n // Dependent field (v2.7.0)\n dependsOn: z.object({\n field: z.string(),\n apiUrl: z.string(),\n labelField: z.string(),\n valueField: z.string(),\n extraParams: z.record(z.string()).optional()\n }).optional(),\n // Field status — API capability indicator (v2.11.0)\n fieldStatus: z.enum([\"required\", \"optional\", \"unsupported\", \"unknown\"]).optional(),\n statusReason: z.string().optional(),\n // Checkbox specific\n checkboxLabel: z.string().optional(),\n // Textarea specific\n rows: z.number().int().min(1).max(20).optional(),\n // Conditional visibility\n showWhen: ShowWhenConditionSchema.optional()\n});\nconst FormSubmitActionSchema = z.object({\n toolName: z.string().min(1),\n params: z.record(z.unknown()).optional()\n});\nconst FormComponentParamsSchema = z.object({\n title: z.string().optional(),\n fields: z.array(FormFieldSchema).min(1),\n submitLabel: z.string().optional(),\n showReset: z.boolean().optional(),\n submitAction: FormSubmitActionSchema.optional(),\n // Persistence options (Sprint 4)\n persistKey: z.string().optional(),\n excludeFromPersistence: z.array(z.string()).optional(),\n persistExpiresIn: z.number().int().positive().optional(),\n layout: z.enum([\"vertical\", \"horizontal\", \"inline\"]).optional(),\n // Auto-submit countdown in ms when all required fields are prefilled (v4.2.0)\n autoSubmitDelay: z.number().int().min(1e3).max(3e4).optional()\n});\nconst ModalSizeSchema = z.enum([\"sm\", \"md\", \"lg\", \"xl\", \"full\"]);\nconst ModalComponentParamsSchema = z.object({\n title: z.string().optional(),\n size: ModalSizeSchema.optional(),\n showClose: z.boolean().optional(),\n closeOnEscape: z.boolean().optional(),\n closeOnBackdrop: z.boolean().optional(),\n maxHeight: z.string().optional()\n // Note: content and footer are UIComponent references, validated separately\n});\nconst ActionGroupLayoutSchema = z.enum([\n \"horizontal\",\n \"vertical\",\n \"space-between\",\n \"end\",\n \"center\"\n]);\nconst ActionGroupGapSchema = z.enum([\"none\", \"sm\", \"md\", \"lg\"]);\nconst ActionParamsSchema = z.object({\n label: z.string().min(1),\n type: z.enum([\"button\", \"link\"]).optional(),\n action: z.enum([\"tool-call\", \"link\", \"submit\"]).optional(),\n toolName: z.string().optional(),\n params: z.record(z.unknown()).optional(),\n url: z.string().optional(),\n variant: z.enum([\"primary\", \"secondary\", \"outline\", \"ghost\", \"danger\"]).optional(),\n size: z.enum([\"sm\", \"md\", \"lg\"]).optional(),\n icon: z.string().optional(),\n disabled: z.boolean().optional()\n});\nconst ActionGroupParamsSchema = z.object({\n actions: z.array(ActionParamsSchema).min(1),\n layout: ActionGroupLayoutSchema.optional(),\n gap: ActionGroupGapSchema.optional(),\n fullWidth: z.boolean().optional(),\n label: z.string().optional()\n});\nconst GalleryImageSchema = z.object({\n url: z.string().url(),\n thumbnail: z.string().url().optional(),\n alt: z.string().optional(),\n caption: z.string().optional(),\n srcset: z.string().optional(),\n sizes: z.string().optional()\n});\nconst ImageGalleryColumnsSchema = z.enum([\"2\", \"3\", \"4\", \"5\"]).transform(Number);\nconst ImageGalleryGapSchema = z.enum([\"none\", \"sm\", \"md\", \"lg\"]);\nconst ImageGalleryAspectRatioSchema = z.enum([\"1:1\", \"16:9\", \"4:3\", \"auto\"]);\nconst ImageGalleryParamsSchema = z.object({\n title: z.string().optional(),\n images: z.array(GalleryImageSchema).min(1),\n columns: z.union([z.literal(2), z.literal(3), z.literal(4), z.literal(5)]).optional(),\n gap: ImageGalleryGapSchema.optional(),\n aspectRatio: ImageGalleryAspectRatioSchema.optional(),\n lightbox: z.boolean().optional(),\n showCaptions: z.boolean().optional()\n});\nconst VideoAspectRatioSchema = z.enum([\"16:9\", \"4:3\", \"1:1\", \"21:9\"]);\nconst VideoComponentParamsSchema = z.object({\n url: z.string().url(),\n title: z.string().optional(),\n caption: z.string().optional(),\n poster: z.string().url().optional(),\n aspectRatio: VideoAspectRatioSchema.optional(),\n autoplay: z.boolean().optional(),\n controls: z.boolean().optional(),\n loop: z.boolean().optional(),\n muted: z.boolean().optional(),\n startTime: z.number().int().min(0).optional()\n});\nconst CodeComponentParamsSchema = z.object({\n code: z.string(),\n language: z.string().optional(),\n filename: z.string().optional(),\n showLineNumbers: z.boolean().optional(),\n startLine: z.number().optional(),\n highlightLines: z.array(z.number()).optional(),\n maxHeight: z.string().optional(),\n theme: z.enum([\"light\", \"dark\"]).optional()\n});\nconst LatLngObjectSchema = z.object({\n lat: z.number(),\n lng: z.number()\n});\nconst LatLngTupleSchema = z.tuple([z.number(), z.number()]);\nconst LatLngPointSchema = z.union([LatLngTupleSchema, LatLngObjectSchema]);\nconst MapMarkerSchema = z.object({\n position: LatLngPointSchema,\n tooltip: z.string().optional(),\n popup: z.string().optional()\n});\nconst GeoJSONPositionSchema = z.array(z.number()).min(2);\nconst GeoJSONCoordinatesSchema = z.union([\n GeoJSONPositionSchema,\n z.array(GeoJSONPositionSchema),\n z.array(z.array(GeoJSONPositionSchema)),\n z.array(z.array(z.array(GeoJSONPositionSchema)))\n]);\nconst GeoJSONGeometryTypeSchema = z.enum([\n \"Point\",\n \"MultiPoint\",\n \"LineString\",\n \"MultiLineString\",\n \"Polygon\",\n \"MultiPolygon\",\n \"GeometryCollection\"\n]);\nconst GeoJSONSimpleGeometrySchema = z.object({\n type: GeoJSONGeometryTypeSchema,\n coordinates: GeoJSONCoordinatesSchema.optional(),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONGeometrySchema = z.object({\n type: GeoJSONGeometryTypeSchema,\n coordinates: GeoJSONCoordinatesSchema.optional(),\n geometries: z.array(GeoJSONSimpleGeometrySchema).optional(),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONFeatureSchema = z.object({\n type: z.literal(\"Feature\"),\n geometry: GeoJSONGeometrySchema.nullable(),\n properties: z.record(z.unknown()).nullable().optional(),\n id: z.union([z.string(), z.number()]).optional(),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONFeatureCollectionSchema = z.object({\n type: z.literal(\"FeatureCollection\"),\n features: z.array(GeoJSONFeatureSchema),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONSchema = z.union([\n GeoJSONFeatureCollectionSchema,\n GeoJSONFeatureSchema,\n GeoJSONGeometrySchema\n]);\nconst MapGeoJSONStyleSchema = z.object({\n fillColor: z.string().optional(),\n fillOpacity: z.number().optional(),\n strokeColor: z.string().optional(),\n strokeWeight: z.number().optional(),\n strokeOpacity: z.number().optional(),\n choroplethField: z.string().optional(),\n choroplethScale: z.array(z.tuple([z.number(), z.string()])).optional(),\n choroplethFallback: z.string().optional()\n});\nconst MapPopupConfigSchema = z.object({\n titleField: z.string().optional(),\n fields: z.array(z.string()).optional(),\n template: z.string().optional()\n});\nconst MapLayerSchema = z.object({\n name: z.string().min(1),\n visible: z.boolean().optional(),\n geojson: GeoJSONSchema,\n style: MapGeoJSONStyleSchema.optional(),\n popup: MapPopupConfigSchema.optional()\n});\nconst MapClusterOptionsSchema = z.object({\n maxClusterRadius: z.number().optional(),\n spiderfyOnMaxZoom: z.boolean().optional(),\n showCoverageOnHover: z.boolean().optional(),\n disableClusteringAtZoom: z.number().optional(),\n animateAddingMarkers: z.boolean().optional()\n});\nconst MapPMTilesPaintRuleSchema = z.object({\n dataLayer: z.string(),\n symbolizer: z.enum([\"polygon\", \"line\", \"circle\"]),\n color: z.string().optional(),\n width: z.number().optional(),\n opacity: z.number().optional()\n});\nconst MapPMTilesLabelRuleSchema = z.object({\n dataLayer: z.string(),\n textField: z.string(),\n fontSize: z.number().optional()\n});\nconst MapPMTilesConfigSchema = z.object({\n url: z.string(),\n attribution: z.string().optional(),\n paintRules: z.array(MapPMTilesPaintRuleSchema).optional(),\n labelRules: z.array(MapPMTilesLabelRuleSchema).optional(),\n maxZoom: z.number().optional(),\n minZoom: z.number().optional()\n});\nconst MapComponentParamsSchema = z.object({\n center: LatLngPointSchema.optional(),\n zoom: z.number().optional(),\n markers: z.array(MapMarkerSchema).optional(),\n height: z.string().optional(),\n fitBounds: z.boolean().optional(),\n zoomControl: z.boolean().optional(),\n scrollWheelZoom: z.boolean().optional(),\n tileLayer: z.string().optional(),\n attribution: z.string().optional(),\n className: z.string().optional(),\n // GeoJSON layer (v5.2.0) — polygons / lines / points from structured data.\n geojson: GeoJSONSchema.optional(),\n geojsonStyle: MapGeoJSONStyleSchema.optional(),\n popup: MapPopupConfigSchema.optional(),\n // Multiple named GeoJSON overlays with a Leaflet layer control (v5.2.0).\n layers: z.array(MapLayerSchema).optional(),\n // Marker clustering — `true` for defaults, or an options object (v5.2.0).\n clustering: z.union([z.boolean(), MapClusterOptionsSchema]).optional(),\n // PMTiles vector-tile source for large datasets (v5.2.0).\n pmtiles: MapPMTilesConfigSchema.optional()\n});\nconst GraphNodeSchema = z.object({\n id: z.string().min(1),\n label: z.string().optional(),\n type: z.string().optional(),\n // G6 node type: 'circle' | 'rect' | 'image' | …\n size: z.union([z.number(), z.tuple([z.number(), z.number()])]).optional(),\n /**\n * Generic ranking / importance signal. Drives default node size when\n * `size` is omitted, and acts as the sort key for the `concentric`\n * layout (highest weight at center). Domain semantics opaque to the lib.\n */\n weight: z.number().optional(),\n style: z.record(z.unknown()).optional(),\n // passthrough G6 NodeStyle\n data: z.record(z.unknown()).optional()\n // arbitrary metadata for tooltips / click handlers\n});\nconst GraphEdgeSchema = z.object({\n source: z.string().min(1),\n // must match a node.id\n target: z.string().min(1),\n // must match a node.id\n label: z.string().optional(),\n type: z.string().optional(),\n // G6 edge type: 'line' | 'arc' | 'cubic' | 'polyline' | …\n /**\n * Generic strength signal. Drives default edge stroke width and acts\n * as attractive force in `force` layouts. Domain semantics opaque.\n */\n weight: z.number().optional(),\n style: z.record(z.unknown()).optional(),\n data: z.record(z.unknown()).optional()\n});\nconst GraphLayoutNameSchema = z.enum([\n \"force\",\n \"dagre\",\n \"mindmap\",\n \"tree\",\n \"circular\",\n \"grid\",\n \"concentric\"\n]);\nconst GraphLayoutSchema = z.union([\n GraphLayoutNameSchema,\n z.object({\n type: GraphLayoutNameSchema,\n options: z.record(z.unknown()).optional()\n })\n]);\nconst GraphComponentParamsSchema = z.object({\n title: z.string().optional(),\n nodes: z.array(GraphNodeSchema).min(1),\n edges: z.array(GraphEdgeSchema).optional(),\n /**\n * Layout shorthand string OR object form. When omitted, the renderer\n * picks a sensible default: `'force'` if edges are present, `'circular'`\n * otherwise.\n */\n layout: GraphLayoutSchema.optional(),\n height: z.string().optional(),\n // CSS length, default '400px'\n width: z.string().optional(),\n // CSS length, default '100%'\n rendererPref: z.enum([\"canvas\", \"svg\"]).optional(),\n // default 'canvas'\n fitView: z.boolean().optional(),\n // default true\n enableZoom: z.boolean().optional(),\n // default true\n enableDrag: z.boolean().optional(),\n // default true (drag nodes)\n enableSelect: z.boolean().optional(),\n // default true (click-select highlight)\n tooltip: z.boolean().optional(),\n // default true (label + data summary on hover)\n className: z.string().optional()\n});\nconst ChartTypeSchema = z.enum([\n \"bar\",\n \"line\",\n \"pie\",\n \"doughnut\",\n \"radar\",\n \"scatter\",\n \"bubble\",\n \"polarArea\"\n]);\nconst ChartDatasetSchema = z.object({\n label: z.string(),\n // Either an array of numbers or an array of {x, y} points (Chart.js shapes)\n data: z.union([\n z.array(z.number()),\n z.array(\n z.object({\n x: z.union([z.string(), z.number()]),\n y: z.number()\n })\n )\n ]),\n backgroundColor: z.union([z.string(), z.array(z.string())]).optional(),\n borderColor: z.union([z.string(), z.array(z.string())]).optional(),\n borderWidth: z.number().optional(),\n fill: z.union([z.boolean(), z.string()]).optional(),\n tension: z.number().optional()\n});\nconst ChartTimeAxisSchema = z.object({\n parser: z.string().optional(),\n unit: z.enum([\"day\", \"week\", \"month\", \"quarter\", \"year\"]).optional(),\n tooltipFormat: z.string().optional(),\n min: z.string().optional(),\n max: z.string().optional()\n});\nconst ChartComponentParamsSchema = z.object({\n type: ChartTypeSchema,\n title: z.string().optional(),\n data: z.object({\n labels: z.array(z.string()),\n datasets: z.array(ChartDatasetSchema)\n }),\n options: z.object({\n responsive: z.boolean().optional(),\n maintainAspectRatio: z.boolean().optional(),\n tension: z.number().optional(),\n // `scales` and `plugins` are Chart.js opaque config objects — kept loose\n scales: z.unknown().optional(),\n plugins: z.unknown().optional()\n }).optional(),\n renderer: z.enum([\"native\", \"iframe\", \"auto\"]).optional(),\n exportable: z.boolean().optional(),\n timeAxis: ChartTimeAxisSchema.optional(),\n height: z.string().optional(),\n className: z.string().optional()\n});\nconst TableColumnSchema = z.object({\n key: z.string().min(1),\n label: z.string(),\n sortable: z.boolean().optional(),\n width: z.string().optional()\n});\nconst TablePaginationSchema = z.object({\n currentPage: z.number().int().min(1),\n pageSize: z.number().int().min(1),\n totalRows: z.number().int().min(0)\n});\nconst TableVirtualizeOptionsSchema = z.object({\n enabled: z.boolean().optional(),\n rowHeight: z.number().int().min(1).optional(),\n overscan: z.number().int().min(0).optional(),\n threshold: z.number().int().min(1).optional()\n});\nconst TableExportableSchema = z.union([\n z.boolean(),\n z.object({\n formats: z.array(z.enum([\"csv\", \"tsv\", \"json\"])).optional(),\n filename: z.string().optional()\n })\n]);\nconst CitationEntrySchema = z.object({\n page: z.union([z.number(), z.string()]),\n file: z.string().optional(),\n file_id: z.union([z.number(), z.string()]).optional()\n});\nconst TableComponentParamsSchema = z.object({\n title: z.string().optional(),\n columns: z.array(TableColumnSchema).min(1),\n rows: z.array(z.record(z.unknown())),\n pagination: TablePaginationSchema.optional(),\n virtualize: z.union([z.boolean(), TableVirtualizeOptionsSchema]).optional(),\n exportable: TableExportableSchema.optional(),\n className: z.string().optional(),\n // v5.0.3 — opt-in citation chip rendering inside cells\n citationMap: z.record(z.string(), CitationEntrySchema).optional(),\n // v5.0.5 — opt-out of the inline-mode max-height cap. The library defaults\n // a `max-height: 400px` (or 500px when virtualizing) on tables with > 8\n // rows so they don't blow out a chat-stream layout. Pass `'auto'` to\n // disable the cap (when the consumer's wrapping container handles\n // overflow), a number (interpreted as `${n}px`), or any CSS length string\n // to override the value.\n maxHeight: z.union([z.literal(\"auto\"), z.number(), z.string()]).optional()\n});\nconst MetricTrendSchema = z.object({\n value: z.number(),\n direction: z.enum([\"up\", \"down\", \"neutral\"])\n});\nconst MetricComponentParamsSchema = z.object({\n title: z.string().min(1),\n value: z.union([z.string(), z.number()]),\n unit: z.string().optional(),\n trend: MetricTrendSchema.optional(),\n subtitle: z.string().optional(),\n icon: z.string().optional(),\n className: z.string().optional()\n});\nconst TextComponentParamsSchema = z.object({\n content: z.string().min(1),\n markdown: z.boolean().optional(),\n className: z.string().optional()\n});\nconst IframeComponentParamsSchema = z.object({\n url: z.string().min(1),\n title: z.string().optional(),\n height: z.string().optional(),\n className: z.string().optional()\n});\nconst ImageComponentParamsSchema = z.object({\n url: z.string().min(1),\n alt: z.string().optional(),\n caption: z.string().optional(),\n className: z.string().optional()\n});\nconst LinkComponentParamsSchema = z.object({\n url: z.string().min(1),\n label: z.string().optional(),\n description: z.string().optional(),\n className: z.string().optional()\n});\nconst CarouselComponentParamsSchema = z.object({\n items: z.array(z.unknown()).min(1),\n height: z.string().optional(),\n className: z.string().optional()\n});\nconst ArtifactComponentParamsSchema = z.object({\n url: z.string().min(1),\n filename: z.string().min(1),\n mimeType: z.string().min(1),\n size: z.number().int().min(0).optional(),\n description: z.string().optional()\n});\nconst SandboxFlagSchema = z.enum([\n \"allow-scripts\",\n \"allow-same-origin\",\n \"allow-forms\",\n \"allow-popups\",\n \"allow-modals\"\n]);\nconst SecurityConstraintsSchema = z.object({\n requiresAuth: z.boolean().default(false).optional(),\n allowedDomains: z.array(z.string()).optional(),\n maxIframeDepth: z.number().int().min(0).max(3).default(1).optional(),\n sandboxFlags: z.array(SandboxFlagSchema).optional()\n});\nconst PerformanceConstraintsSchema = z.object({\n maxRenderTime: z.number().int().min(100).default(5e3).optional(),\n maxDataSize: z.number().int().min(1024).default(102400).optional()\n});\nconst ComponentSchemaSchema = z.object({\n type: z.literal(\"object\"),\n required: z.array(z.string()).optional(),\n properties: z.record(z.unknown()),\n additionalProperties: z.boolean().optional()\n});\nconst ComponentExampleSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n params: z.record(z.unknown()),\n position: GridPositionSchema.optional()\n});\nconst ComponentSchema = z.object({\n id: z.string().regex(/^[a-z0-9-]+$/),\n type: ComponentTypeSchema,\n name: z.string().min(1),\n description: z.string().optional(),\n schema: ComponentSchemaSchema,\n examples: z.array(ComponentExampleSchema).min(1),\n security: SecurityConstraintsSchema.optional(),\n performance: PerformanceConstraintsSchema.optional(),\n tags: z.array(z.string().regex(/^[a-z0-9-]+$/)).optional(),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/).optional(),\n deprecated: z.boolean().default(false).optional(),\n deprecationMessage: z.string().optional()\n});\nconst RegistryMetadataSchema = z.object({\n name: z.string().optional(),\n description: z.string().optional(),\n author: z.string().optional(),\n repository: z.string().url().optional()\n});\nconst ComponentRegistrySchema = z.object({\n version: z.literal(\"1.0.0\"),\n metadata: RegistryMetadataSchema.optional(),\n components: z.array(ComponentSchema).min(1)\n});\nconst ConnectorFollowupSchema = z.object({\n /** Display text of the suggestion. */\n label: z.string().min(1),\n /** The follow-up query to run when the suggestion is picked. */\n query: z.string().optional(),\n /** Normalized intent of the follow-up query. */\n intent: z.string().optional(),\n /** What kind of follow-up this is — drives grouping / iconography. */\n kind: z.enum([\"refine\", \"compare\", \"expand\", \"clarify\"]).optional()\n});\nconst ConnectorActionSchema = ActionParamsSchema;\nconst ConnectorPreferredLayoutSchema = z.enum([\n \"table\",\n \"cards\",\n \"bar\",\n \"line\",\n \"doughnut\",\n \"map\",\n \"metric\",\n \"graph\"\n]);\nconst ConnectorRenderHintsSchema = z.object({\n /** Preferred top-level layout for `primary`. */\n preferredLayout: ConnectorPreferredLayoutSchema.optional(),\n /** Data domain — drives presets/examples, NOT the same axis as `intent`. */\n domain: z.enum([\"real_estate\", \"dpe\", \"pollution\", \"employment\", \"education\", \"health\", \"generic\"]).optional(),\n /** Connector's confidence in the result, 0..1. */\n confidence: z.number().min(0).max(1).optional()\n});\nconst CONNECTOR_DYNAMIC_RESULT_V1 = \"connector-dynamic-result/v1\";\nconst ConnectorDynamicResultV1Schema = z.object({\n /** Version discriminant — REQUIRED. */\n schemaVersion: z.literal(CONNECTOR_DYNAMIC_RESULT_V1),\n /** Stable id of the connector that produced this result. */\n connectorId: z.string().min(1),\n /** MCP tool that was invoked. */\n toolName: z.string().min(1),\n /** The raw user query. */\n query: z.string(),\n /**\n * Stable key for storing / retrieving persisted presentation feedback.\n * Optional in the payload, but REQUIRED once a feedback entry is\n * persisted against this result. Recommended derivation :\n * `hash(connectorId + toolName + normalizedIntent)` — NOT the raw query,\n * so two close phrasings of the same ask share the key.\n */\n queryHash: z.string().optional(),\n /** Normalized user intent (e.g. `real_estate_city`, `dpe_city`). */\n intent: z.string().optional(),\n /** Primary result — a `UIComponent` or `UILayout` (passthrough, see header). */\n primary: z.record(z.unknown()),\n /** Supplemental components — related datasets, source cards, etc. */\n supplemental: z.array(z.record(z.unknown())).optional(),\n /** Follow-up actions (tool calls / links) the user can trigger. */\n actions: z.array(ConnectorActionSchema).optional(),\n /** Suggested follow-up queries. */\n followups: z.array(ConnectorFollowupSchema).optional(),\n /** Non-binding rendering hints. */\n renderHints: ConnectorRenderHintsSchema.optional()\n});\nconst ConnectorRenderProblemSchema = z.enum([\n \"too_raw\",\n \"wrong_columns\",\n \"wrong_chart\",\n \"missing_context\",\n \"wrong_unit\",\n \"bad_grouping\",\n \"missing_dataset_context\"\n]);\nconst ConnectorRenderFeedbackSchema = z.object({\n /** Connector whose result is being rated. */\n connectorId: z.string().min(1),\n /** Tool that produced the result. */\n toolName: z.string().min(1),\n /** Stable key tying this feedback to a `ConnectorDynamicResultV1.queryHash`. */\n queryHash: z.string().optional(),\n /** What was rated (e.g. `'primary'`, `'supplemental'`). */\n renderKind: z.string().optional(),\n /** The layout type that was shown (e.g. `'table'`, `'bar'`). */\n layoutType: z.string().optional(),\n /** Overall judgement — REQUIRED. */\n verdict: z.enum([\"readable\", \"not_readable\"]),\n /** Zero or more precise problems (refines a `not_readable` verdict). */\n problems: z.array(ConnectorRenderProblemSchema).optional(),\n /** Layout the user would prefer instead. */\n preferredLayout: ConnectorPreferredLayoutSchema.optional(),\n /** Fields the user says are missing from the render. */\n missingFields: z.array(z.string()).optional(),\n /** Columns the user wishes were shown. */\n selectedColumns: z.array(z.string()).optional(),\n /** A unit the user flags as wrong. */\n wrongUnit: z.string().optional(),\n /** A grouping the user flags as wrong. */\n wrongGrouping: z.string().optional(),\n /** Free-text comment. */\n comment: z.string().optional()\n});\nconst MACRO_RUN_V1 = \"macro-run/v1\";\nconst MACRO_INTERROGATION_V1 = \"macro-interrogation/v1\";\nconst MacroRunStatusSchema = z.enum([\n \"pending\",\n \"running\",\n \"awaiting_input\",\n \"completed\",\n \"failed\",\n \"aborted\"\n]);\nconst MacroStepStatusSchema = z.enum([\"pending\", \"active\", \"done\", \"skipped\", \"failed\"]);\nconst MacroInvocationTypeSchema = z.enum([\n \"slash_command\",\n \"natural_language\",\n \"api_direct\",\n \"pipeline\",\n \"chat_stream\"\n]);\nconst MacroStepV1Schema = z.lazy(\n () => z.object({\n id: z.string().min(1),\n label: z.string(),\n toolName: z.string().optional(),\n status: MacroStepStatusSchema,\n summary: z.string().optional(),\n durationMs: z.number().optional(),\n error: z.string().optional(),\n resultRef: z.string().optional(),\n parallel: z.array(MacroStepV1Schema).optional()\n })\n);\nconst MacroInterrogationOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n icon: z.string().optional(),\n description: z.string().optional(),\n metadata: z.record(z.unknown()).optional()\n});\nconst MacroInterrogationKindSchema = z.enum([\"choice\", \"confirm\", \"form\", \"elicitation\"]);\nconst MacroInterrogationV1Schema = z.object({\n schemaVersion: z.literal(MACRO_INTERROGATION_V1),\n interrogationId: z.string().min(1),\n runId: z.string().min(1),\n correlationId: z.string().optional(),\n stepId: z.string().optional(),\n /** Free-form tag describing what the run is blocked on. */\n waitingFor: z.string().optional(),\n kind: MacroInterrogationKindSchema,\n title: z.string(),\n message: z.string().optional(),\n /** Options for a `choice` interrogation. */\n options: z.array(MacroInterrogationOptionSchema).optional(),\n /** Labels / variant for a `confirm` interrogation. */\n confirm: z.object({\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n variant: z.enum([\"default\", \"danger\"]).optional()\n }).optional(),\n /** Opaque field list for a `form` interrogation (renderer-side shape). */\n fields: z.array(z.unknown()).optional(),\n /** Opaque MCP elicitation JSON Schema for an `elicitation` interrogation. */\n elicitationSchema: z.unknown().optional(),\n /** A pre-selected default the host may surface (e.g. timeout fallback). */\n defaultChoice: z.object({\n value: z.string(),\n reason: z.string().optional()\n }).optional(),\n /** How the host resumes the run once answered — host-side, opaque to the lib. */\n resume: z.object({\n endpoint: z.string(),\n mode: z.enum([\"agent_resume\", \"legacy_chat_prompt\", \"macro_resume\"])\n }).optional(),\n metadata: z.record(z.unknown()).optional()\n});\nconst MacroRunAgentSchema = z.object({\n id: z.string(),\n name: z.string(),\n avatar: z.string().optional(),\n capabilities: z.array(z.string()).optional(),\n status: z.enum([\"idle\", \"running\", \"waiting\", \"done\", \"error\"]).optional(),\n currentStep: z.object({ id: z.string(), label: z.string() }).optional()\n});\nconst MacroRunErrorSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n stepId: z.string().optional(),\n retryable: z.boolean().optional()\n});\nconst MacroRunOutcomeSchema = z.object({\n kind: z.enum([\"verified_text\", \"briefing_diff\", \"agent_result\", \"raw\"]),\n content: z.unknown()\n});\nconst MacroRunV1Schema = z.object({\n schemaVersion: z.literal(MACRO_RUN_V1),\n // Identity\n runId: z.string().min(1),\n correlationId: z.string().optional(),\n macroId: z.string().min(1),\n macroName: z.string().optional(),\n macroVersion: z.string().optional(),\n title: z.string().optional(),\n invocationType: MacroInvocationTypeSchema.optional(),\n // State\n status: MacroRunStatusSchema,\n startedAt: z.string().optional(),\n updatedAt: z.string().optional(),\n completedAt: z.string().optional(),\n // Presentation\n agent: MacroRunAgentSchema.optional(),\n // Execution\n steps: z.array(MacroStepV1Schema),\n /** `UIComponent`-shaped results (passthrough). Optional — see header. */\n results: z.array(z.record(z.unknown())).optional(),\n pendingInterrogation: MacroInterrogationV1Schema.optional(),\n error: MacroRunErrorSchema.optional(),\n outcome: MacroRunOutcomeSchema.optional(),\n variables: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional()\n});\nexport {\n ActionGroupGapSchema,\n ActionGroupLayoutSchema,\n ActionGroupParamsSchema,\n ActionParamsSchema,\n ArtifactComponentParamsSchema,\n CONNECTOR_DYNAMIC_RESULT_V1,\n CarouselComponentParamsSchema,\n ChartComponentParamsSchema,\n ChartDatasetSchema,\n ChartTimeAxisSchema,\n ChartTypeSchema,\n CitationEntrySchema,\n CodeComponentParamsSchema,\n ComponentExampleSchema,\n ComponentRegistrySchema,\n ComponentSchema,\n ComponentSchemaSchema,\n ComponentTypeSchema,\n ConnectorActionSchema,\n ConnectorDynamicResultV1Schema,\n ConnectorFollowupSchema,\n ConnectorPreferredLayoutSchema,\n ConnectorRenderFeedbackSchema,\n ConnectorRenderHintsSchema,\n ConnectorRenderProblemSchema,\n FormComponentParamsSchema,\n FormFieldOptionSchema,\n FormFieldSchema,\n FormFieldTypeSchema,\n FormSubmitActionSchema,\n GalleryImageSchema,\n GeoJSONCoordinatesSchema,\n GeoJSONFeatureCollectionSchema,\n GeoJSONFeatureSchema,\n GeoJSONGeometrySchema,\n GeoJSONGeometryTypeSchema,\n GeoJSONPositionSchema,\n GeoJSONSchema,\n GraphComponentParamsSchema,\n GraphEdgeSchema,\n GraphLayoutNameSchema,\n GraphLayoutSchema,\n GraphNodeSchema,\n GridPositionSchema,\n IframeComponentParamsSchema,\n ImageComponentParamsSchema,\n ImageGalleryAspectRatioSchema,\n ImageGalleryColumnsSchema,\n ImageGalleryGapSchema,\n ImageGalleryParamsSchema,\n LatLngObjectSchema,\n LatLngPointSchema,\n LatLngTupleSchema,\n LinkComponentParamsSchema,\n MACRO_INTERROGATION_V1,\n MACRO_RUN_V1,\n MacroInterrogationKindSchema,\n MacroInterrogationOptionSchema,\n MacroInterrogationV1Schema,\n MacroInvocationTypeSchema,\n MacroRunAgentSchema,\n MacroRunErrorSchema,\n MacroRunOutcomeSchema,\n MacroRunStatusSchema,\n MacroRunV1Schema,\n MacroStepStatusSchema,\n MacroStepV1Schema,\n MapClusterOptionsSchema,\n MapComponentParamsSchema,\n MapGeoJSONStyleSchema,\n MapLayerSchema,\n MapMarkerSchema,\n MapPMTilesConfigSchema,\n MapPMTilesLabelRuleSchema,\n MapPMTilesPaintRuleSchema,\n MapPopupConfigSchema,\n MetricComponentParamsSchema,\n MetricTrendSchema,\n ModalComponentParamsSchema,\n ModalSizeSchema,\n PerformanceConstraintsSchema,\n PrefillSourceSchema,\n RegistryMetadataSchema,\n SandboxFlagSchema,\n SecurityConstraintsSchema,\n ShowWhenConditionSchema,\n ShowWhenOperatorSchema,\n TableColumnSchema,\n TableComponentParamsSchema,\n TableExportableSchema,\n TablePaginationSchema,\n TableVirtualizeOptionsSchema,\n TextComponentParamsSchema,\n VideoAspectRatioSchema,\n VideoComponentParamsSchema\n};\n//# sourceMappingURL=schemas.js.map\n"],"names":["z.object","z.number","z.enum","z.string","z.boolean","z.any","z.union","z.array","z.record","z.unknown","z.literal","z.tuple","z.lazy"],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sources":["../../../../mcp-ui-spec/dist/schemas.js"],"sourcesContent":["import { z } from \"zod\";\nconst GridPositionSchema = z.object({\n colStart: z.number().int().min(1).max(12),\n colSpan: z.number().int().min(1).max(12),\n rowStart: z.number().int().min(1).optional(),\n rowSpan: z.number().int().min(1).default(1).optional()\n});\nconst ComponentTypeSchema = z.enum([\n \"chart\",\n \"table\",\n \"metric\",\n \"text\",\n \"composite\",\n \"grid\",\n // Phase 5.0: Nested grid layouts\n \"iframe\",\n \"image\",\n \"link\",\n \"action\",\n // Phase 5.0: Tool call actions\n \"footer\",\n // Phase 5.0: Metadata footer\n \"carousel\",\n \"artifact\",\n \"form\",\n // Sprint 1: Form component\n \"modal\",\n // Sprint 3: Modal/dialog component\n \"action-group\",\n // Sprint 3: Action grouping component\n \"image-gallery\",\n // Sprint 5: Image gallery with lightbox\n \"video\",\n // Sprint 5: Video embed (YouTube, Vimeo, direct)\n \"code\",\n // Sprint 6: Syntax highlighted code block\n \"map\",\n // Sprint 6: Interactive map (Leaflet)\n \"graph\"\n // v5.0.4: node-link graph (peer @antv/g6)\n]);\nconst FormFieldOptionSchema = z.object({\n label: z.string().min(1),\n value: z.string(),\n disabled: z.boolean().optional()\n});\nconst FormFieldTypeSchema = z.enum([\n \"text\",\n \"email\",\n \"password\",\n \"number\",\n \"date\",\n \"textarea\",\n \"select\",\n \"checkbox\",\n \"radio\",\n \"autocomplete\",\n \"range\",\n \"tags\",\n \"toggle\",\n \"fieldset\"\n]);\nconst ShowWhenOperatorSchema = z.enum([\n \"equals\",\n \"notEquals\",\n \"in\",\n \"notIn\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"greaterThan\",\n \"lessThan\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"isTrue\",\n \"isFalse\"\n]);\nconst ShowWhenConditionSchema = z.object({\n field: z.string().min(1),\n operator: ShowWhenOperatorSchema,\n value: z.any().optional()\n});\nconst PrefillSourceSchema = z.enum([\"user\", \"detected\", \"inferred\", \"default\"]);\nconst FormFieldSchema = z.object({\n name: z.string().regex(/^[a-zA-Z][\\w.-]*$/),\n type: FormFieldTypeSchema,\n label: z.string().optional(),\n placeholder: z.string().optional(),\n helpText: z.string().optional(),\n required: z.boolean().optional(),\n disabled: z.boolean().optional(),\n defaultValue: z.any().optional(),\n // Prefill — pre-populated value with source tracking (v4.2.0)\n prefill: z.union([z.string(), z.array(z.string())]).optional(),\n displayHint: z.string().optional(),\n source: PrefillSourceSchema.optional(),\n muted: z.boolean().optional(),\n // Prefill mode for autocomplete fields (v4.3.0)\n prefillMode: z.enum([\"exact\", \"resolve\"]).optional(),\n // Value format validation (v4.3.0)\n valueFormat: z.string().optional(),\n valueFormatHint: z.string().optional(),\n // Text/textarea specific\n minLength: z.number().int().min(0).optional(),\n maxLength: z.number().int().min(1).optional(),\n pattern: z.string().optional(),\n // Number specific\n min: z.number().optional(),\n max: z.number().optional(),\n step: z.number().optional(),\n // Date specific\n minDate: z.string().optional(),\n maxDate: z.string().optional(),\n // Select/Radio specific\n options: z.array(FormFieldOptionSchema).optional(),\n // Multi-select (v2.6.0)\n multiple: z.boolean().optional(),\n // Autocomplete specific (v2.6.0)\n apiUrl: z.string().url().optional(),\n searchParam: z.string().optional(),\n labelField: z.string().optional(),\n valueField: z.string().optional(),\n extraParams: z.record(z.string()).optional(),\n minChars: z.number().int().min(0).optional(),\n debounceMs: z.number().int().min(0).optional(),\n // Dependent field (v2.7.0)\n dependsOn: z.object({\n field: z.string(),\n apiUrl: z.string(),\n labelField: z.string(),\n valueField: z.string(),\n extraParams: z.record(z.string()).optional()\n }).optional(),\n // Field status — API capability indicator (v2.11.0)\n fieldStatus: z.enum([\"required\", \"optional\", \"unsupported\", \"unknown\"]).optional(),\n statusReason: z.string().optional(),\n // Checkbox specific\n checkboxLabel: z.string().optional(),\n // Textarea specific\n rows: z.number().int().min(1).max(20).optional(),\n // Conditional visibility\n showWhen: ShowWhenConditionSchema.optional()\n});\nconst FormSubmitActionSchema = z.object({\n toolName: z.string().min(1),\n params: z.record(z.unknown()).optional()\n});\nconst FormComponentParamsSchema = z.object({\n title: z.string().optional(),\n fields: z.array(FormFieldSchema).min(1),\n submitLabel: z.string().optional(),\n showReset: z.boolean().optional(),\n submitAction: FormSubmitActionSchema.optional(),\n // Persistence options (Sprint 4)\n persistKey: z.string().optional(),\n excludeFromPersistence: z.array(z.string()).optional(),\n persistExpiresIn: z.number().int().positive().optional(),\n layout: z.enum([\"vertical\", \"horizontal\", \"inline\"]).optional(),\n // Auto-submit countdown in ms when all required fields are prefilled (v4.2.0)\n autoSubmitDelay: z.number().int().min(1e3).max(3e4).optional()\n});\nconst ModalSizeSchema = z.enum([\"sm\", \"md\", \"lg\", \"xl\", \"full\"]);\nconst ModalComponentParamsSchema = z.object({\n title: z.string().optional(),\n size: ModalSizeSchema.optional(),\n showClose: z.boolean().optional(),\n closeOnEscape: z.boolean().optional(),\n closeOnBackdrop: z.boolean().optional(),\n maxHeight: z.string().optional()\n // Note: content and footer are UIComponent references, validated separately\n});\nconst ActionGroupLayoutSchema = z.enum([\n \"horizontal\",\n \"vertical\",\n \"space-between\",\n \"end\",\n \"center\"\n]);\nconst ActionGroupGapSchema = z.enum([\"none\", \"sm\", \"md\", \"lg\"]);\nconst ActionParamsSchema = z.object({\n label: z.string().min(1),\n type: z.enum([\"button\", \"link\"]).optional(),\n action: z.enum([\"tool-call\", \"link\", \"submit\"]).optional(),\n toolName: z.string().optional(),\n params: z.record(z.unknown()).optional(),\n url: z.string().optional(),\n variant: z.enum([\"primary\", \"secondary\", \"outline\", \"ghost\", \"danger\"]).optional(),\n size: z.enum([\"sm\", \"md\", \"lg\"]).optional(),\n icon: z.string().optional(),\n disabled: z.boolean().optional()\n});\nconst ActionGroupParamsSchema = z.object({\n actions: z.array(ActionParamsSchema).min(1),\n layout: ActionGroupLayoutSchema.optional(),\n gap: ActionGroupGapSchema.optional(),\n fullWidth: z.boolean().optional(),\n label: z.string().optional()\n});\nconst GalleryImageSchema = z.object({\n url: z.string().url(),\n thumbnail: z.string().url().optional(),\n alt: z.string().optional(),\n caption: z.string().optional(),\n srcset: z.string().optional(),\n sizes: z.string().optional()\n});\nconst ImageGalleryColumnsSchema = z.enum([\"2\", \"3\", \"4\", \"5\"]).transform(Number);\nconst ImageGalleryGapSchema = z.enum([\"none\", \"sm\", \"md\", \"lg\"]);\nconst ImageGalleryAspectRatioSchema = z.enum([\"1:1\", \"16:9\", \"4:3\", \"auto\"]);\nconst ImageGalleryParamsSchema = z.object({\n title: z.string().optional(),\n images: z.array(GalleryImageSchema).min(1),\n columns: z.union([z.literal(2), z.literal(3), z.literal(4), z.literal(5)]).optional(),\n gap: ImageGalleryGapSchema.optional(),\n aspectRatio: ImageGalleryAspectRatioSchema.optional(),\n lightbox: z.boolean().optional(),\n showCaptions: z.boolean().optional()\n});\nconst VideoAspectRatioSchema = z.enum([\"16:9\", \"4:3\", \"1:1\", \"21:9\"]);\nconst VideoComponentParamsSchema = z.object({\n url: z.string().url(),\n title: z.string().optional(),\n caption: z.string().optional(),\n poster: z.string().url().optional(),\n aspectRatio: VideoAspectRatioSchema.optional(),\n autoplay: z.boolean().optional(),\n controls: z.boolean().optional(),\n loop: z.boolean().optional(),\n muted: z.boolean().optional(),\n startTime: z.number().int().min(0).optional()\n});\nconst CodeComponentParamsSchema = z.object({\n code: z.string(),\n language: z.string().optional(),\n filename: z.string().optional(),\n showLineNumbers: z.boolean().optional(),\n startLine: z.number().optional(),\n highlightLines: z.array(z.number()).optional(),\n maxHeight: z.string().optional(),\n theme: z.enum([\"light\", \"dark\"]).optional()\n});\nconst LatLngObjectSchema = z.object({\n lat: z.number(),\n lng: z.number()\n});\nconst LatLngTupleSchema = z.tuple([z.number(), z.number()]);\nconst LatLngPointSchema = z.union([LatLngTupleSchema, LatLngObjectSchema]);\nconst MapMarkerSchema = z.object({\n position: LatLngPointSchema,\n tooltip: z.string().optional(),\n popup: z.string().optional()\n});\nconst GeoJSONPositionSchema = z.array(z.number()).min(2);\nconst GeoJSONCoordinatesSchema = z.union([\n GeoJSONPositionSchema,\n z.array(GeoJSONPositionSchema),\n z.array(z.array(GeoJSONPositionSchema)),\n z.array(z.array(z.array(GeoJSONPositionSchema)))\n]);\nconst GeoJSONGeometryTypeSchema = z.enum([\n \"Point\",\n \"MultiPoint\",\n \"LineString\",\n \"MultiLineString\",\n \"Polygon\",\n \"MultiPolygon\",\n \"GeometryCollection\"\n]);\nconst GeoJSONSimpleGeometrySchema = z.object({\n type: GeoJSONGeometryTypeSchema,\n coordinates: GeoJSONCoordinatesSchema.optional(),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONGeometrySchema = z.object({\n type: GeoJSONGeometryTypeSchema,\n coordinates: GeoJSONCoordinatesSchema.optional(),\n geometries: z.array(GeoJSONSimpleGeometrySchema).optional(),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONFeatureSchema = z.object({\n type: z.literal(\"Feature\"),\n geometry: GeoJSONGeometrySchema.nullable(),\n properties: z.record(z.unknown()).nullable().optional(),\n id: z.union([z.string(), z.number()]).optional(),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONFeatureCollectionSchema = z.object({\n type: z.literal(\"FeatureCollection\"),\n features: z.array(GeoJSONFeatureSchema),\n bbox: z.array(z.number()).optional()\n});\nconst GeoJSONSchema = z.union([\n GeoJSONFeatureCollectionSchema,\n GeoJSONFeatureSchema,\n GeoJSONGeometrySchema\n]);\nconst MapGeoJSONStyleSchema = z.object({\n fillColor: z.string().optional(),\n fillOpacity: z.number().optional(),\n strokeColor: z.string().optional(),\n strokeWeight: z.number().optional(),\n strokeOpacity: z.number().optional(),\n choroplethField: z.string().optional(),\n choroplethScale: z.array(z.tuple([z.number(), z.string()])).optional(),\n choroplethFallback: z.string().optional()\n});\nconst MapPopupConfigSchema = z.object({\n titleField: z.string().optional(),\n fields: z.array(z.string()).optional(),\n template: z.string().optional()\n});\nconst MapLayerSchema = z.object({\n name: z.string().min(1),\n visible: z.boolean().optional(),\n geojson: GeoJSONSchema,\n style: MapGeoJSONStyleSchema.optional(),\n popup: MapPopupConfigSchema.optional()\n});\nconst MapClusterOptionsSchema = z.object({\n maxClusterRadius: z.number().optional(),\n spiderfyOnMaxZoom: z.boolean().optional(),\n showCoverageOnHover: z.boolean().optional(),\n disableClusteringAtZoom: z.number().optional(),\n animateAddingMarkers: z.boolean().optional()\n});\nconst MapPMTilesPaintRuleSchema = z.object({\n dataLayer: z.string(),\n symbolizer: z.enum([\"polygon\", \"line\", \"circle\"]),\n color: z.string().optional(),\n width: z.number().optional(),\n opacity: z.number().optional()\n});\nconst MapPMTilesLabelRuleSchema = z.object({\n dataLayer: z.string(),\n textField: z.string(),\n fontSize: z.number().optional()\n});\nconst MapPMTilesConfigSchema = z.object({\n url: z.string(),\n attribution: z.string().optional(),\n paintRules: z.array(MapPMTilesPaintRuleSchema).optional(),\n labelRules: z.array(MapPMTilesLabelRuleSchema).optional(),\n maxZoom: z.number().optional(),\n minZoom: z.number().optional()\n});\nconst MapComponentParamsSchema = z.object({\n center: LatLngPointSchema.optional(),\n zoom: z.number().optional(),\n markers: z.array(MapMarkerSchema).optional(),\n height: z.string().optional(),\n fitBounds: z.boolean().optional(),\n zoomControl: z.boolean().optional(),\n scrollWheelZoom: z.boolean().optional(),\n tileLayer: z.string().optional(),\n attribution: z.string().optional(),\n className: z.string().optional(),\n // GeoJSON layer (v5.2.0) — polygons / lines / points from structured data.\n geojson: GeoJSONSchema.optional(),\n geojsonStyle: MapGeoJSONStyleSchema.optional(),\n popup: MapPopupConfigSchema.optional(),\n // Multiple named GeoJSON overlays with a Leaflet layer control (v5.2.0).\n layers: z.array(MapLayerSchema).optional(),\n // Marker clustering — `true` for defaults, or an options object (v5.2.0).\n clustering: z.union([z.boolean(), MapClusterOptionsSchema]).optional(),\n // PMTiles vector-tile source for large datasets (v5.2.0).\n pmtiles: MapPMTilesConfigSchema.optional()\n});\nconst GraphNodeSchema = z.object({\n id: z.string().min(1),\n label: z.string().optional(),\n type: z.string().optional(),\n // G6 node type: 'circle' | 'rect' | 'image' | …\n size: z.union([z.number(), z.tuple([z.number(), z.number()])]).optional(),\n /**\n * Generic ranking / importance signal. Drives default node size when\n * `size` is omitted, and acts as the sort key for the `concentric`\n * layout (highest weight at center). Domain semantics opaque to the lib.\n */\n weight: z.number().optional(),\n style: z.record(z.unknown()).optional(),\n // passthrough G6 NodeStyle\n data: z.record(z.unknown()).optional()\n // arbitrary metadata for tooltips / click handlers\n});\nconst GraphEdgeSchema = z.object({\n source: z.string().min(1),\n // must match a node.id\n target: z.string().min(1),\n // must match a node.id\n label: z.string().optional(),\n type: z.string().optional(),\n // G6 edge type: 'line' | 'arc' | 'cubic' | 'polyline' | …\n /**\n * Generic strength signal. Drives default edge stroke width and acts\n * as attractive force in `force` layouts. Domain semantics opaque.\n */\n weight: z.number().optional(),\n style: z.record(z.unknown()).optional(),\n data: z.record(z.unknown()).optional()\n});\nconst GraphLayoutNameSchema = z.enum([\n \"force\",\n \"dagre\",\n \"mindmap\",\n \"tree\",\n \"circular\",\n \"grid\",\n \"concentric\"\n]);\nconst GraphLayoutSchema = z.union([\n GraphLayoutNameSchema,\n z.object({\n type: GraphLayoutNameSchema,\n options: z.record(z.unknown()).optional()\n })\n]);\nconst GraphComponentParamsSchema = z.object({\n title: z.string().optional(),\n nodes: z.array(GraphNodeSchema).min(1),\n edges: z.array(GraphEdgeSchema).optional(),\n /**\n * Layout shorthand string OR object form. When omitted, the renderer\n * picks a sensible default: `'force'` if edges are present, `'circular'`\n * otherwise.\n */\n layout: GraphLayoutSchema.optional(),\n height: z.string().optional(),\n // CSS length, default '400px'\n width: z.string().optional(),\n // CSS length, default '100%'\n rendererPref: z.enum([\"canvas\", \"svg\"]).optional(),\n // default 'canvas'\n fitView: z.boolean().optional(),\n // default true\n enableZoom: z.boolean().optional(),\n // default true\n enableDrag: z.boolean().optional(),\n // default true (drag nodes)\n enableSelect: z.boolean().optional(),\n // default true (click-select highlight)\n tooltip: z.boolean().optional(),\n // default true (label + data summary on hover)\n className: z.string().optional()\n});\nconst ChartTypeSchema = z.enum([\n \"bar\",\n \"line\",\n \"pie\",\n \"doughnut\",\n \"radar\",\n \"scatter\",\n \"bubble\",\n \"polarArea\"\n]);\nconst ChartDatasetSchema = z.object({\n label: z.string(),\n // Either an array of numbers or an array of {x, y} points (Chart.js shapes)\n data: z.union([\n z.array(z.number()),\n z.array(\n z.object({\n x: z.union([z.string(), z.number()]),\n y: z.number(),\n /** Bubble radius. Omit for scatter and time-series points. */\n r: z.number().finite().nonnegative().optional()\n })\n )\n ]),\n backgroundColor: z.union([z.string(), z.array(z.string())]).optional(),\n borderColor: z.union([z.string(), z.array(z.string())]).optional(),\n borderWidth: z.number().optional(),\n fill: z.union([z.boolean(), z.string()]).optional(),\n tension: z.number().optional()\n});\nconst ChartTimeAxisSchema = z.object({\n parser: z.string().optional(),\n unit: z.enum([\"day\", \"week\", \"month\", \"quarter\", \"year\"]).optional(),\n tooltipFormat: z.string().optional(),\n min: z.string().optional(),\n max: z.string().optional()\n});\nconst ChartComponentParamsSchema = z.object({\n type: ChartTypeSchema,\n title: z.string().optional(),\n data: z.object({\n labels: z.array(z.string()),\n datasets: z.array(ChartDatasetSchema)\n }),\n options: z.object({\n responsive: z.boolean().optional(),\n maintainAspectRatio: z.boolean().optional(),\n tension: z.number().optional(),\n // `scales` and `plugins` are Chart.js opaque config objects — kept loose\n scales: z.unknown().optional(),\n plugins: z.unknown().optional()\n }).optional(),\n renderer: z.enum([\"native\", \"iframe\", \"auto\"]).optional(),\n exportable: z.boolean().optional(),\n timeAxis: ChartTimeAxisSchema.optional(),\n height: z.string().optional(),\n className: z.string().optional()\n});\nconst TableColumnSchema = z.object({\n key: z.string().min(1),\n label: z.string(),\n sortable: z.boolean().optional(),\n width: z.string().optional()\n});\nconst TablePaginationSchema = z.object({\n currentPage: z.number().int().min(1),\n pageSize: z.number().int().min(1),\n totalRows: z.number().int().min(0)\n});\nconst TableVirtualizeOptionsSchema = z.object({\n enabled: z.boolean().optional(),\n rowHeight: z.number().int().min(1).optional(),\n overscan: z.number().int().min(0).optional(),\n threshold: z.number().int().min(1).optional()\n});\nconst TableExportableSchema = z.union([\n z.boolean(),\n z.object({\n formats: z.array(z.enum([\"csv\", \"tsv\", \"json\"])).optional(),\n filename: z.string().optional()\n })\n]);\nconst CitationEntrySchema = z.object({\n page: z.union([z.number(), z.string()]),\n file: z.string().optional(),\n file_id: z.union([z.number(), z.string()]).optional()\n});\nconst TableComponentParamsSchema = z.object({\n title: z.string().optional(),\n columns: z.array(TableColumnSchema).min(1),\n rows: z.array(z.record(z.unknown())),\n pagination: TablePaginationSchema.optional(),\n /** Show the client-side, accent-insensitive search field (default: true). */\n searchable: z.boolean().optional(),\n /** Placeholder used by the client-side search field. */\n searchPlaceholder: z.string().optional(),\n /** Expanded-view page size (default: 25). Zero disables client paging. */\n pageSize: z.number().int().min(0).optional(),\n /** Chat-view page size (default: min(10, pageSize)). Zero disables paging. */\n chatPageSize: z.number().int().min(0).optional(),\n /** Initial zero-based page for client-side paging. */\n initialPage: z.number().int().min(0).optional(),\n virtualize: z.union([z.boolean(), TableVirtualizeOptionsSchema]).optional(),\n exportable: TableExportableSchema.optional(),\n className: z.string().optional(),\n // v5.0.3 — opt-in citation chip rendering inside cells\n citationMap: z.record(z.string(), CitationEntrySchema).optional(),\n // v5.0.5 — opt-out of the inline-mode max-height cap. The library defaults\n // a `max-height: 400px` (or 500px when virtualizing) on tables with > 8\n // rows so they don't blow out a chat-stream layout. Pass `'auto'` to\n // disable the cap (when the consumer's wrapping container handles\n // overflow), a number (interpreted as `${n}px`), or any CSS length string\n // to override the value.\n maxHeight: z.union([z.literal(\"auto\"), z.number(), z.string()]).optional()\n});\nconst MetricTrendSchema = z.object({\n value: z.number(),\n direction: z.enum([\"up\", \"down\", \"neutral\"])\n});\nconst MetricComponentParamsSchema = z.object({\n title: z.string().min(1),\n value: z.union([z.string(), z.number()]),\n unit: z.string().optional(),\n trend: MetricTrendSchema.optional(),\n subtitle: z.string().optional(),\n icon: z.string().optional(),\n className: z.string().optional()\n});\nconst TextComponentParamsSchema = z.object({\n content: z.string().min(1),\n markdown: z.boolean().optional(),\n className: z.string().optional()\n});\nconst IframeComponentParamsSchema = z.object({\n url: z.string().min(1),\n title: z.string().optional(),\n height: z.string().optional(),\n className: z.string().optional()\n});\nconst ImageComponentParamsSchema = z.object({\n url: z.string().min(1),\n alt: z.string().optional(),\n caption: z.string().optional(),\n className: z.string().optional()\n});\nconst LinkComponentParamsSchema = z.object({\n url: z.string().min(1),\n label: z.string().optional(),\n description: z.string().optional(),\n className: z.string().optional()\n});\nconst CarouselComponentParamsSchema = z.object({\n items: z.array(z.unknown()).min(1),\n height: z.string().optional(),\n className: z.string().optional()\n});\nconst ArtifactComponentParamsSchema = z.object({\n url: z.string().min(1),\n filename: z.string().min(1),\n mimeType: z.string().min(1),\n size: z.number().int().min(0).optional(),\n description: z.string().optional()\n});\nconst SandboxFlagSchema = z.enum([\n \"allow-scripts\",\n \"allow-same-origin\",\n \"allow-forms\",\n \"allow-popups\",\n \"allow-modals\"\n]);\nconst SecurityConstraintsSchema = z.object({\n requiresAuth: z.boolean().default(false).optional(),\n allowedDomains: z.array(z.string()).optional(),\n maxIframeDepth: z.number().int().min(0).max(3).default(1).optional(),\n sandboxFlags: z.array(SandboxFlagSchema).optional()\n});\nconst PerformanceConstraintsSchema = z.object({\n maxRenderTime: z.number().int().min(100).default(5e3).optional(),\n maxDataSize: z.number().int().min(1024).default(102400).optional()\n});\nconst ComponentSchemaSchema = z.object({\n type: z.literal(\"object\"),\n required: z.array(z.string()).optional(),\n properties: z.record(z.unknown()),\n additionalProperties: z.boolean().optional()\n});\nconst ComponentExampleSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n params: z.record(z.unknown()),\n position: GridPositionSchema.optional()\n});\nconst ComponentSchema = z.object({\n id: z.string().regex(/^[a-z0-9-]+$/),\n type: ComponentTypeSchema,\n name: z.string().min(1),\n description: z.string().optional(),\n schema: ComponentSchemaSchema,\n examples: z.array(ComponentExampleSchema).min(1),\n security: SecurityConstraintsSchema.optional(),\n performance: PerformanceConstraintsSchema.optional(),\n tags: z.array(z.string().regex(/^[a-z0-9-]+$/)).optional(),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/).optional(),\n deprecated: z.boolean().default(false).optional(),\n deprecationMessage: z.string().optional()\n});\nconst RegistryMetadataSchema = z.object({\n name: z.string().optional(),\n description: z.string().optional(),\n author: z.string().optional(),\n repository: z.string().url().optional()\n});\nconst ComponentRegistrySchema = z.object({\n version: z.literal(\"1.0.0\"),\n metadata: RegistryMetadataSchema.optional(),\n components: z.array(ComponentSchema).min(1)\n});\nconst ConnectorFollowupSchema = z.object({\n /** Display text of the suggestion. */\n label: z.string().min(1),\n /** The follow-up query to run when the suggestion is picked. */\n query: z.string().optional(),\n /** Normalized intent of the follow-up query. */\n intent: z.string().optional(),\n /** What kind of follow-up this is — drives grouping / iconography. */\n kind: z.enum([\"refine\", \"compare\", \"expand\", \"clarify\"]).optional()\n});\nconst ConnectorActionSchema = ActionParamsSchema;\nconst ConnectorPreferredLayoutSchema = z.enum([\n \"table\",\n \"cards\",\n \"bar\",\n \"line\",\n \"doughnut\",\n \"map\",\n \"metric\",\n \"graph\"\n]);\nconst ConnectorRenderHintsSchema = z.object({\n /** Preferred top-level layout for `primary`. */\n preferredLayout: ConnectorPreferredLayoutSchema.optional(),\n /** Data domain — drives presets/examples, NOT the same axis as `intent`. */\n domain: z.enum([\"real_estate\", \"dpe\", \"pollution\", \"employment\", \"education\", \"health\", \"generic\"]).optional(),\n /** Connector's confidence in the result, 0..1. */\n confidence: z.number().min(0).max(1).optional()\n});\nconst CONNECTOR_DYNAMIC_RESULT_V1 = \"connector-dynamic-result/v1\";\nconst ConnectorDynamicResultV1Schema = z.object({\n /** Version discriminant — REQUIRED. */\n schemaVersion: z.literal(CONNECTOR_DYNAMIC_RESULT_V1),\n /** Stable id of the connector that produced this result. */\n connectorId: z.string().min(1),\n /** MCP tool that was invoked. */\n toolName: z.string().min(1),\n /** The raw user query. */\n query: z.string(),\n /**\n * Stable key for storing / retrieving persisted presentation feedback.\n * Optional in the payload, but REQUIRED once a feedback entry is\n * persisted against this result. Recommended derivation :\n * `hash(connectorId + toolName + normalizedIntent)` — NOT the raw query,\n * so two close phrasings of the same ask share the key.\n */\n queryHash: z.string().optional(),\n /** Normalized user intent (e.g. `real_estate_city`, `dpe_city`). */\n intent: z.string().optional(),\n /** Primary result — a `UIComponent` or `UILayout` (passthrough, see header). */\n primary: z.record(z.unknown()),\n /** Supplemental components — related datasets, source cards, etc. */\n supplemental: z.array(z.record(z.unknown())).optional(),\n /** Follow-up actions (tool calls / links) the user can trigger. */\n actions: z.array(ConnectorActionSchema).optional(),\n /** Suggested follow-up queries. */\n followups: z.array(ConnectorFollowupSchema).optional(),\n /** Non-binding rendering hints. */\n renderHints: ConnectorRenderHintsSchema.optional()\n});\nconst ConnectorRenderProblemSchema = z.enum([\n \"too_raw\",\n \"wrong_columns\",\n \"wrong_chart\",\n \"missing_context\",\n \"wrong_unit\",\n \"bad_grouping\",\n \"missing_dataset_context\"\n]);\nconst ConnectorRenderFeedbackSchema = z.object({\n /** Connector whose result is being rated. */\n connectorId: z.string().min(1),\n /** Tool that produced the result. */\n toolName: z.string().min(1),\n /** Stable key tying this feedback to a `ConnectorDynamicResultV1.queryHash`. */\n queryHash: z.string().optional(),\n /** What was rated (e.g. `'primary'`, `'supplemental'`). */\n renderKind: z.string().optional(),\n /** The layout type that was shown (e.g. `'table'`, `'bar'`). */\n layoutType: z.string().optional(),\n /** Overall judgement — REQUIRED. */\n verdict: z.enum([\"readable\", \"not_readable\"]),\n /** Zero or more precise problems (refines a `not_readable` verdict). */\n problems: z.array(ConnectorRenderProblemSchema).optional(),\n /** Layout the user would prefer instead. */\n preferredLayout: ConnectorPreferredLayoutSchema.optional(),\n /** Fields the user says are missing from the render. */\n missingFields: z.array(z.string()).optional(),\n /** Columns the user wishes were shown. */\n selectedColumns: z.array(z.string()).optional(),\n /** A unit the user flags as wrong. */\n wrongUnit: z.string().optional(),\n /** A grouping the user flags as wrong. */\n wrongGrouping: z.string().optional(),\n /** Free-text comment. */\n comment: z.string().optional()\n});\nconst MACRO_RUN_V1 = \"macro-run/v1\";\nconst MACRO_INTERROGATION_V1 = \"macro-interrogation/v1\";\nconst MacroRunStatusSchema = z.enum([\n \"pending\",\n \"running\",\n \"awaiting_input\",\n \"completed\",\n \"failed\",\n \"aborted\"\n]);\nconst MacroStepStatusSchema = z.enum([\"pending\", \"active\", \"done\", \"skipped\", \"failed\"]);\nconst MacroInvocationTypeSchema = z.enum([\n \"slash_command\",\n \"natural_language\",\n \"api_direct\",\n \"pipeline\",\n \"chat_stream\"\n]);\nconst MacroStepV1Schema = z.lazy(\n () => z.object({\n id: z.string().min(1),\n label: z.string(),\n toolName: z.string().optional(),\n status: MacroStepStatusSchema,\n summary: z.string().optional(),\n durationMs: z.number().optional(),\n error: z.string().optional(),\n resultRef: z.string().optional(),\n parallel: z.array(MacroStepV1Schema).optional()\n })\n);\nconst MacroInterrogationOptionSchema = z.object({\n value: z.string(),\n label: z.string(),\n icon: z.string().optional(),\n description: z.string().optional(),\n metadata: z.record(z.unknown()).optional()\n});\nconst MacroInterrogationKindSchema = z.enum([\"choice\", \"confirm\", \"form\", \"elicitation\"]);\nconst MacroInterrogationV1Schema = z.object({\n schemaVersion: z.literal(MACRO_INTERROGATION_V1),\n interrogationId: z.string().min(1),\n runId: z.string().min(1),\n correlationId: z.string().optional(),\n stepId: z.string().optional(),\n /** Free-form tag describing what the run is blocked on. */\n waitingFor: z.string().optional(),\n kind: MacroInterrogationKindSchema,\n title: z.string(),\n message: z.string().optional(),\n /** Options for a `choice` interrogation. */\n options: z.array(MacroInterrogationOptionSchema).optional(),\n /** Labels / variant for a `confirm` interrogation. */\n confirm: z.object({\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n variant: z.enum([\"default\", \"danger\"]).optional()\n }).optional(),\n /** Opaque field list for a `form` interrogation (renderer-side shape). */\n fields: z.array(z.unknown()).optional(),\n /** Opaque MCP elicitation JSON Schema for an `elicitation` interrogation. */\n elicitationSchema: z.unknown().optional(),\n /** A pre-selected default the host may surface (e.g. timeout fallback). */\n defaultChoice: z.object({\n value: z.string(),\n reason: z.string().optional()\n }).optional(),\n /** How the host resumes the run once answered — host-side, opaque to the lib. */\n resume: z.object({\n endpoint: z.string(),\n mode: z.enum([\"agent_resume\", \"legacy_chat_prompt\", \"macro_resume\"])\n }).optional(),\n metadata: z.record(z.unknown()).optional()\n});\nconst MacroRunAgentSchema = z.object({\n id: z.string(),\n name: z.string(),\n avatar: z.string().optional(),\n capabilities: z.array(z.string()).optional(),\n status: z.enum([\"idle\", \"running\", \"waiting\", \"done\", \"error\"]).optional(),\n currentStep: z.object({ id: z.string(), label: z.string() }).optional()\n});\nconst MacroRunErrorSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n stepId: z.string().optional(),\n retryable: z.boolean().optional()\n});\nconst MacroRunOutcomeSchema = z.object({\n kind: z.enum([\"verified_text\", \"briefing_diff\", \"agent_result\", \"raw\"]),\n content: z.unknown()\n});\nconst MacroRunV1Schema = z.object({\n schemaVersion: z.literal(MACRO_RUN_V1),\n // Identity\n runId: z.string().min(1),\n correlationId: z.string().optional(),\n macroId: z.string().min(1),\n macroName: z.string().optional(),\n macroVersion: z.string().optional(),\n title: z.string().optional(),\n invocationType: MacroInvocationTypeSchema.optional(),\n // State\n status: MacroRunStatusSchema,\n startedAt: z.string().optional(),\n updatedAt: z.string().optional(),\n completedAt: z.string().optional(),\n // Presentation\n agent: MacroRunAgentSchema.optional(),\n // Execution\n steps: z.array(MacroStepV1Schema),\n /** `UIComponent`-shaped results (passthrough). Optional — see header. */\n results: z.array(z.record(z.unknown())).optional(),\n pendingInterrogation: MacroInterrogationV1Schema.optional(),\n error: MacroRunErrorSchema.optional(),\n outcome: MacroRunOutcomeSchema.optional(),\n variables: z.record(z.unknown()).optional(),\n metadata: z.record(z.unknown()).optional()\n});\nexport {\n ActionGroupGapSchema,\n ActionGroupLayoutSchema,\n ActionGroupParamsSchema,\n ActionParamsSchema,\n ArtifactComponentParamsSchema,\n CONNECTOR_DYNAMIC_RESULT_V1,\n CarouselComponentParamsSchema,\n ChartComponentParamsSchema,\n ChartDatasetSchema,\n ChartTimeAxisSchema,\n ChartTypeSchema,\n CitationEntrySchema,\n CodeComponentParamsSchema,\n ComponentExampleSchema,\n ComponentRegistrySchema,\n ComponentSchema,\n ComponentSchemaSchema,\n ComponentTypeSchema,\n ConnectorActionSchema,\n ConnectorDynamicResultV1Schema,\n ConnectorFollowupSchema,\n ConnectorPreferredLayoutSchema,\n ConnectorRenderFeedbackSchema,\n ConnectorRenderHintsSchema,\n ConnectorRenderProblemSchema,\n FormComponentParamsSchema,\n FormFieldOptionSchema,\n FormFieldSchema,\n FormFieldTypeSchema,\n FormSubmitActionSchema,\n GalleryImageSchema,\n GeoJSONCoordinatesSchema,\n GeoJSONFeatureCollectionSchema,\n GeoJSONFeatureSchema,\n GeoJSONGeometrySchema,\n GeoJSONGeometryTypeSchema,\n GeoJSONPositionSchema,\n GeoJSONSchema,\n GraphComponentParamsSchema,\n GraphEdgeSchema,\n GraphLayoutNameSchema,\n GraphLayoutSchema,\n GraphNodeSchema,\n GridPositionSchema,\n IframeComponentParamsSchema,\n ImageComponentParamsSchema,\n ImageGalleryAspectRatioSchema,\n ImageGalleryColumnsSchema,\n ImageGalleryGapSchema,\n ImageGalleryParamsSchema,\n LatLngObjectSchema,\n LatLngPointSchema,\n LatLngTupleSchema,\n LinkComponentParamsSchema,\n MACRO_INTERROGATION_V1,\n MACRO_RUN_V1,\n MacroInterrogationKindSchema,\n MacroInterrogationOptionSchema,\n MacroInterrogationV1Schema,\n MacroInvocationTypeSchema,\n MacroRunAgentSchema,\n MacroRunErrorSchema,\n MacroRunOutcomeSchema,\n MacroRunStatusSchema,\n MacroRunV1Schema,\n MacroStepStatusSchema,\n MacroStepV1Schema,\n MapClusterOptionsSchema,\n MapComponentParamsSchema,\n MapGeoJSONStyleSchema,\n MapLayerSchema,\n MapMarkerSchema,\n MapPMTilesConfigSchema,\n MapPMTilesLabelRuleSchema,\n MapPMTilesPaintRuleSchema,\n MapPopupConfigSchema,\n MetricComponentParamsSchema,\n MetricTrendSchema,\n ModalComponentParamsSchema,\n ModalSizeSchema,\n PerformanceConstraintsSchema,\n PrefillSourceSchema,\n RegistryMetadataSchema,\n SandboxFlagSchema,\n SecurityConstraintsSchema,\n ShowWhenConditionSchema,\n ShowWhenOperatorSchema,\n TableColumnSchema,\n TableComponentParamsSchema,\n TableExportableSchema,\n TablePaginationSchema,\n TableVirtualizeOptionsSchema,\n TextComponentParamsSchema,\n VideoAspectRatioSchema,\n VideoComponentParamsSchema\n};\n//# sourceMappingURL=schemas.js.map\n"],"names":["z.object","z.number","z.enum","z.string","z.boolean","z.any","z.union","z.array","z.record","z.unknown","z.literal","z.tuple","z.lazy"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bus.cjs","sources":["../../src/services/chat-bus.ts"],"sourcesContent":["/**\n * Chat Bus — Event Emitter + Command Handler\n * v2.4.0: Core primitives for the chat event/command bus\n *\n * @experimental — This API may change without major bump until v2.5.0.\n */\n\nimport type {\n ChatEvents,\n ChatCommands,\n ChatEventEmitter,\n ChatCommandHandler,\n ChatBus,\n EventSubscribeOptions,\n ScratchpadSection,\n ClarificationEvent,\n ElicitationEvent,\n ElicitationPropertySchema,\n ChatPromptConfig,\n FormPromptConfig,\n} from '../types/chat-bus'\n\n// ─── Event Emitter ───────────────────────────────────────────\n\ninterface Listener<F extends (...args: any[]) => any> {\n handler: F\n options?: EventSubscribeOptions\n throttledHandler?: F\n}\n\n/**\n * Create a typed event emitter with throttle and streamKey filtering support.\n *\n * @experimental\n *\n * @example\n * const emitter = createEventEmitter<ChatEvents>()\n * const unsub = emitter.on('onToken', (event) => console.log(event.token), { throttle: 100 })\n * emitter.emit('onToken', { streamKey: 'abc', token: 'hello' })\n * unsub()\n */\nexport function createEventEmitter(): ChatEventEmitter {\n const listeners = new Map<string, Set<Listener<any>>>()\n\n interface ThrottledFn<F> {\n fn: F\n cancel: () => void\n }\n\n function createThrottled<F extends (...args: any[]) => void>(fn: F, ms: number): ThrottledFn<F> {\n let lastCall = 0\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastArgs: any[] | null = null\n let cancelled = false\n\n const throttled = ((...args: any[]) => {\n if (cancelled) return\n lastArgs = args\n const now = Date.now()\n const remaining = ms - (now - lastCall)\n\n if (remaining <= 0) {\n if (timer) { clearTimeout(timer); timer = null }\n lastCall = now\n fn(...args)\n } else if (!timer) {\n timer = setTimeout(() => {\n lastCall = Date.now()\n timer = null\n if (lastArgs && !cancelled) {\n try { fn(...lastArgs) } catch (err) { console.error('[ChatBus] Error in throttled handler:', err) }\n }\n }, remaining)\n }\n }) as F\n\n return {\n fn: throttled,\n cancel: () => { cancelled = true; if (timer) { clearTimeout(timer); timer = null } },\n }\n }\n\n return {\n on(event, handler, options) {\n if (!listeners.has(event as string)) {\n listeners.set(event as string, new Set())\n }\n\n const listener: Listener<typeof handler> = { handler, options }\n\n // Apply throttle if requested\n let throttleHandle: ThrottledFn<typeof handler> | null = null\n if (options?.throttle && options.throttle > 0) {\n throttleHandle = createThrottled(handler, options.throttle)\n listener.throttledHandler = throttleHandle.fn\n }\n\n listeners.get(event as string)!.add(listener)\n\n // Return unsubscribe function — cancels pending throttle timers\n return () => {\n throttleHandle?.cancel()\n listeners.get(event as string)?.delete(listener)\n }\n },\n\n emit(event, ...args) {\n const set = listeners.get(event as string)\n if (!set) return\n\n for (const listener of set) {\n // StreamKey filtering: skip if listener wants a specific streamKey\n // For most events args[0] has streamKey; for onCustomEvent args[1] has it\n if (listener.options?.streamKey) {\n let streamKeyArg: unknown\n for (const arg of args) {\n if (arg && typeof arg === 'object' && 'streamKey' in (arg as any)) {\n streamKeyArg = (arg as any).streamKey\n break\n }\n }\n if (streamKeyArg !== undefined && streamKeyArg !== listener.options.streamKey) continue\n }\n\n const fn = listener.throttledHandler || listener.handler\n try {\n fn(...args)\n } catch (err) {\n console.error(`[ChatBus] Error in ${event as string} handler:`, err)\n }\n }\n },\n\n clear() {\n listeners.clear()\n },\n } as ChatEventEmitter\n}\n\n// ─── Command Handler ─────────────────────────────────────────\n\n/**\n * Create a typed command handler. The host app registers handlers,\n * agents execute commands.\n *\n * @experimental\n *\n * @example\n * const commands = createCommandHandler<ChatCommands>()\n * commands.handle('injectPrompt', (text) => setInputValue(text))\n * commands.exec('injectPrompt', 'Hello world')\n */\nexport function createCommandHandler(): ChatCommandHandler {\n const handlers = new Map<string, (...args: any[]) => any>()\n\n return {\n handle(command, handler) {\n handlers.set(command as string, handler)\n },\n\n exec(command, ...args) {\n const handler = handlers.get(command as string)\n if (!handler) {\n console.warn(`[ChatBus] No handler registered for command: ${command as string}`)\n return undefined as any\n }\n return handler(...args)\n },\n } as ChatCommandHandler\n}\n\n// ─── Chat Bus Factory ────────────────────────────────────────\n\n/**\n * Create a complete ChatBus with events + commands.\n *\n * @experimental\n *\n * @example\n * const bus = createChatBus()\n * bus.events.on('onStreamEnd', (event) => { ... })\n * bus.commands.handle('sendPrompt', (text) => { ... })\n */\nexport function createChatBus(): ChatBus {\n return {\n events: createEventEmitter(),\n commands: createCommandHandler(),\n }\n}\n\n// ─── Scratchpad Section Merge Helper ─────────────────────────\n\n/**\n * Merge sections from a ScratchpadEvent into existing state sections.\n * Handles replace/append/upsert modes.\n *\n * @example\n * const newSections = mergeScratchpadSections(\n * currentState.sections,\n * event.sections,\n * event.sectionMode\n * )\n */\nexport function mergeScratchpadSections(\n existing: ScratchpadSection[],\n incoming: ScratchpadSection[] | undefined,\n mode: 'replace' | 'append' | 'upsert' = 'replace'\n): ScratchpadSection[] {\n if (!incoming) return existing\n\n switch (mode) {\n case 'append':\n return [...existing, ...incoming]\n\n case 'upsert': {\n const result = [...existing]\n for (const section of incoming) {\n const idx = result.findIndex((s) => s.id === section.id)\n if (idx >= 0) {\n result[idx] = section\n } else {\n result.push(section)\n }\n }\n return result\n }\n\n case 'replace':\n default:\n return incoming\n }\n}\n\n// ─── Clarification → Prompt Helper (v4.3.9) ──────────────────\n\n/**\n * Convert a ClarificationEvent into a ChatPromptConfig.\n * Universal bridge for apps receiving clarification events via SSE.\n *\n * Legacy runtime `file_id` (removed from the type in v5.0.0) is still\n * transparently migrated into `metadata.file_id` when present, so payloads\n * from older servers continue to work without upgrade pressure.\n *\n * @experimental\n * @since v4.3.9\n * @example\n * bus.events.on('onClarificationNeeded', ({ clarification }) => {\n * bus.commands.exec('showChatPrompt', clarificationToPromptConfig(clarification))\n * })\n */\n// ─── Elicitation → Prompt Helper (v5.2.0) ───────────────────\n\n/**\n * Convert an MCP `elicitation/create` payload into a `ChatPromptConfig`.\n *\n * Mapping rules :\n * - Single `boolean` property → `type: 'confirm'`\n * - Single property with `enum` of ≤4 values → `type: 'choice'` (one option per enum value)\n * - Anything else → `type: 'form'` with one field per schema property\n *\n * JSON Schema primitive types map to mcp-ui form field types :\n *\n * | JSON Schema | mcp-ui FormFieldType |\n * |---|---|\n * | `type: 'string'` | `'text'` |\n * | `type: 'string', format: 'email'` | `'email'` |\n * | `type: 'string', format: 'date'` or `'date-time'` | `'date'` |\n * | `type: 'string', enum: [...]` | `'select'` |\n * | `type: 'number' \\| 'integer'` | `'number'` |\n * | `type: 'boolean'` | `'checkbox'` |\n *\n * Unknown shapes fall through to plain text with a `helpText` warning.\n *\n * @experimental\n * @since v5.2.0\n *\n * @example\n * bus.events.on('onElicitation', ({ elicitation }) => {\n * bus.commands.exec('showChatPrompt', elicitationToPromptConfig(elicitation))\n * })\n */\nexport function elicitationToPromptConfig(event: ElicitationEvent): ChatPromptConfig {\n const propEntries = Object.entries(event.requestedSchema.properties)\n\n // Shortcut 1 : single boolean → confirm\n if (propEntries.length === 1 && propEntries[0][1].type === 'boolean') {\n return {\n type: 'confirm',\n title: event.message,\n config: {\n message: propEntries[0][1].description,\n },\n }\n }\n\n // Shortcut 2 : single enum property with ≤4 values → choice\n if (propEntries.length === 1) {\n const [, schema] = propEntries[0]\n if (schema.enum && schema.enum.length > 0 && schema.enum.length <= 4) {\n return {\n type: 'choice',\n title: event.message,\n config: {\n options: schema.enum.map((val, idx) => ({\n value: String(val),\n label: schema.enumNames?.[idx] ?? String(val),\n })),\n layout: 'vertical',\n },\n }\n }\n }\n\n // Default : full form\n const required = new Set(event.requestedSchema.required ?? [])\n const fields: FormPromptConfig['fields'] = propEntries.map(([name, schema]) => ({\n name,\n label: schema.title ?? name,\n ...schemaToFieldType(schema),\n required: required.has(name),\n helpText: schema.description,\n ...(schema.default !== undefined ? { placeholder: String(schema.default) } : {}),\n }))\n\n return {\n type: 'form',\n title: event.message,\n config: { fields },\n }\n}\n\nfunction schemaToFieldType(\n schema: ElicitationPropertySchema\n):\n | { type: FormPromptConfig['fields'][number]['type']; options?: Array<{ label: string; value: string }> }\n | { type: FormPromptConfig['fields'][number]['type']; helpText?: string } {\n // Enum → select\n if (schema.enum && schema.enum.length > 0) {\n return {\n type: 'select',\n options: schema.enum.map((val, idx) => ({\n label: schema.enumNames?.[idx] ?? String(val),\n value: String(val),\n })),\n }\n }\n\n if (schema.type === 'boolean') return { type: 'checkbox' }\n if (schema.type === 'number' || schema.type === 'integer') return { type: 'number' }\n if (schema.type === 'string') {\n if (schema.format === 'email') return { type: 'email' }\n if (schema.format === 'date' || schema.format === 'date-time') return { type: 'date' }\n return { type: 'text' }\n }\n\n // Unknown primitive — fall back to text with a warning\n console.warn(\n `[MCP-UI] elicitationToPromptConfig: unsupported schema type \"${(schema as { type?: string }).type}\", falling back to text.`\n )\n return { type: 'text' }\n}\n\nexport function clarificationToPromptConfig(\n event: ClarificationEvent\n): ChatPromptConfig {\n return {\n type: 'choice',\n title: event.question,\n config: {\n options: event.options.map((opt) => {\n const merged: Record<string, unknown> = { ...(opt.metadata ?? {}) }\n // Runtime fallback for legacy payloads that still carry file_id at the top level.\n const legacyFileId = (opt as { file_id?: number }).file_id\n if (legacyFileId !== undefined && merged.file_id === undefined) {\n merged.file_id = legacyFileId\n }\n return {\n value: opt.value,\n label: opt.label,\n // Only include metadata if non-empty (keeps payloads clean)\n ...(Object.keys(merged).length > 0 ? { metadata: merged } : {}),\n }\n }),\n layout: 'vertical',\n },\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-bus.cjs","sources":["../../src/services/chat-bus.ts"],"sourcesContent":["/**\n * Chat Bus — Event Emitter + Command Handler\n * v2.4.0: Core primitives for the chat event/command bus\n *\n * @experimental — This API may change without major bump until v2.5.0.\n */\n\nimport type {\n ChatEventEmitter,\n ChatCommandHandler,\n ChatBus,\n EventSubscribeOptions,\n ScratchpadSection,\n ClarificationEvent,\n ElicitationEvent,\n ElicitationPropertySchema,\n ChatPromptConfig,\n FormPromptConfig,\n} from '../types/chat-bus'\n\n// ─── Event Emitter ───────────────────────────────────────────\n\ninterface Listener<F extends (...args: any[]) => any> {\n handler: F\n options?: EventSubscribeOptions\n throttledHandler?: F\n}\n\n/**\n * Create a typed event emitter with throttle and streamKey filtering support.\n *\n * @experimental\n *\n * @example\n * const emitter = createEventEmitter<ChatEvents>()\n * const unsub = emitter.on('onToken', (event) => console.log(event.token), { throttle: 100 })\n * emitter.emit('onToken', { streamKey: 'abc', token: 'hello' })\n * unsub()\n */\nexport function createEventEmitter(): ChatEventEmitter {\n const listeners = new Map<string, Set<Listener<any>>>()\n\n interface ThrottledFn<F> {\n fn: F\n cancel: () => void\n }\n\n function createThrottled<F extends (...args: any[]) => void>(fn: F, ms: number): ThrottledFn<F> {\n let lastCall = 0\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastArgs: any[] | null = null\n let cancelled = false\n\n const throttled = ((...args: any[]) => {\n if (cancelled) return\n lastArgs = args\n const now = Date.now()\n const remaining = ms - (now - lastCall)\n\n if (remaining <= 0) {\n if (timer) { clearTimeout(timer); timer = null }\n lastCall = now\n fn(...args)\n } else if (!timer) {\n timer = setTimeout(() => {\n lastCall = Date.now()\n timer = null\n if (lastArgs && !cancelled) {\n try { fn(...lastArgs) } catch (err) { console.error('[ChatBus] Error in throttled handler:', err) }\n }\n }, remaining)\n }\n }) as F\n\n return {\n fn: throttled,\n cancel: () => { cancelled = true; if (timer) { clearTimeout(timer); timer = null } },\n }\n }\n\n return {\n on(event, handler, options) {\n if (!listeners.has(event as string)) {\n listeners.set(event as string, new Set())\n }\n\n const listener: Listener<typeof handler> = { handler, options }\n\n // Apply throttle if requested\n let throttleHandle: ThrottledFn<typeof handler> | null = null\n if (options?.throttle && options.throttle > 0) {\n throttleHandle = createThrottled(handler, options.throttle)\n listener.throttledHandler = throttleHandle.fn\n }\n\n listeners.get(event as string)!.add(listener)\n\n // Return unsubscribe function — cancels pending throttle timers\n return () => {\n throttleHandle?.cancel()\n listeners.get(event as string)?.delete(listener)\n }\n },\n\n emit(event, ...args) {\n const set = listeners.get(event as string)\n if (!set) return\n\n for (const listener of set) {\n // StreamKey filtering: skip if listener wants a specific streamKey\n // For most events args[0] has streamKey; for onCustomEvent args[1] has it\n if (listener.options?.streamKey) {\n let streamKeyArg: unknown\n for (const arg of args) {\n if (arg && typeof arg === 'object' && 'streamKey' in (arg as any)) {\n streamKeyArg = (arg as any).streamKey\n break\n }\n }\n if (streamKeyArg !== undefined && streamKeyArg !== listener.options.streamKey) continue\n }\n\n const fn = listener.throttledHandler || listener.handler\n try {\n fn(...args)\n } catch (err) {\n console.error(`[ChatBus] Error in ${event as string} handler:`, err)\n }\n }\n },\n\n clear() {\n listeners.clear()\n },\n } as ChatEventEmitter\n}\n\n// ─── Command Handler ─────────────────────────────────────────\n\n/**\n * Create a typed command handler. The host app registers handlers,\n * agents execute commands.\n *\n * @experimental\n *\n * @example\n * const commands = createCommandHandler<ChatCommands>()\n * commands.handle('injectPrompt', (text) => setInputValue(text))\n * commands.exec('injectPrompt', 'Hello world')\n */\nexport function createCommandHandler(): ChatCommandHandler {\n const handlers = new Map<string, (...args: any[]) => any>()\n\n return {\n handle(command, handler) {\n handlers.set(command as string, handler)\n },\n\n exec(command, ...args) {\n const handler = handlers.get(command as string)\n if (!handler) {\n console.warn(`[ChatBus] No handler registered for command: ${command as string}`)\n return undefined as any\n }\n return handler(...args)\n },\n } as ChatCommandHandler\n}\n\n// ─── Chat Bus Factory ────────────────────────────────────────\n\n/**\n * Create a complete ChatBus with events + commands.\n *\n * @experimental\n *\n * @example\n * const bus = createChatBus()\n * bus.events.on('onStreamEnd', (event) => { ... })\n * bus.commands.handle('sendPrompt', (text) => { ... })\n */\nexport function createChatBus(): ChatBus {\n return {\n events: createEventEmitter(),\n commands: createCommandHandler(),\n }\n}\n\n// ─── Scratchpad Section Merge Helper ─────────────────────────\n\n/**\n * Merge sections from a ScratchpadEvent into existing state sections.\n * Handles replace/append/upsert modes.\n *\n * @example\n * const newSections = mergeScratchpadSections(\n * currentState.sections,\n * event.sections,\n * event.sectionMode\n * )\n */\nexport function mergeScratchpadSections(\n existing: ScratchpadSection[],\n incoming: ScratchpadSection[] | undefined,\n mode: 'replace' | 'append' | 'upsert' = 'replace'\n): ScratchpadSection[] {\n if (!incoming) return existing\n\n switch (mode) {\n case 'append':\n return [...existing, ...incoming]\n\n case 'upsert': {\n const result = [...existing]\n for (const section of incoming) {\n const idx = result.findIndex((s) => s.id === section.id)\n if (idx >= 0) {\n result[idx] = section\n } else {\n result.push(section)\n }\n }\n return result\n }\n\n case 'replace':\n default:\n return incoming\n }\n}\n\n// ─── Clarification → Prompt Helper (v4.3.9) ──────────────────\n\n/**\n * Convert a ClarificationEvent into a ChatPromptConfig.\n * Universal bridge for apps receiving clarification events via SSE.\n *\n * Legacy runtime `file_id` (removed from the type in v5.0.0) is still\n * transparently migrated into `metadata.file_id` when present, so payloads\n * from older servers continue to work without upgrade pressure.\n *\n * @experimental\n * @since v4.3.9\n * @example\n * bus.events.on('onClarificationNeeded', ({ clarification }) => {\n * bus.commands.exec('showChatPrompt', clarificationToPromptConfig(clarification))\n * })\n */\n// ─── Elicitation → Prompt Helper (v5.2.0) ───────────────────\n\n/**\n * Convert an MCP `elicitation/create` payload into a `ChatPromptConfig`.\n *\n * Mapping rules :\n * - Single `boolean` property → `type: 'confirm'`\n * - Single property with `enum` of ≤4 values → `type: 'choice'` (one option per enum value)\n * - Anything else → `type: 'form'` with one field per schema property\n *\n * JSON Schema primitive types map to mcp-ui form field types :\n *\n * | JSON Schema | mcp-ui FormFieldType |\n * |---|---|\n * | `type: 'string'` | `'text'` |\n * | `type: 'string', format: 'email'` | `'email'` |\n * | `type: 'string', format: 'date'` or `'date-time'` | `'date'` |\n * | `type: 'string', enum: [...]` | `'select'` |\n * | `type: 'number' \\| 'integer'` | `'number'` |\n * | `type: 'boolean'` | `'checkbox'` |\n *\n * Unknown shapes fall through to plain text with a `helpText` warning.\n *\n * @experimental\n * @since v5.2.0\n *\n * @example\n * bus.events.on('onElicitation', ({ elicitation }) => {\n * bus.commands.exec('showChatPrompt', elicitationToPromptConfig(elicitation))\n * })\n */\nexport function elicitationToPromptConfig(event: ElicitationEvent): ChatPromptConfig {\n const propEntries = Object.entries(event.requestedSchema.properties)\n\n // Shortcut 1 : single boolean → confirm\n if (propEntries.length === 1 && propEntries[0][1].type === 'boolean') {\n return {\n type: 'confirm',\n title: event.message,\n config: {\n message: propEntries[0][1].description,\n },\n }\n }\n\n // Shortcut 2 : single enum property with ≤4 values → choice\n if (propEntries.length === 1) {\n const [, schema] = propEntries[0]\n if (schema.enum && schema.enum.length > 0 && schema.enum.length <= 4) {\n return {\n type: 'choice',\n title: event.message,\n config: {\n options: schema.enum.map((val, idx) => ({\n value: String(val),\n label: schema.enumNames?.[idx] ?? String(val),\n })),\n layout: 'vertical',\n },\n }\n }\n }\n\n // Default : full form\n const required = new Set(event.requestedSchema.required ?? [])\n const fields: FormPromptConfig['fields'] = propEntries.map(([name, schema]) => ({\n name,\n label: schema.title ?? name,\n ...schemaToFieldType(schema),\n required: required.has(name),\n helpText: schema.description,\n ...(schema.default !== undefined ? { placeholder: String(schema.default) } : {}),\n }))\n\n return {\n type: 'form',\n title: event.message,\n config: { fields },\n }\n}\n\nfunction schemaToFieldType(\n schema: ElicitationPropertySchema\n):\n | { type: FormPromptConfig['fields'][number]['type']; options?: Array<{ label: string; value: string }> }\n | { type: FormPromptConfig['fields'][number]['type']; helpText?: string } {\n // Enum → select\n if (schema.enum && schema.enum.length > 0) {\n return {\n type: 'select',\n options: schema.enum.map((val, idx) => ({\n label: schema.enumNames?.[idx] ?? String(val),\n value: String(val),\n })),\n }\n }\n\n if (schema.type === 'boolean') return { type: 'checkbox' }\n if (schema.type === 'number' || schema.type === 'integer') return { type: 'number' }\n if (schema.type === 'string') {\n if (schema.format === 'email') return { type: 'email' }\n if (schema.format === 'date' || schema.format === 'date-time') return { type: 'date' }\n return { type: 'text' }\n }\n\n // Unknown primitive — fall back to text with a warning\n console.warn(\n `[MCP-UI] elicitationToPromptConfig: unsupported schema type \"${(schema as { type?: string }).type}\", falling back to text.`\n )\n return { type: 'text' }\n}\n\nexport function clarificationToPromptConfig(\n event: ClarificationEvent\n): ChatPromptConfig {\n return {\n type: 'choice',\n title: event.question,\n config: {\n options: event.options.map((opt) => {\n const merged: Record<string, unknown> = { ...(opt.metadata ?? {}) }\n // Runtime fallback for legacy payloads that still carry file_id at the top level.\n const legacyFileId = (opt as { file_id?: number }).file_id\n if (legacyFileId !== undefined && merged.file_id === undefined) {\n merged.file_id = legacyFileId\n }\n return {\n value: opt.value,\n label: opt.label,\n // Only include metadata if non-empty (keeps payloads clean)\n ...(Object.keys(merged).length > 0 ? { metadata: merged } : {}),\n }\n }),\n layout: 'vertical',\n },\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bus.d.ts","sourceRoot":"","sources":["../../src/services/chat-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAGV,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EAEP,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAEhB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAA;AAU1B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAgGrD;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,CAiBzD;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAKvC;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,QAAQ,EAAE,iBAAiB,EAAE,GAAG,SAAS,EACzC,IAAI,GAAE,SAAS,GAAG,QAAQ,GAAG,QAAoB,GAChD,iBAAiB,EAAE,CAwBrB;AAID;;;;;;;;;;;;;;GAcG;AAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAgDnF;AAiCD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kBAAkB,GACxB,gBAAgB,CAsBlB"}
1
+ {"version":3,"file":"chat-bus.d.ts","sourceRoot":"","sources":["../../src/services/chat-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EAEP,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAEhB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAA;AAU1B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAgGrD;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,CAiBzD;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAKvC;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,QAAQ,EAAE,iBAAiB,EAAE,GAAG,SAAS,EACzC,IAAI,GAAE,SAAS,GAAG,QAAQ,GAAG,QAAoB,GAChD,iBAAiB,EAAE,CAwBrB;AAID;;;;;;;;;;;;;;GAcG;AAGH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAgDnF;AAiCD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kBAAkB,GACxB,gBAAgB,CAsBlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bus.js","sources":["../../src/services/chat-bus.ts"],"sourcesContent":["/**\n * Chat Bus — Event Emitter + Command Handler\n * v2.4.0: Core primitives for the chat event/command bus\n *\n * @experimental — This API may change without major bump until v2.5.0.\n */\n\nimport type {\n ChatEvents,\n ChatCommands,\n ChatEventEmitter,\n ChatCommandHandler,\n ChatBus,\n EventSubscribeOptions,\n ScratchpadSection,\n ClarificationEvent,\n ElicitationEvent,\n ElicitationPropertySchema,\n ChatPromptConfig,\n FormPromptConfig,\n} from '../types/chat-bus'\n\n// ─── Event Emitter ───────────────────────────────────────────\n\ninterface Listener<F extends (...args: any[]) => any> {\n handler: F\n options?: EventSubscribeOptions\n throttledHandler?: F\n}\n\n/**\n * Create a typed event emitter with throttle and streamKey filtering support.\n *\n * @experimental\n *\n * @example\n * const emitter = createEventEmitter<ChatEvents>()\n * const unsub = emitter.on('onToken', (event) => console.log(event.token), { throttle: 100 })\n * emitter.emit('onToken', { streamKey: 'abc', token: 'hello' })\n * unsub()\n */\nexport function createEventEmitter(): ChatEventEmitter {\n const listeners = new Map<string, Set<Listener<any>>>()\n\n interface ThrottledFn<F> {\n fn: F\n cancel: () => void\n }\n\n function createThrottled<F extends (...args: any[]) => void>(fn: F, ms: number): ThrottledFn<F> {\n let lastCall = 0\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastArgs: any[] | null = null\n let cancelled = false\n\n const throttled = ((...args: any[]) => {\n if (cancelled) return\n lastArgs = args\n const now = Date.now()\n const remaining = ms - (now - lastCall)\n\n if (remaining <= 0) {\n if (timer) { clearTimeout(timer); timer = null }\n lastCall = now\n fn(...args)\n } else if (!timer) {\n timer = setTimeout(() => {\n lastCall = Date.now()\n timer = null\n if (lastArgs && !cancelled) {\n try { fn(...lastArgs) } catch (err) { console.error('[ChatBus] Error in throttled handler:', err) }\n }\n }, remaining)\n }\n }) as F\n\n return {\n fn: throttled,\n cancel: () => { cancelled = true; if (timer) { clearTimeout(timer); timer = null } },\n }\n }\n\n return {\n on(event, handler, options) {\n if (!listeners.has(event as string)) {\n listeners.set(event as string, new Set())\n }\n\n const listener: Listener<typeof handler> = { handler, options }\n\n // Apply throttle if requested\n let throttleHandle: ThrottledFn<typeof handler> | null = null\n if (options?.throttle && options.throttle > 0) {\n throttleHandle = createThrottled(handler, options.throttle)\n listener.throttledHandler = throttleHandle.fn\n }\n\n listeners.get(event as string)!.add(listener)\n\n // Return unsubscribe function — cancels pending throttle timers\n return () => {\n throttleHandle?.cancel()\n listeners.get(event as string)?.delete(listener)\n }\n },\n\n emit(event, ...args) {\n const set = listeners.get(event as string)\n if (!set) return\n\n for (const listener of set) {\n // StreamKey filtering: skip if listener wants a specific streamKey\n // For most events args[0] has streamKey; for onCustomEvent args[1] has it\n if (listener.options?.streamKey) {\n let streamKeyArg: unknown\n for (const arg of args) {\n if (arg && typeof arg === 'object' && 'streamKey' in (arg as any)) {\n streamKeyArg = (arg as any).streamKey\n break\n }\n }\n if (streamKeyArg !== undefined && streamKeyArg !== listener.options.streamKey) continue\n }\n\n const fn = listener.throttledHandler || listener.handler\n try {\n fn(...args)\n } catch (err) {\n console.error(`[ChatBus] Error in ${event as string} handler:`, err)\n }\n }\n },\n\n clear() {\n listeners.clear()\n },\n } as ChatEventEmitter\n}\n\n// ─── Command Handler ─────────────────────────────────────────\n\n/**\n * Create a typed command handler. The host app registers handlers,\n * agents execute commands.\n *\n * @experimental\n *\n * @example\n * const commands = createCommandHandler<ChatCommands>()\n * commands.handle('injectPrompt', (text) => setInputValue(text))\n * commands.exec('injectPrompt', 'Hello world')\n */\nexport function createCommandHandler(): ChatCommandHandler {\n const handlers = new Map<string, (...args: any[]) => any>()\n\n return {\n handle(command, handler) {\n handlers.set(command as string, handler)\n },\n\n exec(command, ...args) {\n const handler = handlers.get(command as string)\n if (!handler) {\n console.warn(`[ChatBus] No handler registered for command: ${command as string}`)\n return undefined as any\n }\n return handler(...args)\n },\n } as ChatCommandHandler\n}\n\n// ─── Chat Bus Factory ────────────────────────────────────────\n\n/**\n * Create a complete ChatBus with events + commands.\n *\n * @experimental\n *\n * @example\n * const bus = createChatBus()\n * bus.events.on('onStreamEnd', (event) => { ... })\n * bus.commands.handle('sendPrompt', (text) => { ... })\n */\nexport function createChatBus(): ChatBus {\n return {\n events: createEventEmitter(),\n commands: createCommandHandler(),\n }\n}\n\n// ─── Scratchpad Section Merge Helper ─────────────────────────\n\n/**\n * Merge sections from a ScratchpadEvent into existing state sections.\n * Handles replace/append/upsert modes.\n *\n * @example\n * const newSections = mergeScratchpadSections(\n * currentState.sections,\n * event.sections,\n * event.sectionMode\n * )\n */\nexport function mergeScratchpadSections(\n existing: ScratchpadSection[],\n incoming: ScratchpadSection[] | undefined,\n mode: 'replace' | 'append' | 'upsert' = 'replace'\n): ScratchpadSection[] {\n if (!incoming) return existing\n\n switch (mode) {\n case 'append':\n return [...existing, ...incoming]\n\n case 'upsert': {\n const result = [...existing]\n for (const section of incoming) {\n const idx = result.findIndex((s) => s.id === section.id)\n if (idx >= 0) {\n result[idx] = section\n } else {\n result.push(section)\n }\n }\n return result\n }\n\n case 'replace':\n default:\n return incoming\n }\n}\n\n// ─── Clarification → Prompt Helper (v4.3.9) ──────────────────\n\n/**\n * Convert a ClarificationEvent into a ChatPromptConfig.\n * Universal bridge for apps receiving clarification events via SSE.\n *\n * Legacy runtime `file_id` (removed from the type in v5.0.0) is still\n * transparently migrated into `metadata.file_id` when present, so payloads\n * from older servers continue to work without upgrade pressure.\n *\n * @experimental\n * @since v4.3.9\n * @example\n * bus.events.on('onClarificationNeeded', ({ clarification }) => {\n * bus.commands.exec('showChatPrompt', clarificationToPromptConfig(clarification))\n * })\n */\n// ─── Elicitation → Prompt Helper (v5.2.0) ───────────────────\n\n/**\n * Convert an MCP `elicitation/create` payload into a `ChatPromptConfig`.\n *\n * Mapping rules :\n * - Single `boolean` property → `type: 'confirm'`\n * - Single property with `enum` of ≤4 values → `type: 'choice'` (one option per enum value)\n * - Anything else → `type: 'form'` with one field per schema property\n *\n * JSON Schema primitive types map to mcp-ui form field types :\n *\n * | JSON Schema | mcp-ui FormFieldType |\n * |---|---|\n * | `type: 'string'` | `'text'` |\n * | `type: 'string', format: 'email'` | `'email'` |\n * | `type: 'string', format: 'date'` or `'date-time'` | `'date'` |\n * | `type: 'string', enum: [...]` | `'select'` |\n * | `type: 'number' \\| 'integer'` | `'number'` |\n * | `type: 'boolean'` | `'checkbox'` |\n *\n * Unknown shapes fall through to plain text with a `helpText` warning.\n *\n * @experimental\n * @since v5.2.0\n *\n * @example\n * bus.events.on('onElicitation', ({ elicitation }) => {\n * bus.commands.exec('showChatPrompt', elicitationToPromptConfig(elicitation))\n * })\n */\nexport function elicitationToPromptConfig(event: ElicitationEvent): ChatPromptConfig {\n const propEntries = Object.entries(event.requestedSchema.properties)\n\n // Shortcut 1 : single boolean → confirm\n if (propEntries.length === 1 && propEntries[0][1].type === 'boolean') {\n return {\n type: 'confirm',\n title: event.message,\n config: {\n message: propEntries[0][1].description,\n },\n }\n }\n\n // Shortcut 2 : single enum property with ≤4 values → choice\n if (propEntries.length === 1) {\n const [, schema] = propEntries[0]\n if (schema.enum && schema.enum.length > 0 && schema.enum.length <= 4) {\n return {\n type: 'choice',\n title: event.message,\n config: {\n options: schema.enum.map((val, idx) => ({\n value: String(val),\n label: schema.enumNames?.[idx] ?? String(val),\n })),\n layout: 'vertical',\n },\n }\n }\n }\n\n // Default : full form\n const required = new Set(event.requestedSchema.required ?? [])\n const fields: FormPromptConfig['fields'] = propEntries.map(([name, schema]) => ({\n name,\n label: schema.title ?? name,\n ...schemaToFieldType(schema),\n required: required.has(name),\n helpText: schema.description,\n ...(schema.default !== undefined ? { placeholder: String(schema.default) } : {}),\n }))\n\n return {\n type: 'form',\n title: event.message,\n config: { fields },\n }\n}\n\nfunction schemaToFieldType(\n schema: ElicitationPropertySchema\n):\n | { type: FormPromptConfig['fields'][number]['type']; options?: Array<{ label: string; value: string }> }\n | { type: FormPromptConfig['fields'][number]['type']; helpText?: string } {\n // Enum → select\n if (schema.enum && schema.enum.length > 0) {\n return {\n type: 'select',\n options: schema.enum.map((val, idx) => ({\n label: schema.enumNames?.[idx] ?? String(val),\n value: String(val),\n })),\n }\n }\n\n if (schema.type === 'boolean') return { type: 'checkbox' }\n if (schema.type === 'number' || schema.type === 'integer') return { type: 'number' }\n if (schema.type === 'string') {\n if (schema.format === 'email') return { type: 'email' }\n if (schema.format === 'date' || schema.format === 'date-time') return { type: 'date' }\n return { type: 'text' }\n }\n\n // Unknown primitive — fall back to text with a warning\n console.warn(\n `[MCP-UI] elicitationToPromptConfig: unsupported schema type \"${(schema as { type?: string }).type}\", falling back to text.`\n )\n return { type: 'text' }\n}\n\nexport function clarificationToPromptConfig(\n event: ClarificationEvent\n): ChatPromptConfig {\n return {\n type: 'choice',\n title: event.question,\n config: {\n options: event.options.map((opt) => {\n const merged: Record<string, unknown> = { ...(opt.metadata ?? {}) }\n // Runtime fallback for legacy payloads that still carry file_id at the top level.\n const legacyFileId = (opt as { file_id?: number }).file_id\n if (legacyFileId !== undefined && merged.file_id === undefined) {\n merged.file_id = legacyFileId\n }\n return {\n value: opt.value,\n label: opt.label,\n // Only include metadata if non-empty (keeps payloads clean)\n ...(Object.keys(merged).length > 0 ? { metadata: merged } : {}),\n }\n }),\n layout: 'vertical',\n },\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-bus.js","sources":["../../src/services/chat-bus.ts"],"sourcesContent":["/**\n * Chat Bus — Event Emitter + Command Handler\n * v2.4.0: Core primitives for the chat event/command bus\n *\n * @experimental — This API may change without major bump until v2.5.0.\n */\n\nimport type {\n ChatEventEmitter,\n ChatCommandHandler,\n ChatBus,\n EventSubscribeOptions,\n ScratchpadSection,\n ClarificationEvent,\n ElicitationEvent,\n ElicitationPropertySchema,\n ChatPromptConfig,\n FormPromptConfig,\n} from '../types/chat-bus'\n\n// ─── Event Emitter ───────────────────────────────────────────\n\ninterface Listener<F extends (...args: any[]) => any> {\n handler: F\n options?: EventSubscribeOptions\n throttledHandler?: F\n}\n\n/**\n * Create a typed event emitter with throttle and streamKey filtering support.\n *\n * @experimental\n *\n * @example\n * const emitter = createEventEmitter<ChatEvents>()\n * const unsub = emitter.on('onToken', (event) => console.log(event.token), { throttle: 100 })\n * emitter.emit('onToken', { streamKey: 'abc', token: 'hello' })\n * unsub()\n */\nexport function createEventEmitter(): ChatEventEmitter {\n const listeners = new Map<string, Set<Listener<any>>>()\n\n interface ThrottledFn<F> {\n fn: F\n cancel: () => void\n }\n\n function createThrottled<F extends (...args: any[]) => void>(fn: F, ms: number): ThrottledFn<F> {\n let lastCall = 0\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastArgs: any[] | null = null\n let cancelled = false\n\n const throttled = ((...args: any[]) => {\n if (cancelled) return\n lastArgs = args\n const now = Date.now()\n const remaining = ms - (now - lastCall)\n\n if (remaining <= 0) {\n if (timer) { clearTimeout(timer); timer = null }\n lastCall = now\n fn(...args)\n } else if (!timer) {\n timer = setTimeout(() => {\n lastCall = Date.now()\n timer = null\n if (lastArgs && !cancelled) {\n try { fn(...lastArgs) } catch (err) { console.error('[ChatBus] Error in throttled handler:', err) }\n }\n }, remaining)\n }\n }) as F\n\n return {\n fn: throttled,\n cancel: () => { cancelled = true; if (timer) { clearTimeout(timer); timer = null } },\n }\n }\n\n return {\n on(event, handler, options) {\n if (!listeners.has(event as string)) {\n listeners.set(event as string, new Set())\n }\n\n const listener: Listener<typeof handler> = { handler, options }\n\n // Apply throttle if requested\n let throttleHandle: ThrottledFn<typeof handler> | null = null\n if (options?.throttle && options.throttle > 0) {\n throttleHandle = createThrottled(handler, options.throttle)\n listener.throttledHandler = throttleHandle.fn\n }\n\n listeners.get(event as string)!.add(listener)\n\n // Return unsubscribe function — cancels pending throttle timers\n return () => {\n throttleHandle?.cancel()\n listeners.get(event as string)?.delete(listener)\n }\n },\n\n emit(event, ...args) {\n const set = listeners.get(event as string)\n if (!set) return\n\n for (const listener of set) {\n // StreamKey filtering: skip if listener wants a specific streamKey\n // For most events args[0] has streamKey; for onCustomEvent args[1] has it\n if (listener.options?.streamKey) {\n let streamKeyArg: unknown\n for (const arg of args) {\n if (arg && typeof arg === 'object' && 'streamKey' in (arg as any)) {\n streamKeyArg = (arg as any).streamKey\n break\n }\n }\n if (streamKeyArg !== undefined && streamKeyArg !== listener.options.streamKey) continue\n }\n\n const fn = listener.throttledHandler || listener.handler\n try {\n fn(...args)\n } catch (err) {\n console.error(`[ChatBus] Error in ${event as string} handler:`, err)\n }\n }\n },\n\n clear() {\n listeners.clear()\n },\n } as ChatEventEmitter\n}\n\n// ─── Command Handler ─────────────────────────────────────────\n\n/**\n * Create a typed command handler. The host app registers handlers,\n * agents execute commands.\n *\n * @experimental\n *\n * @example\n * const commands = createCommandHandler<ChatCommands>()\n * commands.handle('injectPrompt', (text) => setInputValue(text))\n * commands.exec('injectPrompt', 'Hello world')\n */\nexport function createCommandHandler(): ChatCommandHandler {\n const handlers = new Map<string, (...args: any[]) => any>()\n\n return {\n handle(command, handler) {\n handlers.set(command as string, handler)\n },\n\n exec(command, ...args) {\n const handler = handlers.get(command as string)\n if (!handler) {\n console.warn(`[ChatBus] No handler registered for command: ${command as string}`)\n return undefined as any\n }\n return handler(...args)\n },\n } as ChatCommandHandler\n}\n\n// ─── Chat Bus Factory ────────────────────────────────────────\n\n/**\n * Create a complete ChatBus with events + commands.\n *\n * @experimental\n *\n * @example\n * const bus = createChatBus()\n * bus.events.on('onStreamEnd', (event) => { ... })\n * bus.commands.handle('sendPrompt', (text) => { ... })\n */\nexport function createChatBus(): ChatBus {\n return {\n events: createEventEmitter(),\n commands: createCommandHandler(),\n }\n}\n\n// ─── Scratchpad Section Merge Helper ─────────────────────────\n\n/**\n * Merge sections from a ScratchpadEvent into existing state sections.\n * Handles replace/append/upsert modes.\n *\n * @example\n * const newSections = mergeScratchpadSections(\n * currentState.sections,\n * event.sections,\n * event.sectionMode\n * )\n */\nexport function mergeScratchpadSections(\n existing: ScratchpadSection[],\n incoming: ScratchpadSection[] | undefined,\n mode: 'replace' | 'append' | 'upsert' = 'replace'\n): ScratchpadSection[] {\n if (!incoming) return existing\n\n switch (mode) {\n case 'append':\n return [...existing, ...incoming]\n\n case 'upsert': {\n const result = [...existing]\n for (const section of incoming) {\n const idx = result.findIndex((s) => s.id === section.id)\n if (idx >= 0) {\n result[idx] = section\n } else {\n result.push(section)\n }\n }\n return result\n }\n\n case 'replace':\n default:\n return incoming\n }\n}\n\n// ─── Clarification → Prompt Helper (v4.3.9) ──────────────────\n\n/**\n * Convert a ClarificationEvent into a ChatPromptConfig.\n * Universal bridge for apps receiving clarification events via SSE.\n *\n * Legacy runtime `file_id` (removed from the type in v5.0.0) is still\n * transparently migrated into `metadata.file_id` when present, so payloads\n * from older servers continue to work without upgrade pressure.\n *\n * @experimental\n * @since v4.3.9\n * @example\n * bus.events.on('onClarificationNeeded', ({ clarification }) => {\n * bus.commands.exec('showChatPrompt', clarificationToPromptConfig(clarification))\n * })\n */\n// ─── Elicitation → Prompt Helper (v5.2.0) ───────────────────\n\n/**\n * Convert an MCP `elicitation/create` payload into a `ChatPromptConfig`.\n *\n * Mapping rules :\n * - Single `boolean` property → `type: 'confirm'`\n * - Single property with `enum` of ≤4 values → `type: 'choice'` (one option per enum value)\n * - Anything else → `type: 'form'` with one field per schema property\n *\n * JSON Schema primitive types map to mcp-ui form field types :\n *\n * | JSON Schema | mcp-ui FormFieldType |\n * |---|---|\n * | `type: 'string'` | `'text'` |\n * | `type: 'string', format: 'email'` | `'email'` |\n * | `type: 'string', format: 'date'` or `'date-time'` | `'date'` |\n * | `type: 'string', enum: [...]` | `'select'` |\n * | `type: 'number' \\| 'integer'` | `'number'` |\n * | `type: 'boolean'` | `'checkbox'` |\n *\n * Unknown shapes fall through to plain text with a `helpText` warning.\n *\n * @experimental\n * @since v5.2.0\n *\n * @example\n * bus.events.on('onElicitation', ({ elicitation }) => {\n * bus.commands.exec('showChatPrompt', elicitationToPromptConfig(elicitation))\n * })\n */\nexport function elicitationToPromptConfig(event: ElicitationEvent): ChatPromptConfig {\n const propEntries = Object.entries(event.requestedSchema.properties)\n\n // Shortcut 1 : single boolean → confirm\n if (propEntries.length === 1 && propEntries[0][1].type === 'boolean') {\n return {\n type: 'confirm',\n title: event.message,\n config: {\n message: propEntries[0][1].description,\n },\n }\n }\n\n // Shortcut 2 : single enum property with ≤4 values → choice\n if (propEntries.length === 1) {\n const [, schema] = propEntries[0]\n if (schema.enum && schema.enum.length > 0 && schema.enum.length <= 4) {\n return {\n type: 'choice',\n title: event.message,\n config: {\n options: schema.enum.map((val, idx) => ({\n value: String(val),\n label: schema.enumNames?.[idx] ?? String(val),\n })),\n layout: 'vertical',\n },\n }\n }\n }\n\n // Default : full form\n const required = new Set(event.requestedSchema.required ?? [])\n const fields: FormPromptConfig['fields'] = propEntries.map(([name, schema]) => ({\n name,\n label: schema.title ?? name,\n ...schemaToFieldType(schema),\n required: required.has(name),\n helpText: schema.description,\n ...(schema.default !== undefined ? { placeholder: String(schema.default) } : {}),\n }))\n\n return {\n type: 'form',\n title: event.message,\n config: { fields },\n }\n}\n\nfunction schemaToFieldType(\n schema: ElicitationPropertySchema\n):\n | { type: FormPromptConfig['fields'][number]['type']; options?: Array<{ label: string; value: string }> }\n | { type: FormPromptConfig['fields'][number]['type']; helpText?: string } {\n // Enum → select\n if (schema.enum && schema.enum.length > 0) {\n return {\n type: 'select',\n options: schema.enum.map((val, idx) => ({\n label: schema.enumNames?.[idx] ?? String(val),\n value: String(val),\n })),\n }\n }\n\n if (schema.type === 'boolean') return { type: 'checkbox' }\n if (schema.type === 'number' || schema.type === 'integer') return { type: 'number' }\n if (schema.type === 'string') {\n if (schema.format === 'email') return { type: 'email' }\n if (schema.format === 'date' || schema.format === 'date-time') return { type: 'date' }\n return { type: 'text' }\n }\n\n // Unknown primitive — fall back to text with a warning\n console.warn(\n `[MCP-UI] elicitationToPromptConfig: unsupported schema type \"${(schema as { type?: string }).type}\", falling back to text.`\n )\n return { type: 'text' }\n}\n\nexport function clarificationToPromptConfig(\n event: ClarificationEvent\n): ChatPromptConfig {\n return {\n type: 'choice',\n title: event.question,\n config: {\n options: event.options.map((opt) => {\n const merged: Record<string, unknown> = { ...(opt.metadata ?? {}) }\n // Runtime fallback for legacy payloads that still carry file_id at the top level.\n const legacyFileId = (opt as { file_id?: number }).file_id\n if (legacyFileId !== undefined && merged.file_id === undefined) {\n merged.file_id = legacyFileId\n }\n return {\n value: opt.value,\n label: opt.label,\n // Only include metadata if non-empty (keeps payloads clean)\n ...(Object.keys(merged).length > 0 ? { metadata: merged } : {}),\n }\n }),\n layout: 'vertical',\n },\n }\n}\n"],"names":[],"mappings":"AAuCO,SAAS,qBAAuC;AACrD,QAAM,gCAAgB,IAAA;AAOtB,WAAS,gBAAoD,IAAO,IAA4B;AAC9F,QAAI,WAAW;AACf,QAAI,QAA8C;AAClD,QAAI,WAAyB;AAC7B,QAAI,YAAY;AAEhB,UAAM,aAAa,IAAI,SAAgB;AACrC,UAAI,UAAW;AACf,iBAAW;AACX,YAAM,MAAM,KAAK,IAAA;AACjB,YAAM,YAAY,MAAM,MAAM;AAE9B,UAAI,aAAa,GAAG;AAClB,YAAI,OAAO;AAAE,uBAAa,KAAK;AAAG,kBAAQ;AAAA,QAAK;AAC/C,mBAAW;AACX,WAAG,GAAG,IAAI;AAAA,MACZ,WAAW,CAAC,OAAO;AACjB,gBAAQ,WAAW,MAAM;AACvB,qBAAW,KAAK,IAAA;AAChB,kBAAQ;AACR,cAAI,YAAY,CAAC,WAAW;AAC1B,gBAAI;AAAE,iBAAG,GAAG,QAAQ;AAAA,YAAE,SAAS,KAAK;AAAE,sBAAQ,MAAM,yCAAyC,GAAG;AAAA,YAAE;AAAA,UACpG;AAAA,QACF,GAAG,SAAS;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,MAAM;AAAE,oBAAY;AAAM,YAAI,OAAO;AAAE,uBAAa,KAAK;AAAG,kBAAQ;AAAA,QAAK;AAAA,MAAE;AAAA,IAAA;AAAA,EAEvF;AAEA,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,SAAS;AAC1B,UAAI,CAAC,UAAU,IAAI,KAAe,GAAG;AACnC,kBAAU,IAAI,OAAiB,oBAAI,IAAA,CAAK;AAAA,MAC1C;AAEA,YAAM,WAAqC,EAAE,SAAS,QAAA;AAGtD,UAAI,iBAAqD;AACzD,WAAI,mCAAS,aAAY,QAAQ,WAAW,GAAG;AAC7C,yBAAiB,gBAAgB,SAAS,QAAQ,QAAQ;AAC1D,iBAAS,mBAAmB,eAAe;AAAA,MAC7C;AAEA,gBAAU,IAAI,KAAe,EAAG,IAAI,QAAQ;AAG5C,aAAO,MAAM;AA3DZ;AA4DC,yDAAgB;AAChB,wBAAU,IAAI,KAAe,MAA7B,mBAAgC,OAAO;AAAA,MACzC;AAAA,IACF;AAAA,IAEA,KAAK,UAAU,MAAM;AAjElB;AAkED,YAAM,MAAM,UAAU,IAAI,KAAe;AACzC,UAAI,CAAC,IAAK;AAEV,iBAAW,YAAY,KAAK;AAG1B,aAAI,cAAS,YAAT,mBAAkB,WAAW;AAC/B,cAAI;AACJ,qBAAW,OAAO,MAAM;AACtB,gBAAI,OAAO,OAAO,QAAQ,YAAY,eAAgB,KAAa;AACjE,6BAAgB,IAAY;AAC5B;AAAA,YACF;AAAA,UACF;AACA,cAAI,iBAAiB,UAAa,iBAAiB,SAAS,QAAQ,UAAW;AAAA,QACjF;AAEA,cAAM,KAAK,SAAS,oBAAoB,SAAS;AACjD,YAAI;AACF,aAAG,GAAG,IAAI;AAAA,QACZ,SAAS,KAAK;AACZ,kBAAQ,MAAM,sBAAsB,KAAe,aAAa,GAAG;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,QAAQ;AACN,gBAAU,MAAA;AAAA,IACZ;AAAA,EAAA;AAEJ;AAeO,SAAS,uBAA2C;AACzD,QAAM,+BAAe,IAAA;AAErB,SAAO;AAAA,IACL,OAAO,SAAS,SAAS;AACvB,eAAS,IAAI,SAAmB,OAAO;AAAA,IACzC;AAAA,IAEA,KAAK,YAAY,MAAM;AACrB,YAAM,UAAU,SAAS,IAAI,OAAiB;AAC9C,UAAI,CAAC,SAAS;AACZ,gBAAQ,KAAK,gDAAgD,OAAiB,EAAE;AAChF,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,GAAG,IAAI;AAAA,IACxB;AAAA,EAAA;AAEJ;AAcO,SAAS,gBAAyB;AACvC,SAAO;AAAA,IACL,QAAQ,mBAAA;AAAA,IACR,UAAU,qBAAA;AAAA,EAAqB;AAEnC;AAeO,SAAS,wBACd,UACA,UACA,OAAwC,WACnB;AACrB,MAAI,CAAC,SAAU,QAAO;AAEtB,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO,CAAC,GAAG,UAAU,GAAG,QAAQ;AAAA,IAElC,KAAK,UAAU;AACb,YAAM,SAAS,CAAC,GAAG,QAAQ;AAC3B,iBAAW,WAAW,UAAU;AAC9B,cAAM,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE;AACvD,YAAI,OAAO,GAAG;AACZ,iBAAO,GAAG,IAAI;AAAA,QAChB,OAAO;AACL,iBAAO,KAAK,OAAO;AAAA,QACrB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EAAA;AAEb;AAkDO,SAAS,0BAA0B,OAA2C;AACnF,QAAM,cAAc,OAAO,QAAQ,MAAM,gBAAgB,UAAU;AAGnE,MAAI,YAAY,WAAW,KAAK,YAAY,CAAC,EAAE,CAAC,EAAE,SAAS,WAAW;AACpE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,QACN,SAAS,YAAY,CAAC,EAAE,CAAC,EAAE;AAAA,MAAA;AAAA,IAC7B;AAAA,EAEJ;AAGA,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,GAAG,MAAM,IAAI,YAAY,CAAC;AAChC,QAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,UAAU,GAAG;AACpE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,MAAM;AAAA,QACb,QAAQ;AAAA,UACN,SAAS,OAAO,KAAK,IAAI,CAAC,KAAK,QAAA;AAtQlC;AAsQ2C;AAAA,cACtC,OAAO,OAAO,GAAG;AAAA,cACjB,SAAO,YAAO,cAAP,mBAAmB,SAAQ,OAAO,GAAG;AAAA,YAAA;AAAA,WAC5C;AAAA,UACF,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAEJ;AAAA,EACF;AAGA,QAAM,WAAW,IAAI,IAAI,MAAM,gBAAgB,YAAY,EAAE;AAC7D,QAAM,SAAqC,YAAY,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,IAC9E;AAAA,IACA,OAAO,OAAO,SAAS;AAAA,IACvB,GAAG,kBAAkB,MAAM;AAAA,IAC3B,UAAU,SAAS,IAAI,IAAI;AAAA,IAC3B,UAAU,OAAO;AAAA,IACjB,GAAI,OAAO,YAAY,SAAY,EAAE,aAAa,OAAO,OAAO,OAAO,MAAM,CAAA;AAAA,EAAC,EAC9E;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,QAAQ,EAAE,OAAA;AAAA,EAAO;AAErB;AAEA,SAAS,kBACP,QAG0E;AAE1E,MAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO,KAAK,IAAI,CAAC,KAAK,QAAA;AA3S9B;AA2SuC;AAAA,UACtC,SAAO,YAAO,cAAP,mBAAmB,SAAQ,OAAO,GAAG;AAAA,UAC5C,OAAO,OAAO,GAAG;AAAA,QAAA;AAAA,OACjB;AAAA,IAAA;AAAA,EAEN;AAEA,MAAI,OAAO,SAAS,UAAW,QAAO,EAAE,MAAM,WAAA;AAC9C,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAW,QAAO,EAAE,MAAM,SAAA;AAC1E,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,OAAO,WAAW,QAAS,QAAO,EAAE,MAAM,QAAA;AAC9C,QAAI,OAAO,WAAW,UAAU,OAAO,WAAW,YAAa,QAAO,EAAE,MAAM,OAAA;AAC9E,WAAO,EAAE,MAAM,OAAA;AAAA,EACjB;AAGA,UAAQ;AAAA,IACN,gEAAiE,OAA6B,IAAI;AAAA,EAAA;AAEpG,SAAO,EAAE,MAAM,OAAA;AACjB;AAEO,SAAS,4BACd,OACkB;AAClB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,QAAQ;AAAA,MACN,SAAS,MAAM,QAAQ,IAAI,CAAC,QAAQ;AAClC,cAAM,SAAkC,EAAE,GAAI,IAAI,YAAY,CAAA,EAAC;AAE/D,cAAM,eAAgB,IAA6B;AACnD,YAAI,iBAAiB,UAAa,OAAO,YAAY,QAAW;AAC9D,iBAAO,UAAU;AAAA,QACnB;AACA,eAAO;AAAA,UACL,OAAO,IAAI;AAAA,UACX,OAAO,IAAI;AAAA;AAAA,UAEX,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,UAAU,WAAW,CAAA;AAAA,QAAC;AAAA,MAEjE,CAAC;AAAA,MACD,QAAQ;AAAA,IAAA;AAAA,EACV;AAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-prompt-controller.cjs","sources":["../../src/services/chat-prompt-controller.ts"],"sourcesContent":["/**\n * createChatPromptController — centralised lifecycle for `showChatPrompt`\n *\n * @experimental\n * @since v5.2.0\n *\n * The controller owns the resolver closure, AbortSignal wiring, and\n * re-entrance policy in one primitive. Consumers go from ~20 LOC of manual\n * wiring per app to :\n *\n * ```ts\n * const ctrl = createChatPromptController()\n * bus.commands.handle('showChatPrompt', ctrl.handle)\n * // ...\n * <Show when={ctrl.activePrompt()}>\n * {(cfg) => (\n * <ChatPrompt\n * config={cfg()}\n * onSubmit={ctrl.resolveActive}\n * onDismiss={ctrl.dismissActive}\n * />\n * )}\n * </Show>\n * ```\n *\n * ## Re-entrance policy\n *\n * If a new `showChatPrompt` arrives while a previous Promise is still\n * pending, the previous Promise rejects **synchronously** with a\n * `PromptReplacedError` before the new prompt is installed. Callers that\n * care can branch on `err instanceof PromptReplacedError` or `err.name ===\n * 'PromptReplacedError'`.\n *\n * ## Abort semantics\n *\n * `handle(config, signal?)` honours `AbortSignal` :\n *\n * - If `signal.aborted === true` on entry → returns a rejected Promise with\n * `new DOMException('Prompt aborted', 'AbortError')`, does NOT set\n * `activePrompt`.\n * - Otherwise registers a once-only listener that rejects with the same\n * `DOMException` on abort, clearing the active state.\n *\n * `AbortError` is the Web Platform convention (matches `fetch()`,\n * `Response.body.cancel()`, etc.) — callers can branch on `err.name ===\n * 'AbortError'` without importing any mcp-ui type.\n */\n\nimport { createSignal, type Accessor } from 'solid-js'\nimport type { ChatPromptConfig, ChatPromptResponse } from '../types/chat-bus'\n\n// ─── Error class ─────────────────────────────────────────────\n\n/**\n * Thrown when an active `showChatPrompt` Promise is rejected because a new\n * prompt arrived before the previous one resolved. Consumers can use\n * `instanceof PromptReplacedError` or `err.name === 'PromptReplacedError'` to\n * branch (retry, bail, log).\n *\n * @experimental\n * @since v5.2.0\n */\nexport class PromptReplacedError extends Error {\n readonly name = 'PromptReplacedError' as const\n constructor(message = 'Prompt replaced by a newer one') {\n super(message)\n }\n}\n\n// ─── Controller shape ────────────────────────────────────────\n\nexport interface ChatPromptController {\n /**\n * Register as the bus handler :\n * `bus.commands.handle('showChatPrompt', ctrl.handle)`\n */\n handle: (config: ChatPromptConfig, signal?: AbortSignal) => Promise<ChatPromptResponse>\n\n /**\n * Reactive accessor for the currently active prompt config (null when no\n * prompt is pending). Use in JSX to drive `<ChatPrompt>` rendering.\n */\n activePrompt: Accessor<ChatPromptConfig | null>\n\n /** Call this from `<ChatPrompt>`'s `onSubmit` prop. */\n resolveActive: (response: ChatPromptResponse) => void\n\n /** Call this from `<ChatPrompt>`'s `onDismiss` prop. */\n dismissActive: () => void\n\n /**\n * Cancel the active prompt programmatically (e.g. on route change). Rejects\n * the pending Promise with the supplied reason or an `AbortError`.\n */\n abort: (reason?: string) => void\n}\n\n// ─── Factory ─────────────────────────────────────────────────\n\n/**\n * Create a stateful controller that owns the active prompt Promise, the\n * AbortSignal listener, and the re-entrance policy. See module JSDoc for\n * full usage.\n *\n * @experimental\n * @since v5.2.0\n */\nexport function createChatPromptController(): ChatPromptController {\n const [activePrompt, setActivePrompt] = createSignal<ChatPromptConfig | null>(null)\n\n interface PendingEntry {\n type: ChatPromptConfig['type']\n resolve: (r: ChatPromptResponse) => void\n reject: (err: unknown) => void\n signal?: AbortSignal\n onAbort?: () => void\n }\n\n let pending: PendingEntry | null = null\n\n function cleanupAbort(entry: PendingEntry): void {\n if (entry.signal && entry.onAbort) {\n entry.signal.removeEventListener('abort', entry.onAbort)\n }\n }\n\n function clearPending(): void {\n if (pending) {\n cleanupAbort(pending)\n pending = null\n }\n setActivePrompt(null)\n }\n\n function handle(\n config: ChatPromptConfig,\n signal?: AbortSignal\n ): Promise<ChatPromptResponse> {\n // Re-entrance : synchronously reject the previous Promise before\n // installing the new prompt. The caller's .catch sees the rejection\n // on the microtask boundary regardless.\n if (pending) {\n const previous = pending\n pending = null\n cleanupAbort(previous)\n previous.reject(new PromptReplacedError())\n }\n\n // Abort already tripped on entry : return a rejected Promise without\n // ever showing the UI.\n if (signal?.aborted) {\n setActivePrompt(null)\n return Promise.reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n\n return new Promise<ChatPromptResponse>((resolve, reject) => {\n const entry: PendingEntry = { type: config.type, resolve, reject, signal }\n\n if (signal) {\n entry.onAbort = () => {\n // If this entry is still active, reject + clear. If a newer prompt\n // has since replaced it, the cleanup already ran — no-op.\n if (pending === entry) {\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n }\n signal.addEventListener('abort', entry.onAbort, { once: true })\n }\n\n pending = entry\n setActivePrompt(config)\n })\n }\n\n function resolveActive(response: ChatPromptResponse): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.resolve(response)\n }\n\n function dismissActive(): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n // Surface as a resolved Promise with dismissed: true — matches existing\n // ChatPrompt onDismiss contract from v4.x.\n entry.resolve({ type: entry.type, value: '', label: '', dismissed: true })\n }\n\n function abort(reason = 'Prompt aborted'): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.reject(new DOMException(reason, 'AbortError'))\n }\n\n return {\n handle,\n activePrompt,\n resolveActive,\n dismissActive,\n abort,\n }\n}\n"],"names":["createSignal"],"mappings":";;;;;;AA8DO,MAAM,4BAA4B,MAAM;AAAA,EAE7C,YAAY,UAAU,kCAAkC;AACtD,UAAM,OAAO;AAFN,gCAAO;AAAA,EAGhB;AACF;AAwCO,SAAS,6BAAmD;AACjE,QAAM,CAAC,cAAc,eAAe,IAAIA,QAAAA,aAAsC,IAAI;AAUlF,MAAI,UAA+B;AAEnC,WAAS,aAAa,OAA2B;AAC/C,QAAI,MAAM,UAAU,MAAM,SAAS;AACjC,YAAM,OAAO,oBAAoB,SAAS,MAAM,OAAO;AAAA,IACzD;AAAA,EACF;AAUA,WAAS,OACP,QACA,QAC6B;AAI7B,QAAI,SAAS;AACX,YAAM,WAAW;AACjB,gBAAU;AACV,mBAAa,QAAQ;AACrB,eAAS,OAAO,IAAI,qBAAqB;AAAA,IAC3C;AAIA,QAAI,iCAAQ,SAAS;AACnB,sBAAgB,IAAI;AACpB,aAAO,QAAQ,OAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,IACxE;AAEA,WAAO,IAAI,QAA4B,CAAC,SAAS,WAAW;AAC1D,YAAM,QAAsB,EAAE,MAAM,OAAO,MAAM,SAAS,QAAQ,OAAA;AAElE,UAAI,QAAQ;AACV,cAAM,UAAU,MAAM;AAGpB,cAAI,YAAY,OAAO;AACrB,sBAAU;AACV,yBAAa,KAAK;AAClB,4BAAgB,IAAI;AACpB,mBAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,UACzD;AAAA,QACF;AACA,eAAO,iBAAiB,SAAS,MAAM,SAAS,EAAE,MAAM,MAAM;AAAA,MAChE;AAEA,gBAAU;AACV,sBAAgB,MAAM;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,WAAS,cAAc,UAAoC;AACzD,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,QAAQ,QAAQ;AAAA,EACxB;AAEA,WAAS,gBAAsB;AAC7B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AAGpB,UAAM,QAAQ,EAAE,MAAM,MAAM,MAAM,OAAO,IAAI,OAAO,IAAI,WAAW,KAAA,CAAM;AAAA,EAC3E;AAEA,WAAS,MAAM,SAAS,kBAAwB;AAC9C,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,OAAO,IAAI,aAAa,QAAQ,YAAY,CAAC;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;"}
1
+ {"version":3,"file":"chat-prompt-controller.cjs","sources":["../../src/services/chat-prompt-controller.ts"],"sourcesContent":["/**\n * createChatPromptController — centralised lifecycle for `showChatPrompt`\n *\n * @experimental\n * @since v5.2.0\n *\n * The controller owns the resolver closure, AbortSignal wiring, and\n * re-entrance policy in one primitive. Consumers go from ~20 LOC of manual\n * wiring per app to :\n *\n * ```ts\n * const ctrl = createChatPromptController()\n * bus.commands.handle('showChatPrompt', ctrl.handle)\n * // ...\n * <Show when={ctrl.activePrompt()}>\n * {(cfg) => (\n * <ChatPrompt\n * config={cfg()}\n * onSubmit={ctrl.resolveActive}\n * onDismiss={ctrl.dismissActive}\n * />\n * )}\n * </Show>\n * ```\n *\n * ## Re-entrance policy\n *\n * If a new `showChatPrompt` arrives while a previous Promise is still\n * pending, the previous Promise rejects **synchronously** with a\n * `PromptReplacedError` before the new prompt is installed. Callers that\n * care can branch on `err instanceof PromptReplacedError` or `err.name ===\n * 'PromptReplacedError'`.\n *\n * ## Abort semantics\n *\n * `handle(config, signal?)` honours `AbortSignal` :\n *\n * - If `signal.aborted === true` on entry → returns a rejected Promise with\n * `new DOMException('Prompt aborted', 'AbortError')`, does NOT set\n * `activePrompt`.\n * - Otherwise registers a once-only listener that rejects with the same\n * `DOMException` on abort, clearing the active state.\n *\n * `AbortError` is the Web Platform convention (matches `fetch()`,\n * `Response.body.cancel()`, etc.) — callers can branch on `err.name ===\n * 'AbortError'` without importing any mcp-ui type.\n */\n\nimport { createSignal, type Accessor } from 'solid-js'\nimport type { ChatPromptConfig, ChatPromptResponse } from '../types/chat-bus'\n\n// ─── Error class ─────────────────────────────────────────────\n\n/**\n * Thrown when an active `showChatPrompt` Promise is rejected because a new\n * prompt arrived before the previous one resolved. Consumers can use\n * `instanceof PromptReplacedError` or `err.name === 'PromptReplacedError'` to\n * branch (retry, bail, log).\n *\n * @experimental\n * @since v5.2.0\n */\nexport class PromptReplacedError extends Error {\n readonly name = 'PromptReplacedError' as const\n constructor(message = 'Prompt replaced by a newer one') {\n super(message)\n }\n}\n\n// ─── Controller shape ────────────────────────────────────────\n\nexport interface ChatPromptController {\n /**\n * Register as the bus handler :\n * `bus.commands.handle('showChatPrompt', ctrl.handle)`\n */\n handle: (config: ChatPromptConfig, signal?: AbortSignal) => Promise<ChatPromptResponse>\n\n /**\n * Reactive accessor for the currently active prompt config (null when no\n * prompt is pending). Use in JSX to drive `<ChatPrompt>` rendering.\n */\n activePrompt: Accessor<ChatPromptConfig | null>\n\n /** Call this from `<ChatPrompt>`'s `onSubmit` prop. */\n resolveActive: (response: ChatPromptResponse) => void\n\n /** Call this from `<ChatPrompt>`'s `onDismiss` prop. */\n dismissActive: () => void\n\n /**\n * Cancel the active prompt programmatically (e.g. on route change). Rejects\n * the pending Promise with the supplied reason or an `AbortError`.\n */\n abort: (reason?: string) => void\n}\n\n// ─── Factory ─────────────────────────────────────────────────\n\n/**\n * Create a stateful controller that owns the active prompt Promise, the\n * AbortSignal listener, and the re-entrance policy. See module JSDoc for\n * full usage.\n *\n * @experimental\n * @since v5.2.0\n */\nexport function createChatPromptController(): ChatPromptController {\n const [activePrompt, setActivePrompt] = createSignal<ChatPromptConfig | null>(null)\n\n interface PendingEntry {\n type: ChatPromptConfig['type']\n resolve: (r: ChatPromptResponse) => void\n reject: (err: unknown) => void\n signal?: AbortSignal\n onAbort?: () => void\n }\n\n let pending: PendingEntry | null = null\n\n function cleanupAbort(entry: PendingEntry): void {\n if (entry.signal && entry.onAbort) {\n entry.signal.removeEventListener('abort', entry.onAbort)\n }\n }\n\n function handle(\n config: ChatPromptConfig,\n signal?: AbortSignal\n ): Promise<ChatPromptResponse> {\n // Re-entrance : synchronously reject the previous Promise before\n // installing the new prompt. The caller's .catch sees the rejection\n // on the microtask boundary regardless.\n if (pending) {\n const previous = pending\n pending = null\n cleanupAbort(previous)\n previous.reject(new PromptReplacedError())\n }\n\n // Abort already tripped on entry : return a rejected Promise without\n // ever showing the UI.\n if (signal?.aborted) {\n setActivePrompt(null)\n return Promise.reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n\n return new Promise<ChatPromptResponse>((resolve, reject) => {\n const entry: PendingEntry = { type: config.type, resolve, reject, signal }\n\n if (signal) {\n entry.onAbort = () => {\n // If this entry is still active, reject + clear. If a newer prompt\n // has since replaced it, the cleanup already ran — no-op.\n if (pending === entry) {\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n }\n signal.addEventListener('abort', entry.onAbort, { once: true })\n }\n\n pending = entry\n setActivePrompt(config)\n })\n }\n\n function resolveActive(response: ChatPromptResponse): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.resolve(response)\n }\n\n function dismissActive(): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n // Surface as a resolved Promise with dismissed: true — matches existing\n // ChatPrompt onDismiss contract from v4.x.\n entry.resolve({ type: entry.type, value: '', label: '', dismissed: true })\n }\n\n function abort(reason = 'Prompt aborted'): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.reject(new DOMException(reason, 'AbortError'))\n }\n\n return {\n handle,\n activePrompt,\n resolveActive,\n dismissActive,\n abort,\n }\n}\n"],"names":["createSignal"],"mappings":";;;;;;AA8DO,MAAM,4BAA4B,MAAM;AAAA,EAE7C,YAAY,UAAU,kCAAkC;AACtD,UAAM,OAAO;AAFN,gCAAO;AAAA,EAGhB;AACF;AAwCO,SAAS,6BAAmD;AACjE,QAAM,CAAC,cAAc,eAAe,IAAIA,QAAAA,aAAsC,IAAI;AAUlF,MAAI,UAA+B;AAEnC,WAAS,aAAa,OAA2B;AAC/C,QAAI,MAAM,UAAU,MAAM,SAAS;AACjC,YAAM,OAAO,oBAAoB,SAAS,MAAM,OAAO;AAAA,IACzD;AAAA,EACF;AAEA,WAAS,OACP,QACA,QAC6B;AAI7B,QAAI,SAAS;AACX,YAAM,WAAW;AACjB,gBAAU;AACV,mBAAa,QAAQ;AACrB,eAAS,OAAO,IAAI,qBAAqB;AAAA,IAC3C;AAIA,QAAI,iCAAQ,SAAS;AACnB,sBAAgB,IAAI;AACpB,aAAO,QAAQ,OAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,IACxE;AAEA,WAAO,IAAI,QAA4B,CAAC,SAAS,WAAW;AAC1D,YAAM,QAAsB,EAAE,MAAM,OAAO,MAAM,SAAS,QAAQ,OAAA;AAElE,UAAI,QAAQ;AACV,cAAM,UAAU,MAAM;AAGpB,cAAI,YAAY,OAAO;AACrB,sBAAU;AACV,yBAAa,KAAK;AAClB,4BAAgB,IAAI;AACpB,mBAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,UACzD;AAAA,QACF;AACA,eAAO,iBAAiB,SAAS,MAAM,SAAS,EAAE,MAAM,MAAM;AAAA,MAChE;AAEA,gBAAU;AACV,sBAAgB,MAAM;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,WAAS,cAAc,UAAoC;AACzD,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,QAAQ,QAAQ;AAAA,EACxB;AAEA,WAAS,gBAAsB;AAC7B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AAGpB,UAAM,QAAQ,EAAE,MAAM,MAAM,MAAM,OAAO,IAAI,OAAO,IAAI,WAAW,KAAA,CAAM;AAAA,EAC3E;AAEA,WAAS,MAAM,SAAS,kBAAwB;AAC9C,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,OAAO,IAAI,aAAa,QAAQ,YAAY,CAAC;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-prompt-controller.d.ts","sourceRoot":"","sources":["../../src/services/chat-prompt-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAI7E;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAS;gBAClC,OAAO,SAAmC;CAGvD;AAID,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAEvF;;;OAGG;IACH,YAAY,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IAE/C,uDAAuD;IACvD,aAAa,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAErD,wDAAwD;IACxD,aAAa,EAAE,MAAM,IAAI,CAAA;IAEzB;;;OAGG;IACH,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAID;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,IAAI,oBAAoB,CA0GjE"}
1
+ {"version":3,"file":"chat-prompt-controller.d.ts","sourceRoot":"","sources":["../../src/services/chat-prompt-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAI7E;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAS;gBAClC,OAAO,SAAmC;CAGvD;AAID,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAEvF;;;OAGG;IACH,YAAY,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IAE/C,uDAAuD;IACvD,aAAa,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAErD,wDAAwD;IACxD,aAAa,EAAE,MAAM,IAAI,CAAA;IAEzB;;;OAGG;IACH,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAID;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,IAAI,oBAAoB,CAkGjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-prompt-controller.js","sources":["../../src/services/chat-prompt-controller.ts"],"sourcesContent":["/**\n * createChatPromptController — centralised lifecycle for `showChatPrompt`\n *\n * @experimental\n * @since v5.2.0\n *\n * The controller owns the resolver closure, AbortSignal wiring, and\n * re-entrance policy in one primitive. Consumers go from ~20 LOC of manual\n * wiring per app to :\n *\n * ```ts\n * const ctrl = createChatPromptController()\n * bus.commands.handle('showChatPrompt', ctrl.handle)\n * // ...\n * <Show when={ctrl.activePrompt()}>\n * {(cfg) => (\n * <ChatPrompt\n * config={cfg()}\n * onSubmit={ctrl.resolveActive}\n * onDismiss={ctrl.dismissActive}\n * />\n * )}\n * </Show>\n * ```\n *\n * ## Re-entrance policy\n *\n * If a new `showChatPrompt` arrives while a previous Promise is still\n * pending, the previous Promise rejects **synchronously** with a\n * `PromptReplacedError` before the new prompt is installed. Callers that\n * care can branch on `err instanceof PromptReplacedError` or `err.name ===\n * 'PromptReplacedError'`.\n *\n * ## Abort semantics\n *\n * `handle(config, signal?)` honours `AbortSignal` :\n *\n * - If `signal.aborted === true` on entry → returns a rejected Promise with\n * `new DOMException('Prompt aborted', 'AbortError')`, does NOT set\n * `activePrompt`.\n * - Otherwise registers a once-only listener that rejects with the same\n * `DOMException` on abort, clearing the active state.\n *\n * `AbortError` is the Web Platform convention (matches `fetch()`,\n * `Response.body.cancel()`, etc.) — callers can branch on `err.name ===\n * 'AbortError'` without importing any mcp-ui type.\n */\n\nimport { createSignal, type Accessor } from 'solid-js'\nimport type { ChatPromptConfig, ChatPromptResponse } from '../types/chat-bus'\n\n// ─── Error class ─────────────────────────────────────────────\n\n/**\n * Thrown when an active `showChatPrompt` Promise is rejected because a new\n * prompt arrived before the previous one resolved. Consumers can use\n * `instanceof PromptReplacedError` or `err.name === 'PromptReplacedError'` to\n * branch (retry, bail, log).\n *\n * @experimental\n * @since v5.2.0\n */\nexport class PromptReplacedError extends Error {\n readonly name = 'PromptReplacedError' as const\n constructor(message = 'Prompt replaced by a newer one') {\n super(message)\n }\n}\n\n// ─── Controller shape ────────────────────────────────────────\n\nexport interface ChatPromptController {\n /**\n * Register as the bus handler :\n * `bus.commands.handle('showChatPrompt', ctrl.handle)`\n */\n handle: (config: ChatPromptConfig, signal?: AbortSignal) => Promise<ChatPromptResponse>\n\n /**\n * Reactive accessor for the currently active prompt config (null when no\n * prompt is pending). Use in JSX to drive `<ChatPrompt>` rendering.\n */\n activePrompt: Accessor<ChatPromptConfig | null>\n\n /** Call this from `<ChatPrompt>`'s `onSubmit` prop. */\n resolveActive: (response: ChatPromptResponse) => void\n\n /** Call this from `<ChatPrompt>`'s `onDismiss` prop. */\n dismissActive: () => void\n\n /**\n * Cancel the active prompt programmatically (e.g. on route change). Rejects\n * the pending Promise with the supplied reason or an `AbortError`.\n */\n abort: (reason?: string) => void\n}\n\n// ─── Factory ─────────────────────────────────────────────────\n\n/**\n * Create a stateful controller that owns the active prompt Promise, the\n * AbortSignal listener, and the re-entrance policy. See module JSDoc for\n * full usage.\n *\n * @experimental\n * @since v5.2.0\n */\nexport function createChatPromptController(): ChatPromptController {\n const [activePrompt, setActivePrompt] = createSignal<ChatPromptConfig | null>(null)\n\n interface PendingEntry {\n type: ChatPromptConfig['type']\n resolve: (r: ChatPromptResponse) => void\n reject: (err: unknown) => void\n signal?: AbortSignal\n onAbort?: () => void\n }\n\n let pending: PendingEntry | null = null\n\n function cleanupAbort(entry: PendingEntry): void {\n if (entry.signal && entry.onAbort) {\n entry.signal.removeEventListener('abort', entry.onAbort)\n }\n }\n\n function clearPending(): void {\n if (pending) {\n cleanupAbort(pending)\n pending = null\n }\n setActivePrompt(null)\n }\n\n function handle(\n config: ChatPromptConfig,\n signal?: AbortSignal\n ): Promise<ChatPromptResponse> {\n // Re-entrance : synchronously reject the previous Promise before\n // installing the new prompt. The caller's .catch sees the rejection\n // on the microtask boundary regardless.\n if (pending) {\n const previous = pending\n pending = null\n cleanupAbort(previous)\n previous.reject(new PromptReplacedError())\n }\n\n // Abort already tripped on entry : return a rejected Promise without\n // ever showing the UI.\n if (signal?.aborted) {\n setActivePrompt(null)\n return Promise.reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n\n return new Promise<ChatPromptResponse>((resolve, reject) => {\n const entry: PendingEntry = { type: config.type, resolve, reject, signal }\n\n if (signal) {\n entry.onAbort = () => {\n // If this entry is still active, reject + clear. If a newer prompt\n // has since replaced it, the cleanup already ran — no-op.\n if (pending === entry) {\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n }\n signal.addEventListener('abort', entry.onAbort, { once: true })\n }\n\n pending = entry\n setActivePrompt(config)\n })\n }\n\n function resolveActive(response: ChatPromptResponse): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.resolve(response)\n }\n\n function dismissActive(): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n // Surface as a resolved Promise with dismissed: true — matches existing\n // ChatPrompt onDismiss contract from v4.x.\n entry.resolve({ type: entry.type, value: '', label: '', dismissed: true })\n }\n\n function abort(reason = 'Prompt aborted'): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.reject(new DOMException(reason, 'AbortError'))\n }\n\n return {\n handle,\n activePrompt,\n resolveActive,\n dismissActive,\n abort,\n }\n}\n"],"names":[],"mappings":";;;;AA8DO,MAAM,4BAA4B,MAAM;AAAA,EAE7C,YAAY,UAAU,kCAAkC;AACtD,UAAM,OAAO;AAFN,gCAAO;AAAA,EAGhB;AACF;AAwCO,SAAS,6BAAmD;AACjE,QAAM,CAAC,cAAc,eAAe,IAAI,aAAsC,IAAI;AAUlF,MAAI,UAA+B;AAEnC,WAAS,aAAa,OAA2B;AAC/C,QAAI,MAAM,UAAU,MAAM,SAAS;AACjC,YAAM,OAAO,oBAAoB,SAAS,MAAM,OAAO;AAAA,IACzD;AAAA,EACF;AAUA,WAAS,OACP,QACA,QAC6B;AAI7B,QAAI,SAAS;AACX,YAAM,WAAW;AACjB,gBAAU;AACV,mBAAa,QAAQ;AACrB,eAAS,OAAO,IAAI,qBAAqB;AAAA,IAC3C;AAIA,QAAI,iCAAQ,SAAS;AACnB,sBAAgB,IAAI;AACpB,aAAO,QAAQ,OAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,IACxE;AAEA,WAAO,IAAI,QAA4B,CAAC,SAAS,WAAW;AAC1D,YAAM,QAAsB,EAAE,MAAM,OAAO,MAAM,SAAS,QAAQ,OAAA;AAElE,UAAI,QAAQ;AACV,cAAM,UAAU,MAAM;AAGpB,cAAI,YAAY,OAAO;AACrB,sBAAU;AACV,yBAAa,KAAK;AAClB,4BAAgB,IAAI;AACpB,mBAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,UACzD;AAAA,QACF;AACA,eAAO,iBAAiB,SAAS,MAAM,SAAS,EAAE,MAAM,MAAM;AAAA,MAChE;AAEA,gBAAU;AACV,sBAAgB,MAAM;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,WAAS,cAAc,UAAoC;AACzD,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,QAAQ,QAAQ;AAAA,EACxB;AAEA,WAAS,gBAAsB;AAC7B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AAGpB,UAAM,QAAQ,EAAE,MAAM,MAAM,MAAM,OAAO,IAAI,OAAO,IAAI,WAAW,KAAA,CAAM;AAAA,EAC3E;AAEA,WAAS,MAAM,SAAS,kBAAwB;AAC9C,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,OAAO,IAAI,aAAa,QAAQ,YAAY,CAAC;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"chat-prompt-controller.js","sources":["../../src/services/chat-prompt-controller.ts"],"sourcesContent":["/**\n * createChatPromptController — centralised lifecycle for `showChatPrompt`\n *\n * @experimental\n * @since v5.2.0\n *\n * The controller owns the resolver closure, AbortSignal wiring, and\n * re-entrance policy in one primitive. Consumers go from ~20 LOC of manual\n * wiring per app to :\n *\n * ```ts\n * const ctrl = createChatPromptController()\n * bus.commands.handle('showChatPrompt', ctrl.handle)\n * // ...\n * <Show when={ctrl.activePrompt()}>\n * {(cfg) => (\n * <ChatPrompt\n * config={cfg()}\n * onSubmit={ctrl.resolveActive}\n * onDismiss={ctrl.dismissActive}\n * />\n * )}\n * </Show>\n * ```\n *\n * ## Re-entrance policy\n *\n * If a new `showChatPrompt` arrives while a previous Promise is still\n * pending, the previous Promise rejects **synchronously** with a\n * `PromptReplacedError` before the new prompt is installed. Callers that\n * care can branch on `err instanceof PromptReplacedError` or `err.name ===\n * 'PromptReplacedError'`.\n *\n * ## Abort semantics\n *\n * `handle(config, signal?)` honours `AbortSignal` :\n *\n * - If `signal.aborted === true` on entry → returns a rejected Promise with\n * `new DOMException('Prompt aborted', 'AbortError')`, does NOT set\n * `activePrompt`.\n * - Otherwise registers a once-only listener that rejects with the same\n * `DOMException` on abort, clearing the active state.\n *\n * `AbortError` is the Web Platform convention (matches `fetch()`,\n * `Response.body.cancel()`, etc.) — callers can branch on `err.name ===\n * 'AbortError'` without importing any mcp-ui type.\n */\n\nimport { createSignal, type Accessor } from 'solid-js'\nimport type { ChatPromptConfig, ChatPromptResponse } from '../types/chat-bus'\n\n// ─── Error class ─────────────────────────────────────────────\n\n/**\n * Thrown when an active `showChatPrompt` Promise is rejected because a new\n * prompt arrived before the previous one resolved. Consumers can use\n * `instanceof PromptReplacedError` or `err.name === 'PromptReplacedError'` to\n * branch (retry, bail, log).\n *\n * @experimental\n * @since v5.2.0\n */\nexport class PromptReplacedError extends Error {\n readonly name = 'PromptReplacedError' as const\n constructor(message = 'Prompt replaced by a newer one') {\n super(message)\n }\n}\n\n// ─── Controller shape ────────────────────────────────────────\n\nexport interface ChatPromptController {\n /**\n * Register as the bus handler :\n * `bus.commands.handle('showChatPrompt', ctrl.handle)`\n */\n handle: (config: ChatPromptConfig, signal?: AbortSignal) => Promise<ChatPromptResponse>\n\n /**\n * Reactive accessor for the currently active prompt config (null when no\n * prompt is pending). Use in JSX to drive `<ChatPrompt>` rendering.\n */\n activePrompt: Accessor<ChatPromptConfig | null>\n\n /** Call this from `<ChatPrompt>`'s `onSubmit` prop. */\n resolveActive: (response: ChatPromptResponse) => void\n\n /** Call this from `<ChatPrompt>`'s `onDismiss` prop. */\n dismissActive: () => void\n\n /**\n * Cancel the active prompt programmatically (e.g. on route change). Rejects\n * the pending Promise with the supplied reason or an `AbortError`.\n */\n abort: (reason?: string) => void\n}\n\n// ─── Factory ─────────────────────────────────────────────────\n\n/**\n * Create a stateful controller that owns the active prompt Promise, the\n * AbortSignal listener, and the re-entrance policy. See module JSDoc for\n * full usage.\n *\n * @experimental\n * @since v5.2.0\n */\nexport function createChatPromptController(): ChatPromptController {\n const [activePrompt, setActivePrompt] = createSignal<ChatPromptConfig | null>(null)\n\n interface PendingEntry {\n type: ChatPromptConfig['type']\n resolve: (r: ChatPromptResponse) => void\n reject: (err: unknown) => void\n signal?: AbortSignal\n onAbort?: () => void\n }\n\n let pending: PendingEntry | null = null\n\n function cleanupAbort(entry: PendingEntry): void {\n if (entry.signal && entry.onAbort) {\n entry.signal.removeEventListener('abort', entry.onAbort)\n }\n }\n\n function handle(\n config: ChatPromptConfig,\n signal?: AbortSignal\n ): Promise<ChatPromptResponse> {\n // Re-entrance : synchronously reject the previous Promise before\n // installing the new prompt. The caller's .catch sees the rejection\n // on the microtask boundary regardless.\n if (pending) {\n const previous = pending\n pending = null\n cleanupAbort(previous)\n previous.reject(new PromptReplacedError())\n }\n\n // Abort already tripped on entry : return a rejected Promise without\n // ever showing the UI.\n if (signal?.aborted) {\n setActivePrompt(null)\n return Promise.reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n\n return new Promise<ChatPromptResponse>((resolve, reject) => {\n const entry: PendingEntry = { type: config.type, resolve, reject, signal }\n\n if (signal) {\n entry.onAbort = () => {\n // If this entry is still active, reject + clear. If a newer prompt\n // has since replaced it, the cleanup already ran — no-op.\n if (pending === entry) {\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n reject(new DOMException('Prompt aborted', 'AbortError'))\n }\n }\n signal.addEventListener('abort', entry.onAbort, { once: true })\n }\n\n pending = entry\n setActivePrompt(config)\n })\n }\n\n function resolveActive(response: ChatPromptResponse): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.resolve(response)\n }\n\n function dismissActive(): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n // Surface as a resolved Promise with dismissed: true — matches existing\n // ChatPrompt onDismiss contract from v4.x.\n entry.resolve({ type: entry.type, value: '', label: '', dismissed: true })\n }\n\n function abort(reason = 'Prompt aborted'): void {\n if (!pending) return\n const entry = pending\n pending = null\n cleanupAbort(entry)\n setActivePrompt(null)\n entry.reject(new DOMException(reason, 'AbortError'))\n }\n\n return {\n handle,\n activePrompt,\n resolveActive,\n dismissActive,\n abort,\n }\n}\n"],"names":[],"mappings":";;;;AA8DO,MAAM,4BAA4B,MAAM;AAAA,EAE7C,YAAY,UAAU,kCAAkC;AACtD,UAAM,OAAO;AAFN,gCAAO;AAAA,EAGhB;AACF;AAwCO,SAAS,6BAAmD;AACjE,QAAM,CAAC,cAAc,eAAe,IAAI,aAAsC,IAAI;AAUlF,MAAI,UAA+B;AAEnC,WAAS,aAAa,OAA2B;AAC/C,QAAI,MAAM,UAAU,MAAM,SAAS;AACjC,YAAM,OAAO,oBAAoB,SAAS,MAAM,OAAO;AAAA,IACzD;AAAA,EACF;AAEA,WAAS,OACP,QACA,QAC6B;AAI7B,QAAI,SAAS;AACX,YAAM,WAAW;AACjB,gBAAU;AACV,mBAAa,QAAQ;AACrB,eAAS,OAAO,IAAI,qBAAqB;AAAA,IAC3C;AAIA,QAAI,iCAAQ,SAAS;AACnB,sBAAgB,IAAI;AACpB,aAAO,QAAQ,OAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,IACxE;AAEA,WAAO,IAAI,QAA4B,CAAC,SAAS,WAAW;AAC1D,YAAM,QAAsB,EAAE,MAAM,OAAO,MAAM,SAAS,QAAQ,OAAA;AAElE,UAAI,QAAQ;AACV,cAAM,UAAU,MAAM;AAGpB,cAAI,YAAY,OAAO;AACrB,sBAAU;AACV,yBAAa,KAAK;AAClB,4BAAgB,IAAI;AACpB,mBAAO,IAAI,aAAa,kBAAkB,YAAY,CAAC;AAAA,UACzD;AAAA,QACF;AACA,eAAO,iBAAiB,SAAS,MAAM,SAAS,EAAE,MAAM,MAAM;AAAA,MAChE;AAEA,gBAAU;AACV,sBAAgB,MAAM;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,WAAS,cAAc,UAAoC;AACzD,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,QAAQ,QAAQ;AAAA,EACxB;AAEA,WAAS,gBAAsB;AAC7B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AAGpB,UAAM,QAAQ,EAAE,MAAM,MAAM,MAAM,OAAO,IAAI,OAAO,IAAI,WAAW,KAAA,CAAM;AAAA,EAC3E;AAEA,WAAS,MAAM,SAAS,kBAAwB;AAC9C,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ;AACd,cAAU;AACV,iBAAa,KAAK;AAClB,oBAAgB,IAAI;AACpB,UAAM,OAAO,IAAI,aAAa,QAAQ,YAAY,CAAC;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}