pinokiod 6.0.19 → 6.0.21

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.
@@ -3541,6 +3541,13 @@ document.addEventListener("DOMContentLoaded", () => {
3541
3541
  trigger.dataset.askAiInit = 'true';
3542
3542
  createLauncherDebugLog('initAskAiTrigger: binding click handler');
3543
3543
  trigger.addEventListener('click', async () => {
3544
+ if (window.PinokioAskAiDrawer
3545
+ && typeof window.PinokioAskAiDrawer.isOpen === 'function'
3546
+ && window.PinokioAskAiDrawer.isOpen()
3547
+ && typeof window.PinokioAskAiDrawer.close === 'function') {
3548
+ window.PinokioAskAiDrawer.close();
3549
+ return;
3550
+ }
3544
3551
  const workspace = deriveWorkspaceForAskAi(trigger);
3545
3552
  const workspaceCwd = deriveWorkspaceCwdForAskAi(trigger);
3546
3553
  await openAskAiAgentPicker({
@@ -261,7 +261,7 @@ const createTerm = async (_theme) => {
261
261
  })
262
262
  let config = {
263
263
  scrollback: 9999999,
264
- fontSize: 14,
264
+ fontSize: 12,
265
265
  fontFamily: 'monospace',
266
266
  theme,
267
267
  }
@@ -2746,14 +2746,13 @@ footer.status {
2746
2746
  }
2747
2747
  #error-screen .btn {
2748
2748
  font-size: 14px;
2749
- padding: 15px 30px;
2749
+ padding: 10px 20px;
2750
2750
  font-weight: bold;
2751
- background: firebrick;
2752
- /*
2751
+ background-color: transparent;
2752
+ border: 3px solid white;
2753
2753
  border-radius: 50px;
2754
- */
2755
2754
  margin: 5px;
2756
- text-transform: uppercase;
2755
+ text-transform: none;
2757
2756
  }
2758
2757
  .tippy-box[data-theme~='pointer'] {
2759
2758
  background-color: royalblue;
@@ -846,7 +846,7 @@
846
846
  const baseThemeRaw = base && base.theme ? base.theme : this.safeGetOption(term, 'theme');
847
847
  const baseTheme = this.sanitizeTheme(baseThemeRaw, true);
848
848
  term._pinokioBaseOptions = {
849
- fontSize: isFiniteNumber(baseFontSize) ? baseFontSize : 14,
849
+ fontSize: isFiniteNumber(baseFontSize) ? baseFontSize : 12,
850
850
  fontFamily: baseFontFamily,
851
851
  theme: baseTheme
852
852
  };
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const crypto = require("crypto");
7
+
8
+ const sourcePath = process.argv[2];
9
+ const expectedSessionId = process.argv[3];
10
+
11
+ if (!sourcePath) {
12
+ process.exit(1);
13
+ }
14
+
15
+ let payload;
16
+ try {
17
+ const raw = fs.readFileSync(sourcePath, "utf8");
18
+ payload = JSON.parse(raw);
19
+ } catch (error) {
20
+ process.exit(1);
21
+ }
22
+
23
+ if (!payload || typeof payload !== "object") {
24
+ process.exit(1);
25
+ }
26
+
27
+ const sourceSessionId = typeof payload.sessionId === "string"
28
+ ? payload.sessionId
29
+ : (typeof payload.session_id === "string" ? payload.session_id : "");
30
+
31
+ if (!sourceSessionId) {
32
+ process.exit(1);
33
+ }
34
+
35
+ if (expectedSessionId && sourceSessionId !== expectedSessionId) {
36
+ process.exit(1);
37
+ }
38
+
39
+ if (!Array.isArray(payload.messages)) {
40
+ process.exit(1);
41
+ }
42
+
43
+ const newSessionId = typeof crypto.randomUUID === "function"
44
+ ? crypto.randomUUID()
45
+ : [
46
+ Date.now().toString(16),
47
+ Math.random().toString(16).slice(2),
48
+ Math.random().toString(16).slice(2)
49
+ ].join("-");
50
+
51
+ const nowIso = new Date().toISOString();
52
+ payload.sessionId = newSessionId;
53
+ if (typeof payload.session_id === "string") {
54
+ payload.session_id = newSessionId;
55
+ }
56
+ if (typeof payload.startTime === "string") {
57
+ payload.startTime = nowIso;
58
+ }
59
+ if (typeof payload.lastUpdated === "string") {
60
+ payload.lastUpdated = nowIso;
61
+ }
62
+
63
+ const stamp = nowIso.replace(/[:.]/g, "-");
64
+ const filename = "session-" + stamp + "-" + newSessionId.slice(0, 8) + ".json";
65
+ const targetPath = path.join(path.dirname(path.resolve(sourcePath)), filename);
66
+ fs.writeFileSync(targetPath, JSON.stringify(payload, null, 2), "utf8");
67
+ process.stdout.write(newSessionId);
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const path = require("path");
5
+ const { execFileSync, spawn } = require("child_process");
6
+
7
+ const sourcePath = process.argv[2];
8
+ const expectedSessionId = process.argv[3];
9
+
10
+ if (!sourcePath) {
11
+ process.exit(1);
12
+ }
13
+
14
+ const forkScriptPath = path.resolve(__dirname, "fork_gemini_session.js");
15
+
16
+ let forkedSessionId = "";
17
+ try {
18
+ forkedSessionId = execFileSync(
19
+ process.execPath,
20
+ [forkScriptPath, sourcePath, expectedSessionId || ""],
21
+ {
22
+ encoding: "utf8",
23
+ stdio: ["ignore", "pipe", "inherit"]
24
+ }
25
+ ).trim();
26
+ } catch (error) {
27
+ if (typeof error.status === "number") {
28
+ process.exit(error.status);
29
+ }
30
+ process.exit(1);
31
+ }
32
+
33
+ if (!forkedSessionId) {
34
+ process.exit(1);
35
+ }
36
+
37
+ const npxBinary = process.platform === "win32" ? "npx.cmd" : "npx";
38
+ const child = spawn(
39
+ npxBinary,
40
+ ["-y", "@google/gemini-cli@latest", "--resume", forkedSessionId],
41
+ { stdio: "inherit" }
42
+ );
43
+
44
+ child.on("error", () => {
45
+ process.exit(1);
46
+ });
47
+
48
+ child.on("exit", (code) => {
49
+ process.exit(typeof code === "number" ? code : 1);
50
+ });
@@ -891,13 +891,17 @@ body.dark .appcanvas > aside .menu-scroller.menu-scrollable.scroll-left::before
891
891
  margin-left: auto;
892
892
  padding-right: 6px;
893
893
  border-left: 1px solid rgba(0,0,0,0.08);
894
+ background: transparent;
894
895
  }
895
896
  body.dark .appcanvas > aside .menu-actions {
896
897
  border-left-color: rgba(255,255,255,0.08);
898
+ background: transparent;
897
899
  }
898
900
  .appcanvas:not(.vertical) .menu-actions .header-item {
899
901
  min-width: 0;
900
902
  padding: 4px 8px;
903
+ background: royalblue !important;
904
+ color: white !important;
901
905
  }
902
906
  .appcanvas:not(.vertical) .menu-actions .header-item .display {
903
907
  display: block;
@@ -914,6 +918,76 @@ body.dark .appcanvas > aside .menu-actions {
914
918
  width: 16px;
915
919
  text-align: center;
916
920
  }
921
+ .appcanvas:not(.vertical) .menu-actions .header-item:hover,
922
+ .appcanvas:not(.vertical) .menu-actions .header-item:focus-visible {
923
+ background: royalblue !important;
924
+ color: white !important;
925
+ }
926
+ .appcanvas:not(.vertical) .menu-actions .header-item.selected {
927
+ background: royalblue !important;
928
+ color: white !important;
929
+ }
930
+ body.dark .appcanvas:not(.vertical) .menu-actions .header-item {
931
+ background: royalblue !important;
932
+ color: white !important;
933
+ }
934
+ body.dark .appcanvas:not(.vertical) .menu-actions .header-item:hover,
935
+ body.dark .appcanvas:not(.vertical) .menu-actions .header-item:focus-visible {
936
+ background: royalblue !important;
937
+ color: white !important;
938
+ }
939
+ body.dark .appcanvas:not(.vertical) .menu-actions .header-item.selected {
940
+ background: royalblue !important;
941
+ color: white !important;
942
+ }
943
+ .appcanvas.vertical .menu-actions .header-item {
944
+ background: royalblue !important;
945
+ color: white !important;
946
+ }
947
+ .appcanvas.vertical .menu-actions .header-item:hover,
948
+ .appcanvas.vertical .menu-actions .header-item:focus-visible,
949
+ .appcanvas.vertical .menu-actions .header-item.selected {
950
+ background: royalblue !important;
951
+ color: white !important;
952
+ }
953
+ body.dark .appcanvas.vertical .menu-actions .header-item {
954
+ background: royalblue !important;
955
+ color: white !important;
956
+ }
957
+ body.dark .appcanvas.vertical .menu-actions .header-item:hover,
958
+ body.dark .appcanvas.vertical .menu-actions .header-item:focus-visible,
959
+ body.dark .appcanvas.vertical .menu-actions .header-item.selected {
960
+ background: royalblue !important;
961
+ color: white !important;
962
+ }
963
+ .appcanvas.community-open .menu-actions #community-toggle,
964
+ .appcanvas.community-open .menu-actions #community-toggle:hover,
965
+ .appcanvas.community-open .menu-actions #community-toggle:focus-visible,
966
+ .appcanvas.community-open .menu-actions #community-toggle.selected {
967
+ background: #f7f8fa !important;
968
+ color: #334155 !important;
969
+ }
970
+ body.dark .appcanvas.community-open .menu-actions #community-toggle,
971
+ body.dark .appcanvas.community-open .menu-actions #community-toggle:hover,
972
+ body.dark .appcanvas.community-open .menu-actions #community-toggle:focus-visible,
973
+ body.dark .appcanvas.community-open .menu-actions #community-toggle.selected {
974
+ background: #0f1115 !important;
975
+ color: rgba(226, 232, 240, 0.92) !important;
976
+ }
977
+ .appcanvas.ask-ai-open .menu-actions #ask-ai-tab,
978
+ .appcanvas.ask-ai-open .menu-actions #ask-ai-tab:hover,
979
+ .appcanvas.ask-ai-open .menu-actions #ask-ai-tab:focus-visible,
980
+ .appcanvas.ask-ai-open .menu-actions #ask-ai-tab.selected {
981
+ background: #f8fafc !important;
982
+ color: #334155 !important;
983
+ }
984
+ body.dark .appcanvas.ask-ai-open .menu-actions #ask-ai-tab,
985
+ body.dark .appcanvas.ask-ai-open .menu-actions #ask-ai-tab:hover,
986
+ body.dark .appcanvas.ask-ai-open .menu-actions #ask-ai-tab:focus-visible,
987
+ body.dark .appcanvas.ask-ai-open .menu-actions #ask-ai-tab.selected {
988
+ background: #0f1115 !important;
989
+ color: rgba(226, 232, 240, 0.92) !important;
990
+ }
917
991
  .appcanvas.vertical .menu-scroller {
918
992
  flex-direction: column;
919
993
  align-items: stretch;
@@ -924,14 +998,15 @@ body.dark .appcanvas > aside .menu-actions {
924
998
  .appcanvas.vertical .menu-actions {
925
999
  flex-direction: column;
926
1000
  align-items: stretch;
1001
+ gap: 1px;
927
1002
  margin-top: auto;
928
- padding: 6px 0;
1003
+ padding: 0;
929
1004
  width: 100%;
930
1005
  border-left: 0;
931
- border-top: 1px solid rgba(0,0,0,0.08);
1006
+ border-top: none;
932
1007
  }
933
1008
  body.dark .appcanvas.vertical .menu-actions {
934
- border-top-color: rgba(255,255,255,0.08);
1009
+ border-top: none;
935
1010
  }
936
1011
 
937
1012
  .appcanvas > aside .menu-scroller::-webkit-scrollbar {
@@ -11188,8 +11263,8 @@ document.addEventListener("DOMContentLoaded", () => {
11188
11263
  appcanvas.classList.toggle("ask-ai-open", open)
11189
11264
  }
11190
11265
  if (askAiTrigger) {
11191
- askAiTrigger.classList.toggle("hidden", open)
11192
- askAiTrigger.setAttribute("aria-hidden", open ? "true" : "false")
11266
+ askAiTrigger.classList.remove("hidden")
11267
+ askAiTrigger.setAttribute("aria-hidden", "false")
11193
11268
  }
11194
11269
  drawer.setAttribute("aria-hidden", open ? "false" : "true")
11195
11270
  if (resizer) {
@@ -139,7 +139,7 @@ document.addEventListener("DOMContentLoaded", () => {
139
139
  })
140
140
  let config = {
141
141
  scrollback: 9999999,
142
- fontSize: 14,
142
+ fontSize: 12,
143
143
  fontFamily: 'monospace',
144
144
  theme,
145
145
  }
@@ -694,7 +694,7 @@ document.addEventListener("DOMContentLoaded", async () => {
694
694
  })
695
695
  let config = {
696
696
  scrollback: 9999999,
697
- fontSize: 14,
697
+ fontSize: 12,
698
698
  fontFamily: 'monospace',
699
699
  theme,
700
700
  }
@@ -113,6 +113,29 @@ body main iframe {
113
113
  height: 100%;
114
114
  width: 100%;
115
115
  }
116
+ .explore-url {
117
+ flex-grow: 1;
118
+ min-width: 200px;
119
+ height: 32px;
120
+ padding: 0 10px;
121
+ border: 1px solid rgba(0,0,0,0.15);
122
+ border-radius: 6px;
123
+ background: rgba(255,255,255,0.85);
124
+ color: inherit;
125
+ font-size: 12px;
126
+ line-height: 32px;
127
+ }
128
+ body.dark .explore-url {
129
+ background: rgba(0,0,0,0.2);
130
+ border-color: rgba(255,255,255,0.2);
131
+ }
132
+ @media only screen and (max-width: 768px) {
133
+ .explore-url {
134
+ min-width: 0;
135
+ width: 100%;
136
+ box-sizing: border-box;
137
+ }
138
+ }
116
139
  </style>
117
140
  <script src="/popper.min.js"></script>
118
141
  <script src="/tippy-bundle.umd.min.js"></script>
@@ -132,7 +155,7 @@ body main iframe {
132
155
  <button class='btn2' id='refresh-page' data-tippy-content="refresh"><div><i class="fa-solid fa-rotate-right"></i></div></button>
133
156
  <button class='btn2' id='screenshot' data-tippy-content="screen capture"><i class="fa-solid fa-camera"></i></button>
134
157
  <button class='btn2' id='inspector' data-tippy-content="X-ray mode"><i class="fa-solid fa-eye"></i></button>
135
- <div class='flexible'></div>
158
+ <input id="explore-url" class="explore-url" type="url" readonly spellcheck="false" value="">
136
159
  <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
137
160
  <div><i class="fa-solid fa-table-columns"></i></div>
138
161
  </a>
@@ -176,6 +199,41 @@ document.querySelector("form").addEventListener("submit", (e) => {
176
199
  */
177
200
  (() => {
178
201
  const frame = document.querySelector("main iframe")
202
+ const urlField = document.querySelector("#explore-url")
203
+
204
+ const updateUrlField = (value) => {
205
+ if (!urlField) return
206
+ const next = typeof value === "string" ? value : ""
207
+ urlField.value = next
208
+ urlField.title = next || "URL unavailable"
209
+ }
210
+
211
+ const getFrameUrl = () => {
212
+ if (!frame) return ""
213
+ try {
214
+ const href = frame.contentWindow && frame.contentWindow.location
215
+ ? frame.contentWindow.location.href
216
+ : ""
217
+ if (typeof href === "string" && href) {
218
+ return href
219
+ }
220
+ } catch (_) {}
221
+ const attr = frame.getAttribute("src")
222
+ if (typeof attr === "string" && attr.trim()) {
223
+ return attr.trim()
224
+ }
225
+ try {
226
+ if (typeof frame.src === "string" && frame.src.trim()) {
227
+ return frame.src.trim()
228
+ }
229
+ } catch (_) {}
230
+ return ""
231
+ }
232
+
233
+ const syncUrlField = (value) => {
234
+ const next = typeof value === "string" && value ? value : getFrameUrl()
235
+ updateUrlField(next)
236
+ }
179
237
 
180
238
  const navigateParentHistory = (delta) => {
181
239
  if (delta < 0) {
@@ -262,6 +320,23 @@ document.querySelector("form").addEventListener("submit", (e) => {
262
320
  void onHeaderHistoryClick(1, event)
263
321
  }
264
322
  }, true)
323
+
324
+ if (frame) {
325
+ frame.addEventListener("load", () => {
326
+ syncUrlField()
327
+ })
328
+ }
329
+
330
+ window.addEventListener("message", (event) => {
331
+ if (!event || event.source !== (frame && frame.contentWindow)) return
332
+ const data = event.data
333
+ if (!data || typeof data !== "object") return
334
+ if (data.type !== "pinokio:community:location") return
335
+ if (typeof data.url !== "string") return
336
+ syncUrlField(data.url)
337
+ })
338
+
339
+ syncUrlField()
265
340
  })()
266
341
  </script>
267
342
  </body>
@@ -393,13 +393,13 @@ body.dark .home-mode-switch {
393
393
  }
394
394
  .home-mode-switch .mode-link.selected,
395
395
  .home-mode-switch .mode-link[aria-current="page"] {
396
- background: rgba(0, 0, 0, 0.9) !important;
396
+ background: royalblue !important;
397
397
  color: #fff !important;
398
398
  }
399
399
  body.dark .home-mode-switch .mode-link.selected,
400
400
  body.dark .home-mode-switch .mode-link[aria-current="page"] {
401
- background: rgba(255, 255, 255, 0.12) !important;
402
- color: rgba(255, 255, 255, 0.96) !important;
401
+ background: royalblue !important;
402
+ color: #fff !important;
403
403
  }
404
404
  .home-search-mode-switch {
405
405
  flex: 0 0 auto;
@@ -2626,7 +2626,7 @@ const createTerm = async (_theme) => {
2626
2626
  <% } %>
2627
2627
  let config = {
2628
2628
  scrollback: 9999999,
2629
- fontSize: 14,
2629
+ fontSize: 12,
2630
2630
  fontFamily: 'monospace',
2631
2631
  theme,
2632
2632
  }
@@ -163,7 +163,7 @@ const createTerm = async (_theme) => {
163
163
  <% } %>
164
164
  let config = {
165
165
  scrollback: 9999999,
166
- fontSize: 14,
166
+ fontSize: 12,
167
167
  fontFamily: 'monospace',
168
168
  theme,
169
169
  }
@@ -1142,7 +1142,7 @@ const createDnsTerminal = async (container) => {
1142
1142
  }
1143
1143
  let config = {
1144
1144
  scrollback: 9999999,
1145
- fontSize: 14,
1145
+ fontSize: 12,
1146
1146
  fontFamily: 'monospace',
1147
1147
  theme: document.body.classList.contains('dark') ? xtermTheme.FrontEndDelight : xtermTheme.Tomorrow,
1148
1148
  }
@@ -227,7 +227,7 @@ const createTerm = async (_theme) => {
227
227
  <% } %>
228
228
  let config = {
229
229
  scrollback: 9999999,
230
- fontSize: 14,
230
+ fontSize: 12,
231
231
  fontFamily: 'monospace',
232
232
  theme,
233
233
  }
@@ -1565,7 +1565,7 @@ async function displayResults(config) {
1565
1565
 
1566
1566
  let term_config = {
1567
1567
  scrollback: 9999999,
1568
- fontSize: 14,
1568
+ fontSize: 12,
1569
1569
  fontFamily: 'monospace',
1570
1570
  theme,
1571
1571
  }
@@ -496,7 +496,7 @@ document.addEventListener("DOMContentLoaded", async () => {
496
496
  <% if (conda) { %>
497
497
  conda: <%-JSON.stringify(conda)%>,
498
498
  <% } %>
499
- id: "<%=id%>",
499
+ id: <%-JSON.stringify(id)%>,
500
500
  //path: "<%=cwd%>",
501
501
  path: "<%-JSON.stringify(cwd).slice(1, -1)%>",
502
502
  client: {
@@ -1223,7 +1223,7 @@ document.addEventListener("DOMContentLoaded", async () => {
1223
1223
 
1224
1224
  let config = {
1225
1225
  scrollback: 9999999,
1226
- fontSize: 14,
1226
+ fontSize: 12,
1227
1227
  fontFamily: 'monospace',
1228
1228
  theme,
1229
1229
  //theme: xtermTheme.FrontEndDelight
@@ -1810,7 +1810,7 @@ document.addEventListener("DOMContentLoaded", async () => {
1810
1810
  <% } %>
1811
1811
  let config = {
1812
1812
  scrollback: 9999999,
1813
- fontSize: 14,
1813
+ fontSize: 12,
1814
1814
  fontFamily: 'monospace',
1815
1815
  theme,
1816
1816
  //theme: xtermTheme.FrontEndDelight