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,111 @@
|
|
|
1
|
+
import { applyFragmentSwap, applyRender, applyStreamChunk } from './swap';
|
|
2
|
+
import { bindEventDelegation, bindThemeToggle } from './events';
|
|
3
|
+
const DEFAULT_URL_PATH = '/ws';
|
|
4
|
+
function getDefaultWsUrl() {
|
|
5
|
+
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
6
|
+
return `${protocol}//${window.location.host}${DEFAULT_URL_PATH}`;
|
|
7
|
+
}
|
|
8
|
+
function sendMessage(ws, message) {
|
|
9
|
+
ws.send(JSON.stringify(message));
|
|
10
|
+
}
|
|
11
|
+
export function createWSManager(opts = {}) {
|
|
12
|
+
const wsFactory = opts.wsFactory ?? ((url) => new WebSocket(url));
|
|
13
|
+
const maxRetries = opts.maxRetries ?? Number.POSITIVE_INFINITY;
|
|
14
|
+
const initialDelayMs = opts.initialDelayMs ?? 200;
|
|
15
|
+
let ws = null;
|
|
16
|
+
let attempts = 0;
|
|
17
|
+
let shouldReconnect = true;
|
|
18
|
+
let reconnectTimer = null;
|
|
19
|
+
const connect = () => {
|
|
20
|
+
if (ws)
|
|
21
|
+
return;
|
|
22
|
+
const url = opts.url ?? getDefaultWsUrl();
|
|
23
|
+
ws = wsFactory(url);
|
|
24
|
+
ws.onopen = () => {
|
|
25
|
+
attempts = 0;
|
|
26
|
+
sendMessage(ws, {
|
|
27
|
+
type: 'READY',
|
|
28
|
+
payload: {
|
|
29
|
+
viewport: {
|
|
30
|
+
width: window.innerWidth,
|
|
31
|
+
height: window.innerHeight,
|
|
32
|
+
},
|
|
33
|
+
theme: (() => {
|
|
34
|
+
const stored = window.localStorage.getItem('lk-theme');
|
|
35
|
+
return stored === 'light' || stored === 'dark' ? stored : null;
|
|
36
|
+
})(),
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
bindEventDelegation(document, {
|
|
40
|
+
send: (message) => sendMessage(ws, message),
|
|
41
|
+
});
|
|
42
|
+
bindThemeToggle(document, {
|
|
43
|
+
send: (message) => sendMessage(ws, message),
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
ws.onmessage = (event) => {
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(String(event.data));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
switch (parsed.type) {
|
|
55
|
+
case 'RENDER':
|
|
56
|
+
applyRender(parsed.payload);
|
|
57
|
+
break;
|
|
58
|
+
case 'FRAGMENT':
|
|
59
|
+
applyFragmentSwap(parsed.payload.id, parsed.payload.html);
|
|
60
|
+
break;
|
|
61
|
+
case 'THEME':
|
|
62
|
+
document.documentElement.setAttribute('data-theme', parsed.payload.mode);
|
|
63
|
+
window.localStorage.setItem('lk-theme', parsed.payload.mode);
|
|
64
|
+
break;
|
|
65
|
+
case 'TOAST':
|
|
66
|
+
if (parsed.payload.message.startsWith('__connection_id__:')) {
|
|
67
|
+
const connectionId = parsed.payload.message.slice('__connection_id__:'.length);
|
|
68
|
+
window.localStorage.setItem('lk-connection-id', connectionId);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
// Minimal toast transport: visual UI not implemented yet.
|
|
72
|
+
break;
|
|
73
|
+
case 'STREAM_CHUNK':
|
|
74
|
+
applyStreamChunk(parsed.payload.id, parsed.payload.chunk, parsed.payload.done, parsed.payload.format);
|
|
75
|
+
break;
|
|
76
|
+
case 'STREAM_ERROR':
|
|
77
|
+
console.error(parsed.payload.error);
|
|
78
|
+
break;
|
|
79
|
+
case 'ERROR':
|
|
80
|
+
console.error(parsed.payload.message);
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
ws.onclose = () => {
|
|
87
|
+
ws = null;
|
|
88
|
+
if (!shouldReconnect)
|
|
89
|
+
return;
|
|
90
|
+
if (attempts >= maxRetries)
|
|
91
|
+
return;
|
|
92
|
+
attempts += 1;
|
|
93
|
+
const delay = Math.min(initialDelayMs * 2 ** (attempts - 1), 5000);
|
|
94
|
+
reconnectTimer = setTimeout(() => connect(), delay);
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
const disconnect = () => {
|
|
98
|
+
shouldReconnect = false;
|
|
99
|
+
if (reconnectTimer) {
|
|
100
|
+
clearTimeout(reconnectTimer);
|
|
101
|
+
reconnectTimer = null;
|
|
102
|
+
}
|
|
103
|
+
ws?.close();
|
|
104
|
+
ws = null;
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
connect,
|
|
108
|
+
disconnect,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/client/ws.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAgBhE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,SAAS,eAAe;IACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,OAAO,GAAG,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,gBAAgB,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,OAAsB;IACrD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAyB,EAAE;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IAElD,IAAI,EAAE,GAAqB,IAAI,CAAC;IAChC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,IAAI,CAAC;IAC3B,IAAI,cAAc,GAAyC,IAAI,CAAC;IAEhE,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,EAAE;YACJ,OAAO;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1C,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAEpB,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;YACf,QAAQ,GAAG,CAAC,CAAC;YACb,WAAW,CAAC,EAAe,EAAE;gBAC3B,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE;oBACP,QAAQ,EAAE;wBACR,KAAK,EAAE,MAAM,CAAC,UAAU;wBACxB,MAAM,EAAE,MAAM,CAAC,WAAW;qBAC3B;oBACD,KAAK,EAAE,CAAC,GAAG,EAAE;wBACX,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBACvD,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;oBACjE,CAAC,CAAC,EAAE;iBACL;aACF,CAAC,CAAC;YAEH,mBAAmB,CAAC,QAAQ,EAAE;gBAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,EAAe,EAAE,OAAO,CAAC;aACzD,CAAC,CAAC;YACH,eAAe,CAAC,QAAQ,EAAE;gBACxB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,EAAe,EAAE,OAAO,CAAC;aACzD,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YACvB,IAAI,MAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAkB,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;YAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,KAAK,QAAQ;oBACX,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC5B,MAAM;gBACR,KAAK,UAAU;oBACb,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC1D,MAAM;gBACR,KAAK,OAAO;oBACV,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACzE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC7D,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBAC5D,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;wBAC/E,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;wBAC9D,MAAM;oBACR,CAAC;oBACD,0DAA0D;oBAC1D,MAAM;gBACR,KAAK,cAAc;oBACjB,gBAAgB,CACd,MAAM,CAAC,OAAO,CAAC,EAAE,EACjB,MAAM,CAAC,OAAO,CAAC,KAAK,EACpB,MAAM,CAAC,OAAO,CAAC,IAAI,EACnB,MAAM,CAAC,OAAO,CAAC,MAAM,CACtB,CAAC;oBACF,MAAM;gBACR,KAAK,cAAc;oBACjB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,OAAO;oBACV,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACtC,MAAM;gBACR;oBACE,MAAM;YACV,CAAC;QACH,CAAC,CAAC;QAEF,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;YAChB,EAAE,GAAG,IAAI,CAAC;YACV,IAAI,CAAC,eAAe;gBAClB,OAAO;YACT,IAAI,QAAQ,IAAI,UAAU;gBACxB,OAAO;YACT,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACnE,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,eAAe,GAAG,KAAK,CAAC;QACxB,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,cAAc,CAAC,CAAC;YAC7B,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,EAAE,EAAE,KAAK,EAAE,CAAC;QACZ,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO;QACL,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AlertOpts, ButtonCallbackHandle, ButtonHandle, ButtonOpts, ChatHandle, ChatUIOptions, CodeProps, ComponentHandle, ConnectionScope, FileUploadHandle, FileUploadOpts, GridOpts, ImageGridProps, ImageProps, LoadingOpts, MetricHandle, MetricOpts, NumberInputHandle, NumberInputOpts, ProgressHandle, ProgressOpts, PromptEditorHandle, PromptEditorOpts, SelectHandle, SelectOption, SelectOpts, ShellOpts, ShellRegions, SliderHandle, SliderOpts, StreamHandle, StreamTextOpts, TabDef, TabsOpts, TableHandle, TableProps, TableRow, TextHandle, TextInputHandle, TextInputOpts, ToggleHandle, ToggleOpts, ToastOpts, UIContext as IUIContext } from './types';
|
|
2
|
+
export declare class UIContext implements IUIContext {
|
|
3
|
+
readonly scope: ConnectionScope;
|
|
4
|
+
constructor(scope: ConnectionScope);
|
|
5
|
+
get viewport(): {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
};
|
|
9
|
+
get theme(): import("../engine/messages").ThemeMode;
|
|
10
|
+
setTheme(mode: 'light' | 'dark'): void;
|
|
11
|
+
private register;
|
|
12
|
+
private createPassiveHandle;
|
|
13
|
+
text(content: string): TextHandle;
|
|
14
|
+
button(label: string, onClick: (btn: ButtonCallbackHandle) => void | Promise<void>, opts?: ButtonOpts): ButtonHandle;
|
|
15
|
+
textInput(label: string, opts?: TextInputOpts): TextInputHandle;
|
|
16
|
+
numberInput(label: string, opts?: NumberInputOpts): NumberInputHandle;
|
|
17
|
+
slider(label: string, opts: SliderOpts): SliderHandle;
|
|
18
|
+
toggle(label: string, opts?: ToggleOpts): ToggleHandle;
|
|
19
|
+
select(label: string, options: SelectOption[], opts?: SelectOpts): SelectHandle;
|
|
20
|
+
fileUpload(label: string, opts?: FileUploadOpts): FileUploadHandle;
|
|
21
|
+
markdown(content: string): void;
|
|
22
|
+
image(src: string | null | undefined, opts?: Partial<ImageProps>): void;
|
|
23
|
+
imageGrid(sources: Array<string | {
|
|
24
|
+
src: string;
|
|
25
|
+
alt?: string;
|
|
26
|
+
caption?: string;
|
|
27
|
+
}>, opts?: Partial<ImageGridProps>): void;
|
|
28
|
+
code(content: string, opts?: Partial<CodeProps>): void;
|
|
29
|
+
json(data: unknown, opts?: {
|
|
30
|
+
label?: string;
|
|
31
|
+
}): void;
|
|
32
|
+
table(data: TableRow[], opts?: Partial<TableProps>): TableHandle;
|
|
33
|
+
private createRowHandle;
|
|
34
|
+
metric(label: string, value: string, opts?: MetricOpts): MetricHandle;
|
|
35
|
+
progress(value: number | null, opts?: ProgressOpts): ProgressHandle;
|
|
36
|
+
shell(regions: ShellRegions, opts?: ShellOpts): void;
|
|
37
|
+
grid(areas: Array<(ctx: IUIContext) => void>, opts?: GridOpts): void;
|
|
38
|
+
tabs(tabs: TabDef[], opts?: TabsOpts): ComponentHandle<Record<string, unknown>, string>;
|
|
39
|
+
card(titleOrContent: string | ((ctx: IUIContext) => void), contentOrNothing?: (ctx: IUIContext) => void): void;
|
|
40
|
+
divider(opts?: {
|
|
41
|
+
label?: string;
|
|
42
|
+
}): void;
|
|
43
|
+
spacer(size?: number | 'sm' | 'md' | 'lg'): void;
|
|
44
|
+
toast(message: string, opts?: ToastOpts): void;
|
|
45
|
+
alert(message: string, opts?: AlertOpts): void;
|
|
46
|
+
loading(messageOrOpts?: string | LoadingOpts, opts?: Omit<LoadingOpts, 'message'>): void;
|
|
47
|
+
streamText(opts?: StreamTextOpts): StreamHandle;
|
|
48
|
+
chatUI(opts?: ChatUIOptions): ChatHandle;
|
|
49
|
+
promptEditor(opts?: PromptEditorOpts): PromptEditorHandle;
|
|
50
|
+
onDisconnect(fn: () => void): void;
|
|
51
|
+
}
|