lastriko 0.1.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.
- package/CHANGELOG.md +7 -0
- package/README.md +58 -0
- package/dist/__tests__/integration/ws-flow.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/ws-flow.integration.test.js +249 -0
- package/dist/__tests__/integration/ws-flow.integration.test.js.map +1 -0
- package/dist/__tests__/integration/ws-flow.test.d.ts +1 -0
- package/dist/__tests__/integration/ws-flow.test.js +70 -0
- package/dist/__tests__/integration/ws-flow.test.js.map +1 -0
- package/dist/client/events.d.ts +6 -0
- package/dist/client/events.js +114 -0
- package/dist/client/events.js.map +1 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/swap.d.ts +4 -0
- package/dist/client/swap.js +47 -0
- package/dist/client/swap.js.map +1 -0
- package/dist/client/ws.d.ts +11 -0
- package/dist/client/ws.js +111 -0
- package/dist/client/ws.js.map +1 -0
- package/dist/components/context.d.ts +51 -0
- package/dist/components/context.js +595 -0
- package/dist/components/context.js.map +1 -0
- package/dist/components/context.test.d.ts +1 -0
- package/dist/components/context.test.js +69 -0
- package/dist/components/context.test.js.map +1 -0
- package/dist/components/id.d.ts +3 -0
- package/dist/components/id.js +9 -0
- package/dist/components/id.js.map +1 -0
- package/dist/components/registry.d.ts +2 -0
- package/dist/components/registry.js +97 -0
- package/dist/components/registry.js.map +1 -0
- package/dist/components/types.d.ts +390 -0
- package/dist/components/types.js +2 -0
- package/dist/components/types.js.map +1 -0
- package/dist/engine/executor.d.ts +20 -0
- package/dist/engine/executor.js +84 -0
- package/dist/engine/executor.js.map +1 -0
- package/dist/engine/executor.test.d.ts +1 -0
- package/dist/engine/executor.test.js +79 -0
- package/dist/engine/executor.test.js.map +1 -0
- package/dist/engine/index.d.ts +6 -0
- package/dist/engine/index.js +7 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/lifecycle.d.ts +16 -0
- package/dist/engine/lifecycle.js +44 -0
- package/dist/engine/lifecycle.js.map +1 -0
- package/dist/engine/lifecycle.test.d.ts +1 -0
- package/dist/engine/lifecycle.test.js +15 -0
- package/dist/engine/lifecycle.test.js.map +1 -0
- package/dist/engine/messages.d.ts +95 -0
- package/dist/engine/messages.js +21 -0
- package/dist/engine/messages.js.map +1 -0
- package/dist/engine/renderer.components.test.d.ts +1 -0
- package/dist/engine/renderer.components.test.js +302 -0
- package/dist/engine/renderer.components.test.js.map +1 -0
- package/dist/engine/renderer.d.ts +4 -0
- package/dist/engine/renderer.js +408 -0
- package/dist/engine/renderer.js.map +1 -0
- package/dist/engine/renderer.test.d.ts +1 -0
- package/dist/engine/renderer.test.js +80 -0
- package/dist/engine/renderer.test.js.map +1 -0
- package/dist/engine/server.d.ts +43 -0
- package/dist/engine/server.js +402 -0
- package/dist/engine/server.js.map +1 -0
- package/dist/engine/server.test.d.ts +1 -0
- package/dist/engine/server.test.js +149 -0
- package/dist/engine/server.test.js.map +1 -0
- package/dist/engine/shell.d.ts +7 -0
- package/dist/engine/shell.js +25 -0
- package/dist/engine/shell.js.map +1 -0
- package/dist/engine/theme-path.d.ts +11 -0
- package/dist/engine/theme-path.js +32 -0
- package/dist/engine/theme-path.js.map +1 -0
- package/dist/engine/theme-path.test.d.ts +1 -0
- package/dist/engine/theme-path.test.js +52 -0
- package/dist/engine/theme-path.test.js.map +1 -0
- package/dist/engine/watcher.d.ts +8 -0
- package/dist/engine/watcher.js +27 -0
- package/dist/engine/watcher.js.map +1 -0
- package/dist/engine/websocket.d.ts +24 -0
- package/dist/engine/websocket.hub.test.d.ts +1 -0
- package/dist/engine/websocket.hub.test.js +75 -0
- package/dist/engine/websocket.hub.test.js.map +1 -0
- package/dist/engine/websocket.js +119 -0
- package/dist/engine/websocket.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/registry.d.ts +11 -0
- package/dist/plugins/registry.js +61 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/registry.test.d.ts +1 -0
- package/dist/plugins/registry.test.js +44 -0
- package/dist/plugins/registry.test.js.map +1 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/style.css +134 -0
- package/dist/theme/lastriko.css +134 -0
- package/package.json +60 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { UIContext } from './context';
|
|
3
|
+
import { createConnectionScope } from './registry';
|
|
4
|
+
describe('uiContext', () => {
|
|
5
|
+
it('creates stable ids per component type', () => {
|
|
6
|
+
const scope = createConnectionScope('c1');
|
|
7
|
+
const ui = new UIContext(scope);
|
|
8
|
+
const text1 = ui.text('hello');
|
|
9
|
+
const text2 = ui.text('world');
|
|
10
|
+
const button = ui.button('Run', () => { });
|
|
11
|
+
const input = ui.textInput('Name');
|
|
12
|
+
expect(text1.id).toBe('text-1');
|
|
13
|
+
expect(text2.id).toBe('text-2');
|
|
14
|
+
expect(button.id).toBe('button-1');
|
|
15
|
+
expect(input.id).toBe('textInput-1');
|
|
16
|
+
});
|
|
17
|
+
it('input change updates value atom and emits FRAGMENT', () => {
|
|
18
|
+
const scope = createConnectionScope('c2');
|
|
19
|
+
const ui = new UIContext(scope);
|
|
20
|
+
const slider = ui.slider('Temperature', { min: 0, max: 2, default: 0.7 });
|
|
21
|
+
slider.update({ value: 1.2 });
|
|
22
|
+
expect(slider.value).toBe(1.2);
|
|
23
|
+
expect(scope.outbox).toHaveLength(1);
|
|
24
|
+
expect(scope.outbox[0]?.type).toBe('FRAGMENT');
|
|
25
|
+
});
|
|
26
|
+
it('table handles support prepend, row.update, remove', () => {
|
|
27
|
+
const scope = createConnectionScope('c3');
|
|
28
|
+
const ui = new UIContext(scope);
|
|
29
|
+
const table = ui.table([], { columns: ['name', 'status'] });
|
|
30
|
+
const row = table.prepend({ name: 'exp-1', status: 'queued' });
|
|
31
|
+
expect(table.rowCount).toBe(1);
|
|
32
|
+
row.update({ status: 'done' });
|
|
33
|
+
expect(table.props.rows[0]?.data.status).toBe('done');
|
|
34
|
+
row.remove();
|
|
35
|
+
expect(table.rowCount).toBe(0);
|
|
36
|
+
});
|
|
37
|
+
it('streamText emits STREAM_CHUNK sequence and done marker', () => {
|
|
38
|
+
const scope = createConnectionScope('c4');
|
|
39
|
+
const ui = new UIContext(scope);
|
|
40
|
+
const stream = ui.streamText({ format: 'plain' });
|
|
41
|
+
stream.append('Hello');
|
|
42
|
+
stream.append(' world');
|
|
43
|
+
stream.done();
|
|
44
|
+
const chunks = scope.outbox.filter((message) => message.type === 'STREAM_CHUNK');
|
|
45
|
+
expect(chunks).toHaveLength(3);
|
|
46
|
+
expect((chunks[0]?.payload).chunk).toBe('Hello');
|
|
47
|
+
expect((chunks[1]?.payload).chunk).toBe(' world');
|
|
48
|
+
expect((chunks[2]?.payload).done).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it('chatUI stores and clears connection-scoped message history', () => {
|
|
51
|
+
const scope = createConnectionScope('c5');
|
|
52
|
+
const ui = new UIContext(scope);
|
|
53
|
+
const chat = ui.chatUI();
|
|
54
|
+
chat.addMessage('user', 'hi');
|
|
55
|
+
chat.addMessage('assistant', 'hello');
|
|
56
|
+
expect(chat.value).toHaveLength(2);
|
|
57
|
+
expect(chat.lastMessage?.content).toBe('hello');
|
|
58
|
+
chat.clear();
|
|
59
|
+
expect(chat.value).toHaveLength(0);
|
|
60
|
+
});
|
|
61
|
+
it('promptEditor interpolate replaces template variables', () => {
|
|
62
|
+
const scope = createConnectionScope('c6');
|
|
63
|
+
const ui = new UIContext(scope);
|
|
64
|
+
const prompt = ui.promptEditor({ default: 'Write a {{tone}} note about {{topic}}.' });
|
|
65
|
+
const finalText = prompt.interpolate({ tone: 'formal', topic: 'safety' });
|
|
66
|
+
expect(finalText).toBe('Write a formal note about safety.');
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/components/context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function createComponentId(scope, type) {
|
|
2
|
+
const next = (scope.counters.get(type) ?? 0) + 1;
|
|
3
|
+
scope.counters.set(type, next);
|
|
4
|
+
return `${type}-${next}`;
|
|
5
|
+
}
|
|
6
|
+
export function resetComponentCounters(scope) {
|
|
7
|
+
scope.counters.clear();
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/components/id.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAAsB,EAAE,IAAmB;IAC3E,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { atom } from 'nanostores';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
4
|
+
import { renderComponent } from '../engine/renderer';
|
|
5
|
+
export function createConnectionScope(id, transport = { send: () => { } }) {
|
|
6
|
+
const scopeId = id && id.trim() ? id : randomUUID();
|
|
7
|
+
const atoms = new Map();
|
|
8
|
+
const handles = new Map();
|
|
9
|
+
const counters = new Map();
|
|
10
|
+
const roots = [];
|
|
11
|
+
const cleanupFns = [];
|
|
12
|
+
const outbox = [];
|
|
13
|
+
return {
|
|
14
|
+
id: scopeId,
|
|
15
|
+
connection: transport,
|
|
16
|
+
atoms,
|
|
17
|
+
handles,
|
|
18
|
+
counters,
|
|
19
|
+
roots,
|
|
20
|
+
outbox,
|
|
21
|
+
viewport: { width: 0, height: 0 },
|
|
22
|
+
theme: 'light',
|
|
23
|
+
uploadDir: null,
|
|
24
|
+
lastRender: null,
|
|
25
|
+
getAtom(key, initialValue) {
|
|
26
|
+
if (!atoms.has(key)) {
|
|
27
|
+
atoms.set(key, atom(initialValue));
|
|
28
|
+
}
|
|
29
|
+
return atoms.get(key);
|
|
30
|
+
},
|
|
31
|
+
registerHandle(handle) {
|
|
32
|
+
handles.set(handle.id, handle);
|
|
33
|
+
},
|
|
34
|
+
getHandle(id) {
|
|
35
|
+
return handles.get(id);
|
|
36
|
+
},
|
|
37
|
+
listHandles() {
|
|
38
|
+
return [...handles.values()];
|
|
39
|
+
},
|
|
40
|
+
pushNode(node) {
|
|
41
|
+
roots.push(node);
|
|
42
|
+
},
|
|
43
|
+
listRoots() {
|
|
44
|
+
return [...roots];
|
|
45
|
+
},
|
|
46
|
+
setValue(id, value) {
|
|
47
|
+
const valueAtom = this.getAtom(`${id}/value`, value);
|
|
48
|
+
valueAtom.set(value);
|
|
49
|
+
const handle = handles.get(id);
|
|
50
|
+
if (handle && 'props' in handle && typeof handle.props === 'object' && handle.props !== null) {
|
|
51
|
+
handle.props.value = value;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
send(message) {
|
|
55
|
+
outbox.push(message);
|
|
56
|
+
transport.send(message);
|
|
57
|
+
},
|
|
58
|
+
pushFragment(handle) {
|
|
59
|
+
this.send({
|
|
60
|
+
type: 'FRAGMENT',
|
|
61
|
+
payload: { id: handle.id, html: renderComponent(handle) },
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
onCleanup(fn) {
|
|
65
|
+
cleanupFns.push(fn);
|
|
66
|
+
},
|
|
67
|
+
clearTransientState() {
|
|
68
|
+
atoms.clear();
|
|
69
|
+
handles.clear();
|
|
70
|
+
counters.clear();
|
|
71
|
+
roots.length = 0;
|
|
72
|
+
outbox.length = 0;
|
|
73
|
+
this.lastRender = null;
|
|
74
|
+
},
|
|
75
|
+
destroy() {
|
|
76
|
+
for (const fn of cleanupFns) {
|
|
77
|
+
try {
|
|
78
|
+
fn();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// best effort
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (this.uploadDir && existsSync(this.uploadDir)) {
|
|
85
|
+
try {
|
|
86
|
+
rmSync(this.uploadDir, { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// best effort
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
cleanupFns.length = 0;
|
|
93
|
+
this.clearTransientState();
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/components/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import type { WritableAtom } from 'nanostores';
|
|
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';
|
|
4
|
+
export type TableRow = Record<string, unknown>;
|
|
5
|
+
export interface ComponentHandle<TProps, TValue = void> {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly type: ComponentType;
|
|
8
|
+
props: TProps;
|
|
9
|
+
readonly value: TValue;
|
|
10
|
+
update(data: Partial<TProps & {
|
|
11
|
+
value: TValue;
|
|
12
|
+
}>): void;
|
|
13
|
+
}
|
|
14
|
+
export interface InputHandle<TValue, TProps = Record<string, unknown>> extends ComponentHandle<TProps, TValue> {
|
|
15
|
+
readonly value: TValue;
|
|
16
|
+
}
|
|
17
|
+
export interface ButtonCallbackHandle {
|
|
18
|
+
setLoading(loading: boolean): void;
|
|
19
|
+
}
|
|
20
|
+
export interface ButtonOpts {
|
|
21
|
+
variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface TextInputOpts {
|
|
25
|
+
placeholder?: string;
|
|
26
|
+
default?: string;
|
|
27
|
+
multiline?: boolean;
|
|
28
|
+
rows?: number;
|
|
29
|
+
maxLength?: number;
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
helperText?: string;
|
|
32
|
+
type?: 'text' | 'email' | 'url' | 'password';
|
|
33
|
+
}
|
|
34
|
+
export interface NumberInputOpts {
|
|
35
|
+
min?: number;
|
|
36
|
+
max?: number;
|
|
37
|
+
step?: number;
|
|
38
|
+
default?: number;
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
helperText?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface SliderOpts {
|
|
43
|
+
min: number;
|
|
44
|
+
max: number;
|
|
45
|
+
step?: number;
|
|
46
|
+
default?: number;
|
|
47
|
+
disabled?: boolean;
|
|
48
|
+
helperText?: string;
|
|
49
|
+
showValue?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface ToggleOpts {
|
|
52
|
+
default?: boolean;
|
|
53
|
+
disabled?: boolean;
|
|
54
|
+
helperText?: string;
|
|
55
|
+
onLabel?: string;
|
|
56
|
+
offLabel?: string;
|
|
57
|
+
}
|
|
58
|
+
export type SelectOption = string | {
|
|
59
|
+
label: string;
|
|
60
|
+
value: string;
|
|
61
|
+
disabled?: boolean;
|
|
62
|
+
};
|
|
63
|
+
export interface SelectOpts {
|
|
64
|
+
default?: string;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
helperText?: string;
|
|
67
|
+
placeholder?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface FileUploadOpts {
|
|
70
|
+
accept?: string;
|
|
71
|
+
multiple?: boolean;
|
|
72
|
+
maxSize?: number;
|
|
73
|
+
disabled?: boolean;
|
|
74
|
+
helperText?: string;
|
|
75
|
+
dragDrop?: boolean;
|
|
76
|
+
}
|
|
77
|
+
export interface UploadedFile {
|
|
78
|
+
name: string;
|
|
79
|
+
path: string;
|
|
80
|
+
size: number;
|
|
81
|
+
type: string;
|
|
82
|
+
lastModified: number;
|
|
83
|
+
}
|
|
84
|
+
export interface TextProps {
|
|
85
|
+
content: string;
|
|
86
|
+
}
|
|
87
|
+
export interface ButtonProps extends ButtonOpts {
|
|
88
|
+
label: string;
|
|
89
|
+
loading: boolean;
|
|
90
|
+
onClick: (btn: ButtonCallbackHandle) => void | Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
export interface TextInputProps extends TextInputOpts {
|
|
93
|
+
label: string;
|
|
94
|
+
value: string;
|
|
95
|
+
}
|
|
96
|
+
export interface NumberInputProps extends NumberInputOpts {
|
|
97
|
+
label: string;
|
|
98
|
+
value: number;
|
|
99
|
+
}
|
|
100
|
+
export interface SliderProps extends SliderOpts {
|
|
101
|
+
label: string;
|
|
102
|
+
value: number;
|
|
103
|
+
}
|
|
104
|
+
export interface ToggleProps extends ToggleOpts {
|
|
105
|
+
label: string;
|
|
106
|
+
value: boolean;
|
|
107
|
+
}
|
|
108
|
+
export interface SelectProps extends SelectOpts {
|
|
109
|
+
label: string;
|
|
110
|
+
options: Array<{
|
|
111
|
+
label: string;
|
|
112
|
+
value: string;
|
|
113
|
+
disabled?: boolean;
|
|
114
|
+
}>;
|
|
115
|
+
value: string;
|
|
116
|
+
}
|
|
117
|
+
export interface FileUploadProps extends FileUploadOpts {
|
|
118
|
+
label: string;
|
|
119
|
+
value: UploadedFile | UploadedFile[] | null;
|
|
120
|
+
}
|
|
121
|
+
export interface MarkdownProps {
|
|
122
|
+
content: string;
|
|
123
|
+
}
|
|
124
|
+
export interface ImageProps {
|
|
125
|
+
src: string | null | undefined;
|
|
126
|
+
alt: string;
|
|
127
|
+
caption?: string;
|
|
128
|
+
width?: string | number;
|
|
129
|
+
height?: string | number;
|
|
130
|
+
}
|
|
131
|
+
export interface ImageGridProps {
|
|
132
|
+
items: Array<{
|
|
133
|
+
src: string;
|
|
134
|
+
alt: string;
|
|
135
|
+
caption?: string;
|
|
136
|
+
}>;
|
|
137
|
+
cols?: number | 'auto';
|
|
138
|
+
gap?: number;
|
|
139
|
+
minWidth?: number;
|
|
140
|
+
}
|
|
141
|
+
export interface CodeProps {
|
|
142
|
+
content: string;
|
|
143
|
+
lang?: string;
|
|
144
|
+
}
|
|
145
|
+
export interface JsonProps {
|
|
146
|
+
label?: string;
|
|
147
|
+
data: unknown;
|
|
148
|
+
}
|
|
149
|
+
export interface TableProps {
|
|
150
|
+
columns: string[];
|
|
151
|
+
rows: Array<{
|
|
152
|
+
id: string;
|
|
153
|
+
data: TableRow;
|
|
154
|
+
}>;
|
|
155
|
+
striped?: boolean;
|
|
156
|
+
maxHeight?: number;
|
|
157
|
+
emptyMessage?: string;
|
|
158
|
+
onRowClick?: (row: TableRow) => void;
|
|
159
|
+
getOnRowClick?: () => ((row: TableRow) => void) | null;
|
|
160
|
+
}
|
|
161
|
+
export interface MetricOpts {
|
|
162
|
+
delta?: number;
|
|
163
|
+
deltaLabel?: string;
|
|
164
|
+
unit?: string;
|
|
165
|
+
prefix?: string;
|
|
166
|
+
}
|
|
167
|
+
export interface MetricProps extends MetricOpts {
|
|
168
|
+
label: string;
|
|
169
|
+
value: string;
|
|
170
|
+
}
|
|
171
|
+
export interface ProgressOpts {
|
|
172
|
+
label?: string;
|
|
173
|
+
showPercentage?: boolean;
|
|
174
|
+
color?: 'accent' | 'success' | 'error' | 'warning';
|
|
175
|
+
}
|
|
176
|
+
export interface ProgressProps extends ProgressOpts {
|
|
177
|
+
value: number | null;
|
|
178
|
+
}
|
|
179
|
+
export interface ShellOpts {
|
|
180
|
+
sidebarPosition?: 'left' | 'right';
|
|
181
|
+
sidebarWidth?: string;
|
|
182
|
+
}
|
|
183
|
+
export interface GridOpts {
|
|
184
|
+
cols?: number | string[];
|
|
185
|
+
rows?: number | string[];
|
|
186
|
+
gap?: number;
|
|
187
|
+
minWidth?: number;
|
|
188
|
+
}
|
|
189
|
+
export interface TabsOpts {
|
|
190
|
+
defaultTab?: string;
|
|
191
|
+
}
|
|
192
|
+
export interface ToastOpts {
|
|
193
|
+
type?: 'info' | 'success' | 'warning' | 'error';
|
|
194
|
+
duration?: number;
|
|
195
|
+
}
|
|
196
|
+
export interface AlertOpts {
|
|
197
|
+
type?: 'info' | 'success' | 'warning' | 'error';
|
|
198
|
+
title?: string;
|
|
199
|
+
}
|
|
200
|
+
export interface LoadingOpts {
|
|
201
|
+
message?: string;
|
|
202
|
+
mode?: 'fullpage' | 'inline';
|
|
203
|
+
size?: 'sm' | 'md' | 'lg';
|
|
204
|
+
}
|
|
205
|
+
export interface StreamTextOpts {
|
|
206
|
+
format?: 'plain' | 'markdown';
|
|
207
|
+
cursor?: boolean;
|
|
208
|
+
label?: string;
|
|
209
|
+
maxHeight?: number;
|
|
210
|
+
}
|
|
211
|
+
export interface StreamTextProps extends StreamTextOpts {
|
|
212
|
+
text: string;
|
|
213
|
+
isStreaming: boolean;
|
|
214
|
+
}
|
|
215
|
+
export interface ChatMessage {
|
|
216
|
+
role: 'user' | 'assistant' | 'system';
|
|
217
|
+
content: string;
|
|
218
|
+
timestamp: number;
|
|
219
|
+
}
|
|
220
|
+
export interface ChatUIOptions {
|
|
221
|
+
placeholder?: string;
|
|
222
|
+
maxHeight?: number;
|
|
223
|
+
}
|
|
224
|
+
export interface ChatUIProps extends ChatUIOptions {
|
|
225
|
+
messages: ChatMessage[];
|
|
226
|
+
}
|
|
227
|
+
export interface PromptEditorOpts extends TextInputOpts {
|
|
228
|
+
label?: string;
|
|
229
|
+
variables?: string[];
|
|
230
|
+
showCharCount?: boolean;
|
|
231
|
+
}
|
|
232
|
+
export interface PromptEditorProps extends PromptEditorOpts {
|
|
233
|
+
value: string;
|
|
234
|
+
}
|
|
235
|
+
export interface TextHandle extends Omit<ComponentHandle<TextProps, string>, 'update'> {
|
|
236
|
+
readonly type: 'text';
|
|
237
|
+
update(content: string): void;
|
|
238
|
+
}
|
|
239
|
+
export interface ButtonHandle extends ComponentHandle<ButtonProps, boolean> {
|
|
240
|
+
readonly type: 'button';
|
|
241
|
+
setLoading(loading: boolean): void;
|
|
242
|
+
}
|
|
243
|
+
export type TextInputHandle = InputHandle<string, TextInputProps>;
|
|
244
|
+
export type NumberInputHandle = InputHandle<number, NumberInputProps>;
|
|
245
|
+
export type SliderHandle = InputHandle<number, SliderProps>;
|
|
246
|
+
export type ToggleHandle = InputHandle<boolean, ToggleProps>;
|
|
247
|
+
export type SelectHandle = InputHandle<string, SelectProps>;
|
|
248
|
+
export type FileUploadHandle = InputHandle<UploadedFile | UploadedFile[] | null, FileUploadProps>;
|
|
249
|
+
export interface TableRowHandle {
|
|
250
|
+
id: string;
|
|
251
|
+
update(data: Partial<TableRow>): void;
|
|
252
|
+
remove(): void;
|
|
253
|
+
}
|
|
254
|
+
export interface TableHandle extends ComponentHandle<TableProps> {
|
|
255
|
+
readonly type: 'table';
|
|
256
|
+
append(row: TableRow): TableRowHandle;
|
|
257
|
+
prepend(row: TableRow): TableRowHandle;
|
|
258
|
+
remove(rowId: string): void;
|
|
259
|
+
readonly rowCount: number;
|
|
260
|
+
onRowClick(handler: (row: TableRow) => void): void;
|
|
261
|
+
}
|
|
262
|
+
export interface MetricHandle extends Omit<ComponentHandle<MetricProps, string>, 'update'> {
|
|
263
|
+
readonly type: 'metric';
|
|
264
|
+
update(value: string, opts?: MetricOpts): void;
|
|
265
|
+
}
|
|
266
|
+
export interface ProgressHandle extends Omit<ComponentHandle<ProgressProps, number | null>, 'update'> {
|
|
267
|
+
readonly type: 'progress';
|
|
268
|
+
update(value: number | null, opts?: ProgressOpts): void;
|
|
269
|
+
}
|
|
270
|
+
export interface StreamHandle extends Omit<ComponentHandle<StreamTextProps, string>, 'update'> {
|
|
271
|
+
readonly type: 'streamText';
|
|
272
|
+
readonly text: string;
|
|
273
|
+
readonly isStreaming: boolean;
|
|
274
|
+
append(chunk: string): void;
|
|
275
|
+
done(): void;
|
|
276
|
+
clear(): void;
|
|
277
|
+
update(data: Partial<StreamTextProps>): void;
|
|
278
|
+
}
|
|
279
|
+
export interface ChatHandle extends Omit<ComponentHandle<ChatUIProps, ChatMessage[]>, 'update'> {
|
|
280
|
+
readonly type: 'chatUI';
|
|
281
|
+
readonly lastMessage: ChatMessage | null;
|
|
282
|
+
update(data: Partial<ChatUIProps>): void;
|
|
283
|
+
addMessage(role: 'user' | 'assistant', content: string): void;
|
|
284
|
+
clear(): void;
|
|
285
|
+
}
|
|
286
|
+
export interface PromptEditorHandle extends InputHandle<string, PromptEditorProps> {
|
|
287
|
+
readonly type: 'promptEditor';
|
|
288
|
+
interpolate(vars: Record<string, string>): string;
|
|
289
|
+
}
|
|
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>;
|
|
291
|
+
export interface RenderNode {
|
|
292
|
+
id: string;
|
|
293
|
+
}
|
|
294
|
+
export interface ServerConnection {
|
|
295
|
+
send: (message: ServerToClientMessage) => void;
|
|
296
|
+
close?: () => void;
|
|
297
|
+
isOpen?: () => boolean;
|
|
298
|
+
}
|
|
299
|
+
export interface LastRenderState {
|
|
300
|
+
html: string;
|
|
301
|
+
title: string;
|
|
302
|
+
theme: ThemeMode;
|
|
303
|
+
}
|
|
304
|
+
export interface ConnectionScope {
|
|
305
|
+
readonly id: string;
|
|
306
|
+
readonly connection: ServerConnection;
|
|
307
|
+
readonly atoms: Map<string, WritableAtom<unknown>>;
|
|
308
|
+
readonly handles: Map<string, AnyComponentHandle>;
|
|
309
|
+
readonly counters: Map<ComponentType, number>;
|
|
310
|
+
readonly roots: RenderNode[];
|
|
311
|
+
readonly outbox: ServerToClientMessage[];
|
|
312
|
+
viewport: {
|
|
313
|
+
width: number;
|
|
314
|
+
height: number;
|
|
315
|
+
};
|
|
316
|
+
theme: ThemeMode;
|
|
317
|
+
uploadDir: string | null;
|
|
318
|
+
lastRender: LastRenderState | null;
|
|
319
|
+
getAtom<T>(key: string, initialValue: T): WritableAtom<T>;
|
|
320
|
+
registerHandle(handle: AnyComponentHandle): void;
|
|
321
|
+
getHandle(id: string): AnyComponentHandle | undefined;
|
|
322
|
+
listHandles(): AnyComponentHandle[];
|
|
323
|
+
pushNode(node: RenderNode): void;
|
|
324
|
+
listRoots(): RenderNode[];
|
|
325
|
+
setValue(id: string, value: unknown): void;
|
|
326
|
+
send(message: ServerToClientMessage): void;
|
|
327
|
+
pushFragment(handle: AnyComponentHandle): void;
|
|
328
|
+
onCleanup(fn: () => void): void;
|
|
329
|
+
clearTransientState(): void;
|
|
330
|
+
destroy(): void;
|
|
331
|
+
}
|
|
332
|
+
export interface UIContext {
|
|
333
|
+
readonly scope: ConnectionScope;
|
|
334
|
+
readonly viewport: {
|
|
335
|
+
width: number;
|
|
336
|
+
height: number;
|
|
337
|
+
};
|
|
338
|
+
readonly theme: ThemeMode;
|
|
339
|
+
setTheme(mode: ThemeMode): void;
|
|
340
|
+
text(content: string): TextHandle;
|
|
341
|
+
markdown(content: string): void;
|
|
342
|
+
image(src: string | null | undefined, opts?: Partial<ImageProps>): void;
|
|
343
|
+
imageGrid(sources: Array<string | {
|
|
344
|
+
src: string;
|
|
345
|
+
alt?: string;
|
|
346
|
+
caption?: string;
|
|
347
|
+
}>, opts?: Partial<ImageGridProps>): void;
|
|
348
|
+
code(content: string, opts?: Partial<CodeProps>): void;
|
|
349
|
+
json(data: unknown, opts?: {
|
|
350
|
+
label?: string;
|
|
351
|
+
}): void;
|
|
352
|
+
table(data: TableRow[], opts?: Partial<TableProps>): TableHandle;
|
|
353
|
+
metric(label: string, value: string, opts?: MetricOpts): MetricHandle;
|
|
354
|
+
progress(value: number | null, opts?: ProgressOpts): ProgressHandle;
|
|
355
|
+
button(label: string, onClick: (btn: ButtonCallbackHandle) => void | Promise<void>, opts?: ButtonOpts): ButtonHandle;
|
|
356
|
+
textInput(label: string, opts?: TextInputOpts): TextInputHandle;
|
|
357
|
+
numberInput(label: string, opts?: NumberInputOpts): NumberInputHandle;
|
|
358
|
+
slider(label: string, opts: SliderOpts): SliderHandle;
|
|
359
|
+
toggle(label: string, opts?: ToggleOpts): ToggleHandle;
|
|
360
|
+
select(label: string, options: SelectOption[], opts?: SelectOpts): SelectHandle;
|
|
361
|
+
fileUpload(label: string, opts?: FileUploadOpts): FileUploadHandle;
|
|
362
|
+
shell(regions: ShellRegions, opts?: ShellOpts): void;
|
|
363
|
+
grid(areas: Array<(ctx: UIContext) => void>, opts?: GridOpts): void;
|
|
364
|
+
tabs(tabs: TabDef[], opts?: TabsOpts): ComponentHandle<Record<string, unknown>, string>;
|
|
365
|
+
card(titleOrContent: string | ((ctx: UIContext) => void), contentOrNothing?: (ctx: UIContext) => void): void;
|
|
366
|
+
divider(opts?: {
|
|
367
|
+
label?: string;
|
|
368
|
+
}): void;
|
|
369
|
+
spacer(size?: number | 'sm' | 'md' | 'lg'): void;
|
|
370
|
+
toast(message: string, opts?: ToastOpts): void;
|
|
371
|
+
alert(message: string, opts?: AlertOpts): void;
|
|
372
|
+
loading(messageOrOpts?: string | LoadingOpts, opts?: Omit<LoadingOpts, 'message'>): void;
|
|
373
|
+
streamText(opts?: StreamTextOpts): StreamHandle;
|
|
374
|
+
chatUI(opts?: ChatUIOptions): ChatHandle;
|
|
375
|
+
promptEditor(opts?: PromptEditorOpts): PromptEditorHandle;
|
|
376
|
+
onDisconnect(fn: () => void): void;
|
|
377
|
+
}
|
|
378
|
+
export interface ShellRegions {
|
|
379
|
+
header?: (ctx: UIContext) => void;
|
|
380
|
+
sidebar?: (ctx: UIContext) => void;
|
|
381
|
+
main: (ctx: UIContext) => void;
|
|
382
|
+
footer?: (ctx: UIContext) => void;
|
|
383
|
+
}
|
|
384
|
+
export interface TabDef {
|
|
385
|
+
label: string;
|
|
386
|
+
content: (ctx: UIContext) => void;
|
|
387
|
+
disabled?: boolean;
|
|
388
|
+
}
|
|
389
|
+
export type AppCallback = (ui: UIContext) => void | Promise<void>;
|
|
390
|
+
export type Connection = ServerConnection;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AppCallback, ConnectionScope } from '../components/types';
|
|
2
|
+
import type { ClientEventPayload, ThemeMode } from './messages';
|
|
3
|
+
export interface AppDefinition {
|
|
4
|
+
title: string;
|
|
5
|
+
callback: AppCallback;
|
|
6
|
+
}
|
|
7
|
+
export declare function runAppForScope(scope: ConnectionScope, title: string, callback: AppCallback, theme: ThemeMode): {
|
|
8
|
+
html: string;
|
|
9
|
+
title: string;
|
|
10
|
+
theme: ThemeMode;
|
|
11
|
+
};
|
|
12
|
+
export declare function handleClientEvent(scope: ConnectionScope, payload: ClientEventPayload): void;
|
|
13
|
+
export declare function executeApp(appDef: AppDefinition, scope: ConnectionScope, theme: ThemeMode): {
|
|
14
|
+
ok: true;
|
|
15
|
+
html: string;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
error: Error;
|
|
19
|
+
};
|
|
20
|
+
export declare function resetScopeForRerender(scope: ConnectionScope): void;
|