add direct agents and managed NAC hosting - #231
Draft
allisoneer wants to merge 232 commits into
Draft
Conversation
12 tasks
|
All contributors have signed the CLA ✍️ ✅ |
allisoneer
force-pushed
the
allison-demo
branch
from
September 8, 2026 15:42
fc59c4c to
90e04e4
Compare
Author
|
I have read the CLA Document and I hereby sign the CLA |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What problem(s) was I solving?
NAC’s established orchestrator/worker topology works well for planned parallel execution, but it was the only durable session behavior. We needed to support a persistent direct coding agent that could work across turns, accept steering, pursue explicit long-running goals, and delegate work without collapsing traditional child agents, managed orchestrators, and NAC workers into one topology.
That expansion also required stronger execution boundaries. Model-visible tools needed a common prepared-invocation and authorization path with canonical resource binding, hard denials, retained terminal results, cancellation, process-tree cleanup, and backend-specific execution that remains safe across Local, SSH, and optional Podman.
For managed-host dogfooding, NAC also needed an additive deployment mode with GitHub authorization, safe repository onboarding, host secrets, mounted model credentials, readiness, and a reproducible developer image. None of this should affect ordinary local or SSH use when managed configuration is absent.
Finally, feature work had accumulated in very large core/server modules, handwritten frontend DTOs could drift from Rust, and the repository lacked production-embedded browser, durability, managed-image, and source-ownership gates capable of protecting these lifecycle and safety contracts.
What user-facing changes did I ship?
Persistent session behaviors
Every new chat now selects one immutable, persisted behavior:
orchestrator) preserves the existing planner, worker, thread, and workset experience. It remains the default for legacy and omitted behavior values.direct) runs a persistent coding agent with native tools, durable input, goals, retained command output, and traditional child coding agents.direct-with-orchestrator) adds control of separate managed NAC orchestrator sessions while keeping those sessions distinct from traditional children.The selected behavior is visible for the lifetime of the chat and cannot be changed in place.
Direct-agent workflows
direct-with-orchestratorsessions can similarly launch and manage separate orchestrator sessions using the existing NAC thread/workset topology.Managed NAC host
When explicitly configured, NAC now provides:
ghcredential delivery.Managed mode remains absent when no managed configuration is supplied. It does not replace ordinary local or SSH Projects.
Native web retrieval
Top-level direct sessions conditionally receive
web_searchandweb_fetchwhen a usable Exa credential is available. Retrieval uses fixed Exa Search/Contents endpoints with bounded requests, retries, results, redaction, cancellation, URL validation, and normal permission evaluation. The credential is removed from model-controlled process environments, and orchestrator workers and traditional children do not receive these tools.How I implemented it
nac-serverinto focused application services and HTTP delivery modules while preserving the existing public HTTP/MCP behavior.utoipaschemas the source of truth for checked-in OpenAPI and generated frontend types. The React client now consumes feature-owned query modules and generated wire contracts.Compatibility and migration notes
orchestrator.How to verify it
Verified on exact PR head
debc813:make cinac-coretests passed, with 9 expected optional/live-infrastructure ignoresmake test-durability— all 10 focused cancellation, recovery, crash-window, lease, relationship, and exactly-once settlement regressions passed.make test-e2e— all 14 production-embedded browser journeys passed, including immutable behavior selection, the final create-session accessibility contract, direct execution, steering/inbox/goals, delegated transcripts, native Exa retrieval, managed desktop/mobile onboarding, secrets, clone completion, and clone cancellation.Description for the changelog
Add persistent direct-agent sessions with durable steering, goals, permissions, retained terminals, and traditional or orchestrator delegation. Introduce opt-in Managed NAC hosting with GitHub repository onboarding, write-only host secrets, mounted model credentials, native Exa retrieval, hardened execution boundaries, generated API contracts, and production-level durability/browser/image verification.
Managed Arcee credential bootstrap follow-up
Managed NAC hosts can now start without a second interactive login or a long-lived API key mount. ArceeFM mints a host-scoped
managed-nacauthorization and nac-api delivers a strict, one-time bootstrap document. NAC imports it through the existing hardened credential store, persists refresh rotation on the host volume, and then runs independently of the bootstrap mount.The durable receipt and credential are validated together under the Arcee credential lock. Readiness, catalog exposure, session creation, and resume require an
importedreceipt whose host/bootstrap provenance exactly matches amanaged-naccredential and the configured Arcee origin. Legacy interactive credentials, preserved pre-existing files, corrupt data, logout/revocation, and mismatched generations fail closed without exposing or overwriting secret material. Interactivearcee-authremains unchanged for ordinary unmanaged use, and model selection remains independent from the account-level authorization.Additional verification on exact head
8710617:make cion the integratedallison-demobranch (1,176 core tests with 9 expected ignores, 156 server library tests, 23 server binary tests, 245 web tests, Clippy, formatting, generated API/types, production assets, and the managed-image contract).make test-durability.make test-e2e(18 production-embedded journeys).linux/amd64image. The smoke proves a fresh host cannot reach/readyzwithout bootstrap, imports the exact mountedbootstrap_id, survives an abruptSIGKILL, and reaches readiness from the PVC-backed credential and receipt after the bootstrap mount is removed.\n- [ ] Live controller/ArceeFM/Kubernetes integration remains a staging gate.