@ai-ecoverse/slicc-spectrum 1.47.3 → 1.47.4

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.
@@ -0,0 +1,56 @@
1
+ // src/kernel-backend.ts
2
+ var encoder = new TextEncoder();
3
+ var decoder = new TextDecoder();
4
+ var osc7 = /\x1b\]7;file:\/\/[^/\x07\x1b]*(\/[^\x07\x1b]*)(?:\x07|\x1b\\)/g;
5
+ var cwdPromptCommand = `printf '\\033]7;file://%s%s\\007' "\${HOSTNAME:-}" "$PWD"`;
6
+ function decodePath(path) {
7
+ try {
8
+ return decodeURIComponent(path);
9
+ } catch {
10
+ return path;
11
+ }
12
+ }
13
+ function cwdWatcher(onCwd) {
14
+ let pending = "";
15
+ return (bytes) => {
16
+ const text = pending + decoder.decode(bytes, { stream: true });
17
+ let last;
18
+ for (const match of text.matchAll(osc7)) last = match[1];
19
+ if (last !== void 0) onCwd(decodePath(last));
20
+ const open = text.lastIndexOf("\x1B]7;");
21
+ pending = open >= 0 && !text.slice(open).match(/\x07|\x1b\\/) ? text.slice(open) : "";
22
+ };
23
+ }
24
+ function kernelBackend(kernel, { argv = ["bash", "-i"], cwd, env, onCwd } = {}) {
25
+ return {
26
+ async open(sink, { cols, rows }) {
27
+ const watch = onCwd && cwdWatcher(onCwd);
28
+ const onData = (bytes) => {
29
+ watch?.(bytes);
30
+ sink.output(bytes);
31
+ };
32
+ const terminal = await kernel.openTerminal(argv, { cwd, env, cols, rows, onData });
33
+ terminal.exited.then(
34
+ (status) => sink.exit(status),
35
+ (error) => {
36
+ sink.output(encoder.encode(`\r
37
+ ${error instanceof Error ? error.message : error}\r
38
+ `));
39
+ sink.exit(1);
40
+ }
41
+ );
42
+ return {
43
+ write: (data) => terminal.write(data),
44
+ resize: (c, r) => terminal.resize(c, r),
45
+ signal: (name) => terminal.signal(name),
46
+ close: () => terminal.close()
47
+ };
48
+ }
49
+ };
50
+ }
51
+
52
+ export {
53
+ cwdPromptCommand,
54
+ kernelBackend
55
+ };
56
+ //# sourceMappingURL=chunk-YVJG5657.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/kernel-backend.ts"],
4
+ "sourcesContent": ["import type { TerminalBackend, TerminalSignal } from './backend.ts';\n\nexport interface KernelTerminal {\n readonly exited: Promise<number>;\n write(data: Uint8Array): void;\n resize(cols: number, rows: number): void;\n signal(name: TerminalSignal): void;\n close(): void;\n}\n\nexport interface KernelTerminalOptions {\n cwd?: string;\n env?: Record<string, string>;\n cols: number;\n rows: number;\n onData: (bytes: Uint8Array) => void;\n}\n\nexport interface TerminalKernel {\n openTerminal(argv: string[], options: KernelTerminalOptions): Promise<KernelTerminal>;\n}\n\nexport interface KernelBackendOptions {\n argv?: string[];\n cwd?: string;\n env?: Record<string, string>;\n onCwd?: (cwd: string) => void;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst osc7 = /\\x1b\\]7;file:\\/\\/[^/\\x07\\x1b]*(\\/[^\\x07\\x1b]*)(?:\\x07|\\x1b\\\\)/g;\n\nexport const cwdPromptCommand = `printf '\\\\033]7;file://%s%s\\\\007' \"\\${HOSTNAME:-}\" \"$PWD\"`;\n\nfunction decodePath(path: string): string {\n try {\n return decodeURIComponent(path);\n } catch {\n return path;\n }\n}\n\nexport function cwdWatcher(onCwd: (cwd: string) => void): (bytes: Uint8Array) => void {\n let pending = '';\n return (bytes) => {\n const text = pending + decoder.decode(bytes, { stream: true });\n let last: string | undefined;\n for (const match of text.matchAll(osc7)) last = match[1];\n if (last !== undefined) onCwd(decodePath(last));\n const open = text.lastIndexOf('\\x1b]7;');\n pending = open >= 0 && !text.slice(open).match(/\\x07|\\x1b\\\\/) ? text.slice(open) : '';\n };\n}\n\nexport function kernelBackend(\n kernel: TerminalKernel,\n { argv = ['bash', '-i'], cwd, env, onCwd }: KernelBackendOptions = {}\n): TerminalBackend {\n return {\n async open(sink, { cols, rows }) {\n const watch = onCwd && cwdWatcher(onCwd);\n const onData = (bytes: Uint8Array) => {\n watch?.(bytes);\n sink.output(bytes);\n };\n const terminal = await kernel.openTerminal(argv, { cwd, env, cols, rows, onData });\n terminal.exited.then(\n (status) => sink.exit(status),\n (error) => {\n sink.output(encoder.encode(`\\r\\n${error instanceof Error ? error.message : error}\\r\\n`));\n sink.exit(1);\n }\n );\n return {\n write: (data) => terminal.write(data),\n resize: (c, r) => terminal.resize(c, r),\n signal: (name) => terminal.signal(name),\n close: () => terminal.close(),\n };\n },\n };\n}\n"],
5
+ "mappings": ";AA6BA,IAAM,UAAU,IAAI,YAAY;AAChC,IAAM,UAAU,IAAI,YAAY;AAChC,IAAM,OAAO;AAEN,IAAM,mBAAmB;AAEhC,SAAS,WAAW,MAAsB;AACxC,MAAI;AACF,WAAO,mBAAmB,IAAI;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,OAA2D;AACpF,MAAI,UAAU;AACd,SAAO,CAAC,UAAU;AAChB,UAAM,OAAO,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAC7D,QAAI;AACJ,eAAW,SAAS,KAAK,SAAS,IAAI,EAAG,QAAO,MAAM,CAAC;AACvD,QAAI,SAAS,OAAW,OAAM,WAAW,IAAI,CAAC;AAC9C,UAAM,OAAO,KAAK,YAAY,SAAS;AACvC,cAAU,QAAQ,KAAK,CAAC,KAAK,MAAM,IAAI,EAAE,MAAM,aAAa,IAAI,KAAK,MAAM,IAAI,IAAI;AAAA,EACrF;AACF;AAEO,SAAS,cACd,QACA,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG,KAAK,KAAK,MAAM,IAA0B,CAAC,GACnD;AACjB,SAAO;AAAA,IACL,MAAM,KAAK,MAAM,EAAE,MAAM,KAAK,GAAG;AAC/B,YAAM,QAAQ,SAAS,WAAW,KAAK;AACvC,YAAM,SAAS,CAAC,UAAsB;AACpC,gBAAQ,KAAK;AACb,aAAK,OAAO,KAAK;AAAA,MACnB;AACA,YAAM,WAAW,MAAM,OAAO,aAAa,MAAM,EAAE,KAAK,KAAK,MAAM,MAAM,OAAO,CAAC;AACjF,eAAS,OAAO;AAAA,QACd,CAAC,WAAW,KAAK,KAAK,MAAM;AAAA,QAC5B,CAAC,UAAU;AACT,eAAK,OAAO,QAAQ,OAAO;AAAA,EAAO,iBAAiB,QAAQ,MAAM,UAAU,KAAK;AAAA,CAAM,CAAC;AACvF,eAAK,KAAK,CAAC;AAAA,QACb;AAAA,MACF;AACA,aAAO;AAAA,QACL,OAAO,CAAC,SAAS,SAAS,MAAM,IAAI;AAAA,QACpC,QAAQ,CAAC,GAAG,MAAM,SAAS,OAAO,GAAG,CAAC;AAAA,QACtC,QAAQ,CAAC,SAAS,SAAS,OAAO,IAAI;AAAA,QACtC,OAAO,MAAM,SAAS,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -4354,13 +4354,15 @@ var FakeShell = class {
4354
4354
  #interrupted = false;
4355
4355
  #history = [];
4356
4356
  #commands;
4357
+ #onCwd;
4357
4358
  cwd;
4358
4359
  closed = false;
4359
- constructor(sink, files3, cwd, clock2) {
4360
+ constructor(sink, files3, cwd, clock2, onCwd) {
4360
4361
  this.#sink = sink;
4361
4362
  this.#files = files3;
4362
4363
  this.#clock = clock2;
4363
4364
  this.cwd = cwd;
4365
+ this.#onCwd = onCwd;
4364
4366
  this.#commands = {
4365
4367
  help: () => this.#print("Commands: cat cd clear date echo exit git help ls npm pwd whoami"),
4366
4368
  pwd: () => this.#print(this.cwd),
@@ -4396,8 +4398,10 @@ var FakeShell = class {
4396
4398
  }
4397
4399
  async #cd(target) {
4398
4400
  const path = resolve(this.cwd, target);
4399
- if (path === "/" || (await this.#entries()).get(path) === "directory") this.cwd = path;
4400
- else this.#print(`bash: cd: ${target}: No such file or directory`);
4401
+ if (path === "/" || (await this.#entries()).get(path) === "directory") {
4402
+ this.cwd = path;
4403
+ this.#onCwd?.(path);
4404
+ } else this.#print(`bash: cd: ${target}: No such file or directory`);
4401
4405
  }
4402
4406
  async #ls(target) {
4403
4407
  const path = resolve(this.cwd, target);
@@ -4526,8 +4530,8 @@ var FakeShell = class {
4526
4530
  this.closed = true;
4527
4531
  }
4528
4532
  };
4529
- function shellBackend(files3, cwd, clock2) {
4530
- return { open: (sink) => new FakeShell(sink, files3, cwd, clock2) };
4533
+ function shellBackend(files3, cwd, clock2, onCwd) {
4534
+ return { open: (sink) => new FakeShell(sink, files3, cwd, clock2, onCwd) };
4531
4535
  }
4532
4536
 
4533
4537
  // src/dummy/terminals.ts
@@ -4567,12 +4571,18 @@ var DummyTerminals = class extends Emitter {
4567
4571
  this.#backends.delete(id);
4568
4572
  this.emit("terminals", this.list());
4569
4573
  }
4574
+ #move(id, cwd) {
4575
+ const terminal = this.#terminals.find((candidate) => candidate.id === id);
4576
+ if (!terminal || terminal.cwd === cwd) return;
4577
+ terminal.cwd = cwd;
4578
+ this.emit("terminals", this.list());
4579
+ }
4570
4580
  backend(id) {
4571
4581
  const terminal = this.#terminals.find((candidate) => candidate.id === id);
4572
4582
  if (!terminal) throw new Error(`No terminal ${id}`);
4573
4583
  let backend = this.#backends.get(id);
4574
4584
  if (!backend) {
4575
- backend = shellBackend(this.#files, terminal.cwd, this.#clock);
4585
+ backend = shellBackend(this.#files, terminal.cwd, this.#clock, (cwd) => this.#move(id, cwd));
4576
4586
  this.#backends.set(id, backend);
4577
4587
  }
4578
4588
  return backend;