diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 078772388..498fc92b1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,6 +94,20 @@ check also refuse to run on `main`. Opt-in database and authenticated provider proofs require separate isolated fixtures; skipped proofs are not passing evidence. +### Temporal workflow histories + +The worker test suite runs the production workflow bundle in Temporal's +time-skipping test server. To refresh the synthetic replay fixtures, run: + +```sh +npm run temporal:record-histories -w @space/worker +``` + +Only re-record histories in the same change as a replay-safe `patched()` +workflow change. Never replace a failing fixture merely to make replay pass; +first decide whether the workflow change needs a new patch marker and add a +regression test for the behavior. + In the maintainers' source repository, `npm run check:claims` compares the version, licence, Node requirement, runtime list and key constants stated in the README and `docs/` with the code, and rejects unqualified latency or diff --git a/apps/worker/package.json b/apps/worker/package.json index d7a484ac8..9fa778b43 100644 --- a/apps/worker/package.json +++ b/apps/worker/package.json @@ -10,7 +10,8 @@ "start": "node dist/worker.js", "build": "tsc -p tsconfig.json", "check": "tsc -p tsconfig.json --noEmit", - "test": "vitest run" + "test": "vitest run", + "temporal:record-histories": "node tests/record-temporal-histories.mjs" }, "dependencies": { "@space/codex-app-server": "0.2.5", @@ -26,6 +27,7 @@ "undici": "8.10.2" }, "devDependencies": { + "@temporalio/testing": "1.24.0", "typescript": "^5.9.3", "vitest": "^4.1.12" }, diff --git a/apps/worker/tests/fixtures/workflow-histories/codex-app-server-turn.json b/apps/worker/tests/fixtures/workflow-histories/codex-app-server-turn.json new file mode 100644 index 000000000..788482575 --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/codex-app-server-turn.json @@ -0,0 +1,200 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2046-10-19T02:54:49.641Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "codexAppServerTurnWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBhbmVJZCI6InBhbmUtdGVzdC0xIiwicHJvbXB0IjoiUnVuIHRoZSBkZXRlcm1pbmlzdGljIHRlc3QuIiwidHJhY2VJZCI6InRyYWNlLXRlc3QtMSIsInByb3ZpZGVySWQiOm51bGx9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "963667df-21fd-4421-8dce-7e78da573030", + "identity": "identity:fixture", + "firstExecutionRunId": "963667df-21fd-4421-8dce-7e78da573030", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2046-10-19T02:54:49.641Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2046-10-19T02:54:49.641Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "420" + } + }, + { + "eventId": "4", + "eventTime": "2046-10-19T02:54:51.856Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 1, + 2, + 3 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2046-10-19T02:54:51.856Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "runCodexAppServerTurn" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBhbmVJZCI6InBhbmUtdGVzdC0xIiwicHJvbXB0IjoiUnVuIHRoZSBkZXRlcm1pbmlzdGljIHRlc3QuIiwidHJhY2VJZCI6InRyYWNlLXRlc3QtMSIsInByb3ZpZGVySWQiOm51bGx9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "86400s", + "heartbeatTimeout": "15s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 5 + } + } + }, + { + "eventId": "6", + "eventTime": "2046-10-19T02:54:51.856Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2046-10-19T02:54:51.865Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ3b3JrZmxvd0lkIjoidHVybi13b3JrZmxvdy0xIiwic3RhdHVzIjoiQ09NUExFVEVEIiwicm9vbUFnZW50T3V0Y29tZSI6eyJzdGF0dXMiOiJWRVJJRklFRCIsImV4ZWN1dGVkQWN0aW9uQ291bnQiOjEsInN0YXR1c1JlYXNvbiI6InN0dWIifX0=" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture" + } + }, + { + "eventId": "8", + "eventTime": "2046-10-19T02:54:51.865Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2046-10-19T02:54:51.866Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "1254" + } + }, + { + "eventId": "10", + "eventTime": "2046-10-19T02:54:51.880Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2046-10-19T02:54:51.880Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ3b3JrZmxvd0lkIjoidHVybi13b3JrZmxvdy0xIiwic3RhdHVzIjoiQ09NUExFVEVEIiwicm9vbUFnZW50T3V0Y29tZSI6eyJzdGF0dXMiOiJWRVJJRklFRCIsImV4ZWN1dGVkQWN0aW9uQ291bnQiOjEsInN0YXR1c1JlYXNvbiI6InN0dWIifX0=" + } + ] + }, + "workflowTaskCompletedEventId": "9" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/dot-goal-timeout.json b/apps/worker/tests/fixtures/workflow-histories/dot-goal-timeout.json new file mode 100644 index 000000000..af223603f --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/dot-goal-timeout.json @@ -0,0 +1,356 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2036-10-21T02:54:15.867Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "dotGoalWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJnb2FsSWQiOiJkb3RfZ29hbDp0ZXN0LTIifQ==" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "c05985aa-96f5-4ede-a2aa-a17573719940", + "identity": "identity:fixture", + "firstExecutionRunId": "c05985aa-96f5-4ede-a2aa-a17573719940", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2036-10-21T02:54:15.867Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2036-10-21T02:54:15.868Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "305" + } + }, + { + "eventId": "4", + "eventTime": "2036-10-21T02:54:17.911Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 1, + 2, + 3 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2036-10-21T02:54:17.911Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "dotGoalStep" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImRvdF9nb2FsOnRlc3QtMiI=" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "120s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "5s", + "backoffCoefficient": 2, + "maximumInterval": "120s", + "maximumAttempts": 20 + } + } + }, + { + "eventId": "6", + "eventTime": "2036-10-21T02:54:17.911Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2036-10-21T02:54:17.919Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0ZSI6IldBSVRJTkciLCJydW5JZCI6bnVsbCwiZ29hbFN0YXR1cyI6IkFDVElWRSJ9" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture" + } + }, + { + "eventId": "8", + "eventTime": "2036-10-21T02:54:17.919Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2036-10-21T02:54:17.920Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "920" + } + }, + { + "eventId": "10", + "eventTime": "2036-10-21T02:54:17.940Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2036-10-21T02:54:17.940Z", + "eventType": "EVENT_TYPE_TIMER_STARTED", + "timerStartedEventAttributes": { + "timerId": "1", + "startToFireTimeout": "30s", + "workflowTaskCompletedEventId": "9" + } + }, + { + "eventId": "12", + "eventTime": "2036-10-21T02:54:47.940Z", + "eventType": "EVENT_TYPE_TIMER_FIRED", + "timerFiredEventAttributes": { + "timerId": "1", + "startedEventId": "11" + } + }, + { + "eventId": "13", + "eventTime": "2036-10-21T02:54:47.940Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "14", + "eventTime": "2036-10-21T02:54:47.940Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "13", + "identity": "identity:fixture", + "historySizeBytes": "1217" + } + }, + { + "eventId": "15", + "eventTime": "2036-10-21T02:54:47.952Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "13", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "16", + "eventTime": "2036-10-21T02:54:47.952Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "dotGoalStep" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImRvdF9nb2FsOnRlc3QtMiI=" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "120s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "14", + "retryPolicy": { + "initialInterval": "5s", + "backoffCoefficient": 2, + "maximumInterval": "120s", + "maximumAttempts": 20 + } + } + }, + { + "eventId": "17", + "eventTime": "2036-10-21T02:54:47.953Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "16", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "18", + "eventTime": "2036-10-21T02:54:47.957Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0ZSI6IkRPTkUiLCJydW5JZCI6bnVsbCwiZ29hbFN0YXR1cyI6IkNPTVBMRVRFRCJ9" + } + ] + }, + "scheduledEventId": "16", + "startedEventId": "17", + "identity": "identity:fixture" + } + }, + { + "eventId": "19", + "eventTime": "2036-10-21T02:54:47.957Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "20", + "eventTime": "2036-10-21T02:54:47.957Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "19", + "identity": "identity:fixture", + "historySizeBytes": "1797" + } + }, + { + "eventId": "21", + "eventTime": "2036-10-21T02:54:47.967Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "19", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "22", + "eventTime": "2036-10-21T02:54:47.967Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJnb2FsU3RhdHVzIjoiQ09NUExFVEVEIn0=" + } + ] + }, + "workflowTaskCompletedEventId": "20" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/dot-goal-wake.json b/apps/worker/tests/fixtures/workflow-histories/dot-goal-wake.json new file mode 100644 index 000000000..f5adced52 --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/dot-goal-wake.json @@ -0,0 +1,352 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2026-10-24T02:54:11.728Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "dotGoalWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJnb2FsSWQiOiJkb3RfZ29hbDp0ZXN0LTEifQ==" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "ee783d8e-ec28-4279-b05e-6000d0760e36", + "identity": "identity:fixture", + "firstExecutionRunId": "ee783d8e-ec28-4279-b05e-6000d0760e36", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2026-10-24T02:54:11.728Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2026-10-24T02:54:11.728Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "305" + } + }, + { + "eventId": "4", + "eventTime": "2026-10-24T02:54:14.113Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 2, + 1, + 3 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2026-10-24T02:54:14.113Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "dotGoalStep" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImRvdF9nb2FsOnRlc3QtMSI=" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "120s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "5s", + "backoffCoefficient": 2, + "maximumInterval": "120s", + "maximumAttempts": 20 + } + } + }, + { + "eventId": "6", + "eventTime": "2026-10-24T02:54:14.113Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "workflowExecutionSignaledEventAttributes": { + "signalName": "dotGoalWake", + "input": {}, + "identity": "identity:fixture", + "header": {} + } + }, + { + "eventId": "7", + "eventTime": "2026-10-24T02:54:14.113Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 2 + } + }, + { + "eventId": "8", + "eventTime": "2026-10-24T02:54:14.113Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "7", + "identity": "identity:fixture", + "historySizeBytes": "797" + } + }, + { + "eventId": "9", + "eventTime": "2026-10-24T02:54:14.137Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "7", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "langUsedFlags": [ + 2 + ] + }, + "meteringMetadata": {} + } + }, + { + "eventId": "10", + "eventTime": "2026-10-24T02:54:14.113Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "11", + "eventTime": "2026-10-24T02:54:14.137Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0ZSI6IldBSVRJTkciLCJydW5JZCI6bnVsbCwiZ29hbFN0YXR1cyI6IkFDVElWRSJ9" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "9", + "identity": "identity:fixture" + } + }, + { + "eventId": "12", + "eventTime": "2026-10-24T02:54:14.137Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "13", + "eventTime": "2026-10-24T02:54:14.137Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "12", + "identity": "identity:fixture", + "historySizeBytes": "1216" + } + }, + { + "eventId": "14", + "eventTime": "2026-10-24T02:54:14.162Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "12", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "15", + "eventTime": "2026-10-24T02:54:14.162Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "dotGoalStep" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImRvdF9nb2FsOnRlc3QtMSI=" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "120s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "13", + "retryPolicy": { + "initialInterval": "5s", + "backoffCoefficient": 2, + "maximumInterval": "120s", + "maximumAttempts": 20 + } + } + }, + { + "eventId": "16", + "eventTime": "2026-10-24T02:54:14.163Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "15", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "17", + "eventTime": "2026-10-24T02:54:14.168Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0ZSI6IkRPTkUiLCJydW5JZCI6bnVsbCwiZ29hbFN0YXR1cyI6IkNPTVBMRVRFRCJ9" + } + ] + }, + "scheduledEventId": "15", + "startedEventId": "16", + "identity": "identity:fixture" + } + }, + { + "eventId": "18", + "eventTime": "2026-10-24T02:54:14.168Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "19", + "eventTime": "2026-10-24T02:54:14.168Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "18", + "identity": "identity:fixture", + "historySizeBytes": "1790" + } + }, + { + "eventId": "20", + "eventTime": "2026-10-24T02:54:14.176Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "18", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "21", + "eventTime": "2026-10-24T02:54:14.176Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJnb2FsU3RhdHVzIjoiQ09NUExFVEVEIn0=" + } + ] + }, + "workflowTaskCompletedEventId": "19" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/dummy-turn.json b/apps/worker/tests/fixtures/workflow-histories/dummy-turn.json new file mode 100644 index 000000000..c5df3519f --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/dummy-turn.json @@ -0,0 +1,302 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2026-10-24T02:53:07.084Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "dummyTurnWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBhbmVJZCI6InBhbmUtdGVzdC0xIiwicHJvbXB0IjoiUnVuIHRoZSBkZXRlcm1pbmlzdGljIHRlc3QuIiwidHJhY2VJZCI6InRyYWNlLXRlc3QtMSIsInByb3ZpZGVySWQiOm51bGx9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "3a1f1e42-7f25-4a44-8e3c-d207702c4ef7", + "identity": "identity:fixture", + "firstExecutionRunId": "3a1f1e42-7f25-4a44-8e3c-d207702c4ef7", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2026-10-24T02:53:07.084Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2026-10-24T02:53:07.121Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "409" + } + }, + { + "eventId": "4", + "eventTime": "2026-10-24T02:53:09.910Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 1, + 3, + 2 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2026-10-24T02:53:09.910Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "recordDummyTurnStarted" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBhbmVJZCI6InBhbmUtdGVzdC0xIiwicHJvbXB0IjoiUnVuIHRoZSBkZXRlcm1pbmlzdGljIHRlc3QuIiwidHJhY2VJZCI6InRyYWNlLXRlc3QtMSIsInByb3ZpZGVySWQiOm51bGx9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "6", + "eventTime": "2026-10-24T02:53:09.910Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2026-10-24T02:53:09.938Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ3b3JrZmxvd0lkIjoiZHVtbXktd29ya2Zsb3ctMSJ9" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture" + } + }, + { + "eventId": "8", + "eventTime": "2026-10-24T02:53:09.938Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2026-10-24T02:53:09.939Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "1128" + } + }, + { + "eventId": "10", + "eventTime": "2026-10-24T02:53:09.959Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2026-10-24T02:53:09.959Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "recordDummyTurnCompleted" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBhbmVJZCI6InBhbmUtdGVzdC0xIiwicHJvbXB0IjoiUnVuIHRoZSBkZXRlcm1pbmlzdGljIHRlc3QuIiwidHJhY2VJZCI6InRyYWNlLXRlc3QtMSIsInByb3ZpZGVySWQiOm51bGx9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "9", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "12", + "eventTime": "2026-10-24T02:53:09.959Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "11", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "13", + "eventTime": "2026-10-24T02:53:09.963Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ3b3JrZmxvd0lkIjoiZHVtbXktd29ya2Zsb3ctMSIsInJvb21JZCI6InJvb20tdGVzdC0xIiwicGFuZUlkIjoicGFuZS10ZXN0LTEiLCJ0cmFjZUlkIjoidHJhY2UtdGVzdC0xIiwic3RhdHVzIjoiQ09NUExFVEVEIiwibWVzc2FnZSI6InN0dWIgY29tcGxldGVkIn0=" + } + ] + }, + "scheduledEventId": "11", + "startedEventId": "12", + "identity": "identity:fixture" + } + }, + { + "eventId": "14", + "eventTime": "2026-10-24T02:53:09.963Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "15", + "eventTime": "2026-10-24T02:53:09.963Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "14", + "identity": "identity:fixture", + "historySizeBytes": "1938" + } + }, + { + "eventId": "16", + "eventTime": "2026-10-24T02:53:09.974Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "14", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "17", + "eventTime": "2026-10-24T02:53:09.974Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJ3b3JrZmxvd0lkIjoiZHVtbXktd29ya2Zsb3ctMSIsInJvb21JZCI6InJvb20tdGVzdC0xIiwicGFuZUlkIjoicGFuZS10ZXN0LTEiLCJ0cmFjZUlkIjoidHJhY2UtdGVzdC0xIiwic3RhdHVzIjoiQ09NUExFVEVEIiwibWVzc2FnZSI6InN0dWIgY29tcGxldGVkIn0=" + } + ] + }, + "workflowTaskCompletedEventId": "15" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/memory-consolidation.json b/apps/worker/tests/fixtures/workflow-histories/memory-consolidation.json new file mode 100644 index 000000000..8155ecc03 --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/memory-consolidation.json @@ -0,0 +1,200 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2076-10-11T02:55:09.643Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "memoryConsolidationWorkflow" + }, + "taskQueue": { + "name": "space-memory-maintenance", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJydW5JZCI6Im1lbW9yeS1ydW4tMiIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMyJ9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "81855e5c-0a85-420d-bdea-ecc6c165d3a6", + "identity": "identity:fixture", + "firstExecutionRunId": "81855e5c-0a85-420d-bdea-ecc6c165d3a6", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2076-10-11T02:55:09.643Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-memory-maintenance", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2076-10-11T02:55:09.658Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "348" + } + }, + { + "eventId": "4", + "eventTime": "2076-10-11T02:55:11.702Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 3, + 2, + 1 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2076-10-11T02:55:11.702Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "prepareMemoryConsolidation" + }, + "taskQueue": { + "name": "space-memory-maintenance", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJydW5JZCI6Im1lbW9yeS1ydW4tMiIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMyJ9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "600s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "6", + "eventTime": "2076-10-11T02:55:11.702Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2076-10-11T02:55:11.709Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJydW4iOnsiaWQiOiJtZW1vcnktcnVuLTEiLCJtb2RlIjoiQVVESVQiLCJ0cmlnZ2VyS2luZCI6IlNDSEVEVUxFRCIsInN0YXR1cyI6IlNVQ0NFRURFRCIsIndvcmtmbG93SWQiOiJtZW1vcnktY29uc29saWRhdGlvbi0xIiwiZGVkdXBlS2V5Ijoic2NoZWR1bGVkLW1lbW9yeS0yMDI2LTAxLTAxIiwic291cmNlSGFzaCI6ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiLCJhY3RvclVzZXJJZCI6bnVsbCwicHJvZ3Jlc3NDb21wbGV0ZWQiOjAsInByb2dyZXNzVG90YWwiOjAsImZpbmRpbmdDb3VudCI6MCwiYXBwbGllZE9wZXJhdGlvbkNvdW50IjowLCJza2lwcGVkT3BlcmF0aW9uQ291bnQiOjAsImZhaWxlZE9wZXJhdGlvbkNvdW50IjowLCJtZXRyaWNzIjp7fSwibW9kZWxJZCI6bnVsbCwiYWlWZXJpZmllZCI6ZmFsc2UsImFpRXZpZGVuY2UiOnt9LCJzdGF0dXNSZWFzb24iOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInN0YXJ0ZWRBdCI6bnVsbCwiY29tcGxldGVkQXQiOiIyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFoiLCJ1cGRhdGVkQXQiOiIyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFoifSwiY2hhbmdlU2V0SWQiOm51bGx9" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture" + } + }, + { + "eventId": "8", + "eventTime": "2076-10-11T02:55:11.709Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-memory-maintenance", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2076-10-11T02:55:11.709Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "1613" + } + }, + { + "eventId": "10", + "eventTime": "2076-10-11T02:55:11.726Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2076-10-11T02:55:11.726Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJpZCI6Im1lbW9yeS1ydW4tMSIsIm1vZGUiOiJBVURJVCIsInRyaWdnZXJLaW5kIjoiU0NIRURVTEVEIiwic3RhdHVzIjoiU1VDQ0VFREVEIiwid29ya2Zsb3dJZCI6Im1lbW9yeS1jb25zb2xpZGF0aW9uLTEiLCJkZWR1cGVLZXkiOiJzY2hlZHVsZWQtbWVtb3J5LTIwMjYtMDEtMDEiLCJzb3VyY2VIYXNoIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImFjdG9yVXNlcklkIjpudWxsLCJwcm9ncmVzc0NvbXBsZXRlZCI6MCwicHJvZ3Jlc3NUb3RhbCI6MCwiZmluZGluZ0NvdW50IjowLCJhcHBsaWVkT3BlcmF0aW9uQ291bnQiOjAsInNraXBwZWRPcGVyYXRpb25Db3VudCI6MCwiZmFpbGVkT3BlcmF0aW9uQ291bnQiOjAsIm1ldHJpY3MiOnt9LCJtb2RlbElkIjpudWxsLCJhaVZlcmlmaWVkIjpmYWxzZSwiYWlFdmlkZW5jZSI6e30sInN0YXR1c1JlYXNvbiI6bnVsbCwiY3JlYXRlZEF0IjoiMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaIiwic3RhcnRlZEF0IjpudWxsLCJjb21wbGV0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInVwZGF0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiJ9" + } + ] + }, + "workflowTaskCompletedEventId": "9" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/memory-maintenance.json b/apps/worker/tests/fixtures/workflow-histories/memory-maintenance.json new file mode 100644 index 000000000..f213c2ec7 --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/memory-maintenance.json @@ -0,0 +1,642 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2056-10-16T02:54:55.518Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "memoryMaintenanceWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzY2hlZHVsZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMSJ9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "3da7f7c6-afbd-497f-8cc0-25a0d82d1e41", + "identity": "identity:fixture", + "firstExecutionRunId": "3da7f7c6-afbd-497f-8cc0-25a0d82d1e41", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2056-10-16T02:54:55.518Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2056-10-16T02:54:55.518Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "356" + } + }, + { + "eventId": "4", + "eventTime": "2056-10-16T02:54:57.516Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 2, + 3, + 1 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2056-10-16T02:54:57.516Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "refreshMemoryGraphSnapshot" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzY2hlZHVsZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMSJ9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "600s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "6", + "eventTime": "2056-10-16T02:54:57.516Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2056-10-16T02:54:57.527Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0dXMiOiJSRUZSRVNIRUQiLCJnZW5lcmF0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInNvdXJjZUhhc2giOiJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwicHJldmlvdXNTb3VyY2VIYXNoIjpudWxsLCJzdW1tYXJ5Ijp7fSwiZHVyYXRpb25NcyI6MX0=" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture" + } + }, + { + "eventId": "8", + "eventTime": "2056-10-16T02:54:57.527Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2056-10-16T02:54:57.527Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "1186" + } + }, + { + "eventId": "10", + "eventTime": "2056-10-16T02:54:57.547Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2056-10-16T02:54:57.547Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "refreshAllMonthsMemoryGraphSnapshot" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzY2hlZHVsZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMSJ9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "600s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "9", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "12", + "eventTime": "2056-10-16T02:54:57.547Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "11", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "13", + "eventTime": "2056-10-16T02:54:57.551Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "e30=" + } + ] + }, + "scheduledEventId": "11", + "startedEventId": "12", + "identity": "identity:fixture" + } + }, + { + "eventId": "14", + "eventTime": "2056-10-16T02:54:57.551Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "15", + "eventTime": "2056-10-16T02:54:57.551Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "14", + "identity": "identity:fixture", + "historySizeBytes": "1791" + } + }, + { + "eventId": "16", + "eventTime": "2056-10-16T02:54:57.560Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "14", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "17", + "eventTime": "2056-10-16T02:54:57.560Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "3", + "activityType": { + "name": "reconcileStaleSpaceAgentSessions" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": {}, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "600s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "15", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "18", + "eventTime": "2056-10-16T02:54:57.560Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "17", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "19", + "eventTime": "2056-10-16T02:54:57.565Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "e30=" + } + ] + }, + "scheduledEventId": "17", + "startedEventId": "18", + "identity": "identity:fixture" + } + }, + { + "eventId": "20", + "eventTime": "2056-10-16T02:54:57.565Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "21", + "eventTime": "2056-10-16T02:54:57.565Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "20", + "identity": "identity:fixture", + "historySizeBytes": "2295" + } + }, + { + "eventId": "22", + "eventTime": "2056-10-16T02:54:57.574Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "20", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "23", + "eventTime": "2056-10-16T02:54:57.574Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "4", + "activityType": { + "name": "createScheduledMemoryAudit" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzY2hlZHVsZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMSIsInNvdXJjZUhhc2giOiJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIn0=" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "600s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "21", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "24", + "eventTime": "2056-10-16T02:54:57.574Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "23", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "25", + "eventTime": "2056-10-16T02:54:57.578Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJpZCI6Im1lbW9yeS1ydW4tMSIsIm1vZGUiOiJBVURJVCIsInRyaWdnZXJLaW5kIjoiU0NIRURVTEVEIiwic3RhdHVzIjoiU1VDQ0VFREVEIiwid29ya2Zsb3dJZCI6Im1lbW9yeS1jb25zb2xpZGF0aW9uLTEiLCJkZWR1cGVLZXkiOiJzY2hlZHVsZWQtbWVtb3J5LTIwMjYtMDEtMDEiLCJzb3VyY2VIYXNoIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImFjdG9yVXNlcklkIjpudWxsLCJwcm9ncmVzc0NvbXBsZXRlZCI6MCwicHJvZ3Jlc3NUb3RhbCI6MCwiZmluZGluZ0NvdW50IjowLCJhcHBsaWVkT3BlcmF0aW9uQ291bnQiOjAsInNraXBwZWRPcGVyYXRpb25Db3VudCI6MCwiZmFpbGVkT3BlcmF0aW9uQ291bnQiOjAsIm1ldHJpY3MiOnt9LCJtb2RlbElkIjpudWxsLCJhaVZlcmlmaWVkIjpmYWxzZSwiYWlFdmlkZW5jZSI6e30sInN0YXR1c1JlYXNvbiI6bnVsbCwiY3JlYXRlZEF0IjoiMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaIiwic3RhcnRlZEF0IjpudWxsLCJjb21wbGV0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInVwZGF0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiJ9" + } + ] + }, + "scheduledEventId": "23", + "startedEventId": "24", + "identity": "identity:fixture" + } + }, + { + "eventId": "26", + "eventTime": "2056-10-16T02:54:57.578Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "27", + "eventTime": "2056-10-16T02:54:57.579Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "26", + "identity": "identity:fixture", + "historySizeBytes": "3591" + } + }, + { + "eventId": "28", + "eventTime": "2056-10-16T02:54:57.596Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "26", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "29", + "eventTime": "2056-10-16T02:54:57.596Z", + "eventType": "EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED", + "startChildWorkflowExecutionInitiatedEventAttributes": { + "namespace": "default", + "workflowId": "memory-consolidation-1", + "workflowType": { + "name": "memoryConsolidationWorkflow" + }, + "taskQueue": { + "name": "space-memory-maintenance", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJydW5JZCI6Im1lbW9yeS1ydW4tMSIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMSJ9" + } + ] + }, + "workflowExecutionTimeout": "0s", + "workflowRunTimeout": "0s", + "workflowTaskTimeout": "10s", + "workflowTaskCompletedEventId": "27", + "header": {}, + "memo": {} + } + }, + { + "eventId": "30", + "eventTime": "2056-10-16T02:54:57.598Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED", + "childWorkflowExecutionStartedEventAttributes": { + "namespace": "default", + "initiatedEventId": "29", + "workflowExecution": { + "workflowId": "memory-consolidation-1", + "runId": "cc2ffbbe-07ea-4d61-907c-341af97d7a34" + }, + "workflowType": { + "name": "memoryConsolidationWorkflow" + } + } + }, + { + "eventId": "31", + "eventTime": "2056-10-16T02:54:57.598Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "32", + "eventTime": "2056-10-16T02:54:57.598Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "31", + "identity": "identity:fixture", + "historySizeBytes": "4171" + } + }, + { + "eventId": "33", + "eventTime": "2056-10-16T02:54:57.616Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "31", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "34", + "eventTime": "2056-10-16T02:55:00.154Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED", + "childWorkflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJpZCI6Im1lbW9yeS1ydW4tMSIsIm1vZGUiOiJBVURJVCIsInRyaWdnZXJLaW5kIjoiU0NIRURVTEVEIiwic3RhdHVzIjoiU1VDQ0VFREVEIiwid29ya2Zsb3dJZCI6Im1lbW9yeS1jb25zb2xpZGF0aW9uLTEiLCJkZWR1cGVLZXkiOiJzY2hlZHVsZWQtbWVtb3J5LTIwMjYtMDEtMDEiLCJzb3VyY2VIYXNoIjoiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsImFjdG9yVXNlcklkIjpudWxsLCJwcm9ncmVzc0NvbXBsZXRlZCI6MCwicHJvZ3Jlc3NUb3RhbCI6MCwiZmluZGluZ0NvdW50IjowLCJhcHBsaWVkT3BlcmF0aW9uQ291bnQiOjAsInNraXBwZWRPcGVyYXRpb25Db3VudCI6MCwiZmFpbGVkT3BlcmF0aW9uQ291bnQiOjAsIm1ldHJpY3MiOnt9LCJtb2RlbElkIjpudWxsLCJhaVZlcmlmaWVkIjpmYWxzZSwiYWlFdmlkZW5jZSI6e30sInN0YXR1c1JlYXNvbiI6bnVsbCwiY3JlYXRlZEF0IjoiMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaIiwic3RhcnRlZEF0IjpudWxsLCJjb21wbGV0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInVwZGF0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiJ9" + } + ] + }, + "namespace": "default", + "workflowExecution": { + "workflowId": "memory-consolidation-1", + "runId": "cc2ffbbe-07ea-4d61-907c-341af97d7a34" + }, + "workflowType": { + "name": "memoryConsolidationWorkflow" + }, + "initiatedEventId": "29", + "startedEventId": "30" + } + }, + { + "eventId": "35", + "eventTime": "2056-10-16T02:55:00.154Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "36", + "eventTime": "2056-10-16T02:55:00.154Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "35", + "identity": "identity:fixture", + "historySizeBytes": "5188" + } + }, + { + "eventId": "37", + "eventTime": "2056-10-16T02:55:00.176Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "35", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "38", + "eventTime": "2056-10-16T02:55:00.176Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0dXMiOiJSRUZSRVNIRUQiLCJnZW5lcmF0ZWRBdCI6IjIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiIsInNvdXJjZUhhc2giOiJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIiwicHJldmlvdXNTb3VyY2VIYXNoIjpudWxsLCJzdW1tYXJ5Ijp7fSwiZHVyYXRpb25NcyI6MX0=" + } + ] + }, + "workflowTaskCompletedEventId": "36" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/memory-mutation.json b/apps/worker/tests/fixtures/workflow-histories/memory-mutation.json new file mode 100644 index 000000000..a137951b6 --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/memory-mutation.json @@ -0,0 +1,200 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2076-10-11T02:55:13.201Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "memoryMutationWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJjaGFuZ2VTZXRJZCI6ImNoYW5nZS1zZXQtMSIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMiJ9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "90ec45e8-ae94-4852-9a16-1d0931d65f53", + "identity": "identity:fixture", + "firstExecutionRunId": "90ec45e8-ae94-4852-9a16-1d0931d65f53", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2076-10-11T02:55:13.201Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2076-10-11T02:55:13.209Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "339" + } + }, + { + "eventId": "4", + "eventTime": "2076-10-11T02:55:15.309Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 2, + 3, + 1 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2076-10-11T02:55:15.309Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "executePersistedMemoryChangeSet" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJjaGFuZ2VTZXRJZCI6ImNoYW5nZS1zZXQtMSIsInRyYWNlSWQiOiJ0cmFjZS1tZW1vcnktMiJ9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "900s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 3 + } + } + }, + { + "eventId": "6", + "eventTime": "2076-10-11T02:55:15.310Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2076-10-11T02:55:15.315Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0dXMiOiJESVNBQkxFRCIsImNoYW5nZVNldElkIjoiY2hhbmdlLXNldC0xIiwicmVzdWx0aW5nU291cmNlSGFzaCI6bnVsbCwicmVhc29uIjoic3R1YiJ9" + } + ] + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture" + } + }, + { + "eventId": "8", + "eventTime": "2076-10-11T02:55:15.315Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2076-10-11T02:55:15.315Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "1054" + } + }, + { + "eventId": "10", + "eventTime": "2076-10-11T02:55:15.328Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2076-10-11T02:55:15.328Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED", + "workflowExecutionCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJzdGF0dXMiOiJESVNBQkxFRCIsImNoYW5nZVNldElkIjoiY2hhbmdlLXNldC0xIiwicmVzdWx0aW5nU291cmNlSGFzaCI6bnVsbCwicmVhc29uIjoic3R1YiJ9" + } + ] + }, + "workflowTaskCompletedEventId": "9" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/room-agent-action-failure.json b/apps/worker/tests/fixtures/workflow-histories/room-agent-action-failure.json new file mode 100644 index 000000000..9878db13b --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/room-agent-action-failure.json @@ -0,0 +1,351 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2066-10-14T02:55:01.937Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "roomAgentActionWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJicmlkZ2UiOnsicm9vbUlkIjoicm9vbS10ZXN0LTEiLCJtaXNzaW9uSWQiOiJtaXNzaW9uLXRlc3QtMSIsImFnZW50UGFuZUlkIjoicGFuZS10ZXN0LTEiLCJhZ2VudFNlc3Npb25JZCI6InNlc3Npb24tdGVzdC0xIiwic2VsZWN0ZWRUb29sSWRzIjpbXSwiYWN0aW9ucyI6W3sidG9vbElkIjoicm9vbTppbnNwZWN0IiwiYWN0aW9uIjp7InR5cGUiOiJpbnNwZWN0In19XX0sInRyYWNlSWQiOiJ0cmFjZS1hY3Rpb24tMSJ9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "e0971550-eef4-4e05-a51a-9e6573dd3d4c", + "identity": "identity:fixture", + "firstExecutionRunId": "e0971550-eef4-4e05-a51a-9e6573dd3d4c", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2066-10-14T02:55:01.937Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2066-10-14T02:55:01.946Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "528" + } + }, + { + "eventId": "4", + "eventTime": "2066-10-14T02:55:04.040Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 2, + 1, + 3 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2066-10-14T02:55:04.040Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "runRoomAgentBackgroundAction" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJicmlkZ2UiOnsicm9vbUlkIjoicm9vbS10ZXN0LTEiLCJtaXNzaW9uSWQiOiJtaXNzaW9uLXRlc3QtMSIsImFnZW50UGFuZUlkIjoicGFuZS10ZXN0LTEiLCJhZ2VudFNlc3Npb25JZCI6InNlc3Npb24tdGVzdC0xIiwic2VsZWN0ZWRUb29sSWRzIjpbXSwiYWN0aW9ucyI6W3sidG9vbElkIjoicm9vbTppbnNwZWN0IiwiYWN0aW9uIjp7InR5cGUiOiJpbnNwZWN0In19XX0sInRyYWNlSWQiOiJ0cmFjZS1hY3Rpb24tMSJ9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "86400s", + "heartbeatTimeout": "15s", + "workflowTaskCompletedEventId": "3", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 5 + } + } + }, + { + "eventId": "6", + "eventTime": "2066-10-14T02:55:04.040Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "5", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "7", + "eventTime": "2066-10-14T02:55:04.063Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_FAILED", + "activityTaskFailedEventAttributes": { + "failure": { + "message": "transport failed", + "source": "TypeScriptSDK", + "applicationFailureInfo": { + "type": "ROOM_ACTION_TRANSPORT_FAILED", + "nonRetryable": true + } + }, + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture", + "retryState": "RETRY_STATE_NON_RETRYABLE_FAILURE" + } + }, + { + "eventId": "8", + "eventTime": "2066-10-14T02:55:04.063Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "9", + "eventTime": "2066-10-14T02:55:04.063Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "historySizeBytes": "1788" + } + }, + { + "eventId": "10", + "eventTime": "2066-10-14T02:55:04.096Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2066-10-14T02:55:04.096Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "markerRecordedEventAttributes": { + "markerName": "core_patch", + "details": { + "patch-data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJpZCI6InJvb20tYmFja2dyb3VuZC1hY3Rpb24tZmFpbHVyZS12MSIsImRlcHJlY2F0ZWQiOmZhbHNlfQ==" + } + ] + } + }, + "workflowTaskCompletedEventId": "9" + } + }, + { + "eventId": "12", + "eventTime": "2066-10-14T02:55:04.096Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "9", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "type": "S2V5d29yZExpc3Q=", + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "WyJyb29tLWJhY2tncm91bmQtYWN0aW9uLWZhaWx1cmUtdjEiXQ==" + } + } + } + } + }, + { + "eventId": "13", + "eventTime": "2066-10-14T02:55:04.096Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "failRoomAgentBackgroundAction" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsIm1pc3Npb25JZCI6Im1pc3Npb24tdGVzdC0xIiwiYWN0aW9uSWQiOiJyZWFsLWZhaWx1cmUtMSIsImNhbmNlbGxlZCI6ZmFsc2V9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "9", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 5 + } + } + }, + { + "eventId": "14", + "eventTime": "2066-10-14T02:55:04.096Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "13", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "15", + "eventTime": "2066-10-14T02:55:04.100Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L251bGw=" + } + } + ] + }, + "scheduledEventId": "13", + "startedEventId": "14", + "identity": "identity:fixture" + } + }, + { + "eventId": "16", + "eventTime": "2066-10-14T02:55:04.100Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "17", + "eventTime": "2066-10-14T02:55:04.100Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "16", + "identity": "identity:fixture", + "historySizeBytes": "2681" + } + }, + { + "eventId": "18", + "eventTime": "2066-10-14T02:55:04.117Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "16", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "19", + "eventTime": "2066-10-14T02:55:04.117Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_FAILED", + "workflowExecutionFailedEventAttributes": { + "failure": { + "message": "Activity task failed", + "cause": { + "message": "transport failed", + "source": "TypeScriptSDK", + "applicationFailureInfo": { + "type": "ROOM_ACTION_TRANSPORT_FAILED", + "nonRetryable": true + } + }, + "activityFailureInfo": { + "scheduledEventId": "5", + "startedEventId": "6", + "identity": "identity:fixture", + "activityType": { + "name": "runRoomAgentBackgroundAction" + }, + "activityId": "1", + "retryState": "RETRY_STATE_NON_RETRYABLE_FAILURE" + } + }, + "workflowTaskCompletedEventId": "17" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/room-agent-supervisor-prepatch.json b/apps/worker/tests/fixtures/workflow-histories/room-agent-supervisor-prepatch.json new file mode 100644 index 000000000..5f3f61828 --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/room-agent-supervisor-prepatch.json @@ -0,0 +1,90 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2026-10-24T02:52:53.472Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "roomAgentSupervisorWorkflow" + }, + "taskQueue": { + "name": "space-legacy-supervisor-fixture", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLWZpeHR1cmUiLCJwZW5kaW5nIjpbXSwibW9uaXRvcmluZ01pc3Npb25JZHMiOltdLCJpbnRlcnJ1cHRlZCI6W10sInByb2Nlc3NlZENvdW50IjowfQ==" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "bf37d026-234e-47b9-a8f7-d764d9d8d667", + "identity": "identity:fixture", + "firstExecutionRunId": "bf37d026-234e-47b9-a8f7-d764d9d8d667", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2026-10-24T02:52:53.472Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-legacy-supervisor-fixture", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2026-10-24T02:52:53.473Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "411" + } + }, + { + "eventId": "4", + "eventTime": "2026-10-24T02:52:54.015Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+c4aba720e2fc65568324b0f9341d40d84f16bf69f42022b15990250fd4c363f3", + "sdkMetadata": { + "coreUsedFlags": [ + 3, + 1, + 2 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2026-10-24T02:52:54.097Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED", + "workflowExecutionTerminatedEventAttributes": { + "reason": "fixture complete", + "details": {}, + "identity": "identity:fixture" + } + } + ] +} diff --git a/apps/worker/tests/fixtures/workflow-histories/room-agent-supervisor.json b/apps/worker/tests/fixtures/workflow-histories/room-agent-supervisor.json new file mode 100644 index 000000000..07a2aa66c --- /dev/null +++ b/apps/worker/tests/fixtures/workflow-histories/room-agent-supervisor.json @@ -0,0 +1,389 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2076-10-11T02:55:05.599Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "roomAgentSupervisorWorkflow" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBlbmRpbmciOltdLCJtb25pdG9yaW5nTWlzc2lvbklkcyI6W10sImludGVycnVwdGVkIjpbXSwicHJvY2Vzc2VkQ291bnQiOjB9" + } + ] + }, + "workflowExecutionTimeout": "315360000s", + "workflowRunTimeout": "315360000s", + "workflowTaskTimeout": "10s", + "originalExecutionRunId": "09b4e3d3-bc0e-405d-95c7-36d8dd68cf06", + "identity": "identity:fixture", + "firstExecutionRunId": "09b4e3d3-bc0e-405d-95c7-36d8dd68cf06", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {} + } + }, + { + "eventId": "2", + "eventTime": "2076-10-11T02:55:05.599Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2076-10-11T02:55:05.603Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "workflowExecutionSignaledEventAttributes": { + "signalName": "enqueueRoomAgentMission", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJtaXNzaW9uSWQiOiJtaXNzaW9uLXRlc3QtMSIsInR1cm4iOnsicm9vbUlkIjoicm9vbS10ZXN0LTEiLCJwYW5lSWQiOiJwYW5lLXRlc3QtMSIsInByb21wdCI6IlJ1biB0aGUgZGV0ZXJtaW5pc3RpYyB0ZXN0LiIsInRyYWNlSWQiOiJ0cmFjZS10ZXN0LTEiLCJwcm92aWRlcklkIjpudWxsLCJhZ2VudFJ1bklkIjoiYWdlbnQtcnVuLTEifX0=" + } + ] + }, + "identity": "identity:fixture", + "header": {} + } + }, + { + "eventId": "4", + "eventTime": "2076-10-11T02:55:05.604Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "historySizeBytes": "687" + } + }, + { + "eventId": "5", + "eventTime": "2076-10-11T02:55:07.798Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": { + "coreUsedFlags": [ + 1, + 3, + 2 + ], + "langUsedFlags": [ + 2 + ], + "sdkName": "temporal-typescript", + "sdkVersion": "1.24.0" + }, + "meteringMetadata": {} + } + }, + { + "eventId": "6", + "eventTime": "2076-10-11T02:55:07.798Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "markerRecordedEventAttributes": { + "markerName": "core_patch", + "details": { + "patch-data": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJpZCI6InJvb20tYmFja2dyb3VuZC1jb250aW51YXRpb24tdjEiLCJkZXByZWNhdGVkIjpmYWxzZX0=" + } + ] + } + }, + "workflowTaskCompletedEventId": "4" + } + }, + { + "eventId": "7", + "eventTime": "2076-10-11T02:55:07.798Z", + "eventType": "EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES", + "upsertWorkflowSearchAttributesEventAttributes": { + "workflowTaskCompletedEventId": "4", + "searchAttributes": { + "indexedFields": { + "TemporalChangeVersion": { + "metadata": { + "encoding": "anNvbi9wbGFpbg==", + "type": "S2V5d29yZExpc3Q=" + }, + "data": "WyJyb29tLWJhY2tncm91bmQtY29udGludWF0aW9uLXYxIl0=" + } + } + } + } + }, + { + "eventId": "8", + "eventTime": "2076-10-11T02:55:07.798Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "1", + "activityType": { + "name": "checkRoomAgentSupervisorTurn" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJtaXNzaW9uSWQiOiJtaXNzaW9uLXRlc3QtMSIsInR1cm4iOnsicm9vbUlkIjoicm9vbS10ZXN0LTEiLCJwYW5lSWQiOiJwYW5lLXRlc3QtMSIsInByb21wdCI6IlJ1biB0aGUgZGV0ZXJtaW5pc3RpYyB0ZXN0LiIsImFydGlmYWN0SWRzIjpbXSwicHJvdmlkZXJJZCI6bnVsbCwiYWdlbnRSdW5JZCI6ImFnZW50LXJ1bi0xIiwicGVybWlzc2lvbk1vZGUiOm51bGwsImNvbGxhYm9yYXRpb25Nb2RlIjoiZGVmYXVsdCIsInRyYWNlSWQiOiJ0cmFjZS10ZXN0LTEifX0=" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "4", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 5 + } + } + }, + { + "eventId": "9", + "eventTime": "2076-10-11T02:55:07.798Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "8", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "10", + "eventTime": "2076-10-11T02:55:07.804Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IlNLSVAi" + } + ] + }, + "scheduledEventId": "8", + "startedEventId": "9", + "identity": "identity:fixture" + } + }, + { + "eventId": "11", + "eventTime": "2076-10-11T02:55:07.804Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "12", + "eventTime": "2076-10-11T02:55:07.804Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "11", + "identity": "identity:fixture", + "historySizeBytes": "1795" + } + }, + { + "eventId": "13", + "eventTime": "2076-10-11T02:55:07.818Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "11", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "14", + "eventTime": "2076-10-11T02:55:07.818Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_SCHEDULED", + "activityTaskScheduledEventAttributes": { + "activityId": "2", + "activityType": { + "name": "discardRoomAgentSupervisorTurn" + }, + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "header": {}, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJpdGVtIjp7Im1pc3Npb25JZCI6Im1pc3Npb24tdGVzdC0xIiwidHVybiI6eyJyb29tSWQiOiJyb29tLXRlc3QtMSIsInBhbmVJZCI6InBhbmUtdGVzdC0xIiwicHJvbXB0IjoiUnVuIHRoZSBkZXRlcm1pbmlzdGljIHRlc3QuIiwiYXJ0aWZhY3RJZHMiOltdLCJwcm92aWRlcklkIjpudWxsLCJhZ2VudFJ1bklkIjoiYWdlbnQtcnVuLTEiLCJwZXJtaXNzaW9uTW9kZSI6bnVsbCwiY29sbGFib3JhdGlvbk1vZGUiOiJkZWZhdWx0IiwidHJhY2VJZCI6InRyYWNlLXRlc3QtMSJ9fSwicmVhc29uIjoiVHVybiBpcyBubyBsb25nZXIgYWN0aXZlIG9yIHdhcyBzdXBlcnNlZGVkLiJ9" + } + ] + }, + "scheduleToCloseTimeout": "315360000s", + "scheduleToStartTimeout": "315360000s", + "startToCloseTimeout": "60s", + "heartbeatTimeout": "0s", + "workflowTaskCompletedEventId": "12", + "retryPolicy": { + "initialInterval": "1s", + "backoffCoefficient": 2, + "maximumInterval": "100s", + "maximumAttempts": 5 + } + } + }, + { + "eventId": "15", + "eventTime": "2076-10-11T02:55:07.818Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_STARTED", + "activityTaskStartedEventAttributes": { + "scheduledEventId": "14", + "identity": "identity:fixture", + "attempt": 1 + } + }, + { + "eventId": "16", + "eventTime": "2076-10-11T02:55:07.822Z", + "eventType": "EVENT_TYPE_ACTIVITY_TASK_COMPLETED", + "activityTaskCompletedEventAttributes": { + "result": { + "payloads": [ + { + "metadata": { + "encoding": "YmluYXJ5L251bGw=" + } + } + ] + }, + "scheduledEventId": "14", + "startedEventId": "15", + "identity": "identity:fixture" + } + }, + { + "eventId": "17", + "eventTime": "2076-10-11T02:55:07.822Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "18", + "eventTime": "2076-10-11T02:55:07.822Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "17", + "identity": "identity:fixture", + "historySizeBytes": "2652" + } + }, + { + "eventId": "19", + "eventTime": "2076-10-11T02:55:07.830Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "17", + "identity": "identity:fixture", + "binaryChecksum": "@temporalio/worker@1.24.0+31bfb993235c5a0ab72d09c13910d93f0257b8b47833e90a5400b2cb388007b3", + "sdkMetadata": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "20", + "eventTime": "2076-10-11T02:55:07.855Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED", + "workflowExecutionSignaledEventAttributes": { + "signalName": "stopRoomAgentMission", + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJtaXNzaW9uSWQiOm51bGwsInJlYXNvbiI6InRlc3QgY2xlYW51cCJ9" + } + ] + }, + "identity": "identity:fixture", + "header": {} + } + }, + { + "eventId": "21", + "eventTime": "2076-10-11T02:55:07.855Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "space-real-workflows", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "10s", + "attempt": 1 + } + }, + { + "eventId": "22", + "eventTime": "2076-10-11T02:55:07.855Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "21", + "identity": "identity:fixture", + "historySizeBytes": "3033" + } + } + ] +} diff --git a/apps/worker/tests/record-temporal-histories.mjs b/apps/worker/tests/record-temporal-histories.mjs new file mode 100644 index 000000000..06c72a4b1 --- /dev/null +++ b/apps/worker/tests/record-temporal-histories.mjs @@ -0,0 +1,15 @@ +import { spawn } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const here = path.dirname(fileURLToPath(import.meta.url)); +const vitest = path.resolve(here, "../../../node_modules/vitest/vitest.mjs"); +const child = spawn(process.execPath, [vitest, "run", "tests/temporal-workflows.test.ts", "tests/temporal-legacy-history.test.ts", "--config", "vitest.config.ts"], { + cwd: path.resolve(here, ".."), + env: { ...process.env, TEMPORAL_RECORD_HISTORIES: "1" }, + stdio: "inherit" +}); +child.on("exit", (code, signal) => { + if (signal) process.kill(process.pid, signal); + process.exit(code ?? 1); +}); diff --git a/apps/worker/tests/support/sanitize-temporal-history.ts b/apps/worker/tests/support/sanitize-temporal-history.ts new file mode 100644 index 000000000..d9239f659 --- /dev/null +++ b/apps/worker/tests/support/sanitize-temporal-history.ts @@ -0,0 +1,21 @@ +import { historyToJSON } from "@temporalio/common/lib/proto-utils"; + +/** Keep committed Temporal histories portable across machines. */ +export function sanitizeTemporalHistory(history: Parameters[0]): string { + const parsed: unknown = JSON.parse(historyToJSON(history)); + + const visit = (value: unknown): unknown => { + if (Array.isArray(value)) return value.map(visit); + if (value && typeof value === "object") { + const result: Record = {}; + for (const [key, child] of Object.entries(value)) { + if (key === "stackTrace") continue; + result[key] = key === "identity" ? "identity:fixture" : visit(child); + } + return result; + } + return value; + }; + + return `${JSON.stringify(visit(parsed), null, 2)}\n`; +} diff --git a/apps/worker/tests/temporal-legacy-history.test.ts b/apps/worker/tests/temporal-legacy-history.test.ts new file mode 100644 index 000000000..b2ea3d569 --- /dev/null +++ b/apps/worker/tests/temporal-legacy-history.test.ts @@ -0,0 +1,74 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { beforeAll, afterAll, describe, expect, it } from "vitest"; +import { TestWorkflowEnvironment } from "@temporalio/testing"; +import { Worker, bundleWorkflowCode, type WorkflowBundle } from "@temporalio/worker"; +import { sanitizeTemporalHistory } from "./support/sanitize-temporal-history.js"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../.."); +const fixtureRoot = path.join(repoRoot, "apps/worker/tests/fixtures/workflow-histories"); +const workflowEntry = path.join(repoRoot, "apps/worker/tests/support/temporal-legacy-workflows.ts"); +const queue = "space-legacy-supervisor-fixture"; + +type FixtureWorkflowHandle = { + fetchHistory: () => Promise<{ + events?: Array<{ + workflowTaskCompletedEventAttributes?: unknown; + markerRecordedEventAttributes?: { markerName?: string }; + }>; + }>; + terminate: (reason?: string) => Promise; +}; + +/** Poll a legacy workflow until its first task is recorded before termination. */ +async function waitForWorkflowTaskCompletion(handle: FixtureWorkflowHandle) { + const deadline = Date.now() + 30_000; + while (true) { + const history = await handle.fetchHistory(); + if (history.events?.some((event) => event.workflowTaskCompletedEventAttributes)) return history; + if (Date.now() > deadline) throw new Error("Timed out waiting for the first workflow task to complete"); + await new Promise((resolve) => setTimeout(resolve, 100)); + } +} + +describe("legacy Temporal fixture recorder", () => { + const enabled = process.env.TEMPORAL_RECORD_HISTORIES === "1"; + let environment: TestWorkflowEnvironment; + let workflowBundle: WorkflowBundle; + + beforeAll(async () => { + if (!enabled) return; + workflowBundle = await bundleWorkflowCode({ workflowsPath: workflowEntry }); + environment = await TestWorkflowEnvironment.createTimeSkipping(); + }, 120_000); + + afterAll(async () => { + await environment?.teardown(); + }, 120_000); + + it.skipIf(!enabled)("records a pre-patch supervisor waiting history", async () => { + const worker = await Worker.create({ + connection: environment.nativeConnection, + namespace: environment.namespace, + taskQueue: queue, + workflowBundle + }); + const run = worker.run(); + const handle = await environment.client.workflow.start("roomAgentSupervisorWorkflow", { + taskQueue: queue, + workflowId: "fixture-room-agent-supervisor-prepatch", + args: [{ roomId: "room-fixture", pending: [], monitoringMissionIds: [], interrupted: [], processedCount: 0 }] + }); + await waitForWorkflowTaskCompletion(handle); + await handle.terminate("fixture complete"); + const history = await handle.fetchHistory(); + await fs.mkdir(fixtureRoot, { recursive: true }); + await fs.writeFile(path.join(fixtureRoot, "room-agent-supervisor-prepatch.json"), sanitizeTemporalHistory(history), "utf8"); + await worker.shutdown(); + await run; + expect(history.events.length).toBeGreaterThan(1); + expect(history.events.some((event) => event.markerRecordedEventAttributes?.markerName === "core_patch")).toBe(false); + }, 120_000); +}); + diff --git a/apps/worker/tests/temporal-legacy-workflows.ts b/apps/worker/tests/temporal-legacy-workflows.ts new file mode 100644 index 000000000..17dbe16cb --- /dev/null +++ b/apps/worker/tests/temporal-legacy-workflows.ts @@ -0,0 +1,12 @@ +import { condition } from "@temporalio/workflow"; +import type { RoomAgentSupervisorInput } from "@space/contracts"; + +/** + * Minimal pre-patch supervisor used only to produce a history without the + * `room-background-continuation-v1` marker. The current supervisor must keep + * replaying this waiting history through its legacy branch. + */ +export async function roomAgentSupervisorWorkflow(_input: RoomAgentSupervisorInput): Promise { + await condition(() => false); + return roomAgentSupervisorWorkflow(_input); +} diff --git a/apps/worker/tests/temporal-negative-workflows.ts b/apps/worker/tests/temporal-negative-workflows.ts new file mode 100644 index 000000000..72e87e194 --- /dev/null +++ b/apps/worker/tests/temporal-negative-workflows.ts @@ -0,0 +1,19 @@ +import { proxyActivities, sleep } from "@temporalio/workflow"; +import type * as activities from "../../src/activities.js"; +import type { DummyTurnInput, DummyTurnResult } from "@space/contracts"; + +const { recordDummyTurnStarted, recordDummyTurnCompleted } = proxyActivities({ + startToCloseTimeout: "1 minute", + retry: { maximumAttempts: 3 } +}); + +/** + * Deliberately incompatible test-only workflow used by the replay gate's + * negative assertion. It adds a timer before the first activity, so a history + * recorded by the production dummy workflow must fail determinism checking. + */ +export async function dummyTurnWorkflow(input: DummyTurnInput): Promise { + await sleep("1 second"); + await recordDummyTurnStarted(input); + return recordDummyTurnCompleted(input); +} diff --git a/apps/worker/tests/temporal-replay.test.ts b/apps/worker/tests/temporal-replay.test.ts new file mode 100644 index 000000000..6ce79567e --- /dev/null +++ b/apps/worker/tests/temporal-replay.test.ts @@ -0,0 +1,73 @@ + +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { describe, expect, it } from "vitest"; +import { DeterminismViolationError } from "@temporalio/workflow"; +import { Worker, bundleWorkflowCode, type WorkflowBundle } from "@temporalio/worker"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../.."); +const fixtureRoot = path.join(repoRoot, "apps/worker/tests/fixtures/workflow-histories"); +const workflowEntry = path.join(repoRoot, "apps/worker/tests/support/temporal-workflows.ts"); +const negativeWorkflowEntry = path.join(repoRoot, "apps/worker/tests/support/temporal-negative-workflows.ts"); + +/** Build a replay bundle with the workspace contract alias used by the worker tests. */ +async function bundle(entry: string): Promise { + return bundleWorkflowCode({ + workflowsPath: entry, + webpackConfigHook(config) { + config.resolve ??= {}; + config.resolve.alias = { + ...(config.resolve.alias ?? {}), + "@space/contracts": path.join(repoRoot, "packages/contracts/src/index.ts") + }; + return config; + } + }); +} + +/** Read one sanitized history fixture by its stable fixture name. */ +async function fixture(name: string): Promise { + return JSON.parse(await fs.readFile(path.join(fixtureRoot, `${name}.json`), "utf8")); +} + +describe("Temporal replay gate", () => { + it("replays every recorded workflow history with the production bundle", async () => { + const files = (await fs.readdir(fixtureRoot)).filter((file) => file.endsWith(".json")).sort(); + for (const required of [ + "dummy-turn.json", + "dot-goal-wake.json", + "dot-goal-timeout.json", + "codex-app-server-turn.json", + "room-agent-supervisor.json", + "room-agent-supervisor-prepatch.json", + "room-agent-action-failure.json", + "memory-maintenance.json", + "memory-consolidation.json", + "memory-mutation.json" + ]) expect(files).toContain(required); + const histories = await Promise.all(files.map(async (file) => ({ + history: JSON.parse(await fs.readFile(path.join(fixtureRoot, file), "utf8")), + workflowId: `fixture-${file.replace(/\.json$/, "")}` + }))); + const workflowBundle = await bundle(workflowEntry); + const results = []; + for await (const result of Worker.runReplayHistories({ workflowBundle }, histories)) results.push(result); + expect(results).toHaveLength(files.length); + for (const result of results) expect(result.error, `replay failed for ${result.workflowId}`).toBeUndefined(); + }, 180_000); + + it("fails when a test-only workflow adds an unrecorded timer", async () => { + const history = await fixture("dummy-turn"); + const workflowBundle = await bundle(negativeWorkflowEntry); + let thrown: unknown; + try { + await Worker.runReplayHistory({ workflowBundle }, history, "negative-dummy-turn"); + } catch (error) { + thrown = error; + } + expect(thrown).toBeInstanceOf(DeterminismViolationError); + expect(String((thrown as Error)?.message)).toMatch(/determin|nondetermin/i); + }, 180_000); +}); + diff --git a/apps/worker/tests/temporal-workflows.test.ts b/apps/worker/tests/temporal-workflows.test.ts new file mode 100644 index 000000000..d6bc8f661 --- /dev/null +++ b/apps/worker/tests/temporal-workflows.test.ts @@ -0,0 +1,297 @@ + +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { TestWorkflowEnvironment } from "@temporalio/testing"; +import { Worker, bundleWorkflowCode, type WorkflowBundle } from "@temporalio/worker"; +import { ApplicationFailure } from "@temporalio/workflow"; +import { + DOT_GOAL_SIGNAL, + MEMORY_MUTATION_TASK_QUEUE, + ROOM_AGENT_ENQUEUE_SIGNAL, + ROOM_AGENT_STOP_SIGNAL +} from "@space/contracts"; +import { MEMORY_MAINTENANCE_TASK_QUEUE } from "../src/memory-maintenance-config.js"; +import { sanitizeTemporalHistory } from "./support/sanitize-temporal-history.js"; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../.."); +const mainTaskQueue = "space-real-workflows"; +const workflowEntry = path.join(repoRoot, "apps/worker/tests/support/temporal-workflows.ts"); +const fixtureRoot = path.join(repoRoot, "apps/worker/tests/fixtures/workflow-histories"); +const recordFixtures = process.env.TEMPORAL_RECORD_HISTORIES === "1"; + +type ActivityCall = { name: string; args: unknown[] }; +type ActivityState = { calls: ActivityCall[]; dotSteps: Array>; dotObservations: Array>; failures: number }; + +let environment: TestWorkflowEnvironment; +let workflowBundle: WorkflowBundle; + +/** Build deterministic input shared by the production workflow scenarios. */ +function input(overrides: Record = {}) { + return { + roomId: "room-test-1", + paneId: "pane-test-1", + prompt: "Run the deterministic test.", + traceId: "trace-test-1", + providerId: null, + ...overrides + }; +} + +/** Build a stable memory-audit result for activity stubs. */ +function memoryRun(overrides: Record = {}) { + return { + id: "memory-run-1", + mode: "AUDIT", + triggerKind: "SCHEDULED", + status: "SUCCEEDED", + workflowId: "memory-consolidation-1", + dedupeKey: "scheduled-memory-2026-01-01", + sourceHash: "a".repeat(64), + actorUserId: null, + progressCompleted: 0, + progressTotal: 0, + findingCount: 0, + appliedOperationCount: 0, + skippedOperationCount: 0, + failedOperationCount: 0, + metrics: {}, + modelId: null, + aiVerified: false, + aiEvidence: {}, + statusReason: null, + createdAt: "2026-01-01T00:00:00.000Z", + startedAt: null, + completedAt: "2026-01-01T00:00:00.000Z", + updatedAt: "2026-01-01T00:00:00.000Z", + ...overrides + }; +} + +/** Create the deterministic activity implementations used by the sandbox workers. */ +function activitySet(state: ActivityState, options: { actionFails?: boolean } = {}) { + const record = (name: string, args: unknown[]) => state.calls.push({ name, args }); + return { + async recordDummyTurnStarted(value: unknown) { record("recordDummyTurnStarted", [value]); return { workflowId: "dummy-workflow-1" }; }, + async recordDummyTurnCompleted(value: any) { + record("recordDummyTurnCompleted", [value]); + return { workflowId: "dummy-workflow-1", roomId: value.roomId, paneId: value.paneId, traceId: value.traceId, status: "COMPLETED", message: "stub completed" }; + }, + async runCodexAppServerTurn(value: unknown) { record("runCodexAppServerTurn", [value]); return { workflowId: "turn-workflow-1", status: "COMPLETED", roomAgentOutcome: { status: "VERIFIED", executedActionCount: 1, statusReason: "stub" } }; }, + async runOpenCodeAgentTurn(value: unknown) { record("runOpenCodeAgentTurn", [value]); return { workflowId: "turn-workflow-1", status: "COMPLETED" }; }, + async runCliAgentTurn(value: unknown) { record("runCliAgentTurn", [value]); return { workflowId: "turn-workflow-1", status: "COMPLETED" }; }, + async markRoomAgentMissionStarted(value: unknown) { record("markRoomAgentMissionStarted", [value]); return value; }, + async markRoomAgentMissionFinished(value: unknown) { record("markRoomAgentMissionFinished", [value]); return value; }, + async markRoomAgentMissionContinued(value: unknown) { record("markRoomAgentMissionContinued", [value]); return value; }, + async dotGoalStep(goalId: string) { record("dotGoalStep", [goalId]); return state.dotSteps.shift() ?? { state: "DONE", runId: null, goalStatus: "COMPLETED" }; }, + async dotGoalObserve(goalId: string, runId: string) { record("dotGoalObserve", [goalId, runId]); return state.dotObservations.shift() ?? { run: "COMPLETED", goalStatus: "COMPLETED" }; }, + async runRoomAgentBackgroundAction(value: unknown) { + record("runRoomAgentBackgroundAction", [value]); + if (options.actionFails) throw ApplicationFailure.nonRetryable("transport failed", "ROOM_ACTION_TRANSPORT_FAILED"); + return { id: "space-agent-room-action-bridge", results: [{ request: (value as any).bridge.actions[0], status: "EXECUTED", statusReason: "stub", paneId: "pane-test-1", missionId: "mission-test-1", evidence: {} }] }; + }, + async failRoomAgentBackgroundAction(value: unknown) { record("failRoomAgentBackgroundAction", [value]); return undefined; }, + async discardRoomAgentSupervisorTurn(value: unknown) { record("discardRoomAgentSupervisorTurn", [value]); return undefined; }, + async checkRoomAgentSupervisorTurn(value: unknown) { record("checkRoomAgentSupervisorTurn", [value]); return "SKIP"; }, + async finishRoomAgentSupervisorTurn(value: unknown) { record("finishRoomAgentSupervisorTurn", [value]); return undefined; }, + async prepareRoomAgentBackgroundContinuation(value: unknown) { record("prepareRoomAgentBackgroundContinuation", [value]); return { state: "DONE" }; }, + async settleRoomAgentBackgroundMission(value: unknown) { record("settleRoomAgentBackgroundMission", [value]); return true; }, + async refreshMemoryGraphSnapshot(value: unknown) { + record("refreshMemoryGraphSnapshot", [value]); + return { status: "REFRESHED", generatedAt: "2026-01-01T00:00:00.000Z", sourceHash: "a".repeat(64), previousSourceHash: null, summary: {}, durationMs: 1 }; + }, + async refreshAllMonthsMemoryGraphSnapshot(value: unknown) { record("refreshAllMonthsMemoryGraphSnapshot", [value]); return {}; }, + async reconcileStaleSpaceAgentSessions() { record("reconcileStaleSpaceAgentSessions", []); return {}; }, + async createScheduledMemoryAudit(value: unknown) { record("createScheduledMemoryAudit", [value]); return memoryRun(); }, + async prepareMemoryConsolidation(value: unknown) { record("prepareMemoryConsolidation", [value]); return { run: memoryRun(), changeSetId: null }; }, + async finalizeMemoryRepair(value: unknown) { record("finalizeMemoryRepair", [value]); return memoryRun({ status: "SUCCEEDED" }); }, + async executePersistedMemoryChangeSet(value: any) { + record("executePersistedMemoryChangeSet", [value]); + return { status: "DISABLED", changeSetId: value.changeSetId, resultingSourceHash: null, reason: "stub" }; + } + }; +} + +/** Start one test worker per queue and return its coordinated shutdown callback. */ +async function startWorkers(state: ActivityState, queues = [mainTaskQueue], options: { actionFails?: boolean } = {}) { + const activities = activitySet(state, options); + const workers = await Promise.all(queues.map((taskQueue) => Worker.create({ + connection: environment.nativeConnection, + namespace: environment.namespace, + taskQueue, + workflowBundle, + activities + }))); + const runs = workers.map((worker) => worker.run()); + return async () => { + await Promise.all(workers.map((worker) => worker.shutdown())); + await Promise.all(runs); + }; +} + +/** Wait until a named stub activity has been observed or fail with a bounded timeout. */ +async function waitForCall(state: ActivityState, name: string) { + const deadline = Date.now() + 5_000; + while (Date.now() < deadline) { + if (state.calls.some((call) => call.name === name)) return; + await new Promise((resolve) => setTimeout(resolve, 25)); + } + throw new Error(`Timed out waiting for activity ${name}`); +} + +/** Persist a sanitized history when fixture recording is explicitly enabled. */ +async function recordHistory(name: string, workflowId: string) { + if (!recordFixtures) return; + const history = await environment.client.workflow.getHandle(workflowId).fetchHistory(); + await fs.mkdir(fixtureRoot, { recursive: true }); + await fs.writeFile(path.join(fixtureRoot, `${name}.json`), sanitizeTemporalHistory(history), "utf8"); +} + +beforeAll(async () => { + workflowBundle = await bundleWorkflowCode({ + workflowsPath: workflowEntry, + webpackConfigHook(config) { + config.resolve ??= {}; + config.resolve.alias = { + ...(config.resolve.alias ?? {}), + "@space/contracts": path.join(repoRoot, "packages/contracts/src/index.ts") + }; + return config; + } + }); + environment = await TestWorkflowEnvironment.createTimeSkipping(); +}, 120_000); + +afterAll(async () => { + await environment?.teardown(); +}, 120_000); + +describe("real Temporal workflow sandbox", () => { + it("runs dummy turns with the production workflow bundle", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state); + try { + const result = await environment.client.workflow.execute("dummyTurnWorkflow", { + taskQueue: mainTaskQueue, + workflowId: "real-dummy-turn-1", + args: [input()] + }); + await recordHistory("dummy-turn", "real-dummy-turn-1"); + expect(result.status).toBe("COMPLETED"); + expect(state.calls.map((call) => call.name)).toEqual(["recordDummyTurnStarted", "recordDummyTurnCompleted"]); + } finally { await stop(); } + }, 120_000); + + it("handles a Dot Goal wake signal before the waiting timeout", async () => { + const state: ActivityState = { + calls: [], + dotSteps: [{ state: "WAITING", runId: null, goalStatus: "ACTIVE" }, { state: "DONE", runId: null, goalStatus: "COMPLETED" }], + dotObservations: [], + failures: 0 + }; + const stop = await startWorkers(state); + try { + const handle = await environment.client.workflow.start("dotGoalWorkflow", { taskQueue: mainTaskQueue, workflowId: "real-dot-wake-1", args: [{ goalId: "dot_goal:test-1" }] }); + await handle.signal(DOT_GOAL_SIGNAL); + await expect(handle.result()).resolves.toEqual({ goalStatus: "COMPLETED" }); + await recordHistory("dot-goal-wake", "real-dot-wake-1"); + expect(state.calls.filter((call) => call.name === "dotGoalStep")).toHaveLength(2); + } finally { await stop(); } + }, 120_000); + + it("advances a Dot Goal after a real time-skipping timeout", async () => { + const state: ActivityState = { + calls: [], + dotSteps: [{ state: "WAITING", runId: null, goalStatus: "ACTIVE" }, { state: "DONE", runId: null, goalStatus: "COMPLETED" }], + dotObservations: [], + failures: 0 + }; + const stop = await startWorkers(state); + try { + await expect(environment.client.workflow.execute("dotGoalWorkflow", { taskQueue: mainTaskQueue, workflowId: "real-dot-timeout-1", args: [{ goalId: "dot_goal:test-2" }] })).resolves.toEqual({ goalStatus: "COMPLETED" }); + await recordHistory("dot-goal-timeout", "real-dot-timeout-1"); + expect(state.calls.filter((call) => call.name === "dotGoalStep")).toHaveLength(2); + } finally { await stop(); } + }, 120_000); + + it("executes the provider-routing workflow in the real sandbox", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state); + try { + const result = await environment.client.workflow.execute("codexAppServerTurnWorkflow", { taskQueue: mainTaskQueue, workflowId: "real-codex-turn-1", args: [input()] }); + await recordHistory("codex-app-server-turn", "real-codex-turn-1"); + expect(result.status).toBe("COMPLETED"); + expect(state.calls.map((call) => call.name)).toContain("runCodexAppServerTurn"); + } finally { await stop(); } + }, 120_000); + + it("runs memory maintenance and its consolidation child on their real task queues", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state, [mainTaskQueue, MEMORY_MAINTENANCE_TASK_QUEUE, MEMORY_MUTATION_TASK_QUEUE]); + try { + const result = await environment.client.workflow.execute("memoryMaintenanceWorkflow", { + taskQueue: mainTaskQueue, + workflowId: "real-memory-maintenance-1", + args: [{ scheduledAt: "2026-01-01T00:00:00.000Z", traceId: "trace-memory-1" }] + }); + await recordHistory("memory-maintenance", "real-memory-maintenance-1"); + expect(result.status).toBe("REFRESHED"); + expect(state.calls.map((call) => call.name)).toEqual(expect.arrayContaining(["refreshMemoryGraphSnapshot", "createScheduledMemoryAudit", "prepareMemoryConsolidation"])); + } finally { await stop(); } + }, 120_000); + + it("routes the room background action failure through the patched failure activity", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state, [mainTaskQueue], { actionFails: true }); + try { + const bridge = { roomId: "room-test-1", missionId: "mission-test-1", agentPaneId: "pane-test-1", agentSessionId: "session-test-1", selectedToolIds: [], actions: [{ toolId: "room:inspect", action: { type: "inspect" } }] }; + await expect(environment.client.workflow.execute("roomAgentActionWorkflow", { taskQueue: mainTaskQueue, workflowId: "space-room-action:real-failure-1", args: [{ bridge, traceId: "trace-action-1" }] })).rejects.toThrow(); + await recordHistory("room-agent-action-failure", "space-room-action:real-failure-1"); + expect(state.calls.map((call) => call.name)).toEqual(expect.arrayContaining(["runRoomAgentBackgroundAction", "failRoomAgentBackgroundAction"])); + } finally { await stop(); } + }, 120_000); + + it("accepts and processes a supervisor enqueue signal in the real sandbox", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state); + const handle = await environment.client.workflow.start("roomAgentSupervisorWorkflow", { + taskQueue: mainTaskQueue, + workflowId: "space-room-supervisor:real-signal-1", + args: [{ roomId: "room-test-1", pending: [], monitoringMissionIds: [], interrupted: [], processedCount: 0 }] + }); + try { + await handle.signal(ROOM_AGENT_ENQUEUE_SIGNAL, { missionId: "mission-test-1", turn: input({ agentRunId: "agent-run-1" }) }); + await waitForCall(state, "checkRoomAgentSupervisorTurn"); + await waitForCall(state, "discardRoomAgentSupervisorTurn"); + expect(state.calls.map((call) => call.name)).toEqual(expect.arrayContaining(["checkRoomAgentSupervisorTurn", "discardRoomAgentSupervisorTurn"])); + await handle.signal(ROOM_AGENT_STOP_SIGNAL, { missionId: null, reason: "test cleanup" }); + await recordHistory("room-agent-supervisor", "space-room-supervisor:real-signal-1"); + } finally { + await handle.terminate("test cleanup"); + await stop(); + } + }, 120_000); + + it("runs memory consolidation as a standalone real workflow", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state, [MEMORY_MAINTENANCE_TASK_QUEUE]); + try { + const result = await environment.client.workflow.execute("memoryConsolidationWorkflow", { taskQueue: MEMORY_MAINTENANCE_TASK_QUEUE, workflowId: "real-memory-consolidation-1", args: [{ runId: "memory-run-2", traceId: "trace-memory-3" }] }); + await recordHistory("memory-consolidation", "real-memory-consolidation-1"); + expect(result.id).toBe("memory-run-1"); + expect(state.calls.map((call) => call.name)).toContain("prepareMemoryConsolidation"); + } finally { await stop(); } + }, 120_000); + + it("executes the memory mutation workflow against a stubbed activity", async () => { + const state: ActivityState = { calls: [], dotSteps: [], dotObservations: [], failures: 0 }; + const stop = await startWorkers(state); + try { + const result = await environment.client.workflow.execute("memoryMutationWorkflow", { taskQueue: mainTaskQueue, workflowId: "real-memory-mutation-1", args: [{ changeSetId: "change-set-1", traceId: "trace-memory-2" }] }); + await recordHistory("memory-mutation", "real-memory-mutation-1"); + expect(result).toEqual({ status: "DISABLED", changeSetId: "change-set-1", resultingSourceHash: null, reason: "stub" }); + } finally { await stop(); } + }, 120_000); +}); + diff --git a/apps/worker/tests/temporal-workflows.ts b/apps/worker/tests/temporal-workflows.ts new file mode 100644 index 000000000..7294062b0 --- /dev/null +++ b/apps/worker/tests/temporal-workflows.ts @@ -0,0 +1,14 @@ +export { + codexAppServerTurnWorkflow, + dotGoalWorkflow, + dummyTurnWorkflow, + enqueueRoomAgentMissionSignal, + roomAgentActionWorkflow, + roomAgentSupervisorWorkflow, + stopRoomAgentMissionSignal +} from "../../src/workflows.js"; +export { + memoryConsolidationWorkflow, + memoryMaintenanceWorkflow +} from "../../src/memory-maintenance-workflows.js"; +export { memoryMutationWorkflow } from "../../src/memory-mutation-workflows.js"; diff --git a/package-lock.json b/package-lock.json index 1e2aa2a88..a393bb620 100644 --- a/package-lock.json +++ b/package-lock.json @@ -192,6 +192,7 @@ "undici": "8.10.2" }, "devDependencies": { + "@temporalio/testing": "1.24.0", "typescript": "^5.9.3", "vitest": "^4.1.12" } @@ -3674,6 +3675,24 @@ "node": ">=12.0.0" } }, + "node_modules/@temporalio/testing": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@temporalio/testing/-/testing-1.24.0.tgz", + "integrity": "sha512-XKCuvgb7smKR3oXy5nDgwYSFX/hmg9zTJ2rZQQsVwJzFkga1TbnWDiuT5YMU0INKjoLhnM6c5YA/uLKlp8sdfg==", + "license": "MIT", + "dependencies": { + "@temporalio/activity": "1.24.0", + "@temporalio/client": "1.24.0", + "@temporalio/common": "1.24.0", + "@temporalio/core-bridge": "1.24.0", + "@temporalio/proto": "1.24.0", + "@temporalio/worker": "1.24.0", + "@temporalio/workflow": "1.24.0" + }, + "engines": { + "node": ">= 20.3.0" + } + }, "node_modules/@temporalio/worker": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/@temporalio/worker/-/worker-1.24.0.tgz",