@lifo-sh/core 0.5.0 → 0.5.6
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/dist/args-BhoL0JcG.js +58 -0
- package/dist/awk-DahiO6Jl.js +170 -0
- package/dist/base64-Dj_AnQAH.js +92 -0
- package/dist/basename-D8sjWfzX.js +14 -0
- package/dist/bc-CCuJi0IY.js +230 -0
- package/dist/browser-B0dadKCA.js +43 -0
- package/dist/cal-DQsLvArw.js +85 -0
- package/dist/cat-KYGveROo.js +32 -0
- package/dist/chmod-gYZdg3Kv.js +81 -0
- package/dist/chown-DoPi7NLO.js +32 -0
- package/dist/commands/net/curl.d.ts +2 -2
- package/dist/commands/net/curl.d.ts.map +1 -1
- package/dist/commands/net/forward.d.ts +14 -0
- package/dist/commands/net/forward.d.ts.map +1 -0
- package/dist/commands/net/host.d.ts +14 -0
- package/dist/commands/net/host.d.ts.map +1 -0
- package/dist/commands/net/ifconfig.d.ts +8 -0
- package/dist/commands/net/ifconfig.d.ts.map +1 -0
- package/dist/commands/net/ip.d.ts +14 -0
- package/dist/commands/net/ip.d.ts.map +1 -0
- package/dist/commands/net/netstat.d.ts +8 -0
- package/dist/commands/net/netstat.d.ts.map +1 -0
- package/dist/commands/net/ports.d.ts +8 -0
- package/dist/commands/net/ports.d.ts.map +1 -0
- package/dist/commands/net/route.d.ts +8 -0
- package/dist/commands/net/route.d.ts.map +1 -0
- package/dist/commands/net/test-registry.d.ts +8 -0
- package/dist/commands/net/test-registry.d.ts.map +1 -0
- package/dist/commands/net/tunnel-v2.d.ts +4 -0
- package/dist/commands/net/tunnel-v2.d.ts.map +1 -0
- package/dist/commands/net/tunnel.d.ts +6 -0
- package/dist/commands/net/tunnel.d.ts.map +1 -0
- package/dist/commands/registry.d.ts +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/system/kill.d.ts +2 -2
- package/dist/commands/system/kill.d.ts.map +1 -1
- package/dist/commands/system/lifo.d.ts +19 -2
- package/dist/commands/system/lifo.d.ts.map +1 -1
- package/dist/commands/system/newtab.d.ts +8 -0
- package/dist/commands/system/newtab.d.ts.map +1 -0
- package/dist/commands/system/node.d.ts +3 -2
- package/dist/commands/system/node.d.ts.map +1 -1
- package/dist/commands/system/npm.d.ts +20 -7
- package/dist/commands/system/npm.d.ts.map +1 -1
- package/dist/commands/system/ps.d.ts +3 -2
- package/dist/commands/system/ps.d.ts.map +1 -1
- package/dist/commands/system/systemctl.d.ts +4 -0
- package/dist/commands/system/systemctl.d.ts.map +1 -0
- package/dist/commands/system/top.d.ts +2 -2
- package/dist/commands/system/top.d.ts.map +1 -1
- package/dist/commands/system/watch.d.ts.map +1 -1
- package/dist/commands/system/whoami.d.ts.map +1 -1
- package/dist/commands/types.d.ts +3 -2
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/cp-BP7-nkZi.js +29 -0
- package/dist/cut-Dg3Sxlw_.js +84 -0
- package/dist/date-DqL4oCg8.js +91 -0
- package/dist/df-CEHqyq91.js +47 -0
- package/dist/diff-aYLFp43G.js +250 -0
- package/dist/dig-0_V5UoWW.js +91 -0
- package/dist/dirname-ByojkmnI.js +14 -0
- package/dist/du-feoEC53Q.js +89 -0
- package/dist/env-CIcDulqw.js +10 -0
- package/dist/fastfetch-CRfsfb4t.js +378 -0
- package/dist/file-BHHCgjt9.js +79 -0
- package/dist/find-C-pGJyTZ.js +63 -0
- package/dist/free-DCkGta9v.js +33 -0
- package/dist/grep-Bv7fu1qw.js +179 -0
- package/dist/gunzip-BZk2000a.js +57 -0
- package/dist/gzip-D55LwDu8.js +70 -0
- package/dist/head-CQQ8pAha.js +66 -0
- package/dist/hostname-Ba0tnCzG.js +8 -0
- package/dist/index-GLjTMF7C.js +22717 -0
- package/dist/index.d.ts +44 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -72
- package/dist/less-C-8XcQ_A.js +294 -0
- package/dist/ln-CpXREm6e.js +15 -0
- package/dist/ls-Ce1mcASB.js +132 -0
- package/dist/{man-Dg26tZ-a.js → man-DjxHeM01.js} +46 -27
- package/dist/mime-B5knsVEw.js +101 -0
- package/dist/mkdir-CtDdaiaM.js +31 -0
- package/dist/mktemp-DwAY8Lz2.js +44 -0
- package/dist/mv-vS020rcy.js +29 -0
- package/dist/nano-DKfqXthq.js +445 -0
- package/dist/nl-DHh-MmKX.js +66 -0
- package/dist/ping-BQO3Z9CT.js +72 -0
- package/dist/pkg/PackageManager.d.ts +2 -2
- package/dist/pkg/PackageManager.d.ts.map +1 -1
- package/dist/pkg/lifo-dev.d.ts +6 -6
- package/dist/pkg/lifo-dev.d.ts.map +1 -1
- package/dist/pkg/lifo-runtime.d.ts +3 -3
- package/dist/pkg/lifo-runtime.d.ts.map +1 -1
- package/dist/pkg/loader.d.ts +2 -2
- package/dist/pkg/loader.d.ts.map +1 -1
- package/dist/printf-CdBVx2dT.js +81 -0
- package/dist/realpath-CZ_ja3FL.js +27 -0
- package/dist/rev-KZ9O5vNS.js +42 -0
- package/dist/rm-dW7YB25j.js +48 -0
- package/dist/rmdir-Db2wctQ6.js +42 -0
- package/dist/runtime/ContextSerialization.d.ts +7 -0
- package/dist/runtime/ContextSerialization.d.ts.map +1 -0
- package/dist/runtime/ProcessExecutor.d.ts +14 -0
- package/dist/runtime/ProcessExecutor.d.ts.map +1 -0
- package/dist/runtime/command-worker.d.ts +9 -0
- package/dist/runtime/command-worker.d.ts.map +1 -0
- package/dist/sandbox/Sandbox.d.ts +1 -2
- package/dist/sandbox/Sandbox.d.ts.map +1 -1
- package/dist/sandbox/SandboxFs.d.ts +2 -2
- package/dist/sandbox/SandboxFs.d.ts.map +1 -1
- package/dist/sandbox/types.d.ts +1 -2
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sed-BK_pjM2M.js +142 -0
- package/dist/seq-B0yurkx9.js +64 -0
- package/dist/sha256sum-BP0l9D35.js +85 -0
- package/dist/shell/ProcessRegistry.d.ts +152 -0
- package/dist/shell/ProcessRegistry.d.ts.map +1 -0
- package/dist/shell/ProcessRegistry.example.d.ts +8 -0
- package/dist/shell/ProcessRegistry.example.d.ts.map +1 -0
- package/dist/shell/ProcessRegistry.test.d.ts +2 -0
- package/dist/shell/ProcessRegistry.test.d.ts.map +1 -0
- package/dist/shell/Shell.d.ts +13 -4
- package/dist/shell/Shell.d.ts.map +1 -1
- package/dist/shell/completer.d.ts +2 -2
- package/dist/shell/completer.d.ts.map +1 -1
- package/dist/shell/expander.d.ts +2 -2
- package/dist/shell/expander.d.ts.map +1 -1
- package/dist/shell/history.d.ts +2 -2
- package/dist/shell/history.d.ts.map +1 -1
- package/dist/shell/interpreter.d.ts +8 -2
- package/dist/shell/interpreter.d.ts.map +1 -1
- package/dist/shell/test-builtin.d.ts +2 -2
- package/dist/shell/test-builtin.d.ts.map +1 -1
- package/dist/sl-BmMNz7ir.js +200 -0
- package/dist/sleep-C_3mjcFi.js +25 -0
- package/dist/sort-DYZuiMaO.js +87 -0
- package/dist/stat-CXSSmsrA.js +38 -0
- package/dist/strings-BwqQy-zL.js +63 -0
- package/dist/tac-CuZSbu_c.js +32 -0
- package/dist/tail-DH7xR0rW.js +62 -0
- package/dist/tar-AnR03GXP.js +155 -0
- package/dist/tee-ByHsMExU.js +29 -0
- package/dist/touch-CcmnMpg5.js +26 -0
- package/dist/tr-D_cg13q8.js +92 -0
- package/dist/tree-Ck1ymlSv.js +64 -0
- package/dist/uname-07bQ7DTD.js +50 -0
- package/dist/uniq-BHkwpex3.js +76 -0
- package/dist/unzip-DVjk3GA4.js +91 -0
- package/dist/uptime-ujk4Nb77.js +17 -0
- package/dist/utils/archive.d.ts +2 -2
- package/dist/utils/archive.d.ts.map +1 -1
- package/dist/utils/glob.d.ts +2 -2
- package/dist/utils/glob.d.ts.map +1 -1
- package/dist/wc-CK9Flybx.js +98 -0
- package/dist/wget-Cww1uNE2.js +84 -0
- package/dist/{which-D3u0cwyh.js → which-CJwCjtVK.js} +25 -14
- package/dist/whoami-EHyrQ1q-.js +25 -0
- package/dist/xargs-I1ZWqhOp.js +40 -0
- package/dist/yes-XolnW6bp.js +11 -0
- package/dist/zip-BTmRwUYQ.js +40 -0
- package/package.json +16 -10
- package/dist/args-CG6b9cZt.js +0 -43
- package/dist/awk-CC_Qo0hQ.js +0 -123
- package/dist/base64-BBckAmkE.js +0 -72
- package/dist/basename-BIICW06y.js +0 -12
- package/dist/bc-BYiKVTNg.js +0 -200
- package/dist/cal-DPULSAhj.js +0 -56
- package/dist/cat-Jv35D4BV.js +0 -29
- package/dist/chmod-Bh-u8XOr.js +0 -56
- package/dist/chown-Dv7xfl2a.js +0 -28
- package/dist/cp-CB-sGTRH.js +0 -19
- package/dist/cut-B79kgCm4.js +0 -65
- package/dist/date-C8NB8v8G.js +0 -86
- package/dist/df-CeZb4WOr.js +0 -34
- package/dist/diff-D5Ej-JEe.js +0 -150
- package/dist/dig-BEJ8Ky96.js +0 -69
- package/dist/dirname-w2Y6csox.js +0 -13
- package/dist/du-UupzdKc_.js +0 -77
- package/dist/env-DXzvDKsN.js +0 -9
- package/dist/fastfetch-aPM9Z3ym.js +0 -310
- package/dist/file-DOl4Wjtc.js +0 -70
- package/dist/find-C0T-P7sl.js +0 -36
- package/dist/free-DAxE4b2U.js +0 -23
- package/dist/grep-Blwrv9k5.js +0 -147
- package/dist/gunzip-R7EtgP15.js +0 -47
- package/dist/gzip-BxF7M1np.js +0 -57
- package/dist/head-CJwcsX18.js +0 -53
- package/dist/hostname-BxU2S3nT.js +0 -8
- package/dist/index-BjKSFBDg.js +0 -8640
- package/dist/kernel/index.d.ts +0 -26
- package/dist/kernel/index.d.ts.map +0 -1
- package/dist/kernel/persistence/PersistenceManager.d.ts +0 -12
- package/dist/kernel/persistence/PersistenceManager.d.ts.map +0 -1
- package/dist/kernel/persistence/backends.d.ts +0 -22
- package/dist/kernel/persistence/backends.d.ts.map +0 -1
- package/dist/kernel/persistence/index.d.ts +0 -6
- package/dist/kernel/persistence/index.d.ts.map +0 -1
- package/dist/kernel/persistence/serializer.d.ts +0 -21
- package/dist/kernel/persistence/serializer.d.ts.map +0 -1
- package/dist/kernel/samples.d.ts +0 -3
- package/dist/kernel/samples.d.ts.map +0 -1
- package/dist/kernel/storage/BlobStore.d.ts +0 -31
- package/dist/kernel/storage/BlobStore.d.ts.map +0 -1
- package/dist/kernel/storage/ContentStore.d.ts +0 -52
- package/dist/kernel/storage/ContentStore.d.ts.map +0 -1
- package/dist/kernel/storage/index.d.ts +0 -7
- package/dist/kernel/storage/index.d.ts.map +0 -1
- package/dist/kernel/vfs/VFS.d.ts +0 -64
- package/dist/kernel/vfs/VFS.d.ts.map +0 -1
- package/dist/kernel/vfs/index.d.ts +0 -7
- package/dist/kernel/vfs/index.d.ts.map +0 -1
- package/dist/kernel/vfs/providers/DevProvider.d.ts +0 -11
- package/dist/kernel/vfs/providers/DevProvider.d.ts.map +0 -1
- package/dist/kernel/vfs/providers/NativeFsProvider.d.ts +0 -63
- package/dist/kernel/vfs/providers/NativeFsProvider.d.ts.map +0 -1
- package/dist/kernel/vfs/providers/ProcProvider.d.ts +0 -14
- package/dist/kernel/vfs/providers/ProcProvider.d.ts.map +0 -1
- package/dist/kernel/vfs/types.d.ts +0 -70
- package/dist/kernel/vfs/types.d.ts.map +0 -1
- package/dist/less-B0gFLJ_7.js +0 -230
- package/dist/ln-Bf3f3jVA.js +0 -11
- package/dist/ls-YnhMRefh.js +0 -106
- package/dist/mkdir-DY1P3Jxj.js +0 -27
- package/dist/mktemp-BRzo2c8y.js +0 -31
- package/dist/mv-bH08L-F_.js +0 -19
- package/dist/nano-CueO2oS0.js +0 -304
- package/dist/nl-D26SSOD4.js +0 -51
- package/dist/node-compat/buffer.d.ts +0 -44
- package/dist/node-compat/buffer.d.ts.map +0 -1
- package/dist/node-compat/child_process.d.ts +0 -10
- package/dist/node-compat/child_process.d.ts.map +0 -1
- package/dist/node-compat/console.d.ts +0 -21
- package/dist/node-compat/console.d.ts.map +0 -1
- package/dist/node-compat/crypto.d.ts +0 -17
- package/dist/node-compat/crypto.d.ts.map +0 -1
- package/dist/node-compat/events.d.ts +0 -19
- package/dist/node-compat/events.d.ts.map +0 -1
- package/dist/node-compat/fs.d.ts +0 -175
- package/dist/node-compat/fs.d.ts.map +0 -1
- package/dist/node-compat/http.d.ts +0 -87
- package/dist/node-compat/http.d.ts.map +0 -1
- package/dist/node-compat/index.d.ts +0 -19
- package/dist/node-compat/index.d.ts.map +0 -1
- package/dist/node-compat/os.d.ts +0 -39
- package/dist/node-compat/os.d.ts.map +0 -1
- package/dist/node-compat/path.d.ts +0 -58
- package/dist/node-compat/path.d.ts.map +0 -1
- package/dist/node-compat/process.d.ts +0 -62
- package/dist/node-compat/process.d.ts.map +0 -1
- package/dist/node-compat/stream.d.ts +0 -36
- package/dist/node-compat/stream.d.ts.map +0 -1
- package/dist/node-compat/string_decoder.d.ts +0 -11
- package/dist/node-compat/string_decoder.d.ts.map +0 -1
- package/dist/node-compat/timers.d.ts +0 -16
- package/dist/node-compat/timers.d.ts.map +0 -1
- package/dist/node-compat/url.d.ts +0 -53
- package/dist/node-compat/url.d.ts.map +0 -1
- package/dist/node-compat/util.d.ts +0 -27
- package/dist/node-compat/util.d.ts.map +0 -1
- package/dist/node-compat/zlib.d.ts +0 -66
- package/dist/node-compat/zlib.d.ts.map +0 -1
- package/dist/ping-DtVEwwda.js +0 -50
- package/dist/printf-Cc2o7KZx.js +0 -70
- package/dist/realpath-BH29Lem_.js +0 -24
- package/dist/rev-ySwmRf_K.js +0 -39
- package/dist/rm-D7iWUUE2.js +0 -37
- package/dist/rmdir-BLtdNjt1.js +0 -35
- package/dist/sed-DwBPYYFb.js +0 -95
- package/dist/seq-B01YKIbO.js +0 -37
- package/dist/sha256sum-DED6ePiU.js +0 -64
- package/dist/sl-Dv4iPBN6.js +0 -138
- package/dist/sleep-B4C3fZiR.js +0 -19
- package/dist/sort-OXqZY83v.js +0 -64
- package/dist/stat-BvwNpE5B.js +0 -29
- package/dist/strings-BesRwUt_.js +0 -42
- package/dist/tac-D4BMSdj9.js +0 -31
- package/dist/tail-xVmLkzJK.js +0 -52
- package/dist/tar-BHRJ0-4j.js +0 -120
- package/dist/tee-DxygINEJ.js +0 -17
- package/dist/touch-DCb9Qn5q.js +0 -23
- package/dist/tr-DsCiwSIu.js +0 -60
- package/dist/tree-4QpgsnA0.js +0 -46
- package/dist/uname-BCn8HlJD.js +0 -37
- package/dist/uniq-xmgE0zRj.js +0 -54
- package/dist/unzip-CDKcoB0B.js +0 -81
- package/dist/uptime-CgBJegqU.js +0 -8
- package/dist/wc-B-jNRfLa.js +0 -69
- package/dist/wget-CO-45JoL.js +0 -53
- package/dist/whoami-Y18wqme3.js +0 -25
- package/dist/xargs-DfbCRFFd.js +0 -35
- package/dist/yes-DXEyHHD2.js +0 -10
- package/dist/zip-Cu1DzbAu.js +0 -33
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process information structure
|
|
3
|
+
* Mirrors Linux process model with PID, PPID, status, etc.
|
|
4
|
+
*/
|
|
5
|
+
export interface Process {
|
|
6
|
+
/** Process ID (unique identifier) */
|
|
7
|
+
pid: number;
|
|
8
|
+
/** Parent Process ID */
|
|
9
|
+
ppid: number;
|
|
10
|
+
/** Command name (argv[0]) */
|
|
11
|
+
command: string;
|
|
12
|
+
/** Full command line arguments */
|
|
13
|
+
args: string[];
|
|
14
|
+
/** Working directory when process started */
|
|
15
|
+
cwd: string;
|
|
16
|
+
/** Environment variables */
|
|
17
|
+
env: Record<string, string>;
|
|
18
|
+
/** Process start time (milliseconds since epoch) */
|
|
19
|
+
startTime: number;
|
|
20
|
+
/** Current process status */
|
|
21
|
+
status: 'running' | 'sleeping' | 'stopped' | 'zombie';
|
|
22
|
+
/** Whether this is a foreground process */
|
|
23
|
+
isForeground: boolean;
|
|
24
|
+
/** Promise that resolves when process completes */
|
|
25
|
+
promise: Promise<number>;
|
|
26
|
+
/** Controller for aborting/killing the process */
|
|
27
|
+
abortController: AbortController;
|
|
28
|
+
/** Exit code (null if still running) */
|
|
29
|
+
exitCode: number | null;
|
|
30
|
+
/** Optional job ID for background jobs (for backwards compat with JobTable) */
|
|
31
|
+
jobId?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Options for spawning a new process
|
|
35
|
+
*/
|
|
36
|
+
export interface SpawnOptions {
|
|
37
|
+
/** Command name */
|
|
38
|
+
command: string;
|
|
39
|
+
/** Command arguments (including command itself as args[0]) */
|
|
40
|
+
args: string[];
|
|
41
|
+
/** Working directory */
|
|
42
|
+
cwd: string;
|
|
43
|
+
/** Environment variables */
|
|
44
|
+
env: Record<string, string>;
|
|
45
|
+
/** Whether this is a foreground process */
|
|
46
|
+
isForeground: boolean;
|
|
47
|
+
/** Promise that resolves with exit code */
|
|
48
|
+
promise: Promise<number>;
|
|
49
|
+
/** Abort controller for killing the process */
|
|
50
|
+
abortController: AbortController;
|
|
51
|
+
/** Parent PID (defaults to 1 - shell) */
|
|
52
|
+
ppid?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Central process registry for tracking all running processes.
|
|
56
|
+
* Provides Linux-like process management with PIDs, status tracking,
|
|
57
|
+
* and process lifecycle management.
|
|
58
|
+
*/
|
|
59
|
+
export declare class ProcessRegistry {
|
|
60
|
+
private processes;
|
|
61
|
+
private nextPid;
|
|
62
|
+
private nextJobId;
|
|
63
|
+
/**
|
|
64
|
+
* Register the shell as a process.
|
|
65
|
+
* @deprecated Use spawn() directly instead. Each shell gets its own PID.
|
|
66
|
+
* Kept for backwards compatibility.
|
|
67
|
+
*/
|
|
68
|
+
registerShell(_cwd: string, _env: Record<string, string>): void;
|
|
69
|
+
/**
|
|
70
|
+
* Spawn a new process and register it in the process table.
|
|
71
|
+
* Returns the assigned PID.
|
|
72
|
+
*/
|
|
73
|
+
spawn(opts: SpawnOptions): number;
|
|
74
|
+
/**
|
|
75
|
+
* Get process information by PID.
|
|
76
|
+
*/
|
|
77
|
+
get(pid: number): Process | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Get process information by job ID.
|
|
80
|
+
*/
|
|
81
|
+
getByJobId(jobId: number): Process | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Check if a process exists.
|
|
84
|
+
*/
|
|
85
|
+
has(pid: number): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Get all PIDs in the system.
|
|
88
|
+
*/
|
|
89
|
+
getAllPIDs(): number[];
|
|
90
|
+
/**
|
|
91
|
+
* Get all processes.
|
|
92
|
+
*/
|
|
93
|
+
getAll(): Process[];
|
|
94
|
+
/**
|
|
95
|
+
* Get all running processes (excludes zombies and stopped).
|
|
96
|
+
*/
|
|
97
|
+
getRunning(): Process[];
|
|
98
|
+
/**
|
|
99
|
+
* Get all background jobs (non-foreground processes, excluding shell).
|
|
100
|
+
*/
|
|
101
|
+
getBackgroundJobs(): Process[];
|
|
102
|
+
/**
|
|
103
|
+
* Get all zombie processes (finished but not reaped).
|
|
104
|
+
*/
|
|
105
|
+
getZombies(): Process[];
|
|
106
|
+
/**
|
|
107
|
+
* Kill a process by sending abort signal.
|
|
108
|
+
* Returns true if process was killed, false if not found or is a shell process.
|
|
109
|
+
*/
|
|
110
|
+
kill(pid: number, signal?: string): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Reap a zombie process (remove from process table).
|
|
113
|
+
* This should be called after collecting exit code.
|
|
114
|
+
* Returns true if process was reaped, false if not found or not a zombie.
|
|
115
|
+
*/
|
|
116
|
+
reap(pid: number): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Collect and reap orphan zombie processes.
|
|
119
|
+
* Only reaps zombies whose parent is no longer alive (orphans reparented to init).
|
|
120
|
+
* Zombies whose parent is still running are left for the parent to reap via waitpid.
|
|
121
|
+
* Returns array of reaped processes for display/logging.
|
|
122
|
+
*/
|
|
123
|
+
collectZombies(): Process[];
|
|
124
|
+
/**
|
|
125
|
+
* Reap all zombie children of a given parent PID.
|
|
126
|
+
* Called when a parent exits without waitpid on its children.
|
|
127
|
+
* Running children are NOT killed — they stay alive (reparented to init in spirit).
|
|
128
|
+
*/
|
|
129
|
+
reapOrphansOf(ppid: number): void;
|
|
130
|
+
/**
|
|
131
|
+
* Update process status.
|
|
132
|
+
* Useful for manual status changes (e.g., sleeping, stopped).
|
|
133
|
+
*/
|
|
134
|
+
updateStatus(pid: number, status: Process['status']): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Get process uptime in milliseconds.
|
|
137
|
+
*/
|
|
138
|
+
getUptime(pid: number): number | null;
|
|
139
|
+
/**
|
|
140
|
+
* Get formatted process info (for ps command).
|
|
141
|
+
*/
|
|
142
|
+
getFormattedInfo(pid: number): string | null;
|
|
143
|
+
/**
|
|
144
|
+
* Get process count.
|
|
145
|
+
*/
|
|
146
|
+
count(): number;
|
|
147
|
+
/**
|
|
148
|
+
* Clear all processes except shell (useful for testing).
|
|
149
|
+
*/
|
|
150
|
+
reset(): void;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=ProcessRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessRegistry.d.ts","sourceRoot":"","sources":["../../src/shell/ProcessRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessRegistry.example.d.ts","sourceRoot":"","sources":["../../src/shell/ProcessRegistry.example.ts"],"names":[],"mappings":"AACA;;;;;GAKG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessRegistry.test.d.ts","sourceRoot":"","sources":["../../src/shell/ProcessRegistry.test.ts"],"names":[],"mappings":""}
|
package/dist/shell/Shell.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ITerminal } from '../terminal/ITerminal.js';
|
|
2
|
-
import {
|
|
2
|
+
import { IKernelVfs, Kernel } from '@lifo-sh/kernel';
|
|
3
3
|
import { CommandRegistry } from '../commands/registry.js';
|
|
4
4
|
import { JobTable } from './jobs.js';
|
|
5
|
+
import { ProcessRegistry } from './ProcessRegistry.js';
|
|
5
6
|
export interface ExecuteOptions {
|
|
6
7
|
cwd?: string;
|
|
7
8
|
env?: Record<string, string>;
|
|
@@ -11,6 +12,7 @@ export interface ExecuteOptions {
|
|
|
11
12
|
}
|
|
12
13
|
export declare class Shell {
|
|
13
14
|
private terminal;
|
|
15
|
+
private kernel;
|
|
14
16
|
private vfs;
|
|
15
17
|
private registry;
|
|
16
18
|
private cwd;
|
|
@@ -18,6 +20,7 @@ export declare class Shell {
|
|
|
18
20
|
private aliases;
|
|
19
21
|
private lineBuffer;
|
|
20
22
|
private cursorPos;
|
|
23
|
+
private screenCursorRow;
|
|
21
24
|
private history;
|
|
22
25
|
private historyIndex;
|
|
23
26
|
private savedLine;
|
|
@@ -30,20 +33,25 @@ export declare class Shell {
|
|
|
30
33
|
private interpreterConfig;
|
|
31
34
|
private historyManager;
|
|
32
35
|
private jobTable;
|
|
36
|
+
private processRegistry;
|
|
37
|
+
private processExecutor;
|
|
33
38
|
private builtins;
|
|
34
39
|
private tabCount;
|
|
35
|
-
|
|
40
|
+
private pasteQueue;
|
|
41
|
+
constructor(terminal: ITerminal, kernel: Kernel, registry: CommandRegistry, env: Record<string, string>);
|
|
36
42
|
private registerBuiltins;
|
|
37
43
|
getJobTable(): JobTable;
|
|
44
|
+
getProcessRegistry(): ProcessRegistry;
|
|
38
45
|
getCwd(): string;
|
|
39
46
|
setCwd(cwd: string): void;
|
|
40
47
|
getEnv(): Record<string, string>;
|
|
41
|
-
getVfs():
|
|
48
|
+
getVfs(): IKernelVfs;
|
|
42
49
|
getRegistry(): CommandRegistry;
|
|
43
50
|
/**
|
|
44
51
|
* Programmatic command execution with captured stdout/stderr.
|
|
45
52
|
* Used by Sandbox.commands.run() for headless mode.
|
|
46
53
|
*/
|
|
54
|
+
private _executeDepth;
|
|
47
55
|
execute(cmd: string, options?: ExecuteOptions): Promise<{
|
|
48
56
|
stdout: string;
|
|
49
57
|
stderr: string;
|
|
@@ -56,8 +64,9 @@ export declare class Shell {
|
|
|
56
64
|
private handleTab;
|
|
57
65
|
private handleStdinInput;
|
|
58
66
|
private applyCompletion;
|
|
59
|
-
private
|
|
67
|
+
private getPromptWidth;
|
|
60
68
|
private redrawLine;
|
|
69
|
+
private drainPasteQueue;
|
|
61
70
|
private moveCursorLeft;
|
|
62
71
|
private moveCursorRight;
|
|
63
72
|
private moveCursorHome;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shell.d.ts","sourceRoot":"","sources":["../../src/shell/Shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Shell.d.ts","sourceRoot":"","sources":["../../src/shell/Shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IKernelVfs } from '@lifo-sh/kernel';
|
|
2
2
|
import { CommandRegistry } from '../commands/registry.js';
|
|
3
3
|
export interface CompletionResult {
|
|
4
4
|
replacementStart: number;
|
|
@@ -11,7 +11,7 @@ export interface CompletionContext {
|
|
|
11
11
|
cursorPos: number;
|
|
12
12
|
cwd: string;
|
|
13
13
|
env: Record<string, string>;
|
|
14
|
-
vfs:
|
|
14
|
+
vfs: IKernelVfs;
|
|
15
15
|
registry: CommandRegistry;
|
|
16
16
|
builtinNames: string[];
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completer.d.ts","sourceRoot":"","sources":["../../src/shell/completer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"completer.d.ts","sourceRoot":"","sources":["../../src/shell/completer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,gBAAgB,CAoCjE"}
|
package/dist/shell/expander.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { WordPart } from './types.js';
|
|
2
|
-
import {
|
|
2
|
+
import { IKernelVfs } from '@lifo-sh/kernel';
|
|
3
3
|
export interface ExpandContext {
|
|
4
4
|
env: Record<string, string>;
|
|
5
5
|
lastExitCode: number;
|
|
6
6
|
cwd: string;
|
|
7
|
-
vfs:
|
|
7
|
+
vfs: IKernelVfs;
|
|
8
8
|
executeCapture?: (input: string) => Promise<string>;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expander.d.ts","sourceRoot":"","sources":["../../src/shell/expander.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"expander.d.ts","sourceRoot":"","sources":["../../src/shell/expander.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,UAAU,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgB5F;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvF"}
|
package/dist/shell/history.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IKernelVfs } from '@lifo-sh/kernel';
|
|
2
2
|
export declare class HistoryManager {
|
|
3
3
|
private entries;
|
|
4
4
|
private vfs;
|
|
5
|
-
constructor(vfs:
|
|
5
|
+
constructor(vfs: IKernelVfs);
|
|
6
6
|
load(): void;
|
|
7
7
|
save(): void;
|
|
8
8
|
add(line: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/shell/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/shell/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,GAAG,CAAa;gBAEZ,GAAG,EAAE,UAAU;IAI3B,IAAI,IAAI,IAAI;IASZ,IAAI,IAAI,IAAI;IAQZ,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmBvB;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA6CnC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItC,MAAM,IAAI,MAAM,EAAE;IAIlB,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ScriptNode } from './types.js';
|
|
2
|
-
import {
|
|
2
|
+
import { IKernel, IKernelVfs, IProcessExecutor as ProcessExecutor } from '@lifo-sh/kernel';
|
|
3
3
|
import { CommandRegistry } from '../commands/registry.js';
|
|
4
4
|
import { CommandOutputStream, CommandInputStream } from '../commands/types.js';
|
|
5
5
|
import { JobTable } from './jobs.js';
|
|
6
|
+
import { ProcessRegistry } from './ProcessRegistry.js';
|
|
6
7
|
import { TerminalStdin } from './terminal-stdin.js';
|
|
7
8
|
export declare class BreakSignal {
|
|
8
9
|
levels: number;
|
|
@@ -18,13 +19,16 @@ export declare class ReturnSignal {
|
|
|
18
19
|
}
|
|
19
20
|
export type BuiltinFn = (args: string[], stdout: CommandOutputStream, stderr: CommandOutputStream, stdin?: CommandInputStream) => Promise<number>;
|
|
20
21
|
export interface InterpreterConfig {
|
|
22
|
+
kernel: IKernel;
|
|
21
23
|
env: Record<string, string>;
|
|
22
24
|
getCwd: () => string;
|
|
23
25
|
setCwd: (cwd: string) => void;
|
|
24
|
-
vfs:
|
|
26
|
+
vfs: IKernelVfs;
|
|
25
27
|
registry: CommandRegistry;
|
|
26
28
|
builtins: Map<string, BuiltinFn>;
|
|
27
29
|
jobTable: JobTable;
|
|
30
|
+
processRegistry: ProcessRegistry;
|
|
31
|
+
processExecutor?: ProcessExecutor;
|
|
28
32
|
writeToTerminal: (text: string) => void;
|
|
29
33
|
aliases?: Map<string, string>;
|
|
30
34
|
/** Override default stdout for programmatic capture */
|
|
@@ -33,6 +37,8 @@ export interface InterpreterConfig {
|
|
|
33
37
|
defaultStderr?: CommandOutputStream;
|
|
34
38
|
/** Returns the current abort signal for foreground commands */
|
|
35
39
|
getAbortSignal?: () => AbortSignal;
|
|
40
|
+
/** Internal flag: true when executing background job (don't register individual commands) */
|
|
41
|
+
isBackgroundContext?: boolean;
|
|
36
42
|
}
|
|
37
43
|
export declare class Interpreter {
|
|
38
44
|
private config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../src/shell/interpreter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAYX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../src/shell/interpreter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IKernelVfs } from '@lifo-sh/kernel';
|
|
2
2
|
import { CommandOutputStream } from '../commands/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Implementation of the `test` / `[` shell builtin.
|
|
5
5
|
* Evaluates conditional expressions.
|
|
6
6
|
*/
|
|
7
|
-
export declare function evaluateTest(args: string[], vfs:
|
|
7
|
+
export declare function evaluateTest(args: string[], vfs: IKernelVfs, stderr: CommandOutputStream): number;
|
|
8
8
|
//# sourceMappingURL=test-builtin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-builtin.d.ts","sourceRoot":"","sources":["../../src/shell/test-builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"test-builtin.d.ts","sourceRoot":"","sources":["../../src/shell/test-builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAqBR"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
const CSI = "\x1B[";
|
|
2
|
+
const HIDE_CURSOR = `${CSI}?25l`;
|
|
3
|
+
const SHOW_CURSOR = `${CSI}?25h`;
|
|
4
|
+
const ALT_SCREEN_ON = `${CSI}?1049h`;
|
|
5
|
+
const ALT_SCREEN_OFF = `${CSI}?1049l`;
|
|
6
|
+
const CLEAR = `${CSI}2J`;
|
|
7
|
+
const HOME = `${CSI}H`;
|
|
8
|
+
function moveTo(row, col) {
|
|
9
|
+
return `${CSI}${row + 1};${col + 1}H`;
|
|
10
|
+
}
|
|
11
|
+
const D51BODY = [
|
|
12
|
+
" ==== ________ ___________ ",
|
|
13
|
+
" _D _| |_______/ \\__I_I_____===__|_________|",
|
|
14
|
+
" |(_)--- | H\\________/ | | =|___ ___| ",
|
|
15
|
+
" / | | H | | | | ||_| |_|| ",
|
|
16
|
+
" | | | H |__--------------------| [___] | ",
|
|
17
|
+
" | ________|___H__/__|_____/[][]~\\_______| | ",
|
|
18
|
+
" |/ | |-----------I_____I [][] [] D |=======|__"
|
|
19
|
+
];
|
|
20
|
+
const D51WHEELS = [
|
|
21
|
+
[
|
|
22
|
+
"__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__",
|
|
23
|
+
" |/-=|___|= || || || |_____/~\\___/ ",
|
|
24
|
+
" \\_/ \\O=====O=====O=====O_/ \\_/ "
|
|
25
|
+
],
|
|
26
|
+
[
|
|
27
|
+
"__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__",
|
|
28
|
+
" |/-=|___|=O=====O=====O=====O |_____/~\\___/ ",
|
|
29
|
+
" \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "
|
|
30
|
+
],
|
|
31
|
+
[
|
|
32
|
+
"__/ =| o |=-O=====O=====O=====O \\ ____Y___________|__",
|
|
33
|
+
" |/-=|___|= || || || |_____/~\\___/ ",
|
|
34
|
+
" \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
"__/ =| o |=-~O=====O=====O=====O\\ ____Y___________|__",
|
|
38
|
+
" |/-=|___|= || || || |_____/~\\___/ ",
|
|
39
|
+
" \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
"__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__",
|
|
43
|
+
" |/-=|___|= O=====O=====O=====O|_____/~\\___/ ",
|
|
44
|
+
" \\_/ \\__/ \\__/ \\__/ \\__/ \\_/ "
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
"__/ =| o |=-~~\\ /~~\\ /~~\\ /~~\\ ____Y___________|__",
|
|
48
|
+
" |/-=|___|= || || || |_____/~\\___/ ",
|
|
49
|
+
" \\_/ \\_O=====O=====O=====O/ \\_/ "
|
|
50
|
+
]
|
|
51
|
+
];
|
|
52
|
+
const COAL = [
|
|
53
|
+
" ",
|
|
54
|
+
" ",
|
|
55
|
+
" _________________ ",
|
|
56
|
+
" _| \\_____A ",
|
|
57
|
+
" =| | ",
|
|
58
|
+
" -| | ",
|
|
59
|
+
"__|________________________|_ ",
|
|
60
|
+
"|__________________________|_ ",
|
|
61
|
+
" |_D__D__D_| |_D__D__D_| ",
|
|
62
|
+
" \\_/ \\_/ \\_/ \\_/ "
|
|
63
|
+
];
|
|
64
|
+
const D51HEIGHT = 10;
|
|
65
|
+
const D51FUNNEL = 7;
|
|
66
|
+
const D51LENGTH = 53;
|
|
67
|
+
const COAL_LENGTH = 30;
|
|
68
|
+
const PATTERNS = 6;
|
|
69
|
+
const SMOKEPTNS = 8;
|
|
70
|
+
const smokeA = [
|
|
71
|
+
"( )",
|
|
72
|
+
"( )",
|
|
73
|
+
"( )",
|
|
74
|
+
"( )",
|
|
75
|
+
"( )",
|
|
76
|
+
"()",
|
|
77
|
+
"O",
|
|
78
|
+
" "
|
|
79
|
+
];
|
|
80
|
+
const smokeB = [
|
|
81
|
+
"(@@@)",
|
|
82
|
+
"(@@@@)",
|
|
83
|
+
"(@@@)",
|
|
84
|
+
"(@@)",
|
|
85
|
+
"(@)",
|
|
86
|
+
"@@",
|
|
87
|
+
"@",
|
|
88
|
+
" "
|
|
89
|
+
];
|
|
90
|
+
const dy = [2, 1, 1, 1, 0, 0, 0, 0];
|
|
91
|
+
const dx = [-2, -1, 0, 1, 1, 2, 2, 3];
|
|
92
|
+
function sleep(ms) {
|
|
93
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
94
|
+
}
|
|
95
|
+
const command = async (ctx) => {
|
|
96
|
+
const cols = parseInt(ctx.env["COLUMNS"] || "80", 10);
|
|
97
|
+
const rows = parseInt(ctx.env["LINES"] || "24", 10);
|
|
98
|
+
const midRow = Math.max(0, Math.floor((rows - D51HEIGHT) / 2));
|
|
99
|
+
const smoke = [];
|
|
100
|
+
let smokeCounter = 0;
|
|
101
|
+
ctx.stdout.write(ALT_SCREEN_ON + CLEAR + HOME + HIDE_CURSOR);
|
|
102
|
+
const trainWidth = D51LENGTH + 1 + COAL_LENGTH;
|
|
103
|
+
function eraseSmoke(f, py, px, plen) {
|
|
104
|
+
const col = px - Math.floor(plen / 2);
|
|
105
|
+
const startCol = Math.max(0, col);
|
|
106
|
+
const clearLen = Math.min(plen + 1, cols - startCol);
|
|
107
|
+
if (py >= 0 && py < rows && startCol < cols && clearLen > 0) {
|
|
108
|
+
f += moveTo(py, startCol) + " ".repeat(clearLen);
|
|
109
|
+
}
|
|
110
|
+
return f;
|
|
111
|
+
}
|
|
112
|
+
for (let x = cols - 1; ; x--) {
|
|
113
|
+
if (ctx.signal.aborted) break;
|
|
114
|
+
if (x < -trainWidth && smoke.length === 0) break;
|
|
115
|
+
const wheelFrame = ((cols - x) % PATTERNS + PATTERNS) % PATTERNS;
|
|
116
|
+
const body = [...D51BODY, ...D51WHEELS[wheelFrame]];
|
|
117
|
+
const full = [];
|
|
118
|
+
for (let i = 0; i < D51HEIGHT; i++) {
|
|
119
|
+
const bodyLine = i < body.length ? body[i] : "";
|
|
120
|
+
const coalLine = i < COAL.length ? COAL[i] : "";
|
|
121
|
+
full.push(bodyLine + (coalLine.length > 0 ? " " + coalLine : ""));
|
|
122
|
+
}
|
|
123
|
+
let frame = "";
|
|
124
|
+
for (let i = 0; i < D51HEIGHT; i++) {
|
|
125
|
+
const row = midRow + i;
|
|
126
|
+
if (row < 0 || row >= rows) continue;
|
|
127
|
+
const line = full[i];
|
|
128
|
+
let visibleStart = 0;
|
|
129
|
+
let visibleEnd = line.length;
|
|
130
|
+
let screenCol = x;
|
|
131
|
+
if (x < 0) {
|
|
132
|
+
visibleStart = -x;
|
|
133
|
+
screenCol = 0;
|
|
134
|
+
}
|
|
135
|
+
if (x + visibleEnd > cols) {
|
|
136
|
+
visibleEnd = cols - x;
|
|
137
|
+
}
|
|
138
|
+
if (visibleStart >= visibleEnd) continue;
|
|
139
|
+
const slice = line.substring(visibleStart, visibleEnd);
|
|
140
|
+
frame += moveTo(row, screenCol) + slice;
|
|
141
|
+
}
|
|
142
|
+
const trailCol = x + trainWidth + 1;
|
|
143
|
+
if (trailCol >= 0 && trailCol < cols) {
|
|
144
|
+
for (let i = 0; i < D51HEIGHT; i++) {
|
|
145
|
+
const row = midRow + i;
|
|
146
|
+
if (row >= 0 && row < rows) {
|
|
147
|
+
frame += moveTo(row, trailCol) + " ";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (x % 4 === 0 && x + D51FUNNEL >= 0 && x + D51FUNNEL < cols) {
|
|
152
|
+
const sy = midRow - 1;
|
|
153
|
+
const sx = x + D51FUNNEL;
|
|
154
|
+
smoke.push({
|
|
155
|
+
y: sy,
|
|
156
|
+
x: sx,
|
|
157
|
+
prevY: sy,
|
|
158
|
+
prevX: sx,
|
|
159
|
+
prevLen: 0,
|
|
160
|
+
age: 0,
|
|
161
|
+
kind: smokeCounter % 2
|
|
162
|
+
});
|
|
163
|
+
smokeCounter++;
|
|
164
|
+
}
|
|
165
|
+
for (const p of smoke) {
|
|
166
|
+
if (p.prevLen > 0) {
|
|
167
|
+
frame = eraseSmoke(frame, p.prevY, p.prevX, p.prevLen);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
for (const p of smoke) {
|
|
171
|
+
if (p.age < SMOKEPTNS) {
|
|
172
|
+
const pattern = p.kind === 0 ? smokeA[p.age] : smokeB[p.age];
|
|
173
|
+
const px = p.x - Math.floor(pattern.length / 2);
|
|
174
|
+
if (p.y >= 0 && p.y < rows && px >= 0 && px + pattern.length <= cols) {
|
|
175
|
+
frame += moveTo(p.y, px) + pattern;
|
|
176
|
+
}
|
|
177
|
+
p.prevY = p.y;
|
|
178
|
+
p.prevX = p.x;
|
|
179
|
+
p.prevLen = pattern.length;
|
|
180
|
+
p.y -= dy[p.age];
|
|
181
|
+
p.x += dx[p.age];
|
|
182
|
+
p.age++;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
for (let si = smoke.length - 1; si >= 0; si--) {
|
|
186
|
+
if (smoke[si].age >= SMOKEPTNS) {
|
|
187
|
+
const p = smoke[si];
|
|
188
|
+
frame = eraseSmoke(frame, p.prevY, p.prevX, p.prevLen);
|
|
189
|
+
smoke.splice(si, 1);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
ctx.stdout.write(frame);
|
|
193
|
+
await sleep(40);
|
|
194
|
+
}
|
|
195
|
+
ctx.stdout.write(SHOW_CURSOR + ALT_SCREEN_OFF);
|
|
196
|
+
return 0;
|
|
197
|
+
};
|
|
198
|
+
export {
|
|
199
|
+
command as default
|
|
200
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const command = async (ctx) => {
|
|
2
|
+
if (ctx.args.length === 0) {
|
|
3
|
+
ctx.stderr.write("sleep: missing operand\n");
|
|
4
|
+
return 1;
|
|
5
|
+
}
|
|
6
|
+
const seconds = parseFloat(ctx.args[0]);
|
|
7
|
+
if (isNaN(seconds) || seconds < 0) {
|
|
8
|
+
ctx.stderr.write(`sleep: invalid time interval '${ctx.args[0]}'
|
|
9
|
+
`);
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
const ms = Math.round(seconds * 1e3);
|
|
13
|
+
await new Promise((resolve) => {
|
|
14
|
+
const timer = setTimeout(resolve, ms);
|
|
15
|
+
const onAbort = () => {
|
|
16
|
+
clearTimeout(timer);
|
|
17
|
+
resolve();
|
|
18
|
+
};
|
|
19
|
+
ctx.signal.addEventListener("abort", onAbort, { once: true });
|
|
20
|
+
});
|
|
21
|
+
return ctx.signal.aborted ? 130 : 0;
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
command as default
|
|
25
|
+
};
|