Credentials leak into prompts
Provider tokens inside the agent process can be logged, exfiltrated, or reused outside policy.
KEY_EXPOSURENEW Exact-command approvals in v0.1
The server-side execution and approval layer for AI agents. Inspect every action, enforce allow / ask / deny, and keep provider credentials outside the agent process.
Open source · self-hosted · fail closed by default
01The complete execution path
Follow a real command from agent intent to a redacted audit result. Switch the policy outcome to see where execution changes.
Server facts win.The agent cannot claim that a write is read-only.
bashd / governed commandbashd slack -- chat post --channel C123 --text "shipped"01INSPECT slack.chat.post
02FACT side_effect=true
03POLICY production-write → ask
04BIND version + tool + account selector + argv
05APPROVE apr_91QD · authorized, not executed
06OBSERVE bashd approval apr_91QD --wait
07REPLAY bashd slack --approval-id apr_91QD -- …
08RESULT original stdout / stderr / exit code
InspectSide effect found
DecidePolicy says ask
ApproveGrant only
ReplayAI executes explicitly
02Why a control plane
The failure modes are predictable. The boundary should be, too.
Provider tokens inside the agent process can be logged, exfiltrated, or reused outside policy.
KEY_EXPOSUREA plausible plan is not authorization to send, refund, publish, delete, or deploy.
UNREVIEWED_WRITENetwork ambiguity turns a harmless retry into a duplicate message, charge, or mutation.
DUPLICATE_EFFECTClient-side logs cannot prove what was inspected, approved, changed, or actually executed.
MISSING_FACTS03How it works
One execution protocol between autonomous code and the systems your company depends on.
bashd recomputes the tool action and side-effect facts on the server. Unknown paths fail closed.
action=slack.chat.post\nside_effect=true
Rules match action, tool, agent, environment, and account. First match resolves to allow, ask, or deny.
production-write\nmode=ask · priority=10
Ask binds a one-time grant to the exact command hash. Approving authorizes only; it never executes the tool.
approval=apr_91QD\nexecution=none
The agent observes the decision and explicitly replays the same command with --approval-id. A matching replay consumes the grant and returns the tool output unchanged.
replay=explicit\noutput=passthrough
04Capabilities
Not another prompt wrapper. A server-enforced boundary with a human path for consequential work.
Match action, tool, account, environment, and agent identity. Keep reads moving while writes follow the boundary you set.
01*.listALLOW
02slack.chat.postASK
03stripe.refunds.*DENY
The digest binds version, tool, literal account selector, and ordered argv. Shell quoting and the approval id are excluded.
7H2K:9F01:AC44Connections reveal field names and health—not credential values. Secrets resolve only for an allowed execution.
Decision queries only observe. One matching explicit replay consumes the grant; repeated or edited commands fail closed.
Investigate with server facts instead of reconstructing intent from scattered client logs.
12:42:08.114submittedagent/deployer
12:42:08.128policy · askrule/prod-write
12:43:17.904approvedreviewer/local
12:43:18.588replayed · succeeded684 ms
05Integrations
Agents keep a single CLI contract. Providers stay behind a credential-safe, source-audited catalog.
AGENT RUNTIMES
inspect
decide
execute
AUDITED SERVICES
Slack
01Stripe
02HubSpot
03Intercom
04Shopify
05Discord
06Calendly
07Chargebee
08Mixpanel
09Resend
10Plaid
11Mercury
12Unknown or host-unsafe tools remain unavailable until reviewed.
Browse connections06 Security boundary
bashd is explicit about what it enforces today—and what v0.1 does not pretend to solve.
Read the sourceThe agent selects a named account. It never receives the underlying provider token.
Unrecognized tools, failed inspection, and internal policy errors stop before execution.
Stored stdout and stderr have hard limits; injected credential values are removed before persistence.
A matching replay consumes its approval before the provider call. If the process loses the response, bashd reports an explicit unknown outcome instead of replaying it.
v0.1 boundary noticeNo authentication · local JSON state · loopback by default. Use on a trusted development network while hosted identity, RBAC, Postgres, worker isolation, and egress policy are built.
—Four teams, one boundary
Start from the consequence of an action, not a generic permission role.
READ PATHLook up a ticketALLOW
WRITE PATHRefund a paymentASK
READ PATHRead CRM contextALLOW
WRITE PATHSend an outbound emailASK
READ PATHQuery monitoringALLOW
WRITE PATHMutate productionDENY
READ PATHInspect provider stateALLOW
WRITE PATHPublish or deleteASK
07Run locally
The built-in gate probe exercises the entire flow without credentials or an external network request.
Install Go and Node dependencies, then build the two local binaries.
Run both foreground services. The API binds to loopback by default.
The probe binds the exact command to an approval and returns its URL.
Approve grants permission only. The agent observes it, then explicitly replays the exact command.
~/bashd# trigger the safe approval probe BASHD_API_URL=http://127.0.0.1:8080 \ ./bin/bashd gate-probe -- probe send --note hello APPROVAL_REQUIRED approval_id=apr_91QD next: bashd approval apr_91QD --wait # observe only; this never executes the tool ./bin/bashd approval apr_91QD --wait APPROVED approval_id=apr_91QD next: bashd gate-probe --approval-id apr_91QD -- probe send --note hello # the agent explicitly replays the exact command ./bin/bashd gate-probe --approval-id apr_91QD -- \ probe send --note hello TOOL OUTPUT returned unchanged · stdout / stderr / exit codeOpen local console
08FAQ
The short answers to the questions a security-minded engineering team should ask.
Direct calls put long-lived credentials and enforcement inside the least trusted process. bashd keeps provider credentials on the server, recomputes the action and side-effect facts, then applies policy before anything runs.
One explicit replay of the exact command digest: version, tool, literal account selector, and ordered argv. Approve records the grant but executes nothing; the agent must observe the decision and replay with --approval-id.
No. The first matching explicit replay atomically consumes the approval before execution. A repeated replay is rejected. If only the HTTP response is lost, querying the approval recovers the stored result without running again; a server crash during the provider request is reported as an unknown outcome.
The current hosted catalog exposes 99 source-audited AnyCLI services. Unknown tools and services with unsafe host access fail closed until their boundary has been reviewed.
No. v0.1 intentionally has no authentication and uses a local JSON store. It binds to loopback by default and is designed to validate the complete control flow on a trusted development network.
Yes. The Go control plane and Next.js console run locally, credentials remain in your environment, and the gate-probe tool lets you exercise the full approval path without touching an external service.
THE SAFE PATH TO ACTION
Run the full inspect → decide → approve → observe → explicit replay path locally. No provider credentials required.
Start with gate-probe Explore the console