windmill-client 1.673.0 → 1.674.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -6,6 +6,7 @@ export type Email = string;
6
6
  export type Base64 = string;
7
7
  export type Resource<S extends string> = any;
8
8
  export declare const SHARED_FOLDER = "/shared";
9
+ export declare function workerHasInternalServer(): boolean;
9
10
  /**
10
11
  * Initialize the Windmill client with authentication token and base URL
11
12
  * @param token - Authentication token (defaults to WM_TOKEN env variable)
package/dist/client.mjs CHANGED
@@ -5,6 +5,9 @@ import { datatable, ducklake } from "./sqlUtils.mjs";
5
5
  //#region src/client.ts
6
6
  const SHARED_FOLDER = "/shared";
7
7
  let mockedApi = void 0;
8
+ function workerHasInternalServer() {
9
+ return /^https?:\/\/(localhost|127\.0\.0\.1)(:|\/|$)/.test(OpenAPI.BASE ?? "");
10
+ }
8
11
  /**
9
12
  * Initialize the Windmill client with authentication token and base URL
10
13
  * @param token - Authentication token (defaults to WM_TOKEN env variable)
@@ -1271,4 +1274,4 @@ async function commitKafkaOffsets(triggerPath, topic, partition, offset) {
1271
1274
  }
1272
1275
 
1273
1276
  //#endregion
1274
- export { SHARED_FOLDER, StepSuspend, WorkflowCtx, _workflowCtx, appendToResultStream, base64ToUint8Array, commitKafkaOffsets, databaseUrlFromResource, denoS3LightClientSettings, getFlowUserState, getIdToken, getInternalState, getPresignedS3PublicUrl, getPresignedS3PublicUrls, getProgress, getResource, getResult, getResultMaybe, getResumeEndpoints, getResumeUrls, getRootJobId, getState, getStatePath, getVariable, getWorkspace, loadS3File, loadS3FileStream, parallel, parseS3Object, requestInteractiveSlackApproval, requestInteractiveTeamsApproval, resolveDefaultResource, runFlow, runFlowAsync, runScript, runScriptAsync, runScriptByHash, runScriptByHashAsync, runScriptByPath, runScriptByPathAsync, setClient, setFlowUserState, setInternalState, setProgress, setResource, setState, setVariable, setWorkflowCtx, signS3Object, signS3Objects, sleep, step, streamResult, task, taskFlow, taskScript, uint8ArrayToBase64, usernameToEmail, waitForApproval, waitJob, workflow, writeS3File };
1277
+ export { SHARED_FOLDER, StepSuspend, WorkflowCtx, _workflowCtx, appendToResultStream, base64ToUint8Array, commitKafkaOffsets, databaseUrlFromResource, denoS3LightClientSettings, getFlowUserState, getIdToken, getInternalState, getPresignedS3PublicUrl, getPresignedS3PublicUrls, getProgress, getResource, getResult, getResultMaybe, getResumeEndpoints, getResumeUrls, getRootJobId, getState, getStatePath, getVariable, getWorkspace, loadS3File, loadS3FileStream, parallel, parseS3Object, requestInteractiveSlackApproval, requestInteractiveTeamsApproval, resolveDefaultResource, runFlow, runFlowAsync, runScript, runScriptAsync, runScriptByHash, runScriptByHashAsync, runScriptByPath, runScriptByPathAsync, setClient, setFlowUserState, setInternalState, setProgress, setResource, setState, setVariable, setWorkflowCtx, signS3Object, signS3Objects, sleep, step, streamResult, task, taskFlow, taskScript, uint8ArrayToBase64, usernameToEmail, waitForApproval, waitJob, workerHasInternalServer, workflow, writeS3File };
@@ -29,7 +29,7 @@ const OpenAPI = {
29
29
  PASSWORD: void 0,
30
30
  TOKEN: getEnv("WM_TOKEN"),
31
31
  USERNAME: void 0,
32
- VERSION: "1.673.0",
32
+ VERSION: "1.674.1",
33
33
  WITH_CREDENTIALS: true,
34
34
  interceptors: {
35
35
  request: new Interceptors(),
package/dist/index.js CHANGED
@@ -126,7 +126,7 @@ const OpenAPI = {
126
126
  PASSWORD: void 0,
127
127
  TOKEN: getEnv$1("WM_TOKEN"),
128
128
  USERNAME: void 0,
129
- VERSION: "1.673.0",
129
+ VERSION: "1.674.1",
130
130
  WITH_CREDENTIALS: true,
131
131
  interceptors: {
132
132
  request: new Interceptors(),
@@ -3160,6 +3160,51 @@ var SettingService = class {
3160
3160
  });
3161
3161
  }
3162
3162
  /**
3163
+ * test Azure Key Vault connection
3164
+ * @param data The data for the request.
3165
+ * @param data.requestBody Azure Key Vault settings to test
3166
+ * @returns string connection successful
3167
+ * @throws ApiError
3168
+ */
3169
+ static testAzureKvBackend(data) {
3170
+ return request(OpenAPI, {
3171
+ method: "POST",
3172
+ url: "/settings/test_azure_kv_backend",
3173
+ body: data.requestBody,
3174
+ mediaType: "application/json"
3175
+ });
3176
+ }
3177
+ /**
3178
+ * migrate secrets from database to Azure Key Vault
3179
+ * @param data The data for the request.
3180
+ * @param data.requestBody Azure Key Vault settings for migration target
3181
+ * @returns SecretMigrationReport migration report
3182
+ * @throws ApiError
3183
+ */
3184
+ static migrateSecretsToAzureKv(data) {
3185
+ return request(OpenAPI, {
3186
+ method: "POST",
3187
+ url: "/settings/migrate_secrets_to_azure_kv",
3188
+ body: data.requestBody,
3189
+ mediaType: "application/json"
3190
+ });
3191
+ }
3192
+ /**
3193
+ * migrate secrets from Azure Key Vault to database
3194
+ * @param data The data for the request.
3195
+ * @param data.requestBody Azure Key Vault settings for migration source
3196
+ * @returns SecretMigrationReport migration report
3197
+ * @throws ApiError
3198
+ */
3199
+ static migrateSecretsFromAzureKv(data) {
3200
+ return request(OpenAPI, {
3201
+ method: "POST",
3202
+ url: "/settings/migrate_secrets_from_azure_kv",
3203
+ body: data.requestBody,
3204
+ mediaType: "application/json"
3205
+ });
3206
+ }
3207
+ /**
3163
3208
  * get secondary storage names
3164
3209
  * @param data The data for the request.
3165
3210
  * @param data.workspace
@@ -3471,6 +3516,7 @@ var VariableService = class {
3471
3516
  * @param data.broadFilter broad search across multiple fields (case-insensitive substring match)
3472
3517
  * @param data.page which page to return (start at 1, default 1)
3473
3518
  * @param data.perPage number of items to return for a given page (default 30, max 100)
3519
+ * @param data.label Filter by label
3474
3520
  * @returns ListableVariable variable list
3475
3521
  * @throws ApiError
3476
3522
  */
@@ -3486,7 +3532,8 @@ var VariableService = class {
3486
3532
  value: data.value,
3487
3533
  broad_filter: data.broadFilter,
3488
3534
  page: data.page,
3489
- per_page: data.perPage
3535
+ per_page: data.perPage,
3536
+ label: data.label
3490
3537
  }
3491
3538
  });
3492
3539
  }
@@ -3919,6 +3966,7 @@ var ResourceService = class {
3919
3966
  * @param data.description pattern match filter for description field (case-insensitive)
3920
3967
  * @param data.value JSONB subset match filter using base64 encoded JSON
3921
3968
  * @param data.broadFilter broad search across multiple fields (case-insensitive substring match)
3969
+ * @param data.label Filter by label
3922
3970
  * @returns ListableResource resource list
3923
3971
  * @throws ApiError
3924
3972
  */
@@ -3936,7 +3984,8 @@ var ResourceService = class {
3936
3984
  path: data.path,
3937
3985
  description: data.description,
3938
3986
  value: data.value,
3939
- broad_filter: data.broadFilter
3987
+ broad_filter: data.broadFilter,
3988
+ label: data.label
3940
3989
  }
3941
3990
  });
3942
3991
  }
@@ -4328,6 +4377,7 @@ var FlowService = class {
4328
4377
  * If true, show only flows with dedicated_worker enabled.
4329
4378
  * If false, show only flows with dedicated_worker disabled.
4330
4379
  *
4380
+ * @param data.label Filter by label
4331
4381
  * @returns unknown All flow
4332
4382
  * @throws ApiError
4333
4383
  */
@@ -4348,7 +4398,8 @@ var FlowService = class {
4348
4398
  include_draft_only: data.includeDraftOnly,
4349
4399
  with_deployment_msg: data.withDeploymentMsg,
4350
4400
  without_description: data.withoutDescription,
4351
- dedicated_worker: data.dedicatedWorker
4401
+ dedicated_worker: data.dedicatedWorker,
4402
+ label: data.label
4352
4403
  }
4353
4404
  });
4354
4405
  }
@@ -4765,6 +4816,7 @@ var AppService = class {
4765
4816
  * @param data.withDeploymentMsg (default false)
4766
4817
  * include deployment message
4767
4818
  *
4819
+ * @param data.label Filter by label
4768
4820
  * @returns ListableApp All apps
4769
4821
  * @throws ApiError
4770
4822
  */
@@ -4782,7 +4834,8 @@ var AppService = class {
4782
4834
  path_exact: data.pathExact,
4783
4835
  starred_only: data.starredOnly,
4784
4836
  include_draft_only: data.includeDraftOnly,
4785
- with_deployment_msg: data.withDeploymentMsg
4837
+ with_deployment_msg: data.withDeploymentMsg,
4838
+ label: data.label
4786
4839
  }
4787
4840
  });
4788
4841
  }
@@ -5389,6 +5442,7 @@ var ScriptService = class {
5389
5442
  * If true, show only scripts with dedicated_worker enabled.
5390
5443
  * If false, show only scripts with dedicated_worker disabled.
5391
5444
  *
5445
+ * @param data.label Filter by label
5392
5446
  * @returns Script All scripts
5393
5447
  * @throws ApiError
5394
5448
  */
@@ -5416,7 +5470,8 @@ var ScriptService = class {
5416
5470
  with_deployment_msg: data.withDeploymentMsg,
5417
5471
  languages: data.languages,
5418
5472
  without_description: data.withoutDescription,
5419
- dedicated_worker: data.dedicatedWorker
5473
+ dedicated_worker: data.dedicatedWorker,
5474
+ label: data.label
5420
5475
  }
5421
5476
  });
5422
5477
  }
@@ -8621,6 +8676,7 @@ var RawAppService = class {
8621
8676
  * @param data.starredOnly (default false)
8622
8677
  * show only the starred items
8623
8678
  *
8679
+ * @param data.label Filter by label
8624
8680
  * @returns ListableRawApp All raw apps
8625
8681
  * @throws ApiError
8626
8682
  */
@@ -8636,7 +8692,8 @@ var RawAppService = class {
8636
8692
  created_by: data.createdBy,
8637
8693
  path_start: data.pathStart,
8638
8694
  path_exact: data.pathExact,
8639
- starred_only: data.starredOnly
8695
+ starred_only: data.starredOnly,
8696
+ label: data.label
8640
8697
  }
8641
8698
  });
8642
8699
  }
@@ -8832,6 +8889,7 @@ var ScheduleService = class {
8832
8889
  * @param data.description pattern match filter for description field (case-insensitive)
8833
8890
  * @param data.summary pattern match filter for summary field (case-insensitive)
8834
8891
  * @param data.broadFilter broad search across multiple fields (case-insensitive substring match)
8892
+ * @param data.label Filter by label
8835
8893
  * @returns Schedule schedule list
8836
8894
  * @throws ApiError
8837
8895
  */
@@ -8850,7 +8908,8 @@ var ScheduleService = class {
8850
8908
  schedule_path: data.schedulePath,
8851
8909
  description: data.description,
8852
8910
  summary: data.summary,
8853
- broad_filter: data.broadFilter
8911
+ broad_filter: data.broadFilter,
8912
+ label: data.label
8854
8913
  }
8855
8914
  });
8856
8915
  }
@@ -9029,6 +9088,7 @@ var HttpTriggerService = class {
9029
9088
  * @param data.path filter by path
9030
9089
  * @param data.isFlow
9031
9090
  * @param data.pathStart
9091
+ * @param data.label Filter by label
9032
9092
  * @returns HttpTrigger http trigger list
9033
9093
  * @throws ApiError
9034
9094
  */
@@ -9042,7 +9102,8 @@ var HttpTriggerService = class {
9042
9102
  per_page: data.perPage,
9043
9103
  path: data.path,
9044
9104
  is_flow: data.isFlow,
9045
- path_start: data.pathStart
9105
+ path_start: data.pathStart,
9106
+ label: data.label
9046
9107
  }
9047
9108
  });
9048
9109
  }
@@ -9187,6 +9248,7 @@ var WebsocketTriggerService = class {
9187
9248
  * @param data.path filter by path
9188
9249
  * @param data.isFlow
9189
9250
  * @param data.pathStart
9251
+ * @param data.label Filter by label
9190
9252
  * @returns WebsocketTrigger websocket trigger list
9191
9253
  * @throws ApiError
9192
9254
  */
@@ -9200,7 +9262,8 @@ var WebsocketTriggerService = class {
9200
9262
  per_page: data.perPage,
9201
9263
  path: data.path,
9202
9264
  is_flow: data.isFlow,
9203
- path_start: data.pathStart
9265
+ path_start: data.pathStart,
9266
+ label: data.label
9204
9267
  }
9205
9268
  });
9206
9269
  }
@@ -9345,6 +9408,7 @@ var KafkaTriggerService = class {
9345
9408
  * @param data.path filter by path
9346
9409
  * @param data.isFlow
9347
9410
  * @param data.pathStart
9411
+ * @param data.label Filter by label
9348
9412
  * @returns KafkaTrigger kafka trigger list
9349
9413
  * @throws ApiError
9350
9414
  */
@@ -9358,7 +9422,8 @@ var KafkaTriggerService = class {
9358
9422
  per_page: data.perPage,
9359
9423
  path: data.path,
9360
9424
  is_flow: data.isFlow,
9361
- path_start: data.pathStart
9425
+ path_start: data.pathStart,
9426
+ label: data.label
9362
9427
  }
9363
9428
  });
9364
9429
  }
@@ -9542,6 +9607,7 @@ var NatsTriggerService = class {
9542
9607
  * @param data.path filter by path
9543
9608
  * @param data.isFlow
9544
9609
  * @param data.pathStart
9610
+ * @param data.label Filter by label
9545
9611
  * @returns NatsTrigger nats trigger list
9546
9612
  * @throws ApiError
9547
9613
  */
@@ -9555,7 +9621,8 @@ var NatsTriggerService = class {
9555
9621
  per_page: data.perPage,
9556
9622
  path: data.path,
9557
9623
  is_flow: data.isFlow,
9558
- path_start: data.pathStart
9624
+ path_start: data.pathStart,
9625
+ label: data.label
9559
9626
  }
9560
9627
  });
9561
9628
  }
@@ -9700,6 +9767,7 @@ var SqsTriggerService = class {
9700
9767
  * @param data.path filter by path
9701
9768
  * @param data.isFlow
9702
9769
  * @param data.pathStart
9770
+ * @param data.label Filter by label
9703
9771
  * @returns SqsTrigger sqs trigger list
9704
9772
  * @throws ApiError
9705
9773
  */
@@ -9713,7 +9781,8 @@ var SqsTriggerService = class {
9713
9781
  per_page: data.perPage,
9714
9782
  path: data.path,
9715
9783
  is_flow: data.isFlow,
9716
- path_start: data.pathStart
9784
+ path_start: data.pathStart,
9785
+ label: data.label
9717
9786
  }
9718
9787
  });
9719
9788
  }
@@ -10035,6 +10104,7 @@ var NativeTriggerService = class {
10035
10104
  * @param data.perPage number of items to return for a given page (default 30, max 100)
10036
10105
  * @param data.path filter by script path
10037
10106
  * @param data.isFlow filter by is_flow
10107
+ * @param data.label Filter by label
10038
10108
  * @returns NativeTrigger native triggers list
10039
10109
  * @throws ApiError
10040
10110
  */
@@ -10050,7 +10120,8 @@ var NativeTriggerService = class {
10050
10120
  page: data.page,
10051
10121
  per_page: data.perPage,
10052
10122
  path: data.path,
10053
- is_flow: data.isFlow
10123
+ is_flow: data.isFlow,
10124
+ label: data.label
10054
10125
  }
10055
10126
  });
10056
10127
  }
@@ -10267,6 +10338,7 @@ var MqttTriggerService = class {
10267
10338
  * @param data.path filter by path
10268
10339
  * @param data.isFlow
10269
10340
  * @param data.pathStart
10341
+ * @param data.label Filter by label
10270
10342
  * @returns MqttTrigger mqtt trigger list
10271
10343
  * @throws ApiError
10272
10344
  */
@@ -10280,7 +10352,8 @@ var MqttTriggerService = class {
10280
10352
  per_page: data.perPage,
10281
10353
  path: data.path,
10282
10354
  is_flow: data.isFlow,
10283
- path_start: data.pathStart
10355
+ path_start: data.pathStart,
10356
+ label: data.label
10284
10357
  }
10285
10358
  });
10286
10359
  }
@@ -10425,6 +10498,7 @@ var GcpTriggerService = class {
10425
10498
  * @param data.path filter by path
10426
10499
  * @param data.isFlow
10427
10500
  * @param data.pathStart
10501
+ * @param data.label Filter by label
10428
10502
  * @returns GcpTrigger gcp trigger list
10429
10503
  * @throws ApiError
10430
10504
  */
@@ -10438,7 +10512,8 @@ var GcpTriggerService = class {
10438
10512
  per_page: data.perPage,
10439
10513
  path: data.path,
10440
10514
  is_flow: data.isFlow,
10441
- path_start: data.pathStart
10515
+ path_start: data.pathStart,
10516
+ label: data.label
10442
10517
  }
10443
10518
  });
10444
10519
  }
@@ -10878,6 +10953,7 @@ var PostgresTriggerService = class {
10878
10953
  * @param data.path filter by path
10879
10954
  * @param data.isFlow
10880
10955
  * @param data.pathStart
10956
+ * @param data.label Filter by label
10881
10957
  * @returns PostgresTrigger postgres trigger list
10882
10958
  * @throws ApiError
10883
10959
  */
@@ -10891,7 +10967,8 @@ var PostgresTriggerService = class {
10891
10967
  per_page: data.perPage,
10892
10968
  path: data.path,
10893
10969
  is_flow: data.isFlow,
10894
- path_start: data.pathStart
10970
+ path_start: data.pathStart,
10971
+ label: data.label
10895
10972
  }
10896
10973
  });
10897
10974
  }
@@ -11036,6 +11113,7 @@ var EmailTriggerService = class {
11036
11113
  * @param data.path filter by path
11037
11114
  * @param data.isFlow
11038
11115
  * @param data.pathStart
11116
+ * @param data.label Filter by label
11039
11117
  * @returns EmailTrigger email trigger list
11040
11118
  * @throws ApiError
11041
11119
  */
@@ -11049,7 +11127,8 @@ var EmailTriggerService = class {
11049
11127
  per_page: data.perPage,
11050
11128
  path: data.path,
11051
11129
  is_flow: data.isFlow,
11052
- path_start: data.pathStart
11130
+ path_start: data.pathStart,
11131
+ label: data.label
11053
11132
  }
11054
11133
  });
11055
11134
  }
@@ -11755,6 +11834,28 @@ var ConfigService = class {
11755
11834
  url: "/configs/list_available_python_versions"
11756
11835
  });
11757
11836
  }
11837
+ /**
11838
+ * list all workspace dependencies
11839
+ * @returns unknown a list of workspace dependency summaries
11840
+ * @throws ApiError
11841
+ */
11842
+ static listAllWorkspaceDependencies() {
11843
+ return request(OpenAPI, {
11844
+ method: "GET",
11845
+ url: "/configs/list_all_workspace_dependencies"
11846
+ });
11847
+ }
11848
+ /**
11849
+ * list all dedicated scripts with their dependencies
11850
+ * @returns unknown a list of dedicated scripts with workspace dependencies
11851
+ * @throws ApiError
11852
+ */
11853
+ static listAllDedicatedWithDeps() {
11854
+ return request(OpenAPI, {
11855
+ method: "GET",
11856
+ url: "/configs/list_all_dedicated_with_deps"
11857
+ });
11858
+ }
11758
11859
  };
11759
11860
  var AgentWorkersService = class {
11760
11861
  /**
@@ -13276,81 +13377,94 @@ var McpOauthService = class {
13276
13377
  //#endregion
13277
13378
  //#region src/sqlUtils.ts
13278
13379
  /**
13279
- * Create a SQL template function for PostgreSQL/datatable queries
13280
- * @param name - Database/datatable name (default: "main")
13281
- * @returns SQL template function for building parameterized queries
13282
- * @example
13283
- * let sql = wmill.datatable()
13284
- * let name = 'Robin'
13285
- * let age = 21
13286
- * await sql`
13287
- * SELECT * FROM friends
13288
- * WHERE name = ${name} AND age = ${age}::int
13289
- * `.fetch()
13380
+ * Wrapper for raw SQL fragments that should be inlined without parameterization.
13381
+ * Created via `sql.raw(value)`.
13290
13382
  */
13291
- function datatable(name = "main") {
13292
- return sqlProviderImpl("datatable", parseName(name));
13383
+ var RawSql = class {
13384
+ __brand = "RawSql";
13385
+ constructor(value) {
13386
+ this.value = value;
13387
+ }
13388
+ };
13389
+ function datatableProvider(name, schema) {
13390
+ return {
13391
+ providerName: "datatable",
13392
+ language: "postgresql",
13393
+ extraArgs: { database: `datatable://${name}` },
13394
+ formatArgDecl: (argNum) => `-- $${argNum} arg${argNum}`,
13395
+ formatArgUsage: (argNum, explicitType, inferredType) => explicitType !== void 0 ? `$${argNum}` : `$${argNum}::${inferredType}`,
13396
+ preamble: () => schema ? `SET search_path TO "${schema}";\n` : ""
13397
+ };
13293
13398
  }
13294
- /**
13295
- * Create a SQL template function for DuckDB/ducklake queries
13296
- * @param name - DuckDB database name (default: "main")
13297
- * @returns SQL template function for building parameterized queries
13298
- * @example
13299
- * let sql = wmill.ducklake()
13300
- * let name = 'Robin'
13301
- * let age = 21
13302
- * await sql`
13303
- * SELECT * FROM friends
13304
- * WHERE name = ${name} AND age = ${age}
13305
- * `.fetch()
13306
- */
13307
- function ducklake(name = "main") {
13308
- return sqlProviderImpl("ducklake", { name });
13399
+ function ducklakeProvider(name) {
13400
+ return {
13401
+ providerName: "ducklake",
13402
+ language: "duckdb",
13403
+ extraArgs: {},
13404
+ formatArgDecl: (argNum, argType) => `-- $arg${argNum} (${argType})`,
13405
+ formatArgUsage: (argNum) => `$arg${argNum}`,
13406
+ preamble: () => `ATTACH 'ducklake://${name}' AS dl;USE dl;\n`
13407
+ };
13309
13408
  }
13310
- function sqlProviderImpl(provider, { name, schema }) {
13409
+ function buildSqlTemplateFunction(provider) {
13311
13410
  let sqlFn = (strings, ...values) => {
13312
- let formatArgDecl = {
13313
- datatable: (i) => `-- $${i + 1} arg${i + 1}`,
13314
- ducklake: (i) => {
13315
- let argType = parseTypeAnnotation(strings[i], strings[i + 1]) || inferSqlType(values[i]);
13316
- return `-- $arg${i + 1} (${argType})`;
13317
- }
13318
- }[provider];
13319
- let formatArgUsage = {
13320
- datatable: (i) => {
13321
- const parsedType = parseTypeAnnotation(strings[i], strings[i + 1]);
13322
- if (parsedType !== void 0) return `$${i + 1}`;
13323
- let argType = inferSqlType(values[i]);
13324
- return `$${i + 1}::${argType}`;
13325
- },
13326
- ducklake: (i) => `$arg${i + 1}`
13327
- }[provider];
13328
- let content = values.map((_, i) => formatArgDecl(i)).join("\n") + "\n";
13329
- if (provider === "ducklake") content += `ATTACH 'ducklake://${name}' AS dl;USE dl;\n`;
13330
- if (schema && provider === "datatable") content += `SET search_path TO "${schema}";\n`;
13411
+ let argIndex = 0;
13412
+ const valueInfos = values.map((v, i) => {
13413
+ if (v instanceof RawSql) return {
13414
+ raw: true,
13415
+ value: v.value,
13416
+ originalIndex: i
13417
+ };
13418
+ argIndex++;
13419
+ return {
13420
+ raw: false,
13421
+ value: v,
13422
+ originalIndex: i,
13423
+ argNum: argIndex
13424
+ };
13425
+ });
13426
+ let argDecls = valueInfos.filter((info) => !info.raw).map((info) => {
13427
+ let argType = parseTypeAnnotation(strings[info.originalIndex], strings[info.originalIndex + 1]) || inferSqlType(info.value);
13428
+ return provider.formatArgDecl(info.argNum, argType);
13429
+ });
13430
+ let content = argDecls.length ? argDecls.join("\n") + "\n" : "";
13431
+ content += provider.preamble();
13331
13432
  let contentBody = "";
13332
13433
  for (let i = 0; i < strings.length; i++) {
13333
13434
  contentBody += strings[i];
13334
- if (i !== strings.length - 1) contentBody += formatArgUsage(i);
13435
+ if (i < valueInfos.length) {
13436
+ let info = valueInfos[i];
13437
+ if (info.raw) contentBody += info.value;
13438
+ else {
13439
+ let explicitType = parseTypeAnnotation(strings[info.originalIndex], strings[info.originalIndex + 1]);
13440
+ let inferredType = inferSqlType(info.value);
13441
+ contentBody += provider.formatArgUsage(info.argNum, explicitType, inferredType);
13442
+ }
13443
+ }
13335
13444
  }
13336
13445
  content += contentBody;
13337
13446
  const args = {
13338
- ...Object.fromEntries(values.map((v, i) => [`arg${i + 1}`, v])),
13339
- ...provider === "datatable" ? { database: `datatable://${name}` } : {}
13447
+ ...Object.fromEntries(valueInfos.filter((info) => !info.raw).map((info) => [`arg${info.argNum}`, info.value])),
13448
+ ...provider.extraArgs
13340
13449
  };
13341
- const language = {
13342
- datatable: "postgresql",
13343
- ducklake: "duckdb"
13344
- }[provider];
13345
13450
  async function fetch$1({ resultCollection } = {}) {
13346
13451
  if (resultCollection) content = `-- result_collection=${resultCollection}\n${content}`;
13347
13452
  try {
13348
- let result = await JobService.runScriptPreviewInline({
13453
+ let result;
13454
+ if (workerHasInternalServer()) result = await JobService.runScriptPreviewInline({
13349
13455
  workspace: getWorkspace(),
13350
13456
  requestBody: {
13351
13457
  args,
13352
13458
  content,
13353
- language
13459
+ language: provider.language
13460
+ }
13461
+ });
13462
+ else result = await JobService.runScriptPreviewAndWaitResult({
13463
+ workspace: getWorkspace(),
13464
+ requestBody: {
13465
+ args,
13466
+ content,
13467
+ language: provider.language
13354
13468
  }
13355
13469
  });
13356
13470
  return result;
@@ -13361,7 +13475,7 @@ function sqlProviderImpl(provider, { name, schema }) {
13361
13475
  if (body.startsWith("Internal:")) body = body.slice(9).trim();
13362
13476
  if (body.startsWith("Error:")) body = body.slice(6).trim();
13363
13477
  if (body.startsWith("datatable")) body = body.slice(9).trim();
13364
- err = Error(`${provider} ${body}`);
13478
+ err = Error(`${provider.providerName} ${body}`);
13365
13479
  err.query = contentBody;
13366
13480
  err.request = e.request;
13367
13481
  }
@@ -13383,12 +13497,47 @@ function sqlProviderImpl(provider, { name, schema }) {
13383
13497
  execute: (params) => fetch$1(params)
13384
13498
  };
13385
13499
  };
13386
- if (provider === "datatable") sqlFn.query = (sqlString, ...params) => {
13500
+ sqlFn.raw = (value) => new RawSql(value);
13501
+ return sqlFn;
13502
+ }
13503
+ /**
13504
+ * Create a SQL template function for PostgreSQL/datatable queries
13505
+ * @param name - Database/datatable name (default: "main")
13506
+ * @returns SQL template function for building parameterized queries
13507
+ * @example
13508
+ * let sql = wmill.datatable()
13509
+ * let name = 'Robin'
13510
+ * let age = 21
13511
+ * await sql`
13512
+ * SELECT * FROM friends
13513
+ * WHERE name = ${name} AND age = ${age}::int
13514
+ * `.fetch()
13515
+ */
13516
+ function datatable(name = "main") {
13517
+ let { name: n, schema } = parseName(name);
13518
+ let sqlFn = buildSqlTemplateFunction(datatableProvider(n, schema));
13519
+ sqlFn.query = (sqlString, ...params) => {
13387
13520
  let arr = Object.assign([sqlString], { raw: [sqlString] });
13388
13521
  return sqlFn(arr, ...params);
13389
13522
  };
13390
13523
  return sqlFn;
13391
13524
  }
13525
+ /**
13526
+ * Create a SQL template function for DuckDB/ducklake queries
13527
+ * @param name - DuckDB database name (default: "main")
13528
+ * @returns SQL template function for building parameterized queries
13529
+ * @example
13530
+ * let sql = wmill.ducklake()
13531
+ * let name = 'Robin'
13532
+ * let age = 21
13533
+ * await sql`
13534
+ * SELECT * FROM friends
13535
+ * WHERE name = ${name} AND age = ${age}
13536
+ * `.fetch()
13537
+ */
13538
+ function ducklake(name = "main") {
13539
+ return buildSqlTemplateFunction(ducklakeProvider(name));
13540
+ }
13392
13541
  function inferSqlType(value) {
13393
13542
  if (typeof value === "number" || typeof value === "bigint") {
13394
13543
  if (Number.isInteger(value)) return "BIGINT";
@@ -13420,6 +13569,9 @@ function parseName(name) {
13420
13569
  //#region src/client.ts
13421
13570
  const SHARED_FOLDER = "/shared";
13422
13571
  let mockedApi = void 0;
13572
+ function workerHasInternalServer() {
13573
+ return /^https?:\/\/(localhost|127\.0\.0\.1)(:|\/|$)/.test(OpenAPI.BASE ?? "");
13574
+ }
13423
13575
  /**
13424
13576
  * Initialize the Windmill client with authentication token and base URL
13425
13577
  * @param token - Authentication token (defaults to WM_TOKEN env variable)