Skip to content

refactor(nexus): replace hand-rolled standalone nexus operation types with @temporalio/proto#3646

Merged
rossedfort merged 1 commit into
mainfrom
DT-4240-remove-sano-handrolled-types
Jul 8, 2026
Merged

refactor(nexus): replace hand-rolled standalone nexus operation types with @temporalio/proto#3646
rossedfort merged 1 commit into
mainfrom
DT-4240-remove-sano-handrolled-types

Conversation

@rossedfort

Copy link
Copy Markdown
Contributor

Description & motivation 💭

Replaces the fully hand-written standalone nexus operation type definitions with interfaces that extend proto types from @temporalio/proto, following the same pattern already used by activity-execution.ts.

Previously, NexusOperationExecutionInfo, NexusOperationExecutionListInfo, NexusOperationExecutionCancellationInfo, and NexusOperationExecution were standalone interfaces that duplicated proto field names and types manually. Any new field added to the proto would be silently missing from the UI. Now they use extends Omit<ProtoType, overridden-fields> so all proto fields are inherited automatically, and only the fields that need UI-friendly types (timestamps as string, durations as string, enums as named string unions, search attributes as WorkflowSearchAttributes) are re-declared.

StartNexusOperationExecutionRequest omitted every one of its proto fields and redefined them all — making the extends redundant. It is now a plain interface (StartNexusOperationRequest) wrapping only the UI-specific overrides (timeout/policy fields as strings).

NexusOperationIdReusePolicy, NexusOperationIdConflictPolicy, and NexusOperationCancellationState are derived from the proto enums at runtime via Object.keys(temporal.api.enums.v1.*) and re-exported from types/index.ts so consumers import from the canonical location.

Testing 🧪

How was this tested 👻

  • Manual testing
  • E2E tests added
  • Unit tests added

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

pnpm check passes with the same 2 pre-existing errors (unrelated HTML nesting in package/ components).

Checklists

Merge Checklist

  • pnpm check passes
  • pnpm lint passes (enforced by pre-commit hook)

Issue(s) closed

DT-4240

Docs

Any docs updates needed?

No docs changes needed — purely internal type refactor.

Migrate standalone nexus operation types to extend proto interfaces
instead of duplicating field definitions. NexusOperationExecutionInfo,
NexusOperationExecutionListInfo, NexusOperationExecutionCancellationInfo,
and NexusOperationExecution now use extends Omit<ProtoType, ...> so proto
fields are inherited directly. Enum-derived types and policy arrays are
sourced from the proto enums at runtime.

StartNexusOperationExecutionRequest was a plain re-definition with no
inherited proto fields, so it stays as a plain interface (renamed
StartNexusOperationRequest) wrapping the proto request type.
NexusOperationIdReusePolicy, NexusOperationIdConflictPolicy, and
NexusOperationCancellationState are re-exported from types/index.ts.
@rossedfort
rossedfort requested a review from a team as a code owner July 8, 2026 20:33
@vercel

vercel Bot commented Jul 8, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment Jul 8, 2026 8:34pm

Request Review

Comment thread src/lib/types/index.ts
> & {
standaloneNexusOperation?: boolean | null;
};
export type NamespaceCapabilities =

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  • ⚠️ Property 'capabilities' does not exist on type 'INamespaceInfo | null | undefined'.

@temporal-cicd

temporal-cicd Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor
Warnings
⚠️

📊 Strict Mode: 26 errors in 4 files (2.9% of 893 total)

src/lib/types/index.ts (1)
  • L21:45: Property 'capabilities' does not exist on type 'INamespaceInfo | null | undefined'.
src/lib/services/standalone-nexus-operations.ts (4)
  • L66:6: Type 'ErrorCallback' is not assignable to type '(error: unknown, toasts?: Toaster, errors?: Writable<NetworkError | null>, isBrowser?: boolean) => void'.
  • L158:6: Type '{ indexedFields?: ({ [k: string]: temporal.api.common.v1.IPayload; } | null); }' is not assignable to type '{ [k: string]: IPayload; }'.
  • L159:31: Argument of type 'Record<string, unknown>[]' is not assignable to parameter of type '{ type: "Unspecified" | "Keyword" | "Text" | "Int" | "Double" | "Bool" | "Datetime" | "KeywordList"; label: string; value?: any; }[]'.
  • L296:6: Argument of type 'IPayload | null | undefined' is not assignable to parameter of type 'IPayload | undefined'.
src/lib/components/standalone-nexus-operations/start-standalone-nexus-operation-form/form.svelte (7)
  • L56:4: Type 'string | undefined' is not assignable to type 'string'.
  • L217:6: 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...'.
  • L259:14: Type 'string | null | undefined' is not assignable to type 'string'.
  • L346:25: Type '{ key: string; value: string; }' is not assignable to type 'never'.
  • L346:47: Type '{ key: string; value: string; }' is not assignable to type 'never'.
  • L602:51: Property 'key' does not exist on type 'never'.
  • L611:51: Property 'value' does not exist on type 'never'.
src/lib/pages/standalone-nexus-operation-details.svelte (14)
  • L67:4: Type 'IPayload | null | undefined' is not assignable to type 'IPayload | undefined'.
  • L68:4: Type 'IPayload | null | undefined' is not assignable to type 'IPayload | undefined'.
  • L69:4: Type 'IFailure | null | undefined' is not assignable to type 'IFailure | undefined'.
  • L119:38: Type 'string | null | undefined' is not assignable to type 'string'.
  • L125:29: Type 'string | null | undefined' is not assignable to type 'string'.
  • L158:38: Type 'string | null | undefined' is not assignable to type 'string'.
  • L168:12: Type 'string | null | undefined' is not assignable to type 'string'.
  • L172:31: Type 'string | null | undefined' is not assignable to type 'string'.
  • L183:12: Type 'string | null | undefined' is not assignable to type 'string'.
  • L187:31: Type 'string | null | undefined' is not assignable to type 'string'.
  • L198:12: Type 'string | null | undefined' is not assignable to type 'string'.
  • L202:31: Type 'string | null | undefined' is not assignable to type 'string'.
  • L286:9: 'info.attempt' is possibly 'null' or 'undefined'.
  • L371:31: Type 'string | null | undefined' is not assignable to type 'string'.

Generated by 🚫 dangerJS against 949312b

@rossedfort
rossedfort merged commit c047384 into main Jul 8, 2026
22 checks passed
@rossedfort
rossedfort deleted the DT-4240-remove-sano-handrolled-types branch July 8, 2026 20:43
temporal-cicd Bot pushed a commit that referenced this pull request Jul 8, 2026
Auto-generated version bump from 2.51.1 to 2.52.0

Bump type: minor

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

Bump type: minor

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

Co-authored-by: rossedfort <[email protected]>
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