Skip to content

feat(web): ship updated web-next UI - #15

Merged
nextroad-dev merged 17 commits into
mainfrom
dev
Oct 1, 2026
Merged

nextroad-dev merged 17 commits into
mainfrom
dev

Conversation

@nextroad-dev

Copy link
Copy Markdown
Owner

Summary

  • Ship the current web-next UI refresh and shared UI components from commit c720265.
  • Remove the obsolete tracked .zcode plan requested for cleanup.
  • Add agents.md release guidance for dev PRs, CI, GHCR image tags, manual deployment, verification, and credential safety.

Validation

  • GitHub PR CI and the dev image build are pending.
  • Deployment smoke tests on 10.7.89.132 are pending.

Deployment plan

  • Build and publish dev images via workflow_dispatch on ref dev.
  • Deploy the immutable sha- tag using deploy/compose.images.yaml.
  • Merge only after CI and deployed smoke tests pass.

nextroad-dev and others added 17 commits September 26, 2026 15:20
…rol, Select, Spinner, Stepper, Tabs, and utility for class name merging

- Implemented Progress component for displaying progress bars with customizable properties.
- Created Radio and RadioGroup components for managing radio button selections.
- Developed SegmentedControl for selecting between multiple options with a visual indicator.
- Added Select component for dropdown selections with customizable styles.
- Introduced Spinner component for loading indicators.
- Built Stepper component for multi-step navigation with clickable steps.
- Implemented Tabs component for tabbed navigation with lazy loading and automatic/manual activation options.
- Added utility function for merging Tailwind CSS class names with conflict resolution.
The unquoted src/**/*.test.ts glob was expanded by the shell without
globstar, so only one directory level matched: apps/api silently skipped
72 tests (plugins, credentials, setup, ...), and worker and database
skipped theirs too. Quoting hands the pattern to node --test, which
expands it recursively.
…nner

src/migrate.ts used to re-execute the whole 1143-line schema blob on
every deploy while the split migrations/ files and their runner sat
unused. It now only calls runMigrations, so every compose file keeps
its command: a blob-built database is classified as legacy and replayed
once (all statements are idempotent), after which only new files run,
each in its own transaction and recorded in schema_migrations.
Supports --dry-run.

Tests that grepped the old blob now read the migration files.
- manifest.credential (providerId, schemaId, secret format, base URL
  policy fixed/allowlisted/any-https) states what credential a plugin
  consumes; the four built-ins declare it, manifests without it get a
  conservative derived one, and the upload validator accepts it (never
  any-https for uploads).
- One host allowlist grammar (hostMatchesAllowlist) shared by
  SafeHttpClient, Seedance and every save-time check, so nothing is
  accepted on save that the runtime refuses.
- openai-language@1.0.0 and anthropic-language@1.0.0 register the native
  protocols under the ids migration 0012 backfilled onto language rows;
  dispatch keeps the native path, so request bytes are unchanged. The
  worker's availability gate treats both kinds of built-in keys alike.
- stored-credential helpers are the single place a provider_credentials
  row becomes a secret (payload first, legacy column fallback, key id).
- Veo requires both client_email and private_key in validateConfig.
Migration 0027 copies any secret still held only in api_key_encrypted
into payload_encrypted, fills provider_id (Seedream's Ark account under
'volcengine') and schema_id and makes both NOT NULL, and leaves
configured_fields with display metadata only. Nothing is dropped; the
legacy columns retire once no deployed code reads them.

scripts/reencrypt-provider-credentials.ts re-seals rows still under the
pre-rollout PROVIDER_CREDENTIALS_ENCRYPTION_KEY with the current derived
key: per-row transaction with compare-and-set, idempotent, --dry-run,
audited, logs ids and stable codes only.

Migration tests no longer assume the baseline is the last file, and the
fake client only fails on the fixture's own injected RAISE.
…in the worker

A credential is now a provider account (provider_id + schema + payload),
validated against plugins' declared contracts and never bound to a plugin
version: one Ark key serves Seedream and Seedance, and upgrading a plugin
no longer strands its credentials.

API
- The 760-line provider-credentials.ts becomes credentials/{input,
  validate,service,connectivity,reads}. Legacy request spellings (adapter,
  apiKey, credential) still parse; writes go to payload_encrypted only.
- Model binding uses one rule for the plugin and preset save paths:
  same provider account, decodable schema, endpoint inside the plugin's
  policy (the preset path previously skipped the credential host check).
- Clearing a credential's base URL works; decrypt failures report
  INVALID_CREDENTIAL instead of NO_API_KEY.
- Provider templates are generated from manifests for built-in and
  uploaded plugins alike; uploads may not claim a built-in provider id.
- Every secret read (create-job, worker jobs and preprocessing, DTOs)
  goes through the stored-credential helpers.

Connectivity tests
- Migration 0028 adds a test request on the credential row. The API opens
  it and waits up to ~20s; apps/worker claims open requests every 2s with
  FOR UPDATE SKIP LOCKED, probes through the availability gate and
  settles exactly the request it claimed, auditing the requester. Slow
  probes answer 202 pending and the row turns final on its own.
- Uploaded plugins can now be tested, credentials created without a
  template are probed by any plugin of their account, and language model
  tests record their outcome on the row.

Web
- The credential dialog renders from the template's secret format and
  sends providerId + secret; pickers match by provider account and the
  template's endpoint policy; a pending status polls until settled.
…-accounts

refactor: provider-account credentials, plugin-declared credential contracts, worker-side probes
@nextroad-dev
nextroad-dev merged commit c6616dd into main Oct 1, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant