Skip to content

Conversation

@laurakwhit
Copy link
Collaborator

@laurakwhit laurakwhit commented Jan 24, 2026

Description & motivation 💭

  • Adds a Pause button to the Workflow details page
  • Adds an Unpause button to the Workflow details page
  • Shows an alert on the Workflow details page if the Workflow is paused
  • All activities in the Timeline should show as paused if the Workflow is paused

Screenshots (if applicable) 📸

Screenshot 2026-01-29 at 3 34 45 PM
Screenshot 2026-01-23 at 5 19 34 PM Screenshot 2026-01-29 at 2 50 23 PM
Screenshot 2026-01-23 at 5 17 56 PM Screenshot 2026-01-23 at 5 17 13 PM

Design Considerations 🎨

Testing 🧪

How was this tested 👻

  • Manual testing
  • E2E tests added
  • Unit tests added

Steps for others to test: 🚶🏽‍♂️🚶🏽‍♀️

Run temporal server from a local build

  1. Ensure you have cloned the temporal repo
  2. Set WorkflowPauseEnabled to true
  3. Run make bins and make start
  4. Running temporal server from a local build does not create the namespace, run temporal operator namespace create --namespace canary
  5. Create a search attribute for the canary namespace, run temporal operator search-attribute create --namespace default --name CustomKeywordField --type Keyword

Run the UI against a local build of temporal server

  1. Checkout the workflow-pause branch in the UI repo
  2. Make sure the API version here matches the one defined for the server here
  3. cd server/ && make build
  4. cd .. && pnpm dev:local-temporal

Run some sample workflows in the canary-go repo

  1. Run make bins and ./temporal-canary start

With namespaceInfo> capabilities > workflowPause disabled > go to a Running workflow

  • Verify Pause Workflow is not visible

With namespaceInfo> capabilities > workflowPause enabled > go to a Running workflow

  • if the workflow is delayed
    • Verify Pause Workflow is not visible
  • if the workflow has a task failure (?)
    • Verify Pause Workflow is not visible
  • otherwise, select Pause Workflow > enter a reason and confirm
    • Verify there is a success toast
    • Verify the status of the Workflow is updated to Paused and button switches to Unpause Workflow
    • Verify there is an alert with the reason the Workflow was paused on the Workflow details page with the reason and pause started time
    • Verify the More Actions > Send an Update is disabled
    • Verify other actions under More Actions can be completed successfully (?)

Select Unpause Workflow > enter a reason and confirm

  • Verify there is a success toast
  • Verify the status of the Workflow is updated
  • Verify there is no longer an alert r.e. Workflow pause on the Workflow details page

Checklists

Draft Checklist

Merge Checklist

Issue(s) closed

DT-3566

Docs

Any docs updates needed?

@vercel
Copy link

vercel bot commented Jan 24, 2026

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

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment Jan 30, 2026 5:36am

Request Review

@temporal-cicd
Copy link
Contributor

temporal-cicd bot commented Jan 24, 2026

Warnings
⚠️

📊 Strict Mode: 145 errors in 19 files (13.3% of 1091 total)

src/lib/stores/workflow-run.ts (1)
  • L31:2: Type 'undefined' is not assignable to type 'WorkflowMetadata'.
src/lib/utilities/route-for-api.ts (8)
  • L63:48: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.
  • L69:50: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.
  • L71:4: Type 'string | null' is not assignable to type 'string'.
  • L98:8: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ namespace: string; workflowId: string; scheduleId: string; queue: string; queryType: string; signalName: string; updateName: string; batchJobId: string; runId: string; activityId: string; endpointId: string; deploymentName: string; version: string; }'.
  • L98:38: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Partial'.
  • L100:8: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ namespace: string; workflowId: string; scheduleId: string; queue: string; queryType: string; signalName: string; updateName: string; batchJobId: string; runId: string; activityId: string; endpointId: string; deploymentName: string; version: string; }'.
  • L100:57: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Partial'.
  • L179:16: This overload signature is not compatible with its implementation signature.
src/lib/services/events-service.ts (11)
  • L69:43: Argument of type 'EventSortOrder | undefined' is not assignable to parameter of type 'EventSortOrder'.
  • L72:4: Argument of type '(token: string) => Promise' is not assignable to parameter of type '(token?: NextPageToken | undefined) => Promise'.
  • L82:18: Property 'history' does not exist on type 'WithoutNextPageToken'.
  • L102:20: Parameter 'full' implicitly has an 'any' type.
  • L102:26: Parameter 'current' implicitly has an 'any' type.
  • L108:19: Parameter 'e' implicitly has an 'any' type.
  • L122:4: Argument of type '(token: string) => Promise' is not assignable to parameter of type '(token?: NextPageToken | undefined) => Promise'.
  • L136:17: Property 'history' does not exist on type 'WithoutNextPageToken'.
  • L137:50: Property 'history' does not exist on type 'WithoutNextPageToken'.
  • L148:28: No overload matches this call.
  • L189:6: No overload matches this call.
src/lib/models/workflow-execution.ts (55)
  • L49:50: Argument of type 'PendingNexusOperationState | null | undefined' is not assignable to parameter of type 'PendingNexusOperationState | undefined'.
  • L57:4: Type '{ state: temporal.api.enums.v1.CallbackState; callback?: (temporal.api.common.v1.ICallback | null); trigger?: (temporal.api.workflow.v1.CallbackInfo.ITrigger | null); ... 5 more ...; blockedReason?: (string | null); }' is not assignable to type 'Callback'.
  • L59:37: Argument of type 'CallbackState | null | undefined' is not assignable to parameter of type 'CallbackState | undefined'.
  • L90:36: Type 'undefined' is not assignable to type 'string'.
  • L96:2: Type 'undefined' is not assignable to type 'string'.
  • L103:4: 'response' is possibly 'undefined'.
  • L103:4: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L103:4: Argument of type 'WorkflowSearchAttributes | undefined' is not assignable to parameter of type 'WorkflowSearchAttributes'.
  • L105:15: 'response' is possibly 'undefined'.
  • L105:15: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L106:15: 'response' is possibly 'undefined'.
  • L106:15: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L106:15: 'response.workflowExecutionInfo.type' is possibly 'null' or 'undefined'.
  • L107:13: 'response' is possibly 'undefined'.
  • L107:13: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L107:13: 'response.workflowExecutionInfo.execution' is possibly 'null' or 'undefined'.
  • L108:16: 'response' is possibly 'undefined'.
  • L108:16: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L108:16: 'response.workflowExecutionInfo.execution' is possibly 'null' or 'undefined'.
  • L109:20: 'response' is possibly 'undefined'.
  • L109:20: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L110:18: 'response' is possibly 'undefined'.
  • L110:18: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L111:24: 'response' is possibly 'undefined'.
  • L111:24: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L113:4: 'response' is possibly 'undefined'.
  • L113:4: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L117:24: 'response' is possibly 'undefined'.
  • L117:24: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L118:27: 'response' is possibly 'undefined'.
  • L118:27: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L129:4: 'response' is possibly 'undefined'.
  • L129:4: 'response.workflowExecutionInfo' is possibly 'undefined'.
  • L131:4: 'response' is possibly 'undefined'.
  • L133:4: 'response' is possibly 'undefined'.
  • L135:4: 'response' is possibly 'undefined'.
  • L142:24: 'response' is possibly 'undefined'.
  • L143:25: 'response' is possibly 'undefined'.
  • L144:19: 'response' is possibly 'undefined'.
  • L145:31: 'response' is possibly 'undefined'.
  • L156:4: Type 'string | null | undefined' is not assignable to type 'string'.
  • L157:4: Type 'string | null | undefined' is not assignable to type 'string'.
  • L158:4: Type 'string | null | undefined' is not assignable to type 'string'.
  • L166:4: Type 'IMemo | undefined' is not assignable to type 'IMemo'.
  • L167:4: Type 'IWorkflowExecution | null | undefined' is not assignable to type 'IWorkflowExecution | undefined'.
  • L169:4: Type 'string | null | undefined' is not assignable to type 'string | undefined'.
  • L171:4: Type 'IWorkerVersionStamp | null | undefined' is not assignable to type 'MostRecentWOrkflowVersionStamp | undefined'.
  • L175:4: Type 'IPendingWorkflowTaskInfo | undefined' is not assignable to type 'IPendingWorkflowTaskInfo'.
  • L176:4: Type 'Callbacks' is not assignable to type 'Callback[]'.
  • L178:4: Type 'IPriority | null | undefined' is not assignable to type 'IPriority | undefined'.
  • L179:4: Type 'IPayload | null | undefined' is not assignable to type 'Payload | undefined'.
  • L180:4: Type 'IPayload | null | undefined' is not assignable to type 'Payload | undefined'.
  • L181:4: Type 'string | null | undefined' is not assignable to type 'string | undefined'.
  • L182:4: Type 'IWorkflowExecution | null | undefined' is not assignable to type 'IWorkflowExecution | undefined'.
  • L186:4: Type 'Duration | undefined' is not assignable to type 'Duration'.
src/lib/models/workflow-status.ts (1)
  • L15:62: A type predicate's type must be assignable to its parameter's type.
src/lib/utilities/workflow-actions.ts (1)
  • L36:12: Variable 'translatedAction' is used before being assigned.
src/lib/services/workflow-service.ts (25)
  • L193:6: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L255:4: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L294:45: Argument of type 'unknown' is not assignable to parameter of type 'WorkflowExecutionAPIResponse | undefined'.
  • L427:28: No overload matches this call.
  • L643:4: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L644:10: Argument of type '(response?: WorkflowExecutionAPIResponse) => WorkflowExecution' is not assignable to parameter of type '(value: unknown) => WorkflowExecution | PromiseLike'.
  • L674:21: Type 'null' cannot be used as an index type.
  • L712:23: Element implicitly has an 'any' type because expression of type '0' can't be used to index type 'IPayloads'.
  • L721:23: Element implicitly has an 'any' type because expression of type '0' can't be used to index type 'IPayloads'.
  • L813:8: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L832:6: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • L838:8: 'workflow' is possibly 'undefined'.
  • L840:8: 'workflow' is possibly 'undefined'.
  • L848:8: 'workflow' is possibly 'undefined'.
  • L850:8: 'workflow' is possibly 'undefined'.
  • L857:28: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  • L862:8: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  • L864:10: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  • L867:8: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  • L1014:20: Argument of type 'WorkflowExecution | undefined' is not assignable to parameter of type 'WorkflowExecution'.
  • L1053:28: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • L1081:10: Property 'executions' does not exist on type 'WithoutNextPageToken'.
  • L1081:41: Argument of type '(token: string) => Promise' is not assignable to parameter of type '(token?: NextPageToken | undefined) => Promise'.
  • L1125:6: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L1154:6: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
src/lib/components/data-encoder-settings.svelte (1)
  • L59:4: Type 'string | null' is not assignable to type 'string'.
src/lib/components/workflow/client-actions/cancel-confirmation-modal.svelte (1)
  • L47:6: Type 'string | undefined' is not assignable to type 'string'.
src/lib/components/workflow/client-actions/pause-confirmation-modal.svelte (1)
  • L49:6: Type 'string | undefined' is not assignable to type 'string'.
src/lib/components/workflow/client-actions/reset-confirmation-modal.svelte (1)
  • L68:6: Type 'string | undefined' is not assignable to type 'string'.
src/lib/components/workflow/client-actions/signal-confirmation-modal.svelte (2)
  • L68:6: Type 'string | undefined' is not assignable to type 'string'.
  • L96:9: 'signalDefinitions.length' is possibly 'undefined'.
src/lib/components/workflow/client-actions/terminate-confirmation-modal.svelte (1)
  • L58:6: Type 'string | undefined' is not assignable to type 'string'.
src/lib/components/activity/activity-options-update-drawer.svelte (5)
  • L110:82: Property 'message' does not exist on type '{}'.
  • L164:15: Type 'number | null | undefined' is not assignable to type 'number'.
  • L205:15: Type 'number | null | undefined' is not assignable to type 'number'.
  • L284:13: Type '{ id: string; label: string; labelHidden: true; value: string | null | undefined; class: string; }' is not assignable to type '__sveltets_2_PropsWithChildren<$$Props, { 'before-input': { disabled: boolean; }; 'after-input': { disabled: boolean; }; }> | undefined'.
  • L295:10: Type 'string | undefined' is not assignable to type 'string | number'.
src/lib/components/activity/activity-reset-confirmation-modal.svelte (1)
  • L75:8: Type 'string | undefined' is not assignable to type 'string | number'.
src/lib/components/activity/activity-unpause-confirmation-modal.svelte (1)
  • L67:8: Type 'string | undefined' is not assignable to type 'string | number'.
src/lib/layouts/workflow-header.svelte (12)
  • L133:37: Argument of type 'WorkflowExecution | null' is not assignable to parameter of type 'WorkflowExecution'.
  • L134:45: Argument of type 'WorkflowExecution | null' is not assignable to parameter of type 'WorkflowExecution'.
  • L138:13: Type 'boolean | undefined' is not assignable to type 'boolean'.
  • L139:13: Type 'boolean | undefined' is not assignable to type 'boolean'.
  • L141:13: Type 'WorkflowExecution | null' is not assignable to type 'WorkflowExecution'.
  • L166:9: Type 'boolean | undefined' is not assignable to type 'boolean'.
  • L167:9: Type 'boolean | undefined' is not assignable to type 'boolean'.
  • L169:9: Type 'WorkflowExecution | null' is not assignable to type 'WorkflowExecution'.
  • L177:20: Type 'WorkflowExecution | null' is not assignable to type 'WorkflowExecution'.
  • L230:12: Type 'string | undefined' is not assignable to type 'string'.
  • L252:11: 'workflow' is possibly 'null'.
  • L293:42: Argument of type 'WorkflowExecution | null' is not assignable to parameter of type 'WorkflowExecution'.
src/lib/layouts/workflow-run-layout.svelte (14)
  • L45:6: Variable 'refreshInterval' implicitly has type 'any' in some locations where its type cannot be determined.
  • L96:29: Argument of type 'WorkflowExecution | undefined' is not assignable to parameter of type 'WorkflowExecution'.
  • L98:12: Property 'taskQueue' does not exist on type 'WorkflowExecution | undefined'.
  • L101:38: Type 'WorkflowExecution | undefined' is not assignable to type 'WorkflowExecution | null'.
  • L105:8: 'workflow' is possibly 'undefined'.
  • L115:8: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • L128:19: 'workflow' is possibly 'undefined'.
  • L138:7: 'refresh.action' is possibly 'null'.
  • L151:6: Type 'WorkflowExecution | undefined' is not assignable to type 'WorkflowExecution | null'.
  • L165:4: Type 'undefined' is not assignable to type 'NetworkError'.
  • L168:18: Variable 'refreshInterval' implicitly has an 'any' type.
  • L177:28: Parameter 'fullHistory' implicitly has an 'any' type.
  • L177:41: Parameter 'pause' implicitly has an 'any' type.
  • L209:35: Argument of type 'null' is not assignable to parameter of type '((key: string, value: { eventHistory: WorkflowEvents; workflow: WorkflowExecution | null; workers: IDescribeTaskQueueResponse; metadata: WorkflowMetadata; userMetadata: { ...; }; }) => { ...; }) | undefined'.
src/lib/pages/workflow-call-stack.svelte (3)
  • L29:8: Type 'WorkflowExecution | null' is not assignable to type 'Eventual<{ id: string; runId: string; }>'.
  • L44:30: 'workers.pollers.length' is possibly 'undefined'.
  • L98:12: Type 'string | undefined' is not assignable to type 'string | number'.

Generated by 🚫 dangerJS against c1d964b

id: 'workflow-pause-success-toast',
message: translate('workflows.pause-success'),
});
} catch (err: unknown) {
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.

$refresh = Date.now();
triggerRefresh(Action.Reset);
hideResetModal();
} catch (err) {
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'string | undefined' is not assignable to type 'string'.

) => {
if (refresh && !pause && $workflowRun?.workflow?.isRunning) {
const shouldFetch =
refresh.timestamp &&
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ 'refresh.action' is possibly 'null'.

response.workflowExecutionInfo.status,
);
const isRunning = status === 'Running';
const isPaused = status === 'Paused';
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ 'response' is possibly 'undefined'.
  • ⚠️ 'response.workflowExecutionInfo' is possibly 'undefined'.

);
const isRunning = status === 'Running';
const isPaused = status === 'Paused';
const historyEvents = response.workflowExecutionInfo.historyLength;
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ 'response' is possibly 'undefined'.
  • ⚠️ 'response.workflowExecutionInfo' is possibly 'undefined'.

parent,
stateTransitionCount,
isRunning,
isPaused,
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'Duration | undefined' is not assignable to type 'Duration'.

@@ -127,6 +137,7 @@
<div class="xl:hidden">
<WorkflowActions
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'boolean | undefined' is not assignable to type 'boolean'.

@@ -127,6 +137,7 @@
<div class="xl:hidden">
<WorkflowActions
{isRunning}
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'boolean | undefined' is not assignable to type 'boolean'.

<WorkflowActions
{isRunning}
{isPaused}
{cancelInProgress}
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'WorkflowExecution | null' is not assignable to type 'WorkflowExecution'.

@@ -154,6 +165,7 @@
<div class="max-xl:hidden">
<WorkflowActions
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'boolean | undefined' is not assignable to type 'boolean'.

@@ -154,6 +165,7 @@
<div class="max-xl:hidden">
<WorkflowActions
{isRunning}
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'boolean | undefined' is not assignable to type 'boolean'.

<WorkflowActions
{isRunning}
{isPaused}
{cancelInProgress}
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Type 'WorkflowExecution | null' is not assignable to type 'WorkflowExecution'.

unhandledAction(action);
}

return translate('workflows.workflow-action-reason-placeholder', {
Copy link
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Variable 'translatedAction' is used before being assigned.

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