pinokiod 7.2.12 → 7.2.13
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/Dockerfile +0 -2
- package/kernel/api/index.js +14 -1
- package/kernel/api/process/index.js +99 -44
- package/kernel/api/uri/index.js +51 -0
- package/kernel/git.js +0 -13
- package/kernel/index.js +4 -0
- package/kernel/plugin.js +6 -58
- package/kernel/plugin_sources.js +236 -0
- package/kernel/util.js +60 -0
- package/package.json +1 -1
- package/server/features/drafts/public/drafts.js +35 -12
- package/server/index.js +110 -142
- package/server/lib/content_validation.js +28 -25
- package/server/public/common.js +95 -29
- package/server/public/create-launcher.js +4 -31
- package/server/public/electron.css +1 -1
- package/server/public/style.css +337 -0
- package/server/public/task-launcher.js +5 -32
- package/server/public/universal-launcher.js +3 -26
- package/server/views/app.ejs +8 -29
- package/server/views/d.ejs +0 -33
- package/server/views/editor.ejs +25 -4
- package/server/views/shell.ejs +11 -3
- package/server/views/terminal.ejs +15 -3
- package/spec/INSTRUCTION_SYNC.md +5 -5
- package/system/plugin/antigravity/antigravity.png +0 -0
- package/system/plugin/antigravity/pinokio.js +37 -0
- package/system/plugin/claude/claude.png +0 -0
- package/system/plugin/claude/pinokio.js +63 -0
- package/system/plugin/claude-auto/claude.png +0 -0
- package/system/plugin/claude-auto/pinokio.js +74 -0
- package/system/plugin/claude-desktop/icon.jpeg +0 -0
- package/system/plugin/claude-desktop/pinokio.js +39 -0
- package/system/plugin/codex/openai.webp +0 -0
- package/system/plugin/codex/pinokio.js +58 -0
- package/system/plugin/codex-auto/openai.webp +0 -0
- package/system/plugin/codex-auto/pinokio.js +65 -0
- package/system/plugin/codex-desktop/icon.png +0 -0
- package/system/plugin/codex-desktop/pinokio.js +39 -0
- package/system/plugin/crush/crush.png +0 -0
- package/system/plugin/crush/pinokio.js +31 -0
- package/system/plugin/cursor/cursor.jpeg +0 -0
- package/system/plugin/cursor/pinokio.js +39 -0
- package/system/plugin/gemini/gemini.jpeg +0 -0
- package/system/plugin/gemini/pinokio.js +40 -0
- package/system/plugin/gemini-auto/gemini.jpeg +0 -0
- package/system/plugin/gemini-auto/pinokio.js +43 -0
- package/system/plugin/qwen/pinokio.js +50 -0
- package/system/plugin/qwen/qwen.png +0 -0
- package/system/plugin/vscode/pinokio.js +36 -0
- package/system/plugin/vscode/vscode.png +0 -0
- package/system/plugin/windsurf/pinokio.js +39 -0
- package/system/plugin/windsurf/windsurf.png +0 -0
|
@@ -3,34 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
const CATEGORY_ORDER = ["CLI", "IDE"];
|
|
5
5
|
const TOOL_PREFERENCE_KEY = "pinokio.universalLauncher.tool";
|
|
6
|
-
const TOOL_VALUE_ALIASES = {
|
|
7
|
-
claude: "code/claude",
|
|
8
|
-
codex: "code/codex",
|
|
9
|
-
gemini: "code/gemini"
|
|
10
|
-
};
|
|
11
|
-
const FALLBACK_TOOLS = [
|
|
12
|
-
{
|
|
13
|
-
value: "code/claude",
|
|
14
|
-
label: "Claude Code",
|
|
15
|
-
iconSrc: "/asset/plugin/code/claude/claude.png",
|
|
16
|
-
isDefault: true,
|
|
17
|
-
category: "CLI"
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
value: "code/codex",
|
|
21
|
-
label: "OpenAI Codex",
|
|
22
|
-
iconSrc: "/asset/plugin/code/codex/openai.webp",
|
|
23
|
-
isDefault: false,
|
|
24
|
-
category: "CLI"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
value: "code/gemini",
|
|
28
|
-
label: "Google Gemini CLI",
|
|
29
|
-
iconSrc: "/asset/plugin/code/gemini/gemini.jpeg",
|
|
30
|
-
isDefault: false,
|
|
31
|
-
category: "CLI"
|
|
32
|
-
}
|
|
33
|
-
];
|
|
34
6
|
const TASK_INSTALL_SHELL_CLIENT = {
|
|
35
7
|
cols: 120,
|
|
36
8
|
rows: 32
|
|
@@ -103,7 +75,7 @@
|
|
|
103
75
|
if (!trimmed) {
|
|
104
76
|
return "";
|
|
105
77
|
}
|
|
106
|
-
return
|
|
78
|
+
return trimmed;
|
|
107
79
|
}
|
|
108
80
|
|
|
109
81
|
function getStoredToolPreference() {
|
|
@@ -441,9 +413,10 @@
|
|
|
441
413
|
}
|
|
442
414
|
const payload = await response.json();
|
|
443
415
|
const tools = mapPluginMenuToTools(payload && Array.isArray(payload.menu) ? payload.menu : []);
|
|
444
|
-
return tools
|
|
445
|
-
} catch (
|
|
446
|
-
|
|
416
|
+
return tools;
|
|
417
|
+
} catch (error) {
|
|
418
|
+
console.warn("Failed to load task launcher plugins", error);
|
|
419
|
+
return [];
|
|
447
420
|
}
|
|
448
421
|
}
|
|
449
422
|
|
|
@@ -20,29 +20,6 @@
|
|
|
20
20
|
SSH_ASKPASS: '',
|
|
21
21
|
GCM_INTERACTIVE: 'never',
|
|
22
22
|
};
|
|
23
|
-
const FALLBACK_TOOLS = [
|
|
24
|
-
{
|
|
25
|
-
value: 'code/claude',
|
|
26
|
-
label: 'Claude Code',
|
|
27
|
-
iconSrc: '/asset/plugin/code/claude/claude.png',
|
|
28
|
-
isDefault: true,
|
|
29
|
-
category: 'CLI',
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
value: 'code/codex',
|
|
33
|
-
label: 'OpenAI Codex',
|
|
34
|
-
iconSrc: '/asset/plugin/code/codex/openai.webp',
|
|
35
|
-
isDefault: false,
|
|
36
|
-
category: 'CLI',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
value: 'code/gemini',
|
|
40
|
-
label: 'Google Gemini CLI',
|
|
41
|
-
iconSrc: '/asset/plugin/code/gemini/gemini.jpeg',
|
|
42
|
-
isDefault: false,
|
|
43
|
-
category: 'CLI',
|
|
44
|
-
},
|
|
45
|
-
];
|
|
46
23
|
const INTENTS = {
|
|
47
24
|
create_app: {
|
|
48
25
|
label: 'Create app',
|
|
@@ -268,11 +245,11 @@
|
|
|
268
245
|
})
|
|
269
246
|
.then((payload) => {
|
|
270
247
|
const tools = mapPluginMenuToTools(payload && Array.isArray(payload.menu) ? payload.menu : []);
|
|
271
|
-
return tools
|
|
248
|
+
return tools;
|
|
272
249
|
})
|
|
273
250
|
.catch((error) => {
|
|
274
|
-
console.warn('
|
|
275
|
-
return
|
|
251
|
+
console.warn('Failed to load universal launcher plugins', error);
|
|
252
|
+
return [];
|
|
276
253
|
})
|
|
277
254
|
.finally(() => {
|
|
278
255
|
loadingTools = null;
|
package/server/views/app.ejs
CHANGED
|
@@ -6315,7 +6315,7 @@ header.navheader .mode-selector .community-mode-toggle {
|
|
|
6315
6315
|
const href = typeof launch.href === "string" ? launch.href : ""
|
|
6316
6316
|
try {
|
|
6317
6317
|
const parsed = new URL(href, window.location.origin)
|
|
6318
|
-
if (parsed.pathname.startsWith("/run/plugin/") || (parsed.pathname.startsWith("/run/api/") && /\/pinokio\.js$/i.test(parsed.pathname))) {
|
|
6318
|
+
if (parsed.pathname.startsWith("/run/plugin/") || parsed.pathname.startsWith("/pinokio/run/plugin/") || (parsed.pathname.startsWith("/run/api/") && /\/pinokio\.js$/i.test(parsed.pathname))) {
|
|
6319
6319
|
const parts = parsed.pathname.split("/").filter(Boolean)
|
|
6320
6320
|
const pluginSlug = parts.length >= 2 ? parts[parts.length - 2] : ""
|
|
6321
6321
|
const pluginLabel = titleCaseSlug(pluginSlug)
|
|
@@ -13091,32 +13091,6 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
13091
13091
|
const defaultWorkspaceCwd = drawer.dataset.workspaceCwd || ""
|
|
13092
13092
|
const widthKey = "pinokio.ask_ai.width"
|
|
13093
13093
|
const ASK_AI_MIN_WIDTH = 240
|
|
13094
|
-
const ASK_AI_FALLBACK_TOOLS = [
|
|
13095
|
-
{
|
|
13096
|
-
value: "claude",
|
|
13097
|
-
label: "Claude Code",
|
|
13098
|
-
iconSrc: "/asset/plugin/code/claude/claude.png",
|
|
13099
|
-
href: "/run/plugin/code/claude/pinokio.js",
|
|
13100
|
-
category: "CLI",
|
|
13101
|
-
isDefault: true
|
|
13102
|
-
},
|
|
13103
|
-
{
|
|
13104
|
-
value: "codex",
|
|
13105
|
-
label: "OpenAI Codex",
|
|
13106
|
-
iconSrc: "/asset/plugin/code/codex/openai.webp",
|
|
13107
|
-
href: "/run/plugin/code/codex/pinokio.js",
|
|
13108
|
-
category: "IDE",
|
|
13109
|
-
isDefault: false
|
|
13110
|
-
},
|
|
13111
|
-
{
|
|
13112
|
-
value: "gemini",
|
|
13113
|
-
label: "Google Gemini CLI",
|
|
13114
|
-
iconSrc: "/asset/plugin/code/gemini/gemini.jpeg",
|
|
13115
|
-
href: "/run/plugin/code/gemini/pinokio.js",
|
|
13116
|
-
category: "CLI",
|
|
13117
|
-
isDefault: false
|
|
13118
|
-
}
|
|
13119
|
-
]
|
|
13120
13094
|
|
|
13121
13095
|
let open = false
|
|
13122
13096
|
let currentUrl = ""
|
|
@@ -13244,6 +13218,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
13244
13218
|
}
|
|
13245
13219
|
if (
|
|
13246
13220
|
parsed.pathname.startsWith("/run/plugin/")
|
|
13221
|
+
|| parsed.pathname.startsWith("/pinokio/run/plugin/")
|
|
13247
13222
|
|| (parsed.pathname.startsWith("/run/api/") && /\/pinokio\.js$/i.test(parsed.pathname))
|
|
13248
13223
|
) {
|
|
13249
13224
|
if (workspaceCwd && !parsed.searchParams.has("cwd")) {
|
|
@@ -13308,6 +13283,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
13308
13283
|
return null
|
|
13309
13284
|
}
|
|
13310
13285
|
const isPluginLauncher = parsed.pathname.startsWith("/run/plugin/")
|
|
13286
|
+
|| parsed.pathname.startsWith("/pinokio/run/plugin/")
|
|
13311
13287
|
|| (parsed.pathname.startsWith("/run/api/") && /\/pinokio\.js$/i.test(parsed.pathname))
|
|
13312
13288
|
if (parsed.origin !== window.location.origin || !isPluginLauncher) {
|
|
13313
13289
|
return null
|
|
@@ -13358,9 +13334,12 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
13358
13334
|
})
|
|
13359
13335
|
.then((payload) => {
|
|
13360
13336
|
const mapped = mapPluginMenuToAskAiTools(payload && Array.isArray(payload.menu) ? payload.menu : [])
|
|
13361
|
-
return mapped
|
|
13337
|
+
return mapped
|
|
13338
|
+
})
|
|
13339
|
+
.catch((error) => {
|
|
13340
|
+
console.warn("Failed to load Ask AI plugins", error)
|
|
13341
|
+
return []
|
|
13362
13342
|
})
|
|
13363
|
-
.catch(() => ASK_AI_FALLBACK_TOOLS.slice())
|
|
13364
13343
|
.finally(() => {
|
|
13365
13344
|
askAiToolsPromise = null
|
|
13366
13345
|
})
|
package/server/views/d.ejs
CHANGED
|
@@ -544,19 +544,6 @@ body.dark #update-spec {
|
|
|
544
544
|
<form class='search'>
|
|
545
545
|
<input type='search' class="flexible" placeholder='Filter tools'>
|
|
546
546
|
</form>
|
|
547
|
-
<!--
|
|
548
|
-
<header>
|
|
549
|
-
<h1>Build</h1>
|
|
550
|
-
<div class='flexible'></div>
|
|
551
|
-
<a class='btn' href="https://github.com/pinokiocomputer/code/issues" target="_blank"><i class="fa-solid fa-up-right-from-square"></i> Request a tool</a>
|
|
552
|
-
<a class='btn' id='git-pull'><i class="fa-solid fa-rotate"></i> Check for new tools</a>
|
|
553
|
-
<div class='pulling hidden'>
|
|
554
|
-
<div class='loading'>
|
|
555
|
-
<i class="fa-solid fa-circle-notch fa-spin"></i> refreshing...
|
|
556
|
-
</div>
|
|
557
|
-
</div>
|
|
558
|
-
</header>
|
|
559
|
-
-->
|
|
560
547
|
<div class='spec'>
|
|
561
548
|
<div class='explain'>
|
|
562
549
|
<h3><i class="fa-regular fa-circle-check"></i> TODO</h3>
|
|
@@ -758,26 +745,6 @@ setTimeout(() => {
|
|
|
758
745
|
}, 2000)
|
|
759
746
|
<% } %>
|
|
760
747
|
/*
|
|
761
|
-
document.querySelector("#git-pull").addEventListener("click", (e) => {
|
|
762
|
-
e.preventDefault()
|
|
763
|
-
e.stopPropagation()
|
|
764
|
-
document.querySelector(".pulling").classList.remove("hidden")
|
|
765
|
-
document.querySelector("#git-pull").classList.add("hidden")
|
|
766
|
-
fetch("/plugin/update", {
|
|
767
|
-
method: "POST"
|
|
768
|
-
}).then((res) => {
|
|
769
|
-
return res.json()
|
|
770
|
-
}).then((res) => {
|
|
771
|
-
if (res.success) {
|
|
772
|
-
location.href = location.href
|
|
773
|
-
} else if(res.error) {
|
|
774
|
-
document.querySelector("#git-pull").classList.remove("hidden")
|
|
775
|
-
alert(res.error)
|
|
776
|
-
}
|
|
777
|
-
})
|
|
778
|
-
})
|
|
779
|
-
*/
|
|
780
|
-
/*
|
|
781
748
|
const resize = (textarea) => {
|
|
782
749
|
textarea.style.height = "";
|
|
783
750
|
textarea.style.height = textarea.scrollHeight + "px";
|
package/server/views/editor.ejs
CHANGED
|
@@ -143,6 +143,7 @@ body.frozen {
|
|
|
143
143
|
<script>
|
|
144
144
|
let shell_id
|
|
145
145
|
document.addEventListener("DOMContentLoaded", async () => {
|
|
146
|
+
const readOnly = <%= readonly ? "true" : "false" %>;
|
|
146
147
|
<% if (error) { %>
|
|
147
148
|
document.querySelector(".requirements .content").innerHTML = '<div class="loading"><i class="fa-solid fa-circle-exclamation"></i> <%=error%></div>'
|
|
148
149
|
<% } %>
|
|
@@ -195,6 +196,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
195
196
|
// maxLines: Infinity, // set to a large number
|
|
196
197
|
minLines: 1 // set to a small number
|
|
197
198
|
});
|
|
199
|
+
editor.setReadOnly(readOnly);
|
|
198
200
|
console.log("location.pathname", location.pathname)
|
|
199
201
|
<% if (mod) { %>
|
|
200
202
|
<% if (js) { %>
|
|
@@ -231,6 +233,9 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
231
233
|
let str;
|
|
232
234
|
let original = editor.getValue()
|
|
233
235
|
editor.getSession().on("change", () => {
|
|
236
|
+
if (readOnly) {
|
|
237
|
+
return
|
|
238
|
+
}
|
|
234
239
|
let v = editor.getValue()
|
|
235
240
|
if (original === v) {
|
|
236
241
|
dirty = false
|
|
@@ -243,6 +248,10 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
243
248
|
});
|
|
244
249
|
<% } %>
|
|
245
250
|
const n = new N()
|
|
251
|
+
const activeProcessWait = <% if (typeof active_process_wait !== 'undefined' && active_process_wait) { %><%- JSON.stringify(active_process_wait) %><% } else { %>null<% } %>
|
|
252
|
+
if (activeProcessWait && (activeProcessWait.title || activeProcessWait.description) && window.PinokioWaitFooterStatus) {
|
|
253
|
+
window.PinokioWaitFooterStatus.show(activeProcessWait)
|
|
254
|
+
}
|
|
246
255
|
class RPC {
|
|
247
256
|
constructor() {
|
|
248
257
|
this.socket = new Socket()
|
|
@@ -275,6 +284,10 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
275
284
|
}
|
|
276
285
|
save() {
|
|
277
286
|
return new Promise((resolve, reject) => {
|
|
287
|
+
if (readOnly) {
|
|
288
|
+
resolve()
|
|
289
|
+
return
|
|
290
|
+
}
|
|
278
291
|
let cwd = "<%-JSON.stringify(execUrl).slice(1, -1)%>"
|
|
279
292
|
//let cwd = "<%=execUrl%>"
|
|
280
293
|
//let cwd = "~" + location.pathname
|
|
@@ -320,12 +333,12 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
320
333
|
if (packet.type === 'start') {
|
|
321
334
|
// refreshParent(packet)
|
|
322
335
|
reloadMemory()
|
|
323
|
-
if (packet.data && packet.data.description) {
|
|
336
|
+
if (packet.data && (packet.data.title || packet.data.description)) {
|
|
324
337
|
if ('current' in packet.data) {
|
|
325
338
|
document.querySelector("footer").innerHTML = `<b>
|
|
326
339
|
<i class="fa-solid fa-circle-notch fa-spin"></i>(${packet.data.current+1}/${packet.data.total}) ${packet.data.title ? packet.data.title : ''}
|
|
327
340
|
</b>
|
|
328
|
-
<div class='flexible content'>${packet.data.description}</div>`
|
|
341
|
+
<div class='flexible content'>${packet.data.description ? packet.data.description : ''}</div>`
|
|
329
342
|
// <div class='toggle-expand'>
|
|
330
343
|
// <i class="fa-solid fa-circle-chevron-up"></i>
|
|
331
344
|
// </div>`
|
|
@@ -333,7 +346,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
333
346
|
document.querySelector("footer").innerHTML = `<b>
|
|
334
347
|
<i class="fa-solid fa-circle-notch fa-spin"></i> ${packet.data.title ? packet.data.title : ''}
|
|
335
348
|
</b>
|
|
336
|
-
<div class='flexible content'
|
|
349
|
+
<div class='flexible content'>${packet.data.description ? packet.data.description : ''}</div>`
|
|
337
350
|
// <div class='toggle-expand'>
|
|
338
351
|
// <i class="fa-solid fa-circle-chevron-up"></i>
|
|
339
352
|
// </div>`
|
|
@@ -432,6 +445,14 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
432
445
|
response: {},
|
|
433
446
|
uri: packet.id
|
|
434
447
|
})
|
|
448
|
+
} else if (packet.type === "process.wait.start") {
|
|
449
|
+
if (window.PinokioWaitFooterStatus) {
|
|
450
|
+
window.PinokioWaitFooterStatus.show(packet.data)
|
|
451
|
+
}
|
|
452
|
+
} else if (packet.type === "process.wait.end") {
|
|
453
|
+
if (window.PinokioWaitFooterStatus) {
|
|
454
|
+
window.PinokioWaitFooterStatus.hide()
|
|
455
|
+
}
|
|
435
456
|
} else if (packet.type === 'wait') {
|
|
436
457
|
await WaitModal(packet.data)
|
|
437
458
|
} else if (packet.type === "htmlmodal") {
|
|
@@ -959,7 +980,7 @@ const reloadMemory = async () => {
|
|
|
959
980
|
<!--
|
|
960
981
|
<button class='btn' id='source' data-editor-url="<%=editorUrl%>">Navigate</button>
|
|
961
982
|
-->
|
|
962
|
-
<div id='save' class='btn disabled'>
|
|
983
|
+
<div id='save' class='btn disabled <%= readonly ? "hidden" : "" %>'>
|
|
963
984
|
<span class='save'><i class="fa-solid fa-check"></i> Save</span>
|
|
964
985
|
</div>
|
|
965
986
|
</div>
|
package/server/views/shell.ejs
CHANGED
|
@@ -621,12 +621,12 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
621
621
|
document.querySelector(".play-btn").classList.add("hidden")
|
|
622
622
|
document.querySelector(".starting-btn").classList.add("hidden")
|
|
623
623
|
document.querySelector(".stop-btn").classList.remove("hidden")
|
|
624
|
-
if (packet.data && packet.data.description) {
|
|
624
|
+
if (packet.data && (packet.data.title || packet.data.description)) {
|
|
625
625
|
if ('current' in packet.data) {
|
|
626
626
|
document.querySelector("footer").innerHTML = `<b>
|
|
627
627
|
<i class="fa-solid fa-circle-notch fa-spin"></i>(${packet.data.current+1}/${packet.data.total}) ${packet.data.title ? packet.data.title : ''}
|
|
628
628
|
</b>
|
|
629
|
-
<div class='flexible content'>${packet.data.description}</div>`
|
|
629
|
+
<div class='flexible content'>${packet.data.description ? packet.data.description : ''}</div>`
|
|
630
630
|
// <div class='toggle-expand'>
|
|
631
631
|
// <i class="fa-solid fa-circle-chevron-up"></i>
|
|
632
632
|
// </div>`
|
|
@@ -634,7 +634,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
634
634
|
document.querySelector("footer").innerHTML = `<b>
|
|
635
635
|
<i class="fa-solid fa-circle-notch fa-spin"></i> ${packet.data.title ? packet.data.title : ''}
|
|
636
636
|
</b>
|
|
637
|
-
<div class='flexible content'
|
|
637
|
+
<div class='flexible content'>${packet.data.description ? packet.data.description : ''}</div>`
|
|
638
638
|
// <div class='toggle-expand'>
|
|
639
639
|
// <i class="fa-solid fa-circle-chevron-up"></i>
|
|
640
640
|
// </div>`
|
|
@@ -734,6 +734,14 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
734
734
|
// uri: "~" + location.pathname,
|
|
735
735
|
uri: packet.id
|
|
736
736
|
})
|
|
737
|
+
} else if (packet.type === "process.wait.start") {
|
|
738
|
+
if (window.PinokioWaitFooterStatus) {
|
|
739
|
+
window.PinokioWaitFooterStatus.show(packet.data)
|
|
740
|
+
}
|
|
741
|
+
} else if (packet.type === "process.wait.end") {
|
|
742
|
+
if (window.PinokioWaitFooterStatus) {
|
|
743
|
+
window.PinokioWaitFooterStatus.hide()
|
|
744
|
+
}
|
|
737
745
|
} else if (packet.type === 'wait') {
|
|
738
746
|
await WaitModal(packet.data)
|
|
739
747
|
} else if (packet.type === "htmlmodal") {
|
|
@@ -1232,6 +1232,10 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1232
1232
|
const scriptAction = <% if (typeof action !== 'undefined') { %><%- JSON.stringify(action) %><% } else { %>null<% } %>
|
|
1233
1233
|
const protectionAppId = <% if (typeof protection_app_id !== 'undefined' && protection_app_id) { %><%- JSON.stringify(protection_app_id) %><% } else { %>""<% } %>
|
|
1234
1234
|
const initialProtectionEnabled = <% if (typeof protection_enabled !== 'undefined') { %><%- JSON.stringify(protection_enabled === true) %><% } else { %>false<% } %>
|
|
1235
|
+
const activeProcessWait = <% if (typeof active_process_wait !== 'undefined' && active_process_wait) { %><%- JSON.stringify(active_process_wait) %><% } else { %>null<% } %>
|
|
1236
|
+
if (activeProcessWait && (activeProcessWait.title || activeProcessWait.description) && window.PinokioWaitFooterStatus) {
|
|
1237
|
+
window.PinokioWaitFooterStatus.show(activeProcessWait)
|
|
1238
|
+
}
|
|
1235
1239
|
const shouldBypassAiConsent = () => {
|
|
1236
1240
|
const normalize = (value) => (typeof value === "string" ? value.replace(/\\/g, "/") : "")
|
|
1237
1241
|
const uri = normalize(scriptUri || "")
|
|
@@ -1490,17 +1494,17 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1490
1494
|
refreshParent(packet)
|
|
1491
1495
|
reloadMemory()
|
|
1492
1496
|
runControls.set("running")
|
|
1493
|
-
if (packet.data && packet.data.description) {
|
|
1497
|
+
if (packet.data && (packet.data.title || packet.data.description)) {
|
|
1494
1498
|
if ('current' in packet.data) {
|
|
1495
1499
|
document.querySelector("#status-window").innerHTML = `<b>
|
|
1496
1500
|
<i class="fa-solid fa-circle-notch fa-spin"></i>(${packet.data.current+1}/${packet.data.total}) ${packet.data.title ? packet.data.title : ''}
|
|
1497
1501
|
</b>
|
|
1498
|
-
<div class='flexible content'>${packet.data.description}</div>`
|
|
1502
|
+
<div class='flexible content'>${packet.data.description ? packet.data.description : ''}</div>`
|
|
1499
1503
|
} else {
|
|
1500
1504
|
document.querySelector("#status-window").innerHTML = `<b>
|
|
1501
1505
|
<i class="fa-solid fa-circle-notch fa-spin"></i> ${packet.data.title ? packet.data.title : ''}
|
|
1502
1506
|
</b>
|
|
1503
|
-
<div class='flexible content'
|
|
1507
|
+
<div class='flexible content'>${packet.data.description ? packet.data.description : ''}</div>`
|
|
1504
1508
|
// <div class='toggle-expand'>
|
|
1505
1509
|
// <i class="fa-solid fa-circle-chevron-up"></i>
|
|
1506
1510
|
// </div>`
|
|
@@ -1678,6 +1682,14 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
1678
1682
|
// uri: "~" + location.pathname,
|
|
1679
1683
|
uri: packet.id
|
|
1680
1684
|
})
|
|
1685
|
+
} else if (packet.type === "process.wait.start") {
|
|
1686
|
+
if (window.PinokioWaitFooterStatus) {
|
|
1687
|
+
window.PinokioWaitFooterStatus.show(packet.data)
|
|
1688
|
+
}
|
|
1689
|
+
} else if (packet.type === "process.wait.end") {
|
|
1690
|
+
if (window.PinokioWaitFooterStatus) {
|
|
1691
|
+
window.PinokioWaitFooterStatus.hide()
|
|
1692
|
+
}
|
|
1681
1693
|
} else if (packet.type === 'wait') {
|
|
1682
1694
|
await WaitModal(packet.data)
|
|
1683
1695
|
} else if (packet.type === "htmlmodal") {
|
package/spec/INSTRUCTION_SYNC.md
CHANGED
|
@@ -18,7 +18,6 @@ Fix three related problems with minimal behavioral change:
|
|
|
18
18
|
|
|
19
19
|
Paths:
|
|
20
20
|
|
|
21
|
-
- `PINOKIO_HOME/plugin/code`
|
|
22
21
|
- `PINOKIO_HOME/prototype/system`
|
|
23
22
|
- `PINOKIO_HOME/network/system`
|
|
24
23
|
|
|
@@ -32,6 +31,8 @@ Policy:
|
|
|
32
31
|
- On normal startup, bootstrap only if missing.
|
|
33
32
|
- At runtime, if a needed file inside one of these repos is missing, attempt a targeted Git restore for that path only.
|
|
34
33
|
|
|
34
|
+
Built-in plugins are packaged under `pinokiod/system/plugin` and are not cloned, refreshed, or repaired inside `PINOKIO_HOME`.
|
|
35
|
+
|
|
35
36
|
### 2. Managed downloaded instruction sources
|
|
36
37
|
|
|
37
38
|
Paths:
|
|
@@ -109,7 +110,7 @@ Policy:
|
|
|
109
110
|
|
|
110
111
|
Paths:
|
|
111
112
|
|
|
112
|
-
- everything under `PINOKIO_HOME/plugin/*`
|
|
113
|
+
- everything under `PINOKIO_HOME/plugin/*`
|
|
113
114
|
- everything under `PINOKIO_HOME/prototype/*` except `prototype/system`, `prototype/PINOKIO.md`, and `prototype/PTERM.md`
|
|
114
115
|
- everything under `PINOKIO_HOME/network/*` except `network/system`
|
|
115
116
|
|
|
@@ -129,7 +130,6 @@ Policy:
|
|
|
129
130
|
|
|
130
131
|
Required behavior:
|
|
131
132
|
|
|
132
|
-
- refresh `plugin/code`
|
|
133
133
|
- refresh `prototype/system`
|
|
134
134
|
- refresh `network/system`
|
|
135
135
|
- refresh `prototype/PINOKIO.md`
|
|
@@ -164,7 +164,7 @@ Ordering requirement:
|
|
|
164
164
|
|
|
165
165
|
- After a version-change cleanup, Pinokio must not rely on the current startup order where `Environment.init({}, kernel)` can run before the async reclone/redownload of managed repos/docs completes.
|
|
166
166
|
- Home output regeneration must either:
|
|
167
|
-
- run after `
|
|
167
|
+
- run after `prototype/system`, `network/system`, `PINOKIO.md`, and `PTERM.md` have been restored
|
|
168
168
|
- or be rerun once those managed inputs are restored
|
|
169
169
|
|
|
170
170
|
### C. Runtime missing-file repair
|
|
@@ -298,7 +298,7 @@ File:
|
|
|
298
298
|
|
|
299
299
|
Changes:
|
|
300
300
|
|
|
301
|
-
-
|
|
301
|
+
- remove `PINOKIO_HOME/plugin` from managed refresh; built-in plugins are packaged under `pinokiod/system/plugin`
|
|
302
302
|
- replace whole-folder refresh of `PINOKIO_HOME/prototype` with refresh of:
|
|
303
303
|
- `PINOKIO_HOME/prototype/system`
|
|
304
304
|
- `PINOKIO_HOME/prototype/PINOKIO.md`
|
|
Binary file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
title: "Antigravity",
|
|
3
|
+
link: "https://antigravity.google/",
|
|
4
|
+
icon: "antigravity.png",
|
|
5
|
+
description: "The AI IDE from Google",
|
|
6
|
+
launch_type: "desktop",
|
|
7
|
+
watch: [{
|
|
8
|
+
handler: "draft",
|
|
9
|
+
method: "ready",
|
|
10
|
+
params: {
|
|
11
|
+
path: ".pinokio/draft",
|
|
12
|
+
content: "post.md",
|
|
13
|
+
publish: {
|
|
14
|
+
target: "registry",
|
|
15
|
+
type: "post",
|
|
16
|
+
parent: {
|
|
17
|
+
type: "app",
|
|
18
|
+
url: "{{args.url || ''}}"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}],
|
|
23
|
+
run: [{
|
|
24
|
+
when: "{{which('antigravity')}}",
|
|
25
|
+
method: "exec",
|
|
26
|
+
params: {
|
|
27
|
+
message: "antigravity .",
|
|
28
|
+
path: "{{args.cwd}}",
|
|
29
|
+
}
|
|
30
|
+
}, {
|
|
31
|
+
method: "process.wait",
|
|
32
|
+
params: {
|
|
33
|
+
title: "Launched",
|
|
34
|
+
description: "Click the stop button to stop watching file changes"
|
|
35
|
+
}
|
|
36
|
+
}]
|
|
37
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
title: "Claude Code",
|
|
3
|
+
icon: "claude.png",
|
|
4
|
+
link: "https://www.anthropic.com/claude-code",
|
|
5
|
+
watch: [{
|
|
6
|
+
handler: "draft",
|
|
7
|
+
method: "ready",
|
|
8
|
+
params: {
|
|
9
|
+
path: ".pinokio/draft",
|
|
10
|
+
content: "post.md",
|
|
11
|
+
publish: {
|
|
12
|
+
target: "registry",
|
|
13
|
+
type: "post",
|
|
14
|
+
parent: {
|
|
15
|
+
type: "app",
|
|
16
|
+
url: "{{args.url || ''}}"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}],
|
|
21
|
+
run: [{
|
|
22
|
+
when: "{{platform === 'win32'}}",
|
|
23
|
+
id: "run",
|
|
24
|
+
method: "shell.run",
|
|
25
|
+
params: {
|
|
26
|
+
shell: "{{kernel.path('bin/miniconda/Library/bin/bash.exe')}}",
|
|
27
|
+
conda: {
|
|
28
|
+
skip: true
|
|
29
|
+
},
|
|
30
|
+
env: {
|
|
31
|
+
CLAUDE_CODE_GIT_BASH_PATH: "{{kernel.path('bin/miniconda/Library/bin/bash.exe')}}"
|
|
32
|
+
},
|
|
33
|
+
message: {
|
|
34
|
+
_: [
|
|
35
|
+
"npx",
|
|
36
|
+
"-y",
|
|
37
|
+
"@anthropic-ai/claude-code@latest",
|
|
38
|
+
"{{args.prompt || undefined}}"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
path: "{{args.cwd}}",
|
|
42
|
+
input: true,
|
|
43
|
+
buffer: 1024
|
|
44
|
+
}
|
|
45
|
+
}, {
|
|
46
|
+
when: "{{platform !== 'win32'}}",
|
|
47
|
+
id: "run",
|
|
48
|
+
method: "shell.run",
|
|
49
|
+
params: {
|
|
50
|
+
message: {
|
|
51
|
+
_: [
|
|
52
|
+
"npx",
|
|
53
|
+
"-y",
|
|
54
|
+
"@anthropic-ai/claude-code@latest",
|
|
55
|
+
"{{args.prompt || undefined}}"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
path: "{{args.cwd}}",
|
|
59
|
+
input: true,
|
|
60
|
+
buffer: 1024
|
|
61
|
+
}
|
|
62
|
+
}]
|
|
63
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
title: "Claude Code Auto",
|
|
3
|
+
icon: "claude.png",
|
|
4
|
+
description: "Claude Code with trusted workspace and bypass permissions prompts skipped.",
|
|
5
|
+
link: "https://www.anthropic.com/claude-code",
|
|
6
|
+
watch: [{
|
|
7
|
+
handler: "draft",
|
|
8
|
+
method: "ready",
|
|
9
|
+
params: {
|
|
10
|
+
path: ".pinokio/draft",
|
|
11
|
+
content: "post.md",
|
|
12
|
+
publish: {
|
|
13
|
+
target: "registry",
|
|
14
|
+
type: "post",
|
|
15
|
+
parent: {
|
|
16
|
+
type: "app",
|
|
17
|
+
url: "{{args.url || ''}}"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}],
|
|
22
|
+
run: [{
|
|
23
|
+
when: "{{platform === 'win32'}}",
|
|
24
|
+
id: "run",
|
|
25
|
+
method: "shell.run",
|
|
26
|
+
params: {
|
|
27
|
+
shell: "{{kernel.path('bin/miniconda/Library/bin/bash.exe')}}",
|
|
28
|
+
conda: {
|
|
29
|
+
skip: true
|
|
30
|
+
},
|
|
31
|
+
env: {
|
|
32
|
+
CLAUDE_CODE_GIT_BASH_PATH: "{{kernel.path('bin/miniconda/Library/bin/bash.exe')}}",
|
|
33
|
+
CLAUBBIT: "true"
|
|
34
|
+
},
|
|
35
|
+
message: {
|
|
36
|
+
_: [
|
|
37
|
+
"npx",
|
|
38
|
+
"-y",
|
|
39
|
+
"@anthropic-ai/claude-code@latest",
|
|
40
|
+
"--settings",
|
|
41
|
+
"{\"skipDangerousModePermissionPrompt\":true}",
|
|
42
|
+
"--dangerously-skip-permissions",
|
|
43
|
+
"{{args.prompt || undefined}}"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
path: "{{args.cwd}}",
|
|
47
|
+
input: true,
|
|
48
|
+
buffer: 1024
|
|
49
|
+
}
|
|
50
|
+
}, {
|
|
51
|
+
when: "{{platform !== 'win32'}}",
|
|
52
|
+
id: "run",
|
|
53
|
+
method: "shell.run",
|
|
54
|
+
params: {
|
|
55
|
+
env: {
|
|
56
|
+
CLAUBBIT: "true"
|
|
57
|
+
},
|
|
58
|
+
message: {
|
|
59
|
+
_: [
|
|
60
|
+
"npx",
|
|
61
|
+
"-y",
|
|
62
|
+
"@anthropic-ai/claude-code@latest",
|
|
63
|
+
"--settings",
|
|
64
|
+
"{\"skipDangerousModePermissionPrompt\":true}",
|
|
65
|
+
"--dangerously-skip-permissions",
|
|
66
|
+
"{{args.prompt || undefined}}"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
path: "{{args.cwd}}",
|
|
70
|
+
input: true,
|
|
71
|
+
buffer: 1024
|
|
72
|
+
}
|
|
73
|
+
}]
|
|
74
|
+
}
|
|
Binary file
|