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.
Files changed (63) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/integration/ws-flow.integration.test.js +38 -140
  3. package/dist/__tests__/integration/ws-flow.integration.test.js.map +1 -1
  4. package/dist/client/events.js +169 -49
  5. package/dist/client/events.js.map +1 -1
  6. package/dist/client/swap.d.ts +14 -1
  7. package/dist/client/swap.js +185 -7
  8. package/dist/client/swap.js.map +1 -1
  9. package/dist/client/ws.d.ts +1 -0
  10. package/dist/client/ws.js +214 -35
  11. package/dist/client/ws.js.map +1 -1
  12. package/dist/client/ws.test.js +6 -146
  13. package/dist/client/ws.test.js.map +1 -1
  14. package/dist/components/context.d.ts +14 -2
  15. package/dist/components/context.js +330 -5
  16. package/dist/components/context.js.map +1 -1
  17. package/dist/components/context.test.js +74 -56
  18. package/dist/components/context.test.js.map +1 -1
  19. package/dist/components/registry.d.ts +2 -2
  20. package/dist/components/registry.js +52 -4
  21. package/dist/components/registry.js.map +1 -1
  22. package/dist/components/types.d.ts +180 -4
  23. package/dist/engine/code-highlight.d.ts +1 -0
  24. package/dist/engine/code-highlight.js +64 -0
  25. package/dist/engine/code-highlight.js.map +1 -0
  26. package/dist/engine/code-highlight.test.d.ts +1 -0
  27. package/dist/engine/code-highlight.test.js +15 -0
  28. package/dist/engine/code-highlight.test.js.map +1 -0
  29. package/dist/engine/executor.js +16 -0
  30. package/dist/engine/executor.js.map +1 -1
  31. package/dist/engine/executor.test.js +33 -4
  32. package/dist/engine/executor.test.js.map +1 -1
  33. package/dist/engine/messages.d.ts +9 -1
  34. package/dist/engine/messages.js.map +1 -1
  35. package/dist/engine/messages.test.d.ts +1 -0
  36. package/dist/engine/messages.test.js +39 -0
  37. package/dist/engine/messages.test.js.map +1 -0
  38. package/dist/engine/renderer.js +241 -14
  39. package/dist/engine/renderer.js.map +1 -1
  40. package/dist/engine/renderer.test.js +230 -202
  41. package/dist/engine/renderer.test.js.map +1 -1
  42. package/dist/engine/server.d.ts +2 -0
  43. package/dist/engine/server.js +57 -6
  44. package/dist/engine/server.js.map +1 -1
  45. package/dist/engine/server.test.js +105 -4
  46. package/dist/engine/server.test.js.map +1 -1
  47. package/dist/engine/watcher.d.ts +17 -1
  48. package/dist/engine/watcher.js +42 -5
  49. package/dist/engine/watcher.js.map +1 -1
  50. package/dist/engine/watcher.test.d.ts +1 -0
  51. package/dist/engine/watcher.test.js +62 -0
  52. package/dist/engine/watcher.test.js.map +1 -0
  53. package/dist/engine/websocket.d.ts +2 -0
  54. package/dist/engine/websocket.hub.test.js +24 -0
  55. package/dist/engine/websocket.hub.test.js.map +1 -1
  56. package/dist/engine/websocket.js +6 -1
  57. package/dist/engine/websocket.js.map +1 -1
  58. package/dist/index.d.ts +3 -1
  59. package/dist/index.js +1 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/style.css +150 -0
  62. package/dist/theme/lastriko.css +150 -0
  63. 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 type AnyComponentHandle = TextHandle | ButtonHandle | TextInputHandle | NumberInputHandle | SliderHandle | ToggleHandle | SelectHandle | FileUploadHandle | TableHandle | MetricHandle | ProgressHandle | StreamHandle | ChatHandle | PromptEditorHandle | ComponentHandle<MarkdownProps> | ComponentHandle<ImageProps> | ComponentHandle<ImageGridProps> | ComponentHandle<CodeProps> | ComponentHandle<JsonProps> | ComponentHandle<Record<string, unknown>, unknown>;
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): ComponentHandle<Record<string, unknown>, string>;
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"}
@@ -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":"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"}
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 fragments = scope.outbox.filter((m) => m.type === 'FRAGMENT' && m.payload.id === button.id);
55
- expect(fragments.length).toBeGreaterThanOrEqual(2);
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 fragments = scope.outbox.filter((m) => m.type === 'FRAGMENT' && m.payload.id === button.id);
58
- expect(fragments.some((f) => f.payload.html.includes('aria-busy="true"'))).toBe(true);
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 ServerMessage = RenderMessage | FragmentMessage | ToastMessage | ThemeMessage | StreamChunkMessage | StreamErrorMessage | ErrorMessage;
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":"AAqHA,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"}
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"}