Originally created by: sosidudku1
Towards [#79].
agent.approvalRequired existed only as a config.json key, so users hitting repeated approval prompts had no way to turn them off without a restart or hand-editing config.json, and nothing on screen said where the switch lives.
y) next to the analytics opt-out. Applies live (no restart) and persists to config.json. The ON label states the cost plainly: "on (the agent runs every action without asking)", rendered in the error color while active./privacy approve on|off mirrors /privacy analytics on|off; the target state must be named, there is no bare toggle form.approvalRequired: true; the ApprovalGate's autoApprove flag carries the boot value, so runtime.setApprovalRequired flips approvals in both directions without a restart. Boot behavior is unchanged; a new bootstrap test pins the invariant end to end.serve now resolves approvals like run and tui: the persisted agent.approvalRequired is the baseline and --no-approval can only force approvals off, never back on. Previously serve read only the flag, which made the panel promise "applies to future runs too" false for serve.GET /api/capabilities reports runtime.isApprovalRequired() instead of the frozen boot snapshot, fixing the stale value under serve --no-approval and after live toggles.config.json was already rewritten and the next start uses the new value.Issue [#79] first asks for "always allow this session / always allow this command shape" options inside the approval prompt itself, and recommends the session-scoped grant as the safer default. That variant needs a richer ApprovalGate resolve protocol (scoped grants, command-shape matching) and is deferred to separate work; the issue's session-scope recommendation stands. This PR ships the coarse global switch plus a pointer to it from the prompt, so the fatigue path has an exit today.
/privacy approve on|off dispatch, usage guard, and callback mappingGET /api/capabilities follows the live gate state
Ticket changed by: Ooooze