diff --git a/core/http/react-ui/src/hooks/useChatEgress.js b/core/http/react-ui/src/hooks/useChatEgress.js
index 3eb2e03d1f..bbcb74d650 100644
--- a/core/http/react-ui/src/hooks/useChatEgress.js
+++ b/core/http/react-ui/src/hooks/useChatEgress.js
@@ -3,7 +3,7 @@ import { chatEgressApi } from '../utils/api'
const empty = { preset: 'off', ceiling: 'off', effective: 'off', applies: false, applies_reason: '', registries: [], allowed_hosts: [], rules: [], cards: [] }
-// The network of a chat's Sandbox commands (GET /api/chats/{id}/egress), read
+// The network of a chat's isolated commands (GET /api/chats/{id}/egress), read
// again when tick changes (an egress_consent or egress_card event). setPreset,
// removeRule and answer change it on the server and keep the answer.
export function useChatEgress(chatId, tick) {
diff --git a/core/http/react-ui/src/hooks/useServerChat.js b/core/http/react-ui/src/hooks/useServerChat.js
index 2f298bf380..37f3f51c76 100644
--- a/core/http/react-ui/src/hooks/useServerChat.js
+++ b/core/http/react-ui/src/hooks/useServerChat.js
@@ -228,7 +228,7 @@ export function useServerChat({ seed = null } = {}) {
},
trigger_proposed: () => setTicks(t => ({ ...t, proposals: t.proposals + 1 })),
files: () => setTicks(t => ({ ...t, files: t.files + 1 })),
- // The network of the chat's Sandbox commands changed: a card asked or
+ // The network of the chat's isolated commands changed: a card asked or
// was answered, or the preset or a rule changed. The network panel and
// the cards read the chat's network again.
egress_consent: () => setTicks(t => ({ ...t, egress: t.egress + 1 })),
diff --git a/core/http/react-ui/src/pages/Chat.jsx b/core/http/react-ui/src/pages/Chat.jsx
index bd4220e685..2b91dc8ce9 100644
--- a/core/http/react-ui/src/pages/Chat.jsx
+++ b/core/http/react-ui/src/pages/Chat.jsx
@@ -210,7 +210,7 @@ function ChatPage() {
}, [])
const model = activeChat ? activeChat.model : draftModel
- // The network of the chat's Sandbox commands, read again on its events.
+ // The network of the chat's isolated commands, read again on its events.
const egress = useChatEgress(activeId, chat.ticks.egress)
// The cards of the chat by their tool line; the ones that wait are drawn
// under the live fold until the call ends.
diff --git a/core/http/react-ui/src/utils/api.js b/core/http/react-ui/src/utils/api.js
index 277946e5a8..09bd87e5bb 100644
--- a/core/http/react-ui/src/utils/api.js
+++ b/core/http/react-ui/src/utils/api.js
@@ -403,7 +403,7 @@ export const chatHostExecApi = {
consent: (chat, id, decision) => fetchJSON(`/api/chats/${enc2(chat)}/host-exec/consent`, { method: 'POST', body: JSON.stringify({ id, decision }) }),
}
-// The network of a chat's Sandbox commands: its preset, rules and cards, for
+// The network of a chat's isolated commands: its preset, rules and cards, for
// the chat's owner; the settings and the audit, for administrators.
export const chatEgressApi = {
get: (chat) => fetchJSON(`/api/chats/${enc2(chat)}/egress`),
diff --git a/core/http/react-ui/src/utils/chatAgents.js b/core/http/react-ui/src/utils/chatAgents.js
index 6ddcd1d925..09a838df1d 100644
--- a/core/http/react-ui/src/utils/chatAgents.js
+++ b/core/http/react-ui/src/utils/chatAgents.js
@@ -27,7 +27,7 @@ export function agentPayload(form, opts) {
description: (form.description || '').trim(),
instructions: form.instructions || '',
model: (form.model || '').trim(),
- // The network of the Sandbox commands of the agent's unattended runs.
+ // The network of the isolated commands of the agent's unattended runs.
network: ['off', 'registries', 'all'].includes(form.network) ? form.network : 'off',
}
for (const k of LIST_KEYS) body[k] = (form[k] || []).map(x => x.trim()).filter((x, i, a) => x && a.indexOf(x) === i)
diff --git a/core/http/react-ui/src/utils/chatEgress.js b/core/http/react-ui/src/utils/chatEgress.js
index 59e228cc16..490cbae859 100644
--- a/core/http/react-ui/src/utils/chatEgress.js
+++ b/core/http/react-ui/src/utils/chatEgress.js
@@ -1,4 +1,4 @@
-// The network of a chat's Sandbox commands, as the chat page shows it. Pure
+// The network of a chat's isolated commands, as the chat page shows it. Pure
// functions over GET /api/chats/{id}/egress, so the node unit tests cover them.
export const PRESETS = ['off', 'registries', 'all']
diff --git a/core/http/react-ui/src/utils/settingsPending.js b/core/http/react-ui/src/utils/settingsPending.js
index 93287d819a..831c85c375 100644
--- a/core/http/react-ui/src/utils/settingsPending.js
+++ b/core/http/react-ui/src/utils/settingsPending.js
@@ -132,7 +132,7 @@ export function runChecks(changes, initial, draft) {
Object.entries(parsed).every(([k, v]) => ['bash', 'web_search', 'web_fetch', 'xlsx', 'docx', 'pptx', 'pdf'].includes(k) && typeof v === 'string' && /^[a-z0-9][a-z0-9-]{0,63}$/.test(v))
checks.push(ok
? { level: 'ok', text: `${field.label}: ${Object.keys(parsed).length} chosen.` }
- : { level: 'error', text: `${field.label}: map bash, web_search, web_fetch or a skill (xlsx, docx, pptx, pdf) to an add-on ID, for example { "bash": "sandbox" }.` })
+ : { level: 'error', text: `${field.label}: map bash, web_search, web_fetch or a skill (xlsx, docx, pptx, pdf) to an add-on ID, for example { "bash": "
" }.` })
} else if (field.kind === 'json') {
const text = String(to || '').trim()
if (text) {
@@ -219,7 +219,7 @@ export function payloadFor(changes, source) {
return body
}
-// The phrase an administrator types to let Sandbox commands reach private
+// The phrase an administrator types to let isolated commands reach private
// networks (core/config/chats_egress.go), and the draft key that carries it.
export const EGRESS_PRIVATE_PHRASE = 'I understand that commands can reach my private network'
export const EGRESS_CONFIRM_KEY = 'chats_egress_private_confirm'
diff --git a/core/http/react-ui/src/utils/settingsSchema.js b/core/http/react-ui/src/utils/settingsSchema.js
index 5da1fb6a49..8016b413b2 100644
--- a/core/http/react-ui/src/utils/settingsSchema.js
+++ b/core/http/react-ui/src/utils/settingsSchema.js
@@ -202,11 +202,11 @@ export const FIELDS = [
default: true, fallback: true, apply: 'live' },
// ---- Tools (the Tools tab draws these two with its own controls) ----------
{ key: 'chats_host_exec', group: 'tools', was: 'chats', kind: 'select', options: ['', 'off', 'ask', 'on'], label: 'Commands on this machine',
- desc: 'Who gets the chats\' built-in bash, which runs commands directly on this machine with no isolation and with its network, when no Sandbox add-on serves bash: off, ask (administrators, who allow each command) or on (every user, no card). Empty is the default: off with accounts, ask without.',
+ desc: 'Who gets the chats\' built-in bash, which runs commands directly on this machine with no isolation and with its network, when no add-on serves bash: off, ask (administrators, who allow each command) or on (every user, no card). Empty is the default: off with accounts, ask without.',
default: '', apply: 'live', custom: 'tools' },
{ key: 'chats_tool_providers', group: 'tools', was: 'chats', kind: 'json', label: 'Add-ons that replace a built-in tool or skill',
desc: 'When several add-ons replace one built-in tool or skill, the one that serves it: a map from the tool (bash, web_search, web_fetch) or skill (xlsx, docx, pptx, pdf) to the add-on ID. With none chosen, the first by add-on ID serves.',
- placeholder: '{ "bash": "sandbox" }', apply: 'live', custom: 'tools' },
+ placeholder: '{ "bash": "" }', apply: 'live', custom: 'tools' },
// The Tools tab draws the switches of the web tools on their rows.
{ key: 'chats_web_search', group: 'tools', was: 'chats', kind: 'bool', label: 'Web search',
desc: 'Offer the chats the built-in web_search, which searches the web without a key (DuckDuckGo, then Brave Search, then Bing) or with your SearXNG instance.',
@@ -242,19 +242,19 @@ export const FIELDS = [
{ key: 'chats_web_ports', group: 'tools', was: 'chats', kind: 'text', label: 'Ports for web pages', emptyIsDefault: true,
desc: 'The ports web_fetch may use, comma separated.',
placeholder: '80,443', default: '80,443', apply: 'live' },
- // The network of the Sandbox commands (core/config/runtime_settings_registry.go;
+ // The network of the commands (core/config/runtime_settings_registry.go;
// read at each check of the proxy, so live). The Tools tab draws the
// private switch itself, with its typed phrase. emptyIsDefault: the server
// stores '' (or 0) for a setting never set and reads it as the default, so
// that value is not "changed" and a select or number shows the default.
- { key: 'chats_egress_ceiling', group: 'tools', was: 'chats', kind: 'select', options: ['off', 'registries', 'all'], label: 'Sandbox network limit', fallback: 'off', emptyIsDefault: true,
- desc: 'The widest network any chat\'s Sandbox commands may use: off, the package registries only, or every public host. A chat chooses up to this. Commands on this machine are not covered: they have the network of the server.',
+ { key: 'chats_egress_ceiling', group: 'tools', was: 'chats', kind: 'select', options: ['off', 'registries', 'all'], label: 'Command network limit', fallback: 'off', emptyIsDefault: true,
+ desc: 'The widest network any chat\'s isolated commands may use: off, the package registries only, or every public host. A chat chooses up to this. Commands on this machine are not covered: they have the network of the server.',
default: 'off', apply: 'live' },
- { key: 'chats_egress_default', group: 'tools', was: 'chats', kind: 'select', options: ['off', 'registries', 'all'], label: 'Sandbox network of a new chat', fallback: 'off', emptyIsDefault: true,
+ { key: 'chats_egress_default', group: 'tools', was: 'chats', kind: 'select', options: ['off', 'registries', 'all'], label: 'Command network of a new chat', fallback: 'off', emptyIsDefault: true,
desc: 'The network preset a new chat starts with, capped by the limit above.',
default: 'off', apply: 'live' },
- { key: 'chats_egress_ports', group: 'tools', was: 'chats', kind: 'text', label: 'Sandbox network ports', emptyIsDefault: true,
- desc: 'The ports Sandbox commands may reach, comma separated. 22 and 25 are always refused.',
+ { key: 'chats_egress_ports', group: 'tools', was: 'chats', kind: 'text', label: 'Command network ports', emptyIsDefault: true,
+ desc: 'The ports isolated commands may reach, comma separated. 22 and 25 are always refused.',
placeholder: '80,443', default: '80,443', apply: 'live' },
{ key: 'chats_egress_extra_registries', group: 'tools', was: 'chats', kind: 'text', label: 'Extra package registries',
desc: 'Exact host names added to the package registries list, comma separated, for example an internal mirror. They count as registries, so they need a chat on the Package registries choice (HTTPS only). To allow a host for any request, use Always allowed hosts. No patterns.',
@@ -293,9 +293,9 @@ export const FIELDS = [
desc: 'How many loop runs one user may start in a day (UTC), over all their loops. After that the loops wait for the next day.',
placeholder: '200', default: 200, min: 1, max: 100000, apply: 'live' },
{ key: 'chats_egress_audit_days', group: 'tools', was: 'chats', kind: 'int', label: 'Command audit retention',
- desc: 'How many days the audit of the Sandbox network requests and the audit of the commands run on this machine keep a line, from 1 to 365.',
+ desc: 'How many days the audit of the network requests of isolated commands and the audit of the commands run on this machine keep a line, from 1 to 365.',
default: 30, fallback: 30, emptyIsDefault: true, min: 1, max: 365, unit: 'days', apply: 'live' },
- { key: 'chats_egress_allow_private', group: 'tools', was: 'chats', kind: 'bool', label: 'Sandbox commands may reach private networks',
+ { key: 'chats_egress_allow_private', group: 'tools', was: 'chats', kind: 'bool', label: 'Isolated commands may reach private networks',
desc: 'Let a host that an administrator allowed reach addresses inside your network. A preset alone never does; the metadata and server addresses stay refused.',
default: false, fallback: false, apply: 'live', custom: 'tools' },
{ key: 'shared_pages_enabled', group: 'agents', was: 'chats', kind: 'bool', label: 'Shared pages',