@chainingintention/pi-web-cn 1.202606.4 → 1.202606.6
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/README.md +1 -1
- package/dist/client/assets/{CodeViewer-BNKhIElN.js → CodeViewer-8znVN61S.js} +1 -1
- package/dist/client/assets/{TerminalPanel-VPiiPQfC.js → TerminalPanel-DrdWnF1y.js} +1 -1
- package/dist/client/assets/index-BiGrW6IC.js +2169 -0
- package/dist/client/index.html +1 -1
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -1
- package/dist/plugin-api.d.ts +17 -11
- package/dist/server/app.js +55 -17
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +77 -0
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/gitRoutes.js +16 -3
- package/dist/server/gitRoutes.js.map +1 -1
- package/dist/server/machines/machinePluginProxyRoutes.js +179 -0
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineProxyRoutes.js +1 -0
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/managementEmbed.js +205 -0
- package/dist/server/managementEmbed.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +66 -8
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessions/managementPermissionSystem.js +94 -0
- package/dist/server/sessions/managementPermissionSystem.js.map +1 -0
- package/dist/server/sessions/managementSandbox.js +156 -0
- package/dist/server/sessions/managementSandbox.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +339 -31
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionNameGenerator.js +2 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +9 -4
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/terminalProxyRoutes.js +64 -8
- package/dist/server/terminalProxyRoutes.js.map +1 -1
- package/dist/server/terminals/terminalRoutes.js +23 -3
- package/dist/server/terminals/terminalRoutes.js.map +1 -1
- package/dist/server/terminals/terminalService.js +54 -4
- package/dist/server/terminals/terminalService.js.map +1 -1
- package/dist/server/workspaceExplorerRoutes.js +103 -4
- package/dist/server/workspaceExplorerRoutes.js.map +1 -1
- package/dist/server/workspaces/fileOperationService.js +95 -0
- package/dist/server/workspaces/fileOperationService.js.map +1 -0
- package/dist/server/workspaces/fileUploadService.js +23 -0
- package/dist/server/workspaces/fileUploadService.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +9 -2
- package/dist/server/workspaces/pathSafety.js.map +1 -1
- package/dist/server/workspaces/workspaceDeletionRoutes.js +127 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +12 -12
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- package/dist/shared/apiTypes.d.ts +30 -0
- package/dist/shared/federatedRoutes.js +9 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/machinePluginIds.js +41 -0
- package/dist/shared/machinePluginIds.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +12 -0
- package/dist/shared/workspaceDeletion.js.map +1 -0
- package/docs/plugins.md +88 -12
- package/package.json +1 -1
- package/dist/client/assets/index-Csx3hC75.js +0 -1994
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export const PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR = "PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR";
|
|
5
|
+
const MANAGEMENT_AGENT_TOOL_NAMES = ["read", "write", "edit", "ls", "grep", "find", "python"];
|
|
6
|
+
export function createManagementPermissionSystemPolicy(context) {
|
|
7
|
+
const tools = {
|
|
8
|
+
"*": "deny",
|
|
9
|
+
};
|
|
10
|
+
for (const tool of managementAgentToolNames(context))
|
|
11
|
+
tools[tool] = "allow";
|
|
12
|
+
for (const tool of managementDeniedToolNames(context))
|
|
13
|
+
tools[tool] = "deny";
|
|
14
|
+
return {
|
|
15
|
+
defaultPolicy: {
|
|
16
|
+
tools: "deny",
|
|
17
|
+
bash: "deny",
|
|
18
|
+
mcp: "deny",
|
|
19
|
+
skills: "deny",
|
|
20
|
+
special: "deny",
|
|
21
|
+
},
|
|
22
|
+
tools,
|
|
23
|
+
bash: { "*": "deny" },
|
|
24
|
+
mcp: { "*": "deny" },
|
|
25
|
+
skills: { "*": "deny" },
|
|
26
|
+
special: {
|
|
27
|
+
doom_loop: "deny",
|
|
28
|
+
external_directory: "deny",
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function managementAgentToolNames(context) {
|
|
33
|
+
const deny = new Set([...(context.tools?.deny ?? []), "bash", "shell", "terminal"]);
|
|
34
|
+
const allow = context.tools?.allow;
|
|
35
|
+
const safeTools = MANAGEMENT_AGENT_TOOL_NAMES.filter((tool) => !deny.has(tool));
|
|
36
|
+
if (allow === undefined || allow.length === 0)
|
|
37
|
+
return [...safeTools];
|
|
38
|
+
return safeTools.filter((tool) => allow.includes(tool));
|
|
39
|
+
}
|
|
40
|
+
export async function writeManagementPermissionSystemPolicy(agentDir, cwd, context) {
|
|
41
|
+
const policyAgentDir = join(agentDir, "management-embed", "permission-system", safePathSegment(context.user.rootUserId), createHash("sha256").update(cwd).digest("hex").slice(0, 16));
|
|
42
|
+
await mkdir(policyAgentDir, { recursive: true });
|
|
43
|
+
await writeFile(join(policyAgentDir, "pi-permissions.jsonc"), `${JSON.stringify(createManagementPermissionSystemPolicy(context), null, 2)}\n`, "utf8");
|
|
44
|
+
return policyAgentDir;
|
|
45
|
+
}
|
|
46
|
+
let runtimeEnvironmentQueue = Promise.resolve();
|
|
47
|
+
export async function withRuntimeCreationEnvironment(env, action) {
|
|
48
|
+
const previousQueue = runtimeEnvironmentQueue;
|
|
49
|
+
let releaseQueue = () => undefined;
|
|
50
|
+
runtimeEnvironmentQueue = new Promise((resolve) => {
|
|
51
|
+
releaseQueue = resolve;
|
|
52
|
+
});
|
|
53
|
+
await previousQueue;
|
|
54
|
+
const previousValues = new Map();
|
|
55
|
+
for (const [key, value] of Object.entries(env)) {
|
|
56
|
+
previousValues.set(key, process.env[key]);
|
|
57
|
+
if (value === undefined)
|
|
58
|
+
Reflect.deleteProperty(process.env, key);
|
|
59
|
+
else
|
|
60
|
+
process.env[key] = value;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
return await action();
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
for (const [key, value] of previousValues) {
|
|
67
|
+
if (value === undefined)
|
|
68
|
+
Reflect.deleteProperty(process.env, key);
|
|
69
|
+
else
|
|
70
|
+
process.env[key] = value;
|
|
71
|
+
}
|
|
72
|
+
releaseQueue();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function managementDeniedToolNames(context) {
|
|
76
|
+
return [
|
|
77
|
+
"bash",
|
|
78
|
+
"shell",
|
|
79
|
+
"terminal",
|
|
80
|
+
"terminal-command-runs",
|
|
81
|
+
"powershell",
|
|
82
|
+
"pwsh",
|
|
83
|
+
"mcp",
|
|
84
|
+
"http",
|
|
85
|
+
"webfetch",
|
|
86
|
+
"websearch",
|
|
87
|
+
...(context.tools?.deny ?? []),
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
function safePathSegment(value) {
|
|
91
|
+
const safe = value.trim().replace(/[^a-zA-Z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
92
|
+
return safe === "" ? "user" : safe.slice(0, 80);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=managementPermissionSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managementPermissionSystem.js","sourceRoot":"","sources":["../../../src/server/sessions/managementPermissionSystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
const DEFAULT_PATH = "/usr/local/bin:/usr/bin:/bin";
|
|
2
|
+
const SAFE_HOST_ENV_KEYS = ["PATH", "LANG", "LC_ALL", "LC_CTYPE"];
|
|
3
|
+
const SENSITIVE_ENV_PATTERNS = ["TOKEN", "SECRET", "PASSWORD", "PRIVATE_KEY", "API_KEY"];
|
|
4
|
+
const SANDBOX_WORKSPACE = "/workspace";
|
|
5
|
+
const SANDBOX_HOME = "/tmp/pi-web-home";
|
|
6
|
+
export const DEFAULT_BUBBLEWRAP_PATHS = [
|
|
7
|
+
"/usr",
|
|
8
|
+
"/bin",
|
|
9
|
+
"/lib",
|
|
10
|
+
"/lib64",
|
|
11
|
+
"/etc/alternatives",
|
|
12
|
+
"/etc/ld.so.cache",
|
|
13
|
+
"/etc/ssl",
|
|
14
|
+
"/etc/ca-certificates",
|
|
15
|
+
];
|
|
16
|
+
export function createManagedSandboxEnvironment(options) {
|
|
17
|
+
const env = {};
|
|
18
|
+
for (const key of SAFE_HOST_ENV_KEYS) {
|
|
19
|
+
const value = options.hostEnv[key];
|
|
20
|
+
if (value !== undefined && value !== "")
|
|
21
|
+
env[key] = value;
|
|
22
|
+
}
|
|
23
|
+
env["PATH"] ??= DEFAULT_PATH;
|
|
24
|
+
for (const [key, value] of Object.entries(options.context.sandbox?.env ?? {})) {
|
|
25
|
+
assertNonSensitiveSandboxEnvKey(key);
|
|
26
|
+
env[key] = value;
|
|
27
|
+
}
|
|
28
|
+
env["HOME"] = SANDBOX_HOME;
|
|
29
|
+
env["TMPDIR"] = "/tmp";
|
|
30
|
+
return env;
|
|
31
|
+
}
|
|
32
|
+
export function createBubblewrapPythonInvocation(options) {
|
|
33
|
+
const args = [
|
|
34
|
+
"--unshare-net",
|
|
35
|
+
"--unshare-ipc",
|
|
36
|
+
"--unshare-pid",
|
|
37
|
+
"--die-with-parent",
|
|
38
|
+
"--clearenv",
|
|
39
|
+
...Object.entries(options.env ?? {}).flatMap(([key, value]) => ["--setenv", key, value ?? ""]),
|
|
40
|
+
"--tmpfs",
|
|
41
|
+
"/tmp",
|
|
42
|
+
"--dir",
|
|
43
|
+
SANDBOX_HOME,
|
|
44
|
+
"--proc",
|
|
45
|
+
"/proc",
|
|
46
|
+
"--dev",
|
|
47
|
+
"/dev",
|
|
48
|
+
...[...new Set(options.readOnlyPaths ?? DEFAULT_BUBBLEWRAP_PATHS)].flatMap((path) => ["--ro-bind", path, path]),
|
|
49
|
+
"--bind",
|
|
50
|
+
options.workspaceRoot,
|
|
51
|
+
SANDBOX_WORKSPACE,
|
|
52
|
+
"--chdir",
|
|
53
|
+
SANDBOX_WORKSPACE,
|
|
54
|
+
options.pythonExecutable,
|
|
55
|
+
"-I",
|
|
56
|
+
"-",
|
|
57
|
+
];
|
|
58
|
+
return { command: options.bubblewrapExecutable, args };
|
|
59
|
+
}
|
|
60
|
+
export function bubblewrapUnavailableReason(output) {
|
|
61
|
+
if (output.includes("setting up uid map: Permission denied"))
|
|
62
|
+
return "setting up uid map: Permission denied";
|
|
63
|
+
if (output.includes("Failed RTM_NEWADDR: Operation not permitted"))
|
|
64
|
+
return "Failed RTM_NEWADDR: Operation not permitted";
|
|
65
|
+
if (output.includes("No permissions to creating new namespace"))
|
|
66
|
+
return "No permissions to creating new namespace";
|
|
67
|
+
if (output.includes("Creating new namespace failed"))
|
|
68
|
+
return "Creating new namespace failed";
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
export function createManagedPythonFallbackPrelude(root) {
|
|
72
|
+
return `
|
|
73
|
+
import builtins
|
|
74
|
+
import io
|
|
75
|
+
import os
|
|
76
|
+
import pathlib
|
|
77
|
+
import subprocess
|
|
78
|
+
|
|
79
|
+
_PI_WEB_ROOT = ${JSON.stringify(root)}
|
|
80
|
+
_PI_WEB_OPEN = builtins.open
|
|
81
|
+
_PI_WEB_IO_OPEN = io.open
|
|
82
|
+
_PI_WEB_PATH_OPEN = pathlib.Path.open
|
|
83
|
+
_PI_WEB_PATH_READ_TEXT = pathlib.Path.read_text
|
|
84
|
+
_PI_WEB_PATH_READ_BYTES = pathlib.Path.read_bytes
|
|
85
|
+
_PI_WEB_PATH_WRITE_TEXT = pathlib.Path.write_text
|
|
86
|
+
_PI_WEB_PATH_WRITE_BYTES = pathlib.Path.write_bytes
|
|
87
|
+
|
|
88
|
+
def _pi_web_inside(path):
|
|
89
|
+
real = os.path.realpath(os.fspath(path))
|
|
90
|
+
rel = os.path.relpath(real, _PI_WEB_ROOT)
|
|
91
|
+
return rel == "." or (not rel.startswith("..") and not os.path.isabs(rel))
|
|
92
|
+
|
|
93
|
+
def _pi_web_check_path(path):
|
|
94
|
+
if not isinstance(path, (str, bytes, os.PathLike)):
|
|
95
|
+
return
|
|
96
|
+
if not _pi_web_inside(path):
|
|
97
|
+
raise PermissionError("path outside the managed project sandbox: %s" % path)
|
|
98
|
+
|
|
99
|
+
def open(file, mode="r", *args, **kwargs):
|
|
100
|
+
_pi_web_check_path(file)
|
|
101
|
+
return _PI_WEB_OPEN(file, mode, *args, **kwargs)
|
|
102
|
+
|
|
103
|
+
def _pi_web_path_open(self, *args, **kwargs):
|
|
104
|
+
_pi_web_check_path(self)
|
|
105
|
+
return _PI_WEB_PATH_OPEN(self, *args, **kwargs)
|
|
106
|
+
|
|
107
|
+
def _pi_web_path_read_text(self, *args, **kwargs):
|
|
108
|
+
_pi_web_check_path(self)
|
|
109
|
+
return _PI_WEB_PATH_READ_TEXT(self, *args, **kwargs)
|
|
110
|
+
|
|
111
|
+
def _pi_web_path_read_bytes(self, *args, **kwargs):
|
|
112
|
+
_pi_web_check_path(self)
|
|
113
|
+
return _PI_WEB_PATH_READ_BYTES(self, *args, **kwargs)
|
|
114
|
+
|
|
115
|
+
def _pi_web_path_write_text(self, *args, **kwargs):
|
|
116
|
+
_pi_web_check_path(self)
|
|
117
|
+
return _PI_WEB_PATH_WRITE_TEXT(self, *args, **kwargs)
|
|
118
|
+
|
|
119
|
+
def _pi_web_path_write_bytes(self, *args, **kwargs):
|
|
120
|
+
_pi_web_check_path(self)
|
|
121
|
+
return _PI_WEB_PATH_WRITE_BYTES(self, *args, **kwargs)
|
|
122
|
+
|
|
123
|
+
def _pi_web_blocked_os_path(path, *args, **kwargs):
|
|
124
|
+
_pi_web_check_path(path)
|
|
125
|
+
raise PermissionError("low-level os path APIs are disabled in managed Python fallback mode")
|
|
126
|
+
|
|
127
|
+
def _pi_web_blocked_process(*args, **kwargs):
|
|
128
|
+
raise PermissionError("subprocess and shell execution are disabled in managed Python fallback mode")
|
|
129
|
+
|
|
130
|
+
builtins.open = open
|
|
131
|
+
io.open = open
|
|
132
|
+
pathlib.Path.open = _pi_web_path_open
|
|
133
|
+
pathlib.Path.read_text = _pi_web_path_read_text
|
|
134
|
+
pathlib.Path.read_bytes = _pi_web_path_read_bytes
|
|
135
|
+
pathlib.Path.write_text = _pi_web_path_write_text
|
|
136
|
+
pathlib.Path.write_bytes = _pi_web_path_write_bytes
|
|
137
|
+
os.open = _pi_web_blocked_os_path
|
|
138
|
+
os.listdir = _pi_web_blocked_os_path
|
|
139
|
+
os.scandir = _pi_web_blocked_os_path
|
|
140
|
+
os.stat = _pi_web_blocked_os_path
|
|
141
|
+
os.lstat = _pi_web_blocked_os_path
|
|
142
|
+
subprocess.Popen = _pi_web_blocked_process
|
|
143
|
+
subprocess.run = _pi_web_blocked_process
|
|
144
|
+
subprocess.call = _pi_web_blocked_process
|
|
145
|
+
subprocess.check_call = _pi_web_blocked_process
|
|
146
|
+
subprocess.check_output = _pi_web_blocked_process
|
|
147
|
+
os.system = _pi_web_blocked_process
|
|
148
|
+
`;
|
|
149
|
+
}
|
|
150
|
+
function assertNonSensitiveSandboxEnvKey(key) {
|
|
151
|
+
const upper = key.toUpperCase();
|
|
152
|
+
if (SENSITIVE_ENV_PATTERNS.some((pattern) => upper.includes(pattern))) {
|
|
153
|
+
throw new Error(`Sensitive sandbox environment variable is not allowed: ${key}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=managementSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managementSandbox.js","sourceRoot":"","sources":["../../../src/server/sessions/managementSandbox.ts"],"names":[],"mappings":"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"}
|