Skip to content

Add connection status and optional Latest Version column to deployments (DT-4174)#3618

Merged
rossnelson merged 18 commits into
mainfrom
dt-4174-connection-status
Jul 7, 2026
Merged

Add connection status and optional Latest Version column to deployments (DT-4174)#3618
rossnelson merged 18 commits into
mainfrom
dt-4174-connection-status

Conversation

@rossnelson

@rossnelson rossnelson commented Jun 30, 2026

Copy link
Copy Markdown
Collaborator

What

Implements DT-4174: surface compute-provider connection status on Worker Deployments, and add an optional Latest Version column to the deployments list.

CleanShot 2026-07-02 at 13 13 16

This PR now contains both halves of the ticket. The Latest Version column (second half) was developed in #3625 and merged into this branch.

Connection status (list + details)

  • Types: ProviderValidation / ComputeStatus + computeStatus? on VersionSummaryNew, matching the new compute_status.provider_validation API field.
  • deriveConnectionStatus derives pending / connected / failed from error_message + last_check_time (last_check_time checked first; empty and absent messages treated identically). Fully unit-tested.
  • formatConnectionCheckTime formats freshness through i18n as hours-only ("36 hours ago"), with "less than an hour ago" for sub-hour / future / invalid times.
  • ConnectionBadge: presentational dot + word chip with an informational tooltip. The API failure message is rendered directly (no client-side error-code mapping, per the backend decision). No click action.
  • List page: the Current Version cell is a composite of build ID + compute + connection, with a "No Current Version" empty state.
  • Details page: the Versions table gains a Connection column, shown for Current / Ramping / Draining versions and an em dash otherwise.

Latest Version column (list)

  • An opt-in, hidden-by-default column exposed via the table's configurable-columns control (the same gear + drawer used by the Workflows / Schedules / Activities tables).
  • Shows build ID + lifecycle badge + compute, with no connection indicator (connection stays on the Current Version cell). Shows "Same as Current" when the latest version equals the current one, and an em dash when there is no latest version.
  • Store: a new DEPLOYMENTS table type with namespace-scoped persistence.

Design polish

  • The build ID and compute badge sit together (removed the fixed min-width that left a large gap for short build IDs).
  • Removed the build ID copy buttons from the version cells (not shown in the design); the deployment name keeps its copy button.

All new UI is behind the serverScaledDeployments capability; the on-demand validate-connection flow is unchanged.

Why

The backend (temporalio/api#810, temporalio/temporal#10778, both merged) adds a periodic connectivity check for serverless worker deployments. This surfaces that signal in the UI so misconfiguration is visible before invocations fail. Per the DT-4174 decision log, the list defaults to the Current version, with Latest available as an optional column.

Testing

  • pnpm check: 0 errors
  • pnpm lint: clean
  • pnpm test --run: 2192 passed / 1 skipped (unit tests for the derivation + freshness utils and the deployments column store)

Notes

  • Freshness copy is hours-only; the "within 6h" cadence wording in the Pending tooltip should be confirmed against the backend's actual check interval.

Phase 1-2 of DT-4174 (connection status on Deployments/Versions).

- Add ProviderValidation/ComputeStatus types + computeStatus on VersionSummaryNew
- Add deriveConnectionStatus + formatConnectionCheckTime pure utils with tests
- Add ConnectionBadge component (dot + word + tooltip) and i18n keys

State is derived client-side from compute_status.provider_validation
(error_message + last_check_time): pending / connected / failed. The
failure message from the API is rendered directly (no client-side code map).

These phases are API-independent and degrade to Pending until the backend
(temporalio/api#810, temporalio/temporal#10778) lands. List/details wiring
and the configurable Latest Version column are follow-ups.
@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment Jul 7, 2026 4:01pm

Request Review

@temporal-cicd

temporal-cicd Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor
Warnings
⚠️

📊 Strict Mode: 4 errors in 3 files (0.4% of 893 total)

src/lib/stores/configurable-table-columns.ts (1)
  • L296:51: Property 'name' does not exist on type 'INamespaceInfo | null | undefined'.
src/lib/utilities/connection-status.ts (1)
  • L57:6: Argument of type 'ITimestamp | undefined' is not assignable to parameter of type 'ValidTime'.
src/lib/components/deployments/compute-badge.svelte (2)
  • L31:16: 'config' is possibly 'undefined'.
  • L32:8: 'config' is possibly 'undefined'.

Generated by 🚫 dangerJS against c53e222

…174)

Phase 3-4 of DT-4174.

List page: replace the Latest Version column with a composite Current
Version cell (build ID + compute + connection badge); show No Current
Version when there is no current version. Latest Version as an optional
column is a follow-up.

Details page: add a Connection column to the versions table, shown for
Current/Ramping/Draining versions and an em dash otherwise. All new UI is
behind the serverScaledDeployments capability; the validate-connection
flow is unchanged.
Self-managed (non-serverless) deployments have no compute provider, so a
connection indicator is meaningless for them. Gate the ConnectionBadge on
the compute provider being present: the list Current Version cell shows it
alongside the compute badge, and the versions table shows an em dash when
there is no compute config. Found via local testing against a self-managed
worker deployment.
…174)

- List Current Version cell renders the connection dot + word inside the
  compute pill (Lambda • Connected) instead of as a separate badge, per design
- ComputeBadge accepts children so the connection can be composed inside it
- Rename the versions-table lifecycle column header to Lifecycle
…lumn (DT-4174)

- Shrink the in-pill status dot (size-2 -> size-1.5) and shrink-0 so it stays
  small and vertically centered next to the label, matching the design
- Add showDot prop to ConnectionBadge (default off); the list pill opts in, the
  details Connection column renders the word only
Move the connection rendering into ComputeBadge via a computeStatus prop so
the icon, label, status dot, and status word are direct flex children of one
pill (Lambda • Connected), with the tooltip on the pill. ConnectionBadge is
now the word-only badge used by the details Connection column.
Showcases the composite pill across providers x Connected/Failed/Pending,
compute-only (self-managed), and the details word-only ConnectionBadge.
- Connection colors use design tokens (text-success/text-danger/text-subtle)
  instead of raw green/red; the in-pill dot uses bg-current so it matches
- Add Storybook play() render assertions for each connection scenario
  (Lambda/Cloud Run x Connected/Failed/Pending, compute-only), runnable via
  pnpm stories:test
The on-demand Validate Connection API is a dry-run and does not persist to
compute_status, so it does not update the connection badge. Remove the
implication that it does.
Both ComputeBadge (list pill) and ConnectionBadge (details column) duplicated
the state->color map, state->label, and tooltip-text logic. Move them to
connection-status.ts (connectionStateColor, connectionStateLabel,
connectionTooltip) so there is a single source of truth; the components are
now thin presentational shells.
{#snippet pill()}
<div
class="inline-flex min-w-24 items-center justify-center gap-2 border border-subtle px-1"
>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ 'config' is possibly 'undefined'.

<div
class="inline-flex min-w-24 items-center justify-center gap-2 border border-subtle px-1"
>
<Icon name={config.icon} />

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ 'config' is possibly 'undefined'.

connection-tooltip-connected and connection-tooltip-failed-checked were the
same string ('Checked {{ time }}'). Replace both with a single state-neutral
connection-tooltip-checked key used by connectionTooltip for the connected
and failed states.
formatConnectionCheckTime previously returned hardcoded English (date-fns
output + a literal 'less than an hour ago'). Replace with translate keys
(connection-checked-recently/-hour/-hours) and a manual hour calc, dropping
the date-fns dependency from this helper. Output is unchanged for the
existing states.
return translate('deployments.connection-tooltip-pending');
}
const checked = translate('deployments.connection-tooltip-checked', {
time: formatConnectionCheckTime(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • ⚠️ Argument of type 'ITimestamp | undefined' is not assignable to parameter of type 'ValidTime'.

@rossnelson rossnelson marked this pull request as ready for review July 2, 2026 14:21
@rossnelson rossnelson requested a review from a team as a code owner July 2, 2026 14:21
* Add Latest Version optional column to Deployments list (DT-4174)

The second half of DT-4174. Latest Version is an opt-in, hidden-by-default
column on the Worker Deployments list, toggled via the table's
configurable-columns drawer (the same control Workflows/Schedules/Activities
use).

- Extend the configurable-table-columns store with a DEPLOYMENTS table type:
  DEFAULT_DEPLOYMENTS_COLUMNS (Deployment, Current Version, Created At) with
  Latest Version as an available/hidden column, a namespace-scoped
  persistStore, and availableDeploymentColumns.
- Source the deployments list columns from the store, translate labels for
  the header, and add the footer gear + reused drawer.
- The Latest Version cell renders build ID, lifecycle status, and compute
  provider, with no connection indicator (connection stays on Current
  Version). Shows 'Same as Current' when the latest version equals the
  current one, and an em dash when there is no latest version.
- Gate the drawer's custom search attributes section off for deployments so
  it does not show an irrelevant empty section (workflows/schedules/
  activities are unaffected).

* Tighten deployment list version cells (DT-4174)

Match the design for the Current and Latest Version cells on the deployments
list:

- Remove the min-w-32 on the build-ID container so the compute badge sits
  next to the build ID instead of leaving a large gap for short IDs.
- Drop the copy button from the build-ID cells (not shown in the design); the
  deployment name keeps its copy button.
Resolve configurable-table-columns.ts conflict by keeping both the new
DEPLOYMENTS table type (this branch) and the NEXUS_OPERATIONS table type
(main): both table types coexist across TABLE_TYPE, defaults, persisted
stores, the derived columns map, available-column helpers, and the
default/persisted switch statements.
@rossnelson rossnelson changed the title Add connection status foundation for deployments (DT-4174) Add connection status and optional Latest Version column to deployments (DT-4174) Jul 2, 2026
Drop the compute-badge story to check whether it is the source of the
Chromatic UI Tests failure.
Comment thread src/lib/utilities/connection-status.ts
Comment thread src/lib/utilities/connection-status.ts Outdated
Comment thread src/lib/i18n/locales/en/deployments.ts Outdated
Comment thread src/lib/stores/configurable-table-columns.ts Outdated
- formatConnectionCheckTime: guard against NaN diff (invalid dates) and use
  Math.floor so elapsed hours are not overstated. Add an invalid-date test.
- Remove the now-unused 'build-status' i18n key (replaced by 'lifecycle').
- Configurable-columns MOVE reducer: fall back to the table-aware
  defaultColumns instead of hardcoded DEFAULT_WORKFLOWS_COLUMNS.
@rossnelson rossnelson merged commit bbbf2b8 into main Jul 7, 2026
17 checks passed
@rossnelson rossnelson deleted the dt-4174-connection-status branch July 7, 2026 16:42
temporal-cicd Bot pushed a commit that referenced this pull request Jul 8, 2026
Auto-generated version bump from 2.51.1 to 2.52.0

Bump type: minor

Changes included:
- [`9c6fcd54`](9c6fcd5) Add direct SSO redirect and backend logout (#3590)
- [`feab0d90`](feab0d9) a11y(4.1.3): Toaster role="log" → per-toast role="status"/"alert" for correct AT announcement semantics (#3560)
- [`d7bbfb01`](d7bbfb0) a11y(2.5.8): toast — replace bare close button with IconButton (36×36 px) (#3553)
- [`4efd6ab6`](4efd6ab) a11y(3.3.1): Holocene input primitives — add aria-invalid, aria-describedby, and uniform live-region error announcement (#3554)
- [`0600b700`](0600b70) Use green only (#3599)
- [`94107549`](9410754) Clarify activity pause timeout behavior (#3600)
- [`9f88d5a8`](9f88d5a) Bump node version to 22.23.1 or newer to fix issue from previous security release (#3604)
- [`ca4104ae`](ca4104a) Update reason copy and inputs (#3588)
- [`51db73fa`](51db73f) Update batch operation reason input hint (#3605)
- [`836d7c55`](836d7c5) a11y(2.4.3): route navigation — move focus to the main landmark on afterNavigate, not just scroll (#3538)
- [`4ee95696`](4ee9569) Improve re-renders for large encoded event histories (#3592)
- [`fa5e7aa1`](fa5e7aa) feature/schedules (#3603)
- [`0d9467fd`](0d9467f) Default includeHeartbeatDetails and includeLastFailure to true for getActivityExecution and pollActivityExecution (#3521)
- [`e5bc514e`](e5bc514) fix schedules: duplicate key (#3612)
- [`f1eb489f`](f1eb489) Remove preview badge (#3581)
- [`1e5173b4`](1e5173b) Add existing versions to worker create deployment version form (#3601)
- [`a8552bae`](a8552ba) fix schedules -e.trim not a function (#3613)
- [`0442f847`](0442f84) Fix width of ComputeBadge in VersionTableRow (#3615)
- [`ddbeb54f`](ddbeb54) fix(cloud-nav): animate and stabilize side-nav collapse (#3606)
- [`3cfc684b`](3cfc684) fix - schedules recent/upcoming runs - sort issue (#3616)
- [`92b8875b`](92b8875) Move timestamp out of translate (#3617)
- [`901258af`](901258a) Fix SAA and WF consistency (#3614)
- [`99593d97`](99593d9) DT-4001 - standalone nexus operations (#3496)
- [`f10d1bf1`](f10d1bf) Clamp codeblock to container width (#3621)
- [`0a9d93ce`](0a9d93c) Remove unnecessary bottom-0 (#3623)
- [`9dabb522`](9dabb52) chore(deps-dev): bump vite from 6.4.2 to 6.4.3 (#3610)
- [`5c1854d3`](5c1854d) News Feed (#3596)
- [`340da30f`](340da30) a11y(2.1.1): guard global r/R keydown so text inputs can receive the letter (#3589)
- [`dd97a9d1`](dd97a9d) fix(markdown-editor): disable chromatic snapshot for preview story (#3631)
- [`7db61ab9`](7db61ab) a11y(4.1.2): Table / ProgressBar / Loading primitives — expose aria-busy on data-refresh regions (#3555)
- [`d2111ecf`](d2111ec) a11y(4.1.3): Add live-region wrappers for workflow status, event count, filter counts, and Banner (#3561)
- [`24eabaec`](24eabae) a11y(2.4.6): guard DrawerContent against empty <h2> when title is omitted (#3595)
- [`3552e307`](3552e30) Fix CodeMirror Lezer dependency mismatch (#3632)
- [`7ac37199`](7ac3719) Update defaults to match workflow defaults (#3634)
- [`c1f02865`](c1f0286) Draft fix for link variant handling (#3620)
- [`bbbf2b8c`](bbbf2b8) Add connection status and optional Latest Version column to deployments (DT-4174) (#3618)
- [`76f266f4`](76f266f) DurationInput updates (#3633)
- [`07da53c5`](07da53c) COM-191 - prefill CloudFormation template params in Launch Stack link (#3619)
- [`90946e0b`](90946e0) Schedules - Timeout empty defaults (#3637)
- [`97f9ad39`](97f9ad3) fix(cloud-nav): smooth label fade on side-nav collapse/expand (#3628)
- [`a399ed35`](a399ed3) Improve Search Attribute deletion messaging (#3629)
- [`ad976d94`](ad976d9) Pass through source prop for News Feed Widget (#3638)
- [`6ef84fe3`](6ef84fe) Restrict select-all to exclude workflow status (#3639)
- [`4c3729f8`](4c3729f) Reduce news feed markdown whitespace (#3642)
- [`aa04a9b6`](aa04a9b) feat(nexus-operations): add loading state to standalone nexus operations list page header (#3643)
- [`dce2f804`](dce2f80) chore: remove unused generate-holocene-props script (#3644)
- [`760bc7bc`](760bc7b) Make megaphone icon bigger (#3645)
- [`c047384a`](c047384) refactor(nexus): replace hand-rolled types with @temporalio/proto (#3646)
rossedfort added a commit that referenced this pull request Jul 8, 2026
Auto-generated version bump from 2.51.1 to 2.52.0

Bump type: minor

Changes included:
- [`9c6fcd54`](9c6fcd5) Add direct SSO redirect and backend logout (#3590)
- [`feab0d90`](feab0d9) a11y(4.1.3): Toaster role="log" → per-toast role="status"/"alert" for correct AT announcement semantics (#3560)
- [`d7bbfb01`](d7bbfb0) a11y(2.5.8): toast — replace bare close button with IconButton (36×36 px) (#3553)
- [`4efd6ab6`](4efd6ab) a11y(3.3.1): Holocene input primitives — add aria-invalid, aria-describedby, and uniform live-region error announcement (#3554)
- [`0600b700`](0600b70) Use green only (#3599)
- [`94107549`](9410754) Clarify activity pause timeout behavior (#3600)
- [`9f88d5a8`](9f88d5a) Bump node version to 22.23.1 or newer to fix issue from previous security release (#3604)
- [`ca4104ae`](ca4104a) Update reason copy and inputs (#3588)
- [`51db73fa`](51db73f) Update batch operation reason input hint (#3605)
- [`836d7c55`](836d7c5) a11y(2.4.3): route navigation — move focus to the main landmark on afterNavigate, not just scroll (#3538)
- [`4ee95696`](4ee9569) Improve re-renders for large encoded event histories (#3592)
- [`fa5e7aa1`](fa5e7aa) feature/schedules (#3603)
- [`0d9467fd`](0d9467f) Default includeHeartbeatDetails and includeLastFailure to true for getActivityExecution and pollActivityExecution (#3521)
- [`e5bc514e`](e5bc514) fix schedules: duplicate key (#3612)
- [`f1eb489f`](f1eb489) Remove preview badge (#3581)
- [`1e5173b4`](1e5173b) Add existing versions to worker create deployment version form (#3601)
- [`a8552bae`](a8552ba) fix schedules -e.trim not a function (#3613)
- [`0442f847`](0442f84) Fix width of ComputeBadge in VersionTableRow (#3615)
- [`ddbeb54f`](ddbeb54) fix(cloud-nav): animate and stabilize side-nav collapse (#3606)
- [`3cfc684b`](3cfc684) fix - schedules recent/upcoming runs - sort issue (#3616)
- [`92b8875b`](92b8875) Move timestamp out of translate (#3617)
- [`901258af`](901258a) Fix SAA and WF consistency (#3614)
- [`99593d97`](99593d9) DT-4001 - standalone nexus operations (#3496)
- [`f10d1bf1`](f10d1bf) Clamp codeblock to container width (#3621)
- [`0a9d93ce`](0a9d93c) Remove unnecessary bottom-0 (#3623)
- [`9dabb522`](9dabb52) chore(deps-dev): bump vite from 6.4.2 to 6.4.3 (#3610)
- [`5c1854d3`](5c1854d) News Feed (#3596)
- [`340da30f`](340da30) a11y(2.1.1): guard global r/R keydown so text inputs can receive the letter (#3589)
- [`dd97a9d1`](dd97a9d) fix(markdown-editor): disable chromatic snapshot for preview story (#3631)
- [`7db61ab9`](7db61ab) a11y(4.1.2): Table / ProgressBar / Loading primitives — expose aria-busy on data-refresh regions (#3555)
- [`d2111ecf`](d2111ec) a11y(4.1.3): Add live-region wrappers for workflow status, event count, filter counts, and Banner (#3561)
- [`24eabaec`](24eabae) a11y(2.4.6): guard DrawerContent against empty <h2> when title is omitted (#3595)
- [`3552e307`](3552e30) Fix CodeMirror Lezer dependency mismatch (#3632)
- [`7ac37199`](7ac3719) Update defaults to match workflow defaults (#3634)
- [`c1f02865`](c1f0286) Draft fix for link variant handling (#3620)
- [`bbbf2b8c`](bbbf2b8) Add connection status and optional Latest Version column to deployments (DT-4174) (#3618)
- [`76f266f4`](76f266f) DurationInput updates (#3633)
- [`07da53c5`](07da53c) COM-191 - prefill CloudFormation template params in Launch Stack link (#3619)
- [`90946e0b`](90946e0) Schedules - Timeout empty defaults (#3637)
- [`97f9ad39`](97f9ad3) fix(cloud-nav): smooth label fade on side-nav collapse/expand (#3628)
- [`a399ed35`](a399ed3) Improve Search Attribute deletion messaging (#3629)
- [`ad976d94`](ad976d9) Pass through source prop for News Feed Widget (#3638)
- [`6ef84fe3`](6ef84fe) Restrict select-all to exclude workflow status (#3639)
- [`4c3729f8`](4c3729f) Reduce news feed markdown whitespace (#3642)
- [`aa04a9b6`](aa04a9b) feat(nexus-operations): add loading state to standalone nexus operations list page header (#3643)
- [`dce2f804`](dce2f80) chore: remove unused generate-holocene-props script (#3644)
- [`760bc7bc`](760bc7b) Make megaphone icon bigger (#3645)
- [`c047384a`](c047384) refactor(nexus): replace hand-rolled types with @temporalio/proto (#3646)

Co-authored-by: rossedfort <11775628+rossedfort@users.noreply.github.com>
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.

2 participants