Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
82c16b6
feat: migrate sandbox operations to OpenShell gRPC
ericksoa May 27, 2026
e8da94e
Stabilize gRPC sandbox test transport
ericksoa May 27, 2026
cafb69e
Honor validation probe curl retry budgets
ericksoa May 27, 2026
5a34f1a
Tolerate optional workspace dir misses in gRPC backups
ericksoa May 27, 2026
7ea65a1
Harden gRPC recovery and Hermes E2E probes
ericksoa May 27, 2026
28548cf
Harden launchable endpoint preflight
ericksoa May 27, 2026
6083811
Revert "Harden launchable endpoint preflight"
ericksoa May 27, 2026
a1031c9
Revert non-migration E2E probe changes
ericksoa May 27, 2026
1bbb6fa
Revert "Honor validation probe curl retry budgets"
ericksoa May 27, 2026
0d9c6a9
Address gRPC forward CodeQL findings
ericksoa May 27, 2026
e17f790
test: update fixtures for gRPC sandbox transport
ericksoa May 27, 2026
ffc3fdc
Merge remote-tracking branch 'origin/main' into feat/openshell-grpc-s…
ericksoa May 27, 2026
347c995
Fix OpenShell gRPC sandbox migration failures
ericksoa May 27, 2026
c4bb2ca
Fix gRPC sandbox stream edge cases
ericksoa May 27, 2026
2c40a23
Stabilize gRPC dashboard forward reuse
ericksoa May 27, 2026
a4803c2
Reclaim stale gRPC dashboard listeners
ericksoa May 27, 2026
e6b5d07
Move preflight dashboard recovery into module
ericksoa May 27, 2026
19ada2a
Treat gRPC forward bridge readiness as TCP readiness
ericksoa May 27, 2026
6b202d5
Remove legacy OpenShell forward restore
ericksoa May 27, 2026
10f8341
Check gRPC forward state in double onboard E2E
ericksoa May 28, 2026
19a0519
Drop legacy forward registry check from double onboard E2E
ericksoa May 28, 2026
f4eca81
feat: consume OpenShell SDK for sandbox transport
ericksoa May 28, 2026
9e7275d
chore: add temporary OpenShell SDK placeholder
ericksoa May 28, 2026
46ec86c
Merge branch 'main' into feat/openshell-grpc-sandbox-ops
ericksoa May 31, 2026
1f66189
fix: call OpenShell gRPC endpoints for SDK gaps
ericksoa May 31, 2026
2a94b6d
fix: harden nightly e2e for grpc sandbox ops
ericksoa May 31, 2026
d602996
test: update scope approval guard probe
ericksoa May 31, 2026
1999ea4
fix: close forward diagnostic race
ericksoa May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/e2e-script.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@ jobs:
print("::error::env_json must be a JSON object", file=sys.stderr)
sys.exit(1)

# Nightly runners commonly lack CAP_SETPCAP inside OpenShell sandboxes.
# The sandbox image remains fail-closed by default; E2E jobs opt in so
# they can validate product behavior while gateway-isolation covers the
# fail-closed residual-capability posture.
values.setdefault("NEMOCLAW_ALLOW_RESIDUAL_CAPS", "1")

name_pattern = re.compile(r"^[A-Z_][A-Z0-9_]*$")
reserved_prefixes = ("ACTIONS_", "GITHUB_", "INPUT_", "RUNNER_")
reserved_names = {"CI", "HOME", "PATH", "PWD", "SHELL"}
Expand Down
8 changes: 8 additions & 0 deletions ci/env-var-doc-allowlist.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@
"name": "NEMOCLAW_RESTORE_LATEST_BACKUP_ON_RECREATE",
"reason": "Internal installer sentinel exported only during OpenShell gateway replacement so onboard restores the pre-upgrade sandbox backup. Not user-facing."
},
{
"name": "NEMOCLAW_SDK_TEST_FAKE_EXEC_BIN",
"reason": "Vitest-only helper used by the OpenShell SDK sync runner to drive hermetic fake OpenShell fixtures without loading the native SDK binding. Never user-set in production."
},
{
"name": "NEMOCLAW_SDK_TEST_TRANSPORT",
"reason": "Vitest-only sentinel that prevents hermetic CLI tests from loading real OpenShell gateway metadata and routes sandbox exec calls through test fixtures. Never user-set in production."
},
{
"name": "NEMOCLAW_TEST_NO_SLEEP",
"reason": "Test sentinel that bypasses real-time sleep() calls in onboard inference probes. Set to '1' only by Vitest tests; never user-set."
Expand Down
90 changes: 68 additions & 22 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"format:ts": "cd nemoclaw && npm run lint:fix && npm run format",
"check:installer-hash": "bash scripts/check-installer-hash.sh",
"typecheck": "tsc -p jsconfig.json",
"build:cli": "tsc -p tsconfig.src.json && node dist/lib/cli/generate-oclif-metadata-manifest.js && if find nemoclaw-blueprint/scripts -name '*.ts' -print -quit | grep -q .; then tsc -p nemoclaw-blueprint/tsconfig.json; fi",
"build:cli": "tsc -p tsconfig.src.json && node scripts/copy-openshell-protos.mjs && node dist/lib/cli/generate-oclif-metadata-manifest.js && if find nemoclaw-blueprint/scripts -name '*.ts' -print -quit | grep -q .; then tsc -p nemoclaw-blueprint/tsconfig.json; fi",
"typecheck:cli": "tsc -p tsconfig.cli.json",
"validate:configs": "tsx scripts/validate-configs.ts",
"type-safety:hotspots": "tsx scripts/type-safety-hotspots.ts",
Expand All @@ -47,7 +47,10 @@
},
"dependencies": {
"@aws-sdk/client-bedrock-runtime": "3.1046.0",
"@grpc/grpc-js": "^1.14.4",
"@grpc/proto-loader": "^0.8.1",
"@oclif/core": "^4.10.5",
"@openshell/sdk": "file:vendor/openshell-sdk-placeholder",
"js-yaml": "^4.1.1",
"p-retry": "^4.6.2",
"qrcode-terminal": "^0.12.0",
Expand Down
15 changes: 15 additions & 0 deletions scripts/copy-openshell-protos.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

import fs from "node:fs";
import path from "node:path";

const root = process.cwd();
const source = path.join(root, "src", "lib", "adapters", "openshell", "proto");
const dest = path.join(root, "dist", "lib", "adapters", "openshell", "proto");

fs.mkdirSync(dest, { recursive: true });
for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
if (!entry.isFile() || !entry.name.endsWith(".proto")) continue;
fs.copyFileSync(path.join(source, entry.name), path.join(dest, entry.name));
}
Loading
Loading