pinokiod 3.192.0 → 3.193.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.
- package/package.json +1 -1
- package/server/views/shell.ejs +45 -14
- package/server/views/terminal.ejs +45 -14
package/package.json
CHANGED
package/server/views/shell.ejs
CHANGED
|
@@ -1163,6 +1163,20 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1163
1163
|
dropOverlay.className = "terminal-drop-overlay"
|
|
1164
1164
|
dropOverlay.textContent = "Drop files to upload"
|
|
1165
1165
|
terminalContainer.appendChild(dropOverlay)
|
|
1166
|
+
const filterUniqueResources = (urls) => {
|
|
1167
|
+
const seen = new Set()
|
|
1168
|
+
return (Array.isArray(urls) ? urls : []).filter((item) => {
|
|
1169
|
+
if (!item || typeof item.href !== "string") {
|
|
1170
|
+
return false
|
|
1171
|
+
}
|
|
1172
|
+
const key = item.href.trim()
|
|
1173
|
+
if (!key || seen.has(key)) {
|
|
1174
|
+
return false
|
|
1175
|
+
}
|
|
1176
|
+
seen.add(key)
|
|
1177
|
+
return true
|
|
1178
|
+
})
|
|
1179
|
+
}
|
|
1166
1180
|
let dragDepth = 0
|
|
1167
1181
|
const prevent = (event) => {
|
|
1168
1182
|
event.preventDefault()
|
|
@@ -1189,20 +1203,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1189
1203
|
let remoteResources = []
|
|
1190
1204
|
try {
|
|
1191
1205
|
const extra = await this.collectFilesFromDataTransfer(event.dataTransfer)
|
|
1192
|
-
|
|
1193
|
-
const seenUrls = new Set()
|
|
1194
|
-
remoteResources = extra.urls.filter((item) => {
|
|
1195
|
-
if (!item || typeof item.href !== "string") {
|
|
1196
|
-
return false
|
|
1197
|
-
}
|
|
1198
|
-
const key = item.href.trim()
|
|
1199
|
-
if (!key || seenUrls.has(key)) {
|
|
1200
|
-
return false
|
|
1201
|
-
}
|
|
1202
|
-
seenUrls.add(key)
|
|
1203
|
-
return true
|
|
1204
|
-
})
|
|
1205
|
-
}
|
|
1206
|
+
remoteResources = filterUniqueResources(extra && extra.urls)
|
|
1206
1207
|
} catch (error) {
|
|
1207
1208
|
console.warn("Failed to collect files from drop payload", error)
|
|
1208
1209
|
}
|
|
@@ -1221,6 +1222,36 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1221
1222
|
}
|
|
1222
1223
|
this.term.focus()
|
|
1223
1224
|
})
|
|
1225
|
+
terminalContainer.addEventListener("paste", async (event) => {
|
|
1226
|
+
const clipboard = event.clipboardData || window.clipboardData || null
|
|
1227
|
+
if (!clipboard) {
|
|
1228
|
+
return
|
|
1229
|
+
}
|
|
1230
|
+
const files = Array.from(clipboard.files || [])
|
|
1231
|
+
let remoteResources = []
|
|
1232
|
+
try {
|
|
1233
|
+
const extra = await this.collectFilesFromDataTransfer(clipboard)
|
|
1234
|
+
remoteResources = filterUniqueResources(extra && extra.urls)
|
|
1235
|
+
} catch (error) {
|
|
1236
|
+
console.warn("Failed to collect clipboard resources", error)
|
|
1237
|
+
}
|
|
1238
|
+
if (!files.length && (!remoteResources || remoteResources.length === 0)) {
|
|
1239
|
+
return
|
|
1240
|
+
}
|
|
1241
|
+
event.preventDefault()
|
|
1242
|
+
event.stopPropagation()
|
|
1243
|
+
try {
|
|
1244
|
+
if (remoteResources && remoteResources.length > 0) {
|
|
1245
|
+
await this.uploadRemoteResources(remoteResources, dropOverlay)
|
|
1246
|
+
}
|
|
1247
|
+
} catch (error) {
|
|
1248
|
+
console.warn("Clipboard remote upload failed", error)
|
|
1249
|
+
}
|
|
1250
|
+
if (files.length > 0) {
|
|
1251
|
+
await this.uploadFiles(files, dropOverlay)
|
|
1252
|
+
}
|
|
1253
|
+
this.term.focus()
|
|
1254
|
+
})
|
|
1224
1255
|
term.attachCustomKeyEventHandler(event => {
|
|
1225
1256
|
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
|
|
1226
1257
|
const selection = term.getSelection();
|
|
@@ -1256,6 +1256,20 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1256
1256
|
dropOverlay.className = "terminal-drop-overlay"
|
|
1257
1257
|
dropOverlay.textContent = "Drop files to upload"
|
|
1258
1258
|
terminalContainer.appendChild(dropOverlay)
|
|
1259
|
+
const filterUniqueResources = (urls) => {
|
|
1260
|
+
const seen = new Set()
|
|
1261
|
+
return (Array.isArray(urls) ? urls : []).filter((item) => {
|
|
1262
|
+
if (!item || typeof item.href !== "string") {
|
|
1263
|
+
return false
|
|
1264
|
+
}
|
|
1265
|
+
const key = item.href.trim()
|
|
1266
|
+
if (!key || seen.has(key)) {
|
|
1267
|
+
return false
|
|
1268
|
+
}
|
|
1269
|
+
seen.add(key)
|
|
1270
|
+
return true
|
|
1271
|
+
})
|
|
1272
|
+
}
|
|
1259
1273
|
let dragDepth = 0
|
|
1260
1274
|
const prevent = (event) => {
|
|
1261
1275
|
event.preventDefault()
|
|
@@ -1282,20 +1296,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1282
1296
|
let remoteResources = []
|
|
1283
1297
|
try {
|
|
1284
1298
|
const extra = await this.collectFilesFromDataTransfer(event.dataTransfer)
|
|
1285
|
-
|
|
1286
|
-
const seenUrls = new Set()
|
|
1287
|
-
remoteResources = extra.urls.filter((item) => {
|
|
1288
|
-
if (!item || typeof item.href !== "string") {
|
|
1289
|
-
return false
|
|
1290
|
-
}
|
|
1291
|
-
const key = item.href.trim()
|
|
1292
|
-
if (!key || seenUrls.has(key)) {
|
|
1293
|
-
return false
|
|
1294
|
-
}
|
|
1295
|
-
seenUrls.add(key)
|
|
1296
|
-
return true
|
|
1297
|
-
})
|
|
1298
|
-
}
|
|
1299
|
+
remoteResources = filterUniqueResources(extra && extra.urls)
|
|
1299
1300
|
} catch (error) {
|
|
1300
1301
|
console.warn("Failed to collect files from drop payload", error)
|
|
1301
1302
|
}
|
|
@@ -1318,6 +1319,36 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1318
1319
|
}
|
|
1319
1320
|
this.term.focus()
|
|
1320
1321
|
})
|
|
1322
|
+
terminalContainer.addEventListener("paste", async (event) => {
|
|
1323
|
+
const clipboard = event.clipboardData || window.clipboardData || null
|
|
1324
|
+
if (!clipboard) {
|
|
1325
|
+
return
|
|
1326
|
+
}
|
|
1327
|
+
const files = Array.from(clipboard.files || [])
|
|
1328
|
+
let remoteResources = []
|
|
1329
|
+
try {
|
|
1330
|
+
const extra = await this.collectFilesFromDataTransfer(clipboard)
|
|
1331
|
+
remoteResources = filterUniqueResources(extra && extra.urls)
|
|
1332
|
+
} catch (error) {
|
|
1333
|
+
console.warn("Failed to collect clipboard resources", error)
|
|
1334
|
+
}
|
|
1335
|
+
if (!files.length && (!remoteResources || remoteResources.length === 0)) {
|
|
1336
|
+
return
|
|
1337
|
+
}
|
|
1338
|
+
event.preventDefault()
|
|
1339
|
+
event.stopPropagation()
|
|
1340
|
+
try {
|
|
1341
|
+
if (remoteResources && remoteResources.length > 0) {
|
|
1342
|
+
await this.uploadRemoteResources(remoteResources, dropOverlay)
|
|
1343
|
+
}
|
|
1344
|
+
} catch (error) {
|
|
1345
|
+
console.warn("Clipboard remote upload failed", error)
|
|
1346
|
+
}
|
|
1347
|
+
if (files.length > 0) {
|
|
1348
|
+
await this.uploadFiles(files, dropOverlay)
|
|
1349
|
+
}
|
|
1350
|
+
this.term.focus()
|
|
1351
|
+
})
|
|
1321
1352
|
term.attachCustomKeyEventHandler(event => {
|
|
1322
1353
|
if ((event.ctrlKey || event.metaKey) && event.key === 'c') {
|
|
1323
1354
|
const selection = term.getSelection();
|