Skip to content

release: To Prod#1641

Merged
zdumitru merged 16 commits into
prodfrom
staging
Jun 24, 2026
Merged

release: To Prod#1641
zdumitru merged 16 commits into
prodfrom
staging

Conversation

@suisuss

@suisuss suisuss commented Jun 24, 2026

Copy link
Copy Markdown

No description provided.

joelorzet and others added 8 commits June 20, 2026 13:48
Gas-sponsored sends (Turnkey Gas Station, ERC-4337/EIP-7702 smart
accounts, relayers) route through a wrapper, so the on-chain transaction's
top-level to/calldata no longer describe the action that ran. Decoding only
the top-level calldata returns different results for sponsored vs direct
sends of the same action.

Add a shared trace-decode capability that walks the transaction's internal
call tree (debug_traceTransaction callTracer) and decodes the real call
against the target contract ABI, so write actions report a consistent
"what executed" view regardless of sponsorship.

- lib/web3/trace-decode.ts: trace, flatten, decode, and resolveExecutedCall
- lib/web3/trace-executed-call.ts: shared helper with RPC failover
- write-contract, approve-token, transfer-token: attach normalized
  executedCall on the sponsored success path, plus executedCall.* output
  fields for template references
- best-effort and graceful: returns undefined when the RPC cannot trace

Native transfer-funds is excluded (no function to decode). History-based
query-transactions discovery of sponsored calls is out of scope: explorers
index internal calls by value transfer only, so a zero-value sponsored call
is not discoverable from history.
Protocol action nodes created via the Hub 'Use in Workflow' button only
carry actionType and _protocolMeta at creation time — the user fills in
required fields (network, asset, amount, etc.) once the editor opens.

The create endpoint was rejecting these nodes with 422 INVALID_ACTION_CONFIG
because validateWorkflowActionConfigs enforced required fields regardless of
whether any user-facing parameters had been set.

Add a draft-state guard: if config contains only actionType, reserved keys,
and underscore-prefixed metadata keys, skip required-field and type
validation for that node. The UNKNOWN_FIELD check still runs.

Tests: 5 new unit cases in a 'draft state' describe block and 1 new
integration case hitting POST /api/workflows/create with the exact Hub
payload shape, asserting no 422 and a DB insert proceeds.
Error filter was returning both user errors and system errors because
workflowDbStatuses("error") expanded to all ERROR_STATUSES. The two
statuses now have distinct single-value filters so each pill shows only
runs of its own kind.

workflow-runs.tsx terminalStatuses was also missing system_error, causing
the poll loop to keep refreshing logs on system_error runs indefinitely
instead of doing one final refresh and stopping.
System error runs have no step logs (the failure happens before any step
executes), so the expanded row showed "No step logs available" with no
context. The error code and message were available on the execution row
but were not included in UnifiedRun or selected by the analytics query.

Add error, errorCode, errorType, and errorCategory to UnifiedRun and
select them in fetchWorkflowRuns (direct runs null-fill since
direct_executions has no error fields). In ExpandedStepRows, call
getCustomerRunErrorMessage when the step list is empty and show the
customer-facing message in place of the generic fallback text.
Fixes 57 alerts (19 high, 38 medium) across 4 package manifests by
adding or updating pnpm.overrides to pin vulnerable transitive deps
to their minimum fixed versions.

Root (pnpm-lock.yaml):
- hono ^4.12.18 -> ^4.12.25 (resolves 9 alerts: CORS, Lambda, path traversal)
- undici ^6.24.0 -> ^6.27.0 (header injection, WS DoS)
- devalue ^5.6.4 -> ^5.8.1
- dompurify ^3.4.0 -> ^3.4.11 (resolves 16 alerts: XSS/IN_PLACE bypasses)
- vite ^7.3.5 added as direct devDep (resolves 9 alerts: FS bypass, NTLMv2)
- ws ^8.21.0 override (memory exhaustion DoS, uninitialized memory)
- form-data ^4.0.6 override (CRLF injection)
- piscina ^4.9.3 override (prototype pollution -> RCE)
- brace-expansion ^5.0.6 override (ReDoS)
- qs ^6.15.2 override (prototype pollution)
- js-yaml ^4.2.0 override (quadratic DoS)
- @opentelemetry/core ^2.8.0 override (unbounded memory allocation)
- uuid@<11 ^11.1.1 override (buffer bounds check bypass)

docs-site/pnpm-lock.yaml:
- mermaid >=11.15.0 override (resolves 4 medium CVEs)
- @xmldom/xmldom >=0.9.10 override (resolves 5 high CVEs)
- dompurify >=3.4.11 override (resolves 5 medium alerts)
- brace-expansion >=5.0.6 override (ReDoS)

keeperhub-events (workspace lockfile):
- ws >=8.21.0 override
- vite >=8.0.16 override

keeperhub-events/event-tracker:
- ws >=8.21.0 override

keeperhub-scheduler:
- ws >=8.21.0 override
- vite >=8.0.16 override
- qs >=6.15.2 override

Post-fix: pnpm audit root reports 0 high, 0 moderate (4 low remain:
@ai-sdk/provider-utils has no fix; esbuild and dompurify low-severity
alerts are deferred as dev/low-risk).
Add hasDraftActionNodes() to action-config.ts and call it in the PATCH
handler after finalNodes is resolved. Returns 422 UNCONFIGURED_ACTION_NODES
when body.enabled is true and any known action node carries only reserved or
underscore-prefixed keys (no user-supplied parameters). Covers both the
nodes+enabled PATCH path (where validateWorkflowActionConfigs was silently
passing draft nodes) and the enable-only PATCH path (where the validation
block is skipped entirely when nodes are not in the body).
The previous comment claimed UNKNOWN_FIELD still runs for draft nodes, which
is false — the continue exits the entire node iteration, bypassing all three
checks. The new comment accurately states that all validation (including
UNKNOWN_FIELD) is skipped and explains why: underscore-prefixed metadata keys
like _protocolMeta would otherwise be flagged as unknown fields.
…bugs

fix(analytics): isolate error and system_error filters
…bot-alerts

chore: resolve dependabot high and medium severity vulnerability alerts
suisuss added 2 commits June 24, 2026 16:44
- Fix flattenCallTree to propagate parent revert to all descendant frames
  (geth callTracer only sets error on the reverting frame, not children)
- Fix executeWithFailover failover: throw on null result so the provider
  manager retries the next provider rather than accepting null as success
- Remove dead !call.input guard (input is always present on decodable calls)
- Extract shared serializeArg util from three duplicate serializeValue impls
- Add executedCall tracing to direct-send path in approve-token, transfer-token,
  and write-contract (was previously only on the sponsored path)
- Add unit tests covering revert propagation, executedCall attach/omit, and
  correct args forwarded to traceExecutedCallWithFailover
…w-from-hub-actions

fix: allow creating workflows from Hub protocol actions
OleksandrUA and others added 2 commits June 24, 2026 12:04
The .next/cache incremental-compile cache lives in a BuildKit type=cache
mount, which the registry layer cache does not carry. On ephemeral hosted
runners each build gets a fresh BuildKit instance, so the mount starts empty
and next build runs cold whenever source changes.

Give the mount a stable id and persist its contents with actions/cache +
buildkit-cache-dance: the cache is injected into the builder before the bake
build and extracted again afterwards. Keyed per environment so staging and
prod keep separate lineages.
…ored-tx-decode

feat(web3): decode actual executed call for sponsored transactions
…-min

ci: persist Next.js build cache across runs to warm next build
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.

5 participants