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.
@@ -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 p = typeof stats.progress === 'number' ? Math.floor(stats.progress) : null
612
- if (p !== null && p >= 0 && p <= 100) {
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinokiod",
3
- "version": "6.0.50",
3
+ "version": "6.0.51",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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"
@@ -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 Ask AI panel"></div>
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="Ask AI panel" allow="fullscreen *;" allowfullscreen></iframe>
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
- if (appcanvas) {
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
- return openWithUrl(launchUrl, { mode: "event" })
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,