@aleph-alpha/lib-mcp 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -103,6 +103,95 @@
103
103
  ],
104
104
  "_autoGenerated": true
105
105
  },
106
+ "CkFeedbackButton": {
107
+ "description": "Binary thumbs up / thumbs down feedback control for assistant messages. Fully prop-driven: the host application owns the selection and lock state and decides when (or if) to persist it to a backend. Labels default to those provided by `useChatKitLabels` (which can be translated via `provideChatKitLabels`). The `ariaLabel*` props override the injected labels on a per-instance basis when set.",
108
+ "category": "Feedback",
109
+ "useCases": [
110
+ "like or dislike an assistant reply",
111
+ "collect binary message rating",
112
+ "lock feedback after submission",
113
+ "rate AI response"
114
+ ],
115
+ "keywords": [
116
+ "feedback",
117
+ "thumbs up",
118
+ "thumbs down",
119
+ "like",
120
+ "dislike",
121
+ "rating",
122
+ "vote",
123
+ "action",
124
+ "message",
125
+ "button"
126
+ ],
127
+ "related": [
128
+ "CkMessageActionButton",
129
+ "CkCopyMessageActionButton",
130
+ "CkAgentMessage",
131
+ "CkConversation"
132
+ ],
133
+ "props": [
134
+ "value",
135
+ "locked",
136
+ "disabled",
137
+ "ariaLabelThumbsUp",
138
+ "ariaLabelThumbsDown",
139
+ "ariaLabelGroup"
140
+ ],
141
+ "examples": [
142
+ "Default",
143
+ "SelectedUp",
144
+ "SelectedDown",
145
+ "Locked",
146
+ "Disabled",
147
+ "SubmitOnSelect"
148
+ ],
149
+ "_autoGenerated": true
150
+ },
151
+ "CkFileItemsList": {
152
+ "description": "Horizontal list of file attachments; collapses to a popover once the count exceeds `maxInline`.",
153
+ "category": "Form Inputs",
154
+ "useCases": [
155
+ "user message attachments",
156
+ "prompt input previews",
157
+ "chat file row"
158
+ ],
159
+ "keywords": [
160
+ "files",
161
+ "attachments",
162
+ "file list",
163
+ "popover",
164
+ "chat",
165
+ "file",
166
+ "items",
167
+ "list"
168
+ ],
169
+ "related": [
170
+ "UiFileItem",
171
+ "UiPopover"
172
+ ],
173
+ "props": [
174
+ "files",
175
+ "maxInline",
176
+ "size",
177
+ "isRemovable",
178
+ "removeLabel",
179
+ "disabled",
180
+ "triggerLabel",
181
+ "triggerAriaLabel",
182
+ "listLabel",
183
+ "popoverClass"
184
+ ],
185
+ "examples": [
186
+ "Inline",
187
+ "Collapsed",
188
+ "Removable",
189
+ "CustomItem",
190
+ "Clickable",
191
+ "Disabled"
192
+ ],
193
+ "_autoGenerated": true
194
+ },
106
195
  "CkHistoryItem": {
107
196
  "description": "A single chat history entry with title, optional meta line, active indicator, and a trailing action control (plain button or popover). Sidebar-agnostic: can be used anywhere, not only inside a sidebar.",
108
197
  "category": "Actions",
@@ -443,6 +532,7 @@
443
532
  ],
444
533
  "examples": [
445
534
  "Default",
535
+ "ChainOfThought",
446
536
  "WithIcon",
447
537
  "WithCustomAvatarFallback",
448
538
  "NoIcon",
@@ -62,14 +62,26 @@
62
62
  "_autoGenerated": true
63
63
  },
64
64
  "UiAlertDialog": {
65
- "description": "Root alert dialog. Uses core **`Dialog`** (`components/core/dialog/Dialog.vue` → **`DialogRoot`**) with **`modal: true`** Root uses core **`Dialog`** with modal enabled. Subcomponents use **`UiAlertDialog*`** / alert **`DialogContent`** for **`alertdialog`** semantics. Use **`v-model:model`** for controlled mode (unlike **`UiDialog`**, which uses **`v-model:open`**).",
66
- "category": "Uncategorized",
67
- "useCases": [],
65
+ "description": "A modal dialog for confirmations that interrupt the user. Use for destructive actions, important decisions, or critical confirmations.",
66
+ "category": "Overlays",
67
+ "useCases": [
68
+ "confirm delete",
69
+ "destructive action",
70
+ "important confirmation",
71
+ "warning"
72
+ ],
68
73
  "keywords": [
69
74
  "alert",
70
- "dialog"
75
+ "dialog",
76
+ "modal",
77
+ "confirm",
78
+ "warning",
79
+ "destructive",
80
+ "popup"
81
+ ],
82
+ "related": [
83
+ "UiPopover"
71
84
  ],
72
- "related": [],
73
85
  "props": [],
74
86
  "examples": [
75
87
  "Default",
@@ -102,9 +114,10 @@
102
114
  "props": [],
103
115
  "examples": [
104
116
  "Default",
117
+ "Sizes",
105
118
  "Fallback",
106
119
  "Multiple",
107
- "Stacked"
120
+ "AvatarGroup"
108
121
  ],
109
122
  "_autoGenerated": true
110
123
  },
@@ -205,6 +218,7 @@
205
218
  "WithIconSlot",
206
219
  "AsChild",
207
220
  "AllVariants",
221
+ "DisabledHoverBleed",
208
222
  "IconSizes",
209
223
  "AllVariantsAndSizes"
210
224
  ],
@@ -633,12 +647,15 @@
633
647
  "upload",
634
648
  "attachment",
635
649
  "progress",
650
+ "success",
651
+ "error",
636
652
  "item"
637
653
  ],
638
654
  "related": [
639
655
  "UiFileUploadBox",
640
656
  "UiItem",
641
- "UiButton"
657
+ "UiButton",
658
+ "UiProgress"
642
659
  ],
643
660
  "props": [
644
661
  "filename",
@@ -647,24 +664,64 @@
647
664
  "progress",
648
665
  "error",
649
666
  "removeLabel",
650
- "disabled"
667
+ "progressLabel",
668
+ "removable",
669
+ "disabled",
670
+ "size",
671
+ "mediaTone",
672
+ "mediaIcon"
651
673
  ],
652
674
  "examples": [
653
675
  "Default",
654
- "WithProgress",
655
- "Complete",
656
- "WithError",
676
+ "DefaultWithProgress",
677
+ "DefaultSuccess",
678
+ "DefaultError",
679
+ "SmallWithProgress",
680
+ "SmallSuccess",
681
+ "SmallError",
682
+ "NonRemovable",
657
683
  "Disabled",
658
- "DisabledWithError",
659
- "ProgressAndError",
660
- "FilenameOnly",
661
- "AllStates"
684
+ "AllVariants"
685
+ ],
686
+ "_autoGenerated": true
687
+ },
688
+ "UiFileType": {
689
+ "description": "Round 32×32 badge that visualises a file type with a tone + icon. Mirrors the Figma `Filetype` component (`AA26 / File Upload / Filetype`, node id `26438:42144`): - `Type=Text` (`pdf` / `doc` / `docx` / `txt` / `rtf`) → `accent-pink` + `file` - `Type=Markdown` (`html` / `htm` / `md` / `mdx`) → `accent-soft` + `code-xml` - `Type=Tabular` (`csv` / `tsv` / `xls` / `xlsx`) → `accent-yellow` + `table-2` - everything else → `default` + `file`",
690
+ "category": "Data Display",
691
+ "useCases": [
692
+ "file-type indicator",
693
+ "attachment badge"
694
+ ],
695
+ "keywords": [
696
+ "file",
697
+ "badge",
698
+ "attachment",
699
+ "filetype",
700
+ "icon",
701
+ "type"
702
+ ],
703
+ "related": [
704
+ "UiFileItem",
705
+ "UiFileUploadBox"
706
+ ],
707
+ "props": [
708
+ "filename",
709
+ "tone",
710
+ "icon",
711
+ "error",
712
+ "loading"
713
+ ],
714
+ "examples": [
715
+ "Default",
716
+ "ErrorState",
717
+ "AllTypes",
718
+ "ToneOverrides"
662
719
  ],
663
720
  "_autoGenerated": true
664
721
  },
665
722
  "UiFileUploadBox": {
666
723
  "description": "Drop zone + file picker for selecting files with optional type/size validation. **Emits:** see {@link UiFileUploadBoxEmits}.",
667
- "category": "Components",
724
+ "category": "Form Inputs",
668
725
  "useCases": [
669
726
  "file upload area",
670
727
  "drag and drop attachments"
@@ -698,13 +755,24 @@
698
755
  "_autoGenerated": true
699
756
  },
700
757
  "UiIcon": {
701
- "description": "UiIcon component",
702
- "category": "Uncategorized",
703
- "useCases": [],
758
+ "description": "An icon component using Lucide icons. Use for visual indicators, button decorations, or standalone meaningful graphics.",
759
+ "category": "Data Display",
760
+ "useCases": [
761
+ "visual indicator",
762
+ "button icon",
763
+ "status icon",
764
+ "decorative graphic"
765
+ ],
704
766
  "keywords": [
705
- "icon"
767
+ "icon",
768
+ "symbol",
769
+ "graphic",
770
+ "lucide",
771
+ "svg"
772
+ ],
773
+ "related": [
774
+ "UiButton"
706
775
  ],
707
- "related": [],
708
776
  "props": [
709
777
  "name",
710
778
  "size",
@@ -785,7 +853,6 @@
785
853
  "menu",
786
854
  "settings",
787
855
  "navigation",
788
- "selectable",
789
856
  "card"
790
857
  ],
791
858
  "related": [
@@ -796,6 +863,9 @@
796
863
  "props": [
797
864
  "variant",
798
865
  "size",
866
+ "title",
867
+ "description",
868
+ "desc",
799
869
  "asChild",
800
870
  "withListSemantics"
801
871
  ],
@@ -803,16 +873,14 @@
803
873
  "Basic",
804
874
  "Variants",
805
875
  "Sizes",
876
+ "CustomSlots",
806
877
  "WithIcon",
807
- "WithAvatar",
808
- "WithImage",
878
+ "Actions",
879
+ "ActionTooltip",
880
+ "Media",
809
881
  "Group",
810
- "WithHeaderAndFooter",
811
882
  "AsLink",
812
- "TeamMembersList",
813
- "NotificationList",
814
- "EmptyStateWithInvite",
815
- "AllStates"
883
+ "AllVariants"
816
884
  ],
817
885
  "_autoGenerated": true
818
886
  },
@@ -1120,6 +1188,36 @@
1120
1188
  ],
1121
1189
  "_autoGenerated": true
1122
1190
  },
1191
+ "UiResizable": {
1192
+ "description": "A resizable panel layout for splitting available space into user-adjustable regions. Use for sidebars, inspectors, editors, and other dense layouts where users need control over panel sizes.",
1193
+ "category": "Layout",
1194
+ "useCases": [
1195
+ "split pane",
1196
+ "resizable sidebar",
1197
+ "editor layout",
1198
+ "inspector panel"
1199
+ ],
1200
+ "keywords": [
1201
+ "resizable",
1202
+ "splitter",
1203
+ "panel",
1204
+ "pane",
1205
+ "layout",
1206
+ "sidebar"
1207
+ ],
1208
+ "related": [
1209
+ "UiSheet",
1210
+ "UiSeparator"
1211
+ ],
1212
+ "props": [],
1213
+ "examples": [
1214
+ "Default",
1215
+ "Vertical",
1216
+ "Collapsible",
1217
+ "PixelSizing"
1218
+ ],
1219
+ "_autoGenerated": true
1220
+ },
1123
1221
  "UiSelect": {
1124
1222
  "description": "A dropdown select for choosing from a list of options. Use for form fields where users must pick one value from many.",
1125
1223
  "category": "Form Inputs",
@@ -1147,6 +1245,7 @@
1147
1245
  "Default",
1148
1246
  "WithGroups",
1149
1247
  "WithDisabledItems",
1248
+ "WithIcons",
1150
1249
  "Disabled",
1151
1250
  "Sizes",
1152
1251
  "Multiple",
@@ -1589,9 +1688,12 @@
1589
1688
  "props": [
1590
1689
  "modelValue",
1591
1690
  "defaultValue",
1691
+ "active",
1592
1692
  "disabled",
1593
1693
  "variant",
1594
- "size"
1694
+ "size",
1695
+ "leftIcon",
1696
+ "rightIcon"
1595
1697
  ],
1596
1698
  "examples": [
1597
1699
  "Default",
@@ -1718,8 +1820,11 @@
1718
1820
  "WithSorting",
1719
1821
  "WithPagination",
1720
1822
  "WithToolbar",
1823
+ "WithColumnsFilter",
1721
1824
  "WithGlobalFilter",
1722
1825
  "WithRowSelection",
1826
+ "WithDraggableColumns",
1827
+ "WithExpandableRows",
1723
1828
  "FullExample",
1724
1829
  "WithCustomEmptyText",
1725
1830
  "WithCustomEmptySlot",
@@ -1871,6 +1976,7 @@
1871
1976
  "props": [],
1872
1977
  "examples": [
1873
1978
  "Default",
1979
+ "Resizable",
1874
1980
  "Inset",
1875
1981
  "RightSide"
1876
1982
  ],
@@ -185,28 +185,7 @@ var CHAT_KIT_OUTPUT_PATH = path3.join(
185
185
  PACKAGE_ROOT,
186
186
  "chat-kit-components-meta.json"
187
187
  );
188
- function extractJSDocTags(content, interfaceName) {
189
- const declarationRegex = new RegExp(
190
- `export\\s+(?:interface|type)\\s+${escapeRegex(interfaceName)}\\b`
191
- );
192
- const declarationMatch = content.match(declarationRegex);
193
- if (!declarationMatch || declarationMatch.index === void 0) {
194
- return { description: "", useCases: [], keywords: [], related: [] };
195
- }
196
- const contentBefore = content.substring(0, declarationMatch.index);
197
- const jsdocEndIndex = contentBefore.lastIndexOf("*/");
198
- if (jsdocEndIndex === -1) {
199
- return { description: "", useCases: [], keywords: [], related: [] };
200
- }
201
- const betweenJsdocAndDeclaration = contentBefore.substring(jsdocEndIndex + 2);
202
- if (betweenJsdocAndDeclaration.trim() !== "") {
203
- return { description: "", useCases: [], keywords: [], related: [] };
204
- }
205
- const jsdocStartIndex = contentBefore.lastIndexOf("/**");
206
- if (jsdocStartIndex === -1 || jsdocStartIndex > jsdocEndIndex) {
207
- return { description: "", useCases: [], keywords: [], related: [] };
208
- }
209
- const jsdoc = contentBefore.substring(jsdocStartIndex + 3, jsdocEndIndex);
188
+ function parseJSDocBlock(jsdoc) {
210
189
  const lines = jsdoc.split("\n").map((l) => l.replace(/^\s*\*\s?/, "").trim());
211
190
  let description = "";
212
191
  const useCases = [];
@@ -231,6 +210,51 @@ function extractJSDocTags(content, interfaceName) {
231
210
  }
232
211
  return { description, useCases, keywords, related, category };
233
212
  }
213
+ function extractJSDocTags(content, interfaceName) {
214
+ const declarationRegex = new RegExp(
215
+ `export\\s+(?:interface|type)\\s+${escapeRegex(interfaceName)}\\b`
216
+ );
217
+ const declarationMatch = content.match(declarationRegex);
218
+ if (!declarationMatch || declarationMatch.index === void 0) {
219
+ return { description: "", useCases: [], keywords: [], related: [] };
220
+ }
221
+ const contentBefore = content.substring(0, declarationMatch.index);
222
+ const jsdocEndIndex = contentBefore.lastIndexOf("*/");
223
+ if (jsdocEndIndex === -1) {
224
+ return { description: "", useCases: [], keywords: [], related: [] };
225
+ }
226
+ const betweenJsdocAndDeclaration = contentBefore.substring(jsdocEndIndex + 2);
227
+ if (betweenJsdocAndDeclaration.trim() !== "") {
228
+ return { description: "", useCases: [], keywords: [], related: [] };
229
+ }
230
+ const jsdocStartIndex = contentBefore.lastIndexOf("/**");
231
+ if (jsdocStartIndex === -1 || jsdocStartIndex > jsdocEndIndex) {
232
+ return { description: "", useCases: [], keywords: [], related: [] };
233
+ }
234
+ const jsdoc = contentBefore.substring(jsdocStartIndex + 3, jsdocEndIndex);
235
+ return parseJSDocBlock(jsdoc);
236
+ }
237
+ function findBestJSDocSource(content, componentName, primaryInterfaceName) {
238
+ const primary = extractJSDocTags(content, primaryInterfaceName);
239
+ if (primary.category) return primary;
240
+ const propsRegex = new RegExp(
241
+ `export\\s+(?:interface|type)\\s+(${escapeRegex(componentName)}\\w*Props)\\b`,
242
+ "g"
243
+ );
244
+ let propsMatch;
245
+ while ((propsMatch = propsRegex.exec(content)) !== null) {
246
+ if (propsMatch[1] === primaryInterfaceName) continue;
247
+ const tags = extractJSDocTags(content, propsMatch[1]);
248
+ if (tags.category) return tags;
249
+ }
250
+ const blockRegex = /\/\*\*([\s\S]*?)\*\//g;
251
+ let blockMatch;
252
+ while ((blockMatch = blockRegex.exec(content)) !== null) {
253
+ const tags = parseJSDocBlock(blockMatch[1]);
254
+ if (tags.category) return tags;
255
+ }
256
+ return primary;
257
+ }
234
258
  function extractKeywordsFromName(componentName) {
235
259
  const name = componentName.replace(/^(?:Ui|Ck)/, "");
236
260
  return name.replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase().split(/\s+/).filter((word) => word.length > 2);
@@ -284,7 +308,11 @@ function processComponent(componentDir, componentName) {
284
308
  /export\s+(?:interface|type)\s+((?:Ui|Ck)\w+Props)/
285
309
  );
286
310
  const interfaceName = exactMatch?.[1] || subComponentMatch?.[1] || anyPropsMatch?.[1] || `${componentName}Props`;
287
- const jsdocData = extractJSDocTags(typesContent, interfaceName);
311
+ const jsdocData = findBestJSDocSource(
312
+ typesContent,
313
+ componentName,
314
+ interfaceName
315
+ );
288
316
  const nameKeywords = extractKeywordsFromName(componentName);
289
317
  const keywords = jsdocData.keywords.length > 0 ? jsdocData.keywords : nameKeywords;
290
318
  const category = jsdocData.category || "Uncategorized";
@@ -386,5 +414,7 @@ if (isMain) {
386
414
  export {
387
415
  extractJSDocTags,
388
416
  extractKeywordsFromName,
389
- extractProps
417
+ extractProps,
418
+ findBestJSDocSource,
419
+ parseJSDocBlock
390
420
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aleph-alpha/lib-mcp",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",
@@ -36,8 +36,8 @@
36
36
  "@aleph-alpha/tsconfig-frontend": "0.6.0"
37
37
  },
38
38
  "peerDependencies": {
39
- "@aleph-alpha/ui-library": "2.2.0",
40
- "@aleph-alpha/chat-kit": "1.1.0"
39
+ "@aleph-alpha/ui-library": "2.6.2",
40
+ "@aleph-alpha/chat-kit": "1.11.1"
41
41
  },
42
42
  "homepage": "https://docs.aleph-alpha.com",
43
43
  "scripts": {