@chainingintention/pi-web-cn 1.202609.8 → 1.202609.9
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/dist/server/managementEmbed.js +10 -0
- package/dist/server/managementEmbed.js.map +1 -1
- package/dist/server/managementPrivileges.js +14 -0
- package/dist/server/managementPrivileges.js.map +1 -0
- package/dist/server/realtime/sessionEventScope.js +4 -0
- package/dist/server/realtime/sessionEventScope.js.map +1 -1
- package/dist/server/sessiond.js +3 -1
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/managementAgentTools.js +106 -3
- package/dist/server/sessions/managementAgentTools.js.map +1 -1
- package/dist/server/sessions/managementPermissionSystem.js +20 -9
- package/dist/server/sessions/managementPermissionSystem.js.map +1 -1
- package/dist/server/sessions/managementSandbox.js +7 -18
- package/dist/server/sessions/managementSandbox.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +20 -9
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/terminals/terminalService.js +9 -3
- package/dist/server/terminals/terminalService.js.map +1 -1
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/piWebConfigParsing.js +2 -0
- package/dist/shared/piWebConfigParsing.js.map +1 -1
- package/docs/config.md +7 -1
- package/package.json +1 -1
|
@@ -31,21 +31,7 @@ export function createManagedSandboxEnvironment(options) {
|
|
|
31
31
|
}
|
|
32
32
|
export function createBubblewrapPythonInvocation(options) {
|
|
33
33
|
const args = [
|
|
34
|
-
|
|
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-try", path, path]),
|
|
34
|
+
...bubblewrapBaseArgs(options.env, options.readOnlyPaths, options.network),
|
|
49
35
|
"--bind",
|
|
50
36
|
options.workspaceRoot,
|
|
51
37
|
MANAGED_SANDBOX_WORKSPACE,
|
|
@@ -58,11 +44,14 @@ export function createBubblewrapPythonInvocation(options) {
|
|
|
58
44
|
return { command: options.bubblewrapExecutable, args };
|
|
59
45
|
}
|
|
60
46
|
export function createBubblewrapShellInvocation(options) {
|
|
47
|
+
const hostFilesystem = options.hostFilesystem === true;
|
|
61
48
|
const args = [
|
|
62
|
-
...bubblewrapBaseArgs(options.env, options.readOnlyPaths),
|
|
49
|
+
...bubblewrapBaseArgs(options.env, hostFilesystem ? [] : options.readOnlyPaths, options.network),
|
|
50
|
+
...(hostFilesystem ? ["--ro-bind-try", "/", "/"] : []),
|
|
63
51
|
"--bind",
|
|
64
52
|
options.workspaceRoot,
|
|
65
53
|
MANAGED_SANDBOX_WORKSPACE,
|
|
54
|
+
...(hostFilesystem ? ["--bind", options.workspaceRoot, options.workspaceRoot] : []),
|
|
66
55
|
"--chdir",
|
|
67
56
|
MANAGED_SANDBOX_WORKSPACE,
|
|
68
57
|
options.shellExecutable,
|
|
@@ -71,9 +60,9 @@ export function createBubblewrapShellInvocation(options) {
|
|
|
71
60
|
];
|
|
72
61
|
return { command: options.bubblewrapExecutable, args };
|
|
73
62
|
}
|
|
74
|
-
function bubblewrapBaseArgs(env, readOnlyPaths) {
|
|
63
|
+
function bubblewrapBaseArgs(env, readOnlyPaths, network = false) {
|
|
75
64
|
return [
|
|
76
|
-
"--unshare-net",
|
|
65
|
+
...(network ? [] : ["--unshare-net"]),
|
|
77
66
|
"--unshare-ipc",
|
|
78
67
|
"--unshare-pid",
|
|
79
68
|
"--die-with-parent",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managementSandbox.js","sourceRoot":"","sources":["../../../src/server/sessions/managementSandbox.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAG,8BAA8B,CAAC;AACpD,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAC3E,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,CAAU,CAAC;AAClG,MAAM,CAAC,MAAM,yBAAyB,GAAG,YAAY,CAAC;AACtD,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,mBAAmB;IACnB,kBAAkB;IAClB,UAAU;IACV,sBAAsB;CACd,CAAC;
|
|
1
|
+
{"version":3,"file":"managementSandbox.js","sourceRoot":"","sources":["../../../src/server/sessions/managementSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ import { createLocalOnlyModelRuntime } from "./authService.js";
|
|
|
24
24
|
import { canonicalizeStoredCwd, cwdPathsEqual } from "../workingDirectory.js";
|
|
25
25
|
import { clearSessionFileParent, readSessionHeaderSummary } from "./sessionFileHeader.js";
|
|
26
26
|
import { workbenchAccessHandle } from "../managementEmbed.js";
|
|
27
|
+
import { managementPrivilegeRequested, managementPrivileges } from "../managementPrivileges.js";
|
|
27
28
|
import { DEFAULT_EXTENSION_DIALOGS_TIMEOUT_MS, piWebDataDir } from "../../config.js";
|
|
28
29
|
import { createScopedSettingsManager, resolveSettingsScopeDirectory } from "./projectSettingsScope.js";
|
|
29
30
|
import { createAskUserToolDefinition } from "./askUserTool.js";
|
|
@@ -34,8 +35,8 @@ import { createSpawnSessionToolDefinition } from "./spawnSessionTool.js";
|
|
|
34
35
|
import { createSubsessionToolDefinitions } from "./spawnSubsessionTool.js";
|
|
35
36
|
import { buildTranscriptView } from "./subsessionTranscript.js";
|
|
36
37
|
import { planSessionCleanup, summarizeSessionCleanupExecution } from "./sessionCleanup.js";
|
|
37
|
-
import { createManagedAgentToolOptions, createManagedPythonToolDefinition } from "./managementAgentTools.js";
|
|
38
|
-
import { PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR, managementAgentToolNames, withRuntimeCreationEnvironment, writeManagementPermissionSystemPolicy } from "./managementPermissionSystem.js";
|
|
38
|
+
import { createManagedAgentToolOptions, createManagedBashToolDefinition, createManagedPythonToolDefinition } from "./managementAgentTools.js";
|
|
39
|
+
import { PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR, managementAgentToolNames, privilegedManagementToolNames, withRuntimeCreationEnvironment, writeManagementPermissionSystemPolicy } from "./managementPermissionSystem.js";
|
|
39
40
|
import { SessionNotificationStore } from "./sessionNotificationStore.js";
|
|
40
41
|
import { plainTextTheme } from "./plainTextTheme.js";
|
|
41
42
|
import { deduplicateBundledRelaySkills, ensureManagedRelaySkills, MANAGED_RELAY_SKILL_NAMES } from "./relaySkill.js";
|
|
@@ -370,11 +371,11 @@ export function piWebResourceLoaderOptions(appendSystemPromptSections) {
|
|
|
370
371
|
return undefined;
|
|
371
372
|
return { appendSystemPromptOverride: (base) => [...base, ...appendSystemPromptSections] };
|
|
372
373
|
}
|
|
373
|
-
function createDefaultRuntimeFactory(normalModelRuntimeForCwd, managementModelRuntime, resolveSettingsScope, spawn, subsessions, askUser, workbench, logger = noopLogger, managementAudit, managementProjectIdForCwd, appendSystemPromptSections = []) {
|
|
374
|
+
function createDefaultRuntimeFactory(normalModelRuntimeForCwd, managementModelRuntime, resolveSettingsScope, spawn, subsessions, askUser, workbench, logger = noopLogger, managementAudit, managementProjectIdForCwd, appendSystemPromptSections = [], managementAllowPrivileged = false) {
|
|
374
375
|
return async ({ cwd, agentDir, sessionManager, sessionStartEvent, managementContext, initialModel, initialThinkingLevel, delegationToolsEnabled = true }) => {
|
|
375
376
|
const scopedModelRuntime = managementContext === undefined ? await normalModelRuntimeForCwd(cwd) : await managementModelRuntime();
|
|
376
377
|
if (managementContext !== undefined) {
|
|
377
|
-
return createManagementRuntimeFactory(scopedModelRuntime, resolveSettingsScope, spawn, subsessions, askUser, managementContext, workbench, logger, managementAudit, managementProjectIdForCwd)({
|
|
378
|
+
return createManagementRuntimeFactory(scopedModelRuntime, resolveSettingsScope, spawn, subsessions, askUser, managementContext, workbench, logger, managementAudit, managementProjectIdForCwd, managementAllowPrivileged)({
|
|
378
379
|
cwd,
|
|
379
380
|
agentDir,
|
|
380
381
|
sessionManager,
|
|
@@ -421,7 +422,7 @@ function createDefaultRuntimeFactory(normalModelRuntimeForCwd, managementModelRu
|
|
|
421
422
|
return { ...result, services, diagnostics: services.diagnostics };
|
|
422
423
|
};
|
|
423
424
|
}
|
|
424
|
-
function createManagementRuntimeFactory(modelRuntime, resolveSettingsScope, spawn, subsessions, askUser, managementContext, workbench, logger, managementAudit, managementProjectIdForCwd) {
|
|
425
|
+
function createManagementRuntimeFactory(modelRuntime, resolveSettingsScope, spawn, subsessions, askUser, managementContext, workbench, logger, managementAudit, managementProjectIdForCwd, managementAllowPrivileged = false) {
|
|
425
426
|
return async ({ cwd, agentDir, sessionManager, sessionStartEvent, initialModel, initialThinkingLevel, delegationToolsEnabled = true }) => {
|
|
426
427
|
await ensureManagedRelaySkills(cwd);
|
|
427
428
|
const auditIdentity = await resolveManagementAuditIdentity(cwd, managementContext, managementProjectIdForCwd, logger);
|
|
@@ -463,7 +464,16 @@ function createManagementRuntimeFactory(modelRuntime, resolveSettingsScope, spaw
|
|
|
463
464
|
...workbenchTools,
|
|
464
465
|
];
|
|
465
466
|
const controlledManagementToolNames = controlledManagementTools.map((tool) => tool.name);
|
|
466
|
-
const
|
|
467
|
+
const privileges = managementPrivileges(managementContext, { allowPrivileged: managementAllowPrivileged });
|
|
468
|
+
if (!managementAllowPrivileged && managementPrivilegeRequested(managementContext)) {
|
|
469
|
+
logger.info({
|
|
470
|
+
userId: managementContext.user.id,
|
|
471
|
+
requestedBash: managementContext.privileged?.bash === true,
|
|
472
|
+
requestedNetwork: managementContext.privileged?.network === true,
|
|
473
|
+
}, "management privileged grant ignored because managementEmbed.allowPrivileged is disabled");
|
|
474
|
+
}
|
|
475
|
+
const extraToolNames = [...controlledManagementToolNames, ...privilegedManagementToolNames(privileges)];
|
|
476
|
+
const policyAgentDir = await writeManagementPermissionSystemPolicy(agentDir, cwd, managementContext, extraToolNames, privileges);
|
|
467
477
|
return withRuntimeCreationEnvironment({ [PI_PERMISSION_SYSTEM_POLICY_AGENT_DIR]: policyAgentDir }, async () => {
|
|
468
478
|
const settingsManager = await createScopedSettingsManager({
|
|
469
479
|
cwd,
|
|
@@ -491,7 +501,8 @@ function createManagementRuntimeFactory(modelRuntime, resolveSettingsScope, spaw
|
|
|
491
501
|
const managedToolOptions = createManagedAgentToolOptions(cwd);
|
|
492
502
|
const customTools = [
|
|
493
503
|
...managedAgentToolDefinitions(cwd, managedToolOptions),
|
|
494
|
-
createManagedPythonToolDefinition(cwd, managementContext),
|
|
504
|
+
createManagedPythonToolDefinition(cwd, managementContext, { network: privileges.network }),
|
|
505
|
+
...(privileges.bash ? [createManagedBashToolDefinition(cwd, managementContext, { network: privileges.network })] : []),
|
|
495
506
|
...controlledManagementTools,
|
|
496
507
|
];
|
|
497
508
|
const options = {
|
|
@@ -499,7 +510,7 @@ function createManagementRuntimeFactory(modelRuntime, resolveSettingsScope, spaw
|
|
|
499
510
|
sessionManager,
|
|
500
511
|
...(sessionStartEvent === undefined ? {} : { sessionStartEvent }),
|
|
501
512
|
customTools,
|
|
502
|
-
tools: managementAgentToolNames(managementContext,
|
|
513
|
+
tools: managementAgentToolNames(managementContext, extraToolNames, privileges),
|
|
503
514
|
...(modelOptions.model === undefined ? {} : { model: modelOptions.model }),
|
|
504
515
|
...(modelOptions.thinkingLevel === undefined ? {} : { thinkingLevel: modelOptions.thinkingLevel }),
|
|
505
516
|
...(modelOptions.scopedModels.length === 0 ? {} : { scopedModels: modelOptions.scopedModels }),
|
|
@@ -647,7 +658,7 @@ export class PiSessionService {
|
|
|
647
658
|
list: (parentSessionId, parentSessionFile) => this.listSubsessions(parentSessionId, parentSessionFile),
|
|
648
659
|
check: (parentSessionId, sessionId, parentSessionFile) => this.checkSubsession(parentSessionId, sessionId, parentSessionFile),
|
|
649
660
|
read: (parentSessionId, sessionId, query, parentSessionFile) => this.readSubsession(parentSessionId, sessionId, query, parentSessionFile),
|
|
650
|
-
}, deps.askUserEnabled === true ? { open: (input) => this.openAsk(input) } : undefined, deps.workbench, this.logger, this.managementAudit, this.managementProjectIdForCwd, deps.appendSystemPromptSections ?? []);
|
|
661
|
+
}, deps.askUserEnabled === true ? { open: (input) => this.openAsk(input) } : undefined, deps.workbench, this.logger, this.managementAudit, this.managementProjectIdForCwd, deps.appendSystemPromptSections ?? [], deps.managementAllowPrivileged === true);
|
|
651
662
|
this.createAgentRuntime = deps.createAgentRuntime ?? defaultCreateAgentRuntime;
|
|
652
663
|
this.workspaceActivity = deps.workspaceActivity;
|
|
653
664
|
this.heartbeat = setInterval(() => { this.publishHeartbeats(); }, deps.heartbeatIntervalMs ?? 2000);
|