inspector/specification
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cliffhall 04dbc36544 feat(auth): give the secrets file a real cross-process lock (#2082)
#1950 shipped FileSecretStore without cross-process mutual exclusion, by
decision: an earlier revision hand-rolled a `mkdir` election with an owner
stamp, a heartbeat and a stale-takeover, and three consecutive review rounds
found a real race in it. The last one is not closable with what Node exposes
— claiming a stale lock atomically needs compare-and-swap on a directory
entry (`renameat2(RENAME_EXCHANGE)`) — so it was replaced with optimistic
verify-and-retry and the residual documented.

#2082 settles that as "borrow, don't hand-roll". `proper-lockfile` is what
npm itself locks with, and stale-takeover is precisely the problem it has
already solved: it re-stats the lock directory after claiming it and gives
the lock up when the mtime is not the one it wrote, so the loser of a
takeover race releases instead of proceeding.

- core/auth/node/file-lock.ts: `withSecretFileLock`. `realpath: false` so a
  file can be locked into existence (the very first `set` has no
  `secrets.json`, and the library's default resolves through `fs.realpath`);
  a warning in place of the library's `onCompromised`, which throws from a
  timer and would take the session down; and a degrade-with-one-warning path
  rather than a throw when no lock can be taken — this store exists for boxes
  missing the usual mechanism (#1848, #1905) and must not gain a new way to
  be unavailable.
- FileSecretStore.mutate holds it across the whole read-modify-write. The
  optimistic verify stays underneath and is not redundant: a lock is advisory
  between the processes that take it, so the verify covers a writer outside
  this codebase and covers the degrade path. The in-process queue stays too,
  and gains a second job — proper-lockfile is not reentrant, so serializing
  per path keeps ELOCKED meaning "another process".
- absorbFileSecretsIntoKeyring takes the same lock around orphan adoption and
  the atomic claim, behind a lock-free `readdir` fast path so the common
  startup (keychain available, no file ever written) neither creates a lock
  directory nor warns about one it could not create.

proper-lockfile is a root `dependency` per the placement rule, and is named
in all three bundler `external` lists: tsup externalizes what the *client's*
manifest declares, so a root-only CJS package was being inlined into the ESM
bundles, leaving esbuild's `Dynamic require of "path" is not supported` shim
that killed `--cli` at import time. That rule was undocumented; it is now in
AGENTS.md beside the placement rule that creates it, and mirrored into
.github/copilot-instructions.md.

Tests: 7 new in file-lock.test.ts driving a real second process (the existing
suite structurally cannot — `serialize` orders in-process callers before the
lock sees them), plus two for the migration fast path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JTHVxSu8AUgHRLvo1ntZ8H
Signed-off-by: cliffhall <cliff@futurescale.com>
2026-08-23 09:32:41 -04:00
..
diagrams refactor(version): single-source the version from the root package.json 2026-07-10 17:31:21 -04:00
screenshots docs(apps): specify the v2 Apps tab (#1265) 2026-04-29 17:22:59 -04:00
README.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v1_problems.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_auth.md Auth hardening CI gaps + SDK consolidation: EMA leg 2 / scopes (#1527) (#1725) 2026-07-19 22:36:21 -04:00
v2_auth_ema.md feat: surface and decode the OAuth id_token in Connection Info (#2019) 2026-08-15 18:33:41 -04:00
v2_auth_hardening.md chore: upgrade the MCP TypeScript SDK from 2.0.0-beta.5 to 2.0.0 2026-08-12 08:34:08 -04:00
v2_auth_mid_session.md refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
v2_auth_sdk_consolidation.md chore: upgrade the MCP TypeScript SDK from 2.0.0-beta.5 to 2.0.0 2026-08-12 08:34:08 -04:00
v2_auth_smoke_testing.md Auth hardening CI gaps + SDK consolidation: EMA leg 2 / scopes (#1527) (#1725) 2026-07-19 22:36:21 -04:00
v2_catalog_launch_config.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_cli_tui_launcher.md Merge remote-tracking branch 'origin/v2/main' into 1579-wave-1 2026-07-09 09:41:08 -04:00
v2_new_spec_impact.md Auth hardening CI gaps + SDK consolidation: EMA leg 2 / scopes (#1527) (#1725) 2026-07-19 22:36:21 -04:00
v2_scope.md Removed Zustand storage, cleanup up auth storage IO interfaces, implementations, and usage. 2026-07-04 21:56:45 -07:00
v2_screenshots.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_server.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_servers_file.md feat(auth): give the secrets file a real cross-process lock (#2082) 2026-08-23 09:32:41 -04:00
v2_storage.md docs(spec): describe tool selection by row key, not name 2026-08-17 00:23:26 -04:00
v2_ux.md feat: surface and decode the OAuth id_token in Connection Info (#2019) 2026-08-15 18:33:41 -04:00
v2_ux_components.md Removed Zustand storage, cleanup up auth storage IO interfaces, implementations, and usage. 2026-07-04 21:56:45 -07:00
v2_ux_features.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_ux_handlers.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_ux_interfaces.md docs(spec): describe tool selection by row key, not name 2026-08-17 00:23:26 -04:00
v2_ux_interfaces_phase_0_4_inventory.md refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
v2_ux_interfaces_plan.md chore: close a batch of quality-gate & tidy gaps (#1785 #1787 #1789 #1790 #1767) (#1792) 2026-07-26 10:43:11 -04:00
v2_ux_storybook.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00
v2_web_client.md docs(spec): add V2 Auth landing page and canonicalize spec top menus (closes #1605) 2026-07-02 17:20:06 -04:00

Inspector V2 Brief

Brief | V1 Problems | V2 Scope | V2 Tech Stack | V2 UX | V2 Auth | V2 New Spec Impact

Table of Contents

Motivation and Context

The existing Inspector is hard to maintain for a number of reasons. We decided to create a more maintainable Inspector from the ground up, that retains the deterministic boundary of operation, but exposes a plugin architecture.

Track Protocol Conformance

  • Identify any gaps in V1 inspector
  • Track which features are covered
  • Implement to parity and fill gaps
  • Provide conformance testing in CI

Improve Maintainability

  • Clearer separation of concerns
  • Smaller, reusable components

Provide Extensibility

  • Plugin SDK / API
  • Third parties cand develop/maintain their own plugins for features such as
    • LLM usage
    • Evals
    • Multiple server connections
    • Apps playground
    • Testing of registry configuration
    • Interface with registry

Proper Documentation

  • One big README won't cut it anymore
  • Published documentation in MDX should
    • Render in style of spec
    • Kept up to date
    • Cover all features
    • Discuss troubleshooting strategies
    • Provide detailed contribution guidance that explains architecture and expected idioms