@k8slens/ai-tools-contracts 1.0.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 (69) hide show
  1. package/dist/index.d.ts +34 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +642 -0
  4. package/dist/src/ai-tool-configuration.d.ts +51 -0
  5. package/dist/src/ai-tool-configuration.d.ts.map +1 -0
  6. package/dist/src/ai-tool-description.d.ts +25 -0
  7. package/dist/src/ai-tool-description.d.ts.map +1 -0
  8. package/dist/src/ai-tool-detection.d.ts +20 -0
  9. package/dist/src/ai-tool-detection.d.ts.map +1 -0
  10. package/dist/src/ai-tool-display-name.d.ts +18 -0
  11. package/dist/src/ai-tool-display-name.d.ts.map +1 -0
  12. package/dist/src/ai-tool-icon.d.ts +577 -0
  13. package/dist/src/ai-tool-icon.d.ts.map +1 -0
  14. package/dist/src/ai-tool-injection-token.d.ts +10 -0
  15. package/dist/src/ai-tool-injection-token.d.ts.map +1 -0
  16. package/dist/src/ai-tool-installation-instructions.d.ts +20 -0
  17. package/dist/src/ai-tool-installation-instructions.d.ts.map +1 -0
  18. package/dist/src/ai-tool-installed-via-cli-command.d.ts +17 -0
  19. package/dist/src/ai-tool-installed-via-cli-command.d.ts.map +1 -0
  20. package/dist/src/ai-tool-instructions-filename.d.ts +20 -0
  21. package/dist/src/ai-tool-instructions-filename.d.ts.map +1 -0
  22. package/dist/src/ai-tool-instructions-filenames.d.ts +13 -0
  23. package/dist/src/ai-tool-instructions-filenames.d.ts.map +1 -0
  24. package/dist/src/ai-tool-is-configured.d.ts +17 -0
  25. package/dist/src/ai-tool-is-configured.d.ts.map +1 -0
  26. package/dist/src/ai-tool-name.d.ts +17 -0
  27. package/dist/src/ai-tool-name.d.ts.map +1 -0
  28. package/dist/src/ai-tool-order-number.d.ts +16 -0
  29. package/dist/src/ai-tool-order-number.d.ts.map +1 -0
  30. package/dist/src/ai-tool-selection-row.d.ts +18 -0
  31. package/dist/src/ai-tool-selection-row.d.ts.map +1 -0
  32. package/dist/src/ai-tool-settings.d.ts +18 -0
  33. package/dist/src/ai-tool-settings.d.ts.map +1 -0
  34. package/dist/src/ai-tool-top-bar-menu.d.ts +46 -0
  35. package/dist/src/ai-tool-top-bar-menu.d.ts.map +1 -0
  36. package/dist/src/ai-tool.d.ts +64 -0
  37. package/dist/src/ai-tool.d.ts.map +1 -0
  38. package/dist/src/ai-tools-injection-token.d.ts +12 -0
  39. package/dist/src/ai-tools-injection-token.d.ts.map +1 -0
  40. package/dist/src/ai-tools-open-externally.d.ts +17 -0
  41. package/dist/src/ai-tools-open-externally.d.ts.map +1 -0
  42. package/dist/src/build-external-terminal-command.d.ts +33 -0
  43. package/dist/src/build-external-terminal-command.d.ts.map +1 -0
  44. package/dist/src/current-shell-family.d.ts +13 -0
  45. package/dist/src/current-shell-family.d.ts.map +1 -0
  46. package/dist/src/default-ai-tool-icon.d.ts +8 -0
  47. package/dist/src/default-ai-tool-icon.d.ts.map +1 -0
  48. package/dist/src/detected-ai-tools.d.ts +15 -0
  49. package/dist/src/detected-ai-tools.d.ts.map +1 -0
  50. package/dist/src/get-ai-command-for-terminal.d.ts +17 -0
  51. package/dist/src/get-ai-command-for-terminal.d.ts.map +1 -0
  52. package/dist/src/get-ai-tool-injectable-bunch.d.ts +534 -0
  53. package/dist/src/get-ai-tool-injectable-bunch.d.ts.map +1 -0
  54. package/dist/src/get-ai-tool-is-installed-cli-command.d.ts +20 -0
  55. package/dist/src/get-ai-tool-is-installed-cli-command.d.ts.map +1 -0
  56. package/dist/src/get-open-tool-in-external-terminal-for-tool.d.ts +17 -0
  57. package/dist/src/get-open-tool-in-external-terminal-for-tool.d.ts.map +1 -0
  58. package/dist/src/get-resume-ai-command-for-terminal.d.ts +23 -0
  59. package/dist/src/get-resume-ai-command-for-terminal.d.ts.map +1 -0
  60. package/dist/src/operating-system-specific.d.ts +16 -0
  61. package/dist/src/operating-system-specific.d.ts.map +1 -0
  62. package/dist/src/os-and-shell-specific.d.ts +133 -0
  63. package/dist/src/os-and-shell-specific.d.ts.map +1 -0
  64. package/dist/src/resolve-llm-command.d.ts +16 -0
  65. package/dist/src/resolve-llm-command.d.ts.map +1 -0
  66. package/dist/src/selected-ai-tool-injection-tokens.d.ts +363 -0
  67. package/dist/src/selected-ai-tool-injection-tokens.d.ts.map +1 -0
  68. package/dist/tsconfig.tsbuildinfo +1 -0
  69. package/package.json +63 -0
@@ -0,0 +1,577 @@
1
+ import type { IComputedValue } from "mobx";
2
+ import type React from "react";
3
+ import type { SvgProps } from "@k8slens/element-components";
4
+ import type { AiToolKind } from "./ai-tool";
5
+ /** Resolves the icon component for a given AI tool kind. */
6
+ export type AiToolIcon = () => React.ComponentType<SvgProps>;
7
+ /**
8
+ * Per-kind icon for an AI tool — a React component (not an icon name). It
9
+ * accepts `SvgProps` so call sites can size it (`$size`), but every field is
10
+ * optional, so a prop-less component is assignable too. Shown beside the tool's
11
+ * name in the selector and wherever the tool is offered.
12
+ */
13
+ export declare const aiToolIconInjectionToken: import("@k8slens/injectable").InjectionToken2Base<AiToolIcon, () => React.ComponentType<{
14
+ $className?: import("@k8slens/public-utilities").IClassName;
15
+ className?: string;
16
+ $block?: boolean | "inline";
17
+ $cursor?: import("@k8slens/element-components").$CursorProps;
18
+ readonly $color?: import("@k8slens/element-components").TextColor | import("@k8slens/element-components").$ColorProps;
19
+ $backgroundColor?: import("@k8slens/element-components").BackgroundColor | import("@k8slens/element-components").$BackgroundColorProps;
20
+ $border?: import("@k8slens/element-components").$BorderProps;
21
+ $padding?: boolean | import("@k8slens/element-components").DirectionalPadding | import("@k8slens/element-components").TShirtSize;
22
+ $margin?: boolean | import("@k8slens/element-components").DirectionalMargin | import("@k8slens/element-components").TShirtSize | "auto";
23
+ $overflow?: import("@k8slens/element-components").Overflow | {
24
+ x?: import("@k8slens/element-components").Overflow;
25
+ y?: import("@k8slens/element-components").Overflow;
26
+ hideScrollbar?: boolean;
27
+ };
28
+ readonly $anchor?: boolean;
29
+ readonly $anchoredAt?: import("@k8slens/element-components").AnchoredAt;
30
+ readonly children?: React.ReactNode;
31
+ readonly $onOutsideClick?: (event: PointerEvent) => void;
32
+ $textAlign?: "left" | "center" | "right";
33
+ $ref?: import("@k8slens/element-components").$RefProp<HTMLElement>;
34
+ ref?: import("@k8slens/element-components").RefLike<HTMLElement>;
35
+ $focusable?: {
36
+ context: import("@k8slens/element-components").AnyFocusableContext<any>;
37
+ item: any;
38
+ orderNumber?: number;
39
+ } | undefined;
40
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
41
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
42
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
43
+ tabIndex?: HTMLElement["tabIndex"];
44
+ $grayscale?: boolean;
45
+ $style?: React.CSSProperties;
46
+ style?: React.CSSProperties;
47
+ $tint?: string;
48
+ $faded?: boolean;
49
+ $outline?: {
50
+ focusVisible?: import("@k8slens/element-components").$OutlineProps;
51
+ };
52
+ readonly $floating?: import("@k8slens/element-components").$FloatingProps;
53
+ $boxShadow?: boolean | "elevated" | "subtle";
54
+ readonly $hoverable?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableProps>;
55
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
56
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
57
+ $hoverableByDragging?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableByDraggingProps<any>> | undefined;
58
+ $absolute?: import("@k8slens/element-components").AbsolutePosition | boolean;
59
+ $hidden?: boolean;
60
+ $noPointerEvents?: boolean;
61
+ $offset?: {
62
+ direction: import("@k8slens/element-components").Direction;
63
+ size: import("@k8slens/element-components").TShirtSize;
64
+ };
65
+ $offsetChildren?: {
66
+ direction: import("@k8slens/element-components").Direction;
67
+ size: import("@k8slens/element-components").TShirtSize;
68
+ };
69
+ $relative?: boolean;
70
+ $fixed?: boolean;
71
+ $transition?: boolean;
72
+ $visuallyHidden?: boolean;
73
+ $displayContents?: boolean;
74
+ $draggable?: {
75
+ context: import("@k8slens/element-components").DraggableContext<any>;
76
+ item: any;
77
+ } | undefined;
78
+ $droppable?: {
79
+ context: import("@k8slens/element-components").DraggableContext<any>;
80
+ onDrop: (item: any) => void;
81
+ } | undefined;
82
+ $font?: boolean | {
83
+ size?: import("@k8slens/element-components").FontSize;
84
+ italic?: boolean;
85
+ bold?: boolean | "600";
86
+ lineHeight?: import("@k8slens/element-components").FontLineHeight;
87
+ forceWrap?: boolean;
88
+ noWrap?: boolean;
89
+ uppercase?: boolean;
90
+ underline?: boolean;
91
+ textOverflow?: "clip" | "ellipsis" | "default";
92
+ };
93
+ $tooltip?: string | import("@k8slens/element-components").$TooltipProps<any> | null;
94
+ $width?: import("@k8slens/element-components").TShirtSize | "full" | "stretch" | import("@k8slens/element-components").$WidthProps;
95
+ $height?: import("@k8slens/element-components").TShirtSize | "full" | "auto" | "stretch" | import("@k8slens/element-components").$HeightProps;
96
+ $size?: import("@k8slens/element-components").TShirtSize | "full" | import("@k8slens/element-components").$SizeProps;
97
+ $grid?: import("@k8slens/element-components").GridProps;
98
+ $flex?: import("@k8slens/element-components").SimpleFlexProp | import("@k8slens/element-components").MaximalFlexProps;
99
+ $gradient?: boolean;
100
+ $flexChild?: boolean | number | "shrinkable" | "fixed";
101
+ $area?: boolean;
102
+ $areaContent?: boolean;
103
+ $invisibleBackdrop?: boolean;
104
+ } & React.SVGProps<SVGSVGElement>>[], "zero-or-many", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{
105
+ $className?: import("@k8slens/public-utilities").IClassName;
106
+ className?: string;
107
+ $block?: boolean | "inline";
108
+ $cursor?: import("@k8slens/element-components").$CursorProps;
109
+ readonly $color?: import("@k8slens/element-components").TextColor | import("@k8slens/element-components").$ColorProps;
110
+ $backgroundColor?: import("@k8slens/element-components").BackgroundColor | import("@k8slens/element-components").$BackgroundColorProps;
111
+ $border?: import("@k8slens/element-components").$BorderProps;
112
+ $padding?: boolean | import("@k8slens/element-components").DirectionalPadding | import("@k8slens/element-components").TShirtSize;
113
+ $margin?: boolean | import("@k8slens/element-components").DirectionalMargin | import("@k8slens/element-components").TShirtSize | "auto";
114
+ $overflow?: import("@k8slens/element-components").Overflow | {
115
+ x?: import("@k8slens/element-components").Overflow;
116
+ y?: import("@k8slens/element-components").Overflow;
117
+ hideScrollbar?: boolean;
118
+ };
119
+ readonly $anchor?: boolean;
120
+ readonly $anchoredAt?: import("@k8slens/element-components").AnchoredAt;
121
+ readonly children?: React.ReactNode;
122
+ readonly $onOutsideClick?: (event: PointerEvent) => void;
123
+ $textAlign?: "left" | "center" | "right";
124
+ $ref?: import("@k8slens/element-components").$RefProp<HTMLElement>;
125
+ ref?: import("@k8slens/element-components").RefLike<HTMLElement>;
126
+ $focusable?: {
127
+ context: import("@k8slens/element-components").AnyFocusableContext<any>;
128
+ item: any;
129
+ orderNumber?: number;
130
+ } | undefined;
131
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
132
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
133
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
134
+ tabIndex?: HTMLElement["tabIndex"];
135
+ $grayscale?: boolean;
136
+ $style?: React.CSSProperties;
137
+ style?: React.CSSProperties;
138
+ $tint?: string;
139
+ $faded?: boolean;
140
+ $outline?: {
141
+ focusVisible?: import("@k8slens/element-components").$OutlineProps;
142
+ };
143
+ readonly $floating?: import("@k8slens/element-components").$FloatingProps;
144
+ $boxShadow?: boolean | "elevated" | "subtle";
145
+ readonly $hoverable?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableProps>;
146
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
147
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
148
+ $hoverableByDragging?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableByDraggingProps<any>> | undefined;
149
+ $absolute?: import("@k8slens/element-components").AbsolutePosition | boolean;
150
+ $hidden?: boolean;
151
+ $noPointerEvents?: boolean;
152
+ $offset?: {
153
+ direction: import("@k8slens/element-components").Direction;
154
+ size: import("@k8slens/element-components").TShirtSize;
155
+ };
156
+ $offsetChildren?: {
157
+ direction: import("@k8slens/element-components").Direction;
158
+ size: import("@k8slens/element-components").TShirtSize;
159
+ };
160
+ $relative?: boolean;
161
+ $fixed?: boolean;
162
+ $transition?: boolean;
163
+ $visuallyHidden?: boolean;
164
+ $displayContents?: boolean;
165
+ $draggable?: {
166
+ context: import("@k8slens/element-components").DraggableContext<any>;
167
+ item: any;
168
+ } | undefined;
169
+ $droppable?: {
170
+ context: import("@k8slens/element-components").DraggableContext<any>;
171
+ onDrop: (item: any) => void;
172
+ } | undefined;
173
+ $font?: boolean | {
174
+ size?: import("@k8slens/element-components").FontSize;
175
+ italic?: boolean;
176
+ bold?: boolean | "600";
177
+ lineHeight?: import("@k8slens/element-components").FontLineHeight;
178
+ forceWrap?: boolean;
179
+ noWrap?: boolean;
180
+ uppercase?: boolean;
181
+ underline?: boolean;
182
+ textOverflow?: "clip" | "ellipsis" | "default";
183
+ };
184
+ $tooltip?: string | import("@k8slens/element-components").$TooltipProps<any> | null;
185
+ $width?: import("@k8slens/element-components").TShirtSize | "full" | "stretch" | import("@k8slens/element-components").$WidthProps;
186
+ $height?: import("@k8slens/element-components").TShirtSize | "full" | "auto" | "stretch" | import("@k8slens/element-components").$HeightProps;
187
+ $size?: import("@k8slens/element-components").TShirtSize | "full" | import("@k8slens/element-components").$SizeProps;
188
+ $grid?: import("@k8slens/element-components").GridProps;
189
+ $flex?: import("@k8slens/element-components").SimpleFlexProp | import("@k8slens/element-components").MaximalFlexProps;
190
+ $gradient?: boolean;
191
+ $flexChild?: boolean | number | "shrinkable" | "fixed";
192
+ $area?: boolean;
193
+ $areaContent?: boolean;
194
+ $invisibleBackdrop?: boolean;
195
+ } & React.SVGProps<SVGSVGElement>>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{
196
+ $className?: import("@k8slens/public-utilities").IClassName;
197
+ className?: string;
198
+ $block?: boolean | "inline";
199
+ $cursor?: import("@k8slens/element-components").$CursorProps;
200
+ readonly $color?: import("@k8slens/element-components").TextColor | import("@k8slens/element-components").$ColorProps;
201
+ $backgroundColor?: import("@k8slens/element-components").BackgroundColor | import("@k8slens/element-components").$BackgroundColorProps;
202
+ $border?: import("@k8slens/element-components").$BorderProps;
203
+ $padding?: boolean | import("@k8slens/element-components").DirectionalPadding | import("@k8slens/element-components").TShirtSize;
204
+ $margin?: boolean | import("@k8slens/element-components").DirectionalMargin | import("@k8slens/element-components").TShirtSize | "auto";
205
+ $overflow?: import("@k8slens/element-components").Overflow | {
206
+ x?: import("@k8slens/element-components").Overflow;
207
+ y?: import("@k8slens/element-components").Overflow;
208
+ hideScrollbar?: boolean;
209
+ };
210
+ readonly $anchor?: boolean;
211
+ readonly $anchoredAt?: import("@k8slens/element-components").AnchoredAt;
212
+ readonly children?: React.ReactNode;
213
+ readonly $onOutsideClick?: (event: PointerEvent) => void;
214
+ $textAlign?: "left" | "center" | "right";
215
+ $ref?: import("@k8slens/element-components").$RefProp<HTMLElement>;
216
+ ref?: import("@k8slens/element-components").RefLike<HTMLElement>;
217
+ $focusable?: {
218
+ context: import("@k8slens/element-components").AnyFocusableContext<any>;
219
+ item: any;
220
+ orderNumber?: number;
221
+ } | undefined;
222
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
223
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
224
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
225
+ tabIndex?: HTMLElement["tabIndex"];
226
+ $grayscale?: boolean;
227
+ $style?: React.CSSProperties;
228
+ style?: React.CSSProperties;
229
+ $tint?: string;
230
+ $faded?: boolean;
231
+ $outline?: {
232
+ focusVisible?: import("@k8slens/element-components").$OutlineProps;
233
+ };
234
+ readonly $floating?: import("@k8slens/element-components").$FloatingProps;
235
+ $boxShadow?: boolean | "elevated" | "subtle";
236
+ readonly $hoverable?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableProps>;
237
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
238
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
239
+ $hoverableByDragging?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableByDraggingProps<any>> | undefined;
240
+ $absolute?: import("@k8slens/element-components").AbsolutePosition | boolean;
241
+ $hidden?: boolean;
242
+ $noPointerEvents?: boolean;
243
+ $offset?: {
244
+ direction: import("@k8slens/element-components").Direction;
245
+ size: import("@k8slens/element-components").TShirtSize;
246
+ };
247
+ $offsetChildren?: {
248
+ direction: import("@k8slens/element-components").Direction;
249
+ size: import("@k8slens/element-components").TShirtSize;
250
+ };
251
+ $relative?: boolean;
252
+ $fixed?: boolean;
253
+ $transition?: boolean;
254
+ $visuallyHidden?: boolean;
255
+ $displayContents?: boolean;
256
+ $draggable?: {
257
+ context: import("@k8slens/element-components").DraggableContext<any>;
258
+ item: any;
259
+ } | undefined;
260
+ $droppable?: {
261
+ context: import("@k8slens/element-components").DraggableContext<any>;
262
+ onDrop: (item: any) => void;
263
+ } | undefined;
264
+ $font?: boolean | {
265
+ size?: import("@k8slens/element-components").FontSize;
266
+ italic?: boolean;
267
+ bold?: boolean | "600";
268
+ lineHeight?: import("@k8slens/element-components").FontLineHeight;
269
+ forceWrap?: boolean;
270
+ noWrap?: boolean;
271
+ uppercase?: boolean;
272
+ underline?: boolean;
273
+ textOverflow?: "clip" | "ellipsis" | "default";
274
+ };
275
+ $tooltip?: string | import("@k8slens/element-components").$TooltipProps<any> | null;
276
+ $width?: import("@k8slens/element-components").TShirtSize | "full" | "stretch" | import("@k8slens/element-components").$WidthProps;
277
+ $height?: import("@k8slens/element-components").TShirtSize | "full" | "auto" | "stretch" | import("@k8slens/element-components").$HeightProps;
278
+ $size?: import("@k8slens/element-components").TShirtSize | "full" | import("@k8slens/element-components").$SizeProps;
279
+ $grid?: import("@k8slens/element-components").GridProps;
280
+ $flex?: import("@k8slens/element-components").SimpleFlexProp | import("@k8slens/element-components").MaximalFlexProps;
281
+ $gradient?: boolean;
282
+ $flexChild?: boolean | number | "shrinkable" | "fixed";
283
+ $area?: boolean;
284
+ $areaContent?: boolean;
285
+ $invisibleBackdrop?: boolean;
286
+ } & React.SVGProps<SVGSVGElement>>>[]> & {
287
+ readonly __abstract: true;
288
+ for: (kind: AiToolKind) => import("@k8slens/injectable").InjectionToken2Base<AiToolIcon, () => React.ComponentType<{
289
+ $className?: import("@k8slens/public-utilities").IClassName;
290
+ className?: string;
291
+ $block?: boolean | "inline";
292
+ $cursor?: import("@k8slens/element-components").$CursorProps;
293
+ readonly $color?: import("@k8slens/element-components").TextColor | import("@k8slens/element-components").$ColorProps;
294
+ $backgroundColor?: import("@k8slens/element-components").BackgroundColor | import("@k8slens/element-components").$BackgroundColorProps;
295
+ $border?: import("@k8slens/element-components").$BorderProps;
296
+ $padding?: boolean | import("@k8slens/element-components").DirectionalPadding | import("@k8slens/element-components").TShirtSize;
297
+ $margin?: boolean | import("@k8slens/element-components").DirectionalMargin | import("@k8slens/element-components").TShirtSize | "auto";
298
+ $overflow?: import("@k8slens/element-components").Overflow | {
299
+ x?: import("@k8slens/element-components").Overflow;
300
+ y?: import("@k8slens/element-components").Overflow;
301
+ hideScrollbar?: boolean;
302
+ };
303
+ readonly $anchor?: boolean;
304
+ readonly $anchoredAt?: import("@k8slens/element-components").AnchoredAt;
305
+ readonly children?: React.ReactNode;
306
+ readonly $onOutsideClick?: (event: PointerEvent) => void;
307
+ $textAlign?: "left" | "center" | "right";
308
+ $ref?: import("@k8slens/element-components").$RefProp<HTMLElement>;
309
+ ref?: import("@k8slens/element-components").RefLike<HTMLElement>;
310
+ $focusable?: {
311
+ context: import("@k8slens/element-components").AnyFocusableContext<any>;
312
+ item: any;
313
+ orderNumber?: number;
314
+ } | undefined;
315
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
316
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
317
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
318
+ tabIndex?: HTMLElement["tabIndex"];
319
+ $grayscale?: boolean;
320
+ $style?: React.CSSProperties;
321
+ style?: React.CSSProperties;
322
+ $tint?: string;
323
+ $faded?: boolean;
324
+ $outline?: {
325
+ focusVisible?: import("@k8slens/element-components").$OutlineProps;
326
+ };
327
+ readonly $floating?: import("@k8slens/element-components").$FloatingProps;
328
+ $boxShadow?: boolean | "elevated" | "subtle";
329
+ readonly $hoverable?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableProps>;
330
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
331
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
332
+ $hoverableByDragging?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableByDraggingProps<any>> | undefined;
333
+ $absolute?: import("@k8slens/element-components").AbsolutePosition | boolean;
334
+ $hidden?: boolean;
335
+ $noPointerEvents?: boolean;
336
+ $offset?: {
337
+ direction: import("@k8slens/element-components").Direction;
338
+ size: import("@k8slens/element-components").TShirtSize;
339
+ };
340
+ $offsetChildren?: {
341
+ direction: import("@k8slens/element-components").Direction;
342
+ size: import("@k8slens/element-components").TShirtSize;
343
+ };
344
+ $relative?: boolean;
345
+ $fixed?: boolean;
346
+ $transition?: boolean;
347
+ $visuallyHidden?: boolean;
348
+ $displayContents?: boolean;
349
+ $draggable?: {
350
+ context: import("@k8slens/element-components").DraggableContext<any>;
351
+ item: any;
352
+ } | undefined;
353
+ $droppable?: {
354
+ context: import("@k8slens/element-components").DraggableContext<any>;
355
+ onDrop: (item: any) => void;
356
+ } | undefined;
357
+ $font?: boolean | {
358
+ size?: import("@k8slens/element-components").FontSize;
359
+ italic?: boolean;
360
+ bold?: boolean | "600";
361
+ lineHeight?: import("@k8slens/element-components").FontLineHeight;
362
+ forceWrap?: boolean;
363
+ noWrap?: boolean;
364
+ uppercase?: boolean;
365
+ underline?: boolean;
366
+ textOverflow?: "clip" | "ellipsis" | "default";
367
+ };
368
+ $tooltip?: string | import("@k8slens/element-components").$TooltipProps<any> | null;
369
+ $width?: import("@k8slens/element-components").TShirtSize | "full" | "stretch" | import("@k8slens/element-components").$WidthProps;
370
+ $height?: import("@k8slens/element-components").TShirtSize | "full" | "auto" | "stretch" | import("@k8slens/element-components").$HeightProps;
371
+ $size?: import("@k8slens/element-components").TShirtSize | "full" | import("@k8slens/element-components").$SizeProps;
372
+ $grid?: import("@k8slens/element-components").GridProps;
373
+ $flex?: import("@k8slens/element-components").SimpleFlexProp | import("@k8slens/element-components").MaximalFlexProps;
374
+ $gradient?: boolean;
375
+ $flexChild?: boolean | number | "shrinkable" | "fixed";
376
+ $area?: boolean;
377
+ $areaContent?: boolean;
378
+ $invisibleBackdrop?: boolean;
379
+ } & React.SVGProps<SVGSVGElement>>[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{
380
+ $className?: import("@k8slens/public-utilities").IClassName;
381
+ className?: string;
382
+ $block?: boolean | "inline";
383
+ $cursor?: import("@k8slens/element-components").$CursorProps;
384
+ readonly $color?: import("@k8slens/element-components").TextColor | import("@k8slens/element-components").$ColorProps;
385
+ $backgroundColor?: import("@k8slens/element-components").BackgroundColor | import("@k8slens/element-components").$BackgroundColorProps;
386
+ $border?: import("@k8slens/element-components").$BorderProps;
387
+ $padding?: boolean | import("@k8slens/element-components").DirectionalPadding | import("@k8slens/element-components").TShirtSize;
388
+ $margin?: boolean | import("@k8slens/element-components").DirectionalMargin | import("@k8slens/element-components").TShirtSize | "auto";
389
+ $overflow?: import("@k8slens/element-components").Overflow | {
390
+ x?: import("@k8slens/element-components").Overflow;
391
+ y?: import("@k8slens/element-components").Overflow;
392
+ hideScrollbar?: boolean;
393
+ };
394
+ readonly $anchor?: boolean;
395
+ readonly $anchoredAt?: import("@k8slens/element-components").AnchoredAt;
396
+ readonly children?: React.ReactNode;
397
+ readonly $onOutsideClick?: (event: PointerEvent) => void;
398
+ $textAlign?: "left" | "center" | "right";
399
+ $ref?: import("@k8slens/element-components").$RefProp<HTMLElement>;
400
+ ref?: import("@k8slens/element-components").RefLike<HTMLElement>;
401
+ $focusable?: {
402
+ context: import("@k8slens/element-components").AnyFocusableContext<any>;
403
+ item: any;
404
+ orderNumber?: number;
405
+ } | undefined;
406
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
407
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
408
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
409
+ tabIndex?: HTMLElement["tabIndex"];
410
+ $grayscale?: boolean;
411
+ $style?: React.CSSProperties;
412
+ style?: React.CSSProperties;
413
+ $tint?: string;
414
+ $faded?: boolean;
415
+ $outline?: {
416
+ focusVisible?: import("@k8slens/element-components").$OutlineProps;
417
+ };
418
+ readonly $floating?: import("@k8slens/element-components").$FloatingProps;
419
+ $boxShadow?: boolean | "elevated" | "subtle";
420
+ readonly $hoverable?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableProps>;
421
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
422
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
423
+ $hoverableByDragging?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableByDraggingProps<any>> | undefined;
424
+ $absolute?: import("@k8slens/element-components").AbsolutePosition | boolean;
425
+ $hidden?: boolean;
426
+ $noPointerEvents?: boolean;
427
+ $offset?: {
428
+ direction: import("@k8slens/element-components").Direction;
429
+ size: import("@k8slens/element-components").TShirtSize;
430
+ };
431
+ $offsetChildren?: {
432
+ direction: import("@k8slens/element-components").Direction;
433
+ size: import("@k8slens/element-components").TShirtSize;
434
+ };
435
+ $relative?: boolean;
436
+ $fixed?: boolean;
437
+ $transition?: boolean;
438
+ $visuallyHidden?: boolean;
439
+ $displayContents?: boolean;
440
+ $draggable?: {
441
+ context: import("@k8slens/element-components").DraggableContext<any>;
442
+ item: any;
443
+ } | undefined;
444
+ $droppable?: {
445
+ context: import("@k8slens/element-components").DraggableContext<any>;
446
+ onDrop: (item: any) => void;
447
+ } | undefined;
448
+ $font?: boolean | {
449
+ size?: import("@k8slens/element-components").FontSize;
450
+ italic?: boolean;
451
+ bold?: boolean | "600";
452
+ lineHeight?: import("@k8slens/element-components").FontLineHeight;
453
+ forceWrap?: boolean;
454
+ noWrap?: boolean;
455
+ uppercase?: boolean;
456
+ underline?: boolean;
457
+ textOverflow?: "clip" | "ellipsis" | "default";
458
+ };
459
+ $tooltip?: string | import("@k8slens/element-components").$TooltipProps<any> | null;
460
+ $width?: import("@k8slens/element-components").TShirtSize | "full" | "stretch" | import("@k8slens/element-components").$WidthProps;
461
+ $height?: import("@k8slens/element-components").TShirtSize | "full" | "auto" | "stretch" | import("@k8slens/element-components").$HeightProps;
462
+ $size?: import("@k8slens/element-components").TShirtSize | "full" | import("@k8slens/element-components").$SizeProps;
463
+ $grid?: import("@k8slens/element-components").GridProps;
464
+ $flex?: import("@k8slens/element-components").SimpleFlexProp | import("@k8slens/element-components").MaximalFlexProps;
465
+ $gradient?: boolean;
466
+ $flexChild?: boolean | number | "shrinkable" | "fixed";
467
+ $area?: boolean;
468
+ $areaContent?: boolean;
469
+ $invisibleBackdrop?: boolean;
470
+ } & React.SVGProps<SVGSVGElement>>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{
471
+ $className?: import("@k8slens/public-utilities").IClassName;
472
+ className?: string;
473
+ $block?: boolean | "inline";
474
+ $cursor?: import("@k8slens/element-components").$CursorProps;
475
+ readonly $color?: import("@k8slens/element-components").TextColor | import("@k8slens/element-components").$ColorProps;
476
+ $backgroundColor?: import("@k8slens/element-components").BackgroundColor | import("@k8slens/element-components").$BackgroundColorProps;
477
+ $border?: import("@k8slens/element-components").$BorderProps;
478
+ $padding?: boolean | import("@k8slens/element-components").DirectionalPadding | import("@k8slens/element-components").TShirtSize;
479
+ $margin?: boolean | import("@k8slens/element-components").DirectionalMargin | import("@k8slens/element-components").TShirtSize | "auto";
480
+ $overflow?: import("@k8slens/element-components").Overflow | {
481
+ x?: import("@k8slens/element-components").Overflow;
482
+ y?: import("@k8slens/element-components").Overflow;
483
+ hideScrollbar?: boolean;
484
+ };
485
+ readonly $anchor?: boolean;
486
+ readonly $anchoredAt?: import("@k8slens/element-components").AnchoredAt;
487
+ readonly children?: React.ReactNode;
488
+ readonly $onOutsideClick?: (event: PointerEvent) => void;
489
+ $textAlign?: "left" | "center" | "right";
490
+ $ref?: import("@k8slens/element-components").$RefProp<HTMLElement>;
491
+ ref?: import("@k8slens/element-components").RefLike<HTMLElement>;
492
+ $focusable?: {
493
+ context: import("@k8slens/element-components").AnyFocusableContext<any>;
494
+ item: any;
495
+ orderNumber?: number;
496
+ } | undefined;
497
+ onFocus?: React.FocusEventHandler<HTMLElement> | undefined;
498
+ onBlur?: React.FocusEventHandler<HTMLElement> | undefined;
499
+ onKeyDown?: React.KeyboardEventHandler<HTMLElement> | undefined;
500
+ tabIndex?: HTMLElement["tabIndex"];
501
+ $grayscale?: boolean;
502
+ $style?: React.CSSProperties;
503
+ style?: React.CSSProperties;
504
+ $tint?: string;
505
+ $faded?: boolean;
506
+ $outline?: {
507
+ focusVisible?: import("@k8slens/element-components").$OutlineProps;
508
+ };
509
+ readonly $floating?: import("@k8slens/element-components").$FloatingProps;
510
+ $boxShadow?: boolean | "elevated" | "subtle";
511
+ readonly $hoverable?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableProps>;
512
+ onMouseEnter?: React.MouseEventHandler<HTMLElement> | undefined;
513
+ onMouseLeave?: React.MouseEventHandler<HTMLElement> | undefined;
514
+ $hoverableByDragging?: import("@k8slens/public-utilities").SingleOrMany<import("@k8slens/element-components").$HoverableByDraggingProps<any>> | undefined;
515
+ $absolute?: import("@k8slens/element-components").AbsolutePosition | boolean;
516
+ $hidden?: boolean;
517
+ $noPointerEvents?: boolean;
518
+ $offset?: {
519
+ direction: import("@k8slens/element-components").Direction;
520
+ size: import("@k8slens/element-components").TShirtSize;
521
+ };
522
+ $offsetChildren?: {
523
+ direction: import("@k8slens/element-components").Direction;
524
+ size: import("@k8slens/element-components").TShirtSize;
525
+ };
526
+ $relative?: boolean;
527
+ $fixed?: boolean;
528
+ $transition?: boolean;
529
+ $visuallyHidden?: boolean;
530
+ $displayContents?: boolean;
531
+ $draggable?: {
532
+ context: import("@k8slens/element-components").DraggableContext<any>;
533
+ item: any;
534
+ } | undefined;
535
+ $droppable?: {
536
+ context: import("@k8slens/element-components").DraggableContext<any>;
537
+ onDrop: (item: any) => void;
538
+ } | undefined;
539
+ $font?: boolean | {
540
+ size?: import("@k8slens/element-components").FontSize;
541
+ italic?: boolean;
542
+ bold?: boolean | "600";
543
+ lineHeight?: import("@k8slens/element-components").FontLineHeight;
544
+ forceWrap?: boolean;
545
+ noWrap?: boolean;
546
+ uppercase?: boolean;
547
+ underline?: boolean;
548
+ textOverflow?: "clip" | "ellipsis" | "default";
549
+ };
550
+ $tooltip?: string | import("@k8slens/element-components").$TooltipProps<any> | null;
551
+ $width?: import("@k8slens/element-components").TShirtSize | "full" | "stretch" | import("@k8slens/element-components").$WidthProps;
552
+ $height?: import("@k8slens/element-components").TShirtSize | "full" | "auto" | "stretch" | import("@k8slens/element-components").$HeightProps;
553
+ $size?: import("@k8slens/element-components").TShirtSize | "full" | import("@k8slens/element-components").$SizeProps;
554
+ $grid?: import("@k8slens/element-components").GridProps;
555
+ $flex?: import("@k8slens/element-components").SimpleFlexProp | import("@k8slens/element-components").MaximalFlexProps;
556
+ $gradient?: boolean;
557
+ $flexChild?: boolean | number | "shrinkable" | "fixed";
558
+ $area?: boolean;
559
+ $areaContent?: boolean;
560
+ $invisibleBackdrop?: boolean;
561
+ } & React.SVGProps<SVGSVGElement>>>[]> & {
562
+ readonly __abstract?: never;
563
+ } & {
564
+ speciality: any;
565
+ };
566
+ };
567
+ /**
568
+ * Resolves the icon component for an arbitrary AI tool kind, falling back to the generic icon for kinds
569
+ * without a registered one (e.g. the custom kind). Use this to render a *specific* tool's icon — e.g. an
570
+ * entry point that must stay on the tool it was created for rather than following the live selection.
571
+ * For the currently-selected tool, prefer {@link effectiveAiToolIconInjectionToken}.
572
+ */
573
+ export type AiToolIconForKind = () => Promise<IComputedValue<(kind: AiToolKind) => React.ComponentType<SvgProps>>>;
574
+ export declare const aiToolIconForKindInjectionToken: import("@k8slens/injectable").InjectionToken2Base<AiToolIconForKind, () => Promise<IComputedValue<(kind: AiToolKind) => React.ComponentType<SvgProps>>>[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<Promise<IComputedValue<(kind: AiToolKind) => React.ComponentType<SvgProps>>>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<Promise<IComputedValue<(kind: AiToolKind) => React.ComponentType<SvgProps>>>>[]> & {
575
+ readonly __abstract?: never;
576
+ };
577
+ //# sourceMappingURL=ai-tool-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tool-icon.d.ts","sourceRoot":"","sources":["../../src/ai-tool-icon.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,4DAA4D;AAC5D,MAAM,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAG3B,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,UAAU,KAAK,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEnH,eAAO,MAAM,+BAA+B,2GAFwB,UAAU,KAAK,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC;;CAK5G,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AiToolKind } from "./ai-tool";
2
+ /**
3
+ * The registry of available AI tool kinds. Each contribution is JUST a kind;
4
+ * every other aspect (command, install-state, name, order, …) is contributed
5
+ * via its own `.for(kind)` token.
6
+ */
7
+ export declare const aiToolInjectionToken: import("@k8slens/injectable").InjectionToken2Base<() => AiToolKind, () => string[], "zero-or-many", () => import("@k8slens/injectable").InjectionInstanceWithMeta<string>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<string>[]> & {
8
+ readonly __abstract?: never;
9
+ };
10
+ //# sourceMappingURL=ai-tool-injection-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tool-injection-token.d.ts","sourceRoot":"","sources":["../../src/ai-tool-injection-token.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,0DAA6C,UAAU;;CAGpF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type React from "react";
2
+ import type { AiToolKind } from "./ai-tool";
3
+ /** Resolves a kind's installation-instructions component. */
4
+ export type AiToolInstallationInstructions = () => React.ComponentType;
5
+ /**
6
+ * Per-kind installation instructions UI, rendered beneath the AI-tool selector
7
+ * when that kind is detected as not installed — so the tool is shown disabled
8
+ * instead of hidden, with guidance on how to install it. Optional; a React
9
+ * component, so instructions may include links (e.g. `<BrowserLink>`) or any
10
+ * other markup.
11
+ */
12
+ export declare const aiToolInstallationInstructionsInjectionToken: import("@k8slens/injectable").InjectionToken2Base<AiToolInstallationInstructions, () => React.ComponentType<{}>[], "zero-or-many", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{}>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{}>>[]> & {
13
+ readonly __abstract: true;
14
+ for: (kind: AiToolKind) => import("@k8slens/injectable").InjectionToken2Base<AiToolInstallationInstructions, () => React.ComponentType<{}>[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{}>>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<React.ComponentType<{}>>[]> & {
15
+ readonly __abstract?: never;
16
+ } & {
17
+ speciality: any;
18
+ };
19
+ };
20
+ //# sourceMappingURL=ai-tool-installation-instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tool-installation-instructions.d.ts","sourceRoot":"","sources":["../../src/ai-tool-installation-instructions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,6DAA6D;AAC7D,MAAM,MAAM,8BAA8B,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;AAEvE;;;;;;GAMG;AACH,eAAO,MAAM,4CAA4C;;gBAK/C,UAAU;;;;;CAMnB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** Runs an installation-detection command on the host; resolves `true` iff it exits 0. */
2
+ export type AiToolInstalledViaCliCommand = (command: string) => Promise<boolean>;
3
+ /**
4
+ * Runs a tool's `getAiToolIsInstalledCliCommand` output on the host and reports
5
+ * whether it succeeded (exit code 0). Implemented in the `@lensapp/ai-tools`
6
+ * feature via `cliExecute` against the shell-synced environment, so detection
7
+ * resolves the same PATH the launched tools see. The detected-tools list
8
+ * (`refreshAiTools`) runs the per-kind command through it.
9
+ *
10
+ * The instance is the check function itself (`di.inject(token)()` yields it) —
11
+ * a v2 injectable memoises its instance by call args, so returning a function
12
+ * (rather than a `Promise<boolean>`) keeps every check live across re-scans.
13
+ */
14
+ export declare const aiToolInstalledViaCliCommandInjectionToken: import("@k8slens/injectable").InjectionToken2Base<() => AiToolInstalledViaCliCommand, () => AiToolInstalledViaCliCommand[], "one", () => import("@k8slens/injectable").InjectionInstanceWithMeta<AiToolInstalledViaCliCommand>, () => import("@k8slens/injectable").InjectionInstanceWithMeta<AiToolInstalledViaCliCommand>[]> & {
15
+ readonly __abstract?: never;
16
+ };
17
+ //# sourceMappingURL=ai-tool-installed-via-cli-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tool-installed-via-cli-command.d.ts","sourceRoot":"","sources":["../../src/ai-tool-installed-via-cli-command.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0CAA0C,0DAChC,4BAA4B;;CAI/C,CAAC"}