pinokiod 1.3.60 → 1.3.62

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.
@@ -263,6 +263,14 @@ body.dark .frame-link.selected {
263
263
  padding: 5px;
264
264
  */
265
265
  }
266
+ .loader .btn:hover {
267
+ color: royalblue;
268
+ border-color: royalblue;
269
+ }
270
+ .loader .btn {
271
+ padding: 4px 8px;
272
+ border: 1px solid rgba(255,255,255,0.3);
273
+ }
266
274
  .frame-link .tab {
267
275
  flex-grow: 1;
268
276
  /*
@@ -342,9 +350,16 @@ body.dark nav {
342
350
  }
343
351
  .container:hover nav {
344
352
  display: block;
353
+ max-height: 200px;
345
354
  }
346
355
  nav {
356
+ overflow: hidden;
357
+ max-height: 0;
358
+ transition: max-height 0.4s ease-out;
359
+
360
+ /*
347
361
  display: none;
362
+ */
348
363
  background: white;
349
364
  /*
350
365
  position: absolute;
@@ -536,6 +551,9 @@ body.dark .loader-container {
536
551
  <a target="<%=src%>" href="<%=src%>" class='btn header-item frame-link' data-index="0">
537
552
  <div class='tab'><i class="fa-regular fa-folder-open"></i> Files</div>
538
553
  </a>
554
+ <a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="1">
555
+ <div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
556
+ </a>
539
557
  </div>
540
558
  <div class='m h menu' data-type='h'>
541
559
  <% if (config.menu) { %>
@@ -601,7 +619,7 @@ body.dark .loader-container {
601
619
  <button class='btn2' id='clone-tab'><i class='fa-regular fa-copy'></i> Clone</button>
602
620
  <a class='btn2' id='open-browser' target="_blank" href="" features="browser"><i class="fa-solid fa-square-arrow-up-right"></i> Popout</a>
603
621
  <button class='btn2' id='reload'><i class="fa-solid fa-rotate-right"></i> Refresh</button>
604
- <div id='new-tab' class='btn2'><i class="fa-solid fa-plus"></i> New</div>
622
+ <div id='new-tab' class='btn2'><i class="fa-solid fa-plus"></i> Tab</div>
605
623
  <!--
606
624
  <button class='btn2 logo' id='reload'><i class="fa-solid fa-rotate-right"></i></button>
607
625
  -->
@@ -713,7 +731,10 @@ const nav = (type) => {
713
731
  const renderSelection = (e, force) => {
714
732
  console.log("# 1")
715
733
  // if the menu has a default item, or if the url specifies a selection
716
- let selection = document.querySelector("[data-default]")
734
+ let selection = null;
735
+ <% if (type === "run" && env.PINOKIO_SCRIPT_DEFAULT && env.PINOKIO_SCRIPT_DEFAULT.toString().toLowerCase() === "true") { %>
736
+ selection = document.querySelector("[data-default]")
737
+ <% } %>
717
738
  if (selection || location.hash && location.hash.length > 0) {
718
739
  console.log("# 2")
719
740
 
@@ -923,6 +944,9 @@ const renderSelection = (e, force) => {
923
944
  targetFrame.src = target.href
924
945
  }
925
946
  }
947
+ targetFrame.contentWindow.postMessage({
948
+ action: "foreground"
949
+ }, "*")
926
950
  }
927
951
  } else {
928
952
  console.log("# 12")
@@ -1248,8 +1272,11 @@ document.querySelector("aside").addEventListener("click", async (e) => {
1248
1272
  e.stopPropagation()
1249
1273
  let link = target.closest("[href]")
1250
1274
  let src = new URL(link.href).pathname
1275
+ n.Noty({
1276
+ text: `stopping ${src}`,
1277
+ silent: true
1278
+ })
1251
1279
  console.log("src", src)
1252
- debugger
1253
1280
 
1254
1281
  let socket = new Socket()
1255
1282
  socket.run({
@@ -1262,7 +1289,7 @@ document.querySelector("aside").addEventListener("click", async (e) => {
1262
1289
  if (packet.type === "result") {
1263
1290
  socket.close()
1264
1291
  n.Noty({
1265
- text: `stopped ${src}`,
1292
+ text: `stopped`,
1266
1293
  silent: true
1267
1294
  })
1268
1295
  refresh(true)
@@ -0,0 +1,184 @@
1
+ <html class='columns'>
2
+ <head>
3
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
4
+ <script src="/hotkeys.min.js"></script>
5
+ <script src="/ace/ace.js"></script>
6
+ <script src="/noty.js"></script>
7
+ <script src="/notyq.js"></script>
8
+ <script src="/xterm.js"></script>
9
+ <script src="/xterm-addon-fit.js"></script>
10
+ <script src="/xterm-addon-web-links.js"></script>
11
+ <script src="/xterm-theme.js"></script>
12
+ <script src="/xterm-addon-search.js"></script>
13
+ <script src="/xterm-addon-search-bar.js"></script>
14
+ <script src="/sweetalert2.js"></script>
15
+ <script src="/Socket.js"></script>
16
+ <script src="/common.js"></script>
17
+ <script src="/he.js"></script>
18
+ <script src="/opener.js"></script>
19
+ <script src="/nav.js"></script>
20
+ <script src="/autoexpand.js"></script>
21
+ <script src="/modalinput.js"></script>
22
+ <script src="/simplemodal.js"></script>
23
+ <script src="/waitmodal.js"></script>
24
+ <script src="/notifyinput.js"></script>
25
+ <script src="/report.js"></script>
26
+ <link href="/xterm.min.css" rel="stylesheet" />
27
+ <link href="/css/fontawesome.min.css" rel="stylesheet">
28
+ <link href="/css/solid.min.css" rel="stylesheet">
29
+ <link href="/css/regular.min.css" rel="stylesheet">
30
+ <link href="/css/brands.min.css" rel="stylesheet">
31
+ <link href="/style.css" rel="stylesheet"/>
32
+ <link href="/noty.css" rel="stylesheet"/>
33
+ <% if (agent === "electron") { %>
34
+ <link href="/electron.css" rel="stylesheet"/>
35
+ <% } %>
36
+ <style>
37
+ body.frozen {
38
+ display: flex;
39
+ flex-direction: column;
40
+ height: 100%;
41
+ }
42
+ #table > table {
43
+ border-left: 2px solid black;
44
+ padding-left: 5px;
45
+ margin: 10px 0;
46
+ }
47
+ .highlight {
48
+ background: yellow;
49
+ width: 100px;
50
+ }
51
+ th {
52
+ background: rgba(0,0,0,0.1);
53
+ padding: 10px;
54
+ font-size: 12px;
55
+ }
56
+ td {
57
+ font-size: 12px;
58
+ padding: 10px;
59
+ }
60
+ td.val {
61
+ background: rgba(0,0,0,0.06);
62
+ }
63
+ td.key {
64
+ background: rgba(0,0,0,0.1);
65
+ }
66
+ .button {
67
+ cursor: pointer;
68
+ background: rgba(0,0,0,0.8);
69
+ color: white;
70
+ padding: 5px 10px;
71
+ border-radius: 4px;
72
+ }
73
+ .button:hover {
74
+
75
+ }
76
+ #editor {
77
+ box-sizing: border-box;
78
+ max-width: 800px;
79
+ padding: 20px;
80
+ }
81
+ header .runner {
82
+ padding: 10px 0 0;
83
+ }
84
+ .disabled {
85
+ opacity: 0.7;
86
+ }
87
+ body.dark .env-item input[type=text] {
88
+ background: white;
89
+ }
90
+ .env-item input[type=text] {
91
+ width: 100%;
92
+ padding: 10px;
93
+ box-sizing: border-box;
94
+ border: none;
95
+ background: rgba(0,0,100, 0.1);
96
+ }
97
+ body.dark .env-item label {
98
+ color: cornflowerblue;
99
+ }
100
+ .env-item label {
101
+ color: royalblue;
102
+ display: block;
103
+ margin-bottom: 5px;
104
+ font-weight: bold;
105
+ font-size: 18px;
106
+ }
107
+ .env-item {
108
+ padding-top: 10px;
109
+ padding-bottom: 30px;
110
+ }
111
+ body.dark .comment {
112
+ border-left: 2px solid white;
113
+ }
114
+ .comment {
115
+ opacity: 0.8;
116
+ border-left: 2px solid black;
117
+ padding-left: 10px;
118
+ }
119
+ #save {
120
+ background: royalblue;
121
+ }
122
+ </style>
123
+ <script>
124
+ document.addEventListener("DOMContentLoaded", async () => {
125
+ const n = new N()
126
+ document.querySelector("#save").addEventListener("click", async (e) => {
127
+ // save
128
+ const vals = {}
129
+ const els = document.querySelectorAll(".env-item")
130
+ for(let el of els) {
131
+ let input = el.querySelector("input[type=text]")
132
+ vals[input.id] = input.value
133
+ }
134
+ console.log("vals", vals)
135
+ let res = await fetch("/env", {
136
+ method: "POST",
137
+ headers: {
138
+ "Content-Type": "application/json"
139
+ },
140
+ body: JSON.stringify({
141
+ filepath: location.pathname.slice(5),
142
+ vals
143
+ })
144
+ }).then((res) => {
145
+ return res.json()
146
+ })
147
+ console.log("res" ,res)
148
+ n.Noty({
149
+ text: `Updated!`
150
+ })
151
+ })
152
+ })
153
+ </script>
154
+ </head>
155
+ <body class='columns <%=theme%>'>
156
+ <header class='navheader grabbable'>
157
+ <h1>
158
+ <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
159
+ <%=filepath%>
160
+ </h1>
161
+ <div class='runner'>
162
+ <div id='save' class='btn'>
163
+ <span class='save'><i class="fa-solid fa-check"></i> Save</span>
164
+ </div>
165
+ <a class='btn' href="<%=editorpath%>"><i class="fa-solid fa-pen-to-square"></i> Edit file</a>
166
+ <button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> Open in File Explorer</button>
167
+ </div>
168
+ </header>
169
+ <main>
170
+ <div id='editor'>
171
+ <% items.forEach((item) => { %>
172
+ <% if (item.type === "comment") { %>
173
+ <div class='comment'><%=item.val.replaceAll(/^[ #]+/g, "")%></div>
174
+ <% } else { %>
175
+ <div class='env-item'>
176
+ <label for="<%=item.key%>"><%=item.key%></label>
177
+ <input id="<%=item.key%>" type="text" value="<%=item.val%>">
178
+ </div>
179
+ <% } %>
180
+ <% }) %>
181
+ </div>
182
+ </main>
183
+ </body>
184
+ </html>
@@ -139,6 +139,10 @@ document.addEventListener("DOMContentLoaded", async () => {
139
139
  constructor() {
140
140
  this.socket = new Socket()
141
141
  }
142
+ write(text) {
143
+ this.term.write(text)
144
+ this.dirty = true
145
+ }
142
146
  finished() {
143
147
  /*
144
148
  n.Noty({
@@ -201,7 +205,11 @@ document.addEventListener("DOMContentLoaded", async () => {
201
205
  rows: this.term.rows,
202
206
  }
203
207
  }, async (packet) => {
204
- // console.log("packet", packet)
208
+
209
+ console.log("packet", packet.type, packet)
210
+ if (packet.data) {
211
+ console.log("packet.data.raw", packet.data.raw)
212
+ }
205
213
  if (packet.type === 'start') {
206
214
  refreshParent(packet)
207
215
  reloadMemory()
@@ -233,14 +241,15 @@ document.addEventListener("DOMContentLoaded", async () => {
233
241
  // </div>`
234
242
  }
235
243
  } else if (packet.type === "stream") {
244
+ console.log({ cols: this.term.cols, rows: this.term.rows })
236
245
  if (packet.data.raw) {
237
- this.term.write(packet.data.raw)
246
+ this.write(packet.data.raw)
238
247
  } else if (packet.data.json) {
239
- this.term.write(JSON.stringify(packet.data.json).replace(/\n/g, "\r\n"))
240
- this.term.write("\r\n")
248
+ this.write(JSON.stringify(packet.data.json).replace(/\n/g, "\r\n"))
249
+ this.write("\r\n")
241
250
  } else if (packet.data.json2) {
242
- this.term.write(JSON.stringify(packet.data.json2, null, 2).replace(/\n/g, "\r\n"))
243
- this.term.write("\r\n")
251
+ this.write(JSON.stringify(packet.data.json2, null, 2).replace(/\n/g, "\r\n"))
252
+ this.write("\r\n")
244
253
  }
245
254
  document.querySelector(".run .play").classList.add("hidden")
246
255
  document.querySelector(".run .starting").classList.add("hidden")
@@ -248,14 +257,14 @@ document.addEventListener("DOMContentLoaded", async () => {
248
257
  } else if (packet.type === 'disconnect') {
249
258
  refreshParent(packet)
250
259
  reloadMemory()
251
- this.term.write("\r\nDisconnected...\r\n")
260
+ //this.term.write("\r\nDisconnected...\r\n")
252
261
  document.querySelector("footer").innerHTML = "<b>Ready</b>"
253
262
  this.socket.close()
254
263
  document.querySelector(".run .play").classList.remove("hidden")
255
264
  document.querySelector(".run .stop").classList.add("hidden")
256
265
  } else if (packet.type === 'connect') {
257
266
  const message = "..........Connected!\r\n"
258
- this.term.write(message)
267
+ this.write(message)
259
268
  /*
260
269
  for(let i=0; i<message.length; i++) {
261
270
  await new Promise((r, reject) => {
@@ -527,6 +536,7 @@ document.addEventListener("DOMContentLoaded", async () => {
527
536
  createTerm () {
528
537
  if (!this.term) {
529
538
  const term = new Terminal({
539
+ scrollback: 9999999,
530
540
  //theme: xtermTheme.Piatto_Light,
531
541
  //theme: xtermTheme.Spring,
532
542
 
@@ -597,6 +607,41 @@ document.addEventListener("DOMContentLoaded", async () => {
597
607
  <% if (mod && runnable) { %>
598
608
  window.addEventListener('message', function(event) {
599
609
  console.log("Message received from the parent: ", event.data); // Message received from parent
610
+ // "foreground" message adds a newline to the terminal
611
+ // Needed to fix the issue where the terminal won't write anything when in background
612
+ // so when coming back from background, need to refresh by just adding a newline.
613
+ if (event.data && event.data.action === "foreground") {
614
+
615
+
616
+ // if dirty, update
617
+ // if not dirty, don't update
618
+ const delimiter = "\r\n"
619
+ if (rpc.dirty) {
620
+ rpc.term.write(delimiter)
621
+ rpc.dirty = false
622
+ } else {
623
+ }
624
+
625
+ //console.log("buffer", rpc.term.buffer)
626
+ //if (rpc.term.buffer) {
627
+ // const lastRow = rpc.term.buffer.active.baseY;
628
+ // const lastLine = rpc.term.buffer.active.getLine(lastRow);
629
+ // const lastLine2 = rpc.term.buffer.active.getLine(lastRow-1);
630
+ // const cell = lastLine.getCell().getChars()
631
+ // const cell2 = lastLine.getCell().getChars()
632
+ // console.log({ lastLine, lastLine2, cell, cell2 })
633
+ // const lastStr = cell[cell.length - 3];
634
+ // console.log({ lastRow, lastLine, lastStr })
635
+
636
+ // const delimiter = "\r\n█"
637
+ // if (lastStr === delimiter) {
638
+ // console.log("don't update")
639
+ // } else {
640
+ // console.log("update")
641
+ // rpc.term.write(delimiter)
642
+ // }
643
+ //}
644
+ }
600
645
  });
601
646
 
602
647
  document.querySelector(".stop").addEventListener("click", async (e) => {
@@ -146,9 +146,9 @@ document.addEventListener("DOMContentLoaded", async () => {
146
146
  this.socket.close()
147
147
  this.socket.run({
148
148
  method: "fs.write",
149
- cwd: "{{kernel.homedir}}",
149
+ //cwd: "{{kernel.homedir}}",
150
150
  params: {
151
- path: filepath,
151
+ path: `{{path.resolve(kernel.homedir, "${filepath}")}}`,
152
152
  text: str,
153
153
  }
154
154
  }, (packet) => {
@@ -146,6 +146,10 @@ body.dark .item select {
146
146
  padding: 10px 20px;
147
147
  text-align: center;
148
148
  }
149
+ body.dark .btn {
150
+ color: white;
151
+ border: 1px solid rgba(255,255,255,0.3) !important;
152
+ }
149
153
  body.light {
150
154
  /*
151
155
  background: var(--light-nav-bg);
@@ -112,13 +112,7 @@ a.badge {
112
112
  }
113
113
  body.dark .btn {
114
114
  color: white;
115
- /*
116
- color: cornflowerblue;
117
- */
118
115
  border: 1px solid rgba(255,255,255,0.3);
119
- /*
120
- border: 1px solid rgba(100, 149, 237, 0.3);
121
- */
122
116
  }
123
117
  body.dark .badge {
124
118
  background: rgba(255,255,255,0.1);
@@ -288,16 +282,19 @@ body.dark .browser-options-row {
288
282
  <div class='uri'><i class="fa-regular fa-folder"></i><%=item.url%></div>
289
283
  <div class='title'><%=item.name%></div>
290
284
  <div class='description'><%=item.description%></div>
291
- <% if (item.running_scripts) { %>
292
- <% item.running_scripts.forEach((s) => { %>
293
- <div>
294
- <button class='btn shutdown' data-src="<%=s.path%>">
295
- <i class="fa-solid fa-stop"></i> Stop <%=s.name%>&nbsp;
296
- <i class='fa-solid fa-spin fa-circle-notch'></i>
297
- </button>
298
- </div>
299
- <% }) %>
300
- <% } %>
285
+ <div>
286
+ <button class='btn browse' data-src="<%=item.browser_url%>/browse">
287
+ <i class="fa-regular fa-folder-open"></i>
288
+ </button>
289
+ <% if (item.running_scripts) { %>
290
+ <% item.running_scripts.forEach((s) => { %>
291
+ <button class='btn shutdown' data-src="<%=s.path%>">
292
+ <i class="fa-solid fa-stop"></i> Stop <%=s.name%>&nbsp;
293
+ <i class='fa-solid fa-spin fa-circle-notch'></i>
294
+ </button>
295
+ <% }) %>
296
+ <% } %>
297
+ </div>
301
298
  <% if (item.shortcuts && item.shortcuts.length > 0) { %>
302
299
  <div class='btns'>
303
300
  <% item.shortcuts.forEach((btn) => { %>
@@ -336,6 +333,9 @@ body.dark .browser-options-row {
336
333
  <div class='uri'><i class="fa-regular fa-folder"></i><%=item.url%></div>
337
334
  <div class='title'><%=item.name%></div>
338
335
  <div class='description'><%=item.description%></div>
336
+ <button class='btn browse' data-src="<%=item.browser_url%>/browse">
337
+ <i class="fa-regular fa-folder-open"></i>
338
+ </button>
339
339
  <% if (item.shortcuts && item.shortcuts.length > 0) { %>
340
340
  <div class='btns'>
341
341
  <% item.shortcuts.forEach((btn) => { %>
@@ -346,6 +346,9 @@ body.dark .browser-options-row {
346
346
  </div>
347
347
  <% } %>
348
348
  </div>
349
+ <div class='spinner'>
350
+ <i class="fa-solid fa-chevron-right"></i>
351
+ </div>
349
352
  </h3>
350
353
  </a>
351
354
  <% }) %>
@@ -729,7 +732,6 @@ document.addEventListener("click", (e) => {
729
732
  e.stopPropagation()
730
733
  let src = target.getAttribute("data-src")
731
734
  console.log("src", src)
732
- debugger
733
735
 
734
736
  socket.run({
735
737
  method: "kernel.api.stop",
@@ -756,6 +758,20 @@ document.addEventListener("click", (e) => {
756
758
  }
757
759
 
758
760
 
761
+ if (e.target.classList.contains("browse")) {
762
+ target = e.target
763
+ } else {
764
+ target = e.target.closest(".browse")
765
+ }
766
+ if (target) {
767
+ e.preventDefault()
768
+ e.stopPropagation()
769
+ let src = target.getAttribute("data-src")
770
+ location.href = src
771
+ return
772
+ }
773
+
774
+
759
775
  if (document.querySelector(".container")) {
760
776
  document.querySelector(".container").addEventListener("click", async (e) => {
761
777
  let el = e.target.closest(".menu-btn")
@@ -766,7 +782,6 @@ document.addEventListener("click", (e) => {
766
782
  }
767
783
 
768
784
  console.log("EL", el)
769
- debugger
770
785
 
771
786
  if (el) {
772
787
  e.preventDefault()
@@ -30,7 +30,9 @@
30
30
  <i class='fa-solid fa-spin fa-circle-notch'></i>
31
31
  <i class="fa-solid fa-chevron-right"></i>
32
32
  -->
33
- <i class="fa-solid fa-xmark"></i>
33
+ <button class='btn'>
34
+ <i class="fa-solid fa-square"></i> Stop
35
+ </button>
34
36
  </div>
35
37
  <% } %>
36
38
  </a>
@@ -145,6 +145,10 @@ body.dark .item select {
145
145
  padding: 10px 20px;
146
146
  text-align: center;
147
147
  }
148
+ body.dark .btn {
149
+ color: white;
150
+ border: 1px solid rgba(255,255,255,0.3) !important;
151
+ }
148
152
  body.light {
149
153
  /*
150
154
  background: var(--light-nav-bg);
@@ -298,7 +302,7 @@ hr {
298
302
  <br>
299
303
  <div>Edit the system ENVIRONMENT file to customize pinokio system wide settings, such as where files are stored, terminal behavior, etc.</div>
300
304
  <br>
301
- <a class='btn' href="/edit/ENVIRONMENT">Edit ENVIRONMENT</a>
305
+ <a class='btn' href="/env/ENVIRONMENT"><i class="fa-regular fa-pen-to-square"></i> Edit ENVIRONMENT</a>
302
306
  </div>
303
307
  <hr/>
304
308
  <div class='troubleshoot'>