pinokiod 3.40.0 → 3.42.0

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 (82) hide show
  1. package/kernel/api/browser/index.js +3 -1
  2. package/kernel/api/cloudflare/index.js +3 -3
  3. package/kernel/api/index.js +187 -51
  4. package/kernel/api/loading/index.js +15 -0
  5. package/kernel/api/process/index.js +7 -0
  6. package/kernel/api/shell/index.js +0 -2
  7. package/kernel/bin/browserless.js +22 -0
  8. package/kernel/bin/caddy.js +36 -4
  9. package/kernel/bin/index.js +4 -1
  10. package/kernel/bin/setup.js +38 -5
  11. package/kernel/connect/backend.js +110 -0
  12. package/kernel/connect/config.js +171 -0
  13. package/kernel/connect/index.js +18 -7
  14. package/kernel/connect/providers/huggingface/index.js +98 -0
  15. package/kernel/connect/providers/x/index.js +0 -1
  16. package/kernel/environment.js +91 -19
  17. package/kernel/git.js +46 -3
  18. package/kernel/index.js +119 -39
  19. package/kernel/peer.js +40 -5
  20. package/kernel/plugin.js +3 -2
  21. package/kernel/procs.js +27 -20
  22. package/kernel/prototype.js +30 -16
  23. package/kernel/router/common.js +1 -1
  24. package/kernel/router/connector.js +1 -3
  25. package/kernel/router/index.js +38 -4
  26. package/kernel/router/localhost_home_router.js +5 -1
  27. package/kernel/router/localhost_port_router.js +27 -1
  28. package/kernel/router/localhost_static_router.js +93 -0
  29. package/kernel/router/localhost_variable_router.js +14 -9
  30. package/kernel/router/peer_peer_router.js +3 -0
  31. package/kernel/router/peer_static_router.js +43 -0
  32. package/kernel/router/peer_variable_router.js +15 -14
  33. package/kernel/router/processor.js +26 -1
  34. package/kernel/router/rewriter.js +59 -0
  35. package/kernel/scripts/git/commit +11 -1
  36. package/kernel/shell.js +8 -3
  37. package/kernel/util.js +65 -6
  38. package/package.json +2 -1
  39. package/server/index.js +1048 -970
  40. package/server/public/common.js +382 -1
  41. package/server/public/fscreator.js +0 -1
  42. package/server/public/loading.js +17 -0
  43. package/server/public/notifyinput.js +0 -1
  44. package/server/public/opener.js +4 -2
  45. package/server/public/style.css +310 -11
  46. package/server/socket.js +7 -1
  47. package/server/views/app.ejs +1747 -351
  48. package/server/views/columns.ejs +338 -0
  49. package/server/views/connect/huggingface.ejs +353 -0
  50. package/server/views/connect/index.ejs +410 -0
  51. package/server/views/connect/x.ejs +43 -9
  52. package/server/views/connect.ejs +709 -49
  53. package/server/views/container.ejs +357 -0
  54. package/server/views/d.ejs +251 -62
  55. package/server/views/download.ejs +54 -10
  56. package/server/views/editor.ejs +11 -0
  57. package/server/views/explore.ejs +40 -15
  58. package/server/views/file_explorer.ejs +25 -246
  59. package/server/views/form.ejs +44 -1
  60. package/server/views/frame.ejs +39 -1
  61. package/server/views/github.ejs +48 -11
  62. package/server/views/help.ejs +48 -7
  63. package/server/views/index.ejs +119 -58
  64. package/server/views/index2.ejs +3 -4
  65. package/server/views/init/index.ejs +651 -197
  66. package/server/views/install.ejs +1 -1
  67. package/server/views/mini.ejs +47 -18
  68. package/server/views/net.ejs +199 -67
  69. package/server/views/network.ejs +229 -93
  70. package/server/views/network2.ejs +3 -4
  71. package/server/views/old_network.ejs +3 -3
  72. package/server/views/prototype/index.ejs +48 -11
  73. package/server/views/review.ejs +1005 -0
  74. package/server/views/rows.ejs +341 -0
  75. package/server/views/screenshots.ejs +1020 -0
  76. package/server/views/settings.ejs +160 -23
  77. package/server/views/setup.ejs +49 -7
  78. package/server/views/setup_home.ejs +43 -10
  79. package/server/views/shell.ejs +7 -1
  80. package/server/views/start.ejs +14 -9
  81. package/server/views/terminal.ejs +13 -2
  82. package/server/views/tools.ejs +1015 -0
@@ -49,20 +49,15 @@
49
49
  display: flex;
50
50
  align-items: center;
51
51
  }
52
- body.dark .btn {
53
- background: none !important;
54
- }
52
+ /*
55
53
  .btn {
56
54
  margin-right: 5px;
57
55
  font-weight: normal;
58
56
  padding: 5px 15px;
59
57
  min-width: 100px;
60
58
  text-align: center;
61
- /*
62
- background: rgba(0,0,0,0.9);
63
- */
64
- border: 1px solid rgba(0,0,0,0.9);
65
59
  }
60
+ */
66
61
  .items {
67
62
  max-width: 600px;
68
63
  margin: 50px auto;
@@ -87,7 +82,6 @@ body.dark .item {
87
82
  .titleview h1 {
88
83
  word-break: break-word;
89
84
  font-size: 40px;
90
- font-weight: lighter;
91
85
  margin-bottom: 10px;
92
86
  }
93
87
  .item > .d {
@@ -100,12 +94,9 @@ body.dark .item {
100
94
  font-weight: bold;
101
95
  padding-bottom: 5px;
102
96
  }
103
- body.dark .item .explanation {
104
- color: rgba(240, 0, 0,1);
105
- }
106
97
  .item .explanation {
107
98
  padding-top: 5px;
108
- color: rgba(210,0,0,0.8);
99
+ color: #bf411d;
109
100
  font-size: 12px;
110
101
  }
111
102
  .item input[type=text] {
@@ -181,7 +172,7 @@ body.dark .loading {
181
172
  }
182
173
  body.dark .btn {
183
174
  color: white;
184
- border: 1px solid rgba(255,255,255,0.3) !important;
175
+ background: rgba(255,255,255,0.1);
185
176
  }
186
177
  body.light {
187
178
  /*
@@ -250,7 +241,99 @@ body.dark .keys pre {
250
241
  .swal2-title {
251
242
  text-align: center !important;
252
243
  }
244
+ main {
245
+ display: flex;
246
+ }
247
+ aside {
248
+ width: 200px;
249
+ display: block;
250
+ flex-shrink: 0;
251
+ }
252
+ aside .tab i {
253
+ width: 20px;
254
+ text-align: center;
255
+ }
256
+ body.dark aside .tab {
257
+ color: white;
258
+ }
259
+ body.dark aside .tab:hover, aside .tab:hover {
260
+ color: royalblue !important;
261
+ opacity: 1;
262
+ }
263
+ aside .tab {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: 5px;
267
+ color: black;
268
+ text-decoration: none;
269
+ padding: 10px;
270
+ font-size: 12px;
271
+ opacity: 0.5;
272
+ border-left: 10px solid transparent;
273
+ }
274
+ body.dark aside .tab.selected {
275
+ color: white;
276
+ }
277
+ aside .selected {
278
+ font-weight: bold;
279
+ opacity: 1;
280
+ }
281
+
282
+ @media only screen and (max-width: 800px) {
283
+ body {
284
+ display: flex !important;
285
+ flex-direction: row !important;
286
+ }
287
+ }
288
+ @media only screen and (max-width: 600px) {
289
+ aside {
290
+ width: unset;
291
+ flex-shrink: unset;
292
+ }
293
+ aside {
294
+ padding: 0 10px;
295
+ }
296
+ aside .tab i {
297
+ width: 100%;
298
+ }
299
+ aside .tab .caption {
300
+ display: none;
301
+ }
302
+ aside .tab {
303
+ margin: 0;
304
+ padding: 10px;
305
+ border-left: none;
306
+ }
307
+ aside .btn-tab {
308
+ flex-direction: column;
309
+ padding: 10px 0;
310
+ }
311
+ aside .btn-tab .btn {
312
+ display: flex;
313
+ justify-content: center;
314
+ }
315
+ aside .btn-tab .btn .caption {
316
+ display: none;
317
+ }
318
+ header .flexible {
319
+ min-width: unset;
320
+ }
321
+ }
322
+
323
+ @media only screen and (max-width: 480px) {
324
+ .btn2 {
325
+ padding: 5px;
326
+ font-size: 11px;
327
+ }
328
+ .nav-btns {
329
+ flex-grow: 1;
330
+ justify-content: center;
331
+ padding: 0;
332
+ }
333
+ }
253
334
  </style>
335
+ <script src="/popper.min.js"></script>
336
+ <script src="/tippy-bundle.umd.min.js"></script>
254
337
  <script src="/hotkeys.min.js"></script>
255
338
  <script src="/sweetalert2.js"></script>
256
339
  <script src="/noty.js"></script>
@@ -275,9 +358,9 @@ body.dark .keys pre {
275
358
  <header class='navheader grabbable'>
276
359
  <h1>
277
360
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
278
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
279
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
280
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
361
+ <button class='btn2' id='back' data-tippy-content="back"><div><i class="fa-solid fa-chevron-left"></i></div></button>
362
+ <button class='btn2' id='forward' data-tippy-content="forward"><div><i class="fa-solid fa-chevron-right"></i></div></button>
363
+ <button class='btn2' id='refresh-page' data-tippy-content="refresh"><div><i class="fa-solid fa-rotate-right"></i></div></button>
281
364
  <% paths.forEach((path) => { %>
282
365
  <% if (path.action) { %>
283
366
  <a class='path nav-button' id="<%=path.id%>" onclick="<%=path.action%>"><%-path.name%></a>
@@ -285,18 +368,51 @@ body.dark .keys pre {
285
368
  <a class='path' href="<%=path.path%>"><%-path.name%></a>
286
369
  <% } %>
287
370
  <% }) %>
371
+ <button class='btn2' id='screenshot' data-tippy-content="take a screenshot"><i class="fa-solid fa-camera"></i></button>
288
372
  <div class='flexible'></div>
289
- <div class='nav-btns'>
290
- <button id='new-window' title='open a new window' class='btn2' data-agent="<%=agent%>"><div><i class="fa-solid fa-plus"></i></div><div>Window</div></button>
373
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
374
+ <div><i class="fa-solid fa-table-columns"></i></div>
375
+ </a>
376
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
377
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
378
+ </a>
379
+ <div class="dropdown btn2">
380
+ <button class='btn2' id='window-management'>
381
+ <div><i class="fa-solid fa-plus"></i></div>
382
+ </button>
383
+ <div class="dropdown-content" id="dropdown-content">
384
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
385
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
386
+ </button>
387
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
388
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
389
+ </button>
390
+ </div>
291
391
  </div>
292
392
  <!--
293
- <div class='nav-btns'>
294
- <button class='btn2' id='report'><div><i class="fa-solid fa-bug"></i></div><div>Report Bug</div></button>
295
- <a class='btn2' href='https://discord.gg/TQdNwadtE4' target="_blank"><div><i class="fa-brands fa-discord"></i></div><div>Discord</div></a>
296
- <a class='btn2' href='https://twitter.com/cocktailpeanut' target="_blank"><div><i class="fa-brands fa-twitter"></i></div><div>Twitter</div></a>
297
- <button id='new-window' title='open a new window' class='btn2'><i class="fa-solid fa-plus"></i></button>
393
+ <div class="dropdown btn2">
394
+ <button class='btn2' id='window-management'>
395
+ <div><i class="fa-regular fa-window-restore"></i></div>
396
+ </button>
397
+ <div class="dropdown-content" id="dropdown-content">
398
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
399
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
400
+ </button>
401
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
402
+ <div><i class="fa-solid fa-table-columns"></i><div>split columns</div></div>
403
+ </a>
404
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
405
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i><div>split rows</div></div>
406
+ </a>
407
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
408
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
409
+ </button>
410
+ </div>
298
411
  </div>
299
412
  -->
413
+ <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
414
+ <div><i class="fa-solid fa-xmark"></i></div>
415
+ </button>
300
416
  </h1>
301
417
  </header>
302
418
  <main>
@@ -440,6 +556,27 @@ body.dark .keys pre {
440
556
  <% } %>
441
557
  </div>
442
558
  </div>
559
+ <aside>
560
+ <div class='btn-tab'>
561
+ <a href="/init" class='btn'><i class="fa-solid fa-plus"></i><div class='caption'>Create</div></a>
562
+ <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-globe"></i><div class='caption'>Discover</div></a>
563
+ </div>
564
+ <a href="/" class='tab'><i class='fas fa-laptop-code'></i><div class='caption'>This machine</div></a>
565
+ <a href="/network" class='tab'><i class="fa-solid fa-wifi"></i><div class='caption'>Local network</div></a>
566
+ <% if (list.length > 0) { %>
567
+ <% let brands = { win32: "windows", darwin: "apple", linux: "Linux" } %>
568
+ <% list.forEach(({ host, name, platform, processes }, index) => { %>
569
+ <a href="/net/<%=name%>" class='submenu tab'><i class="fa-brands fa-<%=brands[platform]%>"></i><div class='caption'><%=name%> (<%=current_host === host ? 'this machine' : host%>)</div></a>
570
+ <% }) %>
571
+ <% } %>
572
+ <a href="/connect" class='tab'><i class="fa-solid fa-plug"></i><div class='caption'>Login</div></a>
573
+ <a class='tab' href="<%=portal%>" target="_blank"><i class="fa-solid fa-question"></i><div class='caption'>Help</div></a>
574
+ <a class='tab' id='genlog'><i class="fa-solid fa-laptop-code"></i><div class='caption'>Logs</div></a>
575
+ <a id='downloadlogs' download class='hidden btn2' href="/pinokio/logs.zip"><i class="fa-solid fa-download"></i><div class='caption'>Download logs</div></a>
576
+ <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
577
+ <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
578
+ <a class='tab selected' href="/?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
579
+ </aside>
443
580
  </main>
444
581
  <script>
445
582
  document.addEventListener("DOMContentLoaded", async () => {
@@ -109,6 +109,12 @@ body {
109
109
  .timestamp {
110
110
  color: rgba(0,0,0,0.5);
111
111
  }
112
+ @media only screen and (max-width: 800px) {
113
+ body {
114
+ display: flex !important;
115
+ flex-direction: row !important;
116
+ }
117
+ }
112
118
  </style>
113
119
  <script src="/hotkeys.min.js"></script>
114
120
  <script src="/sweetalert2.js"></script>
@@ -129,15 +135,51 @@ body {
129
135
  <header class='grabbable'>
130
136
  <h1>
131
137
  <a class='path' href="/"><%-logo%></a>
138
+ <button class='btn2' id='screenshot' data-tippy-content="take a screenshot"><i class="fa-solid fa-camera"></i></button>
132
139
  <div class='flexible'></div>
133
- <div class='nav-btns'>
134
- <button class='btn2' id='report'><div><i class="fa-solid fa-bug"></i></div><div>Report Bug</div></button>
135
- <a class='btn2' href='https://discord.gg/TQdNwadtE4' target="_blank"><div><i class="fa-brands fa-discord"></i></div><div>Discord</div></a>
136
- <a class='btn2' href='https://twitter.com/cocktailpeanut' target="_blank"><div><i class="fa-brands fa-twitter"></i></div><div>Twitter</div></a>
137
- <a class='btn2' href="/?mode=settings"><div><i class="fa-solid fa-gear"></i></div><div>Settings</div></a>
138
- <button id='new-window' title='open a new window' class='btn2' data-agent="<%=agent%>"><div><i class="fa-solid fa-plus"></i></div><div>Window</div></button>
140
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
141
+ <div><i class="fa-solid fa-table-columns"></i></div>
142
+ </a>
143
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
144
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
145
+ </a>
146
+ <div class="dropdown btn2">
147
+ <button class='btn2' id='window-management'>
148
+ <div><i class="fa-solid fa-plus"></i></div>
149
+ </button>
150
+ <div class="dropdown-content" id="dropdown-content">
151
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
152
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
153
+ </button>
154
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
155
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
156
+ </button>
157
+ </div>
139
158
  </div>
140
- </h1>
159
+ <!--
160
+ <div class="dropdown btn2">
161
+ <button class='btn2' id='window-management'>
162
+ <div><i class="fa-regular fa-window-restore"></i></div>
163
+ </button>
164
+ <div class="dropdown-content" id="dropdown-content">
165
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
166
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
167
+ </button>
168
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
169
+ <div><i class="fa-solid fa-table-columns"></i><div>split columns</div></div>
170
+ </a>
171
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
172
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i><div>split rows</div></div>
173
+ </a>
174
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
175
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
176
+ </button>
177
+ </div>
178
+ </div>
179
+ -->
180
+ <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
181
+ <div><i class="fa-solid fa-xmark"></i></div>
182
+ </button>
141
183
  </h1>
142
184
  </header>
143
185
  <% if (requirements_pending) { %>
@@ -152,18 +152,51 @@ body.dark .card {
152
152
  <header class='grabbable'>
153
153
  <h1>
154
154
  <a class='path' href="/"><%-logo%></a>
155
+ <button class='btn2' id='screenshot' data-tippy-content="take a screenshot"><i class="fa-solid fa-camera"></i></button>
155
156
  <div class='flexible'></div>
156
- <div class='nav-btns'>
157
- <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
158
- <% if (agent === "electron") { %>
159
- <a class='btn2' data-filepath="<%=filepath%>"><div><i class="fa-regular fa-folder-open"></i></div><div>Files</div></a>
160
- <% } %>
161
- <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
162
- <a id='downloadlogs' download class='hidden btn2' href="/pinokio/logs.zip"><div><i class="fa-solid fa-download"></i></div><div>Download logs</div></a>
163
- <a class='btn2' href="/?mode=settings"><div><i class="fa-solid fa-gear"></i></div><div>Settings</div></a>
164
- <button id='new-window' title='open a new window' class='btn2' data-agent="<%=agent%>"><div><i class="fa-solid fa-plus"></i></div><div>Window</div></button>
165
-
157
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
158
+ <div><i class="fa-solid fa-table-columns"></i></div>
159
+ </a>
160
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
161
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
162
+ </a>
163
+ <div class="dropdown btn2">
164
+ <button class='btn2' id='window-management'>
165
+ <div><i class="fa-solid fa-plus"></i></div>
166
+ </button>
167
+ <div class="dropdown-content" id="dropdown-content">
168
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
169
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
170
+ </button>
171
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
172
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
173
+ </button>
174
+ </div>
175
+ </div>
176
+ <!--
177
+ <div class="dropdown btn2">
178
+ <button class='btn2' id='window-management'>
179
+ <div><i class="fa-regular fa-window-restore"></i></div>
180
+ </button>
181
+ <div class="dropdown-content" id="dropdown-content">
182
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
183
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
184
+ </button>
185
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
186
+ <div><i class="fa-solid fa-table-columns"></i><div>split columns</div></div>
187
+ </a>
188
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
189
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i><div>split rows</div></div>
190
+ </a>
191
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
192
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
193
+ </button>
194
+ </div>
166
195
  </div>
196
+ -->
197
+ <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
198
+ <div><i class="fa-solid fa-xmark"></i></div>
199
+ </button>
167
200
  </h1>
168
201
  </h1>
169
202
  </header>
@@ -111,6 +111,9 @@ header {
111
111
  .navheader {
112
112
  padding-bottom: 0;
113
113
  }
114
+ .navheader h1 {
115
+ align-items: center;
116
+ }
114
117
  /*
115
118
  .navheader {
116
119
  background: var(--dark-bg);
@@ -135,6 +138,9 @@ body.frozen {
135
138
  padding: 0;
136
139
  }
137
140
  #status-window {
141
+ display: flex;
142
+ align-items: center;
143
+ font-size: 14px;
138
144
  /*
139
145
  flex-grow: 1;
140
146
  text-align: right;
@@ -721,7 +727,7 @@ document.addEventListener("DOMContentLoaded", async () => {
721
727
  //key: "\x1b[200~" + text + "\x1b[201~",
722
728
  key: text,
723
729
  id: shell_id,
724
- paste: true
730
+ // paste: true
725
731
  })
726
732
 
727
733
  })
@@ -224,17 +224,22 @@ footer .btn.go-home {
224
224
  <main>
225
225
  <div>
226
226
  <div class='card'>
227
- <img src="<%=image%>">
227
+ <img src="<%=image%>" onerror="this.src='/pinokio-black.png'"/>
228
228
  <div class='title'><%=name%></div>
229
- <% if (link) { %>
230
- <a href="<%=link%>" id='save' class='btn'>
231
- <span class='save'><i class="fa-solid fa-play"></i> Launch</span>
232
- </a>
229
+ <% if (launchable) { %>
230
+ <% if (link) { %>
231
+ <a href="<%=link%>" id='save' class='btn'>
232
+ <span class='save'><i class="fa-solid fa-play"></i> Launch</span>
233
+ </a>
234
+ <% } %>
235
+ <div class='auto'>
236
+ <input type='checkbox' <%=autolaunch ? 'checked' : ''%> id='autolaunch' />
237
+ <label for='autolaunch'>automatically launch</label>
238
+ </div>
239
+ <% } else { %>
240
+ <h1>Offline</h1>
241
+ <div><%=url%> is not running.</div>
233
242
  <% } %>
234
- <div class='auto'>
235
- <input type='checkbox' <%=autolaunch ? 'checked' : ''%> id='autolaunch' />
236
- <label for='autolaunch'>automatically launch</label>
237
- </div>
238
243
  <div class='message'></div>
239
244
  </div>
240
245
  </div>
@@ -16,6 +16,7 @@
16
16
  <script src="/common.js"></script>
17
17
  <script src="/he.js"></script>
18
18
  <script src="/opener.js"></script>
19
+ <script src="/loading.js"></script>
19
20
  <!--
20
21
  <script src="/nav.js"></script>
21
22
  -->
@@ -325,7 +326,6 @@ document.addEventListener("DOMContentLoaded", async () => {
325
326
  document.querySelector(".run .starting").classList.add("hidden")
326
327
  document.querySelector(".run .stop").classList.remove("hidden")
327
328
  } else if (packet.type === 'disconnect') {
328
- debugger
329
329
  refreshParent(packet)
330
330
  reloadMemory()
331
331
  this.term.write("\r\nDisconnected...\r\n")
@@ -333,7 +333,6 @@ document.addEventListener("DOMContentLoaded", async () => {
333
333
  this.socket.close()
334
334
  document.querySelector(".run .play").classList.remove("hidden")
335
335
  document.querySelector(".run .stop").classList.add("hidden")
336
- debugger
337
336
 
338
337
  <% if (kill_message) { %>
339
338
  n.Noty({
@@ -465,6 +464,18 @@ document.addEventListener("DOMContentLoaded", async () => {
465
464
  //uri: "~" + location.pathname,
466
465
  uri: packet.id
467
466
  })
467
+ } else if (packet.type === "loading.start") {
468
+ LoadingDialog.start(packet.data.message)
469
+ this.socket.respond({
470
+ response: {},
471
+ uri: packet.id
472
+ })
473
+ } else if (packet.type === "loading.end") {
474
+ LoadingDialog.end()
475
+ this.socket.respond({
476
+ response: {},
477
+ uri: packet.id
478
+ })
468
479
  } else if (packet.type === "input") {
469
480
  let params = packet.data
470
481
  let type = (params.type ? params.type : "modal")