pinokiod 6.0.50 → 6.0.51
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 +26 -7
- package/package.json +1 -1
- package/server/lib/desktop_event_router.js +1 -1
- package/server/views/app.ejs +65 -14
package/kernel/api/fs/index.js
CHANGED
|
@@ -23,6 +23,30 @@ const log = (msgs, ondata) => {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
const formatBytes = (value) => {
|
|
27
|
+
const n = Number(value)
|
|
28
|
+
if (!Number.isFinite(n) || n < 0) return '?'
|
|
29
|
+
if (n === 0) return '0 B'
|
|
30
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB']
|
|
31
|
+
const i = Math.min(Math.floor(Math.log(n) / Math.log(1024)), units.length - 1)
|
|
32
|
+
const scaled = n / Math.pow(1024, i)
|
|
33
|
+
const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2
|
|
34
|
+
return `${scaled.toFixed(precision)} ${units[i]}`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const formatProgressLine = (stats = {}) => {
|
|
38
|
+
const downloaded = formatBytes(stats.downloaded)
|
|
39
|
+
const speed = formatBytes(stats.speed)
|
|
40
|
+
const hasTotal = Number.isFinite(stats.total) && stats.total > 0
|
|
41
|
+
if (!hasTotal) {
|
|
42
|
+
return `[Download] ${downloaded} (${speed}/s)`
|
|
43
|
+
}
|
|
44
|
+
const total = formatBytes(stats.total)
|
|
45
|
+
const rawProgress = Number(stats.progress)
|
|
46
|
+
const progress = Number.isFinite(rawProgress) ? Math.max(0, Math.min(100, rawProgress)) : 0
|
|
47
|
+
return `[${progress.toFixed(1)}%] ${downloaded}/${total} (${speed}/s)`
|
|
48
|
+
}
|
|
49
|
+
|
|
26
50
|
class FS {
|
|
27
51
|
async read(req, ondata, kernel) {
|
|
28
52
|
/*
|
|
@@ -608,13 +632,8 @@ class FS {
|
|
|
608
632
|
}
|
|
609
633
|
case 'progress.throttled': {
|
|
610
634
|
const stats = msg.stats || {}
|
|
611
|
-
const
|
|
612
|
-
|
|
613
|
-
let bar = ''
|
|
614
|
-
for (let i = 0; i < p; i++) bar += '#'
|
|
615
|
-
for (let i = p; i < 100; i++) bar += '-'
|
|
616
|
-
ondata({ raw: `\r${bar}` })
|
|
617
|
-
}
|
|
635
|
+
const line = formatProgressLine(stats)
|
|
636
|
+
ondata({ raw: `\r\x1b[2K${line}` })
|
|
618
637
|
break
|
|
619
638
|
}
|
|
620
639
|
case 'stall': {
|
package/package.json
CHANGED
|
@@ -267,7 +267,7 @@ const resolveDesktopEventWorkspace = async (context = {}, kernel = null) => {
|
|
|
267
267
|
const normalizeDesktopEventUi = (ui = {}) => {
|
|
268
268
|
const normalized = {}
|
|
269
269
|
const mode = typeof ui.mode === "string" ? ui.mode.trim() : ""
|
|
270
|
-
if (mode === "background" || mode === "sidebar" || mode === "overlay") {
|
|
270
|
+
if (mode === "background" || mode === "sidebar" || mode === "overlay" || mode === "bottom") {
|
|
271
271
|
normalized.mode = mode
|
|
272
272
|
} else {
|
|
273
273
|
normalized.mode = "background"
|
package/server/views/app.ejs
CHANGED
|
@@ -494,12 +494,32 @@ body.dark .ask-ai-drawer {
|
|
|
494
494
|
body.dark .ask-ai-resizer::before {
|
|
495
495
|
background: rgba(255,255,255,0.18);
|
|
496
496
|
}
|
|
497
|
-
.appcanvas.ask-ai-open .ask-ai-resizer
|
|
497
|
+
.appcanvas.ask-ai-open .ask-ai-resizer,
|
|
498
|
+
.appcanvas.event-drawer-open .ask-ai-resizer {
|
|
498
499
|
display: flex;
|
|
499
500
|
}
|
|
500
|
-
.appcanvas.ask-ai-open .ask-ai-drawer
|
|
501
|
+
.appcanvas.ask-ai-open .ask-ai-drawer,
|
|
502
|
+
.appcanvas.event-drawer-open .ask-ai-drawer,
|
|
503
|
+
.appcanvas.event-bottom-open .ask-ai-drawer {
|
|
501
504
|
display: flex;
|
|
502
505
|
}
|
|
506
|
+
.appcanvas.event-bottom-open .ask-ai-resizer {
|
|
507
|
+
display: none;
|
|
508
|
+
}
|
|
509
|
+
.appcanvas.event-bottom-open .browserview-shell {
|
|
510
|
+
flex-direction: column;
|
|
511
|
+
}
|
|
512
|
+
.appcanvas.event-bottom-open .ask-ai-drawer {
|
|
513
|
+
width: 100%;
|
|
514
|
+
min-width: 0;
|
|
515
|
+
height: var(--event-bottom-height, 280px);
|
|
516
|
+
max-height: min(60vh, 520px);
|
|
517
|
+
border-left: 0;
|
|
518
|
+
border-top: 1px solid rgba(0,0,0,0.08);
|
|
519
|
+
}
|
|
520
|
+
body.dark .appcanvas.event-bottom-open .ask-ai-drawer {
|
|
521
|
+
border-top-color: rgba(255,255,255,0.08);
|
|
522
|
+
}
|
|
503
523
|
.ask-ai-drawer-inner {
|
|
504
524
|
display: flex;
|
|
505
525
|
flex-direction: column;
|
|
@@ -4411,7 +4431,9 @@ header.navheader .mode-selector .community-mode-toggle {
|
|
|
4411
4431
|
#community-toggle {
|
|
4412
4432
|
display: none;
|
|
4413
4433
|
}
|
|
4414
|
-
.appcanvas.ask-ai-open .ask-ai-drawer
|
|
4434
|
+
.appcanvas.ask-ai-open .ask-ai-drawer,
|
|
4435
|
+
.appcanvas.event-drawer-open .ask-ai-drawer,
|
|
4436
|
+
.appcanvas.event-bottom-open .ask-ai-drawer {
|
|
4415
4437
|
display: flex;
|
|
4416
4438
|
position: fixed;
|
|
4417
4439
|
inset: 0;
|
|
@@ -4421,10 +4443,14 @@ header.navheader .mode-selector .community-mode-toggle {
|
|
|
4421
4443
|
border-left: 0;
|
|
4422
4444
|
z-index: 10000000;
|
|
4423
4445
|
}
|
|
4424
|
-
.appcanvas.ask-ai-open .ask-ai-resizer
|
|
4446
|
+
.appcanvas.ask-ai-open .ask-ai-resizer,
|
|
4447
|
+
.appcanvas.event-drawer-open .ask-ai-resizer,
|
|
4448
|
+
.appcanvas.event-bottom-open .ask-ai-resizer {
|
|
4425
4449
|
display: none;
|
|
4426
4450
|
}
|
|
4427
|
-
.appcanvas.ask-ai-open main.browserview
|
|
4451
|
+
.appcanvas.ask-ai-open main.browserview,
|
|
4452
|
+
.appcanvas.event-drawer-open main.browserview,
|
|
4453
|
+
.appcanvas.event-bottom-open main.browserview {
|
|
4428
4454
|
display: none;
|
|
4429
4455
|
}
|
|
4430
4456
|
.appcanvas.community-open .community-drawer,
|
|
@@ -4757,8 +4783,8 @@ header.navheader .mode-selector .community-mode-toggle {
|
|
|
4757
4783
|
<% } %>
|
|
4758
4784
|
</main>
|
|
4759
4785
|
<% if (type === 'run') { %>
|
|
4760
|
-
<div class='ask-ai-resizer' id='ask-ai-resizer' role="separator" aria-orientation="vertical" aria-valuemin="240" aria-valuemax="9999" aria-valuenow="560" tabindex="0" aria-label="Resize
|
|
4761
|
-
<aside class='ask-ai-drawer' id='ask-ai-drawer' data-workspace="<%=name%>" data-workspace-cwd="<%=path%>">
|
|
4786
|
+
<div class='ask-ai-resizer event-panel-resizer' id='ask-ai-resizer' role="separator" aria-orientation="vertical" aria-valuemin="240" aria-valuemax="9999" aria-valuenow="560" tabindex="0" aria-label="Resize panel"></div>
|
|
4787
|
+
<aside class='ask-ai-drawer event-panel' id='ask-ai-drawer' data-workspace="<%=name%>" data-workspace-cwd="<%=path%>">
|
|
4762
4788
|
<div class='ask-ai-drawer-inner'>
|
|
4763
4789
|
<div class='ask-ai-drawer-bar'>
|
|
4764
4790
|
<div class='ask-ai-drawer-title'>
|
|
@@ -4786,7 +4812,7 @@ header.navheader .mode-selector .community-mode-toggle {
|
|
|
4786
4812
|
<div class='ask-ai-drawer-picker-list' role="list" aria-label="Ask AI agents"></div>
|
|
4787
4813
|
<div class='ask-ai-drawer-picker-status muted'>Use the Ask AI button to load available agents.</div>
|
|
4788
4814
|
</div>
|
|
4789
|
-
<iframe class='ask-ai-frame hidden' title="
|
|
4815
|
+
<iframe class='ask-ai-frame event-panel-frame hidden' title="Panel" allow="fullscreen *;" allowfullscreen></iframe>
|
|
4790
4816
|
</div>
|
|
4791
4817
|
</div>
|
|
4792
4818
|
</aside>
|
|
@@ -11385,6 +11411,8 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
11385
11411
|
let open = false
|
|
11386
11412
|
let currentUrl = ""
|
|
11387
11413
|
let askAiWidth = null
|
|
11414
|
+
let drawerMode = "ask-ai"
|
|
11415
|
+
let drawerPlacement = "sidebar"
|
|
11388
11416
|
let pickerRequestId = 0
|
|
11389
11417
|
let askAiTools = null
|
|
11390
11418
|
let askAiToolsPromise = null
|
|
@@ -11418,9 +11446,27 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
11418
11446
|
if (frame) frame.classList.toggle("hidden", shouldShow)
|
|
11419
11447
|
}
|
|
11420
11448
|
|
|
11449
|
+
const applyDrawerOpenState = () => {
|
|
11450
|
+
if (!appcanvas) {
|
|
11451
|
+
return
|
|
11452
|
+
}
|
|
11453
|
+
appcanvas.classList.toggle("ask-ai-open", open && drawerMode === "ask-ai")
|
|
11454
|
+
appcanvas.classList.toggle("event-drawer-open", open && drawerMode === "event" && drawerPlacement !== "bottom")
|
|
11455
|
+
appcanvas.classList.toggle("event-bottom-open", open && drawerMode === "event" && drawerPlacement === "bottom")
|
|
11456
|
+
}
|
|
11457
|
+
|
|
11421
11458
|
const setDrawerMode = (mode) => {
|
|
11422
11459
|
const next = mode === "event" ? "event" : "ask-ai"
|
|
11460
|
+
drawerMode = next
|
|
11423
11461
|
drawer.classList.toggle("event-mode", next === "event")
|
|
11462
|
+
applyDrawerOpenState()
|
|
11463
|
+
}
|
|
11464
|
+
|
|
11465
|
+
const setDrawerPlacement = (placement) => {
|
|
11466
|
+
const next = placement === "bottom" ? "bottom" : "sidebar"
|
|
11467
|
+
drawerPlacement = next
|
|
11468
|
+
drawer.classList.toggle("bottom-mode", next === "bottom")
|
|
11469
|
+
applyDrawerOpenState()
|
|
11424
11470
|
}
|
|
11425
11471
|
|
|
11426
11472
|
const clampWidth = (value) => {
|
|
@@ -11474,9 +11520,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
11474
11520
|
|
|
11475
11521
|
const setOpen = (next) => {
|
|
11476
11522
|
open = !!next
|
|
11477
|
-
|
|
11478
|
-
appcanvas.classList.toggle("ask-ai-open", open)
|
|
11479
|
-
}
|
|
11523
|
+
applyDrawerOpenState()
|
|
11480
11524
|
if (askAiTrigger) {
|
|
11481
11525
|
askAiTrigger.classList.remove("hidden")
|
|
11482
11526
|
askAiTrigger.setAttribute("aria-hidden", "false")
|
|
@@ -11744,7 +11788,9 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
11744
11788
|
const openWithUrl = (rawUrl, opts = {}) => {
|
|
11745
11789
|
const workspaceCwd = opts && typeof opts.workspaceCwd === "string" ? opts.workspaceCwd : ""
|
|
11746
11790
|
const mode = opts && opts.mode === "event" ? "event" : "ask-ai"
|
|
11791
|
+
const requestedPlacement = opts && opts.placement === "bottom" ? "bottom" : "sidebar"
|
|
11747
11792
|
setDrawerMode(mode)
|
|
11793
|
+
setDrawerPlacement(mode === "event" ? requestedPlacement : "sidebar")
|
|
11748
11794
|
const cliProvider = resolveAskAiCliProvider(rawUrl)
|
|
11749
11795
|
if (cliProvider) {
|
|
11750
11796
|
pickerRequestId += 1
|
|
@@ -11802,6 +11848,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
11802
11848
|
|
|
11803
11849
|
const openPicker = (payload) => {
|
|
11804
11850
|
setDrawerMode("ask-ai")
|
|
11851
|
+
setDrawerPlacement("sidebar")
|
|
11805
11852
|
const workspaceCwd = resolveWorkspaceCwd(payload)
|
|
11806
11853
|
pickerRequestId += 1
|
|
11807
11854
|
const requestId = pickerRequestId
|
|
@@ -11907,13 +11954,16 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
11907
11954
|
const ui = launch.ui && typeof launch.ui === "object" ? launch.ui : {}
|
|
11908
11955
|
const mode = typeof ui.mode === "string" ? ui.mode : "background"
|
|
11909
11956
|
if (mode === "background") {
|
|
11910
|
-
const opened = openWithUrl(launchUrl, { mode: "event" })
|
|
11957
|
+
const opened = openWithUrl(launchUrl, { mode: "event", placement: "sidebar" })
|
|
11911
11958
|
if (opened) {
|
|
11912
11959
|
setOpen(false)
|
|
11913
11960
|
}
|
|
11914
11961
|
return opened
|
|
11915
11962
|
}
|
|
11916
|
-
|
|
11963
|
+
if (mode === "bottom") {
|
|
11964
|
+
return openWithUrl(launchUrl, { mode: "event", placement: "bottom" })
|
|
11965
|
+
}
|
|
11966
|
+
return openWithUrl(launchUrl, { mode: "event", placement: "sidebar" })
|
|
11917
11967
|
}
|
|
11918
11968
|
|
|
11919
11969
|
if (refreshBtn) {
|
|
@@ -12022,7 +12072,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
12022
12072
|
}
|
|
12023
12073
|
|
|
12024
12074
|
resizer.addEventListener("pointerdown", (event) => {
|
|
12025
|
-
if (!appcanvas || !appcanvas.classList.contains("ask-ai-open")) {
|
|
12075
|
+
if (!appcanvas || (!appcanvas.classList.contains("ask-ai-open") && !appcanvas.classList.contains("event-drawer-open"))) {
|
|
12026
12076
|
return
|
|
12027
12077
|
}
|
|
12028
12078
|
if (event.button !== 0 && event.pointerType !== "touch") {
|
|
@@ -12047,6 +12097,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
12047
12097
|
setEmptyState(true)
|
|
12048
12098
|
setPickerStatus("Use the Ask AI button to load available agents.")
|
|
12049
12099
|
setDrawerMode("ask-ai")
|
|
12100
|
+
setDrawerPlacement("sidebar")
|
|
12050
12101
|
setOpen(false)
|
|
12051
12102
|
window.PinokioAskAiDrawer = {
|
|
12052
12103
|
openWithAgent,
|