diff --git a/CHANGELOG.md b/CHANGELOG.md index d79aa292b..0837b30c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 1.0.14-beta.0 — 2026-11-02 +### Features + +- `fp login` can sign you in from a browser, as `failproofai config` does: on a terminal it starts on a link, Tab switches to a code by email, and either way you get your own session. New deliberate-run harness: `__tests__/e2e/layout/fp-login.sh`. (#981) + ### Docs - Add public pages for the MCP server, the Slack app and product analytics, which the assistant and MCP server can now answer from (#982). diff --git a/__tests__/e2e/layout/README.md b/__tests__/e2e/layout/README.md index 360a7d180..0c95e1586 100644 --- a/__tests__/e2e/layout/README.md +++ b/__tests__/e2e/layout/README.md @@ -10,6 +10,7 @@ not depend on — so they are invoked deliberately. | `cloud-collector.sh` | an AgentEye stack | real connect against a live server, daemon + collector writing layout-2 paths, decisions reaching ClickHouse, disconnect back to OSS | | `systemd-service.sh` | Docker | REAL `systemctl enable --now` as root in a privileged container: service lifecycle, fail-closed, self-heal, reinstall | | `cli-login.sh` | an AgentEye stack (dashboard + mailpit + its Postgres), an older Cloud server without `/api/auth/cli/*` routes, Docker, `bun run build` + the release daemon | `config`'s browser login through a real pty in a systemd container: approve, re-login, deny + retry, abandon after approval (no key minted), esc, expiry, revoked saved key, older server, and the person-side refusals (Origin, form posts, no session, start rate limit) | +| `fp-login.sh` | an AgentEye stack (dashboard + mailpit + its containers), `uv sync` in `fp-cloud-cli`; optionally a Cloud with `config`'s login but not `fp`'s, and a dashboard with `DASHBOARD_TRUSTED_INGRESS=1` | `fp login`'s browser flow through a real pty: approve, the org picker, the email code with tab, tab to the email and back, deny + retry, expiry, esc and ctrl-c, an approval nobody collects (no session), a dropped connection, opening the browser, Clouds without it (nothing minted), the network warning and when the email goes out, the person-side refusals, and no secret in any log | `systemd-service.sh` exists because the service half cannot be tested on a developer machine without a password prompt, and a container gives real systemd @@ -38,6 +39,13 @@ bash __tests__/e2e/layout/systemd-service.sh DASH=http://localhost:3000 MAILPIT=http://localhost:8026 OLD_CLOUD=http://localhost:28080 PG_CONTAINER=agenteye-postgres-1 \ bash __tests__/e2e/layout/cli-login.sh +# fp-login.sh drives the real `fp` the same way. STACK is the compose project, which +# names the containers it reads. Add CLOUD_1090 and PG_1090 to cover a Cloud from +# before `fp`'s half of this, and TRUSTED_DASH for the different-network warning. It +# stops and restarts the dashboard container once. +DASH=http://127.0.0.1:3000 MAILPIT=http://127.0.0.1:8026 STACK=agenteye \ + bash __tests__/e2e/layout/fp-login.sh + # cloud-collector.sh expects the stack on the remapped ports (18080/18123) so it # can run alongside an existing project rather than displacing it: docker compose -p aefpai -f docker-compose.yml -f ports.yml up -d diff --git a/__tests__/e2e/layout/cli-login-driver.py b/__tests__/e2e/layout/cli-login-driver.py index 45a465918..e64f8c9f0 100755 --- a/__tests__/e2e/layout/cli-login-driver.py +++ b/__tests__/e2e/layout/cli-login-driver.py @@ -1,16 +1,18 @@ #!/usr/bin/env python3 -"""Drive `failproofai config` through a real pseudo-terminal, screen by screen. +"""Drive a login through a real pseudo-terminal, screen by screen. -Used by cli-login.sh, inside the systemd container, as the unprivileged user. -The wizard only offers browser login to a real terminal, so a pty is the only -honest way to test it end to end. +Used by cli-login.sh for `failproofai config` (inside the systemd container, as the +unprivileged user) and by fp-login.sh for `fp login`. Both only offer browser login +to a real terminal, so a pty is the only honest way to test it end to end. Usage: cli-login-driver.py