DT-4001 - standalone nexus operations#3496
Conversation
…rations (#3444) * feat(nexus-operations): add types and API routes for standalone nexus operations Adds NexusOperationExecution types, extends APIRouteParameters with operationId, and registers 6 new API routes (list, describe/start, poll, cancel, terminate, count). Adds route-for helpers mirroring the standalone activities pattern. DT-4005 * feat(nexus-operations): add services for standalone nexus operations Adds fetchPaginatedNexusOperations, startStandaloneNexusOperation, getNexusOperationExecution, pollNexusOperationExecution, cancel, and terminate. Adds count and count-by-status service functions. DT-4005 * feat(nexus-operations): add stores, poller, and filters for standalone nexus operations Adds nexus operation writable stores (refresh, loading, updating, count, error, query). Adds StandaloneNexusOperationPoller with long-poll loop mirroring the activity poller. Adds nexusOperationFilters store to filters.ts. DT-4005 * test(nexus-operations): add route-for-base-path test cases for standalone nexus operations
…figurable table columns (#3466) Adds Phase 2 (DT-4006) infrastructure for standalone nexus operations: - NamespaceCapabilities type with standaloneNexusOperations field in src/lib/types/index.ts - Guard component that checks both capability flag and minimum server version (1.31.0) - Disabled state component with Dynamic Config instructions - i18n namespace for standalone-nexus-operations - TABLE_TYPE.NEXUS_OPERATIONS, NexusOperationHeaderLabels, default/available column arrays, persistedNexusOperationsTableColumns store, configurableTableColumns derived store update, availableNexusOperationColumns export, and exhaustive switch cases in configurable-table-columns.ts
…3] (#3470) * feat(nexus-operations): add standalone nexus operations list page - Add list page route at namespaces/[namespace]/nexus-operations - Add page component with status count filters and configurable table - Add filter bar with search attribute support - Add configurable table with header/body cells and empty state - Add get-nexus-operation-status-and-count utility and tests - Add nexus operation search attributes to search-attributes store - Wire nav layout item for standalone nexus operations - Add i18n strings for nexus operations page * feat(nexus-operations): add saved views panel, CTA button, and rich empty state Match Figma design for standalone nexus operations list page: - Add saved views panel with system/user views, expand/collapse, save/edit/delete/share - Add 'Start a Standalone Nexus Operation' CTA button via headerActions snippet - Add rich empty state with value proposition, docs links, and GitHub code samples - Add i18n strings for all new UI copy - Add savedNexusQueryNavOpen persist store and savedNexusQueries/systemNexusViews stores * Update api version to v1.62.12 for SANO APIs and capability * fix capability name
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
…002] (#3495) * [DT-4039] Workflow query builder doesn't work with numeric search attributes (#3435) * fix(DT-4039): Workflow query builder for numeric search attributes The query builder wrapped Int/Double search attribute values in double quotes (e.g. `Foo="1"`), which the Visibility backend rejects for numeric types. Stop quoting numeric values in the serializer. The tokenizer also merged unquoted values with their conditional operator (e.g. `Foo=1` tokenized as `Foo`, `=1`), which previously only mattered for booleans and was patched in the parser by stripping `=`. With numerics this breaks down for 2-char operators (`>=`, `<=`, `!=`). Fix the tokenizer to emit the conditional as its own token and to accept operator-style 2-char conditionals without a trailing space. Update the boolean parser to read the value from `tokenTwoAhead` to match the new shape. * fix(DT-4039): Update integration tests for unquoted numeric search attributes The desktop and mobile workflow-filter specs asserted the previous buggy serialization (`HistoryLength`="10"). Update them to match the new correct shape (`HistoryLength`=10). * Make Common Errors dismissable (#3471) * Make common errors dismissable * Remove common errors * Capitalize Common Errors * Add description * Update description * [DT-4048] Add accessibility PR triage and notification helpers (#3465) * Implement helpers for accessibility PRs * fix formatting * fix linting * fix title gating regex * improve deduplication detection on notify * Move CLAUDE.md a11y conventions to DT-4049 * feat(DT-4017): Schedules List UI Update (#3467) * fix(markdown): allow nested lists to render as block (DT-4047) (#3463) * Add a prop to hide select/deselect controls (#3474) * DT-4051: pre-populate input when starting standalone activity like this one (#3469) * fix(a11y): reveal Copyable's CopyButton on focus-within (WCAG 2.1.1) (#3452) The Copyable primitive hides its CopyButton behind 'invisible group-hover:visible'. Tailwind's 'invisible' compiles to visibility: hidden, which removes the element from the focus order -- Tab skips it entirely. Mouse users can hover to reveal and click; keyboard users in default mode have no way to invoke copy at all. Add 'group-focus-within:visible' alongside the existing 'group-hover:visible' so the button becomes visible (and therefore focus-eligible) whenever focus moves anywhere inside the wrapping group -- typically when the user Tabs onto the slot's content (workflow IDs, run IDs, etc.). The next Tab now lands on the CopyButton, where Enter or Space triggers copy. Applied to both branches (clickAllToCopy and default mode). Affects detail-list value cells, event-summary rows, and every other Copyable consumer in default mode. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix: accept autocomplete prop on NumberInput, ChipInput, and Combobox (#3425) Allows consumers to pass WCAG-defined autocomplete tokens (e.g. "cc-number", "email") to these input primitives. All three previously hardcoded autocomplete="off", preventing purpose identification per WCAG 2.2 SC 1.3.5. Default remains "off" so existing behavior is unchanged. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix: cap ZoomSvg container height to viewport (#3428) Uses CSS min() to limit the container to the lesser of containerHeight (default 600px) or viewport height minus 8rem. On narrow landscape viewports (e.g. 320x500) the container now fits within the screen instead of overflowing. Desktop behavior is unchanged. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): accommodate text-spacing overrides on Badge and Chip (WCAG 1.4.12) (#3433) * fix(a11y): accommodate text-spacing overrides (WCAG 1.4.12) Three same-family fixes for SC 1.4.12 Text Spacing. WCAG requires that text-spacing user overrides (line-height 1.5, letter-spacing 0.12em, etc.) not cause content loss. - Badge: leading-4 (16px) -> leading-[1.5]. text-sm at 1.5 line- height is 21px which previously clipped. - Chip: h-7 -> min-h-7, add leading-[1.5]. Preserves the 28px visual minimum but allows growth. - Table row: h-8 -> min-h-8. The densest text-bearing surface in the product. Preserves the 32px default but allows growth under user override. Co-Authored-By: Claude Opus 4.6 <[email protected]> * revert(a11y): undo h-8 -> min-h-8 on table row Per reviewer feedback: <tr> uses table layout rules, where the height property already acts as a minimum (the row grows to fit cell content). min-height on <tr> is either ignored or behaves differently per browser. The change broke the skeleton table without providing the intended SC 1.4.12 benefit -- under text-spacing override, the row would have grown naturally. Badge and chip portions of the PR remain in place (those are flex elements where min-h-* works as expected). Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): non-color signal for Label required indicator (WCAG 1.4.1) (#3439) * fix(a11y): non-color signals for required state and timeline graph nodes (WCAG 1.4.1) Two SC 1.4.1 Use of Color fixes: - Label required-field indicator: replace the 6x6 red dot with a red asterisk (aria-hidden) so users with color-perception differences see a shape signal, not just a color signal. The programmatic required state continues to come from native HTML `required` on the input (which the 1.3.1 forwarders ensure). - Timeline graph nodes (workflow-row, history-graph-row-visual): add aria-label to the <g role="button"> wrapper so AT users hear the workflow id + status (or event type + classification) instead of bare "button". Removes the previous dependency on reaching the legend tooltip to decode color. New i18n keys: workflows.row-accessible-name, events.row-accessible-name. Co-Authored-By: Claude Opus 4.6 <[email protected]> * revert: remove timeline graph aria-label changes from this PR Per the PR scope decision, keep this PR focused on the Label required-indicator fix only. The timeline graph status accessible- name fix (workflow-row.svelte, history-graph-row-visual.svelte, and the supporting i18n keys) will ship as its own separate PR so the two SC 1.4.1 defects can be reviewed independently. Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix(a11y): use text-danger so the asterisk actually renders red The previous text-interactive-error class was a no-op for text color (interactive-error is only registered under backgroundColor in the theme plugin, not textColor), so the asterisk inherited the default text color and rendered black/off-white instead of red. text-danger maps to --color-text-danger (red.700 light / red.400 dark) which is the proper red text token. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: simplify required-asterisk span The parent <label> already provides text-sm and font-medium, so the span inherits both. Only text-danger is doing actual work; the size/weight/leading classes were redundant. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(label): refine required-asterisk visual alignment - font-mono: mono asterisks are larger and more geometrically centered than proportional ones, making them feel like a proper visual indicator rather than a tiny text-style superscript. - leading-none: tightens the span's line-box to the character. - translate-y-0.5: small downward nudge so the asterisk aligns with the label baseline rather than sitting above it. - -ml-1: reduces the gap to the preceding label text (8px -> 4px). Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): tabindex on <main> so the skip link moves focus reliably (WCAG 2.4.1) (#3451) The SkipNavigation primitive renders <a href="#content">, which targets <main id="content"> in main-content-container.svelte. By HTML spec, <main> without tabindex is not programmatically focusable -- so activating the skip link only reliably moves focus on Chromium-based browsers (Chrome, Edge). Safari and older Firefox scroll the target into view but leave focus on the skip link itself, defeating the bypass for keyboard and screen- reader users. Adding tabindex="-1" makes <main> programmatically focusable (so the hash-link navigation lands focus there) while keeping it out of the natural Tab order. Closes WCAG 2.4.1 sufficient- technique G1's "programmatically moves focus" requirement across all browsers. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): info-and-relationships compliance (WCAG 1.3.1) (#3432) Four related fixes under SC 1.3.1, grouped per the audit's correction of the matrix pathway: - NumberInput / Textarea: forward `required` to the underlying native element. Previously the visual red-dot appeared via <Label> but the field was not programmatically required, so AT users heard an optional-field announcement despite the visible indicator. - RadioGroup: add role="radiogroup" and link the optional description via aria-labelledby so AT users hear the group as a whole rather than each radio in isolation. - Tables: add scope="col" to every <th> in product data tables (workflows, schedules, workers, batch-operations, child/parent workflow relationships). Fixes WCAG technique H63. Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(query): quote ExecutionDuration Go duration strings in visibility SQL (#3482) ExecutionDuration is typed as INT in the search attributes store, so formatValue returns its values unquoted. PR #3435 (DT-4039) added an explicit unquoted INT path which broke ExecutionDuration because it uses Go duration strings (30s, 1m30s) that vitess rejects as unquoted tokens. Add an ExecutionDuration guard before the INT/duration paths: quote non-integer values as strings, pass plain integers (nanoseconds) through unquoted. * Passthrough goto params to link component (#3483) * feat: add centerButton, menuButton, and linksContent snippets to BottomNavigation (#3485) * feat: add centerButton snippet to BottomNavigation for custom center content * feat: add centerButton, menuButton, and linksContent snippets to BottomNavigation * feat: add bars icon to holocene icon set * fix: add "for" to validate connection modal title (#3488) The worker deployment version validate connection modal title now reads "Validate Connection for <version>" instead of "Validate Connection <version>". Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]> * feat(DT-4069): Update modal backdrop to 50% opaque (#3486) * refactor: Input & DatePicker - Svelte 5 & afterLabel snippet (#3479) * Fix decoded object payload summaries (#3491) * Fix decoded object payload summaries * Convert event details row to Svelte 5 * fix(DT-4044): only use browser codec endpoint when override option is selected (#3490) When the user selects "Use Namespace-level setting, where available" and no namespace codec is configured, the browser endpoint was incorrectly used as a fallback. Now returns empty string so no codec is invoked. * fix(a11y): improve 1.1.1 non-text content compliance (#3431) - nexus-empty-state.svelte: mark Andromeda illustration decorative with alt="" + aria-hidden on wrapper. Previously screen readers announced "Andromeda, image" (the filename), conveying nothing. - toast.svelte: add runtime fallback to translate('common.close') when closeButtonLabel is missing or empty. TypeScript-required prop still flags missing-at-compile-time, but an empty string or undefined at runtime now produces a labeled icon button rather than aria-label="". Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(a11y): make Tooltip keyboard-accessible, dismissible, and hoverable (#3429) * fix: make Tooltip keyboard-accessible, dismissible, and hoverable The Tooltip primitive was mouse-only: no focus handlers, no Escape dismiss, and portal tooltips disappeared when moving the pointer to the popover content. This failed all three WCAG 2.2 SC 1.4.13 criteria (Content on Hover or Focus). Changes: - Show tooltip on keyboard focus via focusin/focusout on wrapper - Dismiss on Escape (resets when interaction ends) - Track pointer hover on the popover itself (diagonal hover bridge) - Unify both portal and inline variants on a single isOpen derived - Add role="tooltip" and aria-describedby linkage for screen readers No API changes — all existing consumers work identically, with the added benefit that tooltips now appear on keyboard focus. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(tooltip): unify hover-zone handling and match repo patterns - Use <svelte:window on:keydown> instead of reactive document listener (mirrors maximizable.svelte) - Fix hover state lingering when mouse leaves popover to empty space by unifying wrapper + popover into a single hover zone - Extract HOVER_HIDE_DELAY_MS constant - Drop redundant isPopoverHovered state Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(tooltip): use crypto.randomUUID() for tooltip id Align tooltip id generation with the codebase convention used across Holocene (accordion.svelte, accordion-light.svelte) and the rest of the app, replacing the ad-hoc Math.random().toString(36) approach. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> * refactor(tooltip): drop unused group/tooltip class The group/tooltip marker only existed to drive the group-hover/tooltip: utilities that previously controlled visibility. Tooltip open/close is now fully JS-driven via isOpen, leaving this class with no consumers. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(a11y): name-role-value compliance, partial (WCAG 4.1.2) (#3434) * fix(a11y): name-role-value compliance (WCAG 4.1.2) Five fixes under SC 4.1.2 Name, Role, Value: - Accordion content panel: remove role="textbox". The disclosure panel is static content, not an editable text input; AT announced "edit text" on every Accordion consumer. - Accordion + AccordionLight: move slot="action" out of the disclosure <button> into a sibling element. Previously consumers placing focusable content in the action slot produced <button><button>... nested-interactive HTML. - CopyButton: ship translated default labels via i18n. Empty string defaults in CodeBlock previously propagated to an Icon that hid itself, producing unlabeled icon-only buttons across ~11 CodeBlock instances. - nav-section: filter out hidden nav items. The NavLinkItem.hidden flag was declared on the type and set at source but never consulted at render time, so Standalone Activities / Nexus links rendered as focusable for AT users on servers that cannot serve them. - Workflow family tree: add aria-label to the two SVG <g role="button"> widgets so screen readers announce node identity instead of "button". Deferred to follow-up PRs (audit blockers): - 4.1.2-button-anchor-empty: audit recommends a two-PR sequenced rollout (primitive change + consumer migration). - 4.1.2-codemirror-no-name: ~5 CodeBlock consumer surfaces need design input on label content. - relationships nested-interactive restructure: site B (button wraps Link) and site A's nested <a> extraction are substantial SVG/HTML restructures separate from the labeling fix above. Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix(a11y): localize workflow family-tree node aria-labels The family-tree node aria-labels hardcoded the English word "Workflow", inconsistent with the codebase convention of localizing aria-labels via translate(). Add a parameterized workflows.family-node-label i18n key and use it for both the root and child node widgets. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * feat(nexus-operations): standalone nexus operation details page [DT-4002] Add tab-based detail view for individual nexus operations with live long-polling. Mirrors standalone activity detail page pattern with nexus-specific fields: identity, operation, status, timing, attempt, timeout config, cancellation info, nexus header, and input/outcome payload display. * feat(nexus-operations): redesign details page to match Figma layout Restructure the details page around "Operation Event History" with three subsections: Run Details, Operation Details, Timeout Configuration. - Add filterable links for endpoint, service, and operation fields - Add handler namespace and handler operation link from nexus operation links - Show nexus header code block inline in Operation Details section - Move last attempt failure into the Attempt section (conditional) - Add handler namespace note when handler workflow link is present * fix(nexus-operations): pass namespace to filter links on details page * fix nexus operation id --------- Co-authored-by: Andrew Zamojc <[email protected]> Co-authored-by: Alex Tideman <[email protected]> Co-authored-by: Ardie Wen <[email protected]> Co-authored-by: Tegan Churchill <[email protected]> Co-authored-by: Ross Nelson <[email protected]> Co-authored-by: Alex Thomsen <[email protected]> Co-authored-by: Bilal Karim <[email protected]> Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]>
| return metadata; | ||
| }; | ||
| </script> | ||
|
|
There was a problem hiding this comment.
⚠️ Argument of type 'IUserMetadata | undefined' is not assignable to parameter of type 'IUserMetadata'.
| @@ -46,6 +46,7 @@ export class StandaloneActivityPoller { | |||
| ); | |||
| } catch (error) { | |||
There was a problem hiding this comment.
⚠️ Argument of type 'unknown' is not assignable to parameter of type 'Error'.
…type with StatusCounts prop Return Promise<Required<CountWorkflowExecutionsResponse>> and default groups to [] to match the pattern used by fetchWorkflowCountByExecutionStatus.
…ncel/terminate) [DT-4008] (#3504) * feat(nexus-operations): add cancel/terminate modals and actions to nexus operation header [DT-4008] Add cancel confirmation modal, terminate confirmation modal, and nexus operation actions component. Wire actions into the header with Request Cancellation button and More Actions menu (Terminate + Start Like This One). Add route-for helper and i18n strings for the start form. * feat(nexus-operations): add start standalone nexus operation form and route [DT-4008] Adds the start nexus operation form with fields for operation ID (with random UUID generation), endpoint, service, operation name, payload input, timeouts, and advanced options (nexus header, search attributes, user metadata, ID policies). * feat(nexus-operations): pre-fill input payload when starting nexus operation like this one [DT-4008] Adds fetchInitialValuesForStartNexusOperation to decode the source operation's input payload, encoding, message type, user metadata, and search attributes. The start form pre-populates these fields on mount when operationId and runId are present in the URL, and auto-expands advanced options when there is pre-filled data.
| message: translate('standalone-nexus-operations.cancel-success'), | ||
| }); | ||
| onConfirm(); | ||
| } catch (err: unknown) { |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| message: translate('standalone-nexus-operations.terminate-success'), | ||
| }); | ||
| onConfirm(); | ||
| } catch (err: unknown) { |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| ...(query ? { query } : {}), | ||
| }, | ||
| request, | ||
| onError, |
There was a problem hiding this comment.
⚠️ Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
| } | ||
|
|
||
| if (formData.searchAttributes) { | ||
| searchAttributes = { |
There was a problem hiding this comment.
⚠️ Type '{ indexedFields?: ({ [k: string]: temporal.api.common.v1.IPayload; } | null); }' is not assignable to type '{ [k: string]: IPayload; }'.
|
|
||
| if (formData.searchAttributes) { | ||
| searchAttributes = { | ||
| indexedFields: { |
There was a problem hiding this comment.
⚠️ Argument of type 'Record<string, unknown>[]' is not assignable to parameter of type '{ type: "Unspecified" | "Keyword" | "Text" | "Int" | "Double" | "Bool" | "KeywordList" | "Datetime"; label: string; value?: any; }[]'.
| private abortController: AbortController; | ||
| private namespace: string; | ||
| private operationId: string; | ||
| private runId: string; |
There was a problem hiding this comment.
⚠️ Property 'token' has no initializer and is not definitely assigned in the constructor.
| this.namespace, | ||
| this.operationId, | ||
| ); | ||
| } catch (error) { |
There was a problem hiding this comment.
⚠️ Argument of type 'unknown' is not assignable to parameter of type 'Error'.
| if ( | ||
| nexusOperationExecution.info.status === | ||
| 'NEXUS_OPERATION_EXECUTION_STATUS_RUNNING' | ||
| ) { |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| if ( | ||
| polledNexusOperationExecution && | ||
| !isEmptyObject(polledNexusOperationExecution) | ||
| ) { |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| if (error instanceof Error && error.name === 'AbortError') { | ||
| return; | ||
| } | ||
|
|
There was a problem hiding this comment.
⚠️ Argument of type 'unknown' is not assignable to parameter of type 'Error'.
… (409) When the API returns 409 for a rejected duplicate operation ID, display an error toast, a field-level hint on the operationId input, and focus the field.
…ailed-only policy When idReusePolicy is ALLOW_DUPLICATE_FAILED_ONLY and a 409 is returned, show a distinct toast and field-level error indicating the ID is in use by a completed operation.
| let { namespace, children, fallback }: Props = $props(); | ||
|
|
||
| const capabilityState = $derived( | ||
| namespaceCapabilityState( |
There was a problem hiding this comment.
⚠️ Argument of type 'ICapabilities | null | undefined' is not assignable to parameter of type 'NamespaceCapabilities | undefined'.
| const { namespace }: Props = $props(); | ||
|
|
||
| const formDefaults = $derived<StartNexusOperationFormDefaults>({ | ||
| namespace, |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| SPA: true, | ||
| dataType: 'json', | ||
| resetForm: false, | ||
| invalidateAll: false, |
There was a problem hiding this comment.
⚠️ Type 'ClientValidationAdapter<{ encoding: "json/plain" | "json/protobuf"; namespace: string; endpoint: string; service: string; operation: string; identity: string; nexusHeader: { key: string; value: string; }[]; summary?: string | undefined; ... 8 more ...; idConflictPolicy?: string | undefined; }, { ...; }>' is not assignable to type 'ClientValidationAdapter<Partial<{ input: string; messageType: string; scheduleToStartTimeout: string; summary: string; details: string; idReusePolicy: string; idConflictPolicy: string; nexusHeader: never[]; encoding: "json/plain" | "json/protobuf"; ... 7 more ...; scheduleToCloseTimeout: string | undefined; }>, Reco...'.
| $form.operationId = crypto.randomUUID(); | ||
| }; | ||
|
|
||
| const addNexusHeader = () => { |
There was a problem hiding this comment.
⚠️ Type '{ key: string; value: string; }' is not assignable to type 'never'.⚠️ Type '{ key: string; value: string; }' is not assignable to type 'never'.
| labelHidden | ||
| placeholder={translate( | ||
| 'standalone-nexus-operations.form-nexus-header-key-placeholder', | ||
| )} |
There was a problem hiding this comment.
⚠️ Property 'key' does not exist on type 'never'.
| id="drawer-scheduleToCloseTimeout" | ||
| label={translate( | ||
| 'standalone-nexus-operations.form-schedule-to-close-timeout-label', | ||
| )} |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| id="drawer-scheduleToStartTimeout" | ||
| label={translate( | ||
| 'standalone-nexus-operations.form-schedule-to-start-timeout-label', | ||
| )} |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| id="drawer-startToCloseTimeout" | ||
| label={translate( | ||
| 'standalone-nexus-operations.form-start-to-close-timeout-label', | ||
| )} |
There was a problem hiding this comment.
⚠️ Type 'string | undefined' is not assignable to type 'string'.
| ); | ||
|
|
||
| const nexusOperationsLinkHidden = $derived.by(() => { | ||
| const namespace = $namespaces.find( |
There was a problem hiding this comment.
⚠️ 'namespace.namespaceInfo' is possibly 'null' or 'undefined'.
| const namespace = $namespaces.find( | ||
| (namespace) => namespace.namespaceInfo.name === activeNamespaceName, | ||
| ); | ||
| const capabilityState = namespaceCapabilityState( |
There was a problem hiding this comment.
⚠️ Argument of type 'ICapabilities | null | undefined' is not assignable to parameter of type 'NamespaceCapabilities | undefined'.
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)
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)
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 <[email protected]>
* feat(nexus-operations): DT-4005 standalone nexus operations API integrations (#3444) * feat(nexus-operations): add types and API routes for standalone nexus operations Adds NexusOperationExecution types, extends APIRouteParameters with operationId, and registers 6 new API routes (list, describe/start, poll, cancel, terminate, count). Adds route-for helpers mirroring the standalone activities pattern. DT-4005 * feat(nexus-operations): add services for standalone nexus operations Adds fetchPaginatedNexusOperations, startStandaloneNexusOperation, getNexusOperationExecution, pollNexusOperationExecution, cancel, and terminate. Adds count and count-by-status service functions. DT-4005 * feat(nexus-operations): add stores, poller, and filters for standalone nexus operations Adds nexus operation writable stores (refresh, loading, updating, count, error, query). Adds StandaloneNexusOperationPoller with long-poll loop mirroring the activity poller. Adds nexusOperationFilters store to filters.ts. DT-4005 * test(nexus-operations): add route-for-base-path test cases for standalone nexus operations * feat(nexus-operations): add capability flag, guard component, and configurable table columns (#3466) Adds Phase 2 (DT-4006) infrastructure for standalone nexus operations: - NamespaceCapabilities type with standaloneNexusOperations field in src/lib/types/index.ts - Guard component that checks both capability flag and minimum server version (1.31.0) - Disabled state component with Dynamic Config instructions - i18n namespace for standalone-nexus-operations - TABLE_TYPE.NEXUS_OPERATIONS, NexusOperationHeaderLabels, default/available column arrays, persistedNexusOperationsTableColumns store, configurableTableColumns derived store update, availableNexusOperationColumns export, and exhaustive switch cases in configurable-table-columns.ts * feat(nexus-operations): standalone nexus operations list page [DT-4003] (#3470) * feat(nexus-operations): add standalone nexus operations list page - Add list page route at namespaces/[namespace]/nexus-operations - Add page component with status count filters and configurable table - Add filter bar with search attribute support - Add configurable table with header/body cells and empty state - Add get-nexus-operation-status-and-count utility and tests - Add nexus operation search attributes to search-attributes store - Wire nav layout item for standalone nexus operations - Add i18n strings for nexus operations page * feat(nexus-operations): add saved views panel, CTA button, and rich empty state Match Figma design for standalone nexus operations list page: - Add saved views panel with system/user views, expand/collapse, save/edit/delete/share - Add 'Start a Standalone Nexus Operation' CTA button via headerActions snippet - Add rich empty state with value proposition, docs links, and GitHub code samples - Add i18n strings for all new UI copy - Add savedNexusQueryNavOpen persist store and savedNexusQueries/systemNexusViews stores * Update api version to v1.62.12 for SANO APIs and capability * fix capability name * feat(nexus-operations): standalone nexus operation details page [DT-4002] (#3495) * [DT-4039] Workflow query builder doesn't work with numeric search attributes (#3435) * fix(DT-4039): Workflow query builder for numeric search attributes The query builder wrapped Int/Double search attribute values in double quotes (e.g. `Foo="1"`), which the Visibility backend rejects for numeric types. Stop quoting numeric values in the serializer. The tokenizer also merged unquoted values with their conditional operator (e.g. `Foo=1` tokenized as `Foo`, `=1`), which previously only mattered for booleans and was patched in the parser by stripping `=`. With numerics this breaks down for 2-char operators (`>=`, `<=`, `!=`). Fix the tokenizer to emit the conditional as its own token and to accept operator-style 2-char conditionals without a trailing space. Update the boolean parser to read the value from `tokenTwoAhead` to match the new shape. * fix(DT-4039): Update integration tests for unquoted numeric search attributes The desktop and mobile workflow-filter specs asserted the previous buggy serialization (`HistoryLength`="10"). Update them to match the new correct shape (`HistoryLength`=10). * Make Common Errors dismissable (#3471) * Make common errors dismissable * Remove common errors * Capitalize Common Errors * Add description * Update description * [DT-4048] Add accessibility PR triage and notification helpers (#3465) * Implement helpers for accessibility PRs * fix formatting * fix linting * fix title gating regex * improve deduplication detection on notify * Move CLAUDE.md a11y conventions to DT-4049 * feat(DT-4017): Schedules List UI Update (#3467) * fix(markdown): allow nested lists to render as block (DT-4047) (#3463) * Add a prop to hide select/deselect controls (#3474) * DT-4051: pre-populate input when starting standalone activity like this one (#3469) * fix(a11y): reveal Copyable's CopyButton on focus-within (WCAG 2.1.1) (#3452) The Copyable primitive hides its CopyButton behind 'invisible group-hover:visible'. Tailwind's 'invisible' compiles to visibility: hidden, which removes the element from the focus order -- Tab skips it entirely. Mouse users can hover to reveal and click; keyboard users in default mode have no way to invoke copy at all. Add 'group-focus-within:visible' alongside the existing 'group-hover:visible' so the button becomes visible (and therefore focus-eligible) whenever focus moves anywhere inside the wrapping group -- typically when the user Tabs onto the slot's content (workflow IDs, run IDs, etc.). The next Tab now lands on the CopyButton, where Enter or Space triggers copy. Applied to both branches (clickAllToCopy and default mode). Affects detail-list value cells, event-summary rows, and every other Copyable consumer in default mode. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix: accept autocomplete prop on NumberInput, ChipInput, and Combobox (#3425) Allows consumers to pass WCAG-defined autocomplete tokens (e.g. "cc-number", "email") to these input primitives. All three previously hardcoded autocomplete="off", preventing purpose identification per WCAG 2.2 SC 1.3.5. Default remains "off" so existing behavior is unchanged. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix: cap ZoomSvg container height to viewport (#3428) Uses CSS min() to limit the container to the lesser of containerHeight (default 600px) or viewport height minus 8rem. On narrow landscape viewports (e.g. 320x500) the container now fits within the screen instead of overflowing. Desktop behavior is unchanged. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): accommodate text-spacing overrides on Badge and Chip (WCAG 1.4.12) (#3433) * fix(a11y): accommodate text-spacing overrides (WCAG 1.4.12) Three same-family fixes for SC 1.4.12 Text Spacing. WCAG requires that text-spacing user overrides (line-height 1.5, letter-spacing 0.12em, etc.) not cause content loss. - Badge: leading-4 (16px) -> leading-[1.5]. text-sm at 1.5 line- height is 21px which previously clipped. - Chip: h-7 -> min-h-7, add leading-[1.5]. Preserves the 28px visual minimum but allows growth. - Table row: h-8 -> min-h-8. The densest text-bearing surface in the product. Preserves the 32px default but allows growth under user override. Co-Authored-By: Claude Opus 4.6 <[email protected]> * revert(a11y): undo h-8 -> min-h-8 on table row Per reviewer feedback: <tr> uses table layout rules, where the height property already acts as a minimum (the row grows to fit cell content). min-height on <tr> is either ignored or behaves differently per browser. The change broke the skeleton table without providing the intended SC 1.4.12 benefit -- under text-spacing override, the row would have grown naturally. Badge and chip portions of the PR remain in place (those are flex elements where min-h-* works as expected). Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): non-color signal for Label required indicator (WCAG 1.4.1) (#3439) * fix(a11y): non-color signals for required state and timeline graph nodes (WCAG 1.4.1) Two SC 1.4.1 Use of Color fixes: - Label required-field indicator: replace the 6x6 red dot with a red asterisk (aria-hidden) so users with color-perception differences see a shape signal, not just a color signal. The programmatic required state continues to come from native HTML `required` on the input (which the 1.3.1 forwarders ensure). - Timeline graph nodes (workflow-row, history-graph-row-visual): add aria-label to the <g role="button"> wrapper so AT users hear the workflow id + status (or event type + classification) instead of bare "button". Removes the previous dependency on reaching the legend tooltip to decode color. New i18n keys: workflows.row-accessible-name, events.row-accessible-name. Co-Authored-By: Claude Opus 4.6 <[email protected]> * revert: remove timeline graph aria-label changes from this PR Per the PR scope decision, keep this PR focused on the Label required-indicator fix only. The timeline graph status accessible- name fix (workflow-row.svelte, history-graph-row-visual.svelte, and the supporting i18n keys) will ship as its own separate PR so the two SC 1.4.1 defects can be reviewed independently. Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix(a11y): use text-danger so the asterisk actually renders red The previous text-interactive-error class was a no-op for text color (interactive-error is only registered under backgroundColor in the theme plugin, not textColor), so the asterisk inherited the default text color and rendered black/off-white instead of red. text-danger maps to --color-text-danger (red.700 light / red.400 dark) which is the proper red text token. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: simplify required-asterisk span The parent <label> already provides text-sm and font-medium, so the span inherits both. Only text-danger is doing actual work; the size/weight/leading classes were redundant. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(label): refine required-asterisk visual alignment - font-mono: mono asterisks are larger and more geometrically centered than proportional ones, making them feel like a proper visual indicator rather than a tiny text-style superscript. - leading-none: tightens the span's line-box to the character. - translate-y-0.5: small downward nudge so the asterisk aligns with the label baseline rather than sitting above it. - -ml-1: reduces the gap to the preceding label text (8px -> 4px). Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): tabindex on <main> so the skip link moves focus reliably (WCAG 2.4.1) (#3451) The SkipNavigation primitive renders <a href="#content">, which targets <main id="content"> in main-content-container.svelte. By HTML spec, <main> without tabindex is not programmatically focusable -- so activating the skip link only reliably moves focus on Chromium-based browsers (Chrome, Edge). Safari and older Firefox scroll the target into view but leave focus on the skip link itself, defeating the bypass for keyboard and screen- reader users. Adding tabindex="-1" makes <main> programmatically focusable (so the hash-link navigation lands focus there) while keeping it out of the natural Tab order. Closes WCAG 2.4.1 sufficient- technique G1's "programmatically moves focus" requirement across all browsers. Co-authored-by: Claude Opus 4.6 <[email protected]> * fix(a11y): info-and-relationships compliance (WCAG 1.3.1) (#3432) Four related fixes under SC 1.3.1, grouped per the audit's correction of the matrix pathway: - NumberInput / Textarea: forward `required` to the underlying native element. Previously the visual red-dot appeared via <Label> but the field was not programmatically required, so AT users heard an optional-field announcement despite the visible indicator. - RadioGroup: add role="radiogroup" and link the optional description via aria-labelledby so AT users hear the group as a whole rather than each radio in isolation. - Tables: add scope="col" to every <th> in product data tables (workflows, schedules, workers, batch-operations, child/parent workflow relationships). Fixes WCAG technique H63. Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(query): quote ExecutionDuration Go duration strings in visibility SQL (#3482) ExecutionDuration is typed as INT in the search attributes store, so formatValue returns its values unquoted. PR #3435 (DT-4039) added an explicit unquoted INT path which broke ExecutionDuration because it uses Go duration strings (30s, 1m30s) that vitess rejects as unquoted tokens. Add an ExecutionDuration guard before the INT/duration paths: quote non-integer values as strings, pass plain integers (nanoseconds) through unquoted. * Passthrough goto params to link component (#3483) * feat: add centerButton, menuButton, and linksContent snippets to BottomNavigation (#3485) * feat: add centerButton snippet to BottomNavigation for custom center content * feat: add centerButton, menuButton, and linksContent snippets to BottomNavigation * feat: add bars icon to holocene icon set * fix: add "for" to validate connection modal title (#3488) The worker deployment version validate connection modal title now reads "Validate Connection for <version>" instead of "Validate Connection <version>". Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]> * feat(DT-4069): Update modal backdrop to 50% opaque (#3486) * refactor: Input & DatePicker - Svelte 5 & afterLabel snippet (#3479) * Fix decoded object payload summaries (#3491) * Fix decoded object payload summaries * Convert event details row to Svelte 5 * fix(DT-4044): only use browser codec endpoint when override option is selected (#3490) When the user selects "Use Namespace-level setting, where available" and no namespace codec is configured, the browser endpoint was incorrectly used as a fallback. Now returns empty string so no codec is invoked. * fix(a11y): improve 1.1.1 non-text content compliance (#3431) - nexus-empty-state.svelte: mark Andromeda illustration decorative with alt="" + aria-hidden on wrapper. Previously screen readers announced "Andromeda, image" (the filename), conveying nothing. - toast.svelte: add runtime fallback to translate('common.close') when closeButtonLabel is missing or empty. TypeScript-required prop still flags missing-at-compile-time, but an empty string or undefined at runtime now produces a labeled icon button rather than aria-label="". Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(a11y): make Tooltip keyboard-accessible, dismissible, and hoverable (#3429) * fix: make Tooltip keyboard-accessible, dismissible, and hoverable The Tooltip primitive was mouse-only: no focus handlers, no Escape dismiss, and portal tooltips disappeared when moving the pointer to the popover content. This failed all three WCAG 2.2 SC 1.4.13 criteria (Content on Hover or Focus). Changes: - Show tooltip on keyboard focus via focusin/focusout on wrapper - Dismiss on Escape (resets when interaction ends) - Track pointer hover on the popover itself (diagonal hover bridge) - Unify both portal and inline variants on a single isOpen derived - Add role="tooltip" and aria-describedby linkage for screen readers No API changes — all existing consumers work identically, with the added benefit that tooltips now appear on keyboard focus. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(tooltip): unify hover-zone handling and match repo patterns - Use <svelte:window on:keydown> instead of reactive document listener (mirrors maximizable.svelte) - Fix hover state lingering when mouse leaves popover to empty space by unifying wrapper + popover into a single hover zone - Extract HOVER_HIDE_DELAY_MS constant - Drop redundant isPopoverHovered state Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(tooltip): use crypto.randomUUID() for tooltip id Align tooltip id generation with the codebase convention used across Holocene (accordion.svelte, accordion-light.svelte) and the rest of the app, replacing the ad-hoc Math.random().toString(36) approach. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> * refactor(tooltip): drop unused group/tooltip class The group/tooltip marker only existed to drive the group-hover/tooltip: utilities that previously controlled visibility. Tooltip open/close is now fully JS-driven via isOpen, leaving this class with no consumers. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(a11y): name-role-value compliance, partial (WCAG 4.1.2) (#3434) * fix(a11y): name-role-value compliance (WCAG 4.1.2) Five fixes under SC 4.1.2 Name, Role, Value: - Accordion content panel: remove role="textbox". The disclosure panel is static content, not an editable text input; AT announced "edit text" on every Accordion consumer. - Accordion + AccordionLight: move slot="action" out of the disclosure <button> into a sibling element. Previously consumers placing focusable content in the action slot produced <button><button>... nested-interactive HTML. - CopyButton: ship translated default labels via i18n. Empty string defaults in CodeBlock previously propagated to an Icon that hid itself, producing unlabeled icon-only buttons across ~11 CodeBlock instances. - nav-section: filter out hidden nav items. The NavLinkItem.hidden flag was declared on the type and set at source but never consulted at render time, so Standalone Activities / Nexus links rendered as focusable for AT users on servers that cannot serve them. - Workflow family tree: add aria-label to the two SVG <g role="button"> widgets so screen readers announce node identity instead of "button". Deferred to follow-up PRs (audit blockers): - 4.1.2-button-anchor-empty: audit recommends a two-PR sequenced rollout (primitive change + consumer migration). - 4.1.2-codemirror-no-name: ~5 CodeBlock consumer surfaces need design input on label content. - relationships nested-interactive restructure: site B (button wraps Link) and site A's nested <a> extraction are substantial SVG/HTML restructures separate from the labeling fix above. Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix(a11y): localize workflow family-tree node aria-labels The family-tree node aria-labels hardcoded the English word "Workflow", inconsistent with the codebase convention of localizing aria-labels via translate(). Add a parameterized workflows.family-node-label i18n key and use it for both the root and child node widgets. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * feat(nexus-operations): standalone nexus operation details page [DT-4002] Add tab-based detail view for individual nexus operations with live long-polling. Mirrors standalone activity detail page pattern with nexus-specific fields: identity, operation, status, timing, attempt, timeout config, cancellation info, nexus header, and input/outcome payload display. * feat(nexus-operations): redesign details page to match Figma layout Restructure the details page around "Operation Event History" with three subsections: Run Details, Operation Details, Timeout Configuration. - Add filterable links for endpoint, service, and operation fields - Add handler namespace and handler operation link from nexus operation links - Show nexus header code block inline in Operation Details section - Move last attempt failure into the Attempt section (conditional) - Add handler namespace note when handler workflow link is present * fix(nexus-operations): pass namespace to filter links on details page * fix nexus operation id --------- Co-authored-by: Andrew Zamojc <[email protected]> Co-authored-by: Alex Tideman <[email protected]> Co-authored-by: Ardie Wen <[email protected]> Co-authored-by: Tegan Churchill <[email protected]> Co-authored-by: Ross Nelson <[email protected]> Co-authored-by: Alex Thomsen <[email protected]> Co-authored-by: Bilal Karim <[email protected]> Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> * fix(nexus-operations): align fetchNexusOperationCountByStatus return type with StatusCounts prop Return Promise<Required<CountWorkflowExecutionsResponse>> and default groups to [] to match the pattern used by fetchWorkflowCountByExecutionStatus. * feat(nexus-operations): standalone nexus operation commands (start/cancel/terminate) [DT-4008] (#3504) * feat(nexus-operations): add cancel/terminate modals and actions to nexus operation header [DT-4008] Add cancel confirmation modal, terminate confirmation modal, and nexus operation actions component. Wire actions into the header with Request Cancellation button and More Actions menu (Terminate + Start Like This One). Add route-for helper and i18n strings for the start form. * feat(nexus-operations): add start standalone nexus operation form and route [DT-4008] Adds the start nexus operation form with fields for operation ID (with random UUID generation), endpoint, service, operation name, payload input, timeouts, and advanced options (nexus header, search attributes, user metadata, ID policies). * feat(nexus-operations): pre-fill input payload when starting nexus operation like this one [DT-4008] Adds fetchInitialValuesForStartNexusOperation to decode the source operation's input payload, encoding, message type, user metadata, and search attributes. The start form pre-populates these fields on mount when operationId and runId are present in the URL, and auto-expands advanced options when there is pre-filled data. * fix nav width for cloud * add cloud escape hatch to SANO guard * add a guard for SANO actions * fix SANO system saved views * add runId to routes, links, etc. and fix table columns * fix import * fix case of runId * fix details * Fix links to use Links property, fix Result/Failure type and rendering, don't make timeouts required * remove version check from guard * fix tests * add integration tests * update start SANO form to match current designs * fix breadcrumb text * add close time to default columns * fix(sano): show field-level error and toast on duplicate operation ID (409) When the API returns 409 for a rejected duplicate operation ID, display an error toast, a field-level hint on the operationId input, and focus the field. * fix(sano): show completed operation error state for allow-duplicate-failed-only policy When idReusePolicy is ALLOW_DUPLICATE_FAILED_ONLY and a 409 is returned, show a distinct toast and field-level error indicating the ID is in use by a completed operation. * fix(sano): show conflict error state for use-existing ID conflict policy * refactor(sano): extract 409 error handlers from onUpdate catch block --------- Co-authored-by: Andrew Zamojc <[email protected]> Co-authored-by: Alex Tideman <[email protected]> Co-authored-by: Ardie Wen <[email protected]> Co-authored-by: Tegan Churchill <[email protected]> Co-authored-by: Ross Nelson <[email protected]> Co-authored-by: Alex Thomsen <[email protected]> Co-authored-by: Bilal Karim <[email protected]> Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Ardie Wen <[email protected]> Co-authored-by: Your Name <[email protected]>
Description & motivation 💭
Implements the full Standalone Nexus Operations (SANO) feature in the UI — a new section that lets users list, inspect, and act on Nexus operation executions independently of a workflow, backed by the new SANO APIs.
The feature is gated behind a server capability flag (
nexusOperations) and hidden by default in Cloud environments, with an escape hatch configurable via dynamic config.API layer (
DT-4005):routeForApi/route-for-api.tsstandalone-nexus-operations.tsservice with paginated list, get, poll, start, cancel, and terminate functionsnexus-operation-counts.tsfor status aggregation used by filter chipsTypes & stores (
DT-4005):NexusOperationExecution,NexusOperationExecutionInfo,NexusOperationExecutionListInfo,StartNexusOperationExecutionRequest/Response, and ID policy enums/types innexus-operation-execution.tsnexus-operationsstore for error state and search paramsGuard & navigation (
DT-4006):StandaloneNexusOperationsGuardchecks the capability flag before rendering the featurestandaloneNexusOperationsCommandsDisabledutility for Cloud environmentsList page (
DT-4003):/namespaces/[namespace]/nexus-operationsget-nexus-operation-status-and-count.tsDetails page (
DT-4002):/namespaces/[namespace]/nexus-operations/[operationId]/[runId]StandaloneNexusOperationPollerwith long-poll token supportCommands (
DT-4008):cancelNexusOperationExecution, disabled when not runningterminateNexusOperationExecution, disabled when not runningrunId; on mount, fetches and decodes the source operation's input payload, encoding, message type, user metadata, and search attributes/namespaces/[namespace]/nexus-operations/startwith all fields, timeouts card, and advanced options (nexus header, search attributes, user metadata, ID policies)Screenshots (if applicable) 📸
Design Considerations 🎨
superForm+zodClientpattern as the activity start form; payload pre-fill mirrors #3469Testing 🧪
How was this tested 👻
get-nexus-operation-status-and-count.test.ts,route-for-base-path.test.ts)Steps for others to test: 🚶🏽♂️🚶🏽♀️
/namespaces/default/nexus-operations— verify the list loads with filter chips and saved viewsnexusOperationscapability flag is absentChecklists
Draft Checklist
pnpm check --threshold error)Merge Checklist
Issue(s) closed
DT-4001, DT-4002, DT-4003, DT-4005, DT-4006, DT-4008
Docs
Any docs updates needed?
No external docs changes — feature is gated and self-contained in the UI.