Skip to content

Initial implementation of event history - #35

Merged
stevekinney merged 1 commit into
mainfrom
initial-event-history
Jul 30, 2021
Merged

Initial implementation of event history#35
stevekinney merged 1 commit into
mainfrom
initial-event-history

Conversation

@stevekinney

Copy link
Copy Markdown
Contributor

What was changed

It needs some polish, but it validates the stuff we put in this week as a workable model. This change adds a draft version of the event history to the page.

@stevekinney
stevekinney merged commit d2d4ad3 into main Jul 30, 2021
@stevekinney
stevekinney deleted the initial-event-history branch July 30, 2021 20:32
Alex-Tideman added a commit that referenced this pull request Apr 2, 2026
Implement Tier 1 detections from existing data (#9, #11, #13, #15, #19,
#23, #35) and Tier 2 detections from event history scanning (#8, #12,
#26, #27, #28, #29, #30). Adds detectEventHistoryErrors with single-pass
scanning and updates getApplicableCommonErrors to accept optional event
history. All 35 error definitions now have active detection logic.
Alex-Tideman added a commit that referenced this pull request Apr 28, 2026
* Add common-error component with 35 workflow configuration warnings (#3262)

Create a reusable common-error component system for displaying operational
guidance about workflow misconfigurations. Includes typed data for 35 known
issues with severity levels, documentation links, and a /common-errors route.

* Integrate common-error detection into workflow detail header

Add automatic detection of 21 workflow configuration issues and display
them as warnings in the workflow header. Detection covers timeout
misconfigurations, retry policy issues, heartbeat settings, and more.
Also fixes raw code references in error titles.

* Fix detection accuracy for common errors

- Raise #31 threshold from 4000 to 10000 to match "significant additional events"
- Add null guards to all getCommonErrorById calls via addError helper
- Detect #3 (short timeout) from workflowRunTimeout on first event, not just execution timeout
- Fix #10 false positives for empty retry policy objects
- Handle protobuf nanos field in durationToSeconds for sub-second durations

* Add detection logic for 14 remaining common errors (#8-#35)

Implement Tier 1 detections from existing data (#9, #11, #13, #15, #19,
#23, #35) and Tier 2 detections from event history scanning (#8, #12,
#26, #27, #28, #29, #30). Adds detectEventHistoryErrors with single-pass
scanning and updates getApplicableCommonErrors to accept optional event
history. All 35 error definitions now have active detection logic.

* Add snippet to pass in headerSnippet for common errors. Refactor workflow-run-layout to svelte5

* Add back common errors page

* Remove common errors from snippet

* Revert alert to current styles

* Fix test failures for detectFirstEventErrors and routeForCommonErrors

Update detectFirstEventErrors test calls to match updated function
signature that removed the workflow parameter. Add missing
routeForCommonErrors test case to route-for-base-path tests.

* Replace VerticalNav with tab group on common errors page

Switch from VerticalNav sidebar to TabButtons for severity filtering.
Remove layout reset (@) since the page no longer needs a custom layout.
Add WorkflowCommonErrors snippet to workflow run layout.

* Remove common errors from header snippet

* Fix type errors in alert component and stories

Rename $$Props to Props in alert.svelte for Svelte 5 convention.
Update stories to use module script and ComponentProps for proper
type inference with Storybook.

* Update src/lib/components/common-errors/common-error.svelte

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Update src/lib/components/common-errors/common-errors-data.ts

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Update src/lib/utilities/common-error-detection.ts

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Remove workflow-common-errors.svelte

* Remove getCommonErrorsByCategory

* Update src/lib/components/common-errors/common-error-list.svelte

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Fix naming

* Add back workflow-common-errors.svelte
;5u

* Formatting

* Add type predicate filter

---------

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>
bbtgnn pushed a commit to ForkbombEu/temporal-ui that referenced this pull request Jul 27, 2026
* Add missing Nexus Operation events to event groups (#3309)

* feat: add onItemsChange callback to PaginatedTable (#3300)

Adds an optional onItemsChange callback prop that fires whenever
the visible items change (page navigation, fetch, page size change).
Enables consumers to react to table data changes without relying
on slot prop workarounds.

* Update pre-release badge to secondary in Workers (#3310)

* Update to secondary

* Fix case

* Keep Pending Activities/Operations at the top of Timeline and Compact view (#3307)

* Keep pending activities at the top of Timeline and Compact view

* Simplier pending check

* Use merge, better sorted logic, fix index find

* Update error link in codec-server-error-banner (#3313)

* Add class prop to BottomNav component (#3314)

* Add overrides (#3317)

* refactor(decode-payload): clean up decode-payload.ts API surface (#3302)

* docs: add decode-payload usage report and refactoring recommendations

* refactor(decode-payload): remove convertPayloadToJsonWithCodec and decodeAllPotentialPayloadsWithCodec

Replace all call sites with cloneAllPotentialPayloadsWithCodec directly,
eliminating the duplicate recursive walker and its named-param wrapper.

* refactor(decode-payload): rename functions for clarity

decodePayload → decodeRawPayload
decodePayloads → applyCodecToPayloads
decodeReadablePayloads → decodePayloadsWithCodec
decodeSingleReadablePayloadWithCodec → decodeUserMetadataPayload
cloneAllPotentialPayloadsWithCodec → decodeEventAttributes
isSinglePayload → isRawPayload

* refactor(decode-payload): remove namespace param from decodeEventAttributes

The namespace argument was unused inside the function body. Removing it
simplifies all call sites and makes the signature match actual behavior.

* refactor(decode-payload): isolate returnDataOnly=false into decodeEventAttributesForExport

Remove the returnDataOnly parameter from the public decodeEventAttributes
API. Extract a dedicated decodeEventAttributesForExport function for the
two callers (export-history, workflow-service) that need to preserve the
full payload structure with metadata.

* refactor(decode-payload): unify searchAttributes decode branches

Collapse the two separate branches in decodePayloadAttributes — one for
indexedFields and one for flat searchAttributes — into a single branch
that selects the correct target object via ternary.

Fix stale test mocks in get-event-attributes and to-event-history that
still referenced the removed convertPayloadToJsonWithCodec export.

* refactor(decode-payload): remove settings from decode-payload/data-encoder cascade

data-encoder.ts now reads settings and namespace directly from page state
instead of accepting them as parameters. This removes the need to thread
settings through every call site in the chain: components → services →
decode-payload → data-encoder.

- codeServerRequest/decodePayloadsWithCodec/encodePayloadsWithCodec drop settings+namespace params
- decodeEventAttributes/decodeEventAttributesForExport drop settings param
- getEventAttributes takes HistoryEvent directly instead of EventWithMetadata
- EventRequestMetadata.settings field removed
- pending-activities model deleted (settings removal collapsed it to a no-op wrapper)
- All tests updated to set codecEndpoint/passAccessToken/includeCredentials stores directly

* add call site map

* add phases

* rename

* fix tests

* fix workflow query and metadata call sites

* remove AI generated docs

* Add inline comments to decode-payload utils

* Make input height full so its easier to click into the input (#3318)

* Workflows Table Row Density (#3285)

* Add table-compact and table-comfy icons for table density toggle

* Export truncate value and truncate custom sa keywords/text

* Use dense not compact

* Remove rounded corners from table-dense and table-comfy icons

* Truncate more fields, exand the truncateValue to include 6 chars on either side for better readability

* Fix truncate issue with filter/copy buttons, use truncateValue for workers list page

* Truncate to 7 characts, make copy/filter buttons w-6 instead of w-7 to allow for a little more space

* PR review updates

* Change to dense instead of compact

* Hide tooltip on all other cells if length is less than TRUNCATE_LENGTH

* PR Review Notifications (#3322)

* Add pr review workflows

* Make workflows reusable

* feat: serverless worker deployment CRUD (#3236)

* feat: serverless workers CRUD

Squashed 46 commits for clean rebase onto main.

feat: Workers UX — real API wiring, new version CRUD, scalingGroups types

- Rewrite ComputeConfig types to scalingGroups map shape (real proto)
- Add deleteWorkerDeployment, deleteWorkerDeploymentVersion, createWorkerDeploymentVersion,
  validateWorkerDeploymentVersionComputeConfig, buildLambdaComputeConfig, decodeLambdaProviderDetails
- Fix route-for-api.ts: version route split to {deploymentName}/{buildId}; add versions POST,
  update-compute-config, validate-compute-config routes
- Add routeForWorkerDeploymentVersionCreate/Edit helpers
- Migrate delete-worker-modal to Svelte 5 onConfirm/onCancel callback props
- Wire compute-provider-picker to bindable prop with internal writable store sync
- New Create Version route + form (versions/create)
- New Edit Version route + form (versions/[buildId]/edit) with delete flow
- Deployment detail: replace header CTAs, remove compute cards, add Compute column,
  expandable rows, kebab menu; migrate $app/stores → $app/state
- Create deployment form: add Build ID field, two-call submit (createDeployment + createVersion),
  replace min/max instances with real scaling fields
- Update Zod schemas: createDeploymentSchema, createVersionSchema, editVersionSchema
- Update server go.mod to go.temporal.io/api v1.62.3-0.20260325221344 (adds CreateWorkerDeploymentVersion HTTP gateway)

feat: add compute details, expand/collapse, and actions menu to version table row

- Add namespace prop and derive workflowHref and editHref from it (removes $page.params dependency)
- Add expandable row showing Lambda ARN and IAM role ARN decoded from compute config
- Show compute provider type in compute column
- Replace go-to-workflows link with actions menu (Edit Version + Go to Workflows)

feat: three-call orchestration with validation and rollback in create worker form

- Create deployment → create version → validate compute config
- Rollback deployment if version creation fails (uses conflictToken)
- Rollback version then deployment if validation fails
- Route validate error message to lambdaArn/iamRoleArn field or form-level
- Treat Unimplemented (501) from validate endpoint as success
- Fix missing await on onSubmit in form component's onUpdate handler

feat: add delete deployment button when no versions exist

- Show destructive delete button in deployment header when versionSummaries is empty
- Add DeleteDeploymentModal with type-DELETE confirmation
- Rollback navigates to deployments list on success
- Show inline error on delete failure

fix: guard versionSummaries undefined when deployment has no versions

fix: await goto in form onSuccess/onSubmit callbacks to ensure navigation completes

fix: use correct compute provider/scaler types and config keys for aws-lambda

- provider.type: 'lambda' -> 'aws-lambda' (server now validates against allowed types)
- scaler.type: 'lambda' -> 'no-sync' (valid scaling algorithm for invoke-based providers)
- provider details keys: {lambdaArn, iamRoleArn} -> {arn, role} (keys the aws-lambda provider reads)
- move form-level error above submit buttons so it's visible after submit

feat: serverless workers CRUD UI with lazy-loaded version details

- Deployment list page with status badges and compute type indicators
- Deployment detail page with version table (build ID, status, compute, deployed date, actions)
- Version row expand: lazy-loads version details on demand using {#await} pattern, shows lambda ARN, IAM role, and scaler params for compute versions
- Actions menu: edit version, go to workflows, set as current, delete version
- Create/edit version forms with lambda compute config and scaler options
- Delete deployment/version with conflict token support
- i18n keys for all new strings
- Bump server go.mod for worker heartbeat support

refactor: version table row and deployment detail page

- Drop {#each columns} loop from version-table-row, render cells directly
- Extract VersionComputeDetails sub-component for expanded row
- Add Config Status column (renders — until API returns data)
- Update context menu: Edit, Validate Connection, View Workflows, Delete
- Wire up Validate Connection to validateWorkerDeploymentVersionComputeConfig
- Add validate result modal with loading skeleton
- Fix compute badge rendering — in deployment list row
- Remove "Since [date]" from build status column (not in Figma design)
- Add i18n keys: edit, validate-connection, validate-connection-error/valid/invalid

refactor: extract deployment sub-components and add capability guards

- Extract VersionActionsMenu, ValidateConnectionModal, DeleteVersionModal,
  and DeploymentHeader from version-table-row and deployment page
- Add CapabilityGuard to Edit and Delete menu items in version actions
- Add CapabilityGuard to Create New Version and Delete Deployment buttons
- Enable editServerlessDeployment and deleteServerlessDeployment in DEV

Add local temporal skill

refactor: UI polish, code standards, and cleanup for serverless workers CRUD

- Extract version row expanded content into VersionRowDetails sub-component (fetch on mount, no $effect)
- Add +page.ts with depends('data:deployment') for targeted invalidation after delete
- Extract loadDeploymentPage to lib/pages/deployment-page.ts for cloud-ui reuse
- Improve delete-version-modal: confirmation input, show buildId, surface API errors
- Improve validate-connection-modal: success/error icons, buildId in title
- Delete old serverless/[id] detail and edit routes and all associated dead code
  (serverless-worker-detail.svelte, serverless-worker-edit.svelte, serverless-worker-service.ts,
  serverless-worker-edit-form.svelte, serverless-worker-detail-skeleton.svelte)
- Fix all type Props → interface Props across deployment components
- Fix import ordering lint errors

remove filter input from deployments list page

The filter input is no longer part of the Figma design for the
deployments list page.

UI polish pass: deployment list/detail pages match Figma design

- Move "Create Worker Deployment" button to page header level
- Rename button from "Create Serverless Deployment" to "Create Worker Deployment"
- Move create route from deployments/serverless/create to deployments/create
- Rename breadcrumbs: "Back to Deployments" and "Go to Instances"
- Remove config-status column (pending API support from Shahab's PR)
- Update delete version modal to match Figma (title, description, remove build ID display)
- Apply surface-secondary to setup guide card (sidebar + drawer)
- Collapse three capability flags into single serverlessWorkers flag

feat: add AWS and GCP provider icons to Holocene icon library and wire into compute badge

feat: implement update/validate compute config and wire create version validation

- Add updateWorkerDeploymentVersionComputeConfig service function
- Edit version form now updates then validates, redirecting on success
- Create new version now validates after creation with rollback on failure (no set-current)
- Error alerts render inside forms matching the create flow pattern
- Remove unused serverless-worker-table-row, serverless-worker-status, serverless-workers types
- Remove routeForServerlessWorker and update-compute-config-unavailable i18n key

test: add deployments service tests and fix route-for-base-path coverage

- 24 tests covering all deployments service functions (CRUD, validate,
  update compute config, pure utility functions)
- Add missing route cases for routeForServerlessWorkerCreate,
  routeForWorkerDeploymentCreate, routeForWorkerDeploymentVersionCreate,
  routeForWorkerDeploymentVersionEdit

feat: improve compute provider picker UI and setup guide

- Add Vercel icon to Holocene icon library
- Show provider icons (AWS, GCP, Vercel) in bordered containers in radio cards
- Move Coming Soon badges inline with label text
- Highlight selected radio card with primary border
- Fix edit version form button layout: Save/Cancel left, Delete right
- Add sts:ExternalId condition to CloudFormation and Terraform IAM examples

feat: constrain version form widths and filter instances by deployment

- Add max-w-[45rem] to edit/create version pages to match form width convention
- Filter "go to instances" link by DeploymentName on deployment detail page

fix: use portal for version actions menu to avoid table overflow clipping

fix: fix subscription leak in compute provider picker and replace hardcoded i18n strings

refactor: flatten nested conditionals in service and error handler

refactor: remove unused props, redundant aliases, and unnecessary type assertion

refactor: extract duplicated transforms and repeated conditions

fix: restore go-jose v4.1.4 and fix learn-more-link key regression from rebase

- go-jose was downgraded from v4.1.4 to v4.1.3 during conflict resolution; restores the security bump from worker-insights
- Restores `learn-more-link` key (renamed to `go-dependency-warning-link` during rebase conflict), which worker-details.svelte references at two locations
- Removes duplicate `learn-more-link` entry that landed in the serverless section

fix: resolve strict mode TypeScript errors in PR-touched files

test: add coverage for deployment utilities, route-for, and route-for-api

fix: show compute provider badges by reading providerType from summary API

The list/summary endpoints return providerType as a flat string on the
scaling group, while the full version detail endpoint uses the nested
provider.type. Components were only checking provider?.type, so badges
were always empty on the deployments list and versions table.

fix: resolve strict mode TypeScript errors in deployment components

- route-for-api.ts: null-coalesce getApiOrigin() result; widen
  implementation signature to Partial<APIRouteParameters> so Pick-based
  overloads are compatible
- deployment-status.svelte: guard icon lookup before passing to Icon
- deployment-header.svelte: null-coalesce routeForWorkersWithQuery href
- deployment-table-row.svelte: null-coalesce routeForWorkflowsWithQuery href
- version-table-row.svelte: non-null assert deploymentVersion (always
  present on new versions), null-coalesce rampingVersionPercentage and
  workflowHref

fix: restore no-worker-heartbeats string to match test expectation

fix: restore original workers i18n strings and remove duplicate keys

The workers.ts file had four base strings with unintentionally changed
values (go-dependency-warning, go-dependency-warning-description,
worker-heartbeats-sdk-list-preface, worker-heartbeats-disabled),
worker-query-empty-state-description moved out of its original position,
and task-failure-rate duplicated in the new serverless block. Rebuilt
from the base commit with only the intentional additions: back-to-deployments
and the complete serverless strings block.

* fix: make WorkersLayout and Deployment props backward compatible

Accept old deploymentsHref/workersHref props on WorkersLayout alongside
new namespace prop, and make deploymentPromise optional on Deployment
with internal fetch fallback. Allows cloud-ui to consume the new package
version without requiring page-level changes.

* feat: gate expand toggle and validate connection behind serverlessWorkers flag

* feat: gate compute column behind serverlessWorkers capability flag

* fix: rename serverlessWorkers capability to serverScaledDeployments

* feat: support custom CFN template in setup guide, remove Terraform and Vercel

- Add optional cfnTemplate prop to ServerlessWorkerSetupGuide with fallback to default
- Thread cfnTemplate through SetupGuideToggle, ServerlessWorkerCreateForm, ServerlessWorkerCreate
- Remove Terraform tab from setup guide
- Remove Vercel option from compute provider picker

* fix: address PR review feedback on serverless workers UI

- Remove tooltips from compute form fields, rely on hint text only
- Swap AWS console links in setup guide to Link component
- Card padding p-4→p-5, section headings font-semibold→font-medium
- Scaling toggle button size sm, remove static name hint text
- Add bg-blue-50 to setup guide sidebar card
- Delete MenuItem uses destructive prop
- Copyable wrapper on lambda/IAM ARN in version compute details
- radio-card selected state always border-subtle, slot bg surface-background
- timeline-step heading text-base font-medium
- Extract handleCreate + rollback helpers in serverless-worker-create
- Add error handling for setCurrentDeploymentVersion with full rollback

* fix: setup guide visual polish

- Use surface-information (theme-aware indigo tint) instead of bg-blue-50
- Apply surface-information to drawer as well as sidebar card
- Remove IAM console link from setup guide
- Update setup guide copy to reference CloudFormation template specifically

* fix: address remaining PR review comments

- Empty state: use workers icon with text-blue-200, flex-wrap buttons
- version-row-details: $derived.by with retryCount for $derived suggestion
- version-table-row: validateLoading=false in onError callback
- deployment.svelte: reset deleteError before retry
- deployments.ts: narrow isVersionSummaryNew to include non-null deploymentVersion
- version-table-row: remove ! non-null assertions (now covered by type guard)
- scaling toggle: add chevron-up/down trailingIcon in both create forms
- create-version-form: add try/catch in onUpdate

* refactor: extract ComputeFields component to eliminate duplication

All three forms (create deployment, create version, edit version) shared
identical compute field markup. Extracted into ComputeFields with
$bindable props. Also removes leftover Tooltip/Icon wrappers from
edit-version-form that were inconsistent with the other forms.

* feat: shared delete modal + create button on instances tab

- Extract DeleteConfirmModal with shared state, template, and logic;
  DeleteDeploymentModal and DeleteVersionModal become thin wrappers
- Show Create Worker Deployment button on instances tab (mirrors deployments tab)

* fix: gate compute badge in deployment table row behind capability flag

* fix: align label and value vertically in compute details rows

* fix: rename create button to 'Create Deployment' on list pages, use 'Save' on form

* fix: rename CTA to 'Create Worker Deployment'

* fix: add scrollbar to CFN template code block in setup guide

* refactor: move delete-confirm-modal to shared components

Moves delete-confirm-modal.svelte from the deployments directory to
src/lib/components/delete-confirmation-modal.svelte so it can be reused
across the app. Updates both delete-deployment-modal and
delete-version-modal to import from the new shared location.

* chore: bump version to 2.48.4 (#3324)

Auto-generated version bump from 2.48.3 to 2.48.4

Specific version: 2.48.4

Changes included:
- [`7cf1be53`](https://github.com/temporalio/ui/commit/7cf1be53a3fddaccd3a1ed6ea41934a27cfaf976) Adjust breadcrumb spacing and min-height (#3304)
- [`c9834815`](https://github.com/temporalio/ui/commit/c9834815c4b36b023068353f2531c809caf8be74) Add missing Nexus Operation events to event groups (#3309)
- [`5c7aa86c`](https://github.com/temporalio/ui/commit/5c7aa86cb31592bad46e07e9e4785d57dc4ffc61) feat: add onItemsChange callback to PaginatedTable (#3300)
- [`66d3cf68`](https://github.com/temporalio/ui/commit/66d3cf68d888956dc8ee8378806ab7b738c3f757) Update pre-release badge to secondary in Workers (#3310)
- [`393e84de`](https://github.com/temporalio/ui/commit/393e84de4aa75ad1f0d123e9b1387e51c79b3bc3) Keep Pending Activities/Operations at the top of Timeline and Compact view (#3307)
- [`9f721347`](https://github.com/temporalio/ui/commit/9f7213472391f630c71872ffebe478fefc4f0825) Update error link in codec-server-error-banner (#3313)
- [`e698bda3`](https://github.com/temporalio/ui/commit/e698bda33308f566fb111e3498366e92722e6d1d) Add class prop to BottomNav component (#3314)
- [`55767fc9`](https://github.com/temporalio/ui/commit/55767fc9258f8abd8ab492495434c0d400dbf6c9) Add overrides (#3317)
- [`256cd274`](https://github.com/temporalio/ui/commit/256cd274bc110e3b55d8c5429cb0888f1e846083) refactor(decode-payload): clean up decode-payload.ts API surface (#3302)
- [`04f8c251`](https://github.com/temporalio/ui/commit/04f8c251a6ff52c1aa7f329896845ac380a00271) Make input height full so its easier to click into the input (#3318)
- [`b2231056`](https://github.com/temporalio/ui/commit/b223105691c56b0966a43dbffacb2e7271e1ac72) Workflows Table Row Density (#3285)
- [`0b2ce4fd`](https://github.com/temporalio/ui/commit/0b2ce4fd38c15e43a0c8ac3a97a76afa032bf01a) PR Review Notifications (#3322)
- [`84618196`](https://github.com/temporalio/ui/commit/84618196ddfdfe003db99d3ff59fd1050dadf7f5) feat: serverless worker deployment CRUD (#3236)

Co-authored-by: rossnelson <146089+rossnelson@users.noreply.github.com>

* fix: ref main in reusable PR review workflows (#3326)

* test(e2e): add end-to-end payload decoder coverage (#3321)

* add payload coverage workflow and add encryption to codec server

* test(e2e): add payload decoder tests covering all payload touchpoints

Start payload-coverage-workflow fire-and-forget in global setup so the
workflow remains running when tests execute, enabling signal and query
interaction.

Add payload-decoder.desktop.spec.ts covering:
- Workflow input decoded via cluster codec
- Memo payloads decoded
- Search attributes decoded
- Event history: WorkflowExecutionStarted, ActivityTaskScheduled,
  ActivityTaskCompleted, ActivityTaskFailed, StartChildWorkflowExecutionInitiated,
  ChildWorkflowExecutionCompleted
- Query results (get-status, get-field)
- Send signal and verify decoded payload in history
- Call stack stack trace

Use getByRole('textbox') within event-summary-row-expanded to access
CodeMirror contentDOM directly, matching the pattern used by existing
query and call-stack tests.

* test(e2e): refactor payload-decoder spec to use page object model

Add four page classes to encapsulate e2e test interactions:
- WorkflowDetailPage: tab navigation and input/result/main locators
- EventHistoryPage: feed toggle, event row expansion, and editor access
- WorkflowQueryPage: query type selection, arg input, and result
- SignalModalPage: signal modal open, signal selection, payload fill and submit

Refactor payload-decoder.desktop.spec.ts to use these classes, removing
all raw page.getByTestId/getByRole calls from the test body. Also upgrades
@temporalio/* packages from 1.15.0 to 1.16.0.

* change wf timeout back to 5 minutes

* fix search attributes

* chore: add setup-worktree skill (#3278)

* chore: add setup-worktree skill for new worktree initialization

* chore: simplify setup-worktree skill to cp .env and build:server only

* chore: remove hardcoded path from setup-worktree skill

* Fix decoding payloads for user metadata (#3328)

* add workflow with user metadata

* base64 decode user metadata payloads and remove unused component

* fix imports

* fix workflow runner for ci

* reorganize test workflows and add test for user metadata

* fix scripts

* don't wait for wf results in e2e test setup

* add better tests

* add error case test

* ci: remove unused Set up Protoc step from workflows (#3323)

* fix(ui): guard getApiOrigin against undefined VITE_API (#3332)

Refreshing the worker deployment versioning page can throw 
TypeError because VITE_API is not yet populated
and getApiOrigin called .startsWith on it.

Return null early when VITE_API is undefined so base() produces an
empty string and routeForApi produces a relative URL that
SvelteKit's server-side fetch resolves correctly.

* feat: add showInstancesLink prop to deployment header (#3331)

Allows callers to conditionally hide the "Go to Instances" link, needed
for cloud-ui to gate it behind the enable_worker_insights feature flag.

* Check certFile modification time instead of keyFile (#3178)

The certLoader was using keyFile's modification time to detect
certificate changes. When a certificate is renewed using the same key,
the keyFile remains unchanged and the new cert is never loaded.

This switches to checking certFile's modification time, which correctly
detects renewals regardless of whether the key was rotated.

Based on #2805 by @ndtretyak.

* feat(DT-3887): remove Dispatch Rate Epsilon from compute scaling UI (#3334)

Removes the scaleUpDispatchRateEpsilon input field from the serverless
worker compute scaling configuration UI per feedback from Muneeb Ahmad.

This is a UI-only removal. The service layer API mapping remains intact
so the backend contract is unchanged and existing deployments are not
affected.

Files changed:
- compute-fields.svelte: remove Input block + Props entries + destructure
- shared.ts: remove field from Zod scalingFields schema
- serverless-worker-create-form.svelte: remove initial data + bind prop
- create-version-form.svelte: remove initial data + bind prop
- edit-version-form.svelte: remove Props interface + initial data + bind
- serverless-worker-create.svelte: remove from buildLambdaComputeConfig
- worker-deployment-version-create.svelte: same
- worker-deployment-version-edit.svelte: same (2 references)
- version-compute-details.svelte: remove read-only display row
- en/workers.ts: remove label and hint i18n keys
- en/deployments.ts: remove dispatch-rate-epsilon i18n key

* Add usePortal support to Tooltip component (#3320)

* chore: bump version to 2.49.0 (#3337)

Auto-generated version bump from 2.48.4 to 2.49.0

Bump type: minor

Changes included:
- [`9146199f`](https://github.com/temporalio/ui/commit/9146199fd625e4f323a5941e35931646b9953a82) fix: ref main in reusable PR review workflows (#3326)
- [`ca904926`](https://github.com/temporalio/ui/commit/ca904926d4017bdf638976d3dbcf61f5423a568e) test(e2e): add end-to-end payload decoder coverage (#3321)
- [`4e32d230`](https://github.com/temporalio/ui/commit/4e32d23018d0af8232c96b936a5100f6a97d730e) chore: add setup-worktree skill (#3278)
- [`a789fbdb`](https://github.com/temporalio/ui/commit/a789fbdb91c96877eb017a4723e67a5c5a236189) Fix decoding payloads for user metadata (#3328)
- [`21f2d448`](https://github.com/temporalio/ui/commit/21f2d4483f8759e2f42b73cba4d73f338231e992) ci: remove unused Set up Protoc step from workflows (#3323)
- [`39c41d25`](https://github.com/temporalio/ui/commit/39c41d25cd96bc18a00291717af860a56f909f8f) fix(ui): guard getApiOrigin against undefined VITE_API (#3332)
- [`627cbb1b`](https://github.com/temporalio/ui/commit/627cbb1b672408735a92e5f86088ace76a3c3025) feat: add showInstancesLink prop to deployment header (#3331)
- [`0726c65e`](https://github.com/temporalio/ui/commit/0726c65e9024ded891c136ae31fd1519f57ebeda) Check certFile modification time instead of keyFile (#3178)
- [`8c79931b`](https://github.com/temporalio/ui/commit/8c79931bc17d176faf16f39d50133ae0a9227897) feat(DT-3887): remove Dispatch Rate Epsilon from compute scaling UI (#3334)

Co-authored-by: rossedfort <11775628+rossedfort@users.noreply.github.com>

* Bump Go toolchain to 1.26.2 for CVE fix (#3336)

* chore(server): bump Go version to 1.26.2 for CVE fix (DT-3889)

* chore: update Go version to 1.26.2 in Dockerfile and .tool-versions

* Add manual refresh of call stack (#3330)

* refactor: move fetchDeployment into Deployment component (#3340)

* refactor: move fetchDeployment into Deployment component

The Deployment component now owns the fetch call via a $derived expression,
so callers don't need to pass a deploymentPromise prop. loadDeploymentPage
retains only the depends() registration for SvelteKit invalidation.

This avoids the routeForApi timing issue where +page.ts runs before
page.data.webUrl is populated by the parent layout.

* refactor: remove deployment-page.ts, fix post-delete reload

deployment-page.ts was a thin wrapper just to call depends('data:deployment'),
which was never effective because deployment.svelte fetches its own data via
$derived rather than consuming load() data (fetchDeployment requires a
server-relative transport not available in cloud-ui's load layer).

Replace with:
- Inline depends() directly in +page.ts (and note it wires the invalidate
  call in version-table-row, so keep it)
- Add a reloadCount $state in deployment.svelte so child actions can trigger
  a same-page re-fetch without navigating away
- Add onVersionDeleted callback prop to VersionTableRow; call it instead of
  invalidate('data:deployment') after a successful version delete

* refactor: remove now-dead +page.ts for deployment route

Nothing calls invalidate('data:deployment') anymore, so the load
function was entirely inert. Also tighten the comment in deployment.svelte.

* refactor: use timestamp and named reload function per review feedback

* chore: bump version to 2.49.1 (#3341)

Auto-generated version bump from 2.49.0 to 2.49.1

Bump type: patch

Changes included:
- [`fccd87f9`](https://github.com/temporalio/ui/commit/fccd87f941f909b85fd1235f3e833220469dd26f) Bump Go toolchain to 1.26.2 for CVE fix (#3336)
- [`0361e3e9`](https://github.com/temporalio/ui/commit/0361e3e9013d4192e88aac914d5516db7e417f88) Add manual refresh of call stack (#3330)
- [`17293020`](https://github.com/temporalio/ui/commit/172930208060046848b6e50f002035faa0814340) refactor: move fetchDeployment into Deployment component (#3340)

Co-authored-by: rossnelson <146089+rossnelson@users.noreply.github.com>

* Add pollers table to workers tab (#3338)

* Add toggle buttons to workers tab to include legacy pollers table

* Update copy to include at least for SDK version and hide docs link

* Add description for pollers

* Make PollerTable scrollable on smaller screens

* Update refresh alert copy

* Update to preview badge for workers

* Use initiatedEvent for startChildFailed event grouping (#3342)

* rm slash (#3343)

* feat: Set Current Version action for worker deployment versions (#3319)

* feat: add Set as Current Version action to version actions menu

* feat: add Set Current Version confirmation modal with success toast

* fix: remove rounded class from build ID transition visual

* fix: remove rounded class from version actions menu button

* fix: import invalidate from \$app/navigation in version-table-row

* refactor: use MenuButton holocene component in version-actions-menu

* fix: reload version rows after set-current succeeds; consolidate callbacks into onChange

* Add relative path prefix support to routeFor utilities (#3292)

* Add relative path prefix support to routeFor utilities

Introduce a routePrefix store that allows consuming projects to inject
a path prefix (e.g., /projects/{projectId}) into all UI route functions.
The prefix is inserted between the SvelteKit base path and the route
path via a withPrefix helper that wraps the 12 root resolve() calls.
Leaf functions inherit the prefix automatically through the existing
string concatenation chain. Auth routes are excluded to avoid breaking
SSO flows.

* Move getRoutePrefix to coreProvider

* Wrap worker routes added after initial PR with withPrefix

---------

Co-authored-by: Ross Nelson <ross.nelson@temporal.io>

* fix: validate connection modal status, retry button, and copy nits (#3347)

* fix: validate connection modal status, retry button, and copy nits

- Fix isValid check (=== true) so HTTP error responses without a valid
  field don't show as "Connection is valid"
- Fix result assignment so onError captures the real error message from
  the API body instead of being overwritten by the raw return value
- Add Retry button to modal; replace Cancel to avoid modal closing on retry
- Add hideCancel prop to Modal component
- Match skeleton height to result row so modal doesn't resize on retry
- Update empty state button copy to "Create Serverless Worker Deployment"
- Change AWS Setup Guide card title to font-medium

* fix: use portal for deployment status tooltip to fix z-index clipping

* revert: restore original create worker deployment copy (#3348)

* Common Errors for Event History (#3306)

* Add common-error component with 35 workflow configuration warnings (#3262)

Create a reusable common-error component system for displaying operational
guidance about workflow misconfigurations. Includes typed data for 35 known
issues with severity levels, documentation links, and a /common-errors route.

* Integrate common-error detection into workflow detail header

Add automatic detection of 21 workflow configuration issues and display
them as warnings in the workflow header. Detection covers timeout
misconfigurations, retry policy issues, heartbeat settings, and more.
Also fixes raw code references in error titles.

* Fix detection accuracy for common errors

- Raise #31 threshold from 4000 to 10000 to match "significant additional events"
- Add null guards to all getCommonErrorById calls via addError helper
- Detect #3 (short timeout) from workflowRunTimeout on first event, not just execution timeout
- Fix #10 false positives for empty retry policy objects
- Handle protobuf nanos field in durationToSeconds for sub-second durations

* Add detection logic for 14 remaining common errors (#8-#35)

Implement Tier 1 detections from existing data (#9, #11, #13, #15, #19,
#23, #35) and Tier 2 detections from event history scanning (#8, #12,
#26, #27, #28, #29, #30). Adds detectEventHistoryErrors with single-pass
scanning and updates getApplicableCommonErrors to accept optional event
history. All 35 error definitions now have active detection logic.

* Add snippet to pass in headerSnippet for common errors. Refactor workflow-run-layout to svelte5

* Add back common errors page

* Remove common errors from snippet

* Revert alert to current styles

* Fix test failures for detectFirstEventErrors and routeForCommonErrors

Update detectFirstEventErrors test calls to match updated function
signature that removed the workflow parameter. Add missing
routeForCommonErrors test case to route-for-base-path tests.

* Replace VerticalNav with tab group on common errors page

Switch from VerticalNav sidebar to TabButtons for severity filtering.
Remove layout reset (@) since the page no longer needs a custom layout.
Add WorkflowCommonErrors snippet to workflow run layout.

* Remove common errors from header snippet

* Fix type errors in alert component and stories

Rename $$Props to Props in alert.svelte for Svelte 5 convention.
Update stories to use module script and ComponentProps for proper
type inference with Storybook.

* Update src/lib/components/common-errors/common-error.svelte

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Update src/lib/components/common-errors/common-errors-data.ts

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Update src/lib/utilities/common-error-detection.ts

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Remove workflow-common-errors.svelte

* Remove getCommonErrorsByCategory

* Update src/lib/components/common-errors/common-error-list.svelte

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Fix naming

* Add back workflow-common-errors.svelte
;5u

* Formatting

* Add type predicate filter

---------

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Show current duration for pending timeline events (#3346)

* Show current duration for running timeline events

* Switch to use endTime

* Update src/lib/components/lines-and-dots/svg/timeline-graph-row.svelte

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

---------

Co-authored-by: Laura Whitaker <laura.whitaker@temporal.io>

* Add refresh button to workers list view (#3349)

* Fix null conditionals in search attribute filter (#3351)

* Fix null conditionals in workflow search attribute filter

* Set value to null instead of empty string

* Add support for adding caller Namespace even if it's not in list of allowed Namespace options for Nexus endpoint (#3167)

* Update nexus endpoint details page

* Fix empty description string

* Add allowCustomValue to combobox for nexus allowed caller namespaces

* Add validateNamespacesExist

* refactor(DT-3906): Add knip (#3350)

* Install knip

* Fix unresolved imports

* Add knip and remove unused deps

* Remove icon (#3357)

* Add Java to list of support versions for worker heartbeats (#3362)

* refactor(DT-3906): Simple Svelte 5 migrations (#3359)

* Update translate to svelte 5 syntax

* Update PageTitle to Svelte 5 syntax

* Update Panel to Svelte 5 syntax

* Update PayloadInput

* Update WorkflowStatus to svelte 5 syntax

* Update BatchOperations Table to Svelte 5 syntax

* Update Icon and Svg components to Svelte 5 syntax

* Update Error to Svelte 5 syntax

* Update Keyboard Short components to Svelte 5 syntax

* Update Label component Svelte 5 syntax

* Update TabPanel to Svelte 5 syntax

* Update Combobox async-test to Svelte 5 syntax

* Update Logo to Svelte 5 syntax

* Update Batch Operations Page to Svelte 5 syntax

* Update (app) +page to Svelte 5 syntax

* Update NameSpace page to Svelte 5 syntax

* update UserMenuMobile to Svelte 5 syntax

* Update Lines and Dots components to Svelte 5 syntax

* Use worse type to not introduce more errors

* Migrate forgotten lines and dots component to Svelte 5 syntax

* Change derived state to reactive state in async combobox test

* feat(DT-3657): Support shift click for bulk selection in workflow table (#3344)

* Fix eslint warning

* Migrate to Svelte 5 syntax

* Add multiselect via shift key

* Clear prev index after page selected or all selected trigger

* Make onClickBatchSelect optional, disable checkbox if child

* Do not set child disabled

* Support shift+click select within child workflows

* Update shift+click logic. Instead of multiple scopes, treat all visible items as one scope.

* Remove console log

* Fixup type

* Add tests

* Account for prevClickedRow being nullish

* Fix type

* Fix some warnings

* Fix type

* Fix type for onClickBatchSelect

* Fix type check

* Use early return

* More warning fixes

* Undo prop type change

* Fix warning

* Default query to empty string

* Move comment to inside handler :\

* Move isChecked higher

* Fix race condition

* Fix the fix :P

* Use runId as key

* use runId for check

* Show root rows as checked if allSelected

* Use map instead of set so we rely on runId for equality

* Fix header checkmark status

* Address PR comments

* Apply suggestions from code review

Co-authored-by: Laura Whitaker <laura.k.whitaker@gmail.com>

---------

Co-authored-by: Laura Whitaker <laura.k.whitaker@gmail.com>

* Enable Svelte 5 runes on files not using legacy features (#3363)

* Update components/workflow to Svelte 5 syntax (#3361)

* refactor(DT-3906): More Svelte 5 Migrations (trivial ones) (#3364)

* Enable Svelte 5 runes on files not using legacy features

* Migrate components to Svelte 5 runes syntax

* Trivial migrations

* More simple migrations

* feat(DT-3657): Support shift click for bulk selection in workflow table (#3344)

* Fix eslint warning

* Migrate to Svelte 5 syntax

* Add multiselect via shift key

* Clear prev index after page selected or all selected trigger

* Make onClickBatchSelect optional, disable checkbox if child

* Do not set child disabled

* Support shift+click select within child workflows

* Update shift+click logic. Instead of multiple scopes, treat all visible items as one scope.

* Remove console log

* Fixup type

* Add tests

* Account for prevClickedRow being nullish

* Fix type

* Fix some warnings

* Fix type

* Fix type for onClickBatchSelect

* Fix type check

* Use early return

* More warning fixes

* Undo prop type change

* Fix warning

* Default query to empty string

* Move comment to inside handler :\

* Move isChecked higher

* Fix race condition

* Fix the fix :P

* Use runId as key

* use runId for check

* Show root rows as checked if allSelected

* Use map instead of set so we rely on runId for equality

* Fix header checkmark status

* Address PR comments

* Apply suggestions from code review

Co-authored-by: Laura Whitaker <laura.k.whitaker@gmail.com>

---------

Co-authored-by: Laura Whitaker <laura.k.whitaker@gmail.com>

* Delete unused file

---------

Co-authored-by: Laura Whitaker <laura.k.whitaker@gmail.com>

* refactor(DT-3906): UI svelte 5 migrate components/events (#3365)

* Export MultiSelectionOptions type

* Migrate components/event components

* Fix type error

* refactor(DT-3906): Migrate stories to Svelte 5 syntax (#3366)

* Scope group hover to tooltip component only (#3379)

* chore: upgrade TypeScript to v6.0.3 (#3371)

* chore: upgrade TypeScript to v6.0.3

- Bump typescript from ^5.2.2 to 6.0.3
- Add explicit `strict: false` to tsconfig to preserve existing behavior
  (TS 6 now defaults strict to true)
- Fix two event handler type errors caused by TS 6 DOM lib typing
  on:input as InputEvent instead of Event

* chore: add @typescript/native-preview for tsgo support

Enables `svelte-check --tsgo` and `svelte-check --tsgo --incremental`
for faster type checking using the Go-based TypeScript compiler.

* chore: enable --tsgo --incremental for svelte-check

Faster type checking via Go-based TS compiler with disk-cached
svelte2tsx transpilation. Will report errors in 4 unmigrated Svelte 4
components until they are converted to Svelte 5 runes.

* ts-upgrade: Migrate chip-input to fix tsgo error (#3380)

* Fix tsgo union too complex error (#3381)

* fix: replace redundant comma operator reactive statements

$: (dep, fn()) is unnecessary when fn() already reads dep internally.
Replaced with $: fn() which Svelte tracks as a dependency automatically.

* fix: preserve reactive dependencies using block instead of comma operator

Replaces $: (dep, fn()) with $: { dep; fn(); } to keep the explicit
dependency declaration while avoiding the tsgo comma operator error.

---------

Co-authored-by: Tegan Churchill <tegan.churchill@temporal.io>

* refactor(DT-3906): More trivial migrations (#3367)

* refactor(DT-3906): migrate holocene primitives + layout components to Svelte 5 runes (#3377)

* refactor(DT-3906): UI Svelte 5 Migrations medium (#3368)

* refactor(DT-3906): Delete unused Svelte 4 scaffolding (carved from #3370 - Part 1) (#3372)

* refactor(DT-3906): Migrate workflow client-action modals to runes (carved from #3370 - Part 4) (#3375)

Co-authored-by: Tegan Churchill <tegan.churchill@temporal.io>

* refactor(DT-3906): Migrate schedule view components to runes (carved from #3370 - Part 2) (#3373)

Co-authored-by: Laura Whitaker <laura.k.whitaker@gmail.com>

* refactor(DT-3906): Migrate filter and input components to runes (carved from #3370 - Part 3) (#3374)

* refactor(DT-3906): Migrate workflows-summary table + relationships to runes (carved from #3370 - Part 5) (#3376)

* fix(DT-3968): Make Workflow Table Tooltips render in portal (#3383)

* fix(DT-3967): Visibly toggle the view children button even with a parent has 0 (#3382)

* Remove capability guard from Set Current Version menu item (#3386)

* fix: portal maximizable to body to escape stacking context (#3385)

* fix: portal maximizable to body to escape stacking context

The Maximizable component used `position: fixed; z-index: 100` but was
rendered inside `content-wrapper` (relative + overflow-auto), which
creates a browser stacking context. This trapped z-100 within that
context, causing the maximized code block to appear behind the side nav
(z-30) and header (z-40) at the root stacking context level.

Fix by using the existing `portal` action from portal-action.ts to move
the element to document.body when maximized — the same pattern used by
Drawer, Menu, and Tooltip — so z-100 competes at the root level.

* Address PR feedback: collapse effect/onDestroy, add focusTrap when maximized

* address PR feedback: use $effect cleanup, focusTrap, isConnected guard

* chore(security): patch Dependabot alerts for axios, protobufjs, fast-uri, uuid, postcss, gomarkdown (#3388)

- axios: 1.15.0 → 1.15.2 (9 CVEs: prototype pollution, header injection, XSRF, CRLF, SSRF)
- protobufjs: 7.5.4 → 7.5.8 (critical: arbitrary code execution)
- fast-uri: 3.1.0 → 3.1.2 (high: path traversal, host confusion)
- uuid@11: 11.1.0 → 11.1.1 (medium: missing buffer bounds check)
- postcss: 8.5.9 → 8.5.14 (medium: XSS via unescaped </style>)
- gomarkdown/markdown: 20240729 → 20260411 (high: out-of-bounds read)

* Upgrade GitHub actions (#3389)

* Upgrade gh actions

* Replace archived gh action

* SHA-pin all third-party gh actions

* SHA-pin all gh actions

* fix(timeline): stabilize child workflow timeline width with scrollbar-gutter (#3329)

* Move Create Schedule button to header row (#3390)

* Update CTA placement

* Update icon

* Add top margin (#3392)

* refactor: replace PayloadDecoder and MetadataDecoder with unified Payload component (#3299)

* refactor: replace PayloadDecoder and MetadataDecoder with unified Payload component

Consolidates two divergent payload display components into a single
`<Payload />` component at `src/lib/components/payload.svelte`.

Previously, `payload-decoder.svelte` (Svelte 5 runes, required a
`children` snippet, always decoded full attribute trees) and
`metadata-decoder.svelte` (Svelte 4 options API with slot syntax,
decoded single payloads to truncated summary strings) served different
display purposes but used inconsistent APIs and decoding paths across
65+ call sites.

The new component unifies both under a single `mode` prop:
- `code-block` (default): renders a CodeBlock with the decoded value,
  replacing all PayloadDecoder + CodeBlock snippet patterns
- `summary`: truncates to 120 chars and renders a Badge, replacing all
  MetadataDecoder usages
- `inline-truncated`: renders the compact .payload pre block used in
  event detail rows
- `children` snippet: escape hatch for callers that need custom
  rendering (schedule input, timeline SVG text elements)

Both old components used a single decoding path internally
(cloneAllPotentialPayloadsWithCodec -> decodePayloadAttributes ->
stringifyWithBigInt). MetadataDecoder previously used a separate
decodeSingleReadablePayloadWithCodec path; the new component uses the
same unified path for consistency.

The component is written in Svelte 5 runes throughout and imports from
$app/state instead of $app/stores, matching the newer direction of the
codebase.

Migrated files:
- src/lib/components/event/event-card.svelte
- src/lib/components/event/event-details-row.svelte (+ moved .payload CSS)
- src/lib/components/event/event-metadata-expanded.svelte
- src/lib/components/event/event-summary-row.svelte
- src/lib/components/lines-and-dots/svg/group-details-text.svelte
- src/lib/components/lines-and-dots/svg/timeline-graph-row.svelte
- src/lib/components/schedule/schedule-form/schedule-input-payload.svelte
- src/lib/components/standalone-activities/activity-input-and-outcome.svelte
- src/lib/components/workflow/client-actions/update-confirmation-modal.svelte
- src/lib/components/workflow/input-and-results-payload.svelte
- src/lib/components/workflow/metadata/metadata-events.svelte
- src/lib/components/workflow/pending-activity/pending-activity-card.svelte
- src/lib/components/workflow/workflow-json-navigator.svelte
- src/lib/pages/standalone-activity-details.svelte
- src/lib/pages/standalone-activity-search-attributes.svelte
- src/lib/pages/workflow-memo.svelte
- src/lib/pages/workflow-metadata.svelte
- src/lib/pages/workflow-search-attributes.svelte

All 1730 tests pass.

* remove unused component, fix css

* refactor: move Payload component into payload/ directory

Moves payload.svelte into src/lib/components/payload/ and adds a
USAGE.md report documenting all 31 call sites grouped by feature area.
Updates all 17 import paths accordingly.

* docs: add Payload component improvement suggestions

* docs: add decode-payload usage report and refactoring recommendations

* refactor(payload): split Payload component into focused mode-specific components

Replace the 14-prop multi-mode payload.svelte with four single-purpose
components: PayloadCodeBlock, PayloadSummary, PayloadDecoder, and
PayloadInline. Each component carries only the props relevant to its
render mode, eliminating dead props at call sites.

Also updates the decode paths to use the renamed decode-payload.ts API
(decodeEventAttributes, parsePayloadAttributes) following the #3302
cleanup.

* fix(payload-summary): use decodeUserMetadata and add onDecode prop

Replace decodeEventAttributes with decodeUserMetadata — the correct
decode path for a single raw Payload (Phase 2 codec only, no attribute
tree walking). Also add onDecode callback prop, called after a
successful decode, consistent with PayloadCodeBlock.

* refactor(payload): extract shared decode logic into decode-payload-value utility

Remove 3-way duplication of getInitialValue/onMount decode logic from
payload-code-block, payload-decoder, and payload-inline by extracting
getInitialPayloadValue and decodePayloadValue into
src/lib/utilities/decode-payload-value.ts.

* fix(payload): replace onMount with \$effect for reactive value updates

Components now re-decode when value or fieldName props change after
mount, fixing the reactivity gap that caused stale decoded content
when parent components updated their payload bindings.

* add workflow with user metadata

* remove unnecessary props from payload code block

* fix summary display

* add improvements

* fix heading levels

* add multi input workflow

* get rid of fieldName prop and fix most of the call sites

* fix remaining type errors

* fix tests

* rm inspect

* rm console.log

* fix CR feedback

* remove bad key

* fix export

* remove unused type

* cleanup unused stuff

* fix possibly duplicate key

* add language prop to PayloadCodeBlock

* add copyIconTitle and copySuccessIconTitle to codeblock instance

* refactor(payload): fix reactivity and race condition in payload-summary

Replace $effect+$state async pattern with $derived promise + $effect
cleanup to ensure all reactive deps (value, fallback, prefix,
maxSummaryLength) are tracked synchronously. Use $effect cleanup function
to cancel stale promise callbacks on re-run, preventing race conditions
when value changes rapidly. Remove unused onDecode prop.

* early return if no payloads in decode utils

* add loading state to payload code block (#3397)

this will prevent re-rendering jitters while viewing live workflows

* Update Schedules search attributes filter (#3396)

* Add TemporalSchedulePaused attribute

* Use shared search attribute filter bar component on Schedules page

* Remove unused search attribute filter component

* Add prefixSearchEnabled and keyword check for STARTS_WITH option

* Rename search attribute filter component

* Move dropdown-filter-chip.svelte into search-attribute-filter

* DT-3751 - download external payloads (#3345)

* refactor: replace PayloadDecoder and MetadataDecoder with unified Payload component

Consolidates two divergent payload display components into a single
`<Payload />` component at `src/lib/components/payload.svelte`.

Previously, `payload-decoder.svelte` (Svelte 5 runes, required a
`children` snippet, always decoded full attribute trees) and
`metadata-decoder.svelte` (Svelte 4 options API with slot syntax,
decoded single payloads to truncated summary strings) served different
display purposes but used inconsistent APIs and decoding paths across
65+ call sites.

The new component unifies both under a single `mode` prop:
- `code-block` (default): renders a CodeBlock with the decoded value,
  replacing all PayloadDecoder + CodeBlock snippet patterns
- `summary`: truncates to 120 chars and renders a Badge, replacing all
  MetadataDecoder usages
- `inline-truncated`: renders the compact .payload pre block used in
  event detail rows
- `children` snippet: escape hatch for callers that need custom
  rendering (schedule input, timeline SVG text elements)

Both old components used a single decoding path internally
(cloneAllPotentialPayloadsWithCodec -> decodePayloadAttributes ->
stringifyWithBigInt). MetadataDecoder previously used a separate
decodeSingleReadablePayloadWithCodec path; the new component uses the
same unified path for consistency.

The component is written in Svelte 5 runes throughout and imports from
$app/state instead of $app/stores, matching the newer direction of the
codebase.

Migrated files:
- src/lib/components/event/event-card.svelte
- src/lib/components/event/event-details-row.svelte (+ moved .payload CSS)
- src/lib/components/event/event-metadata-expanded.svelte
- src/lib/components/event/event-summary-row.svelte
- src/lib/components/lines-and-dots/svg/group-details-text.svelte
- src/lib/components/lines-and-dots/svg/timeline-graph-row.svelte
- src/lib/components/schedule/schedule-form/schedule-input-payload.svelte
- src/lib/components/standalone-activities/activity-input-and-outcome.svelte
- src/lib/components/workflow/client-actions/update-confirmation-modal.svelte
- src/lib/components/workflow/input-and-results-payload.svelte
- src/lib/components/workflow/metadata/metadata-events.svelte
- src/lib/components/workflow/pending-activity/pending-activity-card.svelte
- src/lib/components/workflow/workflow-json-navigator.svelte
- src/lib/pages/standalone-activity-details.svelte
- src/lib/pages/standalone-activity-search-attributes.svelte
- src/lib/pages/workflow-memo.svelte
- src/lib/pages/workflow-metadata.svelte
- src/lib/pages/workflow-search-attributes.svelte

All 1730 tests pass.

* remove unused component, fix css

* refactor: move Payload component into payload/ directory

Moves payload.svelte into src/lib/components/payload/ and adds a
USAGE.md report documenting all 31 call sites grouped by feature area.
Updates all 17 import paths accordingly.

* docs: add Payload component improvement suggestions

* docs: add decode-payload usage report and refactoring recommendations

* refactor(payload): split Payload component into focused mode-specific components

Replace the 14-prop multi-mode payload.svelte with four single-purpose
components: PayloadCodeBlock, PayloadSummary, PayloadDecoder, and
PayloadInline. Each component carries only the props relevant to its
render mode, eliminating dead props at call sites.

Also updates the decode paths to use the renamed decode-payload.ts API
(decodeEventAttributes, parsePayloadAttributes) following the #3302
cleanup.

* fix(payload-summary): use decodeUserMetadata and add onDecode prop

Replace decodeEventAttributes with decodeUserMetadata — the correct
decode path for a single raw Payload (Phase 2 codec only, no attribute
tree walking). Also add onDecode callback prop, called after a
successful decode, consistent with PayloadCodeBlock.

* refactor(payload): extract shared decode logic into decode-payload-value utility

Remove 3-way duplication of getInitialValue/onMount decode logic from
payload-code-block, payload-decoder, and payload-inline by extracting
getInitialPayloadValue and decodePayloadValue into
src/lib/utilities/decode-payload-value.ts.

* fix(payload): replace onMount with \$effect for reactive value updates

Components now re-decode when value or fieldName props change after
mount, fixing the reactivity gap that caused stale decoded content
when parent components updated their payload bindings.

* add workflow with user metadata

* remove unnecessary props from payload code block

* fix summary display

* add improvements

* fix heading levels

* add multi input workflow

* get rid of fieldName prop and fix most of the call sites

* fix remaining type errors

* fix tests

* rm inspect

* rm console.log

* WIP - download external payloads

* add support for downloading externally stored payloads

* add some error handling to downloads

* add support for filename

* fix CR feedback

* remove bad key

* fix export

* remove unused type

* cleanup unused stuff

* fix possibly duplicate key

* add language prop to PayloadCodeBlock

* add copyIconTitle and copySuccessIconTitle to codeblock instance

* refactor(payload): fix reactivity and race condition in payload-summary

Replace $effect+$state async pattern with $derived promise + $effect
cleanup to ensure all reactive deps (value, fallback, prefix,
maxSummaryLength) are tracked synchronously. Use $effect cleanup function
to cancel stale promise callbacks on re-run, preventing race conditions
when value changes rapidly. Remove unused onDecode prop.

* early return if no payloads in decode utils

* add type guards

* support inline external payloads

* fix download error and payload codeblock types

* fix schedule input

* rm console.log

* fix tests and strict mode

* fix spec

* fix typo

* add some optional chaining

* Fix codec server request URL (#3400)

* codec server request URL

* add test

* fix other tests

* Make input from schedule result actually a string and update tests (#3403)

* feat(history): show Nexus operation name in compact view  (#3394)

* feat(history): show Nexus operation name in compact view alongside Activity and Update

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(history): deprioritize Nexus 'operation' by folding it into preferredSummaryKeys.

* Fix: update test to reflect new data shape.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Refactor status counts and refresh button (#3402)

* Use CountRefreshButton instead of ActivityCountRefresh on Standalone Activities page

* Add formatted refresh time to workers page

* Adjust workflows header spacing for refresh button

* Use StatusCounts component for both workflow and standalone activities

* Fix strict errors

* Fix groupValues type

* Fix double loader button (#3407)

* fix double loading spinners in button

- if button has leading icon only, replace leading icon with spinner
- if button has trailing icon only, replace trailing icon with spinner
- if button has no icon, show spinner in leading icon slot
- if button has leading + trailing icon, replace leading icon with spinner

* hide trailing icon with css so it preserves button width

* Payload rendering and error optimizations (#3401)

* fix: surface payload decode errors inline and remove CodecServerErrorBanner

Wire the error snippet in PayloadCodeBlock to PayloadDecoder so codec
decode failures display inline with an icon instead of being silently
swallowed. Remove the now-redundant CodecServerErrorBanner component
from all usage sites and delete the file.

* feat(payload): add retry button to payload decode error state

Show raw payload content with a retry button in the CodeBlock header when decoding fails, allowing users to re-trigger the decode request without a page reload.

* perf(payload): skip re-decode when payload value content is unchanged

Use a derived promise keyed on serialized value content + retry count so PayloadDecoder only re-triggers a decode when the payload data actually changes, not on every reference change from parent re-renders.

* fix: prevent decodePromise from re-running on reference-equal payload changes

Use untrack() around decodeValue(value) so the value prop is not tracked
as a reactive dependency inside the derived. Only valueJson (content hash)
and retryCount drive invalidation, avoiding redundant decodes when a
parent passes a structurally identical but referentially different payload.

Also removes the leftover $inspect debug directive.

* stringify error

* feat: reinstate codec-server-error-banner

Restore the CodecServerErrorBanner component and its usages in
workflow-header, schedule-view, start-workflow, and schedule form.
The banner surfaces codec server errors at the page level alongside
the inline payload decode error display.

* remove codec server error banner from workflow header layout only

* add error and retry state to payload inline

* simplify retry

* add comments and clean up untrack call

* add codec server error banner back to workflow layout (#3408)

* Nxs operation/kt (#3406)

* fix(history): prioritize operation over input so Nexus events show the operation name in compact view.

* test(history): assert NexusOperationScheduled compact summary resolves to operation.

* Bump Go 1.26.2→1.26.3, x/net v0.54.0, remove curl from runtime image (#3409)

Clears 6 CVEs flagged on the ui-server Docker image:

Go toolchain (1.26.3):
- CVE-2026-39836 (net: panic on NUL byte)
- CVE-2026-33814 (net/http2: infinite loop on SETTINGS_MAX_FRAME_SIZE=0)
- CVE-2026-33811 (net: double-free in LookupCNAME with cgo resolver)

golang.org/x/net v0.54.0 (≥ v0.53.0):
- CVE-2026-33814 at the library level

curl removed from final runtime stage (kept in builder):
- CVE-2026-3805 (SMB use-after-free)
- CVE-2026-6276 (cookie leak via stale Host header)
- CVE-2026-5773 (SMB connection reuse)

* chore(deps-dev): bump svelte from 5.55.1 to 5.55.7 (#3395)

Bumps [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) from 5.55.1 to 5.55.7.
- [Release notes](https://github.com/sveltejs/svelte/releases)
- [Changelog](https://github.com/sveltejs/svelte/blob/main/packages/svelte/CHANGELOG.md)
- [Commits](https://github.com/sveltejs/svelte/commits/svelte@5.55.7/packages/svelte)

---
updated-dependencies:
- dependency-name: svelte
  dependency-version: 5.55.7
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* VLN-1352: remediate missing-dependency-cooldown (#3398)

* VLN-1352: fix missing-dependency-cooldown

* Fix formatting

---------

Co-authored-by: picatz <14850816+picatz@users.noreply.github.com>
Co-authored-by: Your Name <alex.tideman@gmail.com>

* Bump devalue to 5.8.1 (#3410)

* Set color-scheme explicitly (#3358)

* chore: ensure the empty app.html respects the user's ligh/dark settings (#3353)

this is useful during the brief moment during which the html has loaded
but the app js hasn't finished loading and executing. it prevents users
from seeing a glaring bright screen which is an undesirable experience
in the wee hours of the morning.

* fix: enable external payload download button with namespace level codec endpoint (#3420)

* fix: enable external payload download button when codec server set at namespace level

The download button for externally-stored payloads was gated on `$codecEndpoint`
(the browser localStorage store), which is null when the codec server is
configured only at the namespace/settings level. This left the button permanently
disabled even though the codec server was reachable and actively serving /decode
requests on the same page.

Replace the `$codecEndpoint` checks with `getCodecEndpoint(page.data.settings)`,
which is already the authoritative resolver used by `codeServerRequest` for all
encode/decode/download requests. It correctly falls back to `settings.codec.endpoint`
when the browser-level override is not set.

* test: cover namespace-level codec endpoint path for download

Adds regression tests for codeServerRequest to document that download
(and decode) requests correctly use settings.codec.endpoint when the
browser-level $codecEndpoint store is not set. This is the service-layer
behaviour that was obscured by the download button bug (#3419), where the
button remained disabled even though the request would have succeeded.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix publicPath URL duplication when prefix appears as substring (#3393)

* Harden publicPath prefix detection

* Replace magic 200 with http.StatusOK in Stream call

* Inline resolve() into withPrefix

* Add a start-anchor to the  rewrite regex

* Add tests

Co-authored-by: Ross Nelson <ross.nelson@temporal.io>

* Add withPrefix to routeForCommonErrors

---------

Co-authored-by: Ross Nelson <ross.nelson@temporal.io>

* chore: bump version to 2.50.0 (#3421)

Auto-generated version bump from 2.49.1 to 2.50.0

Bump type: minor

Changes included:
- [`29832bec`](https://github.com/temporalio/ui/commit/29832bec2bbb58178562ad648619229543f74d14) Use initiatedEvent for startChildFailed event grouping (#3342)
- [`91a01560`](https://github.com/temporalio/ui/commit/91a015608c99a1a6cc0cae09cda019c08c9e2034) rm slash (#3343)
- [`2e7b88d0`](https://github.com/temporalio/ui/commit/2e7b88d040723c38d02f4a78d6c800f2fcd13faa) feat: Set Current Version action for worker deployment versions (#3319)
- [`b2685f3b`](https://github.com/temporalio/ui/commit/b2685f3b195f2c1a9b714947748bb08774316b47) Add relative path prefix support to routeFor utilities (#3292)
- [`9c888c0c`](https://github.com/temporalio/ui/commit/9c888c0c5555f9fbfa7e7155532c19d5e653ca45) fix: validate connection modal status, retry button, and copy nits (#3347)
- [`38989c48`](https://github.com/temporalio/ui/commit/38989c4879faafd9aeac6f337c19fe49170af23b) revert: restore original create worker deployment copy (#3348)
- [`90e1fe58`](https://github.com/temporalio/ui/commit/90e1fe58e581fdd5cad444436831ee3a542d55d9) Common Errors for Event History (#3306)
- [`f479e4e2`](https://github.com/temporalio/ui/commit/f479e4e2c2bde6f233b5a327183…
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