Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
ad8b7f1
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 27, 2026
e0cb61b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 28, 2026
051cadc
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 29, 2026
af8ac1f
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 29, 2026
e68e7d2
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 30, 2026
8305e5b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 30, 2026
f3da688
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Jan 31, 2026
f8ee413
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 1, 2026
589cbd7
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 2, 2026
e979fdf
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 3, 2026
d4baed2
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 6, 2026
53503a4
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 10, 2026
d51e2e4
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 13, 2026
5123088
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 13, 2026
dd1a307
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 13, 2026
00bcfcd
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 14, 2026
f6a157b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 15, 2026
816f35b
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 16, 2026
2b87dce
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 17, 2026
146de28
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 18, 2026
0ef6455
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 18, 2026
2d8c690
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 18, 2026
3513471
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 20, 2026
0f5d29e
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 20, 2026
c76001e
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 23, 2026
f97184f
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 24, 2026
f71c531
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 25, 2026
530e598
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 25, 2026
ea38511
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Feb 27, 2026
19b1a3f
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 2, 2026
757bfdb
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 2, 2026
5fb4cfb
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 3, 2026
cb5adc3
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 3, 2026
046fdbc
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 3, 2026
2a7884f
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 3, 2026
60ecae6
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 5, 2026
71a6e95
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 6, 2026
25fb139
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 9, 2026
8fe6a36
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 9, 2026
d7cb1a3
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 10, 2026
99b34fe
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 10, 2026
e63bfca
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 11, 2026
810af84
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 11, 2026
67142f9
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 11, 2026
58b47e7
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 12, 2026
4dfac66
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 12, 2026
a423b68
Merge branch 'main' of github.com:vercel/workflow
karthikscale3 Mar 13, 2026
4dd0046
add stepName with events
karthikscale3 Mar 13, 2026
87ba962
add changeset
karthikscale3 Mar 13, 2026
86842e7
add workflowname to run created
karthikscale3 Mar 13, 2026
8113f83
add postgres migration
karthikscale3 Mar 13, 2026
b423e2c
Merge branch 'main' of github.com:vercel/workflow into karthik/attach…
karthikscale3 Mar 13, 2026
4ecdd3c
update world-local
karthikscale3 Mar 13, 2026
895bcde
update world-local
karthikscale3 Mar 13, 2026
40cbfa0
preserve the fields in the original shape
karthikscale3 Mar 13, 2026
ca52775
Merge branch 'main' of github.com:vercel/workflow into karthik/attach…
karthikscale3 Mar 13, 2026
6f66e2c
fix tests
karthikscale3 Mar 13, 2026
896cd5e
Merge branch 'main' of github.com:vercel/workflow into karthik/attach…
karthikscale3 Mar 13, 2026
cacaa7f
strip only ref/payload fields
karthikscale3 Mar 13, 2026
23d3b56
Merge branch 'main' of github.com:vercel/workflow into karthik/attach…
karthikscale3 Mar 13, 2026
408802d
Merge branch 'main' of github.com:vercel/workflow into karthik/attach…
karthikscale3 Mar 13, 2026
1bf88fd
stub the helper into world
karthikscale3 Mar 14, 2026
00df171
add test coverage
karthikscale3 Mar 14, 2026
2b57422
fix web package
karthikscale3 Mar 14, 2026
913180a
fix web package to not pass withData: true
karthikscale3 Mar 14, 2026
5472c67
Merge branch 'main' into karthik/attach-stepname
karthikscale3 Mar 16, 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
9 changes: 9 additions & 0 deletions .changeset/wise-hornets-fetch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@workflow/web": patch
"@workflow/world": patch
"@workflow/world-vercel": patch
"@workflow/world-postgres": patch
"@workflow/world-local": patch
---

Strip only ref/payload fields from eventData when resolveData is 'none', preserving all other metadata
4 changes: 2 additions & 2 deletions packages/web/app/lib/client/hooks/use-events-list-data.ts
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@VaguelySerious - FYI I have updated web to fetch data withData: false as this change effectively fixes the core issue and I have verified it.

Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export function useEventsListData(
fetchEvents(env, runId, {
sortOrder,
limit: INITIAL_PAGE_SIZE,
withData: true,
withData: false,
})
);
if (fetchError) {
Expand Down Expand Up @@ -108,7 +108,7 @@ export function useEventsListData(
cursor,
sortOrder,
limit: LOAD_MORE_PAGE_SIZE,
withData: true,
withData: false,
})
);
if (fetchError) {
Expand Down
2 changes: 1 addition & 1 deletion packages/web/app/lib/client/hooks/use-trace-viewer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ describe('useWorkflowTraceViewerData', () => {
'run-1',
expect.objectContaining({
sortOrder: 'asc',
withData: true,
withData: false,
})
);
});
Expand Down
6 changes: 3 additions & 3 deletions packages/web/app/lib/client/hooks/use-trace-viewer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export function useWorkflowTraceViewerData(
fetchEvents(env, runId, {
sortOrder: 'asc',
limit: INITIAL_PAGE_SIZE,
withData: true,
withData: false,
})
),
]);
Expand Down Expand Up @@ -103,7 +103,7 @@ export function useWorkflowTraceViewerData(
cursor: eventsCursor,
sortOrder: 'asc',
limit: LOAD_MORE_PAGE_SIZE,
withData: true,
withData: false,
})
);

Expand Down Expand Up @@ -161,7 +161,7 @@ export function useWorkflowTraceViewerData(
cursor: eventsCursor,
sortOrder: 'asc',
limit: LIVE_POLL_LIMIT,
withData: true,
withData: false,
})
),
setItems: setEvents,
Expand Down
128 changes: 125 additions & 3 deletions packages/world-local/src/storage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ import { promises as fs } from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import { WorkflowAPIError } from '@workflow/errors';
import type { Storage } from '@workflow/world';
import { DEFAULT_TIMESTAMP_THRESHOLD_MS } from '@workflow/world';
import type { Event, Storage } from '@workflow/world';
import {
DEFAULT_TIMESTAMP_THRESHOLD_MS,
stripEventDataRefs,
} from '@workflow/world';
import { monotonicFactory } from 'ulid';
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
import { writeJSON } from './fs.js';
Expand All @@ -17,6 +20,120 @@ import {
updateStep,
} from './test-helpers.js';

describe('stripEventDataRefs', () => {
const baseEvent = {
runId: 'wrun_test',
eventId: 'evnt_test',
createdAt: new Date(),
specVersion: 2,
};

it('should strip input ref from step_created, keep stepName', () => {
const event = {
...baseEvent,
eventType: 'step_created' as const,
correlationId: 'step_1',
eventData: { stepName: 'my-step', input: new Uint8Array([1, 2, 3]) },
} as Event;

const result = stripEventDataRefs(event, 'none') as any;
expect(result.eventData).toEqual({ stepName: 'my-step' });
expect(result.eventData).not.toHaveProperty('input');
});

it('should strip input ref from run_created, keep workflowName and deploymentId', () => {
const event = {
...baseEvent,
eventType: 'run_created' as const,
eventData: {
deploymentId: 'dpl_123',
workflowName: 'my-workflow',
input: new Uint8Array([1, 2, 3]),
},
} as Event;

const result = stripEventDataRefs(event, 'none') as any;
expect(result.eventData).toEqual({
deploymentId: 'dpl_123',
workflowName: 'my-workflow',
});
expect(result.eventData).not.toHaveProperty('input');
});

it('should strip result ref from step_completed entirely', () => {
const event = {
...baseEvent,
eventType: 'step_completed' as const,
correlationId: 'step_1',
eventData: { result: new Uint8Array([4, 5]) },
} as Event;

const result = stripEventDataRefs(event, 'none') as any;
expect(result.eventData).toBeUndefined();
});

it('should strip error from run_failed, keep errorCode', () => {
const event = {
...baseEvent,
eventType: 'run_failed' as const,
eventData: { error: 'something broke', errorCode: 'TIMEOUT' },
} as Event;

const result = stripEventDataRefs(event, 'none') as any;
expect(result.eventData).toEqual({ errorCode: 'TIMEOUT' });
expect(result.eventData).not.toHaveProperty('error');
});

it('should strip error from step_failed, keep stack', () => {
const event = {
...baseEvent,
eventType: 'step_failed' as const,
correlationId: 'step_1',
eventData: { error: 'failed', stack: 'Error: failed\n at ...' },
} as Event;

const result = stripEventDataRefs(event, 'none') as any;
expect(result.eventData).toEqual({ stack: 'Error: failed\n at ...' });
expect(result.eventData).not.toHaveProperty('error');
});

it('should not strip anything when resolveData is "all"', () => {
const event = {
...baseEvent,
eventType: 'step_created' as const,
correlationId: 'step_1',
eventData: { stepName: 'my-step', input: new Uint8Array([1, 2, 3]) },
} as Event;

const result = stripEventDataRefs(event, 'all') as any;
expect(result.eventData.stepName).toBe('my-step');
expect(result.eventData.input).toBeDefined();
});

it('should pass through events with no ref fields (e.g. run_started)', () => {
const event = {
...baseEvent,
eventType: 'run_started' as const,
} as Event;

const result = stripEventDataRefs(event, 'none');
expect(result).toEqual(event);
});

it('should strip metadata from hook_created, keep token', () => {
const event = {
...baseEvent,
eventType: 'hook_created' as const,
correlationId: 'hook_1',
eventData: { token: 'tok_abc', metadata: { some: 'data' } },
} as Event;

const result = stripEventDataRefs(event, 'none') as any;
expect(result.eventData).toEqual({ token: 'tok_abc' });
expect(result.eventData).not.toHaveProperty('metadata');
});
});

describe('Storage', () => {
let testDir: string;
let storage: Storage;
Expand Down Expand Up @@ -1024,7 +1141,12 @@ describe('Storage', () => {

// step_created + step_completed = 2 events
expect(result.data).toHaveLength(2);
expect((result.data[0] as any).eventData).toBeUndefined();
// step_created: ref field 'input' stripped, metadata like stepName preserved
expect((result.data[0] as any).eventData).toEqual({
stepName: 'test-step',
Comment thread
karthikscale3 marked this conversation as resolved.
});
expect((result.data[0] as any).eventData).not.toHaveProperty('input');
// step_completed: only ref field 'result' exists, so eventData is removed entirely
expect((result.data[1] as any).eventData).toBeUndefined();
expect(result.data[0].correlationId).toBe(correlationId);
});
Expand Down
24 changes: 11 additions & 13 deletions packages/world-local/src/storage/events-storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {
writeExclusive,
writeJSON,
} from '../fs.js';
import { filterEventData } from './filters.js';
import { stripEventDataRefs } from './filters.js';
import { getObjectCreatedAt, hashToken, monotonicUlid } from './helpers.js';
import { deleteAllHooksForRun } from './hooks-storage.js';
import { handleLegacyEvent } from './legacy.js';
Expand Down Expand Up @@ -177,7 +177,7 @@ export function createEventsStorage(
const resolveData =
params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
return {
event: filterEventData(event, resolveData),
event: stripEventDataRefs(event, resolveData),
run: currentRun,
};
}
Expand Down Expand Up @@ -635,7 +635,7 @@ export function createEventsStorage(

const resolveData =
params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
const filteredEvent = filterEventData(conflictEvent, resolveData);
const filteredEvent = stripEventDataRefs(conflictEvent, resolveData);

// Return EventResult with conflict event (no hook entity created)
return {
Expand Down Expand Up @@ -758,7 +758,7 @@ export function createEventsStorage(
await writeJSON(taggedPath(basedir, 'events', compositeKey, tag), event);

const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
const filteredEvent = filterEventData(event, resolveData);
const filteredEvent = stripEventDataRefs(event, resolveData);

// Return EventResult with event and any created/updated entity
return {
Expand All @@ -783,7 +783,7 @@ export function createEventsStorage(
throw new Error(`Event ${eventId} in run ${runId} not found`);
}
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
return filterEventData(event, resolveData);
return stripEventDataRefs(event, resolveData);
},

async list(params) {
Expand All @@ -806,10 +806,9 @@ export function createEventsStorage(
if (resolveData === 'none') {
return {
...result,
data: result.data.map((event) => {
const { eventData: _eventData, ...rest } = event as any;
return rest;
}),
data: result.data.map((event) =>
stripEventDataRefs(event, resolveData)
),
};
}

Expand Down Expand Up @@ -837,10 +836,9 @@ export function createEventsStorage(
if (resolveData === 'none') {
return {
...result,
data: result.data.map((event) => {
const { eventData: _eventData, ...rest } = event as any;
return rest;
}),
data: result.data.map((event) =>
stripEventDataRefs(event, resolveData)
),
};
}

Expand Down
18 changes: 2 additions & 16 deletions packages/world-local/src/storage/filters.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import type {
Event,
Hook,
Step,
StepWithoutData,
WorkflowRun,
WorkflowRunWithoutData,
} from '@workflow/world';

export { stripEventDataRefs } from '@workflow/world';

/**
* Filter run data based on resolveData setting.
* When resolveData is 'none', strips input/output to reduce payload size.
Expand Down Expand Up @@ -64,21 +65,6 @@ export function filterStepData(
return step;
}

/**
* Filter event data based on resolveData setting.
* When resolveData is 'none', strips eventData to reduce payload size.
*/
export function filterEventData(
event: Event,
resolveData: 'none' | 'all'
): Event {
if (resolveData === 'none') {
const { eventData: _eventData, ...rest } = event as any;
return rest;
}
return event;
}

/**
* Filter hook data based on resolveData setting.
* When resolveData is 'none', strips metadata to reduce payload size.
Expand Down
4 changes: 2 additions & 2 deletions packages/world-local/src/storage/legacy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { Event, EventResult, WorkflowRun } from '@workflow/world';
import { SPEC_VERSION_CURRENT } from '@workflow/world';
import { DEFAULT_RESOLVE_DATA_OPTION } from '../config.js';
import { writeJSON } from '../fs.js';
import { filterEventData, filterRunData } from './filters.js';
import { filterRunData, stripEventDataRefs } from './filters.js';
import { monotonicUlid } from './helpers.js';
import { deleteAllHooksForRun } from './hooks-storage.js';

Expand Down Expand Up @@ -72,7 +72,7 @@ export async function handleLegacyEvent(
const compositeKey = `${runId}-${eventId}`;
const eventPath = path.join(basedir, 'events', `${compositeKey}.json`);
await writeJSON(eventPath, event);
return { event: filterEventData(event, resolveData) };
return { event: stripEventDataRefs(event, resolveData) };
}

default:
Expand Down
Loading
Loading