Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
92658e3
fix(next,builders): resolve next build failures from stale socket and…
TooTallNate Apr 11, 2026
27a188b
fix(docs): remove scroll-smooth from html to fix navigation scroll po…
christopherkindl Apr 12, 2026
c3fd550
Add cookbook with 50 workflow pattern recipes (#1564)
johnlindquist Apr 12, 2026
fbcee45
docs: add workflow migration guides and skill (#1584)
johnlindquist Apr 12, 2026
1086753
fix(next): resolve next/package.json from working directory first (#1…
TooTallNate Apr 13, 2026
7a32f82
fix(builders): restore discovery WeakMap cache for dev rebuilds (#1699)
TooTallNate Apr 13, 2026
81913e3
Move swc-playground-wasm into workbench/swc-playground (#1704)
TooTallNate Apr 13, 2026
2bb41fc
[docs] Update tweet wall (#1708)
karthikscale3 Apr 13, 2026
f402643
Add AI-powered conflict resolution to backport workflow (#1693)
TooTallNate Apr 13, 2026
d22f685
[web][web-shared][core] Make encrypted markers clickable and detect e…
karthikscale3 Apr 14, 2026
a7dbc83
Bump vite (#1719)
karthikscale3 Apr 14, 2026
fa9cb63
remove secure credential (#1723)
karthikscale3 Apr 14, 2026
ad3ece7
fix(docs): remove aspirational workflow-level deduplication pattern (…
TooTallNate Apr 14, 2026
e84aa2d
fix(docs): correct API usage in cookbook examples (#1709)
TooTallNate Apr 14, 2026
f0e5219
[home][docs] migrate to new geistdocs facelift (#1666)
christopherkindl Apr 14, 2026
6a45abc
[ai] Avoid crashing on malformed streamed tool-call input (#1707)
craze3 Apr 14, 2026
f55ea66
[web-shared] Enable in-line decryption for data inspector in detail p…
karthikscale3 Apr 14, 2026
ea54eb1
Fix web/web-shared version drift by marking them as fixed in changese…
TooTallNate Apr 14, 2026
39122c8
Use pull_request_target for backport workflow to support fork PRs (#1…
TooTallNate Apr 14, 2026
9725a37
[web] Support standalone deploy to vercel (#1732)
VaguelySerious Apr 14, 2026
c73623f
feat: add clickable Run reference rendering in observability UI (#1681)
TooTallNate Apr 14, 2026
66f5653
[cli] Fix false "data expired" warning in CLI for non-expired runs (#…
karthikscale3 Apr 15, 2026
a7d26e0
Add command-prompt component to docs (#1733)
christopherkindl Apr 15, 2026
ba47c83
Add stable Next.js eager and lazy test coverage
ijjk Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/afraid-bananas-peel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@workflow/web": patch
---

Support standalone deploy to vercel
7 changes: 7 additions & 0 deletions .changeset/cold-lands-boil.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@workflow/core": patch
"@workflow/web-shared": patch
"@workflow/web": patch
---

Make encrypted markers clickable to trigger decryption and detect encryption at run level before span selection. Persist `features.encryption` flag in `executionContext` at run creation so the UI can detect encryption without a probe fetch.
4 changes: 4 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
[
"workflow",
"@workflow/core"
],
[
"@workflow/web",
"@workflow/web-shared"
]
],
"linked": [],
Expand Down
5 changes: 5 additions & 0 deletions .changeset/fix-discovery-weakmap-cache.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@workflow/builders": patch
---

Fix discovery WeakMap cache miss causing duplicate esbuild passes during dev rebuilds
5 changes: 5 additions & 0 deletions .changeset/fix-malformed-tool-call-input.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@workflow/ai': patch
---

Preserve malformed streamed tool-call input until repair hooks can run
7 changes: 7 additions & 0 deletions .changeset/fix-next-build-stale-socket.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@workflow/next": patch
---

fix(next): guard socket-info filesystem fallback behind lazy discovery flag

Prevents `ECONNREFUSED` during `next build` when a stale `workflow-socket.json` file exists from a previous `next dev` session.
5 changes: 5 additions & 0 deletions .changeset/fix-next-version-resolution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@workflow/next": patch
---

Fix `next/package.json` resolution failure in npm workspaces monorepos
7 changes: 7 additions & 0 deletions .changeset/fix-step-bundle-dynamic-imports.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@workflow/builders": patch
---

fix(builders): add `webpackIgnore` comments to dynamic imports in generated step bundle

Prevents Turbopack/webpack "Module not found" errors for runtime-resolved dynamic `import()` calls (e.g. from `@vercel/queue`) that are inlined into the step route bundle.
5 changes: 5 additions & 0 deletions .changeset/many-peas-jog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@workflow/cli": patch
---

Fix false "data expired" warning for runs with future expiredAt
7 changes: 7 additions & 0 deletions .changeset/o11y-run-ref-rendering.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@workflow/core": patch
"@workflow/web-shared": patch
"@workflow/web": patch
---

Add clickable Run reference rendering in observability UI
3 changes: 1 addition & 2 deletions .changeset/pre.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@
"workflow-sdk-compiler-playground": "4.0.0",
"@workflow/example-nitro": "4.0.0",
"@workflow/vitest": "4.0.0",
"@workflow/vitest-workbench": "4.0.0",
"@workflow/swc-playground-wasm": "0.0.0"
"@workflow/vitest-workbench": "4.0.0"
},
"changesets": [
"allow-sync-step-functions",
Expand Down
5 changes: 5 additions & 0 deletions .changeset/vast-oranges-fail.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@workflow/web-shared": patch
---

Support in-line decryption for data inspector on the detail panel
5 changes: 5 additions & 0 deletions .changeset/witty-mails-smile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@workflow/next": patch
---

Allow `WORKFLOW_NEXT_LAZY_DISCOVERY=0` to explicitly disable deferred Next.js discovery
2 changes: 1 addition & 1 deletion .github/scripts/generate-docs-data.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ function parseE2EResults(files) {
// Extract framework from filename for detailed breakdown
const basename = path.basename(file, '.json');
const frameworkMatch = basename.match(
/-(nextjs-turbopack|nextjs-webpack|nitro|nuxt|sveltekit|vite|hono|express|fastify|astro)(?:-(canary|stable))?$/
/-(nextjs-turbopack|nextjs-webpack|nitro|nuxt|sveltekit|vite|hono|express|fastify|astro)(?:-(?:canary|stable(?:-lazy-discovery-(?:enabled|disabled))?))?$/
);
if (frameworkMatch) {
const framework = frameworkMatch[1];
Expand Down
139 changes: 128 additions & 11 deletions .github/workflows/backport.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Backport to stable

on:
pull_request:
pull_request_target:
types: [closed, labeled]
branches: [main]

Expand All @@ -13,8 +13,7 @@ jobs:
if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'backport-stable')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
contents: read
steps:
- name: Generate GitHub App Token
id: app-token
Expand All @@ -36,12 +35,103 @@ jobs:
git config user.name "$(git log -1 --format='%an' "$MERGE_SHA")"
git config user.email "$(git log -1 --format='%ae' "$MERGE_SHA")"
git checkout stable
git cherry-pick "$MERGE_SHA" --no-edit
echo "cherry_pick_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
git push origin stable
if git cherry-pick "$MERGE_SHA" --no-edit; then
echo "status=clean" >> "$GITHUB_OUTPUT"
echo "cherry_pick_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
else
echo "status=conflict" >> "$GITHUB_OUTPUT"
fi

- name: Comment on success
if: success()
- name: Push clean backport
if: steps.cherry-pick.outputs.status == 'clean'
run: git push origin stable

- name: Setup Node.js
if: steps.cherry-pick.outputs.status == 'conflict'
uses: actions/setup-node@v4
with:
node-version: 'lts/*'

- name: Install opencode
if: steps.cherry-pick.outputs.status == 'conflict'
run: npm install -g opencode-ai@1.4.3

- name: Configure opencode
if: steps.cherry-pick.outputs.status == 'conflict'
env:
AI_GATEWAY_TOKEN: ${{ secrets.AI_GATEWAY_TOKEN }}
run: |
mkdir -p ~/.local/share/opencode
jq -n --arg key "$AI_GATEWAY_TOKEN" '{vercel:{type:"api",key:$key}}' > ~/.local/share/opencode/auth.json

- name: Resolve conflicts with opencode
if: steps.cherry-pick.outputs.status == 'conflict'
id: ai-resolve
continue-on-error: true
env:
OPENCODE_PERMISSION: '{"allow":["*"]}'
MERGE_SHA: ${{ github.event.pull_request.merge_commit_sha }}
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
COMMIT_MSG=$(git log -1 --format='%B' "$MERGE_SHA")

cat > /tmp/backport-prompt.txt <<PROMPT
The working tree has git merge conflicts from a failed cherry-pick.
A commit is being cherry-picked from the main branch to the stable branch.

PR title: $PR_TITLE
Commit message: $COMMIT_MSG

Resolve all merge conflicts in the working tree. The content between
<<<<<<< HEAD and ======= is the current stable branch. The content between
======= and >>>>>>> is the incoming change from main.

After resolving each file, run git add on it to mark it as resolved.
Do NOT run git cherry-pick --continue or git commit.
PROMPT

opencode run --model vercel/anthropic/claude-opus-4.6 "$(cat /tmp/backport-prompt.txt)"

# Verify all conflicts are resolved
REMAINING=$(git diff --name-only --diff-filter=U || true)
if [ -z "$REMAINING" ]; then
GIT_EDITOR=true git cherry-pick --continue
echo "resolved=true" >> "$GITHUB_OUTPUT"
echo "cherry_pick_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
fi

- name: Create backport PR with AI-resolved conflicts
if: steps.cherry-pick.outputs.status == 'conflict' && steps.ai-resolve.outputs.resolved == 'true'
id: backport-pr
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
BRANCH="backport/pr-${PR_NUMBER}-to-stable"
git checkout -B "$BRANCH"
git push --force-with-lease origin "$BRANCH"

EXISTING_PR=$(gh pr list --state open --base stable --head "$BRANCH" --json url --jq '.[0].url')

if [ -n "$EXISTING_PR" ]; then
PR_URL="$EXISTING_PR"
else
PR_URL=$(gh pr create \
--base stable \
--head "$BRANCH" \
--title "Backport #${PR_NUMBER}: $PR_TITLE" \
--body "$(cat <<'BODY'
Automated backport of #${{ github.event.pull_request.number }} to `stable`.

Merge conflicts were resolved by AI ([opencode](https://opencode.ai) with Claude Opus). **Please review the conflict resolution before merging.**
BODY
)")
fi
echo "pr_url=$PR_URL" >> "$GITHUB_OUTPUT"

- name: Comment on clean backport
if: steps.cherry-pick.outputs.status == 'clean'
uses: actions/github-script@v7
with:
github-token: ${{ steps.app-token.outputs.token }}
Expand All @@ -55,8 +145,21 @@ jobs:
body: `Backported to \`stable\` (${originalSha} -> ${cherryPickSha}).`
});

- name: Comment on failure
if: failure()
- name: Comment on AI-resolved backport
if: steps.cherry-pick.outputs.status == 'conflict' && steps.ai-resolve.outputs.resolved == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ steps.app-token.outputs.token }}
script: |
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: 'Cherry-pick to `stable` had conflicts that were resolved by AI. Please review the backport PR: ${{ steps.backport-pr.outputs.pr_url }}'
});

- name: Comment on conflict failure
if: always() && steps.cherry-pick.outputs.status == 'conflict' && steps.ai-resolve.outputs.resolved != 'true'
uses: actions/github-script@v7
with:
github-token: ${{ steps.app-token.outputs.token }}
Expand All @@ -67,7 +170,7 @@ jobs:
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: [
'**Backport to `stable` failed** — the cherry-pick could not be applied cleanly.',
'**Backport to `stable` failed** — the cherry-pick had conflicts that could not be resolved automatically.',
'',
'To resolve manually:',
'```bash',
Expand All @@ -80,3 +183,17 @@ jobs:
'```'
].join('\n')
});

- name: Comment on unexpected failure
if: always() && steps.cherry-pick.outputs.status != 'clean' && steps.cherry-pick.outputs.status != 'conflict'
uses: actions/github-script@v7
with:
github-token: ${{ steps.app-token.outputs.token }}
script: |
const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: `**Backport to \`stable\` failed** — unexpected error before the cherry-pick could be attempted. [See workflow run](${runUrl}).`
});
Loading
Loading