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.
Files changed (101) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +58 -0
  3. package/dist/__tests__/integration/ws-flow.integration.test.d.ts +1 -0
  4. package/dist/__tests__/integration/ws-flow.integration.test.js +249 -0
  5. package/dist/__tests__/integration/ws-flow.integration.test.js.map +1 -0
  6. package/dist/__tests__/integration/ws-flow.test.d.ts +1 -0
  7. package/dist/__tests__/integration/ws-flow.test.js +70 -0
  8. package/dist/__tests__/integration/ws-flow.test.js.map +1 -0
  9. package/dist/client/events.d.ts +6 -0
  10. package/dist/client/events.js +114 -0
  11. package/dist/client/events.js.map +1 -0
  12. package/dist/client/index.d.ts +2 -0
  13. package/dist/client/index.js +5 -0
  14. package/dist/client/index.js.map +1 -0
  15. package/dist/client/swap.d.ts +4 -0
  16. package/dist/client/swap.js +47 -0
  17. package/dist/client/swap.js.map +1 -0
  18. package/dist/client/ws.d.ts +11 -0
  19. package/dist/client/ws.js +111 -0
  20. package/dist/client/ws.js.map +1 -0
  21. package/dist/components/context.d.ts +51 -0
  22. package/dist/components/context.js +595 -0
  23. package/dist/components/context.js.map +1 -0
  24. package/dist/components/context.test.d.ts +1 -0
  25. package/dist/components/context.test.js +69 -0
  26. package/dist/components/context.test.js.map +1 -0
  27. package/dist/components/id.d.ts +3 -0
  28. package/dist/components/id.js +9 -0
  29. package/dist/components/id.js.map +1 -0
  30. package/dist/components/registry.d.ts +2 -0
  31. package/dist/components/registry.js +97 -0
  32. package/dist/components/registry.js.map +1 -0
  33. package/dist/components/types.d.ts +390 -0
  34. package/dist/components/types.js +2 -0
  35. package/dist/components/types.js.map +1 -0
  36. package/dist/engine/executor.d.ts +20 -0
  37. package/dist/engine/executor.js +84 -0
  38. package/dist/engine/executor.js.map +1 -0
  39. package/dist/engine/executor.test.d.ts +1 -0
  40. package/dist/engine/executor.test.js +79 -0
  41. package/dist/engine/executor.test.js.map +1 -0
  42. package/dist/engine/index.d.ts +6 -0
  43. package/dist/engine/index.js +7 -0
  44. package/dist/engine/index.js.map +1 -0
  45. package/dist/engine/lifecycle.d.ts +16 -0
  46. package/dist/engine/lifecycle.js +44 -0
  47. package/dist/engine/lifecycle.js.map +1 -0
  48. package/dist/engine/lifecycle.test.d.ts +1 -0
  49. package/dist/engine/lifecycle.test.js +15 -0
  50. package/dist/engine/lifecycle.test.js.map +1 -0
  51. package/dist/engine/messages.d.ts +95 -0
  52. package/dist/engine/messages.js +21 -0
  53. package/dist/engine/messages.js.map +1 -0
  54. package/dist/engine/renderer.components.test.d.ts +1 -0
  55. package/dist/engine/renderer.components.test.js +302 -0
  56. package/dist/engine/renderer.components.test.js.map +1 -0
  57. package/dist/engine/renderer.d.ts +4 -0
  58. package/dist/engine/renderer.js +408 -0
  59. package/dist/engine/renderer.js.map +1 -0
  60. package/dist/engine/renderer.test.d.ts +1 -0
  61. package/dist/engine/renderer.test.js +80 -0
  62. package/dist/engine/renderer.test.js.map +1 -0
  63. package/dist/engine/server.d.ts +43 -0
  64. package/dist/engine/server.js +402 -0
  65. package/dist/engine/server.js.map +1 -0
  66. package/dist/engine/server.test.d.ts +1 -0
  67. package/dist/engine/server.test.js +149 -0
  68. package/dist/engine/server.test.js.map +1 -0
  69. package/dist/engine/shell.d.ts +7 -0
  70. package/dist/engine/shell.js +25 -0
  71. package/dist/engine/shell.js.map +1 -0
  72. package/dist/engine/theme-path.d.ts +11 -0
  73. package/dist/engine/theme-path.js +32 -0
  74. package/dist/engine/theme-path.js.map +1 -0
  75. package/dist/engine/theme-path.test.d.ts +1 -0
  76. package/dist/engine/theme-path.test.js +52 -0
  77. package/dist/engine/theme-path.test.js.map +1 -0
  78. package/dist/engine/watcher.d.ts +8 -0
  79. package/dist/engine/watcher.js +27 -0
  80. package/dist/engine/watcher.js.map +1 -0
  81. package/dist/engine/websocket.d.ts +24 -0
  82. package/dist/engine/websocket.hub.test.d.ts +1 -0
  83. package/dist/engine/websocket.hub.test.js +75 -0
  84. package/dist/engine/websocket.hub.test.js.map +1 -0
  85. package/dist/engine/websocket.js +119 -0
  86. package/dist/engine/websocket.js.map +1 -0
  87. package/dist/index.d.ts +21 -0
  88. package/dist/index.js +26 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/plugins/registry.d.ts +11 -0
  91. package/dist/plugins/registry.js +61 -0
  92. package/dist/plugins/registry.js.map +1 -0
  93. package/dist/plugins/registry.test.d.ts +1 -0
  94. package/dist/plugins/registry.test.js +44 -0
  95. package/dist/plugins/registry.test.js.map +1 -0
  96. package/dist/plugins/types.d.ts +30 -0
  97. package/dist/plugins/types.js +2 -0
  98. package/dist/plugins/types.js.map +1 -0
  99. package/dist/style.css +134 -0
  100. package/dist/theme/lastriko.css +134 -0
  101. package/package.json +60 -0
@@ -0,0 +1,408 @@
1
+ export function escapeHtml(input) {
2
+ return input
3
+ .replaceAll('&', '&')
4
+ .replaceAll('<', '&lt;')
5
+ .replaceAll('>', '&gt;')
6
+ .replaceAll('"', '&quot;')
7
+ .replaceAll('\'', '&#39;');
8
+ }
9
+ function renderAttributes(attrs) {
10
+ const pairs = [];
11
+ for (const [key, value] of Object.entries(attrs)) {
12
+ if (value === undefined || value === false) {
13
+ continue;
14
+ }
15
+ if (value === true) {
16
+ pairs.push(key);
17
+ continue;
18
+ }
19
+ pairs.push(`${key}="${escapeHtml(String(value))}"`);
20
+ }
21
+ return pairs.length > 0 ? ` ${pairs.join(' ')}` : '';
22
+ }
23
+ function renderInputLabel(label, helperText) {
24
+ const helper = helperText ? `<div class="lk-helper">${escapeHtml(helperText)}</div>` : '';
25
+ return `<label class="lk-label">${escapeHtml(label)}</label>${helper}`;
26
+ }
27
+ function renderText(handle) {
28
+ return `<p class="lk-text" data-lk-id="${handle.id}">${escapeHtml(String(handle.props.content))}</p>`;
29
+ }
30
+ function renderButton(handle) {
31
+ const attrs = renderAttributes({
32
+ 'class': `lk-button lk-button--${handle.props.variant ?? 'primary'}`,
33
+ 'data-lk-id': handle.id,
34
+ 'data-lk-kind': 'button',
35
+ 'data-lk-event': 'click',
36
+ 'disabled': handle.props.loading || handle.props.disabled,
37
+ 'aria-busy': handle.props.loading ? 'true' : undefined,
38
+ 'type': 'button',
39
+ });
40
+ const spinner = handle.props.loading ? '<span class="lk-spinner" aria-hidden="true"></span>' : '';
41
+ return `<button${attrs}>${spinner}<span>${escapeHtml(handle.props.label)}</span></button>`;
42
+ }
43
+ function renderTextInput(handle) {
44
+ const commonAttrs = renderAttributes({
45
+ 'data-lk-id': handle.id,
46
+ 'data-lk-kind': handle.type,
47
+ 'data-lk-event': 'change',
48
+ 'disabled': handle.props.disabled,
49
+ 'maxlength': handle.props.maxLength,
50
+ 'placeholder': handle.props.placeholder,
51
+ 'aria-label': handle.props.label,
52
+ });
53
+ const value = escapeHtml(handle.props.value);
54
+ const input = handle.props.multiline
55
+ ? `<textarea${commonAttrs} rows="${handle.props.rows ?? 3}">${value}</textarea>`
56
+ : `<input${commonAttrs} type="${handle.props.type ?? 'text'}" value="${value}" />`;
57
+ const promptProps = handle.props;
58
+ const extra = handle.type === 'promptEditor' && promptProps.showCharCount
59
+ ? `<div class="lk-meta">${String(handle.props.value.length)} chars</div>`
60
+ : '';
61
+ const label = String(handle.props.label ?? '');
62
+ const helperText = String(handle.props.helperText ?? '');
63
+ return `<div class="lk-field" data-lk-id="${handle.id}">${renderInputLabel(label, helperText)}${input}${extra}</div>`;
64
+ }
65
+ function renderNumberInput(handle) {
66
+ const attrs = renderAttributes({
67
+ 'type': 'number',
68
+ 'value': handle.props.value,
69
+ 'min': handle.props.min,
70
+ 'max': handle.props.max,
71
+ 'step': handle.props.step ?? 1,
72
+ 'disabled': handle.props.disabled,
73
+ 'data-lk-event': 'change',
74
+ 'aria-label': handle.props.label,
75
+ });
76
+ const label = String(handle.props.label ?? '');
77
+ const helperText = String(handle.props.helperText ?? '');
78
+ return `<div class="lk-field" data-lk-id="${handle.id}">${renderInputLabel(label, helperText)}<input${attrs} /></div>`;
79
+ }
80
+ function renderSlider(handle) {
81
+ const attrs = renderAttributes({
82
+ 'type': 'range',
83
+ 'min': handle.props.min,
84
+ 'max': handle.props.max,
85
+ 'step': handle.props.step ?? 1,
86
+ 'value': handle.props.value,
87
+ 'disabled': handle.props.disabled,
88
+ 'data-lk-event': 'change',
89
+ 'aria-label': handle.props.label,
90
+ });
91
+ const value = handle.props.showValue === false ? '' : `<span class="lk-slider-value">${escapeHtml(String(handle.props.value))}</span>`;
92
+ const label = String(handle.props.label ?? '');
93
+ const helperText = String(handle.props.helperText ?? '');
94
+ return `<div class="lk-field" data-lk-id="${handle.id}">${renderInputLabel(label, helperText)}<div class="lk-slider-row"><input${attrs} />${value}</div></div>`;
95
+ }
96
+ function renderToggle(handle) {
97
+ const attrs = renderAttributes({
98
+ 'type': 'checkbox',
99
+ 'checked': handle.props.value,
100
+ 'disabled': handle.props.disabled,
101
+ 'data-lk-event': 'change',
102
+ 'aria-label': handle.props.label,
103
+ });
104
+ const stateLabel = handle.props.value
105
+ ? (handle.props.onLabel ?? 'On')
106
+ : (handle.props.offLabel ?? 'Off');
107
+ const label = String(handle.props.label ?? '');
108
+ const helperText = String(handle.props.helperText ?? '');
109
+ return `<div class="lk-field lk-field--toggle" data-lk-id="${handle.id}">${renderInputLabel(label, helperText)}<label class="lk-toggle-wrap"><input${attrs} /><span class="lk-toggle"></span><span class="lk-toggle-state">${escapeHtml(stateLabel)}</span></label></div>`;
110
+ }
111
+ function renderSelect(handle) {
112
+ const options = handle.props.options.map((option) => {
113
+ const attrs = renderAttributes({
114
+ value: option.value,
115
+ selected: option.value === handle.props.value,
116
+ disabled: option.disabled,
117
+ });
118
+ return `<option${attrs}>${escapeHtml(option.label)}</option>`;
119
+ }).join('');
120
+ const placeholder = handle.props.placeholder && !handle.props.value
121
+ ? `<option value="" selected disabled>${escapeHtml(handle.props.placeholder)}</option>`
122
+ : '';
123
+ const attrs = renderAttributes({
124
+ 'disabled': handle.props.disabled,
125
+ 'data-lk-event': 'change',
126
+ 'aria-label': handle.props.label,
127
+ });
128
+ const label = String(handle.props.label ?? '');
129
+ const helperText = String(handle.props.helperText ?? '');
130
+ return `<div class="lk-field" data-lk-id="${handle.id}">${renderInputLabel(label, helperText)}<select${attrs}>${placeholder}${options}</select></div>`;
131
+ }
132
+ function renderFileUpload(handle) {
133
+ const attrs = renderAttributes({
134
+ 'type': 'file',
135
+ 'accept': handle.props.accept,
136
+ 'multiple': handle.props.multiple,
137
+ 'disabled': handle.props.disabled,
138
+ 'data-lk-event': 'change',
139
+ 'aria-label': handle.props.label,
140
+ });
141
+ const valueLabel = (() => {
142
+ if (!handle.props.value) {
143
+ return 'No file selected';
144
+ }
145
+ if (Array.isArray(handle.props.value)) {
146
+ return `${handle.props.value.length} files`;
147
+ }
148
+ return handle.props.value.name;
149
+ })();
150
+ const label = String(handle.props.label ?? '');
151
+ const helperText = String(handle.props.helperText ?? '');
152
+ return `<div class="lk-field lk-file-upload" data-lk-id="${handle.id}" data-lk-kind="fileUpload">${renderInputLabel(label, helperText)}<input${attrs} /><div class="lk-file-upload-value">${escapeHtml(valueLabel)}</div></div>`;
153
+ }
154
+ function renderMarkdown(handle) {
155
+ const html = escapeHtml(handle.props.content).replaceAll('\n', '<br />');
156
+ return `<div class="lk-markdown" data-lk-id="${handle.id}">${html}</div>`;
157
+ }
158
+ function renderImage(handle) {
159
+ if (!handle.props.src) {
160
+ return `<figure class="lk-image lk-image--empty" data-lk-id="${handle.id}"><div class="lk-image-placeholder">${escapeHtml(handle.props.alt)}</div></figure>`;
161
+ }
162
+ const attrs = renderAttributes({
163
+ src: handle.props.src,
164
+ alt: handle.props.alt,
165
+ loading: 'lazy',
166
+ width: handle.props.width,
167
+ height: handle.props.height,
168
+ });
169
+ const caption = handle.props.caption ? `<figcaption>${escapeHtml(handle.props.caption)}</figcaption>` : '';
170
+ return `<figure class="lk-image" data-lk-id="${handle.id}"><img${attrs} />${caption}</figure>`;
171
+ }
172
+ function renderImageGrid(handle) {
173
+ const minWidth = handle.props.minWidth ?? 150;
174
+ const gridTemplate = handle.props.cols === 'auto' || handle.props.cols === undefined
175
+ ? `repeat(auto-fit, minmax(${minWidth}px, 1fr))`
176
+ : `repeat(${handle.props.cols}, minmax(0, 1fr))`;
177
+ const style = `style="display:grid;grid-template-columns:${gridTemplate};gap:${handle.props.gap ?? 8}px;"`;
178
+ const items = handle.props.items.map((item) => `<figure><img loading="lazy" src="${escapeHtml(item.src)}" alt="${escapeHtml(item.alt)}" />${item.caption ? `<figcaption>${escapeHtml(item.caption)}</figcaption>` : ''}</figure>`).join('');
179
+ return `<div class="lk-image-grid" data-lk-id="${handle.id}" ${style}>${items}</div>`;
180
+ }
181
+ function renderCode(handle) {
182
+ return `<pre class="lk-code" data-lk-id="${handle.id}" data-lk-lang="${escapeHtml(handle.props.lang ?? 'text')}"><code>${escapeHtml(handle.props.content)}</code></pre>`;
183
+ }
184
+ function renderJson(handle) {
185
+ const label = handle.props.label ? `<div class="lk-json-label">${escapeHtml(handle.props.label)}</div>` : '';
186
+ const json = escapeHtml(JSON.stringify(handle.props.data, null, 2) ?? 'null');
187
+ return `<div class="lk-json" data-lk-id="${handle.id}">${label}<pre>${json}</pre></div>`;
188
+ }
189
+ function renderTable(handle) {
190
+ const head = handle.props.columns.map((column) => `<th>${escapeHtml(column)}</th>`).join('');
191
+ const body = handle.props.rows.length > 0
192
+ ? handle.props.rows.map((row) => {
193
+ const cells = handle.props.columns.map((column) => `<td>${escapeHtml(String(row.data[column] ?? ''))}</td>`).join('');
194
+ return `<tr data-lk-table-row-id="${row.id}">${cells}</tr>`;
195
+ }).join('')
196
+ : `<tr><td colspan="${Math.max(1, handle.props.columns.length)}">${escapeHtml(handle.props.emptyMessage ?? 'No data')}</td></tr>`;
197
+ const style = handle.props.maxHeight ? `style="max-height:${handle.props.maxHeight}px;overflow:auto;display:block;"` : '';
198
+ return `<div class="lk-table-wrap" data-lk-id="${handle.id}" data-lk-kind="table" ${style}><table class="lk-table${handle.props.striped ? ' lk-table--striped' : ''}"><thead><tr>${head}</tr></thead><tbody>${body}</tbody></table></div>`;
199
+ }
200
+ function renderMetric(handle) {
201
+ const prefix = handle.props.prefix ? `<span class="lk-metric-prefix">${escapeHtml(handle.props.prefix)}</span>` : '';
202
+ const unit = handle.props.unit ? `<span class="lk-metric-unit">${escapeHtml(handle.props.unit)}</span>` : '';
203
+ const delta = handle.props.delta === undefined
204
+ ? ''
205
+ : `<div class="lk-metric-delta">${escapeHtml(String(handle.props.delta))}${handle.props.deltaLabel ? ` ${escapeHtml(handle.props.deltaLabel)}` : ''}</div>`;
206
+ return `<div class="lk-metric" data-lk-id="${handle.id}"><div class="lk-metric-label">${escapeHtml(handle.props.label)}</div><div class="lk-metric-value">${prefix}${escapeHtml(handle.props.value)}${unit}</div>${delta}</div>`;
207
+ }
208
+ function renderProgress(handle) {
209
+ if (handle.props.value === null) {
210
+ return `<div class="lk-progress lk-progress--indeterminate" data-lk-id="${handle.id}"><div class="lk-spinner" aria-hidden="true"></div><span>${escapeHtml(handle.props.label ?? 'Loading...')}</span></div>`;
211
+ }
212
+ const pct = Math.max(0, Math.min(100, Number(handle.props.value)));
213
+ const text = handle.props.showPercentage === false ? '' : `<span class="lk-progress-pct">${pct}%</span>`;
214
+ return `<div class="lk-progress" data-lk-id="${handle.id}">${handle.props.label ? `<div class="lk-progress-label">${escapeHtml(handle.props.label)}</div>` : ''}<div class="lk-progress-bar"><span style="width:${pct}%"></span></div>${text}</div>`;
215
+ }
216
+ function renderShell(handle, byId) {
217
+ const renderRegion = (ids) => ids.map((id) => byId.get(id)).filter(Boolean).map((child) => renderComponent(child, byId)).join('');
218
+ const sidebarPosition = handle.props.opts.sidebarPosition ?? 'left';
219
+ const sidebarWidth = handle.props.opts.sidebarWidth ?? '260px';
220
+ return `<section class="lk-shell lk-shell--sidebar-${escapeHtml(sidebarPosition)}" data-lk-id="${handle.id}" style="--lk-sidebar-width:${escapeHtml(sidebarWidth)};">
221
+ ${handle.props.regions.header.length ? `<header class="lk-shell-header">${renderRegion(handle.props.regions.header)}</header>` : ''}
222
+ ${handle.props.regions.sidebar.length ? `<aside class="lk-shell-sidebar">${renderRegion(handle.props.regions.sidebar)}</aside>` : ''}
223
+ <main class="lk-shell-main">${renderRegion(handle.props.regions.main)}</main>
224
+ ${handle.props.regions.footer.length ? `<footer class="lk-shell-footer">${renderRegion(handle.props.regions.footer)}</footer>` : ''}
225
+ </section>`;
226
+ }
227
+ function renderGrid(handle, byId) {
228
+ const cols = handle.props.opts.cols;
229
+ const minWidth = handle.props.opts.minWidth ?? 200;
230
+ const templateCols = Array.isArray(cols)
231
+ ? cols.join(' ')
232
+ : typeof cols === 'number'
233
+ ? `repeat(${cols}, minmax(0, 1fr))`
234
+ : `repeat(auto-fit, minmax(${minWidth}px, 1fr))`;
235
+ const gap = handle.props.opts.gap ?? 16;
236
+ const cells = handle.props.cells.map((cell) => `<div class="lk-grid-cell">${cell.map((id) => byId.get(id)).filter(Boolean).map((child) => renderComponent(child, byId)).join('')}</div>`).join('');
237
+ return `<div class="lk-grid" data-lk-id="${handle.id}" style="display:grid;grid-template-columns:${escapeHtml(templateCols)};gap:${gap}px;">${cells}</div>`;
238
+ }
239
+ function renderTabs(handle, byId) {
240
+ const props = handle.props;
241
+ const active = props.active;
242
+ const nav = props.tabs.map((tab) => `<button class="lk-tab${tab.label === active ? ' is-active' : ''}" type="button" disabled="${tab.disabled ? 'disabled' : ''}" data-lk-tab-target="${escapeHtml(tab.label)}">${escapeHtml(tab.label)}</button>`).join('');
243
+ const bodies = props.tabs.map((tab) => {
244
+ const hidden = tab.label === active ? '' : 'hidden';
245
+ const content = tab.ids.map((id) => byId.get(id)).filter(Boolean).map((child) => renderComponent(child, byId)).join('');
246
+ return `<section class="lk-tab-panel" data-lk-tab-panel="${escapeHtml(tab.label)}" ${hidden}>${content}</section>`;
247
+ }).join('');
248
+ return `<div class="lk-tabs" data-lk-id="${handle.id}"><nav class="lk-tab-nav">${nav}</nav>${bodies}</div>`;
249
+ }
250
+ function renderCard(handle, byId) {
251
+ const title = handle.props.title ? `<div class="lk-card-title">${escapeHtml(handle.props.title)}</div>` : '';
252
+ const body = handle.props.ids.map((id) => byId.get(id)).filter(Boolean).map((child) => renderComponent(child, byId)).join('');
253
+ return `<section class="lk-card" data-lk-id="${handle.id}">${title}${body}</section>`;
254
+ }
255
+ function renderDivider(handle) {
256
+ return handle.props.label
257
+ ? `<div class="lk-divider" data-lk-id="${handle.id}"><span>${escapeHtml(handle.props.label)}</span></div>`
258
+ : `<hr class="lk-divider" data-lk-id="${handle.id}" />`;
259
+ }
260
+ function renderSpacer(handle) {
261
+ const size = typeof handle.props.size === 'number'
262
+ ? `${handle.props.size}px`
263
+ : handle.props.size === 'sm'
264
+ ? '8px'
265
+ : handle.props.size === 'lg'
266
+ ? '32px'
267
+ : '16px';
268
+ return `<div class="lk-spacer" data-lk-id="${handle.id}" style="height:${size}"></div>`;
269
+ }
270
+ function renderAlert(handle) {
271
+ const title = handle.props.title ? `<div class="lk-alert-title">${escapeHtml(handle.props.title)}</div>` : '';
272
+ return `<div role="alert" class="lk-alert lk-alert--${escapeHtml(handle.props.type ?? 'info')}" data-lk-id="${handle.id}">${title}<div>${escapeHtml(handle.props.message)}</div></div>`;
273
+ }
274
+ function renderLoading(handle) {
275
+ return `<div class="lk-loading lk-loading--${escapeHtml(handle.props.mode ?? 'inline')}" data-lk-id="${handle.id}"><span class="lk-spinner"></span><span>${escapeHtml(handle.props.message)}</span></div>`;
276
+ }
277
+ function renderStreamText(handle) {
278
+ const text = handle.props.text ?? '';
279
+ const body = (handle.props.format ?? 'markdown') === 'markdown'
280
+ ? escapeHtml(text).replaceAll('\n', '<br />')
281
+ : escapeHtml(text);
282
+ const cursor = handle.props.cursor === false || !handle.props.isStreaming
283
+ ? ''
284
+ : '<span data-lk-stream-cursor class="lk-stream-cursor">▍</span>';
285
+ return `<div class="lk-stream" data-lk-id="${handle.id}"><div class="lk-stream-body" data-lk-stream-body data-lk-text="${escapeHtml(text)}">${body}</div>${cursor}</div>`;
286
+ }
287
+ function renderChat(handle) {
288
+ const messages = handle.props.messages.map((message) => `<div class="lk-chat-msg lk-chat-msg--${escapeHtml(message.role)}"><span class="lk-chat-role">${escapeHtml(message.role)}</span><p>${escapeHtml(message.content)}</p></div>`).join('');
289
+ return `<section class="lk-chat" data-lk-id="${handle.id}"><div class="lk-chat-history">${messages}</div></section>`;
290
+ }
291
+ export function renderComponent(handle, byId) {
292
+ switch (handle.type) {
293
+ case 'text':
294
+ return renderText(handle);
295
+ case 'button':
296
+ return renderButton(handle);
297
+ case 'textInput':
298
+ return renderTextInput(handle);
299
+ case 'numberInput':
300
+ return renderNumberInput(handle);
301
+ case 'slider':
302
+ return renderSlider(handle);
303
+ case 'toggle':
304
+ return renderToggle(handle);
305
+ case 'select':
306
+ return renderSelect(handle);
307
+ case 'fileUpload':
308
+ return renderFileUpload(handle);
309
+ case 'promptEditor':
310
+ return renderTextInput(handle);
311
+ case 'markdown':
312
+ return renderMarkdown(handle);
313
+ case 'image':
314
+ return renderImage(handle);
315
+ case 'imageGrid':
316
+ return renderImageGrid(handle);
317
+ case 'code':
318
+ return renderCode(handle);
319
+ case 'json':
320
+ return renderJson(handle);
321
+ case 'table':
322
+ return renderTable(handle);
323
+ case 'metric':
324
+ return renderMetric(handle);
325
+ case 'progress':
326
+ return renderProgress(handle);
327
+ case 'shell':
328
+ return renderShell(handle, byId ?? new Map());
329
+ case 'grid':
330
+ return renderGrid(handle, byId ?? new Map());
331
+ case 'tabs':
332
+ return renderTabs(handle, byId ?? new Map());
333
+ case 'card':
334
+ return renderCard(handle, byId ?? new Map());
335
+ case 'divider':
336
+ return renderDivider(handle);
337
+ case 'spacer':
338
+ return renderSpacer(handle);
339
+ case 'alert':
340
+ return renderAlert(handle);
341
+ case 'loading':
342
+ return renderLoading(handle);
343
+ case 'streamText':
344
+ return renderStreamText(handle);
345
+ case 'chatUI':
346
+ return renderChat(handle);
347
+ default: {
348
+ const unknownHandle = handle;
349
+ return `<div class="lk-component lk-component--${escapeHtml(unknownHandle.type)}" data-lk-id="${unknownHandle.id}"></div>`;
350
+ }
351
+ }
352
+ }
353
+ export function renderPage(components) {
354
+ const byId = new Map(components.map((component) => [component.id, component]));
355
+ const consumed = new Set();
356
+ const output = [];
357
+ for (const component of components) {
358
+ if (consumed.has(component.id)) {
359
+ continue;
360
+ }
361
+ if (component.type === 'shell') {
362
+ output.push(renderComponent(component, byId));
363
+ const shellProps = component.props;
364
+ for (const ids of Object.values(shellProps.regions)) {
365
+ for (const id of ids) {
366
+ consumed.add(id);
367
+ }
368
+ }
369
+ consumed.add(component.id);
370
+ continue;
371
+ }
372
+ if (component.type === 'grid') {
373
+ output.push(renderComponent(component, byId));
374
+ const gridProps = component.props;
375
+ for (const cell of gridProps.cells) {
376
+ for (const id of cell) {
377
+ consumed.add(id);
378
+ }
379
+ }
380
+ consumed.add(component.id);
381
+ continue;
382
+ }
383
+ if (component.type === 'tabs') {
384
+ output.push(renderComponent(component, byId));
385
+ const tabsProps = component.props;
386
+ for (const tab of tabsProps.tabs) {
387
+ for (const id of tab.ids) {
388
+ consumed.add(id);
389
+ }
390
+ }
391
+ consumed.add(component.id);
392
+ continue;
393
+ }
394
+ if (component.type === 'card') {
395
+ output.push(renderComponent(component, byId));
396
+ const cardProps = component.props;
397
+ for (const id of cardProps.ids) {
398
+ consumed.add(id);
399
+ }
400
+ consumed.add(component.id);
401
+ continue;
402
+ }
403
+ output.push(renderComponent(component, byId));
404
+ consumed.add(component.id);
405
+ }
406
+ return output.join('\n');
407
+ }
408
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/engine/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,80 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { renderComponent, renderPage } from './renderer';
3
+ function textHandle(content) {
4
+ return {
5
+ id: 'text-1',
6
+ type: 'text',
7
+ props: { content },
8
+ get value() {
9
+ return content;
10
+ },
11
+ update(next) {
12
+ content = next;
13
+ this.props.content = next;
14
+ },
15
+ };
16
+ }
17
+ describe('renderer', () => {
18
+ it('includes data-lk-id and escapes text', () => {
19
+ const html = renderComponent(textHandle('<img src=x onerror=alert(1)>'));
20
+ expect(html).toContain('data-lk-id="text-1"');
21
+ expect(html).not.toContain('<img');
22
+ expect(html).toContain('&lt;img src=x onerror=alert(1)&gt;');
23
+ });
24
+ it('renders input and stream components with expected markers', () => {
25
+ const handles = [
26
+ {
27
+ id: 'textInput-1',
28
+ type: 'textInput',
29
+ props: { label: 'Name', value: 'Ada', multiline: false },
30
+ get value() {
31
+ return this.props.value;
32
+ },
33
+ update: () => { },
34
+ },
35
+ {
36
+ id: 'streamText-1',
37
+ type: 'streamText',
38
+ props: { text: 'hello', isStreaming: true, format: 'plain', cursor: true },
39
+ get value() {
40
+ return this.props.text;
41
+ },
42
+ get text() {
43
+ return this.props.text;
44
+ },
45
+ get isStreaming() {
46
+ return this.props.isStreaming;
47
+ },
48
+ append: () => { },
49
+ done: () => { },
50
+ clear: () => { },
51
+ update: () => { },
52
+ },
53
+ ];
54
+ const html = renderPage(handles);
55
+ expect(html).toContain('data-lk-id="textInput-1"');
56
+ expect(html).toContain('data-lk-stream-body');
57
+ expect(html).toContain('data-lk-stream-cursor');
58
+ });
59
+ it('renders shell composition containing child content', () => {
60
+ const handles = [
61
+ textHandle('inside shell'),
62
+ {
63
+ id: 'shell-1',
64
+ type: 'shell',
65
+ props: {
66
+ regions: { header: [], sidebar: [], main: ['text-1'], footer: [] },
67
+ opts: { sidebarPosition: 'left', sidebarWidth: '260px' },
68
+ },
69
+ value: undefined,
70
+ update: () => { },
71
+ },
72
+ ];
73
+ const html = renderPage(handles);
74
+ expect(html).toContain('lk-shell');
75
+ expect(html).toContain('inside shell');
76
+ expect(html).toContain('class="lk-shell');
77
+ expect(html).toContain('<main class="lk-shell-main"><p class="lk-text"');
78
+ });
79
+ });
80
+ //# sourceMappingURL=renderer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.test.js","sourceRoot":"","sources":["../../src/engine/renderer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type IncomingMessage, type ServerResponse, createServer as createHttpServer } from 'node:http';
2
+ import type { AppCallback } from '../components/types';
3
+ import type { ThemeMode } from './messages';
4
+ import type { PluginRegistry } from '../plugins/registry';
5
+ export interface ServerOptions {
6
+ title: string;
7
+ app: AppCallback;
8
+ plugins?: PluginRegistry;
9
+ port?: number;
10
+ host?: string;
11
+ theme?: ThemeMode;
12
+ }
13
+ export interface RuntimeConfig {
14
+ port?: number;
15
+ host?: string;
16
+ theme?: ThemeMode;
17
+ }
18
+ export interface RunningServer {
19
+ port: number;
20
+ host: string;
21
+ server: ReturnType<typeof createHttpServer>;
22
+ stop: () => Promise<void>;
23
+ }
24
+ declare function createHttpHandler(opts: {
25
+ title: string;
26
+ clientPath?: string;
27
+ clientRootPath: string | null;
28
+ onRoot?: () => void;
29
+ getTheme: () => 'light' | 'dark';
30
+ toolbar: boolean;
31
+ themeCssPath: string | null;
32
+ uploadDirRoot: string;
33
+ }): (req: IncomingMessage, res: ServerResponse<IncomingMessage>) => Promise<void>;
34
+ export declare function startServer(definition: {
35
+ title: string;
36
+ callback: AppCallback;
37
+ plugins?: PluginRegistry | AppCallback[];
38
+ }, config?: RuntimeConfig): Promise<RunningServer>;
39
+ export declare const __internal: {
40
+ createHttpHandler: typeof createHttpHandler;
41
+ };
42
+ export declare function createServer(options: ServerOptions): Promise<RunningServer>;
43
+ export {};