Don't auto-default initialRouteEntries from mountPath — for
parameterized paths this silently produces wrong params (literal
':name' values). Require callers to set both explicitly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Remove the package.json range bump and changeset — the range already
covers the new version, so only the lockfile needs updating.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Renovate deprecated matchPackagePatterns. The new matchPackageNames
accepts regex patterns wrapped in / delimiters. All other changes
in this PR (quote style, comment removal) were cosmetic and have
been reverted.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
The proxy-based sign-in page derived the session expiry from the JWT by
decoding its payload with `window.atob`, which only accepts the standard
base64 alphabet. JWTs are encoded using base64url (RFC 7515), so any
token whose payload contained '-' or '_' raised a decoding error and
broke sign-in. Translate the payload back to the standard alphabet and
restore its padding before decoding.
Signed-off-by: Asish Kumar <officialasishkumar@gmail.com>
The built-in rate limiter derived its key directly from `req.ip`, which
express-rate-limit 8.x rejects with an ERR_ERL_KEY_GEN_IPV6 validation
error. A raw IPv6 address used as a rate limiting key would let a client
bypass the limit by rotating through addresses in its allotted block, so
the library now requires its `ipKeyGenerator` helper to normalize the
address. Wrap the resolved client address in that helper so the limiter
starts cleanly and groups IPv6 clients by their address block.
Signed-off-by: Asish Kumar <officialasishkumar@gmail.com>
* refactor(kubernetes-backend): boy-scout KubernetesFetcher
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Matthew Clarke <mclarke@spotify.com>
* fix(kubernetes-backend): restore dynamic imports for @kubernetes/client-node
The package is ESM-only and must be loaded via dynamic import() to work
in Jest's CommonJS transform. Reverts to the original inline
await import() pattern while keeping the agent pooling and refactoring.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Matthew Clarke <mclarke@spotify.com>
---------
Signed-off-by: Matthew Clarke <mclarke@spotify.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
markForStitching now only updates the ticket on conflict, leaving
next_stitch_at unchanged so an in-progress worker isn't interrupted.
markDeferredStitchCompleted bumps next_stitch_at to now() when the
ticket changed, so pending re-stitches happen immediately after the
current stitch finishes rather than waiting for the timeout.
performStitching no longer calls markDeferredStitchCompleted when
abandoned due to a stale ticket, since the queue entry belongs to
another worker.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Remove extra blank lines left behind when the stitcher field was
removed from engine test constructors. Extract getStitchTicket helper
to assert the queue entry exists instead of using optional chaining
that could silently pass undefined.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Now that immediate mode is removed, the stitch ticket is always
provided by the deferred worker. Remove the optional marker and all
the conditional guards that checked for its presence.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Track whether the table has ever received data. A filter change that
empties the client-side entity list (e.g. filtering by an owner with
no matches) should not trigger the full-table loading spinner — the
table should show "No records" or stale rows with the title spinner,
not flash a large spinner.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Show the previous count alongside the spinner during loading. Only
hide the count when new rows have arrived but the count hasn't
caught up yet (would be wrong for the new data). This makes the
only immediate visual change after a filter switch the spinner
appearing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Use the filter's label (which has proper casing like "AiResources")
when it matches the displayed entities. Fall back to the entity's
kind field directly instead of lowercasing and re-capitalizing,
which mangled camelCase kinds like AiResource into Airesource.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
The column set (System, Owner, Type, etc.) now stays consistent with
the displayed rows during kind filter transitions, same as the name
column's defaultKind. The switch statement uses the entity-derived
kind so columns don't jump until new data actually arrives.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
Derive the title's kind label from the displayed entities instead
of the filter state. Only show the count when both the list and
count have settled (not loading), so stale counts from a previous
filter don't appear alongside new data. The spinner shows whenever
anything is still loading (list OR count).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
When stale rows are kept visible during a kind filter change, the
name column's defaultKind should match the entities being displayed,
not the pending filter. Otherwise entity names flash with a kind
prefix (e.g. "api:foo") until new data arrives. The column layout
switch still uses the filter's kind so the table shape updates
immediately.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>