docs(openspec): fpagent-tools-ui change — proposal, specs, design, tasks
Synced main specs (tools-app, fingerprint-wizard); change archived at 2026-09-30-fpagent-tools-ui. Includes openspec project config and the agent skills installed with it.
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
# Proposal: fpagent-tools-ui
|
||||
|
||||
## Why
|
||||
|
||||
The python server (`app.py`) that served this project's enrollment UI is being
|
||||
replaced by the `fpagent` binary (see `fingerprint-agent`), which owns scanner
|
||||
capture on `127.0.0.1:9000` and enforces PocketBase + OpenFGA authorization per
|
||||
enroll. The UI must be re-modeled onto fpagent's enroll-only event vocabulary
|
||||
and YOUreka Auth, or this repo has no reason to exist alongside fpagent.
|
||||
|
||||
## What Changes
|
||||
|
||||
- **BREAKING**: Add a new Express app in `tools/` that replaces `app.py` as the
|
||||
UI host: a landing page linking two YOUreka tools — Image Cropper
|
||||
(`https://smart-pxa.yrka.app`) and Fingerprint Agent (`/fingerprint`).
|
||||
- New `/fingerprint` enrollment wizard (re-modeled from `public/capture/`) that
|
||||
captures via fpagent Socket.IO: `fprint-enroll {token, domain, finger,
|
||||
reference}` → `fprint-enroll-status` → `fprint-enroll-done`, with
|
||||
`fprint-enroll-stop` cancel and `agent-hello` version display.
|
||||
- Operator authentication via YOUreka Auth cookie session (portal
|
||||
`/api/web/auth` redirect flow; PocketBase session refresh server-side), same
|
||||
pattern as `one-school-chat`.
|
||||
- Domain selection: a hardcoded catalog (UNICAL `uc`, Metropolitan Hotel `mtr`,
|
||||
UCTH `ucth`, UNICAL Radio International `uri`, YOUreka `yrka`) filtered after
|
||||
login against the same public OpenFGA verify URL fpagent uses; only permitted
|
||||
domains are offered. Results are cached per operator for 5 minutes, with an
|
||||
explicit refresh control available once the cache elapses.
|
||||
- a2loft integration (staff lookup, fingerprint save) kept, but moved behind
|
||||
same-origin Express proxies; OTP input retained per a2loft call, validated by
|
||||
a2loft exactly as before (`?phone=&otp=`, phone injected server-side).
|
||||
- **BREAKING**: Remove the python server and its UI: `app.py`,
|
||||
`requirement.txt`, `public/` (after the new UI reaches parity).
|
||||
- clockio mode is not ported: fpagent is enroll-only by design.
|
||||
- All configuration is hardcoded in source: port `4173`, portal
|
||||
`https://portal.yrka.app`, PocketBase `https://pb.itcass.net`, a2loft
|
||||
`https://apis.a2loft.net`, agent `http://127.0.0.1:9000`.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `tools-app`: the Express tools host — landing page, YOUreka Auth cookie
|
||||
session, hardcoded configuration, same-origin a2loft proxies.
|
||||
- `fingerprint-wizard`: the `/fingerprint` enrollment wizard — domain
|
||||
permission filtering, fpagent capture wiring, OTP-validated lookup/save flow.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
(none — this repo has no existing specs)
|
||||
|
||||
## Impact
|
||||
|
||||
- New code: `tools/` (Express app, static pages, auth session module, domain
|
||||
permit module). New dependencies: `express`, `pocketbase`.
|
||||
- Removed code: `app.py`, `requirement.txt`, `public/capture/`,
|
||||
`public/clockio/`, `.config.json` handling.
|
||||
- Deployment: fpagent must run with `-allowed-origins` including the tools app
|
||||
origin (`http://localhost:4173` in dev); the wizard page calls fpagent
|
||||
cross-origin from the browser.
|
||||
- External systems: `portal.yrka.app` (web-auth + OpenFGA verify), `pb.itcass.net`
|
||||
(PocketBase session), `apis.a2loft.net` (staff lookup + fingerprint save, unchanged
|
||||
contract), fpagent on loopback.
|
||||
Reference in New Issue
Block a user