Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
576 commits
Select commit Hold shift + click to select a range
8500461
refactor(policy): unify OpenShell policy boundary
ericksoa Jul 1, 2026
a6aeb08
ci(installer): expire immutable hash bootstrap
ericksoa Jul 1, 2026
b0ac984
fix(ci): compile policy boundary from TypeScript
ericksoa Jul 1, 2026
25df677
chore(mcp): merge OpenShell dependency stack
ericksoa Jul 1, 2026
6b70658
fix(policy): reject empty base-policy reads
ericksoa Jul 1, 2026
7e58237
fix(mcp): restore clean CD execution
ericksoa Jul 1, 2026
f015b99
chore(mcp): merge OpenShell dependency fixes
ericksoa Jul 1, 2026
443f888
docs(mcp): pin security source boundaries
ericksoa Jul 1, 2026
d87d2ba
test(mcp): harden lifecycle lock invariants
ericksoa Jul 1, 2026
c6885d7
docs(policy): clarify boundary dependency gate
ericksoa Jul 1, 2026
543df4a
chore(mcp): merge policy boundary clarification
ericksoa Jul 1, 2026
1705536
fix(policy): anchor document separator parsing
ericksoa Jul 1, 2026
ee7de13
chore(mcp): merge policy separator fix
ericksoa Jul 1, 2026
4986540
docs(mcp): clarify v0.0.73 release boundary
ericksoa Jul 1, 2026
621b334
fix(ci): harden trusted policy audits
ericksoa Jul 1, 2026
74231e3
refactor(rebuild): split lifecycle pipeline into phases
ericksoa Jul 1, 2026
1e0da24
fix(rebuild): preserve lifecycle state across phase failures
ericksoa Jul 1, 2026
ea9dc63
fix(ci): parse installer pins without executing shell
ericksoa Jul 1, 2026
51441d2
chore(openshell): merge current main
ericksoa Jul 1, 2026
e2731c8
fix(ci): reconcile main E2E security contracts
ericksoa Jul 1, 2026
c5cc11d
chore(mcp): merge current main and dependency fixes
ericksoa Jul 1, 2026
781a052
fix(ci): close compatibility review findings
ericksoa Jul 1, 2026
5baa600
chore(mcp): merge final OpenShell 0.0.72 dependency
ericksoa Jul 1, 2026
059a15d
fix(policy): reject unknown top-level policy shapes
ericksoa Jul 1, 2026
4db8333
chore(mcp): merge final policy validation fix
ericksoa Jul 1, 2026
a7e3039
test(mcp): remove workflow source-shape coupling
ericksoa Jul 1, 2026
cad2e8f
fix(policy): close fail-closed review gaps
ericksoa Jul 1, 2026
1aa187a
chore(mcp): merge final fail-closed dependency fixes
ericksoa Jul 1, 2026
fad4b88
test(mcp): harden lifecycle property timeout
ericksoa Jul 1, 2026
8674dc5
test(policy): align legacy shape expectations
ericksoa Jul 1, 2026
553cfcc
chore(mcp): merge final policy compatibility tests
ericksoa Jul 1, 2026
12f7376
chore(openshell): merge current main
ericksoa Jul 1, 2026
eedb095
fix(ci): harden policy boundary checks
ericksoa Jul 1, 2026
a5bc9d2
fix(ci): satisfy Docker boundary lint
ericksoa Jul 1, 2026
f96ce3b
chore(mcp): merge current main and final dependency
ericksoa Jul 1, 2026
9c26a79
chore(mcp): merge final dependency lint fix
ericksoa Jul 1, 2026
f88a5e6
test(e2e): accept reasoning-only inference proof
ericksoa Jul 1, 2026
e60186b
fix(credentials): forward only requested provider secrets
ericksoa Jul 1, 2026
c9332d3
fix(policy): restore Deep Agents Tavily opt-in
ericksoa Jul 1, 2026
de06ed3
test(e2e): align lifecycle fixtures with current contracts
ericksoa Jul 1, 2026
89462af
style(mcp): apply repository formatting
ericksoa Jul 1, 2026
aa3be25
chore(mcp): merge final OpenShell proof fix
ericksoa Jul 1, 2026
c378ad6
test(installer): prove missing assets fail closed
ericksoa Jul 1, 2026
548b64c
chore(mcp): merge final dependency advisor fix
ericksoa Jul 1, 2026
27e663e
test(shields): tolerate coverage shard contention
ericksoa Jul 1, 2026
07babb3
test(hermes): isolate tracked-stop PID fixture
ericksoa Jul 1, 2026
be020b3
docs(deepagents): clarify Tavily provider scope
ericksoa Jul 1, 2026
e098105
docs(deepagents): correct Tavily removal order
ericksoa Jul 1, 2026
a0a1226
refactor(mcp): split adapter and restart lifecycles
ericksoa Jul 1, 2026
3194140
test(mcp): property-check lifecycle lock identity
ericksoa Jul 1, 2026
cff4cf8
test(e2e): prove raw OpenShell DNS pinning
ericksoa Jul 1, 2026
985c1db
test(mcp): avoid conditional growth in lock properties
ericksoa Jul 1, 2026
227dfbb
refactor(mcp): decompose policy and lifecycle surfaces
ericksoa Jul 1, 2026
45a761d
test(mcp): bind lock properties to main suite
ericksoa Jul 1, 2026
987c113
test(e2e): run raw DNS proof in MCP lanes
ericksoa Jul 1, 2026
0a618a9
style: apply repository formatting
ericksoa Jul 1, 2026
f8a8fc5
test(security): harden CodeQL fixtures
ericksoa Jul 1, 2026
137607d
refactor(mcp): resolve final review growth blockers
ericksoa Jul 1, 2026
646cea9
fix(mcp): resolve final advisor blockers
ericksoa Jul 1, 2026
c62a4c8
test(deps): exercise cloudflared checker behavior
ericksoa Jul 1, 2026
225c11d
fix(mcp): close final security review gaps
ericksoa Jul 1, 2026
c811610
refactor(mcp): decompose remaining lifecycle hotspots
ericksoa Jul 1, 2026
e34ba83
style(policy): organize extracted module imports
ericksoa Jul 1, 2026
db5e218
test(agent): keep env restoration branch free
ericksoa Jul 1, 2026
cb88de0
chore(ci): remove stale review aliases
ericksoa Jul 1, 2026
41899a5
fix(ci): restore Brev nightly startup
ericksoa Jul 1, 2026
f68f463
fix(ci): isolate Brev matrix concurrency
ericksoa Jul 1, 2026
7e18907
fix(ci): isolate Brev reporting privileges
ericksoa Jul 1, 2026
7685d85
fix(ci): isolate Brev suite instances
ericksoa Jul 1, 2026
227f4fb
test(e2e): preserve rebuild dashboard port
ericksoa Jul 1, 2026
78aafd0
fix(mcp): enforce Hermes credential boundary
ericksoa Jul 1, 2026
869fa9a
fix(ci): harden Brev credential and installer boundaries
ericksoa Jul 1, 2026
0707f2b
test(mcp): lock credential manifest to shipping OpenShell
ericksoa Jul 1, 2026
cac8f81
test(mcp): bind installer behavior to credential manifest
ericksoa Jul 1, 2026
5e7deb8
fix(ci): restore locked Brev test dependencies
ericksoa Jul 1, 2026
697020b
test(e2e): refresh rebuild compatibility fixtures
ericksoa Jul 1, 2026
efbed27
test(e2e): keep Hermes fixture branch-free
ericksoa Jul 1, 2026
5d17758
test(e2e): mark stale fixture as managed
ericksoa Jul 1, 2026
1853ff4
test(e2e): preserve stale fixture dashboard port
ericksoa Jul 1, 2026
3e15388
fix(e2e): isolate composite Brev suite state
ericksoa Jul 1, 2026
6d487bd
Merge origin/main into dep/openshell-v0.0.72
ericksoa Jul 1, 2026
785e6f4
Merge dep/openshell-v0.0.72 into feat/mcp-bridge-vdr-566
ericksoa Jul 1, 2026
8f7b40e
Merge origin/main into dep/openshell-v0.0.72
ericksoa Jul 1, 2026
191193a
Merge dep/openshell-v0.0.72 into feat/mcp-bridge-vdr-566
ericksoa Jul 1, 2026
cfda731
fix(ci): preserve MCP artifact scan gating
ericksoa Jul 1, 2026
4f4ad13
fix(ci): lock Brev setup to reviewed checkout
ericksoa Jul 1, 2026
cce350a
Merge origin/main into dep/openshell-v0.0.72
ericksoa Jul 1, 2026
8a54292
Merge dep/openshell-v0.0.72 into feat/mcp-bridge-vdr-566
ericksoa Jul 1, 2026
5c3a620
fix(e2e): isolate Brev messaging lifecycles
ericksoa Jul 1, 2026
d3f9ff4
fix(e2e): disable unsafe whole-test retries
ericksoa Jul 1, 2026
3b44af7
fix(e2e): bound Brev lifecycle ownership
ericksoa Jul 1, 2026
0d4374a
fix(e2e): make Brev cleanup workflow-owned
ericksoa Jul 1, 2026
a39ba0e
fix(ci): harden Brev cleanup finalizer
ericksoa Jul 1, 2026
f4cc61e
refactor(cli): isolate MCP display metadata
ericksoa Jul 1, 2026
e793c31
fix(mcp): repair exact-head runtime failures
ericksoa Jul 1, 2026
23d0991
fix(e2e): align Brev security suite timeouts
ericksoa Jul 1, 2026
90166bf
fix(e2e): tolerate process-exit scan races
ericksoa Jul 1, 2026
0cd7604
merge: sync main into OpenShell v0.0.72
ericksoa Jul 1, 2026
538e767
merge: sync OpenShell v0.0.72 dependency
ericksoa Jul 1, 2026
4d57978
fix(policy): reject unmarked diagnostic mappings
ericksoa Jul 1, 2026
613ddd0
fix(e2e): stop restarting MCP sandboxes for test CA
ericksoa Jul 1, 2026
b039cb5
fix(e2e): prevent messaging token probe self-matches
ericksoa Jul 1, 2026
03f3f6b
merge: sync hardened OpenShell dependency
ericksoa Jul 1, 2026
e7b19ae
fix(e2e): require policy roots in live probes
ericksoa Jul 1, 2026
8c548f4
fix(ci): include parser in installer hash bootstrap
ericksoa Jul 1, 2026
e3480ce
merge: sync installer bootstrap hardening
ericksoa Jul 1, 2026
7f3ea39
docs(ci): clarify installer verifier trust boundary
ericksoa Jul 1, 2026
7661d8a
Merge remote-tracking branch 'origin/dep/openshell-v0.0.72' into feat…
ericksoa Jul 1, 2026
a579f4b
fix(ci): validate MCP compatibility inputs
ericksoa Jul 1, 2026
bef8663
Merge branch 'main' into dep/openshell-v0.0.72
ericksoa Jul 1, 2026
0a27f24
Merge branch 'dep/openshell-v0.0.72' into feat/mcp-bridge-vdr-566
ericksoa Jul 1, 2026
5d94e1f
merge: sync current main into OpenShell 0.0.72
ericksoa Jul 1, 2026
e3c3232
merge: restack MCP bridge on current OpenShell dependency
ericksoa Jul 1, 2026
490a1b9
merge: sync current main into OpenShell 0.0.72
ericksoa Jul 1, 2026
cafcd2a
merge: sync current main into OpenShell 0.0.72
ericksoa Jul 1, 2026
1ca644d
merge: restack MCP bridge on current OpenShell dependency
ericksoa Jul 1, 2026
7ee13d2
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
f90f124
merge: restack MCP bridge on current OpenShell dependency
ericksoa Jul 1, 2026
6b918a6
test(e2e): parse Hermes semver before release date
ericksoa Jul 1, 2026
344038e
merge: restack MCP bridge on corrected OpenShell dependency
ericksoa Jul 1, 2026
18f67ef
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
0ed3f40
fix(sandbox): wait for stopped forwards to release
ericksoa Jul 1, 2026
7c701a9
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
dde2c62
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
7ed7f40
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
c5673f0
merge: restack MCP bridge on current OpenShell dependency
ericksoa Jul 1, 2026
8161c0f
fix(test): remove duplicate Shields timeout
ericksoa Jul 1, 2026
4d4420a
test(sandbox): model stopped forward release
ericksoa Jul 1, 2026
9874913
merge: sync forward recovery proof from OpenShell dependency
ericksoa Jul 1, 2026
982de7c
docs(sandbox): define forward wait removal condition
ericksoa Jul 1, 2026
b3284c1
merge: sync forward recovery maintenance contract
ericksoa Jul 1, 2026
8996b9d
test(sandbox): keep forward fixture linear
ericksoa Jul 1, 2026
e923ea6
merge: sync forward recovery test guardrail fix
ericksoa Jul 1, 2026
3571f93
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
fa90a37
merge: restack MCP bridge on current dependency
ericksoa Jul 1, 2026
6ac008d
test(docs): follow current sandbox hardening route
ericksoa Jul 1, 2026
717b29e
merge: sync dependency CI repair
ericksoa Jul 1, 2026
8264c19
test(e2e): chunk crash-loop proxy restore
ericksoa Jul 1, 2026
b6cf67e
merge: sync OpenShell E2E argument fix
ericksoa Jul 1, 2026
97b8a5e
merge: sync current main into OpenShell dependency
ericksoa Jul 1, 2026
261c826
merge: sync current dependency base
ericksoa Jul 1, 2026
dec15c7
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
638bf1f
merge: sync current OpenShell dependency base
ericksoa Jul 2, 2026
5e0c0cd
fix(mcp): preserve generated policy DNS pins
ericksoa Jul 2, 2026
d3ba882
fix(mcp): recover Hermes gateway before mutation
ericksoa Jul 2, 2026
75ec47f
fix(mcp): recognize wrapped Hermes gateway
ericksoa Jul 2, 2026
b434b41
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
b83cdb6
merge: sync current OpenShell dependency base
ericksoa Jul 2, 2026
b4a0203
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
0a43f3b
merge: sync current OpenShell dependency base
ericksoa Jul 2, 2026
5a73950
fix(mcp): await Hermes public API after reload
ericksoa Jul 2, 2026
201d918
test(mcp): observe Hermes rebuild discovery window
ericksoa Jul 2, 2026
e922a92
test(mcp): cover Hermes reload identity race
ericksoa Jul 2, 2026
730e560
test(mcp): honor adapter mutation timeout on cleanup
ericksoa Jul 2, 2026
e3a2a5f
test(mcp): honor adapter timeout for rebinding
ericksoa Jul 2, 2026
9b44e5a
test(mcp): centralize adapter mutation budgets
ericksoa Jul 2, 2026
d429495
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
466443e
docs(release): retarget OpenShell update to v0.0.74
ericksoa Jul 2, 2026
8bf137f
merge: sync current OpenShell dependency base
ericksoa Jul 2, 2026
ce368c3
docs(mcp): retarget accepted design to v0.0.74
ericksoa Jul 2, 2026
673deeb
fix(mcp): retry stalled Hermes gateway reload
ericksoa Jul 2, 2026
ff74343
test(blueprint): preserve SSRF exports in policy mock
ericksoa Jul 2, 2026
4cab135
Merge remote-tracking branch 'origin/dep/openshell-v0.0.72' into feat…
ericksoa Jul 2, 2026
cb5e9ae
fix(ci): harden trusted installer hash inputs
ericksoa Jul 2, 2026
203f2bc
ci(security): repin hardened installer hash bootstrap
ericksoa Jul 2, 2026
7c5170b
merge: sync hardened OpenShell dependency
ericksoa Jul 2, 2026
0d1bdd1
test(ci): keep installer fixtures branch-free
ericksoa Jul 2, 2026
cb9b463
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
2d9a044
merge: sync current main and hardened OpenShell dependency
ericksoa Jul 2, 2026
6e2839d
fix(policy): normalize source and compiled boundary imports
ericksoa Jul 2, 2026
1e6e61f
merge: sync policy boundary import fix
ericksoa Jul 2, 2026
d01a7a4
fix(hermes): repair public relay after reload
ericksoa Jul 2, 2026
62d52b9
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
d8eef4c
merge: sync current OpenShell dependency
ericksoa Jul 2, 2026
ab2b0c4
merge: sync current main into OpenShell dependency
ericksoa Jul 2, 2026
797c1a6
merge: sync current OpenShell dependency
ericksoa Jul 2, 2026
299efb5
fix(mcp): close review correctness gaps
ericksoa Jul 3, 2026
92512c2
merge: sync current main into OpenShell dependency
ericksoa Jul 3, 2026
bd18557
merge: sync current OpenShell dependency
ericksoa Jul 3, 2026
ec69761
merge: sync current main into OpenShell dependency
ericksoa Jul 3, 2026
7cf3726
merge: sync current OpenShell dependency
ericksoa Jul 3, 2026
2d06fa0
merge: sync current main into OpenShell dependency
ericksoa Jul 3, 2026
8cd4862
merge: sync current OpenShell dependency
ericksoa Jul 3, 2026
cfee6e7
merge: sync current main into OpenShell dependency
ericksoa Jul 3, 2026
e610f75
merge: sync current OpenShell dependency
ericksoa Jul 3, 2026
7a272f6
merge: sync current main into OpenShell dependency
ericksoa Jul 3, 2026
f7886f7
merge: sync current OpenShell dependency
ericksoa Jul 3, 2026
9ab85e7
merge: sync current main into OpenShell dependency
ericksoa Jul 3, 2026
e3a527a
merge: sync current OpenShell dependency
ericksoa Jul 3, 2026
4e4e9ac
merge: sync merged OpenShell base and current main
ericksoa Jul 3, 2026
3366a55
feat(agents): add progressive tool disclosure
ericksoa Jul 3, 2026
f9c6e5d
merge: sync v0.0.74 main into MCP bridge
ericksoa Jul 3, 2026
ab13939
fix: remove unused config test import
ericksoa Jul 3, 2026
2d90930
fix(agents): harden progressive tool disclosure
ericksoa Jul 3, 2026
9f63957
merge: sync current #5876 head
ericksoa Jul 3, 2026
0853127
feat(cli): make tool disclosure configurable
ericksoa Jul 3, 2026
2cc0102
fix(onboard): preserve disclosure migration invariants
ericksoa Jul 3, 2026
3f4100d
fix(onboard): scope disclosure contract to final stage
ericksoa Jul 3, 2026
231296e
merge: sync current main into MCP bridge
ericksoa Jul 3, 2026
b066dd1
Merge current managed MCP bridge (#5876)
ericksoa Jul 3, 2026
eb2dc48
merge: integrate DCode rebuild preflight from main
ericksoa Jul 3, 2026
c4cb466
merge: preserve MCP rebuild safety with Tavily
ericksoa Jul 3, 2026
cd53181
merge: sync contributor setup from main
ericksoa Jul 3, 2026
8441c04
merge: sync current #5876 head
ericksoa Jul 3, 2026
af17227
merge: preserve managed MCP with DCode hardening
ericksoa Jul 3, 2026
4472c28
test(dcode): keep fixture guard linear
ericksoa Jul 3, 2026
60f10dc
fix(rebuild): preserve disclosure in recovery retry
ericksoa Jul 3, 2026
bf9100f
test(dcode): stub every isolated Python call
ericksoa Jul 3, 2026
f9283fe
test(dcode): stub managed MCP identity fixture
ericksoa Jul 3, 2026
c5471a7
merge: sync current #5876 head
ericksoa Jul 3, 2026
a2d3b30
merge: sync latest #5876 test fixtures
ericksoa Jul 3, 2026
f998385
fix(onboard): reject invalid prepared targets first
ericksoa Jul 3, 2026
2b1d15b
refactor(onboard): preserve entrypoint size budget
ericksoa Jul 3, 2026
97023b6
feat(agents): add progressive tool disclosure
ericksoa Jul 3, 2026
68f9761
merge: reconcile protected branch after MCP squash
ericksoa Jul 3, 2026
5d22788
fix(openclaw): keep runtime validator in TypeScript
ericksoa Jul 3, 2026
8b13a00
merge: sync current main after MCP integration
ericksoa Jul 3, 2026
39b2bde
fix(openclaw): type runtime validator boundary
ericksoa Jul 3, 2026
04a09f2
test(openclaw): keep runtime fixture linear
ericksoa Jul 3, 2026
18bd7ad
docs(cli): document disclosure on setup aliases
ericksoa Jul 3, 2026
0e58b21
merge: sync current main after gateway port fix
ericksoa Jul 3, 2026
fa9bfbc
fix(deepagents): bound progressive tool discovery
ericksoa Jul 4, 2026
bd26248
fix(rebuild): bind recreation to validated inputs
ericksoa Jul 4, 2026
6f79ecb
merge: sync current main after buildkit prebuild
ericksoa Jul 4, 2026
5372974
fix(tool-disclosure): reject missing rebuild values
ericksoa Jul 4, 2026
764b152
fix(hermes): pin merged MCP base image
ericksoa Jul 4, 2026
577dcb4
test(mcp): align bounded discovery fixture
ericksoa Jul 4, 2026
499a029
docs(dcode): record patch removal boundary
ericksoa Jul 4, 2026
726f4d6
fix(tool-disclosure): close review boundaries
ericksoa Jul 4, 2026
5853063
merge: sync current main after review fixes
ericksoa Jul 4, 2026
aa065be
test: satisfy progressive disclosure lint
ericksoa Jul 4, 2026
fb13ce8
Merge origin/main into progressive tool disclosure
ericksoa Jul 4, 2026
d77c010
refactor(onboard): extract tool disclosure contract
cv Jul 4, 2026
8ba62d2
refactor(onboard): split tool disclosure hotspots
cv Jul 4, 2026
0650192
test(e2e): redact MCP tunnel diagnostics
cv Jul 4, 2026
a626c18
fix(onboard): bind Dockerfile validation to opened file
ericksoa Jul 4, 2026
71acc13
test(onboard): keep disclosure tests linear
ericksoa Jul 4, 2026
2fc78a4
fix(e2e): harden MCP diagnostic redaction
ericksoa Jul 4, 2026
44be2ab
test(onboard): exercise disclosure create intent directly
ericksoa Jul 4, 2026
1b4b822
fix(onboard): close disclosure review blockers
cv Jul 4, 2026
8895eec
fix(security): redact wrapped URL credentials
ericksoa Jul 4, 2026
7ecf137
Merge remote-tracking branch 'origin/main' into feat/deepagents-progr…
ericksoa Jul 4, 2026
c8c5c4d
test(rebuild): align prepared context provenance
ericksoa Jul 4, 2026
f452c51
fix(security): close tool disclosure review blockers
ericksoa Jul 4, 2026
111200a
Merge remote-tracking branch 'origin/main' into feat/deepagents-progr…
ericksoa Jul 4, 2026
060912d
Merge remote-tracking branch 'origin/main' into feat/deepagents-progr…
ericksoa Jul 4, 2026
d007234
test(dcode): keep Darwin fixture branch-free
ericksoa Jul 4, 2026
6cf1aa4
fix(security): clarify read-only staging descriptor
ericksoa Jul 4, 2026
b9801ff
fix(security): use recognized CodeQL annotation
ericksoa Jul 4, 2026
e421414
test(dcode): fail fast on Darwin fixture drift
ericksoa Jul 4, 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
31 changes: 31 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -595,12 +595,16 @@ COPY nemoclaw-blueprint/scripts/*.js /usr/local/lib/nemoclaw/preloads/
COPY --from=runtime-preload-builder /opt/nemoclaw-root/dist/lib/messaging/channels/ /usr/local/lib/nemoclaw/preloads-compiled-channels/
COPY scripts/codex-acp-wrapper.sh /usr/local/bin/nemoclaw-codex-acp
COPY scripts/generate-openclaw-config.mts /scripts/generate-openclaw-config.mts
COPY scripts/validate-openclaw-tool-search.mts /scripts/validate-openclaw-tool-search.mts
COPY src/lib/tool-disclosure.ts /src/lib/tool-disclosure.ts
COPY src/lib/messaging/ /src/lib/messaging/
COPY nemoclaw-blueprint/openclaw-plugins/ /usr/local/share/nemoclaw/openclaw-plugins/
RUN chmod 755 /usr/local/bin/nemoclaw-start /usr/local/bin/nemoclaw-codex-acp \
/usr/local/lib/nemoclaw/sandbox-init.sh \
/scripts/generate-openclaw-config.mts \
/scripts/validate-openclaw-tool-search.mts \
/src/lib/messaging/applier/build/messaging-build-applier.mts \
&& chmod 444 /src/lib/tool-disclosure.ts \
&& chmod -R a+rX /src/lib/messaging \
&& chown root:root /usr/local/bin/nemoclaw-gateway-control \
/usr/local/lib/nemoclaw/gateway-supervisor.sh \
Expand Down Expand Up @@ -645,6 +649,7 @@ ARG NEMOCLAW_INFERENCE_API=openai-completions
ARG NEMOCLAW_CONTEXT_WINDOW=131072
ARG NEMOCLAW_MAX_TOKENS=4096
ARG NEMOCLAW_REASONING=false
ARG NEMOCLAW_TOOL_DISCLOSURE=progressive
# Comma-separated list of input modalities accepted by the primary model
# (e.g. "text" or "text,image" for vision-capable models). OpenClaw's
# model schema currently accepts "text" and "image". See #2421.
Expand Down Expand Up @@ -714,6 +719,7 @@ ENV NEMOCLAW_MODEL=${NEMOCLAW_MODEL} \
NEMOCLAW_CONTEXT_WINDOW=${NEMOCLAW_CONTEXT_WINDOW} \
NEMOCLAW_MAX_TOKENS=${NEMOCLAW_MAX_TOKENS} \
NEMOCLAW_REASONING=${NEMOCLAW_REASONING} \
NEMOCLAW_TOOL_DISCLOSURE=${NEMOCLAW_TOOL_DISCLOSURE} \
NEMOCLAW_INFERENCE_INPUTS=${NEMOCLAW_INFERENCE_INPUTS} \
NEMOCLAW_AGENT_TIMEOUT=${NEMOCLAW_AGENT_TIMEOUT} \
NEMOCLAW_AGENT_HEARTBEAT_EVERY=${NEMOCLAW_AGENT_HEARTBEAT_EVERY} \
Expand Down Expand Up @@ -762,6 +768,31 @@ USER sandbox
# block until after build-time OpenClaw doctor/plugin commands complete.
RUN NEMOCLAW_OPENCLAW_MANAGED_PROXY=0 node --experimental-strip-types /scripts/generate-openclaw-config.mts

# Validate the patched OpenClaw tool-search contract against real generated
# configs for both supported disclosure modes. This runs at image build time so
# OpenClaw dist drift or a generator/schema mismatch fails the build closed.
# hadolint ignore=DL3059
RUN set -eu; \
validation_root="$(mktemp -d /tmp/nemoclaw-openclaw-tool-search.XXXXXX)"; \
trap 'rm -rf "$validation_root"' EXIT; \
for mode in progressive direct; do \
validation_home="$validation_root/$mode"; \
mkdir -p "$validation_home"; \
HOME="$validation_home" \
NEMOCLAW_MODEL=test-model \
NEMOCLAW_PRIMARY_MODEL_REF=inference/test-model \
NEMOCLAW_TOOL_DISCLOSURE="$mode" \
NEMOCLAW_OPENCLAW_MANAGED_PROXY=0 \
node --experimental-strip-types /scripts/generate-openclaw-config.mts; \
node --experimental-strip-types /scripts/validate-openclaw-tool-search.mts \
/usr/local/lib/node_modules/openclaw/dist \
"$validation_home/.openclaw/openclaw.json" \
"$mode" \
"$OPENCLAW_VERSION"; \
done; \
rm -rf "$validation_root"; \
trap - EXIT

# Install non-messaging OpenClaw plugins that need to match the runtime.
# hadolint ignore=DL3059,DL4006
RUN set -eu; \
Expand Down
4 changes: 4 additions & 0 deletions agents/hermes/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,11 @@ RUN chmod -R a+rX /opt/nemoclaw-hermes-plugin/
COPY agents/hermes/generate-config.ts /opt/nemoclaw-hermes-config/generate-config.ts
COPY agents/hermes/config/ /opt/nemoclaw-hermes-config/config/
COPY agents/hermes/host/managed-tool-gateway-matrix.json /opt/nemoclaw-hermes-config/managed-tool-gateway-matrix.json
COPY src/lib/tool-disclosure.ts /src/lib/tool-disclosure.ts
COPY src/lib/messaging/ /src/lib/messaging/
RUN find /opt/nemoclaw-hermes-config -type d -exec chmod 755 {} + \
&& find /opt/nemoclaw-hermes-config -type f -exec chmod 444 {} + \
&& chmod 444 /src/lib/tool-disclosure.ts \
&& chmod -R a+rX /src/lib/messaging

# Copy blueprint (shared infrastructure)
Expand Down Expand Up @@ -219,6 +221,7 @@ ARG NEMOCLAW_PROVIDER_KEY=custom
ARG NEMOCLAW_UPSTREAM_PROVIDER=custom
ARG NEMOCLAW_INFERENCE_BASE_URL=https://inference.local/v1
ARG NEMOCLAW_INFERENCE_API=openai-completions
ARG NEMOCLAW_TOOL_DISCLOSURE=progressive
# CHAT_UI_URL is a legacy name shared with the OpenClaw build arg. For
# Hermes this URL points at the browser dashboard. The OpenAI-compatible
# API remains exposed separately on port 8642.
Expand All @@ -237,6 +240,7 @@ ENV NEMOCLAW_MODEL=${NEMOCLAW_MODEL} \
NEMOCLAW_UPSTREAM_PROVIDER=${NEMOCLAW_UPSTREAM_PROVIDER} \
NEMOCLAW_INFERENCE_BASE_URL=${NEMOCLAW_INFERENCE_BASE_URL} \
NEMOCLAW_INFERENCE_API=${NEMOCLAW_INFERENCE_API} \
NEMOCLAW_TOOL_DISCLOSURE=${NEMOCLAW_TOOL_DISCLOSURE} \
CHAT_UI_URL=${CHAT_UI_URL} \
NEMOCLAW_MESSAGING_PLAN_B64=${NEMOCLAW_MESSAGING_PLAN_B64} \
NEMOCLAW_WEB_SEARCH_ENABLED=${NEMOCLAW_WEB_SEARCH_ENABLED} \
Expand Down
3 changes: 3 additions & 0 deletions agents/hermes/config/build-env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import { Buffer } from "node:buffer";

import { normalizeProviderPlaceholderForEnvKey } from "../../../src/lib/messaging/provider-placeholders.ts";
import { readToolDisclosureEnv } from "../../../src/lib/tool-disclosure.ts";

export type HermesWebSearchProvider = "tavily";

Expand All @@ -13,6 +14,7 @@ export type HermesBuildSettings = {
providerKey: string;
upstreamProvider: string;
inferenceApi: string;
toolDisclosure: "progressive" | "direct";
webSearchProvider: HermesWebSearchProvider | null;
messagingCredentialPlaceholders: Array<{
envKey: string;
Expand All @@ -34,6 +36,7 @@ export function readHermesBuildSettings(env: NodeJS.ProcessEnv): HermesBuildSett
providerKey: env.NEMOCLAW_PROVIDER_KEY || "custom",
upstreamProvider: env.NEMOCLAW_UPSTREAM_PROVIDER || env.NEMOCLAW_PROVIDER_KEY || "custom",
inferenceApi: env.NEMOCLAW_INFERENCE_API || "",
toolDisclosure: readToolDisclosureEnv(env),
webSearchProvider: readWebSearchProvider(env),
messagingCredentialPlaceholders: readMessagingCredentialPlaceholders(env),
managedToolGateways: {
Expand Down
11 changes: 11 additions & 0 deletions agents/hermes/config/hermes-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,17 @@ export function buildHermesConfig(settings: HermesBuildSettings): Record<string,
max_turns: 60,
reasoning_effort: "medium",
},
tools: {
tool_search: {
// Deliberately defer every MCP and non-core plugin tool, even for a
// small catalog. Hermes keeps its built-in core tools directly visible.
// Keep Hermes' native snake_case keys and 5/20 limits distinct from
// OpenClaw's camelCase Tool Search contract and 8-result default.
enabled: settings.toolDisclosure === "direct" ? "off" : "on",
search_default_limit: 5,
max_search_limit: 20,
},
},
memory: {
memory_enabled: true,
user_profile_enabled: true,
Expand Down
15 changes: 14 additions & 1 deletion agents/langchain-deepagents-code/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,20 @@ RUN set -eu; \
COPY agents/langchain-deepagents-code/generate-config.ts /opt/nemoclaw-deepagents-code/generate-config.ts
COPY agents/langchain-deepagents-code/managed-dcode-runtime.py /opt/nemoclaw-deepagents-code/managed-dcode-runtime.py
COPY agents/langchain-deepagents-code/patch-managed-deepagents-code.py /opt/nemoclaw-deepagents-code/patch-managed-deepagents-code.py
COPY agents/langchain-deepagents-code/progressive_tool_disclosure.py /opt/nemoclaw-deepagents-code/progressive_tool_disclosure.py
COPY agents/langchain-deepagents-code/validate-progressive-tool-disclosure.py /opt/nemoclaw-deepagents-code/validate-progressive-tool-disclosure.py
COPY agents/langchain-deepagents-code/dcode-wrapper.sh /usr/local/lib/nemoclaw/dcode-wrapper.sh
COPY agents/langchain-deepagents-code/dcode-launcher.sh /usr/local/lib/nemoclaw/dcode-launcher.sh
COPY agents/langchain-deepagents-code/start.sh /usr/local/bin/nemoclaw-start
COPY nemoclaw-blueprint/ /opt/nemoclaw-blueprint/
RUN chmod 444 /opt/nemoclaw-deepagents-code/generate-config.ts /opt/nemoclaw-deepagents-code/managed-dcode-runtime.py /opt/nemoclaw-deepagents-code/patch-managed-deepagents-code.py \
RUN chmod 444 /opt/nemoclaw-deepagents-code/generate-config.ts /opt/nemoclaw-deepagents-code/managed-dcode-runtime.py /opt/nemoclaw-deepagents-code/patch-managed-deepagents-code.py /opt/nemoclaw-deepagents-code/progressive_tool_disclosure.py /opt/nemoclaw-deepagents-code/validate-progressive-tool-disclosure.py \
&& chmod 755 /usr/local/bin/nemoclaw-start /usr/local/lib/nemoclaw/dcode-wrapper.sh /usr/local/lib/nemoclaw/dcode-launcher.sh \
&& chmod -R a+rX /opt/nemoclaw-blueprint \
&& python3 /opt/nemoclaw-deepagents-code/patch-managed-deepagents-code.py \
&& install -d -m 0700 /tmp/nemoclaw-progressive-validation \
&& TMPDIR=/tmp/nemoclaw-progressive-validation python3 /opt/nemoclaw-deepagents-code/validate-progressive-tool-disclosure.py \
&& rm -rf /tmp/nemoclaw-progressive-validation \
&& rm -f /opt/nemoclaw-deepagents-code/validate-progressive-tool-disclosure.py \
&& rm -f /usr/local/bin/dcode /usr/local/bin/deepagents-code /opt/venv/bin/dcode /opt/venv/bin/deepagents-code \
&& install -m 0755 /usr/local/lib/nemoclaw/dcode-launcher.sh /usr/local/bin/dcode \
&& install -m 0755 /usr/local/lib/nemoclaw/dcode-launcher.sh /usr/local/bin/dcode.real \
Expand All @@ -41,11 +47,17 @@ ARG NEMOCLAW_PROVIDER_KEY=inference
ARG NEMOCLAW_UPSTREAM_PROVIDER=nvidia
ARG NEMOCLAW_INFERENCE_BASE_URL=https://inference.local/v1
ARG NEMOCLAW_INFERENCE_API=openai-completions
ARG NEMOCLAW_TOOL_DISCLOSURE=progressive
ARG NEMOCLAW_BUILD_ID=default
ARG NEMOCLAW_DARWIN_VM_COMPAT=0
ARG NEMOCLAW_PROXY_HOST=10.200.0.1
ARG NEMOCLAW_PROXY_PORT=3128

RUN case "$NEMOCLAW_TOOL_DISCLOSURE" in \
progressive|direct) ;; \
*) echo "ERROR: NEMOCLAW_TOOL_DISCLOSURE must be progressive or direct" >&2; exit 1 ;; \
esac

# The launcher and startup script read these root-owned files instead of
# trusting process-level environment overrides for inference routing. Invoking
# each launcher validates the build args before the image can complete.
Expand All @@ -67,6 +79,7 @@ ENV HOME=/sandbox \
NEMOCLAW_UPSTREAM_PROVIDER=${NEMOCLAW_UPSTREAM_PROVIDER} \
NEMOCLAW_INFERENCE_BASE_URL=${NEMOCLAW_INFERENCE_BASE_URL} \
NEMOCLAW_INFERENCE_API=${NEMOCLAW_INFERENCE_API} \
NEMOCLAW_TOOL_DISCLOSURE=${NEMOCLAW_TOOL_DISCLOSURE} \
NEMOCLAW_BUILD_ID=${NEMOCLAW_BUILD_ID} \
DEEPAGENTS_CODE_NO_UPDATE_CHECK=1 \
LANGGRAPH_NO_VERSION_CHECK=true \
Expand Down
109 changes: 106 additions & 3 deletions agents/langchain-deepagents-code/patch-managed-deepagents-code.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

EXPECTED_DCODE_VERSION = "0.1.30"
PATCH_MARKER = "NemoClaw-managed Deep Agents Code hardening v2."
TOOL_DISCLOSURE_PATCH_MARKER = "NemoClaw-managed progressive tool disclosure."
MIDDLEWARE_MODULE = "progressive_tool_disclosure.py"
MANAGED_RUNTIME_SOURCE_PATH = Path(__file__).with_name("managed-dcode-runtime.py")

MAIN_MARKER = " args = parser.parse_args()\n"
Expand Down Expand Up @@ -396,20 +398,90 @@ def _nemoclaw_get_class_path(self, provider_name: str):
ModelConfig.get_class_path = _nemoclaw_get_class_path
'''

# Source-of-truth boundary: pinned upstream deepagents-code==0.1.30 has no
# supported managed progressive-disclosure middleware hook in its agent factory
# API, and this repository cannot change that third-party package source.
# Patcher/unit guards plus validate-progressive-tool-disclosure.py cover this
# fail-closed integration. Remove it once upstream provides a supported hook
# preserving managed MCP, credentials, approvals, executor, sandbox, and private
# checkpoint-state boundaries.
AGENT_PATCH = r'''

# NemoClaw-managed Deep Agents Code hardening v2.
# NemoClaw-managed progressive tool disclosure.
from contextvars import ContextVar as _NemoClawContextVar

_nemoclaw_original_create_cli_agent = create_cli_agent
_nemoclaw_original_create_deep_agent = globals().get("create_deep_agent")
_nemoclaw_progressive_disclosure_active = _NemoClawContextVar(
"nemoclaw_progressive_disclosure_active", default=False
)


def _nemoclaw_create_deep_agent(*args, **kwargs):
"""Install distinct disclosure middleware in the main and local subagent graphs."""
if _nemoclaw_original_create_deep_agent is None:
raise RuntimeError("Deep Agents Code create_deep_agent boundary is unavailable")
if not _nemoclaw_progressive_disclosure_active.get():
return _nemoclaw_original_create_deep_agent(*args, **kwargs)
from deepagents_code.progressive_tool_disclosure import (
ProgressiveToolDisclosureMiddleware,
)

middleware = list(kwargs.get("middleware") or ())
middleware.append(ProgressiveToolDisclosureMiddleware())
kwargs["middleware"] = middleware

subagents = kwargs.get("subagents")
if subagents:
patched_subagents = []
for subagent in subagents:
if isinstance(subagent, dict):
subagent_middleware = list(subagent.get("middleware") or ())
subagent_middleware.append(ProgressiveToolDisclosureMiddleware())
subagent = {**subagent, "middleware": subagent_middleware}
patched_subagents.append(subagent)
kwargs["subagents"] = patched_subagents

return _nemoclaw_original_create_deep_agent(*args, **kwargs)


if _nemoclaw_original_create_deep_agent is not None:
create_deep_agent = _nemoclaw_create_deep_agent


def create_cli_agent(model, assistant_id, *args, **kwargs):
"""Keep secondary model and remote-agent paths on the managed graph."""
"""Keep managed graph posture and progressively disclose loaded MCP tools."""
kwargs["rubric_model"] = None
kwargs["async_subagents"] = None
return _nemoclaw_original_create_cli_agent(
model, assistant_id, *args, **kwargs
from deepagents_code.progressive_tool_disclosure import (
assert_unique_callable_tool_names,
)

assert_unique_callable_tool_names(
kwargs.get("tools"), kwargs.get("mcp_server_info")
)
has_loaded_mcp_tools = any(
getattr(info, "tools", ()) for info in kwargs.get("mcp_server_info") or ()
)
if has_loaded_mcp_tools:
from deepagents_code.progressive_tool_disclosure import (
progressive_tool_disclosure_enabled,
)

progressive_active = progressive_tool_disclosure_enabled()
else:
progressive_active = False
if progressive_active and _nemoclaw_original_create_deep_agent is None:
raise RuntimeError("Deep Agents Code create_deep_agent boundary is unavailable")
token = _nemoclaw_progressive_disclosure_active.set(progressive_active)
try:
return _nemoclaw_original_create_cli_agent(
model, assistant_id, *args, **kwargs
)
finally:
_nemoclaw_progressive_disclosure_active.reset(token)


def _resolve_ptc_option(*args, **kwargs):
"""Disable interpreter programmatic tool calling at the final build boundary."""
Expand Down Expand Up @@ -891,16 +963,45 @@ def main() -> None:
}
texts = {name: path.read_text(encoding="utf-8") for name, path in paths.items()}

module_source_path = Path(__file__).with_name(MIDDLEWARE_MODULE)
module_destination_path = root / MIDDLEWARE_MODULE
if not module_source_path.is_file():
raise RuntimeError(
f"NemoClaw middleware source not found at {module_source_path}"
)
module_source = module_source_path.read_text(encoding="utf-8")
compile(module_source, str(module_destination_path), "exec")
if module_destination_path.exists() or module_destination_path.is_symlink():
if (
not module_destination_path.is_file()
or module_destination_path.is_symlink()
or module_destination_path.read_text(encoding="utf-8") != module_source
):
raise RuntimeError(
f"Refusing to overwrite unexpected middleware at {module_destination_path}"
)

marker_states = {PATCH_MARKER in text for text in texts.values()}
helper_path = root / "_nemoclaw_managed.py"
if marker_states == {True}:
if not helper_path.is_file() or PATCH_MARKER not in helper_path.read_text(
encoding="utf-8"
):
raise RuntimeError("Managed package patch is partial: helper is missing")
if not module_destination_path.is_file():
raise RuntimeError("Managed package patch is partial: middleware is missing")
if texts["agent"].count(AGENT_PATCH.lstrip()) != 1:
raise RuntimeError(
f"Managed package progressive-disclosure patch is incomplete in {paths['agent']}"
)
return
if marker_states != {False} or helper_path.exists():
raise RuntimeError("Managed package patch is partial; refusing mixed source state")
if TOOL_DISCLOSURE_PATCH_MARKER in texts["agent"]:
raise RuntimeError(
"Managed package progressive-disclosure patch is partial; "
"refusing mixed source state"
)

_require_functions(paths["main"], texts["main"], {"parse_args"})
_require_methods(
Expand Down Expand Up @@ -1124,6 +1225,8 @@ def main() -> None:
for name, text in transformed.items():
paths[name].write_text(text, encoding="utf-8")
helper_path.write_text(managed_runtime_source, encoding="utf-8")
if not module_destination_path.exists():
module_destination_path.write_text(module_source, encoding="utf-8")


if __name__ == "__main__":
Expand Down
Loading
Loading