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.
Files changed (53) hide show
  1. package/Dockerfile +0 -2
  2. package/kernel/api/index.js +14 -1
  3. package/kernel/api/process/index.js +99 -44
  4. package/kernel/api/uri/index.js +51 -0
  5. package/kernel/git.js +0 -13
  6. package/kernel/index.js +4 -0
  7. package/kernel/plugin.js +6 -58
  8. package/kernel/plugin_sources.js +236 -0
  9. package/kernel/util.js +60 -0
  10. package/package.json +1 -1
  11. package/server/features/drafts/public/drafts.js +35 -12
  12. package/server/index.js +110 -142
  13. package/server/lib/content_validation.js +28 -25
  14. package/server/public/common.js +95 -29
  15. package/server/public/create-launcher.js +4 -31
  16. package/server/public/electron.css +1 -1
  17. package/server/public/style.css +337 -0
  18. package/server/public/task-launcher.js +5 -32
  19. package/server/public/universal-launcher.js +3 -26
  20. package/server/views/app.ejs +8 -29
  21. package/server/views/d.ejs +0 -33
  22. package/server/views/editor.ejs +25 -4
  23. package/server/views/shell.ejs +11 -3
  24. package/server/views/terminal.ejs +15 -3
  25. package/spec/INSTRUCTION_SYNC.md +5 -5
  26. package/system/plugin/antigravity/antigravity.png +0 -0
  27. package/system/plugin/antigravity/pinokio.js +37 -0
  28. package/system/plugin/claude/claude.png +0 -0
  29. package/system/plugin/claude/pinokio.js +63 -0
  30. package/system/plugin/claude-auto/claude.png +0 -0
  31. package/system/plugin/claude-auto/pinokio.js +74 -0
  32. package/system/plugin/claude-desktop/icon.jpeg +0 -0
  33. package/system/plugin/claude-desktop/pinokio.js +39 -0
  34. package/system/plugin/codex/openai.webp +0 -0
  35. package/system/plugin/codex/pinokio.js +58 -0
  36. package/system/plugin/codex-auto/openai.webp +0 -0
  37. package/system/plugin/codex-auto/pinokio.js +65 -0
  38. package/system/plugin/codex-desktop/icon.png +0 -0
  39. package/system/plugin/codex-desktop/pinokio.js +39 -0
  40. package/system/plugin/crush/crush.png +0 -0
  41. package/system/plugin/crush/pinokio.js +31 -0
  42. package/system/plugin/cursor/cursor.jpeg +0 -0
  43. package/system/plugin/cursor/pinokio.js +39 -0
  44. package/system/plugin/gemini/gemini.jpeg +0 -0
  45. package/system/plugin/gemini/pinokio.js +40 -0
  46. package/system/plugin/gemini-auto/gemini.jpeg +0 -0
  47. package/system/plugin/gemini-auto/pinokio.js +43 -0
  48. package/system/plugin/qwen/pinokio.js +50 -0
  49. package/system/plugin/qwen/qwen.png +0 -0
  50. package/system/plugin/vscode/pinokio.js +36 -0
  51. package/system/plugin/vscode/vscode.png +0 -0
  52. package/system/plugin/windsurf/pinokio.js +39 -0
  53. 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 TOOL_VALUE_ALIASES[trimmed] || trimmed;
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.length > 0 ? tools : FALLBACK_TOOLS.slice();
445
- } catch (_) {
446
- return FALLBACK_TOOLS.slice();
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.length > 0 ? tools : FALLBACK_TOOLS.slice();
248
+ return tools;
272
249
  })
273
250
  .catch((error) => {
274
- console.warn('Falling back to default tools for universal launcher', error);
275
- return FALLBACK_TOOLS.slice();
251
+ console.warn('Failed to load universal launcher plugins', error);
252
+ return [];
276
253
  })
277
254
  .finally(() => {
278
255
  loadingTools = null;
@@ -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.length > 0 ? mapped : ASK_AI_FALLBACK_TOOLS.slice()
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
  })
@@ -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";
@@ -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'></div>`
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>
@@ -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'></div>`
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'></div>`
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") {
@@ -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/*` except `plugin/code`
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 `plugin/code`, `prototype/system`, `network/system`, `PINOKIO.md`, and `PTERM.md` have been restored
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
- - replace whole-folder refresh of `PINOKIO_HOME/plugin` with refresh of `PINOKIO_HOME/plugin/code` only
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`
@@ -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
+ }
@@ -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
+ }