Skip to content

Workflow Pause#3114

Merged
laurakwhit merged 16 commits intomainfrom
workflow-pause
Feb 6, 2026
Merged

Workflow Pause#3114
laurakwhit merged 16 commits intomainfrom
workflow-pause

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

Screenshots (if applicable) 📸

Screenshot 2026-01-29 at 3 34 45 PM Screenshot 2026-01-29 at 2 50 23 PM
Screenshot 2026-01-23 at 5 19 34 PM Screenshot 2026-02-02 at 5 56 22 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 canary --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 is v1.60.1 or v1.62.0+
  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 disableWriteActions enabled

  • Verify Pause Workflow is not visible

With namespaceInfo> capabilities > workflowPause set to false > go to a Running workflow

  • Verify Pause Workflow is not visible

With namespaceInfo> capabilities > workflowPause set to true > go to a Running workflow

  • if the workflow is delayed
    • Verify Pause Workflow is disabled
  • 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 Feb 5, 2026 6:20pm

Request Review

@temporal-cicd
Copy link
Contributor

temporal-cicd bot commented Jan 24, 2026

Warnings
⚠️

📊 Strict Mode: 150 errors in 22 files (13.1% of 1145 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)
  • L67:48: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.
  • L73:50: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.
  • L75:4: Type 'string | null' is not assignable to type 'string'.
  • L102: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; }'.
  • L102:38: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Partial'.
  • L104: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; }'.
  • L104:57: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Partial'.
  • L188: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/services/settings-service.ts (1)
  • L75:2: Type '{ auth: { enabled: boolean; options: string[]; }; bannerText: string; baseUrl: string | null; codec: { endpoint: string; passAccessToken: boolean | undefined; includeCredentials: boolean | undefined; customErrorMessage: { ...; }; }; ... 17 more ...; version: string; }' is not assignable to type 'Settings'.
src/lib/utilities/workflow-actions.ts (1)
  • L36:12: Variable 'translatedAction' is used before being assigned.
src/lib/services/workflow-service.ts (23)
  • 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.
  • 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/svelte-mocks/app/stores.ts (1)
  • L16:4: Type 'null' is not assignable to type 'string[]'.
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)
  • L67:6: Type 'string | undefined' is not assignable to type 'string'.
  • L95: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/workflow-status.svelte (4)
  • L32:22: Type 'string | null' does not satisfy the constraint 'string | number | symbol'.
  • L116:16: 'count' is possibly 'undefined'.
  • L117:9: 'count' is possibly 'undefined'.
  • L120:13: Type 'null' cannot be used as an index type.
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 (13)
  • 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'.
  • L233:12: Type 'string | undefined' is not assignable to type 'string'.
  • L255:11: 'workflow' is possibly 'null'.
  • L297:12: 'workflow' is possibly 'null'.
  • L297:12: 'workflow.searchAttributes' is possibly 'undefined'.
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 d363b2b

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.

@laurakwhit laurakwhit requested a review from a team as a code owner February 4, 2026 03:38
workflowPauseEnabled(page.data.settings, $coreUser, namespace),
);
const pauseEnabled = $derived(
!!page.data.namespace.namespaceInfo?.capabilities?.workflowPause,
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Is this an action we want to make configurable here ⬇️ ?

// Discrete configuration for Workflow Actions in the UI
WorkflowTerminateDisabled bool `yaml:"workflowTerminateDisabled"`
WorkflowCancelDisabled bool `yaml:"workflowCancelDisabled"`
WorkflowSignalDisabled bool `yaml:"workflowSignalDisabled"`
WorkflowUpdateDisabled bool `yaml:"workflowUpdateDisabled"`
WorkflowResetDisabled bool `yaml:"workflowResetDisabled"`

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yes I think we want an env to disable

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Added

@Alex-Tideman
Copy link
Collaborator

Small thing but we should probably change the pause icon for "Freeze". Not a blocker but it might be confusing have Pause Workflow and a pause icon below it


const getOnlyWorkflowWithPendingActivities = async (
refresh: number,
refresh: RefreshAction,
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Small thing but we should probably change the pause icon for "Freeze". Not a blocker but it might be confusing have Pause Workflow and a pause icon below it

@Alex-Tideman check out #3137.

@rossnelson
Copy link
Collaborator

here are the steps i followed to test this:

Testing Workflow Pause Feature

To test this PR locally, you need to enable the workflow pause feature flag on your Temporal server:

Setup Steps

  1. Add the feature flag to your Temporal server's dynamic config

    Edit config/dynamicconfig/development-sql.yaml (or your active config file) and add:

    frontend.WorkflowPauseEnabled:
      - value: true
    
  2. Restart Temporal server (if not using file-based dynamic config with polling)

make stop
make start
  1. If using the default file-based client with polling (pollInterval: 10s), the server will pick up the change automatically within 10 seconds.

  2. Start the UI in local-temporal mode
    pnpm dev:local-temporal

  3. Start a long-running workflow using frontend-shared-workflows

  4. In a separate terminal, run a workflow that will stay running long enough to test pause functionality.

  5. Hard refresh the UI
    - Mac: Cmd+Shift+R
    - Windows/Linux: Ctrl+Shift+R

  6. Navigate to a running workflow

  7. The pause button should now appear in the workflow actions menu.

Verification

You can verify the feature is enabled by checking the namespace capabilities:
curl -s "http://localhost:8081/api/v1/namespaces/default" | grep workflowPause

Should return: "workflowPause": true

@laurakwhit laurakwhit merged commit 73e45ca into main Feb 6, 2026
20 checks passed
@laurakwhit laurakwhit deleted the workflow-pause branch February 6, 2026 17:56
Copy link
Contributor

@andrewzamojc andrewzamojc left a comment

Choose a reason for hiding this comment

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

Neat! I was able to pause a workflow locally. Code looks good 👍

temporal-cicd bot pushed a commit that referenced this pull request Feb 6, 2026
Auto-generated version bump from 2.45.0 to 2.45.1

Specific version: 2.45.1

Changes included:
- [`f71743b5`](f71743b) Nav icons fix/kt (#3127)
- [`68f18987`](68f1898) Refresh token POC (#2966)
- [`36b26a9f`](36b26a9) fix: prevent 'No Workers Running' flash during workflow load (#3131)
- [`b4d224ee`](b4d224e) Auto refresh UI update (#3137)
- [`3ca9d3c3`](3ca9d3c) Revert "Refresh token POC (#2966)" (#3139)
- [`73e45caa`](73e45ca) Workflow Pause (#3114)
laurakwhit added a commit that referenced this pull request Feb 6, 2026
Auto-generated version bump from 2.45.0 to 2.45.1

Specific version: 2.45.1

Changes included:
- [`f71743b5`](f71743b) Nav icons fix/kt (#3127)
- [`68f18987`](68f1898) Refresh token POC (#2966)
- [`36b26a9f`](36b26a9) fix: prevent 'No Workers Running' flash during workflow load (#3131)
- [`b4d224ee`](b4d224e) Auto refresh UI update (#3137)
- [`3ca9d3c3`](3ca9d3c) Revert "Refresh token POC (#2966)" (#3139)
- [`73e45caa`](73e45ca) Workflow Pause (#3114)

Co-authored-by: laurakwhit <15069288+laurakwhit@users.noreply.github.com>
@laurakwhit laurakwhit linked an issue Feb 12, 2026 that may be closed by this pull request
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.

Ability to pause / resume workflow executions via web ui

4 participants