@ai-ecoverse/slicc-spectrum 1.4.0 → 1.5.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 +29 -3
- package/dist/{chunk-SBRFYELH.js → chunk-4JUIYZ4Q.js} +4 -4
- package/dist/{chunk-DKUZSKYB.js → chunk-CDYGCBW7.js} +4 -4
- package/dist/{chunk-YPQKCWWG.js → chunk-FXM4K5WL.js} +4 -4
- package/dist/{chunk-C6RSQDMS.js → chunk-H57UPFSK.js} +2 -2
- package/dist/{chunk-FFZJVWZQ.js → chunk-JCRICTXR.js} +5 -5
- package/dist/{chunk-6JNYNXUQ.js → chunk-LR5GBIK7.js} +7 -7
- package/dist/{chunk-6GSDEWD5.js → chunk-MJOCPOXZ.js} +8 -8
- package/dist/{chunk-JUNZW2NI.js → chunk-N27WNL5Q.js} +3 -3
- package/dist/chunk-WCSKGA5W.js +30 -0
- package/dist/chunk-WCSKGA5W.js.map +7 -0
- package/dist/chunk-YWO2TNED.js +71 -0
- package/dist/chunk-YWO2TNED.js.map +7 -0
- package/dist/slicc-dummy.js +4 -62
- package/dist/slicc-dummy.js.map +4 -4
- package/dist/slicc-kernel-model.js +379 -0
- package/dist/slicc-kernel-model.js.map +7 -0
- package/dist/slicc-terminal.js +3 -26
- package/dist/slicc-terminal.js.map +3 -3
- package/dist/slicc-ui.js +248 -52
- package/dist/slicc-ui.js.map +4 -4
- package/dist/types/app/app.d.ts +5 -1
- package/dist/types/app/files.d.ts +11 -0
- package/dist/types/app/panels.d.ts +3 -3
- package/dist/types/app/spectrum.d.ts +2 -0
- package/dist/types/kernel/files.d.ts +20 -0
- package/dist/types/kernel/idle.d.ts +51 -0
- package/dist/types/kernel/index.d.ts +17 -0
- package/dist/types/kernel/terminals.d.ts +21 -0
- package/dist/types/kernel.d.ts +7 -0
- package/package.json +5 -1
- /package/dist/{chunk-SBRFYELH.js.map → chunk-4JUIYZ4Q.js.map} +0 -0
- /package/dist/{chunk-DKUZSKYB.js.map → chunk-CDYGCBW7.js.map} +0 -0
- /package/dist/{chunk-YPQKCWWG.js.map → chunk-FXM4K5WL.js.map} +0 -0
- /package/dist/{chunk-C6RSQDMS.js.map → chunk-H57UPFSK.js.map} +0 -0
- /package/dist/{chunk-FFZJVWZQ.js.map → chunk-JCRICTXR.js.map} +0 -0
- /package/dist/{chunk-6JNYNXUQ.js.map → chunk-LR5GBIK7.js.map} +0 -0
- /package/dist/{chunk-6GSDEWD5.js.map → chunk-MJOCPOXZ.js.map} +0 -0
- /package/dist/{chunk-JUNZW2NI.js.map → chunk-N27WNL5Q.js.map} +0 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import {
|
|
2
|
+
kernelBackend
|
|
3
|
+
} from "./chunk-WCSKGA5W.js";
|
|
4
|
+
import {
|
|
5
|
+
DummySettings,
|
|
6
|
+
clock
|
|
7
|
+
} from "./chunk-YWO2TNED.js";
|
|
8
|
+
import {
|
|
9
|
+
Emitter
|
|
10
|
+
} from "./chunk-T5NHW4KC.js";
|
|
11
|
+
import "./chunk-AXQFWXYZ.js";
|
|
12
|
+
|
|
13
|
+
// src/kernel/files.ts
|
|
14
|
+
function split(path) {
|
|
15
|
+
return path.split("/").filter(Boolean);
|
|
16
|
+
}
|
|
17
|
+
function same(a, b) {
|
|
18
|
+
return a?.kind === b.kind && a.size === b.size && a.modified === b.modified;
|
|
19
|
+
}
|
|
20
|
+
var KernelFiles = class extends Emitter {
|
|
21
|
+
#root;
|
|
22
|
+
#skip;
|
|
23
|
+
#interval;
|
|
24
|
+
#entries = /* @__PURE__ */ new Map();
|
|
25
|
+
#scanned = false;
|
|
26
|
+
#running = null;
|
|
27
|
+
#again = false;
|
|
28
|
+
#timer = null;
|
|
29
|
+
#observer = null;
|
|
30
|
+
constructor(root, { skip = [], interval = 2e3 } = {}) {
|
|
31
|
+
super();
|
|
32
|
+
this.#root = root;
|
|
33
|
+
this.#skip = new Set(skip);
|
|
34
|
+
this.#interval = interval;
|
|
35
|
+
}
|
|
36
|
+
start() {
|
|
37
|
+
if (this.#timer || this.#observer) return;
|
|
38
|
+
const Observer = globalThis.FileSystemObserver;
|
|
39
|
+
if (!Observer) {
|
|
40
|
+
this.#poll();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const observer = new Observer(() => void this.refresh());
|
|
44
|
+
this.#observer = observer;
|
|
45
|
+
observer.observe(this.#root, { recursive: true }).catch(() => {
|
|
46
|
+
if (this.#observer !== observer) return;
|
|
47
|
+
this.#observer = null;
|
|
48
|
+
this.#poll();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
#poll() {
|
|
52
|
+
this.#timer = setInterval(() => void this.refresh(), this.#interval);
|
|
53
|
+
}
|
|
54
|
+
stop() {
|
|
55
|
+
if (this.#timer) clearInterval(this.#timer);
|
|
56
|
+
this.#timer = null;
|
|
57
|
+
this.#observer?.disconnect();
|
|
58
|
+
this.#observer = null;
|
|
59
|
+
}
|
|
60
|
+
async #walk(dir, prefix, out) {
|
|
61
|
+
const values = dir.values();
|
|
62
|
+
for await (const handle of values) {
|
|
63
|
+
const path = `${prefix}/${handle.name}`;
|
|
64
|
+
if (handle.kind === "directory") {
|
|
65
|
+
out.set(path, { path, kind: "directory", size: 0, modified: 0 });
|
|
66
|
+
if (!this.#skip.has(path)) await this.#walk(handle, path, out).catch(() => {
|
|
67
|
+
});
|
|
68
|
+
} else {
|
|
69
|
+
const file = await handle.getFile().catch(() => null);
|
|
70
|
+
if (file)
|
|
71
|
+
out.set(path, { path, kind: "file", size: file.size, modified: file.lastModified });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
#list() {
|
|
76
|
+
return [...this.#entries.values()].sort((a, b) => a.path.localeCompare(b.path));
|
|
77
|
+
}
|
|
78
|
+
async #scan() {
|
|
79
|
+
const next = /* @__PURE__ */ new Map();
|
|
80
|
+
await this.#walk(this.#root, "", next);
|
|
81
|
+
const touched = [...next.values()].filter(
|
|
82
|
+
(entry) => !same(this.#entries.get(entry.path), entry)
|
|
83
|
+
);
|
|
84
|
+
const gone = [...this.#entries.values()].filter((entry) => !next.has(entry.path));
|
|
85
|
+
const first = !this.#scanned;
|
|
86
|
+
const previous = this.#entries;
|
|
87
|
+
this.#entries = next;
|
|
88
|
+
this.#scanned = true;
|
|
89
|
+
if (first || touched.length + gone.length === 0) return;
|
|
90
|
+
this.emit("files", this.#list());
|
|
91
|
+
for (const entry of [...touched, ...gone]) {
|
|
92
|
+
if (entry.kind === "file" || previous.get(entry.path)?.kind === "file")
|
|
93
|
+
this.emit("file", entry.path);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
refresh() {
|
|
97
|
+
if (this.#running !== null) {
|
|
98
|
+
this.#again = true;
|
|
99
|
+
return this.#running;
|
|
100
|
+
}
|
|
101
|
+
this.#running = (async () => {
|
|
102
|
+
do {
|
|
103
|
+
this.#again = false;
|
|
104
|
+
await this.#scan();
|
|
105
|
+
} while (this.#again);
|
|
106
|
+
})().finally(() => {
|
|
107
|
+
this.#running = null;
|
|
108
|
+
});
|
|
109
|
+
return this.#running;
|
|
110
|
+
}
|
|
111
|
+
async list() {
|
|
112
|
+
if (!this.#scanned) await this.refresh();
|
|
113
|
+
return this.#list();
|
|
114
|
+
}
|
|
115
|
+
async #parent(path, create) {
|
|
116
|
+
const parts = split(path);
|
|
117
|
+
const name = parts.pop();
|
|
118
|
+
if (!name) throw new Error(`EISDIR: ${path}`);
|
|
119
|
+
let dir = this.#root;
|
|
120
|
+
for (const part of parts) dir = await dir.getDirectoryHandle(part, { create });
|
|
121
|
+
return [dir, name];
|
|
122
|
+
}
|
|
123
|
+
async read(path) {
|
|
124
|
+
try {
|
|
125
|
+
const [dir, name] = await this.#parent(path, false);
|
|
126
|
+
return await (await (await dir.getFileHandle(name)).getFile()).text();
|
|
127
|
+
} catch {
|
|
128
|
+
throw new Error(`ENOENT: ${path}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async write(path, text) {
|
|
132
|
+
const [dir, name] = await this.#parent(path, true);
|
|
133
|
+
const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();
|
|
134
|
+
await writable.write(text);
|
|
135
|
+
await writable.close();
|
|
136
|
+
await this.refresh();
|
|
137
|
+
}
|
|
138
|
+
async remove(path) {
|
|
139
|
+
try {
|
|
140
|
+
const [dir, name] = await this.#parent(path, false);
|
|
141
|
+
await dir.removeEntry(name, { recursive: true });
|
|
142
|
+
} catch {
|
|
143
|
+
throw new Error(`ENOENT: ${path}`);
|
|
144
|
+
}
|
|
145
|
+
await this.refresh();
|
|
146
|
+
}
|
|
147
|
+
changes() {
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
accept() {
|
|
151
|
+
}
|
|
152
|
+
async revert() {
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// src/kernel/idle.ts
|
|
157
|
+
function missing(what) {
|
|
158
|
+
return new Error(`No ${what} in this SLICC yet`);
|
|
159
|
+
}
|
|
160
|
+
var IdleAgent = class extends Emitter {
|
|
161
|
+
list() {
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
active() {
|
|
165
|
+
return "";
|
|
166
|
+
}
|
|
167
|
+
select() {
|
|
168
|
+
}
|
|
169
|
+
messages() {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
async send() {
|
|
173
|
+
throw missing("agent");
|
|
174
|
+
}
|
|
175
|
+
stop() {
|
|
176
|
+
}
|
|
177
|
+
busy() {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
queue() {
|
|
181
|
+
return [];
|
|
182
|
+
}
|
|
183
|
+
unqueue() {
|
|
184
|
+
}
|
|
185
|
+
suggestion() {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
answer() {
|
|
189
|
+
}
|
|
190
|
+
resolveLick() {
|
|
191
|
+
}
|
|
192
|
+
compact() {
|
|
193
|
+
}
|
|
194
|
+
clear() {
|
|
195
|
+
}
|
|
196
|
+
setModel() {
|
|
197
|
+
}
|
|
198
|
+
createScoop() {
|
|
199
|
+
throw missing("agent");
|
|
200
|
+
}
|
|
201
|
+
frozen() {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
freeze() {
|
|
205
|
+
}
|
|
206
|
+
thaw() {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
discard() {
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
var IdleBrowser = class extends Emitter {
|
|
213
|
+
list() {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
active() {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
activate() {
|
|
220
|
+
}
|
|
221
|
+
open() {
|
|
222
|
+
throw missing("browser");
|
|
223
|
+
}
|
|
224
|
+
navigate() {
|
|
225
|
+
}
|
|
226
|
+
close() {
|
|
227
|
+
}
|
|
228
|
+
async screenshot() {
|
|
229
|
+
throw missing("browser");
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
var IdleMemory = class extends Emitter {
|
|
233
|
+
list() {
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
save() {
|
|
237
|
+
throw missing("memory");
|
|
238
|
+
}
|
|
239
|
+
remove() {
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
var IdleMonitor = class extends Emitter {
|
|
243
|
+
snapshot() {
|
|
244
|
+
return { vitals: [], alerts: [], sections: [], updatedAt: 0 };
|
|
245
|
+
}
|
|
246
|
+
resync() {
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
var IdleSprinkles = class extends Emitter {
|
|
250
|
+
list() {
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
send() {
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
var IdleTray = class extends Emitter {
|
|
257
|
+
status() {
|
|
258
|
+
return {
|
|
259
|
+
name: "slicc",
|
|
260
|
+
kind: "hosted",
|
|
261
|
+
connection: "offline",
|
|
262
|
+
role: "none",
|
|
263
|
+
followers: [],
|
|
264
|
+
spent: 0,
|
|
265
|
+
rate: 0,
|
|
266
|
+
budget: { percent: 0, window: "daily", resets: "" },
|
|
267
|
+
joinUrl: ""
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
reconnect() {
|
|
271
|
+
}
|
|
272
|
+
disconnect() {
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
// src/kernel/terminals.ts
|
|
277
|
+
var KernelTerminals = class extends Emitter {
|
|
278
|
+
#kernel;
|
|
279
|
+
#argv;
|
|
280
|
+
#cwd;
|
|
281
|
+
#env;
|
|
282
|
+
#terminals = [];
|
|
283
|
+
#backends = /* @__PURE__ */ new Map();
|
|
284
|
+
#next = 1;
|
|
285
|
+
constructor(kernel, { argv = ["bash", "-i"], cwd = "/home", env, open = 1 } = {}) {
|
|
286
|
+
super();
|
|
287
|
+
this.#kernel = kernel;
|
|
288
|
+
this.#argv = argv;
|
|
289
|
+
this.#cwd = cwd;
|
|
290
|
+
this.#env = env;
|
|
291
|
+
for (let i = 0; i < open; i++) this.open();
|
|
292
|
+
}
|
|
293
|
+
list() {
|
|
294
|
+
return this.#terminals.map((terminal) => ({ ...terminal }));
|
|
295
|
+
}
|
|
296
|
+
open({
|
|
297
|
+
cwd = this.#cwd,
|
|
298
|
+
agentId = null
|
|
299
|
+
} = {}) {
|
|
300
|
+
const terminal = {
|
|
301
|
+
id: `term-${this.#next}`,
|
|
302
|
+
title: `${this.#argv[0]} ${this.#next}`,
|
|
303
|
+
cwd,
|
|
304
|
+
agentId
|
|
305
|
+
};
|
|
306
|
+
this.#next += 1;
|
|
307
|
+
this.#terminals.push(terminal);
|
|
308
|
+
this.emit("terminals", this.list());
|
|
309
|
+
return { ...terminal };
|
|
310
|
+
}
|
|
311
|
+
close(id) {
|
|
312
|
+
this.#terminals = this.#terminals.filter((terminal) => terminal.id !== id);
|
|
313
|
+
this.#backends.delete(id);
|
|
314
|
+
this.emit("terminals", this.list());
|
|
315
|
+
}
|
|
316
|
+
backend(id) {
|
|
317
|
+
const terminal = this.#terminals.find((candidate) => candidate.id === id);
|
|
318
|
+
if (!terminal) throw new Error(`No terminal ${id}`);
|
|
319
|
+
let backend = this.#backends.get(id);
|
|
320
|
+
if (!backend) {
|
|
321
|
+
backend = kernelBackend(this.#kernel, {
|
|
322
|
+
argv: this.#argv,
|
|
323
|
+
cwd: terminal.cwd,
|
|
324
|
+
env: this.#env
|
|
325
|
+
});
|
|
326
|
+
this.#backends.set(id, backend);
|
|
327
|
+
}
|
|
328
|
+
return backend;
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// src/kernel/index.ts
|
|
333
|
+
var defaults = {
|
|
334
|
+
color: "system",
|
|
335
|
+
model: "",
|
|
336
|
+
thinking: "off",
|
|
337
|
+
sendOnEnter: true,
|
|
338
|
+
showThinking: false,
|
|
339
|
+
diffStyle: "unified"
|
|
340
|
+
};
|
|
341
|
+
function idleModel(storage = null) {
|
|
342
|
+
return {
|
|
343
|
+
agent: new IdleAgent(),
|
|
344
|
+
browser: new IdleBrowser(),
|
|
345
|
+
settings: new DummySettings(defaults, [], [], storage, clock(0)),
|
|
346
|
+
memory: new IdleMemory(),
|
|
347
|
+
monitor: new IdleMonitor(),
|
|
348
|
+
sprinkles: new IdleSprinkles(),
|
|
349
|
+
tray: new IdleTray()
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
function createKernelModel({
|
|
353
|
+
kernel,
|
|
354
|
+
root,
|
|
355
|
+
files,
|
|
356
|
+
terminals,
|
|
357
|
+
storage = null
|
|
358
|
+
}) {
|
|
359
|
+
const model = {
|
|
360
|
+
...idleModel(storage),
|
|
361
|
+
files: new KernelFiles(root, files),
|
|
362
|
+
terminals: new KernelTerminals(kernel, terminals)
|
|
363
|
+
};
|
|
364
|
+
model.files.start();
|
|
365
|
+
return model;
|
|
366
|
+
}
|
|
367
|
+
export {
|
|
368
|
+
IdleAgent,
|
|
369
|
+
IdleBrowser,
|
|
370
|
+
IdleMemory,
|
|
371
|
+
IdleMonitor,
|
|
372
|
+
IdleSprinkles,
|
|
373
|
+
IdleTray,
|
|
374
|
+
KernelFiles,
|
|
375
|
+
KernelTerminals,
|
|
376
|
+
createKernelModel,
|
|
377
|
+
idleModel
|
|
378
|
+
};
|
|
379
|
+
//# sourceMappingURL=slicc-kernel-model.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/kernel/files.ts", "../src/kernel/idle.ts", "../src/kernel/terminals.ts", "../src/kernel/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { Emitter } from '../model/emitter.ts';\nimport type { Change, FileEntry, FileEvents, FilePort } from '../model/types.ts';\n\nexport interface KernelFilesOptions {\n skip?: readonly string[];\n interval?: number;\n}\n\ninterface Observer {\n observe(handle: FileSystemHandle, options: { recursive: boolean }): Promise<void>;\n disconnect(): void;\n}\n\ntype ObserverConstructor = new (callback: () => void) => Observer;\n\nfunction split(path: string): string[] {\n return path.split('/').filter(Boolean);\n}\n\nfunction same(a: FileEntry | undefined, b: FileEntry): boolean {\n return a?.kind === b.kind && a.size === b.size && a.modified === b.modified;\n}\n\nexport class KernelFiles extends Emitter<FileEvents> implements FilePort {\n #root: FileSystemDirectoryHandle;\n #skip: Set<string>;\n #interval: number;\n #entries = new Map<string, FileEntry>();\n #scanned = false;\n #running: Promise<void> | null = null;\n #again = false;\n #timer: ReturnType<typeof setInterval> | null = null;\n #observer: Observer | null = null;\n\n constructor(\n root: FileSystemDirectoryHandle,\n { skip = [], interval = 2000 }: KernelFilesOptions = {}\n ) {\n super();\n this.#root = root;\n this.#skip = new Set(skip);\n this.#interval = interval;\n }\n\n start(): void {\n if (this.#timer || this.#observer) return;\n const Observer = (globalThis as { FileSystemObserver?: ObserverConstructor })\n .FileSystemObserver;\n if (!Observer) {\n this.#poll();\n return;\n }\n const observer = new Observer(() => void this.refresh());\n this.#observer = observer;\n observer.observe(this.#root, { recursive: true }).catch(() => {\n if (this.#observer !== observer) return;\n this.#observer = null;\n this.#poll();\n });\n }\n\n #poll(): void {\n this.#timer = setInterval(() => void this.refresh(), this.#interval);\n }\n\n stop(): void {\n if (this.#timer) clearInterval(this.#timer);\n this.#timer = null;\n this.#observer?.disconnect();\n this.#observer = null;\n }\n\n async #walk(\n dir: FileSystemDirectoryHandle,\n prefix: string,\n out: Map<string, FileEntry>\n ): Promise<void> {\n const values = (\n dir as FileSystemDirectoryHandle & {\n values(): AsyncIterable<FileSystemDirectoryHandle | FileSystemFileHandle>;\n }\n ).values();\n for await (const handle of values) {\n const path = `${prefix}/${handle.name}`;\n if (handle.kind === 'directory') {\n out.set(path, { path, kind: 'directory', size: 0, modified: 0 });\n if (!this.#skip.has(path)) await this.#walk(handle, path, out).catch(() => {});\n } else {\n const file = await handle.getFile().catch(() => null);\n if (file)\n out.set(path, { path, kind: 'file', size: file.size, modified: file.lastModified });\n }\n }\n }\n\n #list(): FileEntry[] {\n return [...this.#entries.values()].sort((a, b) => a.path.localeCompare(b.path));\n }\n\n async #scan(): Promise<void> {\n const next = new Map<string, FileEntry>();\n await this.#walk(this.#root, '', next);\n const touched = [...next.values()].filter(\n (entry) => !same(this.#entries.get(entry.path), entry)\n );\n const gone = [...this.#entries.values()].filter((entry) => !next.has(entry.path));\n const first = !this.#scanned;\n const previous = this.#entries;\n this.#entries = next;\n this.#scanned = true;\n if (first || touched.length + gone.length === 0) return;\n this.emit('files', this.#list());\n for (const entry of [...touched, ...gone]) {\n if (entry.kind === 'file' || previous.get(entry.path)?.kind === 'file')\n this.emit('file', entry.path);\n }\n }\n\n refresh(): Promise<void> {\n if (this.#running !== null) {\n this.#again = true;\n return this.#running;\n }\n this.#running = (async () => {\n do {\n this.#again = false;\n await this.#scan();\n } while (this.#again);\n })().finally(() => {\n this.#running = null;\n });\n return this.#running;\n }\n\n async list(): Promise<readonly FileEntry[]> {\n if (!this.#scanned) await this.refresh();\n return this.#list();\n }\n\n async #parent(path: string, create: boolean): Promise<[FileSystemDirectoryHandle, string]> {\n const parts = split(path);\n const name = parts.pop();\n if (!name) throw new Error(`EISDIR: ${path}`);\n let dir = this.#root;\n for (const part of parts) dir = await dir.getDirectoryHandle(part, { create });\n return [dir, name];\n }\n\n async read(path: string): Promise<string> {\n try {\n const [dir, name] = await this.#parent(path, false);\n return await (await (await dir.getFileHandle(name)).getFile()).text();\n } catch {\n throw new Error(`ENOENT: ${path}`);\n }\n }\n\n async write(path: string, text: string): Promise<void> {\n const [dir, name] = await this.#parent(path, true);\n const writable = await (await dir.getFileHandle(name, { create: true })).createWritable();\n await writable.write(text);\n await writable.close();\n await this.refresh();\n }\n\n async remove(path: string): Promise<void> {\n try {\n const [dir, name] = await this.#parent(path, false);\n await dir.removeEntry(name, { recursive: true });\n } catch {\n throw new Error(`ENOENT: ${path}`);\n }\n await this.refresh();\n }\n\n changes(): readonly Change[] {\n return [];\n }\n\n accept(): void {}\n\n async revert(): Promise<void> {}\n}\n", "import { Emitter } from '../model/emitter.ts';\nimport type {\n Agent,\n AgentEvents,\n AgentPort,\n BrowserEvents,\n BrowserPort,\n BrowserTab,\n FrozenCone,\n Memory,\n MemoryEvents,\n MemoryPort,\n Message,\n MonitorEvents,\n MonitorPort,\n MonitorSnapshot,\n SprinkleEvents,\n SprinklePort,\n TrayEvents,\n TrayPort,\n TrayStatus,\n UserMessage,\n} from '../model/types.ts';\n\nfunction missing(what: string): Error {\n return new Error(`No ${what} in this SLICC yet`);\n}\n\nexport class IdleAgent extends Emitter<AgentEvents> implements AgentPort {\n list(): readonly Agent[] {\n return [];\n }\n active(): string {\n return '';\n }\n select(): void {}\n messages(): readonly Message[] {\n return [];\n }\n async send(): Promise<void> {\n throw missing('agent');\n }\n stop(): void {}\n busy(): boolean {\n return false;\n }\n queue(): readonly UserMessage[] {\n return [];\n }\n unqueue(): void {}\n suggestion(): string | null {\n return null;\n }\n answer(): void {}\n resolveLick(): void {}\n compact(): void {}\n clear(): void {}\n setModel(): void {}\n createScoop(): Agent {\n throw missing('agent');\n }\n frozen(): readonly FrozenCone[] {\n return [];\n }\n freeze(): void {}\n thaw(): Agent | null {\n return null;\n }\n discard(): void {}\n}\n\nexport class IdleBrowser extends Emitter<BrowserEvents> implements BrowserPort {\n list(): readonly BrowserTab[] {\n return [];\n }\n active(): string | null {\n return null;\n }\n activate(): void {}\n open(): BrowserTab {\n throw missing('browser');\n }\n navigate(): void {}\n close(): void {}\n async screenshot(): Promise<string> {\n throw missing('browser');\n }\n}\n\nexport class IdleMemory extends Emitter<MemoryEvents> implements MemoryPort {\n list(): readonly Memory[] {\n return [];\n }\n save(): Memory {\n throw missing('memory');\n }\n remove(): void {}\n}\n\nexport class IdleMonitor extends Emitter<MonitorEvents> implements MonitorPort {\n snapshot(): MonitorSnapshot {\n return { vitals: [], alerts: [], sections: [], updatedAt: 0 };\n }\n resync(): void {}\n}\n\nexport class IdleSprinkles extends Emitter<SprinkleEvents> implements SprinklePort {\n list(): readonly [] {\n return [];\n }\n send(): void {}\n}\n\nexport class IdleTray extends Emitter<TrayEvents> implements TrayPort {\n status(): TrayStatus {\n return {\n name: 'slicc',\n kind: 'hosted',\n connection: 'offline',\n role: 'none',\n followers: [],\n spent: 0,\n rate: 0,\n budget: { percent: 0, window: 'daily', resets: '' },\n joinUrl: '',\n };\n }\n reconnect(): void {}\n disconnect(): void {}\n}\n", "import type { TerminalBackend } from '../backend.ts';\nimport { kernelBackend, type TerminalKernel } from '../kernel-backend.ts';\nimport { Emitter } from '../model/emitter.ts';\nimport type { TerminalEvents, TerminalInfo, TerminalPort } from '../model/types.ts';\n\nexport interface KernelTerminalsOptions {\n argv?: string[];\n cwd?: string;\n env?: Record<string, string>;\n open?: number;\n}\n\nexport class KernelTerminals extends Emitter<TerminalEvents> implements TerminalPort {\n #kernel: TerminalKernel;\n #argv: string[];\n #cwd: string;\n #env: Record<string, string> | undefined;\n #terminals: TerminalInfo[] = [];\n #backends = new Map<string, TerminalBackend>();\n #next = 1;\n\n constructor(\n kernel: TerminalKernel,\n { argv = ['bash', '-i'], cwd = '/home', env, open = 1 }: KernelTerminalsOptions = {}\n ) {\n super();\n this.#kernel = kernel;\n this.#argv = argv;\n this.#cwd = cwd;\n this.#env = env;\n for (let i = 0; i < open; i++) this.open();\n }\n\n list(): readonly TerminalInfo[] {\n return this.#terminals.map((terminal) => ({ ...terminal }));\n }\n\n open({\n cwd = this.#cwd,\n agentId = null,\n }: {\n cwd?: string;\n agentId?: string | null;\n } = {}): TerminalInfo {\n const terminal: TerminalInfo = {\n id: `term-${this.#next}`,\n title: `${this.#argv[0]} ${this.#next}`,\n cwd,\n agentId,\n };\n this.#next += 1;\n this.#terminals.push(terminal);\n this.emit('terminals', this.list());\n return { ...terminal };\n }\n\n close(id: string): void {\n this.#terminals = this.#terminals.filter((terminal) => terminal.id !== id);\n this.#backends.delete(id);\n this.emit('terminals', this.list());\n }\n\n backend(id: string): TerminalBackend {\n const terminal = this.#terminals.find((candidate) => candidate.id === id);\n if (!terminal) throw new Error(`No terminal ${id}`);\n let backend = this.#backends.get(id);\n if (!backend) {\n backend = kernelBackend(this.#kernel, {\n argv: this.#argv,\n cwd: terminal.cwd,\n env: this.#env,\n });\n this.#backends.set(id, backend);\n }\n return backend;\n }\n}\n", "import { clock } from '../dummy/clock.ts';\nimport { DummySettings } from '../dummy/settings.ts';\nimport type { TerminalKernel } from '../kernel-backend.ts';\nimport type { Settings, SliccModel } from '../model/types.ts';\nimport { KernelFiles, type KernelFilesOptions } from './files.ts';\nimport {\n IdleAgent,\n IdleBrowser,\n IdleMemory,\n IdleMonitor,\n IdleSprinkles,\n IdleTray,\n} from './idle.ts';\nimport { KernelTerminals, type KernelTerminalsOptions } from './terminals.ts';\n\nexport interface KernelModelOptions {\n kernel: TerminalKernel;\n root: FileSystemDirectoryHandle;\n files?: KernelFilesOptions;\n terminals?: KernelTerminalsOptions;\n storage?: Storage | null;\n}\n\nexport interface KernelModel extends SliccModel {\n files: KernelFiles;\n terminals: KernelTerminals;\n}\n\nconst defaults: Settings = {\n color: 'system',\n model: '',\n thinking: 'off',\n sendOnEnter: true,\n showThinking: false,\n diffStyle: 'unified',\n};\n\nexport function idleModel(storage: Storage | null = null): Omit<SliccModel, 'files' | 'terminals'> {\n return {\n agent: new IdleAgent(),\n browser: new IdleBrowser(),\n settings: new DummySettings(defaults, [], [], storage, clock(0)),\n memory: new IdleMemory(),\n monitor: new IdleMonitor(),\n sprinkles: new IdleSprinkles(),\n tray: new IdleTray(),\n };\n}\n\nexport function createKernelModel({\n kernel,\n root,\n files,\n terminals,\n storage = null,\n}: KernelModelOptions): KernelModel {\n const model: KernelModel = {\n ...idleModel(storage),\n files: new KernelFiles(root, files),\n terminals: new KernelTerminals(kernel, terminals),\n };\n model.files.start();\n return model;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/slicc-terminal.js
CHANGED
|
@@ -2,34 +2,11 @@ import {
|
|
|
2
2
|
SliccTerminal,
|
|
3
3
|
define
|
|
4
4
|
} from "./chunk-TK4ZJ7LA.js";
|
|
5
|
+
import {
|
|
6
|
+
kernelBackend
|
|
7
|
+
} from "./chunk-WCSKGA5W.js";
|
|
5
8
|
import "./chunk-AXQFWXYZ.js";
|
|
6
9
|
|
|
7
|
-
// src/kernel-backend.ts
|
|
8
|
-
var encoder = new TextEncoder();
|
|
9
|
-
function kernelBackend(kernel, { argv = ["bash", "-i"], cwd, env } = {}) {
|
|
10
|
-
return {
|
|
11
|
-
async open(sink, { cols, rows }) {
|
|
12
|
-
const onData = (bytes) => sink.output(bytes);
|
|
13
|
-
const terminal = await kernel.openTerminal(argv, { cwd, env, cols, rows, onData });
|
|
14
|
-
terminal.exited.then(
|
|
15
|
-
(status) => sink.exit(status),
|
|
16
|
-
(error) => {
|
|
17
|
-
sink.output(encoder.encode(`\r
|
|
18
|
-
${error instanceof Error ? error.message : error}\r
|
|
19
|
-
`));
|
|
20
|
-
sink.exit(1);
|
|
21
|
-
}
|
|
22
|
-
);
|
|
23
|
-
return {
|
|
24
|
-
write: (data) => terminal.write(data),
|
|
25
|
-
resize: (c, r) => terminal.resize(c, r),
|
|
26
|
-
signal: (name) => terminal.signal(name),
|
|
27
|
-
close: () => terminal.close()
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
10
|
// src/index.ts
|
|
34
11
|
define();
|
|
35
12
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { define } from './slicc-terminal.ts';\n\nexport type {\n TerminalBackend,\n TerminalSession,\n TerminalSignal,\n TerminalSink,\n TerminalSize,\n} from './backend.ts';\nexport type {\n KernelBackendOptions,\n KernelTerminal,\n KernelTerminalOptions,\n TerminalKernel,\n} from './kernel-backend.ts';\nexport { kernelBackend } from './kernel-backend.ts';\nexport { define, SliccTerminal } from './slicc-terminal.ts';\n\ndefine();\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;AAkBA,OAAO;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|