import type { ToolDefinition } from "./types.js"; /** * `GET /api/v1/repositories/:repository_id/agent_keys/presented_revoked` as a * tool — shipped in the platform (`specguard/config/routes.rb`, * `Api::V1::UserRepositoryAgentKeysController#presented_revoked`, SPGD-1023, * `533e77b`). * * == The verify half of the offboarding arc * * The listing and the revoke answer "what is live" and "cut this one"; neither * can answer the question a revoker is left holding — "is the dead token still * arriving?" — because both read LIVE rows only. The stamp this triage serves, * `last_refused_at`, is written by the 401 failure path on RETAINED revoked * rows, so it cannot ride a live row at all. This read is the bridge's only * window onto it, behind the same `keys_manage` gate the other two actions * answer to. * * == Two honesty clauses the description carries verbatim * * `last_refused_at` is the LAST observed presentation — a recency, never a * present-tense claim that a client is presenting the token now. And an empty * `{"agent_keys": []}` is an ANSWER — "no revoked key is still being * presented" — not an absence of tracking; the endpoint serves the negative * deliberately so the two are distinguishable. A tool that summarised an * empty answer into a count of its own would erase exactly that distinction, * which is why this one passes the body through. * * == Rows, pass-through * * One row per still-presented revoked key covering this repository: `id`, * `name`, `owner`, `token_hint`, `repository_count` (the STORED set's size — * the same blast-radius figure the revoke response discloses), `revoked_at` * and `last_refused_at`. `token_hint` is what the remedy hunts for in the * secret store — update whichever of them still holds the dead token — and it * is never the token: the plaintext existed for exactly one response at mint * time and nothing persisted it. */ declare const listRepositoryAgentKeysPresentedRevoked: ToolDefinition; export default listRepositoryAgentKeysPresentedRevoked;