Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
50 changes: 50 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,56 @@ All notable changes to Code Context Control (C3) are documented here.
The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.157.0] - 2026-10-14

### Added — the fleet views on the mobile gateway (API version 7)

C3 Desk reads its Locks, Permissions, Rules, Built-in guards, Sessions and
Now views from the Hub on loopback, which a phone cannot reach. The Oracle's
mobile gateway now serves the same read models, so the companion app can show
everything Desk shows. What the phone may change stays narrower than Desk.

- `services/fleet_overview.py` builds the cross-project payloads (locks,
Access Guard rules, tool discipline, override policy, built-in guards, and a
Now snapshot). The Hub's `/api/hub/locks/overview`,
`/api/hub/access/overview`, `/api/hub/enforcement/overview`,
`/api/hub/overrides/policy/overview` and `GET /api/hub/access/builtin` now
call it too, so Desk and the phone read the same rows. Their responses are
unchanged.
- New gateway routes (`oracle/services/mobile_fleet.py`):
- `GET /api/mobile/locks/overview`. Read only: breaking a lease stays on the
Hub.
- `GET /api/mobile/access/overview` and `GET /api/mobile/enforcement/overview`,
each with a `writable` block naming the scopes this gateway will edit.
- `GET /api/mobile/overrides/policy/overview` (global scope read-only).
- `POST /api/mobile/enforcement/clear` and
`POST /api/mobile/overrides/policy/clear`, project scope only. Clearing
asks for `confirm: "off"` or `confirm: "widen"` when what the project
would inherit is looser.
- `GET /api/mobile/access/builtin`, `POST /api/mobile/access/builtin/mode`
and `POST /api/mobile/access/builtin/lease/revoke`. The mode route only
tightens: a looser mode is a 403 (`needs_desk`, with the CLI command) for
every token kind, Desk's included. Leases are never minted here. Global
scope needs `mobile_access_global_scope`, even to tighten.
- `GET /api/mobile/sessions/overview`, `GET /api/mobile/sessions`,
`GET /api/mobile/sessions/detail` and `POST /api/mobile/sessions/mark`.
First and last prompts, the turn preview and titles copied from a first
prompt are withheld unless `mobile_sessions_transcripts` is on (default
off, per docs/sessions.md). Resume is not offered; the
`claude.ai/code` remote link is passed through.
- `GET /api/mobile/now`: live sessions from the MCP heartbeats, their newest
token totals and last C3 call, running jobs, last CI run and file-map
freshness, plus whether the Hub answers.
- Capabilities `locks_overview`, `access_overview`, `enforcement_overview`,
`enforcement_clear`, `override_policy_overview`, `override_policy_clear`,
`builtin`, `builtin_tighten`, `sessions`, `sessions_write`, `now`. New
switches `mobile_builtin_enabled`, `mobile_builtin_tighten`,
`mobile_sessions_enabled`, `mobile_sessions_write` (default on) and
`mobile_sessions_transcripts` (default off).
- Gateway invariant 2 is restated: no route can loosen or disable a built-in
guard. `tests/test_mobile_security_api.py` now pins the exact set of builtin
routes instead of banning the word.

## [2.156.0] - 2026-10-13

### Added — Scheduled tasks
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ C3 also records real per-tool usage to `.c3/tool_telemetry.jsonl`, so estimates

- **All web servers bind `127.0.0.1` by default** and are guarded against browser-based attacks even on loopback — a Host-header allowlist (defeats DNS rebinding) plus an Origin/Referer check on every request (defeats cross-origin CSRF), with scoped, non-wildcard CORS. There is still **no user authentication**, so do not expose these servers to an untrusted network without auth/TLS in front. Binding to a non-loopback interface is opt-in and warned at startup. *(Hardening added in v2.33.0.)*
- **Mobile gateway (`/api/mobile/*`)** — the Oracle exposes a companion-app surface for the C3 mobile app: merged cross-project feed, project overview, PM board read/write, digest, notification ack, plus the security surface (credential vault, Access Guard rules and masks, tool discipline). Unlike the legacy Oracle GETs it requires a **Bearer token on every method, GETs included** — the Discovery token, or (v2.125.0+) a **per-client token**: one credential per paired device, stored hashed in `~/.c3/oracle/clients.json`, revocable one at a time, and carrying a kind (`mobile` or `desk`) that override decisions are audited under. It validates every project path against the registry, and audits every write to the project's activity log and edit ledger. Pair the app from Oracle Settings → *Mobile app* (the QR carries the URL and a freshly minted per-device token; a legacy Discovery-token code is one button away). A same-machine client such as C3 Desk pairs itself with `POST /api/mobile/clients` and the owner-only `~/.c3/oracle/bootstrap.key`. Remote reachability is the same recipe as the Discovery API: set `bind_host` to the Tailscale/LAN interface IP (avoid `0.0.0.0`) and list that address in `allowed_hosts`, both in `~/.c3/oracle/config.json`; with such a bind the Oracle also listens on `127.0.0.1` (`loopback_listener`, default on) so local clients are not refused. Disable the whole surface with `"mobile_api_enabled": false`, or any subsystem with `mobile_credentials_enabled` / `mobile_access_enabled` / their `_write` twins.
- **The mobile gateway never returns a credential value.** It has no reveal route by design: entries cross the wire through an allowlist serializer, and a value can only be identified by its length and an on-demand fingerprint. Two further levers ship **off** — `mobile_creds_agent_readable_raise` (raising `agent_readable` from the phone) and `mobile_access_global_scope` (machine-wide access rules) — because each exceeds what a leaked Bearer token could otherwise reach. Deliberately absent from the surface: bulk `.env` import, denial-counter clearing, `set_builtin_disabled`, and the raw-content access preview.
- **The mobile gateway never returns a credential value.** It has no reveal route by design: entries cross the wire through an allowlist serializer, and a value can only be identified by its length and an on-demand fingerprint. Two further levers ship **off** — `mobile_creds_agent_readable_raise` (raising `agent_readable` from the phone) and `mobile_access_global_scope` (machine-wide access rules) — because each exceeds what a leaked Bearer token could otherwise reach. Deliberately absent from the surface: bulk `.env` import, denial-counter clearing, any way to loosen or disable a built-in guard (v2.157.0 adds read, tighten and end-a-lease-early only), lock force-release, and the raw-content access preview. Since v2.157.0 (API version 7) the gateway also serves the cross-project views C3 Desk reads from the Hub (locks, Access Guard rules, tool discipline, override policy, built-in guards, the session catalog without transcript text, and a Now snapshot), so the companion app can show what Desk shows.
- **No telemetry by default.** The OSS package collects nothing. Opt-in Sentry crash reporting requires the `[telemetry]` extra plus both `SENTRY_DSN` and `C3_TELEMETRY_OPT_IN=1`; even then request bodies, local variables, and prompts are stripped.
- **LLM memory distillation is local-first.** Cloud distillation (v2.51.0) is off by default and opt-in per project.
- **API keys** for third-party providers are read from the environment and never persisted by C3.
Expand Down
2 changes: 1 addition & 1 deletion cli/c3.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
# Config
CONFIG_DIR = ".c3"
CONFIG_FILE = ".c3/config.json"
__version__ = "2.156.0"
__version__ = "2.157.0"

# The PreToolUse matcher for native subagent calls (installer and hub migration).
AGENT_MATCHER = "Agent|Task"
Expand Down
2 changes: 1 addition & 1 deletion cli/guide/tools.html
Original file line number Diff line number Diff line change
Expand Up @@ -1610,7 +1610,7 @@ <h4>Examples</h4>
<span class="tool-name">c3_schedule</span>
<div class="tag-row">
<span class="badge badge-purple">execute</span>
<span class="badge">v2.156.0</span>
<span class="badge">v2.157.0</span>
</div>
<span class="tool-tagline">Scheduled tasks — a skill, prompt or command the Oracle fires on a cadence, autonomously or after a human approves each run</span>
</div>
Expand Down
Loading
Loading