Fixed
- **codex `view_image` (and other self-invoking codex tools) work on
macOS hosts where codex isn't at `~/.local/bin/codex` (PUF-372).**
codex's fs-sandbox helper re-invokes the CLI via that hardcoded path,
which doesn't exist on Homebrew / Codex.app installs — the tool died
with `execvp() ... No such file or directory`. The daemon now points
`~/.local/bin/codex` at the resolved binary before spawning (a real
file or live symlink there is never touched; a dangling link from a
moved install is re-pointed) and additionally prepends the binary's
dir to the subprocess `PATH` for name-based re-invokes.
- **cli-docker no longer injects host-local MCP configs that can't run in
the container (PUF-34).** Host-sync now recognizes macOS host-only
paths (`/opt/homebrew`, `/opt/local`, `/Volumes`, `/private`) and also
catches host paths hidden in `args` behind a bare `npx`/`uvx` launcher.
Detected servers are skipped with an actionable warning ("install in
the image or bind-mount, then re-sync") instead of being injected as
dead config that failed on first use; `/tmp` args stay container-valid
(a `/tmp` output path is fine, a `/tmp` binary is still host-staged),
and the container's own `/opt/puffoagent-pkg` keeps resolving.
- **Profile edits now take effect on refresh — a changed prompt forces a
fresh CLI session (PUF-36).** The CLI bakes the system prompt at
session creation, so `--resume` replayed the old one and profile edits
appeared silently ignored. The refresh path now compares the rebuilt
prompt's primer + profile slice against the current one and drops the
session only when that slice actually changed: memory-only rebuilds,
no-op refreshes (host-sync, skill installs), display_name/role-chip
edits, restarts, and model swaps all keep the conversation; an
explicit `refresh(session=True)` still always drops it.
- **Role edits reach the agent's prompt.** Editing role from the web
updated `agent.yml` and the server identity but never the
`**Role:**` line in `profile.md`, so the in-prompt role stayed stale
on both edit paths (local bridge + control-WS). Both now rewrite the
first `**Role:**` line; custom profiles without one are untouched.
- **Over-limit message bursts no longer drop the whole batch (PUF-363).**
When a thread's queued messages would, concatenated into the single
per-turn input block, exceed the harness input-byte budget (Claude
Code's 180KB pre-send cap), the consumer now dispatches the largest
FIFO prefix that fits and defers the remainder to following turns —
split only at message boundaries, nothing dropped, nothing reordered.
Previously the adapter rejected the whole over-limit batch with a
"reduce or split" reply and every message in it went unprocessed.
Codex gets a 4MB safety-net ceiling (it has no adapter input cap).
- **Relay TLS now trusts certifi's CA bundle, so linking works on hosts
without a populated OpenSSL cert store.** Linking against
`https://chat.puffo.ai` died with `SSL: CERTIFICATE_VERIFY_FAILED —
unable to get local issuer certificate` on interpreters whose ambient
cert store isn't set up (python.org's macOS Python before running
"Install Certificates.command", some uv-managed builds); local testing
never caught it because it ran against plain `http://localhost:3000`.
`create_remote_http_session` now builds a module-level SSL context
that trusts the system store PLUS certifi's bundle (so corporate-proxy
roots keep working) and applies it to both the SOCKS `ProxyConnector`
and the default `TCPConnector`, and
every relay-facing HTTPS/WSS call site (link code mint / redeem /
approval poll / unlink, the control-WS reverse channel + `/me` liveness,
active-recipient fetch, slug-binding finalize) now routes through that
factory instead of a bare `aiohttp.ClientSession()`. `certifi` is now a
declared dependency.
Changed
- **Long-message redaction thresholds raised to 16000/8000 chars**
(inline cap / `get_post_segment` page size, from 4000/2000). Per-turn
totals are now bounded by greedy-fill batching, so the inline cap only
guards session-lifetime context growth — typical code/log pastes
inline whole instead of collapsing to a preview placeholder. Both
limits now live in one shared `puffo_agent.limits` module, and the
redaction placeholder cites `segment_size` explicitly so paging stays
aligned on hosts that override the daemon page size.
- **Runbook for Codex Apps connector scope failures.** The `use-host-mcp`
skill body now explains that Codex Apps connectors (`mcp__codex_apps__*`
— Drive, Gmail, …) are codex-internal, not puffo-managed MCP, so
`list_mcp_servers` can't see them and `sync_host_mcp` can't fix them.
When writes fail with `ACCESS_TOKEN_SCOPE_INSUFFICIENT`, the fix is to
reconnect the connector in interactive codex (approving write scopes),
then `refresh(host_sync=True)` on the agent (`session=True` too on
cli-docker) and allow one worker turn. Docs only — no code path change.
Removed
- **`SETUP_FOR_AI.md`.** The standalone AI-assistant onboarding guide was
last meaningfully updated at 0.9.4, had drifted from the current setup
flow, was referenced by nothing, and was never packaged. The living
onboarding pointer is the hosted `https://chat.puffo.ai/setup.md` plus
the in-agent skills.