Files
Ruben Fiszel aeaea57ca1 fix(wac): one failure record for tasks and steps, in every round (#10368)
* fix(wac): hand a caught task and step failure the same shape in every round

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* refactor(wac): decide the failure record once, server-side

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): leave a legacy SDK's failure marker untouched, and ship wacError to jsr

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): carry a step's custom error fields, and bound the stack in bytes

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): keep a step's extra fields serializable and bounded

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): record a non-Error throw the way a task records it

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): guard the last unguarded throw site in the step marker

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): make failure reporting non-throwing on both clients

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): take the step traceback the way the executor takes it

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): contain the reads that happen before a failure is checkpointed

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): fall back to the checkpointed marker, not the live one

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): keep non-finite fields and hostile proxies out of the checkpoint path

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(wac): keep the snapshot that passed the serialization probe

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* chore(wac): keep the failure-record module's surface to what is used

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 13:15:24 +02:00

228 lines
6.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eou pipefail
script_dirpath="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
rm -rf "${script_dirpath}/src"
npx --yes @hey-api/openapi-ts@0.43.0 --input "${script_dirpath}/../backend/windmill-api/openapi.yaml" --output "${script_dirpath}/src" --useOptions --schemas false
cat <<EOF - src/core/OpenAPI.ts > temp_file && mv temp_file src/core/OpenAPI.ts
const getEnv = (key: string) => {
if (typeof window === "undefined") {
if (typeof process !== "undefined") {
return process?.env?.[key];
}
// node
return globalThis?.process?.env?.[key];
}
// browser
return window?.process?.env?.[key];
};
const baseUrl = getEnv("BASE_INTERNAL_URL") ?? getEnv("BASE_URL") ?? "http://localhost:8000";
const baseUrlApi = (baseUrl ?? '') + "/api";
EOF
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' 's/WITH_CREDENTIALS: false/WITH_CREDENTIALS: true/g' src/core/OpenAPI.ts
sed -i '' 's/TOKEN: undefined/TOKEN: getEnv("WM_TOKEN")/g' src/core/OpenAPI.ts
sed -i '' "s/BASE: '\/api'/BASE: baseUrlApi/g" src/core/OpenAPI.ts
else
sed -i 's/WITH_CREDENTIALS: false/WITH_CREDENTIALS: true/g' src/core/OpenAPI.ts
sed -i 's/TOKEN: undefined/TOKEN: getEnv("WM_TOKEN")/g' src/core/OpenAPI.ts
sed -i "s/BASE: '\/api'/BASE: baseUrlApi/g" src/core/OpenAPI.ts
fi
cp "${script_dirpath}/client.ts" "${script_dirpath}/src/"
cp "${script_dirpath}/wacError.ts" "${script_dirpath}/src/"
cp "${script_dirpath}/s3Types.ts" "${script_dirpath}/src/"
cp "${script_dirpath}/sqlUtils.ts" "${script_dirpath}/src/"
echo "" >> "${script_dirpath}/src/index.ts"
echo 'export type { DenoS3LightClientSettings } from "./s3Types";' >> "${script_dirpath}/src/index.ts"
echo "" >> "${script_dirpath}/src/index.ts"
echo 'export { type Base64, setClient, getVariable, setVariable, getResource, setResource, getResumeUrls, setState, setProgress, getProgress, getState, getIdToken, denoS3LightClientSettings, loadS3FileStream, loadS3File, writeS3File, deleteS3File, signS3Objects, signS3Object, getPresignedS3PublicUrls, getPresignedS3PublicUrl, task, taskScript, taskFlow, workflow, step, sleep, parallel, waitForApproval, getApprovalUrls, type TaskOptions, type Jsonified, type JsonifiedFn, WorkflowCtx, _workflowCtx, setWorkflowCtx, StepSuspend, runScript, runScriptAsync, runScriptByPath, runScriptByHash, runScriptByPathAsync, runScriptByHashAsync, runFlow, runFlowAsync, waitJob, getRootJobId, setFlowUserState, getFlowUserState, usernameToEmail, requestInteractiveSlackApproval, type Sql, requestInteractiveTeamsApproval, appendToResultStream, streamResult, datatable, ducklake, upsertPartition, appendPartition, type DucklakeMaterializeOptions, type SqlStatement, type DatatableSqlTemplateFunction, type SqlTemplateFunction, type S3Object, type S3ObjectRecord, type S3ObjectURI, commitKafkaOffsets } from "./client";' >> "${script_dirpath}/src/index.ts"
# Build default export by combining client utilities + services
# This preserves backward compatibility for `import wmill from "windmill-client"`
# while enabling tree-shaking for named imports
cat >> "${script_dirpath}/src/index.ts" << 'INDEXEOF'
import {
setClient,
getVariable,
setVariable,
getResource,
setResource,
getResumeUrls,
setState,
setProgress,
getProgress,
getState,
getIdToken,
denoS3LightClientSettings,
loadS3FileStream,
loadS3File,
writeS3File,
deleteS3File,
signS3Objects,
signS3Object,
getPresignedS3PublicUrls,
getPresignedS3PublicUrl,
task,
taskScript,
taskFlow,
workflow,
step,
sleep,
parallel,
waitForApproval,
getApprovalUrls,
WorkflowCtx,
_workflowCtx,
setWorkflowCtx,
StepSuspend,
runScript,
runScriptAsync,
runScriptByPath,
runScriptByHash,
runScriptByPathAsync,
runScriptByHashAsync,
runFlow,
runFlowAsync,
waitJob,
getRootJobId,
setFlowUserState,
getFlowUserState,
usernameToEmail,
requestInteractiveSlackApproval,
requestInteractiveTeamsApproval,
appendToResultStream,
streamResult,
datatable,
ducklake,
upsertPartition,
appendPartition,
SHARED_FOLDER,
getWorkspace,
getStatePath,
getInternalState,
setInternalState,
getResumeEndpoints,
getResult,
getResultMaybe,
resolveDefaultResource,
databaseUrlFromResource,
base64ToUint8Array,
uint8ArrayToBase64,
parseS3Object,
commitKafkaOffsets,
} from "./client";
import {
AdminService,
AuditService,
FlowService,
GranularAclService,
GroupService,
JobService,
ResourceService,
VariableService,
ScriptService,
ScheduleService,
SettingsService,
UserService,
WorkspaceService,
TeamsService,
} from "./services.gen";
const wmill = {
// Client utilities
setClient,
getVariable,
setVariable,
getResource,
setResource,
getResumeUrls,
setState,
setProgress,
getProgress,
getState,
getIdToken,
denoS3LightClientSettings,
loadS3FileStream,
loadS3File,
writeS3File,
deleteS3File,
signS3Objects,
signS3Object,
getPresignedS3PublicUrls,
getPresignedS3PublicUrl,
task,
taskScript,
taskFlow,
workflow,
step,
sleep,
parallel,
waitForApproval,
getApprovalUrls,
WorkflowCtx,
_workflowCtx,
setWorkflowCtx,
StepSuspend,
runScript,
runScriptAsync,
runScriptByPath,
runScriptByHash,
runScriptByPathAsync,
runScriptByHashAsync,
runFlow,
runFlowAsync,
waitJob,
getRootJobId,
setFlowUserState,
getFlowUserState,
usernameToEmail,
requestInteractiveSlackApproval,
requestInteractiveTeamsApproval,
appendToResultStream,
streamResult,
datatable,
ducklake,
upsertPartition,
appendPartition,
SHARED_FOLDER,
getWorkspace,
getStatePath,
getInternalState,
setInternalState,
getResumeEndpoints,
getResult,
getResultMaybe,
resolveDefaultResource,
databaseUrlFromResource,
base64ToUint8Array,
uint8ArrayToBase64,
parseS3Object,
commitKafkaOffsets,
// Services
AdminService,
AuditService,
FlowService,
GranularAclService,
GroupService,
JobService,
ResourceService,
VariableService,
ScriptService,
ScheduleService,
SettingsService,
UserService,
WorkspaceService,
TeamsService,
};
export default wmill;
INDEXEOF