Files
windmill/typescript-client/build.sh
T
Ruben Fiszel 9cef724ff2 feat: bind WAC approval urls to a named wait_for_approval step (#10317)
* feat: bind WAC approval urls to a named wait_for_approval step

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: reject duplicate WAC approval step keys instead of renaming them

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: reject WAC approval links minted for a step that is not awaiting approval

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: bind WAC approval links to the awaiting step and stop step key aliasing

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: reject empty approval keys and scope minted-key writes to the workspace

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: enforce WAC approval binding at consumption and reject colliding keys

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: make WAC approval binding and collision checks atomic, harden TS step keys

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: decrement WAC suspend atomically instead of from a pre-lock snapshot

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: add sqlx cache entry for the atomic WAC suspend decrement

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: omit empty approver param from python get_approval_urls

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* test: pin the suspend-snapshot decrement and the colliding-mint race

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* test: drop the suspend-snapshot interleave test, it cannot both be stable and discriminate

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: reject step keys that cannot be minted as a URL path segment

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-25 11:41:48 +02:00

227 lines
5.9 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}/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, 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