pinokiod 3.8.0 → 3.8.5
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/fs/index.js +6 -4
- package/kernel/api/index.js +102 -31
- package/kernel/bin/cuda.js +7 -0
- package/kernel/bin/index.js +143 -4
- package/kernel/bin/node.js +9 -0
- package/kernel/index.js +32 -1
- package/kernel/info.js +1 -0
- package/kernel/prototype.js +47 -0
- package/kernel/shell.js +110 -54
- package/kernel/shells.js +16 -7
- package/kernel/store.js +58 -0
- package/kernel/util.js +106 -35
- package/package.json +1 -1
- package/script/index.js +12 -0
- package/server/index.js +466 -250
- 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/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 +160 -0
- package/server/public/fseditor.js +189 -0
- package/server/public/github.png +0 -0
- 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/style.css +131 -9
- package/server/socket.js +123 -37
- package/server/views/app.ejs +184 -11
- package/server/views/editor.ejs +12 -2
- package/server/views/explore.ejs +4 -3
- package/server/views/help.ejs +4 -2
- package/server/views/index.ejs +218 -80
- package/server/views/install.ejs +1 -1
- package/server/views/local_editor.ejs +282 -0
- package/server/views/minterm.ejs +687 -0
- package/server/views/partials/menu.ejs +7 -1
- package/server/views/prototypes.ejs +463 -0
- package/server/views/proxy.ejs +10 -4
- package/server/views/settings.ejs +4 -3
- package/server/views/terminal.ejs +99 -15
|
@@ -33,6 +33,16 @@
|
|
|
33
33
|
<link href="/css/brands.min.css" rel="stylesheet">
|
|
34
34
|
<link href="/style.css" rel="stylesheet"/>
|
|
35
35
|
<link href="/noty.css" rel="stylesheet"/>
|
|
36
|
+
<!--
|
|
37
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
38
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
39
|
+
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
|
|
40
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
41
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
42
|
+
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
|
|
43
|
+
-->
|
|
44
|
+
|
|
45
|
+
|
|
36
46
|
<% if (agent === "electron") { %>
|
|
37
47
|
<link href="/electron.css" rel="stylesheet"/>
|
|
38
48
|
<% } %>
|
|
@@ -92,12 +102,16 @@ header {
|
|
|
92
102
|
.xterm .xterm-viewport {
|
|
93
103
|
width: initial !important;
|
|
94
104
|
}
|
|
105
|
+
/*
|
|
95
106
|
.navheader {
|
|
96
107
|
background: var(--dark-bg);
|
|
97
108
|
}
|
|
109
|
+
*/
|
|
110
|
+
/*
|
|
98
111
|
.btn {
|
|
99
112
|
background: royalblue;
|
|
100
113
|
}
|
|
114
|
+
*/
|
|
101
115
|
#del-bin {
|
|
102
116
|
color: royalblue;
|
|
103
117
|
cursor: pointer;
|
|
@@ -111,6 +125,7 @@ body.frozen {
|
|
|
111
125
|
</style>
|
|
112
126
|
<link href="/terminal.css" rel="stylesheet"/>
|
|
113
127
|
<script>
|
|
128
|
+
let shell_id
|
|
114
129
|
document.addEventListener("DOMContentLoaded", async () => {
|
|
115
130
|
<% if (error) { %>
|
|
116
131
|
document.querySelector(".requirements .content").innerHTML = '<div class="loading"><i class="fa-solid fa-circle-exclamation"></i> <%=error%></div>'
|
|
@@ -137,9 +152,22 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
137
152
|
class RPC {
|
|
138
153
|
constructor() {
|
|
139
154
|
this.socket = new Socket()
|
|
155
|
+
this.buffer = []
|
|
140
156
|
}
|
|
141
157
|
write(text) {
|
|
142
|
-
|
|
158
|
+
// console.log(text)
|
|
159
|
+
// this.buffer += text;
|
|
160
|
+
// if (!this.timeout) {
|
|
161
|
+
// this.timeout = setTimeout(() => {
|
|
162
|
+
// console.log("write", this.buffer)
|
|
163
|
+
// this.term.write(this.buffer);
|
|
164
|
+
// this.buffer = "";
|
|
165
|
+
// this.timeout = null;
|
|
166
|
+
// }, 50);
|
|
167
|
+
// }
|
|
168
|
+
if (text !== "\u0007") {
|
|
169
|
+
this.term.write(text)
|
|
170
|
+
}
|
|
143
171
|
this.dirty = true
|
|
144
172
|
}
|
|
145
173
|
finished() {
|
|
@@ -191,6 +219,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
191
219
|
await this.socket.close()
|
|
192
220
|
|
|
193
221
|
let query = Object.fromEntries(new URLSearchParams(location.search))
|
|
222
|
+
console.log(">>>>>>>> 1")
|
|
194
223
|
|
|
195
224
|
this.socket.run({
|
|
196
225
|
//uri: location.pathname.slice(1).replace("api/", ""),
|
|
@@ -203,9 +232,13 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
203
232
|
rows: this.term.rows,
|
|
204
233
|
}
|
|
205
234
|
}, async (packet) => {
|
|
235
|
+
console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ", { packet })
|
|
206
236
|
if (packet.type === 'start') {
|
|
207
237
|
refreshParent(packet)
|
|
208
238
|
reloadMemory()
|
|
239
|
+
document.querySelector(".run .play").classList.add("hidden")
|
|
240
|
+
document.querySelector(".run .starting").classList.add("hidden")
|
|
241
|
+
document.querySelector(".run .stop").classList.remove("hidden")
|
|
209
242
|
if (packet.data && packet.data.description) {
|
|
210
243
|
if ('current' in packet.data) {
|
|
211
244
|
document.querySelector("footer").innerHTML = `<b>
|
|
@@ -234,7 +267,13 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
234
267
|
// </div>`
|
|
235
268
|
}
|
|
236
269
|
} else if (packet.type === "stream") {
|
|
270
|
+
console.log(">>>>>>>> 3")
|
|
271
|
+
// set the current shell id
|
|
272
|
+
if (packet.data.id) {
|
|
273
|
+
shell_id = packet.data.id
|
|
274
|
+
}
|
|
237
275
|
if (packet.data.raw) {
|
|
276
|
+
// console.log({ packet })
|
|
238
277
|
this.write(packet.data.raw)
|
|
239
278
|
} else if (packet.data.json) {
|
|
240
279
|
this.write(JSON.stringify(packet.data.json).replace(/\n/g, "\r\n"))
|
|
@@ -255,8 +294,14 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
255
294
|
document.querySelector(".run .play").classList.remove("hidden")
|
|
256
295
|
document.querySelector(".run .stop").classList.add("hidden")
|
|
257
296
|
} else if (packet.type === 'connect') {
|
|
258
|
-
|
|
259
|
-
|
|
297
|
+
if (packet.data) {
|
|
298
|
+
if (packet.data.shell) {
|
|
299
|
+
shell_id = packet.data.shell
|
|
300
|
+
}
|
|
301
|
+
if (packet.data.state) {
|
|
302
|
+
this.write(packet.data.state)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
260
305
|
/*
|
|
261
306
|
for(let i=0; i<message.length; i++) {
|
|
262
307
|
await new Promise((r, reject) => {
|
|
@@ -267,6 +312,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
267
312
|
})
|
|
268
313
|
}
|
|
269
314
|
*/
|
|
315
|
+
console.log(">>>>>>>> 2")
|
|
270
316
|
document.querySelector(".run .play").classList.add("hidden")
|
|
271
317
|
document.querySelector(".run .starting").classList.add("hidden")
|
|
272
318
|
document.querySelector(".run .stop").classList.remove("hidden")
|
|
@@ -465,7 +511,6 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
465
511
|
document.querySelector("#error-screen").classList.add("hidden")
|
|
466
512
|
})
|
|
467
513
|
*/
|
|
468
|
-
console.log("instance", instance)
|
|
469
514
|
instance.mark(packet.event)
|
|
470
515
|
let element = document.querySelector("mark")
|
|
471
516
|
element.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
@@ -558,11 +603,29 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
558
603
|
await this.start(mode)
|
|
559
604
|
}
|
|
560
605
|
async createTerm () {
|
|
606
|
+
console.log(xtermTheme)
|
|
561
607
|
if (!this.term) {
|
|
608
|
+
const theme = Object.assign({ }, xtermTheme.Terminal_Basic, {
|
|
609
|
+
selectionBackground: "red",
|
|
610
|
+
selectionForeground: "white"
|
|
611
|
+
})
|
|
612
|
+
|
|
562
613
|
let config = {
|
|
563
614
|
scrollback: 9999999,
|
|
564
|
-
fontSize: 12,
|
|
565
|
-
|
|
615
|
+
//fontSize: 12,
|
|
616
|
+
fontSize: 14,
|
|
617
|
+
theme,
|
|
618
|
+
//theme: xtermTheme.FrontEndDelight
|
|
619
|
+
//theme: xtermTheme.Afterglow
|
|
620
|
+
|
|
621
|
+
//theme: xtermTheme.PencilLight
|
|
622
|
+
|
|
623
|
+
//theme: xtermTheme.Flatland
|
|
624
|
+
//theme: xtermTheme.OneHalfLight
|
|
625
|
+
//theme: xtermTheme.Piatto_Light
|
|
626
|
+
//theme: xtermTheme.Spring
|
|
627
|
+
//theme: xtermTheme.Terminal_Basic
|
|
628
|
+
//theme: xtermTheme.Tomorrow
|
|
566
629
|
}
|
|
567
630
|
let res = await fetch("/xterm_config").then((res) => {
|
|
568
631
|
return res.json()
|
|
@@ -572,13 +635,20 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
572
635
|
}
|
|
573
636
|
const term = new Terminal(config)
|
|
574
637
|
term.open(document.querySelector("#terminal"))
|
|
575
|
-
|
|
576
638
|
term.attachCustomKeyEventHandler(event => {
|
|
577
|
-
|
|
578
|
-
|
|
639
|
+
console.log({ event })
|
|
640
|
+
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
|
|
641
|
+
const selection = term.getSelection();
|
|
642
|
+
if (selection) {
|
|
643
|
+
navigator.clipboard.writeText(selection);
|
|
644
|
+
return false;
|
|
645
|
+
}
|
|
579
646
|
}
|
|
580
|
-
if (event.ctrlKey && event.key === 'v'
|
|
581
|
-
|
|
647
|
+
if ((event.ctrlKey || event.metaKey) && event.key === 'v') {
|
|
648
|
+
navigator.clipboard.readText().then((text) => {
|
|
649
|
+
term.write(text);
|
|
650
|
+
})
|
|
651
|
+
return false
|
|
582
652
|
}
|
|
583
653
|
return true;
|
|
584
654
|
});
|
|
@@ -589,6 +659,17 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
589
659
|
////term.resize(cols, rows-5);
|
|
590
660
|
//term.resize(cols, rows);
|
|
591
661
|
|
|
662
|
+
term.onKey(({ key }) => {
|
|
663
|
+
if (this.socket) {
|
|
664
|
+
if (shell_id) {
|
|
665
|
+
this.socket.run({
|
|
666
|
+
key,
|
|
667
|
+
id: shell_id
|
|
668
|
+
})
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
});
|
|
672
|
+
|
|
592
673
|
const fitAddon = new FitAddon.FitAddon();
|
|
593
674
|
// const searchAddon = new SearchAddon.SearchAddon();
|
|
594
675
|
// const searchAddonBar = new SearchBarAddon.SearchBarAddon({searchAddon});
|
|
@@ -606,6 +687,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
606
687
|
fitAddon.fit();
|
|
607
688
|
this.term = term
|
|
608
689
|
this.fit = fitAddon
|
|
690
|
+
|
|
609
691
|
}
|
|
610
692
|
this.term.focus()
|
|
611
693
|
}
|
|
@@ -771,7 +853,7 @@ const reloadMemory = async () => {
|
|
|
771
853
|
<% } else { %>
|
|
772
854
|
<body class='<%=theme%>'>
|
|
773
855
|
<% } %>
|
|
774
|
-
<header class='
|
|
856
|
+
<header class='navheader2'>
|
|
775
857
|
<% if (!install_required) { %>
|
|
776
858
|
<div class='runner'>
|
|
777
859
|
<% if (locals.prev) { %>
|
|
@@ -782,14 +864,16 @@ const reloadMemory = async () => {
|
|
|
782
864
|
<span class='starting hidden'><i class="fa-solid fa-circle-notch fa-spin"></i> Starting...</span>
|
|
783
865
|
<span class='stop hidden'><i class="fa-solid fa-stop"></i> Stop</span>
|
|
784
866
|
</div>
|
|
785
|
-
|
|
867
|
+
<% if (locals.filepath) { %>
|
|
868
|
+
<button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> View File</button>
|
|
869
|
+
<% } %>
|
|
786
870
|
<!--
|
|
787
871
|
<button class='btn' id='open-log' data-logpath="<%=logpath%>"><i class="fa-solid fa-align-left"></i> View Logs</button>
|
|
788
872
|
-->
|
|
789
873
|
</div>
|
|
790
874
|
<% } %>
|
|
791
875
|
</header>
|
|
792
|
-
<% if (requirements_pending) { %>
|
|
876
|
+
<% if (locals.requirements_pending) { %>
|
|
793
877
|
<div class='requirements'>
|
|
794
878
|
<div class='content'>
|
|
795
879
|
<div class='loading'>
|
|
@@ -798,7 +882,7 @@ const reloadMemory = async () => {
|
|
|
798
882
|
</div>
|
|
799
883
|
</div>
|
|
800
884
|
<% } else { %>
|
|
801
|
-
<% if (install_required) { %>
|
|
885
|
+
<% if (locals.install_required) { %>
|
|
802
886
|
<div class='requirements'>
|
|
803
887
|
<div class='content'>
|
|
804
888
|
<div class='title'><i class="fa-solid fa-circle-exclamation"></i> Installation required</div>
|