feat(workflow-executor): add TriggerActionStepExecutor with confirmation flow#1501
Open
Scra3 wants to merge 9 commits intofeat/prd-219-update-record-step-executorfrom
Open
feat(workflow-executor): add TriggerActionStepExecutor with confirmation flow#1501Scra3 wants to merge 9 commits intofeat/prd-219-update-record-step-executorfrom
Scra3 wants to merge 9 commits intofeat/prd-219-update-record-step-executorfrom
Conversation
…ion flow
Implements TriggerActionStepExecutor following the UpdateRecordStepExecutor
pattern (branches A/B/C, confirmation flow, automaticExecution).
- Add TriggerActionStepExecutionData type with executionParams (actionDisplayName
+ actionName), executionResult ({ success } | { skipped }), and pendingAction
- Add NoActionsError for collections with no actions
- Implement selectAction via AI tool with displayName enum and technical name hints
- resolveAndExecute stores the technical actionName in executionParams for
traceability; action result discarded per privacy constraint
- Fix buildStepSummary in BaseStepExecutor to include trigger-action pendingAction
in prior-step AI context (parity with update-record pendingUpdate)
- Export TriggerActionStepExecutor, TriggerActionStepExecutionData, NoActionsError
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ac706e8 to
c884d37
Compare
|
Coverage Impact ⬆️ Merging this pull request will increase total coverage on Modified Files with Diff Coverage (8) 🛟 Help
|
…t and pendingAction Resolve actionName once in handleFirstCall and store it in pendingAction, so resolveAndExecute receives it directly via ActionTarget without re-fetching the schema. Rename TriggerTarget → ActionTarget for consistency with English naming conventions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…f shapes to { name, displayName }
- Extract ActionRef { name, displayName } from inline types in TriggerActionStepExecutionData
- Extract FieldRef { name, displayName } replacing FieldReadBase in ReadRecord types
- UpdateRecordStepExecutionData executionParams/pendingUpdate now use FieldRef & { value }
- Rename actionDisplayName/actionName → displayName/name, fieldDisplayName/fieldName → displayName/name
- Move resolveFieldName to handleFirstCall (no re-resolution in resolveAndUpdate)
- Add missing tests: resolveActionName not-found path, saveStepExecution not-called assertions, trigger-action pendingAction in buildStepSummary
- Export ActionRef, FieldRef, NoActionsError from index; update CLAUDE.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…store display names in executionParams Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rams for consistency Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…-executor Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…y" wording Use fieldNames instead of fieldDisplayNames and actionName instead of displayName in tool schemas exposed to the AI, to avoid confusion between property names and their semantics (values remain display names). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ize pending state - Make buildOutcomeResult abstract on BaseStepExecutor; each branch owns its outcome shape - Add RecordTaskStepExecutor intermediate class implementing buildOutcomeResult for 'record-task' - Add pendingData to BaseStepExecutionData, replacing pendingUpdate/pendingAction per-type fields; each executor sets it when saving, base class reads it directly with no type discrimination - Rename TriggerActionStepExecutor → TriggerRecordActionStepExecutor for naming consistency with ReadRecord/UpdateRecord Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…idate error handling - Introduce doExecute() as the abstract hook; execute() in the base class wraps it with the single try-catch that converts WorkflowExecutorErrors to error outcomes and rethrows infrastructure errors — removing all try-catch boilerplate from subclasses - Inline the former buildErrorOutcomeOrThrow helper directly into execute(), it no longer needs to be a named method - Add StepPersistenceError (extends WorkflowExecutorError) for post-side-effect persistence failures; these are now consistently converted to error outcomes - Extract handleConfirmationFlow into RecordTaskStepExecutor to DRY the confirmation pattern shared by update-record and trigger-record-action - Split the !execution?.pendingData guard into two distinct WorkflowExecutorErrors for clearer debug messages - Export BaseStepStatus from step-outcome; remove pendingData from BaseStepExecutionData (declared only on the concrete types that need it) - Fix extractToolCallArgs to throw MalformedToolCallError when args is null/undefined Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
TriggerActionStepExecutorfollowing theUpdateRecordStepExecutorpattern (branches A/B/C,automaticExecution, confirmation flow)select-actiontool (Zod enum of display names + technical names as hints);resolveActionNamemaps displayName → technical name with name fallbackTriggerActionStepExecutionDatawithexecutionParams: { actionDisplayName, actionName },executionResult: { success } | { skipped }, andpendingActionfor the awaiting-confirmation stateNoActionsErrorfor collections with no actionsbuildStepSummaryinBaseStepExecutorto includetrigger-actionpendingActionin prior-step AI context (parity withupdate-recordpendingUpdate)Test plan
automaticExecution: true) — triggers action, savesexecutionParamswith both display and technical name, returnssuccessautomaticExecution) — savespendingAction, returnsawaiting-inputpendingActionfor traceability{ skipped: true }NoActionsError— returnserroroutcomeWorkflowExecutorErrorfromexecuteAction→erroroutcome (branches A & B)resolveActionNamefailure (Branch A — action deleted between confirmation steps)erroroutcomegetCollectionSchemacall per collection)stepOutcomeshape🤖 Generated with Claude Code
Note
Add TriggerRecordActionStepExecutor with confirmation flow to workflow-executor
TriggerRecordActionStepExecutorto select and trigger actions on records, supporting automatic execution and confirmation-gated (awaiting-input) flows.RecordTaskStepExecutor, a shared abstract base that provides a commonhandleConfirmationFlowandbuildOutcomeResultfor record-task step executors.BaseStepExecutorto wrap execution in adoExecute()pattern, convertingWorkflowExecutorErrorto error outcomes uniformly across all step executors.pendingUpdatetopendingDataand updates the shape to{ displayName, name, value }acrossUpdateRecordStepExecutorand related types;ReadRecordStepExecutorsimilarly replacesfieldNameswith structured{ name, displayName }field refs.NoActionsErrorandStepPersistenceErrortoerrors.ts; persistence failures after a successful action now throwStepPersistenceErrorrather than propagating the raw error.pendingUpdateandfieldNames/fieldNamekeys in persisted step execution data are replaced withpendingDataandfields/name— existing persisted executions using the old shape will not match the new expectations.Macroscope summarized c8b9247.