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.
Files changed (51) hide show
  1. package/kernel/api/fs/index.js +6 -4
  2. package/kernel/api/index.js +102 -31
  3. package/kernel/bin/cuda.js +7 -0
  4. package/kernel/bin/index.js +143 -4
  5. package/kernel/bin/node.js +9 -0
  6. package/kernel/index.js +32 -1
  7. package/kernel/info.js +1 -0
  8. package/kernel/prototype.js +47 -0
  9. package/kernel/shell.js +110 -54
  10. package/kernel/shells.js +16 -7
  11. package/kernel/store.js +58 -0
  12. package/kernel/util.js +106 -35
  13. package/package.json +1 -1
  14. package/script/index.js +12 -0
  15. package/server/index.js +466 -250
  16. package/server/public/SpaceMono-Bold.ttf +0 -0
  17. package/server/public/SpaceMono-BoldItalic.ttf +0 -0
  18. package/server/public/SpaceMono-Italic.ttf +0 -0
  19. package/server/public/SpaceMono-Regular.ttf +0 -0
  20. package/server/public/filepond-plugin-file-validate-type.min.js +9 -0
  21. package/server/public/filepond-plugin-image-crop.min.js +9 -0
  22. package/server/public/filepond-plugin-image-edit.min.css +8 -0
  23. package/server/public/filepond-plugin-image-edit.min.js +9 -0
  24. package/server/public/filepond-plugin-image-exif-orientation.min.js +9 -0
  25. package/server/public/filepond-plugin-image-preview.min.css +8 -0
  26. package/server/public/filepond-plugin-image-preview.min.js +9 -0
  27. package/server/public/filepond-plugin-image-resize.min.js +9 -0
  28. package/server/public/filepond-plugin-image-transform.min.js +9 -0
  29. package/server/public/filepond.min.css +8 -0
  30. package/server/public/filepond.min.js +9 -0
  31. package/server/public/fscreator.js +160 -0
  32. package/server/public/fseditor.js +189 -0
  33. package/server/public/github.png +0 -0
  34. package/server/public/opener.js +3 -1
  35. package/server/public/pinokio-black.png +0 -0
  36. package/server/public/pinokio-black2.png +0 -0
  37. package/server/public/style.css +131 -9
  38. package/server/socket.js +123 -37
  39. package/server/views/app.ejs +184 -11
  40. package/server/views/editor.ejs +12 -2
  41. package/server/views/explore.ejs +4 -3
  42. package/server/views/help.ejs +4 -2
  43. package/server/views/index.ejs +218 -80
  44. package/server/views/install.ejs +1 -1
  45. package/server/views/local_editor.ejs +282 -0
  46. package/server/views/minterm.ejs +687 -0
  47. package/server/views/partials/menu.ejs +7 -1
  48. package/server/views/prototypes.ejs +463 -0
  49. package/server/views/proxy.ejs +10 -4
  50. package/server/views/settings.ejs +4 -3
  51. 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
- this.term.write(text)
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
- const message = "..........Connected!\r\n"
259
- this.write(message)
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
- theme: xtermTheme.FrontEndDelight
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
- if (event.ctrlKey && event.key === 'c' && term.hasSelection()) {
578
- return false;
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' && this._options.pasteWithCtrlV) {
581
- return false;
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='navheader'>
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
- <button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> View File</button>
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>