You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 0902c94
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: apps/web/src/features/sessions/session-diagnostics.test.tsx
+3Lines changed: 3 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -70,6 +70,9 @@ describe("Core diagnostics in the console", () => {
70
70
constproviderDefault="Without a model provider set on the Session or its saved Agent, a hosted sandbox Session uses the default in Settings → Models and credentials.";
71
71
expect(diagnosticFailure({code: "invalid_request",params: {},failed_at: null},t)).toBe(`The model provider rejected the request. Check the model and parameters, starting with the model on the Session page. ${providerDefault}`);
72
72
expect(diagnosticFailure({code: "connection_failed",params: {http_status: 502},failed_at: null},t)).toContain("HTTP 502. Check the Base URL of the Session's model provider.");
73
+
// Only a failure without any HTTP response points at name resolution and reachability.
expect(diagnosticFailure({code: "connection_failed",params: {http_status: null},failed_at: null},t)).toContain("Then check that the URL's host resolves and is reachable");
73
76
expect(diagnosticFailure({code: "runtime_unavailable",params: {},failed_at: null},t)).toBe("The Runtime is unavailable. Retry later. For a self-hosted Session, check Host connection on the Session page; for a hosted sandbox Session, check Settings → Sandbox and scheduling.");
74
77
expect(diagnosticFailure({code: "harness_error",params: {},failed_at: null},t)).toContain("Core does not show the Harness's own message");
Copy file name to clipboardExpand all lines: apps/web/src/i18n/locales/en/diagnostics.ts
+2-1Lines changed: 2 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -47,7 +47,7 @@ export const diagnostics = {
47
47
request_timeout: "Retry later.",
48
48
context_length_exceeded: "Start a new Session or shorten the input.",
49
49
cyber_policy: "Change the input before sending it again, or start a new Session.",
50
-
connection_failed: "Check the Base URL of the Session's model provider. Without one set on the Session or its saved Agent, a hosted sandbox Session uses the default in Settings → Models and credentials. Then check that the URL's host resolves and is reachable from the Session's sandbox, or from the host of a self-hosted Session.",
50
+
connection_failed: "Check the Base URL of the Session's model provider. Without one set on the Session or its saved Agent, a hosted sandbox Session uses the default in Settings → Models and credentials.",
51
51
harness_error: "Core does not show the Harness's own message. Check the model and Harness on the Session page, then the Session's model provider. Without one set on the Session or its saved Agent, a hosted sandbox Session uses the default in Settings → Models and credentials.",
52
52
model_provider_required: "Set a model provider on the Session or its saved Agent. A hosted sandbox Session can also use the default in Settings → Models and credentials.",
53
53
runtime_unavailable: "Retry later. For a self-hosted Session, check Host connection on the Session page; for a hosted sandbox Session, check Settings → Sandbox and scheduling.",
@@ -60,6 +60,7 @@ export const diagnostics = {
60
60
setupIndex: "Setup command {{number}}.",
61
61
exitCode: "Exit code {{code}}.",
62
62
httpStatus: "HTTP {{status}}.",
63
+
unreachableHost: "Then check that the URL's host resolves and is reachable from the Session's sandbox, or from the host of a self-hosted Session.",
Copy file name to clipboardExpand all lines: docs/getting-started/nodes.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -74,7 +74,7 @@ Root only prepares the account, the group and the unit; everything else, the Doc
74
74
75
75
**Docker mode is root-equivalent.** Membership in the `docker` group lets `oac-node`, and so anything that controls the node, act as root on the host. Containers also share the host kernel, so a container escape reaches the host. Add Docker nodes only on hosts dedicated to sandboxes. microsandbox nodes need only the `kvm` group and run each sandbox in its own microVM.
76
76
77
-
**microsandbox blocks private endpoints.** A sandbox can't reach a model provider or MCP server at a private address. Sandboxes resolve names through the node host's resolver, and DNS rebind protection discards any answer that contains a private address, so a name that the host resolves to a private address doesn't resolve in the sandbox at all, even for a public service such as a model API behind a cloud VPC resolver. The Turn then fails once the Harness stops retrying. Installer-added nodes have no setting to change this. Make the host's resolver return the service's public addresses, for example with entries in the host's `/etc/hosts`; use a Docker node, which doesn't filter sandbox traffic; or [register the node manually](#register-a-node-manually) with a `network` policy that also allows the private range in a rule without a port, because rebind protection ignores port-scoped rules.
77
+
**microsandbox blocks private endpoints.** A sandbox can't reach a model provider or MCP server at a private address. Sandbox DNS queries go to the nameservers listed in the host's `/etc/resolv.conf`, and DNS rebind protection discards any answer that contains a private address, so a name those nameservers resolve to a private address doesn't resolve in the sandbox at all, even for a public service such as a model API behind a cloud VPC resolver. The Turn then fails once the Harness stops retrying. Installer-added nodes have no setting to change this. Make those nameservers return the service's public addresses; microsandbox doesn't read the host's `/etc/hosts`, so an entry there helps only when `/etc/resolv.conf` points at a local stub resolver that serves it, such as systemd-resolved at `127.0.0.53`. Otherwise use a Docker node, which doesn't filter sandbox traffic, or [register the node manually](#register-a-node-manually) with a `network` policy that also allows the private range in a rule without a port, because rebind protection ignores port-scoped rules.
78
78
79
79
**One Core per host.** Nodes share the `oac-node` account, so a host serves one Core; a command from a second Core is refused.
0 commit comments