lastriko 0.1.2 → 0.1.7
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.
- package/README.md +1 -1
- package/dist/__tests__/integration/ws-flow.integration.test.js +38 -140
- package/dist/__tests__/integration/ws-flow.integration.test.js.map +1 -1
- package/dist/client/events.js +169 -49
- package/dist/client/events.js.map +1 -1
- package/dist/client/swap.d.ts +14 -1
- package/dist/client/swap.js +185 -7
- package/dist/client/swap.js.map +1 -1
- package/dist/client/ws.d.ts +1 -0
- package/dist/client/ws.js +214 -35
- package/dist/client/ws.js.map +1 -1
- package/dist/client/ws.test.js +6 -146
- package/dist/client/ws.test.js.map +1 -1
- package/dist/components/context.d.ts +14 -2
- package/dist/components/context.js +330 -5
- package/dist/components/context.js.map +1 -1
- package/dist/components/context.test.js +74 -56
- package/dist/components/context.test.js.map +1 -1
- package/dist/components/registry.d.ts +2 -2
- package/dist/components/registry.js +52 -4
- package/dist/components/registry.js.map +1 -1
- package/dist/components/types.d.ts +180 -4
- package/dist/engine/code-highlight.d.ts +1 -0
- package/dist/engine/code-highlight.js +64 -0
- package/dist/engine/code-highlight.js.map +1 -0
- package/dist/engine/code-highlight.test.d.ts +1 -0
- package/dist/engine/code-highlight.test.js +15 -0
- package/dist/engine/code-highlight.test.js.map +1 -0
- package/dist/engine/executor.js +16 -0
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/executor.test.js +33 -4
- package/dist/engine/executor.test.js.map +1 -1
- package/dist/engine/messages.d.ts +9 -1
- package/dist/engine/messages.js.map +1 -1
- package/dist/engine/messages.test.d.ts +1 -0
- package/dist/engine/messages.test.js +39 -0
- package/dist/engine/messages.test.js.map +1 -0
- package/dist/engine/renderer.js +241 -14
- package/dist/engine/renderer.js.map +1 -1
- package/dist/engine/renderer.test.js +230 -202
- package/dist/engine/renderer.test.js.map +1 -1
- package/dist/engine/server.d.ts +2 -0
- package/dist/engine/server.js +57 -6
- package/dist/engine/server.js.map +1 -1
- package/dist/engine/server.test.js +105 -4
- package/dist/engine/server.test.js.map +1 -1
- package/dist/engine/watcher.d.ts +17 -1
- package/dist/engine/watcher.js +42 -5
- package/dist/engine/watcher.js.map +1 -1
- package/dist/engine/watcher.test.d.ts +1 -0
- package/dist/engine/watcher.test.js +62 -0
- package/dist/engine/watcher.test.js.map +1 -0
- package/dist/engine/websocket.d.ts +2 -0
- package/dist/engine/websocket.hub.test.js +24 -0
- package/dist/engine/websocket.hub.test.js.map +1 -1
- package/dist/engine/websocket.js +6 -1
- package/dist/engine/websocket.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/style.css +150 -0
- package/dist/theme/lastriko.css +150 -0
- package/package.json +5 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { WritableAtom } from 'nanostores';
|
|
2
2
|
import type { ServerToClientMessage, ThemeMode } from '../engine/messages';
|
|
3
|
-
export type ComponentType = 'text' | 'button' | 'textInput' | 'numberInput' | 'slider' | 'toggle' | 'select' | 'fileUpload' | 'markdown' | 'image' | 'imageGrid' | 'code' | 'json' | 'table' | 'metric' | 'progress' | 'shell' | 'grid' | 'tabs' | 'card' | 'divider' | 'spacer' | 'alert' | 'loading' | 'streamText' | 'chatUI' | 'promptEditor';
|
|
3
|
+
export type ComponentType = 'text' | 'button' | 'textInput' | 'numberInput' | 'slider' | 'toggle' | 'select' | 'multiSelect' | 'colorPicker' | 'dateInput' | 'fileUpload' | 'markdown' | 'image' | 'imageGrid' | 'video' | 'audio' | 'code' | 'json' | 'diff' | 'table' | 'metric' | 'progress' | 'shell' | 'grid' | 'tabs' | 'accordion' | 'fullscreen' | 'card' | 'divider' | 'spacer' | 'alert' | 'loading' | 'streamText' | 'chatUI' | 'promptEditor' | 'modelCompare' | 'parameterPanel' | 'filmStrip' | 'beforeAfter';
|
|
4
4
|
export type TableRow = Record<string, unknown>;
|
|
5
5
|
export interface ComponentHandle<TProps, TValue = void> {
|
|
6
6
|
readonly id: string;
|
|
@@ -74,12 +74,32 @@ export interface FileUploadOpts {
|
|
|
74
74
|
helperText?: string;
|
|
75
75
|
dragDrop?: boolean;
|
|
76
76
|
}
|
|
77
|
+
export interface MultiSelectOpts {
|
|
78
|
+
defaults?: string[];
|
|
79
|
+
disabled?: boolean;
|
|
80
|
+
helperText?: string;
|
|
81
|
+
maxSelections?: number;
|
|
82
|
+
}
|
|
83
|
+
export interface ColorPickerOpts {
|
|
84
|
+
default?: string;
|
|
85
|
+
format?: 'hex' | 'rgb' | 'hsl';
|
|
86
|
+
disabled?: boolean;
|
|
87
|
+
helperText?: string;
|
|
88
|
+
swatches?: string[];
|
|
89
|
+
}
|
|
90
|
+
export interface DateInputOpts {
|
|
91
|
+
default?: string;
|
|
92
|
+
min?: string;
|
|
93
|
+
max?: string;
|
|
94
|
+
disabled?: boolean;
|
|
95
|
+
helperText?: string;
|
|
96
|
+
type?: 'date' | 'datetime-local' | 'time' | 'month';
|
|
97
|
+
}
|
|
77
98
|
export interface UploadedFile {
|
|
78
99
|
name: string;
|
|
79
100
|
path: string;
|
|
80
101
|
size: number;
|
|
81
102
|
type: string;
|
|
82
|
-
lastModified: number;
|
|
83
103
|
}
|
|
84
104
|
export interface TextProps {
|
|
85
105
|
content: string;
|
|
@@ -118,6 +138,23 @@ export interface FileUploadProps extends FileUploadOpts {
|
|
|
118
138
|
label: string;
|
|
119
139
|
value: UploadedFile | UploadedFile[] | null;
|
|
120
140
|
}
|
|
141
|
+
export interface MultiSelectProps extends MultiSelectOpts {
|
|
142
|
+
label: string;
|
|
143
|
+
options: Array<{
|
|
144
|
+
label: string;
|
|
145
|
+
value: string;
|
|
146
|
+
disabled?: boolean;
|
|
147
|
+
}>;
|
|
148
|
+
value: string[];
|
|
149
|
+
}
|
|
150
|
+
export interface ColorPickerProps extends ColorPickerOpts {
|
|
151
|
+
label: string;
|
|
152
|
+
value: string;
|
|
153
|
+
}
|
|
154
|
+
export interface DateInputProps extends DateInputOpts {
|
|
155
|
+
label: string;
|
|
156
|
+
value: string;
|
|
157
|
+
}
|
|
121
158
|
export interface MarkdownProps {
|
|
122
159
|
content: string;
|
|
123
160
|
}
|
|
@@ -138,6 +175,23 @@ export interface ImageGridProps {
|
|
|
138
175
|
gap?: number;
|
|
139
176
|
minWidth?: number;
|
|
140
177
|
}
|
|
178
|
+
export interface VideoProps {
|
|
179
|
+
src: string;
|
|
180
|
+
controls?: boolean;
|
|
181
|
+
autoplay?: boolean;
|
|
182
|
+
muted?: boolean;
|
|
183
|
+
loop?: boolean;
|
|
184
|
+
poster?: string;
|
|
185
|
+
width?: string;
|
|
186
|
+
caption?: string;
|
|
187
|
+
}
|
|
188
|
+
export interface AudioProps {
|
|
189
|
+
src: string;
|
|
190
|
+
controls?: boolean;
|
|
191
|
+
autoplay?: boolean;
|
|
192
|
+
loop?: boolean;
|
|
193
|
+
label?: string;
|
|
194
|
+
}
|
|
141
195
|
export interface CodeProps {
|
|
142
196
|
content: string;
|
|
143
197
|
lang?: string;
|
|
@@ -146,6 +200,15 @@ export interface JsonProps {
|
|
|
146
200
|
label?: string;
|
|
147
201
|
data: unknown;
|
|
148
202
|
}
|
|
203
|
+
export interface DiffProps {
|
|
204
|
+
before: string;
|
|
205
|
+
after: string;
|
|
206
|
+
mode?: 'split' | 'unified';
|
|
207
|
+
beforeLabel?: string;
|
|
208
|
+
afterLabel?: string;
|
|
209
|
+
lang?: string;
|
|
210
|
+
context?: number;
|
|
211
|
+
}
|
|
149
212
|
export interface TableProps {
|
|
150
213
|
columns: string[];
|
|
151
214
|
rows: Array<{
|
|
@@ -189,6 +252,19 @@ export interface GridOpts {
|
|
|
189
252
|
export interface TabsOpts {
|
|
190
253
|
defaultTab?: string;
|
|
191
254
|
}
|
|
255
|
+
export interface AccordionSection {
|
|
256
|
+
label: string;
|
|
257
|
+
content: (ctx: UIContext) => void;
|
|
258
|
+
defaultOpen?: boolean;
|
|
259
|
+
}
|
|
260
|
+
export interface AccordionOpts {
|
|
261
|
+
allowMultiple?: boolean;
|
|
262
|
+
}
|
|
263
|
+
export interface FullscreenOpts {
|
|
264
|
+
trigger?: 'button' | 'manual';
|
|
265
|
+
label?: string;
|
|
266
|
+
defaultOpen?: boolean;
|
|
267
|
+
}
|
|
192
268
|
export interface ToastOpts {
|
|
193
269
|
type?: 'info' | 'success' | 'warning' | 'error';
|
|
194
270
|
duration?: number;
|
|
@@ -224,6 +300,74 @@ export interface ChatUIOptions {
|
|
|
224
300
|
export interface ChatUIProps extends ChatUIOptions {
|
|
225
301
|
messages: ChatMessage[];
|
|
226
302
|
}
|
|
303
|
+
export interface ModelSpec {
|
|
304
|
+
label: string;
|
|
305
|
+
model: string;
|
|
306
|
+
provider: string;
|
|
307
|
+
color?: string;
|
|
308
|
+
}
|
|
309
|
+
export interface ModelCompareOpts {
|
|
310
|
+
prompt: string;
|
|
311
|
+
systemPrompt?: string;
|
|
312
|
+
temperature?: number;
|
|
313
|
+
maxTokens?: number;
|
|
314
|
+
streaming?: boolean;
|
|
315
|
+
}
|
|
316
|
+
export interface ModelCompareResults {
|
|
317
|
+
results: Record<string, string>;
|
|
318
|
+
isStreaming: Record<string, boolean>;
|
|
319
|
+
errors: Record<string, string | null>;
|
|
320
|
+
latencies: Record<string, number>;
|
|
321
|
+
}
|
|
322
|
+
export interface ModelCompareProps extends ModelCompareOpts {
|
|
323
|
+
models: ModelSpec[];
|
|
324
|
+
value: ModelCompareResults;
|
|
325
|
+
}
|
|
326
|
+
export type ParameterSchema = Record<string, ParameterDef>;
|
|
327
|
+
export interface ParameterDef {
|
|
328
|
+
type: 'number' | 'string' | 'boolean' | 'select';
|
|
329
|
+
label?: string;
|
|
330
|
+
default?: unknown;
|
|
331
|
+
min?: number;
|
|
332
|
+
max?: number;
|
|
333
|
+
step?: number;
|
|
334
|
+
options?: string[];
|
|
335
|
+
description?: string;
|
|
336
|
+
}
|
|
337
|
+
export interface ParameterPanelOpts {
|
|
338
|
+
title?: string;
|
|
339
|
+
collapsible?: boolean;
|
|
340
|
+
}
|
|
341
|
+
export interface ParameterPanelProps extends ParameterPanelOpts {
|
|
342
|
+
schema: ParameterSchema;
|
|
343
|
+
ids: string[];
|
|
344
|
+
value: Record<string, unknown>;
|
|
345
|
+
}
|
|
346
|
+
export interface FilmStripItem {
|
|
347
|
+
src: string;
|
|
348
|
+
alt?: string;
|
|
349
|
+
caption?: string;
|
|
350
|
+
thumbnail?: string;
|
|
351
|
+
}
|
|
352
|
+
export interface FilmStripOpts {
|
|
353
|
+
height?: number;
|
|
354
|
+
zoom?: boolean;
|
|
355
|
+
showCaptions?: boolean;
|
|
356
|
+
selectedIndex?: number;
|
|
357
|
+
}
|
|
358
|
+
export interface FilmStripProps extends FilmStripOpts {
|
|
359
|
+
images: FilmStripItem[];
|
|
360
|
+
}
|
|
361
|
+
export interface BeforeAfterOpts {
|
|
362
|
+
beforeLabel?: string;
|
|
363
|
+
afterLabel?: string;
|
|
364
|
+
initialPosition?: number;
|
|
365
|
+
orientation?: 'horizontal' | 'vertical';
|
|
366
|
+
}
|
|
367
|
+
export interface BeforeAfterProps extends BeforeAfterOpts {
|
|
368
|
+
before: string;
|
|
369
|
+
after: string;
|
|
370
|
+
}
|
|
227
371
|
export interface PromptEditorOpts extends TextInputOpts {
|
|
228
372
|
label?: string;
|
|
229
373
|
variables?: string[];
|
|
@@ -246,6 +390,9 @@ export type SliderHandle = InputHandle<number, SliderProps>;
|
|
|
246
390
|
export type ToggleHandle = InputHandle<boolean, ToggleProps>;
|
|
247
391
|
export type SelectHandle = InputHandle<string, SelectProps>;
|
|
248
392
|
export type FileUploadHandle = InputHandle<UploadedFile | UploadedFile[] | null, FileUploadProps>;
|
|
393
|
+
export type MultiSelectHandle = InputHandle<string[], MultiSelectProps>;
|
|
394
|
+
export type ColorPickerHandle = InputHandle<string, ColorPickerProps>;
|
|
395
|
+
export type DateInputHandle = InputHandle<string, DateInputProps>;
|
|
249
396
|
export interface TableRowHandle {
|
|
250
397
|
id: string;
|
|
251
398
|
update(data: Partial<TableRow>): void;
|
|
@@ -267,6 +414,15 @@ export interface ProgressHandle extends Omit<ComponentHandle<ProgressProps, numb
|
|
|
267
414
|
readonly type: 'progress';
|
|
268
415
|
update(value: number | null, opts?: ProgressOpts): void;
|
|
269
416
|
}
|
|
417
|
+
export interface TabsHandle extends ComponentHandle<Record<string, unknown>, string> {
|
|
418
|
+
readonly type: 'tabs';
|
|
419
|
+
setActive(label: string): void;
|
|
420
|
+
}
|
|
421
|
+
export interface FullscreenHandle extends ComponentHandle<Record<string, unknown>, boolean> {
|
|
422
|
+
readonly type: 'fullscreen';
|
|
423
|
+
open(): void;
|
|
424
|
+
close(): void;
|
|
425
|
+
}
|
|
270
426
|
export interface StreamHandle extends Omit<ComponentHandle<StreamTextProps, string>, 'update'> {
|
|
271
427
|
readonly type: 'streamText';
|
|
272
428
|
readonly text: string;
|
|
@@ -287,7 +443,15 @@ export interface PromptEditorHandle extends InputHandle<string, PromptEditorProp
|
|
|
287
443
|
readonly type: 'promptEditor';
|
|
288
444
|
interpolate(vars: Record<string, string>): string;
|
|
289
445
|
}
|
|
290
|
-
export
|
|
446
|
+
export interface ModelCompareHandle extends ComponentHandle<ModelCompareProps, ModelCompareResults> {
|
|
447
|
+
readonly type: 'modelCompare';
|
|
448
|
+
readonly results: Record<string, string>;
|
|
449
|
+
readonly isStreaming: Record<string, boolean>;
|
|
450
|
+
readonly errors: Record<string, string | null>;
|
|
451
|
+
readonly latencies: Record<string, number>;
|
|
452
|
+
}
|
|
453
|
+
export type ParameterPanelHandle = InputHandle<Record<string, unknown>, ParameterPanelProps>;
|
|
454
|
+
export type AnyComponentHandle = TextHandle | ButtonHandle | TextInputHandle | NumberInputHandle | SliderHandle | ToggleHandle | SelectHandle | MultiSelectHandle | ColorPickerHandle | DateInputHandle | FileUploadHandle | TableHandle | MetricHandle | ProgressHandle | TabsHandle | FullscreenHandle | StreamHandle | ChatHandle | PromptEditorHandle | ModelCompareHandle | ParameterPanelHandle | ComponentHandle<MarkdownProps> | ComponentHandle<ImageProps> | ComponentHandle<ImageGridProps> | ComponentHandle<VideoProps> | ComponentHandle<AudioProps> | ComponentHandle<CodeProps> | ComponentHandle<JsonProps> | ComponentHandle<DiffProps> | ComponentHandle<FilmStripProps> | ComponentHandle<BeforeAfterProps> | ComponentHandle<Record<string, unknown>, unknown>;
|
|
291
455
|
export interface RenderNode {
|
|
292
456
|
id: string;
|
|
293
457
|
}
|
|
@@ -358,10 +522,18 @@ export interface UIContext {
|
|
|
358
522
|
slider(label: string, opts: SliderOpts): SliderHandle;
|
|
359
523
|
toggle(label: string, opts?: ToggleOpts): ToggleHandle;
|
|
360
524
|
select(label: string, options: SelectOption[], opts?: SelectOpts): SelectHandle;
|
|
525
|
+
multiSelect(label: string, options: SelectOption[], opts?: MultiSelectOpts): MultiSelectHandle;
|
|
526
|
+
colorPicker(label: string, opts?: ColorPickerOpts): ColorPickerHandle;
|
|
527
|
+
dateInput(label: string, opts?: DateInputOpts): DateInputHandle;
|
|
361
528
|
fileUpload(label: string, opts?: FileUploadOpts): FileUploadHandle;
|
|
529
|
+
video(src: string, opts?: VideoProps): void;
|
|
530
|
+
audio(src: string, opts?: AudioProps): void;
|
|
531
|
+
diff(before: string, after: string, opts?: Partial<DiffProps>): void;
|
|
362
532
|
shell(regions: ShellRegions, opts?: ShellOpts): void;
|
|
363
533
|
grid(areas: Array<(ctx: UIContext) => void>, opts?: GridOpts): void;
|
|
364
|
-
tabs(tabs: TabDef[], opts?: TabsOpts):
|
|
534
|
+
tabs(tabs: TabDef[], opts?: TabsOpts): TabsHandle;
|
|
535
|
+
accordion(sections: AccordionSection[], opts?: AccordionOpts): void;
|
|
536
|
+
fullscreen(content: (ctx: UIContext) => void, opts?: FullscreenOpts): FullscreenHandle;
|
|
365
537
|
card(titleOrContent: string | ((ctx: UIContext) => void), contentOrNothing?: (ctx: UIContext) => void): void;
|
|
366
538
|
divider(opts?: {
|
|
367
539
|
label?: string;
|
|
@@ -373,6 +545,10 @@ export interface UIContext {
|
|
|
373
545
|
streamText(opts?: StreamTextOpts): StreamHandle;
|
|
374
546
|
chatUI(opts?: ChatUIOptions): ChatHandle;
|
|
375
547
|
promptEditor(opts?: PromptEditorOpts): PromptEditorHandle;
|
|
548
|
+
modelCompare(models: ModelSpec[], opts: ModelCompareOpts): ModelCompareHandle;
|
|
549
|
+
parameterPanel(schema: ParameterSchema, opts?: ParameterPanelOpts): ParameterPanelHandle;
|
|
550
|
+
filmStrip(images: Array<string | FilmStripItem>, opts?: FilmStripOpts): void;
|
|
551
|
+
beforeAfter(before: string, after: string, opts?: BeforeAfterOpts): void;
|
|
376
552
|
onDisconnect(fn: () => void): void;
|
|
377
553
|
}
|
|
378
554
|
export interface ShellRegions {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function renderCodeHtml(content: string, lang: string): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import bash from '@shikijs/langs/bash';
|
|
2
|
+
import javascript from '@shikijs/langs/javascript';
|
|
3
|
+
import json from '@shikijs/langs/json';
|
|
4
|
+
import markdown from '@shikijs/langs/markdown';
|
|
5
|
+
import python from '@shikijs/langs/python';
|
|
6
|
+
import tsx from '@shikijs/langs/tsx';
|
|
7
|
+
import typescript from '@shikijs/langs/typescript';
|
|
8
|
+
import githubDark from '@shikijs/themes/github-dark';
|
|
9
|
+
import { createHighlighterCoreSync } from 'shiki/core';
|
|
10
|
+
import { createJavaScriptRegexEngine } from 'shiki/engine/javascript';
|
|
11
|
+
const DEFAULT_LANG = 'markdown';
|
|
12
|
+
const DEFAULT_THEME = 'github-dark';
|
|
13
|
+
const LANGUAGE_ALIASES = {
|
|
14
|
+
js: 'javascript',
|
|
15
|
+
jsx: 'javascript',
|
|
16
|
+
ts: 'typescript',
|
|
17
|
+
py: 'python',
|
|
18
|
+
md: 'markdown',
|
|
19
|
+
text: 'markdown',
|
|
20
|
+
txt: 'markdown',
|
|
21
|
+
shell: 'bash',
|
|
22
|
+
sh: 'bash',
|
|
23
|
+
};
|
|
24
|
+
const SUPPORTED_LANGUAGES = new Set([
|
|
25
|
+
'javascript',
|
|
26
|
+
'typescript',
|
|
27
|
+
'tsx',
|
|
28
|
+
'json',
|
|
29
|
+
'bash',
|
|
30
|
+
'markdown',
|
|
31
|
+
'python',
|
|
32
|
+
'markdown',
|
|
33
|
+
]);
|
|
34
|
+
const highlighter = createHighlighterCoreSync({
|
|
35
|
+
themes: [githubDark],
|
|
36
|
+
langs: [javascript, typescript, tsx, json, markdown, python, bash],
|
|
37
|
+
engine: createJavaScriptRegexEngine(),
|
|
38
|
+
});
|
|
39
|
+
function normalizeLanguage(input) {
|
|
40
|
+
if (!input) {
|
|
41
|
+
return DEFAULT_LANG;
|
|
42
|
+
}
|
|
43
|
+
const lower = input.toLowerCase();
|
|
44
|
+
const normalized = LANGUAGE_ALIASES[lower] ?? lower;
|
|
45
|
+
return SUPPORTED_LANGUAGES.has(normalized) ? normalized : DEFAULT_LANG;
|
|
46
|
+
}
|
|
47
|
+
function highlightCode(content, lang) {
|
|
48
|
+
const normalized = normalizeLanguage(lang);
|
|
49
|
+
try {
|
|
50
|
+
return highlighter.codeToHtml(content, { lang: normalized, theme: DEFAULT_THEME });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return highlighter.codeToHtml(content, { lang: DEFAULT_LANG, theme: DEFAULT_THEME });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function renderCodeHtml(content, lang) {
|
|
57
|
+
const highlighted = highlightCode(content, lang);
|
|
58
|
+
const match = highlighted.match(/<code[^>]*>([\s\S]*?)<\/code>/i);
|
|
59
|
+
if (!match) {
|
|
60
|
+
return '';
|
|
61
|
+
}
|
|
62
|
+
return match[1];
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=code-highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-highlight.js","sourceRoot":"","sources":["../../src/engine/code-highlight.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,qBAAqB,CAAC;AACvC,OAAO,UAAU,MAAM,2BAA2B,CAAC;AACnD,OAAO,IAAI,MAAM,qBAAqB,CAAC;AACvC,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,UAAU,MAAM,2BAA2B,CAAC;AACnD,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC,MAAM,gBAAgB,GAA2B;IAC/C,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,MAAM;IACb,EAAE,EAAE,MAAM;CACX,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY;IACZ,YAAY;IACZ,KAAK;IACL,MAAM;IACN,MAAM;IACN,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC5C,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;IAClE,MAAM,EAAE,2BAA2B,EAAE;CACtC,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IACpD,OAAO,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;AACzE,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,IAAa;IACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IACrF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY;IAC1D,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { renderCodeHtml } from './code-highlight';
|
|
3
|
+
describe('code highlighting', () => {
|
|
4
|
+
it('returns highlighted html for supported language', () => {
|
|
5
|
+
const html = renderCodeHtml('const x = 1', 'ts');
|
|
6
|
+
expect(html).toContain('<span');
|
|
7
|
+
expect(html).toContain('const');
|
|
8
|
+
});
|
|
9
|
+
it('returns highlighted output even for unknown language via fallback', () => {
|
|
10
|
+
const html = renderCodeHtml('<script>', 'unknown-lang');
|
|
11
|
+
expect(html).toContain('script');
|
|
12
|
+
expect(html).toContain('<span');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=code-highlight.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-highlight.test.js","sourceRoot":"","sources":["../../src/engine/code-highlight.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/engine/executor.js
CHANGED
|
@@ -20,6 +20,16 @@ export function handleClientEvent(scope, payload) {
|
|
|
20
20
|
if (handle.type === 'table') {
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
|
+
if (handle.type === 'tabs') {
|
|
24
|
+
const target = String(payload.value ?? '');
|
|
25
|
+
handle.update({ value: target });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (handle.type === 'parameterPanel') {
|
|
29
|
+
const panel = handle;
|
|
30
|
+
panel.update({});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
23
33
|
scope.pushFragment(handle);
|
|
24
34
|
return;
|
|
25
35
|
}
|
|
@@ -44,6 +54,12 @@ export function handleClientEvent(scope, payload) {
|
|
|
44
54
|
});
|
|
45
55
|
return;
|
|
46
56
|
}
|
|
57
|
+
if (handle.type === 'fullscreen') {
|
|
58
|
+
const fullscreen = handle;
|
|
59
|
+
const current = fullscreen.value;
|
|
60
|
+
fullscreen.update({ value: !current });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
47
63
|
if (handle.type === 'table' && typeof payload.value === 'string') {
|
|
48
64
|
const tableHandle = handle;
|
|
49
65
|
const row = tableHandle.props.rows.find((entry) => entry.id === payload.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/engine/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,11 +51,16 @@ describe('handleClientEvent', () => {
|
|
|
51
51
|
event: 'click',
|
|
52
52
|
});
|
|
53
53
|
await vi.waitFor(() => {
|
|
54
|
-
const
|
|
55
|
-
|
|
54
|
+
const batched = scope.outbox.filter((m) => m.type === 'BATCH');
|
|
55
|
+
const fragments = batched
|
|
56
|
+
.flatMap((entry) => entry.payload.messages)
|
|
57
|
+
.filter((entry) => entry.type === 'FRAGMENT' && entry.payload.id === button.id);
|
|
58
|
+
expect(fragments.length).toBeGreaterThanOrEqual(1);
|
|
56
59
|
});
|
|
57
|
-
const
|
|
58
|
-
|
|
60
|
+
const batched = scope.outbox.filter((m) => m.type === 'BATCH');
|
|
61
|
+
const fragments = batched
|
|
62
|
+
.flatMap((entry) => entry.payload.messages)
|
|
63
|
+
.filter((entry) => entry.type === 'FRAGMENT' && entry.payload.id === button.id);
|
|
59
64
|
expect(fragments.at(-1)?.payload.html).not.toContain('aria-busy="true"');
|
|
60
65
|
});
|
|
61
66
|
it('dispatches table row click handler with row data', async () => {
|
|
@@ -75,5 +80,29 @@ describe('handleClientEvent', () => {
|
|
|
75
80
|
expect(onClick).toHaveBeenCalledWith({ id: 'r1', name: 'row' });
|
|
76
81
|
});
|
|
77
82
|
});
|
|
83
|
+
it('routes tabs change through handle.update and updates active value', async () => {
|
|
84
|
+
const scope = createConnectionScope('exec-tabs');
|
|
85
|
+
const ui = new UIContext(scope);
|
|
86
|
+
const tabs = ui.tabs([
|
|
87
|
+
{ label: 'A', content: (ctx) => ctx.text('tab a') },
|
|
88
|
+
{ label: 'B', content: (ctx) => ctx.text('tab b') },
|
|
89
|
+
], { defaultTab: 'A' });
|
|
90
|
+
scope.outbox.length = 0;
|
|
91
|
+
handleClientEvent(scope, {
|
|
92
|
+
id: tabs.id,
|
|
93
|
+
event: 'change',
|
|
94
|
+
value: 'B',
|
|
95
|
+
});
|
|
96
|
+
expect(tabs.value).toBe('B');
|
|
97
|
+
await vi.waitFor(() => {
|
|
98
|
+
const fragment = scope.outbox
|
|
99
|
+
.filter((message) => message.type === 'BATCH')
|
|
100
|
+
.flatMap((message) => message.payload.messages)
|
|
101
|
+
.find((entry) => entry.type === 'FRAGMENT' && entry.payload.id === tabs.id);
|
|
102
|
+
expect(fragment).toBeDefined();
|
|
103
|
+
expect(fragment?.payload.html).toContain('data-lk-tab-target="B"');
|
|
104
|
+
expect(fragment?.payload.html).toContain('aria-selected="true"');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
78
107
|
});
|
|
79
108
|
//# sourceMappingURL=executor.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../src/engine/executor.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../src/engine/executor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,7 +52,15 @@ export interface ErrorMessage {
|
|
|
52
52
|
stack?: string;
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
-
export type
|
|
55
|
+
export type BatchedInnerMessage = FragmentMessage | StreamChunkMessage;
|
|
56
|
+
export type BatchedMessageEntry = BatchedInnerMessage;
|
|
57
|
+
export interface BatchMessage {
|
|
58
|
+
type: 'BATCH';
|
|
59
|
+
payload: {
|
|
60
|
+
messages: BatchedInnerMessage[];
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export type ServerMessage = RenderMessage | FragmentMessage | ToastMessage | ThemeMessage | StreamChunkMessage | StreamErrorMessage | ErrorMessage | BatchMessage;
|
|
56
64
|
export type ServerToClientMessage = ServerMessage;
|
|
57
65
|
export interface ReadyMessage {
|
|
58
66
|
type: 'READY';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/engine/messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/engine/messages.ts"],"names":[],"mappings":"AAgIA,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ;QACzB,OAAO,IAAI,CAAC;IAEd,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QACvC,OAAO,IAAI,CAAC;IAEd,MAAM,IAAI,GAAI,MAA6B,CAAC,IAAI,CAAC;IACjD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,QAAQ;QACtF,OAAO,IAAI,CAAC;IAEd,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { parseClientMessage, serializeServerMessage } from './messages';
|
|
3
|
+
describe('messages', () => {
|
|
4
|
+
it('parses known client message types and rejects unknown', () => {
|
|
5
|
+
expect(parseClientMessage(JSON.stringify({
|
|
6
|
+
type: 'READY',
|
|
7
|
+
payload: { viewport: { width: 1, height: 2 }, theme: null },
|
|
8
|
+
}))?.type).toBe('READY');
|
|
9
|
+
expect(parseClientMessage(JSON.stringify({
|
|
10
|
+
type: 'EVENT',
|
|
11
|
+
payload: { id: 'x', event: 'change', value: 1 },
|
|
12
|
+
}))?.type).toBe('EVENT');
|
|
13
|
+
expect(parseClientMessage(JSON.stringify({
|
|
14
|
+
type: 'THEME_CHANGE',
|
|
15
|
+
payload: { mode: 'dark' },
|
|
16
|
+
}))?.type).toBe('THEME_CHANGE');
|
|
17
|
+
expect(parseClientMessage(JSON.stringify({
|
|
18
|
+
type: 'RESIZE',
|
|
19
|
+
payload: { width: 10, height: 20 },
|
|
20
|
+
}))?.type).toBe('RESIZE');
|
|
21
|
+
expect(parseClientMessage(JSON.stringify({
|
|
22
|
+
type: 'UNKNOWN',
|
|
23
|
+
payload: {},
|
|
24
|
+
}))).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
it('serializes server messages including BATCH', () => {
|
|
27
|
+
const raw = serializeServerMessage({
|
|
28
|
+
type: 'BATCH',
|
|
29
|
+
payload: {
|
|
30
|
+
messages: [
|
|
31
|
+
{ type: 'FRAGMENT', payload: { id: 'a', html: '<div></div>' } },
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
expect(raw).toContain('"type":"BATCH"');
|
|
36
|
+
expect(raw).toContain('"FRAGMENT"');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=messages.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../src/engine/messages.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAExE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC5D,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE;SAChD,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SAC1B,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEhC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;SACnC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1B,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAG,sBAAsB,CAAC;YACjC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE;gBACP,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;iBAChE;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|