@ai-ecoverse/slicc-agent 3.9.0 → 3.11.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/README.md +53 -2
- package/bin/agent +1 -1
- package/dist/client.js +9 -1
- package/dist/client.js.map +2 -2
- package/dist/codemode/index.js +288 -0
- package/dist/codemode/index.js.map +7 -0
- package/dist/control.js +11 -1
- package/dist/control.js.map +2 -2
- package/dist/host.js +5 -2
- package/dist/host.js.map +2 -2
- package/dist/main.js +40 -3
- package/dist/main.js.map +2 -2
- package/dist/scoops/cli.js +2 -0
- package/dist/scoops/cli.js.map +2 -2
- package/dist/scoops/index.js +3 -2
- package/dist/scoops/index.js.map +2 -2
- package/dist/scoops/requests.js +1 -1
- package/dist/scoops/requests.js.map +2 -2
- package/dist/services.js +3 -1
- package/dist/services.js.map +2 -2
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +2 -2
- package/dist/spectrum/index.js +5 -1
- package/dist/spectrum/index.js.map +3 -3
- package/dist/spectrum/messages.js +12 -0
- package/dist/spectrum/messages.js.map +2 -2
- package/dist/spectrum/sprinkle-port.js +37 -0
- package/dist/spectrum/sprinkle-port.js.map +7 -0
- package/dist/sprinkles/index.js +216 -0
- package/dist/sprinkles/index.js.map +7 -0
- package/dist/sprinkles/kind.js +5 -0
- package/dist/sprinkles/kind.js.map +7 -0
- package/dist/sprinkles/sprinkles.js +65 -0
- package/dist/sprinkles/sprinkles.js.map +7 -0
- package/dist/types/client.d.ts +2 -0
- package/dist/types/codemode/index.d.ts +37 -0
- package/dist/types/control.d.ts +2 -1
- package/dist/types/host.d.ts +2 -0
- package/dist/types/main.d.ts +2 -0
- package/dist/types/scoops/cli.d.ts +1 -0
- package/dist/types/scoops/index.d.ts +2 -0
- package/dist/types/scoops/requests.d.ts +1 -1
- package/dist/types/services.d.ts +11 -1
- package/dist/types/spectrum/index.d.ts +3 -0
- package/dist/types/spectrum/sprinkle-port.d.ts +10 -0
- package/dist/types/sprinkles/index.d.ts +38 -0
- package/dist/types/sprinkles/kind.d.ts +10 -0
- package/dist/types/sprinkles/sprinkles.d.ts +24 -0
- package/package.json +4 -3
- package/packages/vfs-root/skills/sprinkles/SKILL.md +58 -0
- package/packages/vfs-root/skills/welcome/SKILL.md +31 -0
- package/packages/vfs-root/sprinkles/suggestions.shtml +391 -0
- package/packages/vfs-root/sprinkles/welcome.shtml +552 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<title>Suggestions</title>
|
|
5
|
+
|
|
6
|
+
<link rel="icon" href="ice-cream-cone" />
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
9
|
+
<style>
|
|
10
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
11
|
+
|
|
12
|
+
body {
|
|
13
|
+
font-family: var(--s2-font-family, 'Adobe Clean', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif);
|
|
14
|
+
background: transparent;
|
|
15
|
+
color: var(--s2-content-default, #e8e8e8);
|
|
16
|
+
padding: 14px 18px 20px;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#gelatiereStream[hidden] { display: none; }
|
|
20
|
+
|
|
21
|
+
.gelatiere-entry { padding: 18px 0; }
|
|
22
|
+
.gelatiere-entry:first-child { padding-top: 2px; }
|
|
23
|
+
.gelatiere-entry + .gelatiere-entry,
|
|
24
|
+
.gelatiere-done {
|
|
25
|
+
border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.gelatiere-entry__head {
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
gap: 8px;
|
|
32
|
+
font-size: 13px;
|
|
33
|
+
font-weight: 600;
|
|
34
|
+
line-height: 1.35;
|
|
35
|
+
color: var(--s2-content-default, #e8e8e8);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.gelatiere-entry__head :is(i, svg) { width: 15px; height: 15px; flex-shrink: 0; }
|
|
39
|
+
.gelatiere-entry__title { flex: 1; }
|
|
40
|
+
.gelatiere-kind {
|
|
41
|
+
font-size: 10px;
|
|
42
|
+
font-weight: 600;
|
|
43
|
+
text-transform: uppercase;
|
|
44
|
+
letter-spacing: 0.08em;
|
|
45
|
+
color: var(--s2-content-tertiary, #8a8a8a);
|
|
46
|
+
white-space: nowrap;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.gelatiere-why {
|
|
50
|
+
margin-top: 6px;
|
|
51
|
+
font-size: 12px;
|
|
52
|
+
line-height: 1.55;
|
|
53
|
+
color: var(--s2-content-secondary, #a1a1a1);
|
|
54
|
+
}
|
|
55
|
+
.gelatiere-cmd {
|
|
56
|
+
margin-top: 8px;
|
|
57
|
+
font-size: 11px;
|
|
58
|
+
color: var(--s2-content-tertiary, #8a8a8a);
|
|
59
|
+
overflow-wrap: anywhere;
|
|
60
|
+
}
|
|
61
|
+
.gelatiere-cmd code,
|
|
62
|
+
.gelatiere-why code {
|
|
63
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
64
|
+
font-size: 11px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.gelatiere-actions {
|
|
68
|
+
display: flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
justify-content: flex-end;
|
|
71
|
+
gap: 14px;
|
|
72
|
+
margin-top: 12px;
|
|
73
|
+
}
|
|
74
|
+
.gelatiere-actions .gelatiere-taken-note { margin-right: auto; }
|
|
75
|
+
|
|
76
|
+
.gelatiere-quiet-btn {
|
|
77
|
+
background: none;
|
|
78
|
+
border: none;
|
|
79
|
+
font-family: inherit;
|
|
80
|
+
font-size: 12px;
|
|
81
|
+
color: var(--s2-content-tertiary, #8a8a8a);
|
|
82
|
+
cursor: pointer;
|
|
83
|
+
padding: 4px 0;
|
|
84
|
+
}
|
|
85
|
+
.gelatiere-quiet-btn:hover { color: var(--s2-content-secondary, #a1a1a1); }
|
|
86
|
+
|
|
87
|
+
.gelatiere-empty { padding: 2px 0 4px; }
|
|
88
|
+
.gelatiere-explore {
|
|
89
|
+
margin-top: 18px;
|
|
90
|
+
padding-top: 14px;
|
|
91
|
+
border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));
|
|
92
|
+
}
|
|
93
|
+
.gelatiere-explore__link {
|
|
94
|
+
display: block;
|
|
95
|
+
padding: 10px 0;
|
|
96
|
+
text-decoration: none;
|
|
97
|
+
color: inherit;
|
|
98
|
+
}
|
|
99
|
+
.gelatiere-explore__link + .gelatiere-explore__link {
|
|
100
|
+
border-top: 1px solid var(--s2-border-subtle, var(--s2-gray-200, #e8e8e8));
|
|
101
|
+
}
|
|
102
|
+
.gelatiere-explore__link:hover .gelatiere-entry__title { text-decoration: underline; }
|
|
103
|
+
|
|
104
|
+
.gelatiere-entry--taken .gelatiere-entry__head,
|
|
105
|
+
.gelatiere-entry--taken .gelatiere-why,
|
|
106
|
+
.gelatiere-entry--taken .gelatiere-cmd { opacity: 0.6; }
|
|
107
|
+
.gelatiere-taken-note {
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
gap: 6px;
|
|
111
|
+
font-size: 12px;
|
|
112
|
+
color: var(--s2-content-positive, #2d9d78);
|
|
113
|
+
}
|
|
114
|
+
.gelatiere-taken-note :is(i, svg) { width: 14px; height: 14px; flex-shrink: 0; }
|
|
115
|
+
|
|
116
|
+
.gelatiere-done { margin-top: 6px; padding-top: 14px; }
|
|
117
|
+
.gelatiere-done-title {
|
|
118
|
+
padding-bottom: 6px;
|
|
119
|
+
font-size: 10px;
|
|
120
|
+
font-weight: 600;
|
|
121
|
+
text-transform: uppercase;
|
|
122
|
+
letter-spacing: 0.08em;
|
|
123
|
+
color: var(--s2-content-tertiary, #8a8a8a);
|
|
124
|
+
}
|
|
125
|
+
.gelatiere-done-row {
|
|
126
|
+
display: flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
gap: 8px;
|
|
129
|
+
padding: 3px 0;
|
|
130
|
+
font-size: 12px;
|
|
131
|
+
color: var(--s2-content-secondary, #a1a1a1);
|
|
132
|
+
}
|
|
133
|
+
.gelatiere-done-row :is(i, svg) {
|
|
134
|
+
width: 13px;
|
|
135
|
+
height: 13px;
|
|
136
|
+
flex-shrink: 0;
|
|
137
|
+
color: var(--s2-content-positive, #2d9d78);
|
|
138
|
+
}
|
|
139
|
+
.gelatiere-done-row .gelatiere-done-title-text {
|
|
140
|
+
flex: 1;
|
|
141
|
+
min-width: 0;
|
|
142
|
+
overflow: hidden;
|
|
143
|
+
text-overflow: ellipsis;
|
|
144
|
+
white-space: nowrap;
|
|
145
|
+
}
|
|
146
|
+
.gelatiere-done-row .gelatiere-done-what {
|
|
147
|
+
color: var(--s2-content-tertiary, #8a8a8a);
|
|
148
|
+
white-space: nowrap;
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
151
|
+
</head>
|
|
152
|
+
<body>
|
|
153
|
+
|
|
154
|
+
<div id="gelatiereStream" hidden></div>
|
|
155
|
+
|
|
156
|
+
<script>
|
|
157
|
+
|
|
158
|
+
var GELATIERE_SUGGESTIONS_PATH = '/shared/.gelatiere/suggestions.json';
|
|
159
|
+
|
|
160
|
+
var KIND_LABELS = {
|
|
161
|
+
'skill': { label: 'Skill', icon: 'package', action: 'Install', done: 'installed' },
|
|
162
|
+
'use-case': { label: 'Try this', icon: 'sparkles', action: 'Try it', done: 'tried' },
|
|
163
|
+
'tip': { label: 'Tip', icon: 'lightbulb', action: null, done: 'tried' },
|
|
164
|
+
'skill-idea': { label: 'New skill', icon: 'wand-sparkles', action: 'Draft it', done: 'drafted' },
|
|
165
|
+
'issue': { label: 'Report', icon: 'bug', action: 'Report it', done: 'reported' },
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
var USE_CASE_COMMAND = 'gelatiere use-cases --limit 3 --json';
|
|
169
|
+
var USE_CASE_CACHE_MS = 12 * 60 * 60 * 1000;
|
|
170
|
+
var EMPTY_HEADLINE = 'Nothing here yet';
|
|
171
|
+
var EMPTY_BODY =
|
|
172
|
+
'The gelatiere reads how you actually work, nightly and after each chat ' +
|
|
173
|
+
'ends, and leaves what it finds here: a skill worth installing, a use ' +
|
|
174
|
+
'case worth trying, a habit worth changing. Check back after your next session.';
|
|
175
|
+
|
|
176
|
+
function el(tag, className, text) {
|
|
177
|
+
var node = document.createElement(tag);
|
|
178
|
+
if (className) node.className = className;
|
|
179
|
+
if (text != null) node.textContent = text;
|
|
180
|
+
return node;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function lucide(name) {
|
|
184
|
+
var ic = document.createElement('i');
|
|
185
|
+
ic.setAttribute('data-lucide', name);
|
|
186
|
+
return ic;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function gelatierePrimaryButton(label, onClick) {
|
|
190
|
+
var btn = el('button', 'sprinkle-btn sprinkle-btn--primary', label);
|
|
191
|
+
btn.type = 'button';
|
|
192
|
+
btn.onclick = onClick;
|
|
193
|
+
return btn;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function gelatiereQuietButton(label, onClick, title) {
|
|
197
|
+
var btn = el('button', 'gelatiere-quiet-btn', label);
|
|
198
|
+
btn.type = 'button';
|
|
199
|
+
if (title) btn.title = title;
|
|
200
|
+
btn.onclick = onClick;
|
|
201
|
+
return btn;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function buildSuggestionCard(s) {
|
|
205
|
+
var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;
|
|
206
|
+
var card = el('div', 'gelatiere-entry');
|
|
207
|
+
card.dataset.id = s.id;
|
|
208
|
+
|
|
209
|
+
var head = el('div', 'gelatiere-entry__head');
|
|
210
|
+
head.appendChild(lucide(meta.icon));
|
|
211
|
+
head.appendChild(el('span', 'gelatiere-entry__title', s.title));
|
|
212
|
+
head.appendChild(el('span', 'gelatiere-kind', meta.label));
|
|
213
|
+
card.appendChild(head);
|
|
214
|
+
|
|
215
|
+
card.appendChild(el('div', 'gelatiere-why', s.body));
|
|
216
|
+
if (s.install) {
|
|
217
|
+
var install = el('div', 'gelatiere-cmd');
|
|
218
|
+
install.appendChild(document.createTextNode('Installs with '));
|
|
219
|
+
install.appendChild(el('code', null, s.install));
|
|
220
|
+
card.appendChild(install);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
var actions = el('div', 'gelatiere-actions');
|
|
224
|
+
|
|
225
|
+
function markTaken(note) {
|
|
226
|
+
card.classList.add('gelatiere-entry--taken');
|
|
227
|
+
var done = el('div', 'gelatiere-taken-note');
|
|
228
|
+
done.appendChild(lucide('check'));
|
|
229
|
+
done.appendChild(document.createTextNode(note));
|
|
230
|
+
actions.replaceChildren(done);
|
|
231
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
actions.appendChild(gelatiereQuietButton('Dismiss', function () {
|
|
235
|
+
if (window.slicc) slicc.lick({ action: 'gelatiere-dismiss', data: { id: s.id } });
|
|
236
|
+
card.remove();
|
|
237
|
+
if (!document.querySelector('.gelatiere-entry')) renderGelatiereCaughtUp();
|
|
238
|
+
}, "that's not for me"));
|
|
239
|
+
if (s.kind === 'skill') {
|
|
240
|
+
actions.appendChild(gelatierePrimaryButton(meta.action, function () {
|
|
241
|
+
if (window.slicc) slicc.lick({ action: 'gelatiere-install',
|
|
242
|
+
data: { id: s.id, skill: s.skill || null, install: s.install || null, title: s.title } });
|
|
243
|
+
markTaken('Installing. The cone is on it.');
|
|
244
|
+
}));
|
|
245
|
+
} else if (meta.action && s.prompt) {
|
|
246
|
+
actions.appendChild(gelatierePrimaryButton(meta.action, function () {
|
|
247
|
+
if (window.slicc) slicc.lick({ action: 'gelatiere-try',
|
|
248
|
+
data: { id: s.id, prompt: s.prompt, title: s.title } });
|
|
249
|
+
markTaken('Sent to the cone. Watch the chat.');
|
|
250
|
+
}));
|
|
251
|
+
} else if (s.url && /^https?:\/\//i.test(s.url)) {
|
|
252
|
+
|
|
253
|
+
var link = el('a', 'gelatiere-quiet-btn', 'Read more');
|
|
254
|
+
link.href = s.url;
|
|
255
|
+
link.target = '_blank';
|
|
256
|
+
link.rel = 'noopener';
|
|
257
|
+
actions.appendChild(link);
|
|
258
|
+
}
|
|
259
|
+
card.appendChild(actions);
|
|
260
|
+
return card;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
var DONE_LEDGER_LIMIT = 5;
|
|
264
|
+
function buildDoneLedger(taken) {
|
|
265
|
+
var wrap = el('div', 'gelatiere-done');
|
|
266
|
+
wrap.appendChild(el('div', 'gelatiere-done-title', 'Done'));
|
|
267
|
+
taken.slice(0, DONE_LEDGER_LIMIT).forEach(function (s) {
|
|
268
|
+
var meta = KIND_LABELS[s.kind] || KIND_LABELS.tip;
|
|
269
|
+
var row = el('div', 'gelatiere-done-row');
|
|
270
|
+
row.appendChild(lucide('check'));
|
|
271
|
+
row.appendChild(el('span', 'gelatiere-done-title-text', s.title));
|
|
272
|
+
row.appendChild(el('span', 'gelatiere-done-what', meta.done));
|
|
273
|
+
wrap.appendChild(row);
|
|
274
|
+
});
|
|
275
|
+
return wrap;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function readCachedUseCases() {
|
|
279
|
+
try {
|
|
280
|
+
var saved = window.slicc && slicc.getState && slicc.getState();
|
|
281
|
+
if (!saved || !saved.useCases || !saved.fetchedAt) return null;
|
|
282
|
+
if (Date.now() - saved.fetchedAt > USE_CASE_CACHE_MS) return null;
|
|
283
|
+
return saved.useCases;
|
|
284
|
+
} catch (e) { return null; }
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function loadUseCases() {
|
|
288
|
+
var cached = readCachedUseCases();
|
|
289
|
+
if (cached) return Promise.resolve(cached);
|
|
290
|
+
if (!window.slicc || typeof slicc.exec !== 'function') return Promise.resolve([]);
|
|
291
|
+
return Promise.resolve(slicc.exec(USE_CASE_COMMAND)).then(function (result) {
|
|
292
|
+
if (!result || result.exitCode !== 0) return [];
|
|
293
|
+
var parsed = JSON.parse(result.stdout);
|
|
294
|
+
if (!Array.isArray(parsed)) return [];
|
|
295
|
+
var cases = parsed.filter(function (c) { return c && c.url && c.title; });
|
|
296
|
+
try { slicc.setState({ fetchedAt: Date.now(), useCases: cases }); } catch (e) {}
|
|
297
|
+
return cases;
|
|
298
|
+
}, function () { return []; });
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function appendUseCases(stream) {
|
|
302
|
+
loadUseCases().then(function (cases) {
|
|
303
|
+
if (!cases.length || !stream.isConnected) return;
|
|
304
|
+
var wrap = el('div', 'gelatiere-explore');
|
|
305
|
+
wrap.appendChild(el('div', 'gelatiere-done-title', 'Meanwhile, from sliccy.com'));
|
|
306
|
+
cases.forEach(function (c) {
|
|
307
|
+
var link = el('a', 'gelatiere-explore__link');
|
|
308
|
+
link.href = c.url;
|
|
309
|
+
link.target = '_blank';
|
|
310
|
+
link.rel = 'noopener';
|
|
311
|
+
var head = el('div', 'gelatiere-entry__head');
|
|
312
|
+
head.appendChild(el('span', 'gelatiere-entry__title', c.title));
|
|
313
|
+
head.appendChild(lucide('arrow-up-right'));
|
|
314
|
+
link.appendChild(head);
|
|
315
|
+
if (c.description) link.appendChild(el('div', 'gelatiere-why', c.description));
|
|
316
|
+
wrap.appendChild(link);
|
|
317
|
+
});
|
|
318
|
+
stream.appendChild(wrap);
|
|
319
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function renderGelatiereEmpty(headline, body) {
|
|
324
|
+
var stream = document.getElementById('gelatiereStream');
|
|
325
|
+
stream.innerHTML = '';
|
|
326
|
+
var empty = el('div', 'gelatiere-empty');
|
|
327
|
+
var head = el('div', 'gelatiere-entry__head');
|
|
328
|
+
head.appendChild(lucide('ice-cream-cone'));
|
|
329
|
+
head.appendChild(el('span', 'gelatiere-entry__title', headline));
|
|
330
|
+
empty.appendChild(head);
|
|
331
|
+
empty.appendChild(el('div', 'gelatiere-why', body));
|
|
332
|
+
stream.appendChild(empty);
|
|
333
|
+
stream.hidden = false;
|
|
334
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
335
|
+
appendUseCases(stream);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function renderGelatiereCaughtUp() {
|
|
339
|
+
renderGelatiereEmpty(
|
|
340
|
+
'All caught up',
|
|
341
|
+
'You have answered everything the gelatiere left here. The next pass runs ' +
|
|
342
|
+
'tonight, and again after your next chat ends.'
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function renderGelatiereStream() {
|
|
347
|
+
var stream = document.getElementById('gelatiereStream');
|
|
348
|
+
if (!stream) return;
|
|
349
|
+
|
|
350
|
+
if (!window.slicc || typeof slicc.readFile !== 'function') {
|
|
351
|
+
renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
Promise.resolve(slicc.exists(GELATIERE_SUGGESTIONS_PATH)).then(function (present) {
|
|
356
|
+
return present ? slicc.readFile(GELATIERE_SUGGESTIONS_PATH) : '[]';
|
|
357
|
+
}).then(function (raw) {
|
|
358
|
+
var list = [];
|
|
359
|
+
try { list = JSON.parse(raw); } catch (e) { list = []; }
|
|
360
|
+
if (!Array.isArray(list)) list = [];
|
|
361
|
+
var readable = list.filter(function (s) {
|
|
362
|
+
return s && typeof s === 'object' && s.id && s.title && s.body;
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
var open = readable.filter(function (s) { return !s.dismissedAt && !s.takenAt; });
|
|
366
|
+
var taken = readable.filter(function (s) { return s.takenAt; });
|
|
367
|
+
if (open.length === 0 && taken.length === 0) {
|
|
368
|
+
renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (open.length === 0) {
|
|
373
|
+
renderGelatiereCaughtUp();
|
|
374
|
+
stream.appendChild(buildDoneLedger(taken));
|
|
375
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
stream.innerHTML = '';
|
|
379
|
+
open.forEach(function (s) { stream.appendChild(buildSuggestionCard(s)); });
|
|
380
|
+
if (taken.length > 0) stream.appendChild(buildDoneLedger(taken));
|
|
381
|
+
stream.hidden = false;
|
|
382
|
+
if (window.LucideIcons) window.LucideIcons.render();
|
|
383
|
+
}, function () {
|
|
384
|
+
renderGelatiereEmpty(EMPTY_HEADLINE, EMPTY_BODY);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
renderGelatiereStream();
|
|
389
|
+
</script>
|
|
390
|
+
</body>
|
|
391
|
+
</html>
|