@ecmaos/kernel 0.2.5 → 0.2.7

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 CHANGED
@@ -59,107 +59,151 @@ The goal is to create a kernel and supporting apps that tie together modern web
59
59
  - `Metal`: An API server for allowing connections to physical systems from ecmaOS using [Hono](https://hono.dev)
60
60
  - `SWAPI`: An API server running completely inside a service worker using [Hono](https://hono.dev)
61
61
 
62
- ## Basic Overview
63
-
64
- - `Apps`
65
- - These are full applications that are developed specifically to work with ecmaOS
66
- - Refer to the full list of [official published apps on npm](https://www.npmjs.com/org/ecmaos-apps)
67
- - See the [./APPS.md](./APPS.md) file for a list of community apps; submit a PR to add your app!
68
- - An app is an npm package, in which the bin file has a shebang line of `#!ecmaos:bin:app:myappname`
69
- - Its default export (or exported `main` function) will be called with the `ProcessEntryParams` object
70
- - They can be installed from the terminal using the `install` command, e.g. `# install @ecmaos-apps/code`
71
- - Run the installed app (bins are linked to `/usr/bin`): `# code /root/hello.js`
72
- - During development, it can be useful to run a [Verdaccio](https://github.com/verdaccio/verdaccio) server to test local packages
73
- - To publish to Verdaccio, run `# npm publish --registry http://localhost:4873` in your app's development environment
74
- - Then to install from your local registry, run `# install @myscope/mypackage --registry http://localhost:4873`
75
-
76
- - `BIOS`
77
- - The BIOS is a C++ module compiled to WebAssembly with [Emscripten](https://emscripten.org) providing performance-critical functionality
78
- - The BIOS has its own filesystem, located at `/bios` — this allows data to be copied in and out of the BIOS for custom code and utilities
79
- - The main idea is that data and custom code can be loaded into it from the OS for WASM-native performance, as well as providing various utilities
80
- - Confusingly, the Kernel loads the BIOS — not the other way around
81
-
82
- - `Core`
83
- - Core modules provide the system's essential functionality; this includes the kernel itself
84
- - Other core modules include BIOS, Jaffa, Metal, SWAPI, as well as the main `@ecmaos/types` package
85
-
86
- - `Commands`
87
- - Commands are small utilities that aren't quite full Apps, provided by the shell
88
- - Some builtin commands that exist now will be moved into separate apps over time
89
-
90
- - `Devices`
91
- - Refer to the full list of [official devices on npm](https://www.npmjs.com/org/ecmaos-devices)
92
- - See the [./DEVICES.md](./DEVICES.md) file for a list of community devices; submit a PR to add your device!
93
- - Devices get loaded on boot, e.g. `/dev/bluetooth`, `/dev/random`, `/dev/battery`, etc.
94
- - A device can support being "run" by a user, e.g. `# /dev/battery status`
95
- - Devices may also be directly read/written using `fs` methods, and will behave accordingly (or have no effect if not supported)
96
- - An individual device module can provide multiple device drivers, e.g. `/dev/usb` provides `/dev/usb-mydevice-0001-0002`
97
-
98
- - `Generators`
99
- - Generators are used to scaffold new apps, devices, modules, etc.
100
- - They are located in the `turbo/generators` directory of the repository
101
- - They are used by the `turbo gen` command, e.g. `turbo gen app`, `turbo gen device`, `turbo gen module`, etc.
102
-
103
- - `Jaffa`
104
- - Jaffa is a [Tauri](https://tauri.app) wrapper for the ecmaOS kernel
105
- - It's used to tie the kernel into a desktop or mobile environment, allowing for native functionality
106
-
107
- - `Kernel`
108
- - The kernel ties together the various components of the system into a cohesive whole
109
- - Authentication (WebAuthn)
110
- - Components (Web Components/Custom Elements)
111
- - Devices
112
- - DOM
113
- - Events (CustomEvents)
114
- - Filesystem (ZenFS)
115
- - Internationalization (i18next)
116
- - Interval Manager (setInterval)
117
- - Log Manager (tslog)
118
- - Memory Manager (Abstractions)
119
- - Process Manager
120
- - Protocol Handlers (web+ecmaos://...)
121
- - Service Worker Manager
122
- - Shell
123
- - Storage (IndexedDB, localStorage, sessionStorage, etc.)
124
- - Terminal (xterm.js)
125
- - User Manager
126
- - WASM Loader
127
- - Window Manager (WinBox)
128
- - Workers (Web Workers)
129
-
130
- - `Metal`
131
- - Metal is an API server for allowing connections to physical systems from ecmaOS using [Hono](https://hono.dev)
132
- - Authenticated and encrypted connections with JWK/JWE/JOSE
133
-
134
- - `Modules`
135
- - Refer to the full list of [official modules on npm](https://www.npmjs.com/org/ecmaos-modules)
136
- - See the [./MODULES.md](./MODULES.md) file for a list of community modules; submit a PR to add your module!
137
- - Modules are dynamically loaded into the kernel at boot and can be enabled or disabled
138
- - They are specified during build via the `VITE_KERNEL_MODULES` environment variable
139
- - e.g. `VITE_KERNEL_MODULES=@ecmaos-modules/boilerplate@0.1.2,@your/package@1.2.3`
140
- - Versions must be exact and are mandatory - you cannot use NPM version specifiers
141
- - They can provide additional functionality, devices, commands, etc.
142
- - They offer a [common interface](./core/types/modules.ts) for interacting with the kernel
143
- - Generally they should be written in [AssemblyScript](https://www.assemblyscript.org), but this isn't required
144
-
145
- - `Packages`
146
- - Packages are [NPM packages](https://www.npmjs.com) that are installed into the ecmaOS environment
147
- - They can be installed from the terminal using the `install` command, e.g. `# install jquery`
148
- - NPM version specifiers are supported, e.g.:
149
- - `# install jquery@3.7.1`
150
- - `# install jquery@^3.7.1`
151
- - `# install jquery@latest`
152
- - [JSR](https://jsr.io) may be used with the [NPM compatibility layer](https://jsr.io/docs/npm-compatibility):
153
- - `# install @jsr/defaude__hello-jsr --registry https://npm.jsr.io`
154
-
155
- - `SWAPI`
156
- - The SWAPI is an API server running completely inside a service worker using [Hono](https://hono.dev)
157
- - It allows for various operations including the `fs` route to fetch files via URL
158
- - e.g., `# fetch /swapi/fs/home/user/hello.txt`
159
- - e.g., `# fetch /swapi/fake/person/fullName`
160
-
161
- - `Utils`
162
- - Utilities and configuration used during development
62
+ ## Basic Concepts
63
+
64
+ ### Apps
65
+
66
+ > [/apps](/apps)
67
+
68
+ - These are full applications that are developed specifically to work with ecmaOS
69
+ - Refer to the full list of [official published apps on npm](https://www.npmjs.com/org/ecmaos-apps)
70
+ - See the [APPS.md](/APPS.md) file for a list of community apps; submit a PR to add your app!
71
+ - An app is an npm package, in which the bin file has a shebang line of `#!ecmaos:bin:app:myappname`
72
+ - Its default export (or exported `main` function) will be called with the `ProcessEntryParams` object
73
+ - They can be installed from the terminal using the `install` command, e.g. `# install @ecmaos-apps/code`
74
+ - Run the installed app (bins are linked to `/usr/bin`): `# code /root/hello.js`
75
+ - During development, it can be useful to run a [Verdaccio](https://github.com/verdaccio/verdaccio) server to test local packages
76
+ - To publish to Verdaccio, run `# npm publish --registry http://localhost:4873` in your app's development environment
77
+ - Then to install from your local registry, run `# install @myscope/mypackage --registry http://localhost:4873`
78
+
79
+ ### BIOS
80
+
81
+ > [/core/bios](/core/bios)
82
+
83
+ - The BIOS is a C++ module compiled to WebAssembly with [Emscripten](https://emscripten.org) providing performance-critical functionality
84
+ - The BIOS has its own filesystem, located at `/bios` this allows data to be copied in and out of the BIOS for custom code and utilities
85
+ - The main idea is that data and custom code can be loaded into it from the OS for WASM-native performance, as well as providing various utilities
86
+ - Confusingly, the Kernel loads the BIOS — not the other way around
87
+
88
+ ### Commands
89
+
90
+ > [/core/kernel/src/tree/lib/commands](/core/kernel/src/tree/lib/commands)
91
+
92
+ - Commands are small utilities that aren't quite full Apps, provided by the shell
93
+ - Some builtin commands that exist now will be moved into separate apps over time
94
+
95
+ ### Devices
96
+
97
+ > [/devices](/devices)
98
+
99
+ - Refer to the full list of [official devices on npm](https://www.npmjs.com/org/ecmaos-devices)
100
+ - See the [DEVICES.md](/DEVICES.md) file for a list of community devices; submit a PR to add your device!
101
+ - Devices get loaded on boot, e.g. `/dev/bluetooth`, `/dev/random`, `/dev/battery`, etc.
102
+ - A device can support being "run" by a user, e.g. `# /dev/battery status`
103
+ - Devices may also be directly read/written using `fs` methods, and will behave accordingly (or have no effect if not supported)
104
+ - An individual device module can provide multiple device drivers, e.g. `/dev/usb` provides `/dev/usb-mydevice-0001-0002`
105
+
106
+ ### Generators
107
+
108
+ > [/turbo/generators](/turbo/generators)
109
+
110
+ - Generators are used to scaffold new apps, devices, modules, etc.
111
+ - They are located in the `turbo/generators` directory of the repository
112
+ - They are used by the `turbo gen` command, e.g. `turbo gen app`, `turbo gen device`, `turbo gen module`, etc.
113
+
114
+ ### Jaffa
115
+
116
+ > [/core/jaffa](/core/jaffa)
117
+
118
+ - Jaffa is a [Tauri](https://tauri.app) wrapper for the ecmaOS kernel
119
+ - It's used to tie the kernel into a desktop or mobile environment, allowing for native functionality
120
+
121
+ ### Kernel
122
+
123
+ > [/core/kernel](/core/kernel)
124
+
125
+ - The kernel ties together the various components of the system into a cohesive whole
126
+ - Authentication (WebAuthn)
127
+ - Components (Web Components/Custom Elements)
128
+ - Devices
129
+ - DOM
130
+ - Events (CustomEvents)
131
+ - Filesystem (ZenFS)
132
+ - Internationalization (i18next)
133
+ - Interval Manager (setInterval)
134
+ - Log Manager (tslog)
135
+ - Memory Manager (Abstractions)
136
+ - Process Manager
137
+ - Protocol Handlers (web+ecmaos://...)
138
+ - Service Worker Manager
139
+ - Shell
140
+ - Storage (IndexedDB, localStorage, sessionStorage, etc.)
141
+ - Terminal (xterm.js)
142
+ - User Manager
143
+ - WASM Loader
144
+ - Window Manager (WinBox)
145
+ - Workers (Web Workers)
146
+
147
+ ### Metal
148
+
149
+ > [/core/metal](/core/metal)
150
+
151
+ - Metal is an API server for allowing connections to physical systems from ecmaOS using [Hono](https://hono.dev)
152
+ - Authenticated and encrypted connections with JWK/JWE/JOSE
153
+
154
+ ### Modules
155
+
156
+ > [/modules](/modules)
157
+
158
+ - Refer to the full list of [official modules on npm](https://www.npmjs.com/org/ecmaos-modules)
159
+ - See the [MODULES.md](/MODULES.md) file for a list of community modules; submit a PR to add your module!
160
+ - Modules are dynamically loaded into the kernel at boot and can be enabled or disabled
161
+ - They are specified during build via the `VITE_KERNEL_MODULES` environment variable
162
+ - e.g. `VITE_KERNEL_MODULES=@ecmaos-modules/boilerplate@0.1.0,@your/package@1.2.3`
163
+ - Versions must be pinned and are mandatory - you cannot use NPM version specifiers
164
+ - They can provide additional functionality, devices, commands, etc.
165
+ - They offer a [common interface](./core/types/modules.ts) for interacting with the kernel
166
+ - Generally they should be written in [AssemblyScript](https://www.assemblyscript.org), but this isn't required
167
+
168
+ ### Packages
169
+
170
+ - Packages are [NPM packages](https://www.npmjs.com) that are installed into the ecmaOS environment
171
+ - They can be installed from the terminal using the `install` command, e.g. `# install jquery`
172
+ - NPM version specifiers are supported, e.g.:
173
+ - `# install jquery@3.7.1`
174
+ - `# install jquery@^3.7.1`
175
+ - `# install jquery@latest`
176
+ - [JSR](https://jsr.io) may be used with the [NPM compatibility layer](https://jsr.io/docs/npm-compatibility):
177
+ - `# install @jsr/defaude__hello-jsr --registry https://npm.jsr.io`
178
+
179
+ ### SWAPI
180
+
181
+ > [/core/swapi](/core/swapi)
182
+
183
+ - The SWAPI is an API server running completely inside a service worker using [Hono](https://hono.dev)
184
+ - It allows for various operations including the `fs` route to fetch files via URL
185
+ - e.g., `# fetch /swapi/fs/home/user/hello.txt`
186
+ - e.g., `# fetch /swapi/fake/person/fullName`
187
+
188
+ ### Utils
189
+
190
+ > [/utils](/utils)
191
+
192
+ - Utilities and configuration used during development
193
+
194
+ ## Important Files and Directories
195
+
196
+ - `/bin/`: Built-in commands
197
+ - `/bios/`: The BIOS filesystem
198
+ - `/boot/init`: A script that runs on boot
199
+ - `/dev/`: All devices are here
200
+ - `/etc/packages`: A list of installed packages to load on boot
201
+ - `/home/`: Contains user home directories
202
+ - `/proc/`: A directory containing various dynamic system information
203
+ - `/root/`: The home directory for the root user
204
+ - `/usr/bin/`: Executable packages get linked here
205
+ - `/usr/lib/`: All installed packages are here
206
+ - `/var/log/kernel.log`: The kernel log
163
207
 
164
208
  ## Command Examples
165
209
 
@@ -243,6 +287,15 @@ The `apps` directory in the repository contains a number of examples of how to d
243
287
 
244
288
  Basically, your app's [bin](https://docs.npmjs.com/cli/v10/configuring-npm/package-json#bin) file has a `main` (or default) function export that is passed the kernel reference and can use it to interact with the system as needed. A shebang line of `#!ecmaos:bin:app:myappname` is required at the top of the bin file to identify it as an app.
245
289
 
290
+ ## Kernel Interface Example
291
+
292
+ ```ts
293
+ export default async function main({ kernel }: ProcessEntryParams) {
294
+ kernel.log.info("Hello, world!");
295
+ kernel.terminal.writeln("Hello, world!");
296
+ }
297
+ ```
298
+
246
299
  ## Early Days
247
300
 
248
301
  The kernel is currently in active development. It is not considered stable and the structure and API are very likely to change in unexpected and possibly unannounced ways until version 1.0.0. Use cautiously and at your own risk.
@@ -252,8 +305,9 @@ Things to keep in mind:
252
305
  - Things have changed a lot since the tests were written, so they need to be updated and fixed
253
306
  - The kernel is designed to be run in an environment with a DOM (i.e. a browser)
254
307
  - Many features are only available on Chromium-based browsers, and many more behind feature flags
308
+ - There will be a lot of technical challenges to overcome, and many things will first be implemented in a non-optimal way
255
309
  - Command interfaces won't match what you might be used to from a traditional Linux environment; not all commands and options are supported. Over time, Linuxish commands will be fleshed out and made to behave in a more familiar way.
256
- - Globbing doesn't work in the terminal yet
310
+ - Globbing doesn't work in the terminal yet, [but is supported at the filesystem level](https://zenfs.dev/core/functions/fs.promises.glob.html)
257
311
 
258
312
  ## Development
259
313
 
@@ -269,9 +323,9 @@ git clone https://github.com/ecmaos/ecmaos.git
269
323
  cd ecmaos && pnpm install
270
324
 
271
325
  # Run the dev server
272
- pnpm run dev
326
+ pnpm run dev:kernel
273
327
 
274
- # Run the docs server
328
+ # Run the docs server (optional)
275
329
  pnpm run dev:docs
276
330
 
277
331
  # Build
@@ -285,10 +339,12 @@ pnpm run test:bench
285
339
  pnpm run test:ui
286
340
 
287
341
  # Generate modules
342
+ turbo gen app # generate a new app template
288
343
  turbo gen device # generate a new device template
344
+ turbo gen module # generate a new module template
289
345
  ```
290
346
 
291
- Also see [turbo.json](./turbo.json) and [CONTRIBUTING.md](./CONTRIBUTING.md) for more information.
347
+ Also see [turbo.json](./turbo.json) and [CONTRIBUTING.md](/CONTRIBUTING.md) for more information.
292
348
 
293
349
  ## Security Vulnerabilities
294
350
 
@@ -1,18 +1,18 @@
1
1
  {
2
- "_browser-C0q0NWWv.js": {
3
- "file": "browser-C0q0NWWv.js",
2
+ "_browser-D_CtuxSB.js": {
3
+ "file": "browser-D_CtuxSB.js",
4
4
  "name": "browser",
5
5
  "isDynamicEntry": true,
6
6
  "imports": [
7
- "_empty-BMkCc_7L.js"
7
+ "_empty--zdtkf0T.js"
8
8
  ]
9
9
  },
10
- "_empty-BMkCc_7L.js": {
11
- "file": "empty-BMkCc_7L.js",
10
+ "_empty--zdtkf0T.js": {
11
+ "file": "empty--zdtkf0T.js",
12
12
  "name": "empty",
13
13
  "dynamicImports": [
14
- "_topbar.min-xBbuiIjv.js",
15
- "_browser-C0q0NWWv.js",
14
+ "_topbar.min-CDkSVOxV.js",
15
+ "_browser-D_CtuxSB.js",
16
16
  "src/tree/lib/commands/install.ts",
17
17
  "node_modules/.pnpm/figlet@1.8.0/node_modules/figlet/importable-fonts/Poison.js"
18
18
  ]
@@ -21,12 +21,12 @@
21
21
  "file": "kernel.css",
22
22
  "src": "_kernel.css"
23
23
  },
24
- "_topbar.min-xBbuiIjv.js": {
25
- "file": "topbar.min-xBbuiIjv.js",
24
+ "_topbar.min-CDkSVOxV.js": {
25
+ "file": "topbar.min-CDkSVOxV.js",
26
26
  "name": "topbar.min",
27
27
  "isDynamicEntry": true,
28
28
  "imports": [
29
- "_empty-BMkCc_7L.js"
29
+ "_empty--zdtkf0T.js"
30
30
  ]
31
31
  },
32
32
  "node_modules/.pnpm/figlet@1.8.0/node_modules/figlet/importable-fonts/Poison.js": {
@@ -41,16 +41,16 @@
41
41
  "src": "src/tree/kernel.ts",
42
42
  "isEntry": true,
43
43
  "imports": [
44
- "_empty-BMkCc_7L.js"
44
+ "_empty--zdtkf0T.js"
45
45
  ]
46
46
  },
47
47
  "src/tree/lib/commands/install.ts": {
48
- "file": "install-C64fBUI2.js",
48
+ "file": "install-Ds1oWgTf.js",
49
49
  "name": "install",
50
50
  "src": "src/tree/lib/commands/install.ts",
51
51
  "isDynamicEntry": true,
52
52
  "imports": [
53
- "_empty-BMkCc_7L.js"
53
+ "_empty--zdtkf0T.js"
54
54
  ]
55
55
  },
56
56
  "src/ui.ts": {
@@ -59,7 +59,7 @@
59
59
  "src": "src/ui.ts",
60
60
  "isEntry": true,
61
61
  "imports": [
62
- "_empty-BMkCc_7L.js"
62
+ "_empty--zdtkf0T.js"
63
63
  ]
64
64
  }
65
65
  }
@@ -1,4 +1,4 @@
1
- import { g as getDefaultExportFromCjs } from "./empty-BMkCc_7L.js";
1
+ import { g as getDefaultExportFromCjs } from "./empty--zdtkf0T.js";
2
2
  var browser$2;
3
3
  var hasRequiredBrowser;
4
4
  function requireBrowser() {
@@ -20,4 +20,4 @@ const browser$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePro
20
20
  export {
21
21
  browser$1 as b
22
22
  };
23
- //# sourceMappingURL=browser-C0q0NWWv.js.map
23
+ //# sourceMappingURL=browser-D_CtuxSB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-C0q0NWWv.js","sources":["../node_modules/.pnpm/ws@8.18.0/node_modules/ws/browser.js"],"sourcesContent":["'use strict';\n\nmodule.exports = function () {\n throw new Error(\n 'ws does not work in the browser. Browser clients must use the native ' +\n 'WebSocket object'\n );\n};\n"],"names":["browser"],"mappings":";;;;;;AAEAA,cAAiB,WAAY;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IAED;AAAA,EACF;;;;;;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"browser-D_CtuxSB.js","sources":["../node_modules/.pnpm/ws@8.18.0/node_modules/ws/browser.js"],"sourcesContent":["'use strict';\n\nmodule.exports = function () {\n throw new Error(\n 'ws does not work in the browser. Browser clients must use the native ' +\n 'WebSocket object'\n );\n};\n"],"names":["browser"],"mappings":";;;;;;AAEAA,cAAiB,WAAY;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IAED;AAAA,EACF;;;;;;;;;","x_google_ignoreList":[0]}