pinokiod 7.2.18 → 7.3.0
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 +2 -0
- package/kernel/api/index.js +13 -179
- package/kernel/api/process/index.js +44 -99
- package/kernel/bin/conda-python.js +30 -0
- package/kernel/bin/conda.js +22 -3
- package/kernel/bin/huggingface.js +1 -1
- package/kernel/bin/index.js +11 -1
- package/kernel/environment.js +11 -205
- package/kernel/git.js +13 -0
- package/kernel/index.js +1 -64
- package/kernel/plugin.js +58 -6
- package/kernel/prototype.js +0 -4
- package/kernel/shell.js +2 -23
- package/kernel/util.js +0 -60
- package/package.json +1 -1
- package/server/index.js +171 -229
- package/server/lib/content_validation.js +33 -47
- package/server/public/common.js +29 -103
- package/server/public/create-launcher.js +31 -4
- package/server/public/electron.css +6 -0
- package/server/public/style.css +0 -337
- package/server/public/task-launcher.css +3 -11
- package/server/public/task-launcher.js +32 -5
- package/server/public/universal-launcher.js +26 -3
- package/server/socket.js +11 -22
- package/server/views/app.ejs +30 -167
- package/server/views/d.ejs +35 -33
- package/server/views/editor.ejs +4 -25
- package/server/views/partials/main_sidebar.ejs +0 -1
- package/server/views/partials/menu.ejs +1 -1
- package/server/views/pre.ejs +1 -1
- package/server/views/shell.ejs +3 -11
- package/server/views/task_launch.ejs +10 -10
- package/server/views/terminal.ejs +5 -34
- package/spec/INSTRUCTION_SYNC.md +5 -5
- package/kernel/agent_instructions.js +0 -166
- package/kernel/api/shell_run_template.js +0 -273
- package/kernel/api/uri/index.js +0 -51
- package/kernel/plugin_sources.js +0 -289
- package/kernel/watch/context.js +0 -42
- package/kernel/watch/drivers/fs.js +0 -71
- package/kernel/watch/drivers/poll.js +0 -33
- package/kernel/watch/index.js +0 -185
- package/server/features/index.js +0 -13
- package/server/features/notes/index.js +0 -41
- package/server/features/notes/parser.js +0 -174
- package/server/features/notes/public/notes.css +0 -955
- package/server/features/notes/public/notes.js +0 -1149
- package/server/features/notes/registry_import.js +0 -412
- package/server/features/notes/routes.js +0 -156
- package/server/features/notes/service.js +0 -326
- package/server/features/notes/watcher.js +0 -74
- package/server/lib/workspace_catalog.js +0 -151
- package/server/lib/workspace_runtime.js +0 -390
- package/server/public/tasker.css +0 -336
- package/server/public/tasker.js +0 -407
- package/server/routes/workspaces.js +0 -44
- package/server/views/partials/workspace_row.ejs +0 -61
- package/server/views/tasker.ejs +0 -40
- package/server/views/workspaces.ejs +0 -813
- package/system/plugin/antigravity/antigravity.png +0 -0
- package/system/plugin/antigravity/pinokio.js +0 -35
- package/system/plugin/claude/claude.png +0 -0
- package/system/plugin/claude/pinokio.js +0 -61
- package/system/plugin/claude-auto/claude.png +0 -0
- package/system/plugin/claude-auto/pinokio.js +0 -72
- package/system/plugin/claude-desktop/icon.jpeg +0 -0
- package/system/plugin/claude-desktop/pinokio.js +0 -37
- package/system/plugin/codex/openai.webp +0 -0
- package/system/plugin/codex/pinokio.js +0 -56
- package/system/plugin/codex-auto/openai.webp +0 -0
- package/system/plugin/codex-auto/pinokio.js +0 -63
- package/system/plugin/codex-desktop/icon.png +0 -0
- package/system/plugin/codex-desktop/pinokio.js +0 -37
- package/system/plugin/crush/crush.png +0 -0
- package/system/plugin/crush/pinokio.js +0 -29
- package/system/plugin/cursor/cursor.jpeg +0 -0
- package/system/plugin/cursor/pinokio.js +0 -37
- package/system/plugin/gemini/gemini.jpeg +0 -0
- package/system/plugin/gemini/pinokio.js +0 -38
- package/system/plugin/gemini-auto/gemini.jpeg +0 -0
- package/system/plugin/gemini-auto/pinokio.js +0 -41
- package/system/plugin/qwen/pinokio.js +0 -48
- package/system/plugin/qwen/qwen.png +0 -0
- package/system/plugin/vscode/pinokio.js +0 -34
- package/system/plugin/vscode/vscode.png +0 -0
- package/system/plugin/windsurf/pinokio.js +0 -37
- package/system/plugin/windsurf/windsurf.png +0 -0
- package/test/plugin-sources.test.js +0 -45
package/kernel/environment.js
CHANGED
|
@@ -3,189 +3,7 @@ const portfinder = require('portfinder-cp')
|
|
|
3
3
|
const os = require('os')
|
|
4
4
|
const fs = require('fs')
|
|
5
5
|
const Util = require('./util')
|
|
6
|
-
const
|
|
7
|
-
const CACHE_ENV_KEYS = ["UV_CACHE_DIR", "PIP_CACHE_DIR"]
|
|
8
|
-
const CACHE_PREFLIGHT_KEYS = TEMP_ENV_KEYS.concat(CACHE_ENV_KEYS)
|
|
9
|
-
|
|
10
|
-
const formatCachePreflightError = (error) => {
|
|
11
|
-
if (!error) {
|
|
12
|
-
return ""
|
|
13
|
-
}
|
|
14
|
-
const parts = []
|
|
15
|
-
if (error.code) {
|
|
16
|
-
parts.push(`code=${error.code}`)
|
|
17
|
-
}
|
|
18
|
-
if (typeof error.errno !== "undefined") {
|
|
19
|
-
parts.push(`errno=${error.errno}`)
|
|
20
|
-
}
|
|
21
|
-
if (error.syscall) {
|
|
22
|
-
parts.push(`syscall=${error.syscall}`)
|
|
23
|
-
}
|
|
24
|
-
if (error.path) {
|
|
25
|
-
parts.push(`path=${error.path}`)
|
|
26
|
-
}
|
|
27
|
-
if (error.dest) {
|
|
28
|
-
parts.push(`dest=${error.dest}`)
|
|
29
|
-
}
|
|
30
|
-
if (error.message) {
|
|
31
|
-
parts.push(`message=${error.message}`)
|
|
32
|
-
}
|
|
33
|
-
return parts.join(" ")
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const logCachePreflight = (message) => {
|
|
37
|
-
console.log(`[Pinokio cache preflight] ${message}`)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const probeCacheDir = async (dirPath) => {
|
|
41
|
-
const probeDir = path.resolve(
|
|
42
|
-
dirPath,
|
|
43
|
-
`.pinokio-cache-probe-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`
|
|
44
|
-
)
|
|
45
|
-
const probeFile = path.resolve(probeDir, "probe.tmp")
|
|
46
|
-
const renamedFile = path.resolve(probeDir, "probe-renamed.tmp")
|
|
47
|
-
const steps = [
|
|
48
|
-
["create probe directory", () => fs.promises.mkdir(probeDir, { recursive: false })],
|
|
49
|
-
["write probe file", () => fs.promises.writeFile(probeFile, "pinokio")],
|
|
50
|
-
["append probe file", () => fs.promises.appendFile(probeFile, "-cache-probe")],
|
|
51
|
-
["rename probe file", () => fs.promises.rename(probeFile, renamedFile)],
|
|
52
|
-
["delete probe file", () => fs.promises.unlink(renamedFile)],
|
|
53
|
-
["remove probe directory", () => fs.promises.rmdir(probeDir)]
|
|
54
|
-
]
|
|
55
|
-
|
|
56
|
-
for (const [step, run] of steps) {
|
|
57
|
-
try {
|
|
58
|
-
await run()
|
|
59
|
-
} catch (error) {
|
|
60
|
-
await fs.promises.rm(probeDir, { recursive: true, force: true }).catch(() => {})
|
|
61
|
-
return { ok: false, step, error }
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return { ok: true }
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const managedCacheEnvDefaults = () => {
|
|
68
|
-
const defaults = {}
|
|
69
|
-
for (const key of CACHE_PREFLIGHT_KEYS) {
|
|
70
|
-
defaults[key] = `./cache/${key}`
|
|
71
|
-
}
|
|
72
|
-
return defaults
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const ensureCachePreflightDir = async (key, targetPath, options = {}) => {
|
|
76
|
-
logCachePreflight(`${key}: target=${targetPath}`)
|
|
77
|
-
try {
|
|
78
|
-
await fs.promises.mkdir(targetPath, { recursive: true })
|
|
79
|
-
logCachePreflight(`${key}: mkdir ok`)
|
|
80
|
-
} catch (error) {
|
|
81
|
-
logCachePreflight(`${key}: mkdir failed ${formatCachePreflightError(error)}`)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const firstProbe = await probeCacheDir(targetPath)
|
|
85
|
-
if (firstProbe.ok) {
|
|
86
|
-
logCachePreflight(`${key}: probe ok`)
|
|
87
|
-
return { key, path: targetPath, repaired: false, ok: true }
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
logCachePreflight(`${key}: probe failed step="${firstProbe.step}" ${formatCachePreflightError(firstProbe.error)}`)
|
|
91
|
-
logCachePreflight(`${key}: repair delete start path=${targetPath}`)
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
await fs.promises.rm(targetPath, { recursive: true, force: true })
|
|
95
|
-
logCachePreflight(`${key}: repair delete ok`)
|
|
96
|
-
} catch (error) {
|
|
97
|
-
logCachePreflight(`${key}: repair delete failed ${formatCachePreflightError(error)}`)
|
|
98
|
-
if (typeof options.elevatedRepair !== "function") {
|
|
99
|
-
return { key, path: targetPath, repaired: false, ok: false, step: "repair delete", error }
|
|
100
|
-
}
|
|
101
|
-
logCachePreflight(`${key}: elevated repair start path=${targetPath}`)
|
|
102
|
-
let elevatedRepair
|
|
103
|
-
try {
|
|
104
|
-
elevatedRepair = await options.elevatedRepair(targetPath, logCachePreflight)
|
|
105
|
-
} catch (repairError) {
|
|
106
|
-
elevatedRepair = { ok: false, error: repairError }
|
|
107
|
-
}
|
|
108
|
-
if (!elevatedRepair || !elevatedRepair.ok) {
|
|
109
|
-
return { key, path: targetPath, repaired: false, elevated: true, ok: false, step: "elevated repair", error: elevatedRepair && elevatedRepair.error ? elevatedRepair.error : error }
|
|
110
|
-
}
|
|
111
|
-
const elevatedProbe = await probeCacheDir(targetPath)
|
|
112
|
-
if (elevatedProbe.ok) {
|
|
113
|
-
logCachePreflight(`${key}: elevated repair probe ok`)
|
|
114
|
-
return { key, path: targetPath, repaired: true, elevated: true, ok: true }
|
|
115
|
-
}
|
|
116
|
-
logCachePreflight(`${key}: elevated repair probe failed step="${elevatedProbe.step}" ${formatCachePreflightError(elevatedProbe.error)}`)
|
|
117
|
-
return { key, path: targetPath, repaired: true, elevated: true, ok: false, step: elevatedProbe.step, error: elevatedProbe.error }
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
try {
|
|
121
|
-
await fs.promises.mkdir(targetPath, { recursive: true })
|
|
122
|
-
logCachePreflight(`${key}: repair mkdir ok`)
|
|
123
|
-
} catch (error) {
|
|
124
|
-
logCachePreflight(`${key}: repair mkdir failed ${formatCachePreflightError(error)}`)
|
|
125
|
-
return { key, path: targetPath, repaired: true, ok: false, step: "repair mkdir", error }
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const secondProbe = await probeCacheDir(targetPath)
|
|
129
|
-
if (secondProbe.ok) {
|
|
130
|
-
logCachePreflight(`${key}: repair probe ok`)
|
|
131
|
-
return { key, path: targetPath, repaired: true, ok: true }
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
logCachePreflight(`${key}: repair probe failed step="${secondProbe.step}" ${formatCachePreflightError(secondProbe.error)}`)
|
|
135
|
-
return { key, path: targetPath, repaired: true, ok: false, step: secondProbe.step, error: secondProbe.error }
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const ensurePinokioCacheDirs = async (kernel, options = {}) => {
|
|
139
|
-
if (!kernel || !kernel.homedir) {
|
|
140
|
-
return {}
|
|
141
|
-
}
|
|
142
|
-
const throwOnFailure = !!options.throwOnFailure
|
|
143
|
-
const root = path.resolve(kernel.homedir)
|
|
144
|
-
const cacheRoot = path.resolve(root, "cache")
|
|
145
|
-
const envPath = path.resolve(root, "ENVIRONMENT")
|
|
146
|
-
const defaults = managedCacheEnvDefaults()
|
|
147
|
-
logCachePreflight(`start root=${root}`)
|
|
148
|
-
await Util.update_env(envPath, defaults)
|
|
149
|
-
logCachePreflight(`ENVIRONMENT updated keys=${CACHE_PREFLIGHT_KEYS.join(",")}`)
|
|
150
|
-
try {
|
|
151
|
-
await fs.promises.mkdir(cacheRoot, { recursive: true })
|
|
152
|
-
logCachePreflight(`cache root mkdir ok path=${cacheRoot}`)
|
|
153
|
-
} catch (error) {
|
|
154
|
-
logCachePreflight(`cache root mkdir failed path=${cacheRoot} ${formatCachePreflightError(error)}`)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (process.platform === "darwin") await fs.promises.writeFile(path.resolve(root, ".metadata_never_index"), "", { flag: "a" }).catch(() => {})
|
|
158
|
-
|
|
159
|
-
const errors = []
|
|
160
|
-
const results = []
|
|
161
|
-
|
|
162
|
-
for (const key of CACHE_PREFLIGHT_KEYS) {
|
|
163
|
-
const targetPath = path.resolve(cacheRoot, key)
|
|
164
|
-
const result = await ensureCachePreflightDir(key, targetPath, options)
|
|
165
|
-
results.push(result)
|
|
166
|
-
if (!result.ok) {
|
|
167
|
-
errors.push(result)
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (errors.length > 0) {
|
|
172
|
-
kernel.cacheDirErrors = errors
|
|
173
|
-
const message = errors
|
|
174
|
-
.map((error) => `${error.key}: ${error.path} (${error.step || "unknown"} ${formatCachePreflightError(error.error)})`)
|
|
175
|
-
.join(", ")
|
|
176
|
-
logCachePreflight(`failed ${message}`)
|
|
177
|
-
if (throwOnFailure) {
|
|
178
|
-
throw new Error(`Pinokio could not create writable cache directories: ${message}`)
|
|
179
|
-
}
|
|
180
|
-
} else {
|
|
181
|
-
kernel.cacheDirErrors = []
|
|
182
|
-
logCachePreflight(`complete ok checked=${results.length} repaired=${results.filter((result) => result.repaired).length}`)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
kernel.cacheDirPreflight = results
|
|
186
|
-
const env = await get(root, kernel)
|
|
187
|
-
return { env, errors, results }
|
|
188
|
-
}
|
|
6
|
+
const platform = os.platform()
|
|
189
7
|
const ENVS = async () => {
|
|
190
8
|
// const primary_port = 80
|
|
191
9
|
// const secondary_port = 42000
|
|
@@ -620,21 +438,18 @@ const requirements = async (script, cwd, kernel) => {
|
|
|
620
438
|
let requires_instantiation = false
|
|
621
439
|
if (script) {
|
|
622
440
|
let pre
|
|
623
|
-
if (
|
|
441
|
+
if (script.pre) {
|
|
624
442
|
pre = script.pre
|
|
625
|
-
} else if (
|
|
443
|
+
} else if (script.env) {
|
|
626
444
|
pre = script.env
|
|
627
445
|
}
|
|
628
446
|
if (pre) {
|
|
629
447
|
let env = await get2(cwd, kernel)
|
|
630
448
|
for(let item of pre) {
|
|
631
|
-
if (!item || typeof item !== "object") {
|
|
632
|
-
continue
|
|
633
|
-
}
|
|
634
449
|
let env_key
|
|
635
|
-
if (
|
|
450
|
+
if (item.env) {
|
|
636
451
|
env_key = item.env
|
|
637
|
-
} else if (
|
|
452
|
+
} else if (item.key) {
|
|
638
453
|
env_key = item.key
|
|
639
454
|
item.env = item.key
|
|
640
455
|
}
|
|
@@ -643,20 +458,11 @@ const requirements = async (script, cwd, kernel) => {
|
|
|
643
458
|
if (!item.index) {
|
|
644
459
|
item.index = 0
|
|
645
460
|
}
|
|
646
|
-
if (
|
|
647
|
-
const
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
const url = new URL(hasProtocol ? host : `https://${host}`);
|
|
652
|
-
parsedHost = url.host
|
|
653
|
-
} catch (e) {
|
|
654
|
-
item.host = ""
|
|
655
|
-
}
|
|
656
|
-
if (parsedHost) {
|
|
657
|
-
item.host = parsedHost
|
|
658
|
-
item.val = await kernel.kv.get(item.host, item.index)
|
|
659
|
-
}
|
|
461
|
+
if (item.host) {
|
|
462
|
+
const hasProtocol = /^[a-zA-Z][a-zA-Z\d+\-.]*:\/\//.test(item.host);
|
|
463
|
+
const url = new URL(hasProtocol ? item.host : `https://${item.host}`);
|
|
464
|
+
item.host = url.host
|
|
465
|
+
item.val = await kernel.kv.get(item.host, item.index)
|
|
660
466
|
} else {
|
|
661
467
|
item.host = ""
|
|
662
468
|
}
|
|
@@ -1022,4 +828,4 @@ const init = async (options, kernel) => {
|
|
|
1022
828
|
env_path: current
|
|
1023
829
|
}
|
|
1024
830
|
}
|
|
1025
|
-
module.exports = { ENV, get, get2, init_folders,
|
|
831
|
+
module.exports = { ENV, get, get2, init_folders, requirements, init, get_root }
|
package/kernel/git.js
CHANGED
|
@@ -1378,6 +1378,19 @@ class Git {
|
|
|
1378
1378
|
const absoluteTarget = path.resolve(targetPath)
|
|
1379
1379
|
const home = path.resolve(this.kernel.homedir)
|
|
1380
1380
|
const managedTargets = [
|
|
1381
|
+
{
|
|
1382
|
+
kind: "plugin",
|
|
1383
|
+
root: path.resolve(home, "plugin/code"),
|
|
1384
|
+
matches: (root, target) => target === root || target.startsWith(`${root}${path.sep}`),
|
|
1385
|
+
bootstrap: async () => {
|
|
1386
|
+
await fs.promises.rm(path.resolve(home, "plugin/code"), { recursive: true, force: true })
|
|
1387
|
+
this.dirs.delete(path.resolve(home, "plugin/code"))
|
|
1388
|
+
if (this.kernel.plugin && typeof this.kernel.plugin.init === "function") {
|
|
1389
|
+
await this.kernel.plugin.init()
|
|
1390
|
+
}
|
|
1391
|
+
},
|
|
1392
|
+
exists: async () => this.kernel.exists("plugin/code")
|
|
1393
|
+
},
|
|
1381
1394
|
{
|
|
1382
1395
|
kind: "prototype",
|
|
1383
1396
|
root: path.resolve(home, "prototype/system"),
|
package/kernel/index.js
CHANGED
|
@@ -40,11 +40,9 @@ const Git = require('./git')
|
|
|
40
40
|
const Connect = require('./connect')
|
|
41
41
|
const Favicon = require('./favicon')
|
|
42
42
|
const AppLauncher = require('./app_launcher')
|
|
43
|
-
const WatchManager = require('./watch')
|
|
44
43
|
const { DownloaderHelper } = require('node-downloader-helper');
|
|
45
44
|
const { ProxyAgent } = require('proxy-agent');
|
|
46
45
|
const fakeUa = require('fake-useragent');
|
|
47
|
-
const sudo = process.platform === "win32" ? require("sudo-prompt-programfiles-x86") : null
|
|
48
46
|
//const kill = require('./tree-kill');
|
|
49
47
|
const kill = require('kill-sync')
|
|
50
48
|
const ejs = require('ejs');
|
|
@@ -56,37 +54,9 @@ const VARS = {
|
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
56
|
|
|
59
|
-
const powershellSingleQuote = (value) => {
|
|
60
|
-
return `'${String(value).replace(/'/g, "''")}'`
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const windowsCacheRepairCommand = (targetPath) => {
|
|
64
|
-
const psPath = powershellSingleQuote(targetPath)
|
|
65
|
-
return [
|
|
66
|
-
"powershell.exe",
|
|
67
|
-
"-NoProfile",
|
|
68
|
-
"-ExecutionPolicy Bypass",
|
|
69
|
-
"-Command",
|
|
70
|
-
`"`,
|
|
71
|
-
"$ErrorActionPreference = 'Stop';",
|
|
72
|
-
`$p = ${psPath};`,
|
|
73
|
-
"$account = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name;",
|
|
74
|
-
"$grant = $account + ':(OI)(CI)F';",
|
|
75
|
-
"if (Test-Path -LiteralPath $p) {",
|
|
76
|
-
" & takeown.exe /F $p /R /D Y;",
|
|
77
|
-
" & icacls.exe $p /reset /T /C;",
|
|
78
|
-
" & icacls.exe $p /grant $grant /T /C;",
|
|
79
|
-
" Remove-Item -LiteralPath $p -Recurse -Force;",
|
|
80
|
-
"}",
|
|
81
|
-
"New-Item -ItemType Directory -Force -Path $p | Out-Null;",
|
|
82
|
-
"& icacls.exe $p /grant $grant /T /C;",
|
|
83
|
-
`"`
|
|
84
|
-
].join(" ")
|
|
85
|
-
}
|
|
86
|
-
|
|
87
57
|
//const memwatch = require('@airbnb/node-memwatch');
|
|
88
58
|
class Kernel {
|
|
89
|
-
schema = "<=7.
|
|
59
|
+
schema = "<=7.0.0"
|
|
90
60
|
constructor(store) {
|
|
91
61
|
this.fetch = fetch
|
|
92
62
|
|
|
@@ -415,9 +385,6 @@ class Kernel {
|
|
|
415
385
|
path(...args) {
|
|
416
386
|
return path.resolve(this.homedir, ...args)
|
|
417
387
|
}
|
|
418
|
-
systemPath(...args) {
|
|
419
|
-
return path.resolve(__dirname, "..", "system", ...args)
|
|
420
|
-
}
|
|
421
388
|
exists(...args) {
|
|
422
389
|
if (args) {
|
|
423
390
|
let abspath = this.path(...args)
|
|
@@ -497,30 +464,6 @@ class Kernel {
|
|
|
497
464
|
return ''
|
|
498
465
|
}
|
|
499
466
|
}
|
|
500
|
-
async elevatedCacheRepair(targetPath, log = console.log) {
|
|
501
|
-
if (this.platform !== "win32" || !sudo) {
|
|
502
|
-
return { ok: false, error: new Error("Elevated cache repair is only available on Windows") }
|
|
503
|
-
}
|
|
504
|
-
const command = windowsCacheRepairCommand(targetPath)
|
|
505
|
-
log(`elevated repair command=${command}`)
|
|
506
|
-
return new Promise((resolve) => {
|
|
507
|
-
sudo.exec(command, { name: "Pinokio" }, (error, stdout, stderr) => {
|
|
508
|
-
if (stdout && stdout.trim()) {
|
|
509
|
-
log(`elevated repair stdout ${stdout.trim()}`)
|
|
510
|
-
}
|
|
511
|
-
if (stderr && stderr.trim()) {
|
|
512
|
-
log(`elevated repair stderr ${stderr.trim()}`)
|
|
513
|
-
}
|
|
514
|
-
if (error) {
|
|
515
|
-
log(`elevated repair failed ${error.message || error}`)
|
|
516
|
-
resolve({ ok: false, error, stdout, stderr })
|
|
517
|
-
} else {
|
|
518
|
-
log(`elevated repair ok path=${targetPath}`)
|
|
519
|
-
resolve({ ok: true, stdout, stderr })
|
|
520
|
-
}
|
|
521
|
-
})
|
|
522
|
-
})
|
|
523
|
-
}
|
|
524
467
|
async ensureRouterMode() {
|
|
525
468
|
const domain = await this.resolvePinokioDomain()
|
|
526
469
|
const shouldUseCustom = domain.length > 0
|
|
@@ -1032,7 +975,6 @@ class Kernel {
|
|
|
1032
975
|
this.loader = new Loader()
|
|
1033
976
|
this.bin = new Bin(this)
|
|
1034
977
|
this.api = new Api(this)
|
|
1035
|
-
this.watch = new WatchManager(this)
|
|
1036
978
|
this.python = new Python(this)
|
|
1037
979
|
this.shell = new Shells(this)
|
|
1038
980
|
this.appLauncher = new AppLauncher(this)
|
|
@@ -1063,7 +1005,6 @@ class Kernel {
|
|
|
1063
1005
|
args: {},
|
|
1064
1006
|
}
|
|
1065
1007
|
this.procs = {}
|
|
1066
|
-
this.activeProcessWaits = {}
|
|
1067
1008
|
this.template = new Template()
|
|
1068
1009
|
try {
|
|
1069
1010
|
if (this.homedir) {
|
|
@@ -1110,10 +1051,6 @@ class Kernel {
|
|
|
1110
1051
|
|
|
1111
1052
|
// 2. mkdir all the folders if not already created
|
|
1112
1053
|
await Environment.init_folders(this.homedir, this)
|
|
1113
|
-
await Environment.ensurePinokioCacheDirs(this, {
|
|
1114
|
-
throwOnFailure: true,
|
|
1115
|
-
elevatedRepair: this.elevatedCacheRepair.bind(this)
|
|
1116
|
-
})
|
|
1117
1054
|
|
|
1118
1055
|
// if key.json doesn't exist, create an empty json file
|
|
1119
1056
|
let ee = await this.exists(this.homedir, "key.json")
|
package/kernel/plugin.js
CHANGED
|
@@ -1,14 +1,39 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
3
|
-
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const { glob } = require('glob')
|
|
3
|
+
const Info = require("./info")
|
|
4
4
|
class Plugin {
|
|
5
5
|
constructor(kernel) {
|
|
6
6
|
this.kernel = kernel
|
|
7
7
|
}
|
|
8
8
|
async setConfig() {
|
|
9
|
+
let plugin_dir = path.resolve(this.kernel.homedir, "plugin")
|
|
9
10
|
this.cache = {}
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
let plugin_paths = await glob('**/pinokio.js', { cwd: plugin_dir })
|
|
13
|
+
|
|
14
|
+
let plugins = []
|
|
15
|
+
for(let plugin_path of plugin_paths) {
|
|
16
|
+
let config = await this.kernel.require(path.resolve(plugin_dir, plugin_path))
|
|
17
|
+
if (config && config.run && Array.isArray(config.run)) {
|
|
18
|
+
let invalid
|
|
19
|
+
for(let key in config) {
|
|
20
|
+
if (typeof config[key] === "function") {
|
|
21
|
+
invalid = true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (invalid) {
|
|
25
|
+
continue
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let chunks = plugin_path.split(path.sep)
|
|
29
|
+
let cwd = chunks.slice(0, -1).join("/")
|
|
30
|
+
config.image = "/asset/plugin/" + cwd + "/" + config.icon
|
|
31
|
+
plugins.push({
|
|
32
|
+
href: "/run/plugin/" + chunks.join("/"),
|
|
33
|
+
...config
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
}
|
|
12
37
|
|
|
13
38
|
this.config = {
|
|
14
39
|
menu: plugins.map((plugin) => {
|
|
@@ -23,10 +48,37 @@ class Plugin {
|
|
|
23
48
|
if (!exists) {
|
|
24
49
|
await fs.promises.mkdir(this.kernel.path("plugin"), { recursive: true }).catch((e) => {})
|
|
25
50
|
}
|
|
26
|
-
await this.
|
|
51
|
+
let code_exists = await this.kernel.exists("plugin/code")
|
|
52
|
+
console.log({ code_exists })
|
|
53
|
+
if (!code_exists) {
|
|
54
|
+
if (this.kernel.bin.installed && this.kernel.bin.installed.conda && this.kernel.bin.installed.conda.has("git")) {
|
|
55
|
+
await this.kernel.exec({
|
|
56
|
+
//message: "git clone https://github.com/peanutcocktail/plugin",
|
|
57
|
+
//message: "git clone https://github.com/pinokiocomputer/plugin",
|
|
58
|
+
message: "git clone https://github.com/pinokiocomputer/code",
|
|
59
|
+
path: this.kernel.path("plugin")
|
|
60
|
+
}, (e) => {
|
|
61
|
+
process.stdout.write(e.raw)
|
|
62
|
+
})
|
|
63
|
+
await this.setConfig()
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
await this.setConfig()
|
|
68
|
+
}
|
|
27
69
|
}
|
|
28
70
|
async update() {
|
|
29
|
-
|
|
71
|
+
if (this.kernel.bin.installed && this.kernel.bin.installed.conda && this.kernel.bin.installed.conda.has("git")) {
|
|
72
|
+
let exists = await this.kernel.exists("plugin")
|
|
73
|
+
if (!exists) {
|
|
74
|
+
await this.kernel.exec({
|
|
75
|
+
message: "git pull",
|
|
76
|
+
path: this.kernel.path("plugin")
|
|
77
|
+
}, (e) => {
|
|
78
|
+
process.stdout.write(e.raw)
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
}
|
|
30
82
|
}
|
|
31
83
|
}
|
|
32
84
|
module.exports = Plugin
|
package/kernel/prototype.js
CHANGED
|
@@ -3,7 +3,6 @@ const path = require('path')
|
|
|
3
3
|
const { glob, sync, hasMagic } = require('glob-gitignore')
|
|
4
4
|
const marked = require('marked')
|
|
5
5
|
const matter = require('gray-matter');
|
|
6
|
-
const PluginSources = require("./plugin_sources")
|
|
7
6
|
class Proto {
|
|
8
7
|
constructor(kernel) {
|
|
9
8
|
this.kernel = kernel
|
|
@@ -149,9 +148,6 @@ class Proto {
|
|
|
149
148
|
|
|
150
149
|
|
|
151
150
|
if (response) {
|
|
152
|
-
if (response.success) {
|
|
153
|
-
response.success = PluginSources.normalizeLauncherSuccessPlugin(response.success, req.params.tool)
|
|
154
|
-
}
|
|
155
151
|
return response
|
|
156
152
|
} else {
|
|
157
153
|
return { success: "/p/" + name + "/dev" }
|
package/kernel/shell.js
CHANGED
|
@@ -20,7 +20,6 @@ const { applyWindowsNodePackageManagerEnv } = require('./windows_node_package_ma
|
|
|
20
20
|
const ShellParser = require('./shell_parser')
|
|
21
21
|
const AnsiStreamTracker = require('./ansi_stream_tracker')
|
|
22
22
|
const ShellStateSync = require('./shell_state_sync')
|
|
23
|
-
const ShellRunTemplate = require('./api/shell_run_template')
|
|
24
23
|
const home = os.homedir()
|
|
25
24
|
|
|
26
25
|
function normalizeComparablePath(filePath, platform) {
|
|
@@ -294,8 +293,6 @@ class Shell {
|
|
|
294
293
|
}
|
|
295
294
|
}
|
|
296
295
|
|
|
297
|
-
setDefaultEnvValue(this.env, "HF_HUB_DISABLE_UPDATE_CHECK", "1")
|
|
298
|
-
|
|
299
296
|
if (this.platform === "win32") {
|
|
300
297
|
// Hugging Face file symlinks regularly fail on non-admin Windows setups.
|
|
301
298
|
// Default to no-symlink cache mode unless the user/app explicitly overrides it.
|
|
@@ -311,7 +308,7 @@ class Shell {
|
|
|
311
308
|
delete this.env[key]
|
|
312
309
|
}
|
|
313
310
|
let val = this.env[key]
|
|
314
|
-
if (
|
|
311
|
+
if (/[\r\n]/.test(val)) {
|
|
315
312
|
const replaced = val.replaceAll(/[\r\n]+/g, ' ');
|
|
316
313
|
this.env[key] = replaced
|
|
317
314
|
// delete this.env[key]
|
|
@@ -365,9 +362,6 @@ class Shell {
|
|
|
365
362
|
}
|
|
366
363
|
quoteArgForShell(value, shellName=this.shell) {
|
|
367
364
|
const input = value == null ? "" : String(value)
|
|
368
|
-
if (ShellRunTemplate.hasEnvArgMarker(input)) {
|
|
369
|
-
return ShellRunTemplate.quoteEnvArgComposite(input, shellName)
|
|
370
|
-
}
|
|
371
365
|
if (this.isCmdShell(shellName)) {
|
|
372
366
|
return `"${input.replace(/([()%!^"<>&|])/g, '^$1')}"`
|
|
373
367
|
}
|
|
@@ -415,7 +409,6 @@ class Shell {
|
|
|
415
409
|
this.userActive = false
|
|
416
410
|
this.decsyncBuffer = ''
|
|
417
411
|
this.stateSync.reset()
|
|
418
|
-
this.envArgsPreviewed = false
|
|
419
412
|
|
|
420
413
|
/*
|
|
421
414
|
params := {
|
|
@@ -547,9 +540,6 @@ class Shell {
|
|
|
547
540
|
//}
|
|
548
541
|
}
|
|
549
542
|
}
|
|
550
|
-
if (params._pinokio_cmd_delayed_expansion && this.isCmdShell(this.shell) && !this.args.includes("/V:ON")) {
|
|
551
|
-
this.args.push("/V:ON")
|
|
552
|
-
}
|
|
553
543
|
|
|
554
544
|
// 3. path => path can be http, relative, absolute
|
|
555
545
|
this.path = params.path
|
|
@@ -767,16 +757,6 @@ class Shell {
|
|
|
767
757
|
}
|
|
768
758
|
this.stateSync.invalidate({ clearTail: true })
|
|
769
759
|
}
|
|
770
|
-
emitEnvArgsPreview(params) {
|
|
771
|
-
if (!params || !Array.isArray(params._pinokio_env_args) || params._pinokio_env_args.length === 0 || this.envArgsPreviewed) {
|
|
772
|
-
return
|
|
773
|
-
}
|
|
774
|
-
this.envArgsPreviewed = true
|
|
775
|
-
const raw = ShellRunTemplate.formatEnvArgsPreview(params._pinokio_env_args)
|
|
776
|
-
if (raw && this.ondata) {
|
|
777
|
-
this.ondata({ raw })
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
760
|
async run(params, cb) {
|
|
781
761
|
let r = await this.request(params, cb)
|
|
782
762
|
return r
|
|
@@ -1382,7 +1362,6 @@ class Shell {
|
|
|
1382
1362
|
}
|
|
1383
1363
|
async exec(params) {
|
|
1384
1364
|
this.parser = new ShellParser()
|
|
1385
|
-
this.emitEnvArgsPreview(params)
|
|
1386
1365
|
params = await this.activate(params)
|
|
1387
1366
|
this.cmd = this.build(params)
|
|
1388
1367
|
let res = await new Promise((resolve, reject) => {
|
|
@@ -1750,7 +1729,7 @@ class Shell {
|
|
|
1750
1729
|
cmd: this.cmd,
|
|
1751
1730
|
index: this.index,
|
|
1752
1731
|
group: this.group,
|
|
1753
|
-
env:
|
|
1732
|
+
env: this.env,
|
|
1754
1733
|
done: this.done,
|
|
1755
1734
|
ready: this.ready,
|
|
1756
1735
|
id: this.id,
|
package/kernel/util.js
CHANGED
|
@@ -434,65 +434,6 @@ const openURL = (url) => {
|
|
|
434
434
|
console.warn('[Util.openURL] exec failed:', err && err.message ? err.message : err)
|
|
435
435
|
}
|
|
436
436
|
}
|
|
437
|
-
const openURI = async (uri) => {
|
|
438
|
-
const platform = os.platform()
|
|
439
|
-
const launch = (command, args) => {
|
|
440
|
-
return new Promise((resolve, reject) => {
|
|
441
|
-
let settled = false
|
|
442
|
-
const settle = (fn, value) => {
|
|
443
|
-
if (settled) return
|
|
444
|
-
settled = true
|
|
445
|
-
clearTimeout(timer)
|
|
446
|
-
fn(value)
|
|
447
|
-
}
|
|
448
|
-
const timer = setTimeout(() => {
|
|
449
|
-
settle(resolve, {
|
|
450
|
-
ok: true,
|
|
451
|
-
command,
|
|
452
|
-
status: 'started'
|
|
453
|
-
})
|
|
454
|
-
}, 3000)
|
|
455
|
-
const child = spawn(command, args, {
|
|
456
|
-
detached: true,
|
|
457
|
-
stdio: 'ignore'
|
|
458
|
-
})
|
|
459
|
-
child.on('error', (error) => {
|
|
460
|
-
settle(reject, error)
|
|
461
|
-
})
|
|
462
|
-
child.on('close', (code) => {
|
|
463
|
-
if (code) {
|
|
464
|
-
settle(reject, new Error(`${command} exited with code ${code}`))
|
|
465
|
-
} else {
|
|
466
|
-
settle(resolve, {
|
|
467
|
-
ok: true,
|
|
468
|
-
command,
|
|
469
|
-
status: 'exited'
|
|
470
|
-
})
|
|
471
|
-
}
|
|
472
|
-
})
|
|
473
|
-
child.unref()
|
|
474
|
-
})
|
|
475
|
-
}
|
|
476
|
-
try {
|
|
477
|
-
if (platform === 'darwin') {
|
|
478
|
-
return await launch('open', [uri])
|
|
479
|
-
} else if (platform === 'win32') {
|
|
480
|
-
try {
|
|
481
|
-
return await launch('rundll32.exe', ['url.dll,FileProtocolHandler', uri])
|
|
482
|
-
} catch (error) {
|
|
483
|
-
console.warn('[Util.openURI] rundll32 failed, falling back to explorer:', error && error.message ? error.message : error)
|
|
484
|
-
return await launch('explorer.exe', [uri])
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
return await launch('xdg-open', [uri])
|
|
488
|
-
} catch (err) {
|
|
489
|
-
console.warn('[Util.openURI] spawn failed:', err && err.message ? err.message : err)
|
|
490
|
-
return {
|
|
491
|
-
ok: false,
|
|
492
|
-
error: err && err.message ? err.message : String(err)
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
437
|
const openfs = (dirPath, options, kernel) => {
|
|
497
438
|
let command = '';
|
|
498
439
|
const platform = os.platform()
|
|
@@ -1256,7 +1197,6 @@ module.exports = {
|
|
|
1256
1197
|
find_venv,
|
|
1257
1198
|
fill_object,
|
|
1258
1199
|
run,
|
|
1259
|
-
openURI,
|
|
1260
1200
|
openURL,
|
|
1261
1201
|
u2p,
|
|
1262
1202
|
p2u,
|