pinokiod 3.9.0 → 3.9.2
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/kernel/api/filepicker/index.js +59 -0
- package/kernel/api/fs/index.js +6 -4
- package/kernel/api/index.js +123 -37
- package/kernel/api/input/index.js +2 -0
- package/kernel/api/web/index.js +6 -0
- package/kernel/bin/caddy.js +127 -0
- package/kernel/bin/cloudflared.js +1 -0
- package/kernel/bin/conda.js +10 -2
- package/kernel/bin/cuda.js +0 -16
- package/kernel/bin/ffmpeg.js +4 -6
- package/kernel/bin/git.js +55 -29
- package/kernel/bin/gxx.js +8 -6
- package/kernel/bin/huggingface.js +4 -5
- package/kernel/bin/index.js +347 -88
- package/kernel/bin/node.js +13 -6
- package/kernel/bin/py.js +1 -1
- package/kernel/bin/setup.js +146 -0
- package/kernel/bin/uv.js +4 -5
- package/kernel/bin/zip.js +7 -8
- package/kernel/connect/index.js +25 -0
- package/kernel/connect/providers/github/README.md +11 -0
- package/kernel/connect/providers/x/README.md +96 -0
- package/kernel/connect/providers/x/index.js +152 -0
- package/kernel/environment.js +50 -1
- package/kernel/index.js +152 -32
- package/kernel/info.js +4 -2
- package/kernel/kv.js +38 -0
- package/kernel/loader.js +13 -3
- package/kernel/peer.js +161 -0
- package/kernel/procs.js +116 -0
- package/kernel/prototype.js +62 -0
- package/kernel/router/common.js +42 -0
- package/kernel/router/connector.js +81 -0
- package/kernel/router/index.js +235 -0
- package/kernel/router/localhost_home_router.js +84 -0
- package/kernel/router/localhost_port_router.js +15 -0
- package/kernel/router/localhost_variable_router.js +37 -0
- package/kernel/router/peer_home_router.js +15 -0
- package/kernel/router/peer_peer_router.js +26 -0
- package/kernel/router/peer_port_router.js +45 -0
- package/kernel/router/peer_variable_router.js +46 -0
- package/kernel/router/processor.js +31 -0
- package/kernel/shell.js +141 -60
- package/kernel/shells.js +32 -17
- package/kernel/store.js +58 -0
- package/kernel/sysinfo.js +0 -1
- package/kernel/util.js +143 -36
- package/package.json +4 -1
- package/pipe/index.js +0 -2
- package/script/index.js +12 -0
- package/server/index.js +1473 -553
- package/server/public/Socket.js +5 -1
- package/server/public/SourceCodePro-Regular.ttf +0 -0
- package/server/public/SpaceMono-Bold.ttf +0 -0
- package/server/public/SpaceMono-BoldItalic.ttf +0 -0
- package/server/public/SpaceMono-Italic.ttf +0 -0
- package/server/public/SpaceMono-Regular.ttf +0 -0
- package/server/public/commander.js +40 -0
- package/server/public/common.js +60 -0
- package/server/public/dropzone-min.js +2 -0
- package/server/public/dropzone.css +1 -0
- package/server/public/filepond-plugin-file-validate-type.min.js +9 -0
- package/server/public/filepond-plugin-image-crop.min.js +9 -0
- package/server/public/filepond-plugin-image-edit.min.css +8 -0
- package/server/public/filepond-plugin-image-edit.min.js +9 -0
- package/server/public/filepond-plugin-image-exif-orientation.min.js +9 -0
- package/server/public/filepond-plugin-image-preview.min.css +8 -0
- package/server/public/filepond-plugin-image-preview.min.js +9 -0
- package/server/public/filepond-plugin-image-resize.min.js +9 -0
- package/server/public/filepond-plugin-image-transform.min.js +9 -0
- package/server/public/filepond.min.css +8 -0
- package/server/public/filepond.min.js +9 -0
- package/server/public/fscreator.js +174 -0
- package/server/public/fseditor.js +212 -0
- package/server/public/github.png +0 -0
- package/server/public/highlight-js.js +81 -0
- package/server/public/highlight.css +9 -0
- package/server/public/highlight.js +1244 -0
- package/server/public/install.js +17 -20
- package/server/public/modalinput.js +105 -9
- package/server/public/opener.js +3 -1
- package/server/public/pinokio-black.png +0 -0
- package/server/public/pinokio-black2.png +0 -0
- package/server/public/redoc.standalone.js +1832 -0
- package/server/public/style.css +211 -17
- package/server/public/swagger-ui-bundle.js +2 -0
- package/server/public/swagger-ui.css +3 -0
- package/server/public/x.js +63 -0
- package/server/socket.js +136 -39
- package/server/views/404.ejs +0 -1
- package/server/views/app.ejs +356 -90
- package/server/views/bootstrap.ejs +22 -19
- package/server/views/connect/x.ejs +324 -0
- package/server/views/connect.ejs +197 -0
- package/server/views/download.ejs +7 -1
- package/server/views/editor.ejs +68 -9
- package/server/views/explore.ejs +13 -10
- package/server/views/file_explorer.ejs +10 -37
- package/server/views/github.ejs +218 -0
- package/server/views/help.ejs +4 -3
- package/server/views/index.ejs +268 -118
- package/server/views/install.ejs +56 -29
- package/server/views/keys.ejs +276 -0
- package/server/views/network.ejs +889 -0
- package/server/views/partials/dynamic.ejs +9 -0
- package/server/views/partials/menu.ejs +7 -1
- package/server/views/prototype/index.ejs +311 -0
- package/server/views/prototype/show.ejs +383 -0
- package/server/views/redoc.ejs +18 -0
- package/server/views/required_env_editor.ejs +11 -2
- package/server/views/settings.ejs +38 -10
- package/server/views/setup.ejs +254 -0
- package/server/views/setup_home.ejs +192 -0
- package/server/views/shell.ejs +781 -0
- package/server/views/swaggerui.ejs +19 -0
- package/server/views/terminal.ejs +174 -42
- package/LICENSE +0 -7
- package/server/views/proxy.ejs +0 -405
package/server/public/install.js
CHANGED
|
@@ -109,26 +109,23 @@ const install = async (name, url, term, socket, options) => {
|
|
|
109
109
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
-
const createTerm = () => {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
rows: 20,
|
|
130
|
-
fontSize: 12
|
|
131
|
-
});
|
|
112
|
+
const createTerm = async (_theme) => {
|
|
113
|
+
const theme = Object.assign({ }, _theme, {
|
|
114
|
+
selectionBackground: "red",
|
|
115
|
+
selectionForeground: "white"
|
|
116
|
+
})
|
|
117
|
+
let config = {
|
|
118
|
+
scrollback: 9999999,
|
|
119
|
+
fontSize: 14,
|
|
120
|
+
theme,
|
|
121
|
+
}
|
|
122
|
+
let res = await fetch("/xterm_config").then((res) => {
|
|
123
|
+
return res.json()
|
|
124
|
+
})
|
|
125
|
+
if (res && res.config) {
|
|
126
|
+
config = res.config
|
|
127
|
+
}
|
|
128
|
+
const term = new Terminal(config)
|
|
132
129
|
const fitAddon = new FitAddon.FitAddon();
|
|
133
130
|
term.loadAddon(fitAddon);
|
|
134
131
|
term.loadAddon(new WebLinksAddon.WebLinksAddon());
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const ModalInput = async (params) => {
|
|
1
|
+
const ModalInput = async (params, uri) => {
|
|
2
2
|
/*
|
|
3
3
|
{
|
|
4
4
|
title,
|
|
@@ -15,23 +15,32 @@ const ModalInput = async (params) => {
|
|
|
15
15
|
}
|
|
16
16
|
*/
|
|
17
17
|
let form = params.form || []
|
|
18
|
+
let dropzones = []
|
|
18
19
|
let description = (params.description ? `<div class='desc'>${params.description}</div>` : "")
|
|
19
20
|
let result = await Swal.fire({
|
|
20
21
|
title: (params.title || ""),
|
|
21
22
|
html: description + form.map((field) => {
|
|
22
23
|
let type = (field.type ? field.type : "text")
|
|
24
|
+
let autofocus = (field.autofocus ? "autofocus" : "")
|
|
23
25
|
let input
|
|
24
26
|
if (type === 'textarea') {
|
|
25
|
-
input = `<textarea oninput="autoExpand(this)" data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}"></textarea>`
|
|
27
|
+
input = `<textarea ${autofocus} oninput="autoExpand(this)" data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}"></textarea>`
|
|
26
28
|
} else if (type === 'select') {
|
|
27
29
|
if (field.items && Array.isArray(field.items)) {
|
|
28
30
|
let items = field.items.map((item) => {
|
|
29
|
-
|
|
31
|
+
if (typeof item === "object" && item.value && item.text) {
|
|
32
|
+
return `<option value="${item.value}">${item.text}</option>`
|
|
33
|
+
} else {
|
|
34
|
+
return `<option value="${item}">${item}</option>`
|
|
35
|
+
}
|
|
30
36
|
}).join("")
|
|
31
|
-
input = `<select>${items}</select>`
|
|
37
|
+
input = `<select data-id="${field.key}">${items}</select>`
|
|
32
38
|
}
|
|
39
|
+
} else if (type === 'file') {
|
|
40
|
+
input = `<div class='dropzone' data-type='file' data-id='${field.key}'></div>`
|
|
41
|
+
//input = `<input type='file' data-id="${field.key}" />`
|
|
33
42
|
} else {
|
|
34
|
-
input = `<input type='${type}' data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}">`
|
|
43
|
+
input = `<input ${autofocus} type='${type}' data-id="${field.key}" class="swal2-input" placeholder="${field.placeholder ? field.placeholder : ''}">`
|
|
35
44
|
}
|
|
36
45
|
return [
|
|
37
46
|
"<div class='field'>",
|
|
@@ -43,6 +52,22 @@ const ModalInput = async (params) => {
|
|
|
43
52
|
}).join("\n"),
|
|
44
53
|
//focusConfirm: false,
|
|
45
54
|
confirmButtonText: 'Done',
|
|
55
|
+
didRender: () => {
|
|
56
|
+
Swal.getPopup().querySelectorAll('[data-type=file]').forEach((el, index) => {
|
|
57
|
+
const dz = new Dropzone(el, {
|
|
58
|
+
url: '/no-op', // dummy, not used
|
|
59
|
+
autoProcessQueue: false,
|
|
60
|
+
uploadMultiple: false,
|
|
61
|
+
maxFiles: 1,
|
|
62
|
+
addRemoveLinks: true,
|
|
63
|
+
dictDefaultMessage: "Drag and drop or click to upload a file",
|
|
64
|
+
init: function () {
|
|
65
|
+
console.log(`Dropzone ${index + 1} ready`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
dropzones.push(dz);
|
|
69
|
+
});
|
|
70
|
+
},
|
|
46
71
|
didOpen: () => {
|
|
47
72
|
for(let field of form) {
|
|
48
73
|
if (field.default) {
|
|
@@ -53,14 +78,85 @@ const ModalInput = async (params) => {
|
|
|
53
78
|
}
|
|
54
79
|
document.querySelector(".swal2-confirm").blur()
|
|
55
80
|
},
|
|
56
|
-
preConfirm: () => {
|
|
81
|
+
preConfirm: async () => {
|
|
57
82
|
let response = {}
|
|
83
|
+
let buffer_response = {}
|
|
58
84
|
for(let field of form) {
|
|
59
|
-
debugger
|
|
60
85
|
let input = Swal.getPopup().querySelector("[data-id='" + field.key + "']")
|
|
61
|
-
|
|
86
|
+
let type = input.getAttribute("data-type")
|
|
87
|
+
if (type !== 'file') {
|
|
88
|
+
response[field.key] = input.value
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// let type = input.getAttribute("type")
|
|
92
|
+
// if (type === 'file') {
|
|
93
|
+
// const file = input.files[0];
|
|
94
|
+
// const reader = new FileReader();
|
|
95
|
+
// let buffer = await new Promise((resolve, reject) => {
|
|
96
|
+
// reader.onload = () => {
|
|
97
|
+
// resolve(new Uint8Array(reader.result))
|
|
98
|
+
// };
|
|
99
|
+
// reader.readAsArrayBuffer(file);
|
|
100
|
+
// })
|
|
101
|
+
// buffer_response[field.key] = buffer
|
|
102
|
+
// } else {
|
|
103
|
+
// response[field.key] = input.value
|
|
104
|
+
// }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
for(let dz of dropzones) {
|
|
109
|
+
const id = dz.element.getAttribute("data-id");
|
|
110
|
+
const fileList = dz.getAcceptedFiles(); // array of File
|
|
111
|
+
const file = fileList[0]; // actual File object (like from <input>)
|
|
112
|
+
let buffer = await new Promise((resolve, reject) => {
|
|
113
|
+
const reader = new FileReader();
|
|
114
|
+
reader.onload = () => {
|
|
115
|
+
resolve(new Uint8Array(reader.result))
|
|
116
|
+
};
|
|
117
|
+
reader.readAsArrayBuffer(file);
|
|
118
|
+
})
|
|
119
|
+
buffer_response[id] = buffer
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
if (Object.keys(buffer_response).length > 0) {
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
const fileKeys = Object.keys(buffer_response);
|
|
127
|
+
const metadata = {
|
|
128
|
+
uri,
|
|
129
|
+
response,
|
|
130
|
+
buffer_keys: fileKeys
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const metaJson = JSON.stringify(metadata);
|
|
134
|
+
const metaBuffer = new TextEncoder().encode(metaJson);
|
|
135
|
+
const separator = new Uint8Array([0]);
|
|
136
|
+
|
|
137
|
+
const parts = [metaBuffer, separator];
|
|
138
|
+
|
|
139
|
+
for (const key of fileKeys) {
|
|
140
|
+
const buf = buffer_response[key];
|
|
141
|
+
const lenBytes = new Uint8Array(4);
|
|
142
|
+
new DataView(lenBytes.buffer).setUint32(0, buf.byteLength); // big-endian length
|
|
143
|
+
parts.push(lenBytes, new Uint8Array(buf));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Calculate total length
|
|
147
|
+
const totalLen = parts.reduce((sum, part) => sum + part.length, 0);
|
|
148
|
+
const combined = new Uint8Array(totalLen);
|
|
149
|
+
|
|
150
|
+
let offset = 0;
|
|
151
|
+
for (const part of parts) {
|
|
152
|
+
combined.set(part, offset);
|
|
153
|
+
offset += part.length;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return combined.buffer
|
|
157
|
+
} else {
|
|
158
|
+
return response
|
|
62
159
|
}
|
|
63
|
-
return response
|
|
64
160
|
}
|
|
65
161
|
})
|
|
66
162
|
if (result) {
|
package/server/public/opener.js
CHANGED
|
@@ -9,13 +9,15 @@ document.addEventListener("click", async (e) => {
|
|
|
9
9
|
}
|
|
10
10
|
if (el) {
|
|
11
11
|
let filepath = el.getAttribute("data-filepath")
|
|
12
|
+
let command = el.getAttribute("data-command")
|
|
12
13
|
await fetch("/openfs", {
|
|
13
14
|
method: "post",
|
|
14
15
|
headers: {
|
|
15
16
|
"Content-Type": "application/json"
|
|
16
17
|
},
|
|
17
18
|
body: JSON.stringify({
|
|
18
|
-
path: filepath
|
|
19
|
+
path: filepath,
|
|
20
|
+
command
|
|
19
21
|
})
|
|
20
22
|
}).then((res) => {
|
|
21
23
|
return res.json()
|
|
Binary file
|
|
Binary file
|