dataiku-sdk 3.6.0 → 3.7.0

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.
Files changed (127) hide show
  1. package/README.md +14 -6
  2. package/bin/bun-version.js +14 -0
  3. package/bin/dss.js +23 -12
  4. package/dist/build-metadata.json +1 -1
  5. package/dist/packages/types/src/index.d.ts +74 -1
  6. package/dist/packages/types/src/index.js +53 -1
  7. package/dist/src/cli/coerce.d.ts +1 -0
  8. package/dist/src/cli/coerce.js +19 -15
  9. package/dist/src/cli/command-syntax.json +3521 -416
  10. package/dist/src/cli/commands/analysis.js +19 -1
  11. package/dist/src/cli/commands/bundle.js +22 -0
  12. package/dist/src/cli/commands/connection.js +26 -2
  13. package/dist/src/cli/commands/data-quality.js +33 -1
  14. package/dist/src/cli/commands/dataset.js +35 -4
  15. package/dist/src/cli/commands/discussion.js +15 -0
  16. package/dist/src/cli/commands/doctor.js +1 -1
  17. package/dist/src/cli/commands/flow.d.ts +5 -0
  18. package/dist/src/cli/commands/flow.js +57 -0
  19. package/dist/src/cli/commands/future.js +8 -0
  20. package/dist/src/cli/commands/index.js +6 -0
  21. package/dist/src/cli/commands/job.js +29 -6
  22. package/dist/src/cli/commands/metrics.js +21 -1
  23. package/dist/src/cli/commands/ml-task.d.ts +5 -0
  24. package/dist/src/cli/commands/ml-task.js +86 -16
  25. package/dist/src/cli/commands/mlflow.d.ts +11 -0
  26. package/dist/src/cli/commands/mlflow.js +121 -0
  27. package/dist/src/cli/commands/plugin.js +5 -11
  28. package/dist/src/cli/commands/project-deployer.js +70 -0
  29. package/dist/src/cli/commands/project-library.js +2 -5
  30. package/dist/src/cli/commands/project.js +8 -0
  31. package/dist/src/cli/commands/recipe.d.ts +9 -0
  32. package/dist/src/cli/commands/recipe.js +93 -7
  33. package/dist/src/cli/commands/saved-model.d.ts +1 -1
  34. package/dist/src/cli/commands/saved-model.js +9 -76
  35. package/dist/src/cli/commands/streaming-endpoint.js +30 -1
  36. package/dist/src/cli/commands/webapp.js +8 -0
  37. package/dist/src/cli/commands/wiki.js +22 -0
  38. package/dist/src/cli/commands/workspace.js +8 -0
  39. package/dist/src/cli/contract.d.ts +16 -15
  40. package/dist/src/cli/contract.js +139 -3404
  41. package/dist/src/cli/doctor.d.ts +13 -0
  42. package/dist/src/cli/doctor.js +41 -1
  43. package/dist/src/cli/flags.d.ts +7 -1
  44. package/dist/src/cli/flags.js +78 -6
  45. package/dist/src/cli/helpers/app-successor.js +1 -2
  46. package/dist/src/cli/helpers/documentation.d.ts +21 -0
  47. package/dist/src/cli/helpers/documentation.js +53 -0
  48. package/dist/src/cli/helpers/trained-model.d.ts +26 -0
  49. package/dist/src/cli/helpers/trained-model.js +144 -0
  50. package/dist/src/cli/list-output.d.ts +7 -0
  51. package/dist/src/cli/list-output.js +77 -0
  52. package/dist/src/cli/list-shapes.d.ts +21 -0
  53. package/dist/src/cli/list-shapes.js +111 -0
  54. package/dist/src/cli/output-schemas.d.ts +0 -14
  55. package/dist/src/cli/output-schemas.js +4 -7
  56. package/dist/src/cli/output.d.ts +0 -1
  57. package/dist/src/cli/output.js +27 -19
  58. package/dist/src/cli/plans.d.ts +14 -0
  59. package/dist/src/cli/plans.js +3684 -0
  60. package/dist/src/cli/usage.d.ts +7 -0
  61. package/dist/src/cli/usage.js +20 -1
  62. package/dist/src/cli/version.d.ts +2 -2
  63. package/dist/src/cli/version.js +2 -2
  64. package/dist/src/cli.js +127 -113
  65. package/dist/src/client.d.ts +52 -43
  66. package/dist/src/client.js +267 -96
  67. package/dist/src/errors.d.ts +11 -1
  68. package/dist/src/errors.js +31 -47
  69. package/dist/src/generated/action-output-schemas.json +345 -89
  70. package/dist/src/index.d.ts +5 -1
  71. package/dist/src/index.js +3 -0
  72. package/dist/src/resources/analyses.d.ts +8 -0
  73. package/dist/src/resources/analyses.js +13 -1
  74. package/dist/src/resources/bundles.d.ts +34 -0
  75. package/dist/src/resources/bundles.js +67 -0
  76. package/dist/src/resources/connections.d.ts +9 -0
  77. package/dist/src/resources/connections.js +15 -0
  78. package/dist/src/resources/data-quality.d.ts +20 -0
  79. package/dist/src/resources/data-quality.js +30 -0
  80. package/dist/src/resources/dataset-create.d.ts +19 -0
  81. package/dist/src/resources/dataset-create.js +66 -0
  82. package/dist/src/resources/datasets.d.ts +25 -15
  83. package/dist/src/resources/datasets.js +59 -111
  84. package/dist/src/resources/discussions.d.ts +5 -0
  85. package/dist/src/resources/discussions.js +7 -0
  86. package/dist/src/resources/documentation.d.ts +25 -0
  87. package/dist/src/resources/documentation.js +16 -0
  88. package/dist/src/resources/flow.d.ts +48 -0
  89. package/dist/src/resources/flow.js +65 -0
  90. package/dist/src/resources/futures.d.ts +23 -0
  91. package/dist/src/resources/futures.js +32 -0
  92. package/dist/src/resources/jobs.js +102 -2
  93. package/dist/src/resources/metrics.d.ts +10 -0
  94. package/dist/src/resources/metrics.js +10 -0
  95. package/dist/src/resources/ml-tasks.d.ts +65 -2
  96. package/dist/src/resources/ml-tasks.js +102 -28
  97. package/dist/src/resources/mlflow-extension.d.ts +73 -0
  98. package/dist/src/resources/mlflow-extension.js +105 -0
  99. package/dist/src/resources/projects.d.ts +6 -0
  100. package/dist/src/resources/projects.js +8 -0
  101. package/dist/src/resources/recipe-create.d.ts +65 -0
  102. package/dist/src/resources/recipe-create.js +338 -0
  103. package/dist/src/resources/recipes.d.ts +28 -29
  104. package/dist/src/resources/recipes.js +126 -245
  105. package/dist/src/resources/saved-models.d.ts +10 -6
  106. package/dist/src/resources/saved-models.js +16 -14
  107. package/dist/src/resources/scenarios.js +8 -14
  108. package/dist/src/resources/streaming-endpoints.d.ts +12 -0
  109. package/dist/src/resources/streaming-endpoints.js +15 -0
  110. package/dist/src/resources/trained-model.d.ts +60 -0
  111. package/dist/src/resources/trained-model.js +98 -0
  112. package/dist/src/resources/webapps.d.ts +8 -0
  113. package/dist/src/resources/webapps.js +10 -0
  114. package/dist/src/resources/wiki.d.ts +5 -0
  115. package/dist/src/resources/wiki.js +7 -0
  116. package/dist/src/resources/workspaces.d.ts +2 -0
  117. package/dist/src/resources/workspaces.js +4 -0
  118. package/dist/src/utils/response-file.js +20 -9
  119. package/dist/src/utils/secret-sanitize.d.ts +7 -0
  120. package/dist/src/utils/secret-sanitize.js +46 -0
  121. package/package.json +25 -26
  122. package/plugin.json +1 -1
  123. package/skills/dataiku-dss/SKILL.md +1 -1
  124. package/skills/dataiku-dss/references/authentication.md +3 -1
  125. package/skills/dataiku-dss/references/coding.md +1 -0
  126. package/skills/dataiku-dss/references/discovery.md +4 -6
  127. package/skills/dataiku-dss/references/troubleshooting.md +3 -2
@@ -1,52 +1,8 @@
1
1
  import { readFileSync, } from "node:fs";
2
2
  import { basename, } from "node:path";
3
- import { getCACertificates, } from "node:tls";
4
3
  import { Value, } from "@sinclair/typebox/value";
5
4
  import { safeParseSchema, } from "./schemas.js";
6
5
  import { classifyDataikuError, ClientValidationError, DataikuError, nonJsonResponseBody, } from "./errors.js";
7
- import { AnalysesResource, } from "./resources/analyses.js";
8
- import { ApiDeployerResource, } from "./resources/api-deployer.js";
9
- import { ApiServicesResource, } from "./resources/api-services.js";
10
- import { ApplicationsResource, } from "./resources/applications.js";
11
- import { BundlesResource, ProjectDeployerResource, } from "./resources/bundles.js";
12
- import { CodeEnvsResource, } from "./resources/code-envs.js";
13
- import { ConnectionsResource, } from "./resources/connections.js";
14
- import { ContinuousActivitiesResource, } from "./resources/continuous-activities.js";
15
- import { DashboardsResource, } from "./resources/dashboards.js";
16
- import { DataCollectionsResource, } from "./resources/data-collections.js";
17
- import { DataQualityResource, } from "./resources/data-quality.js";
18
- import { DatasetsResource, } from "./resources/datasets.js";
19
- import { DiscussionsResource, } from "./resources/discussions.js";
20
- import { FlowZonesResource, } from "./resources/flow-zones.js";
21
- import { FoldersResource, } from "./resources/folders.js";
22
- import { FuturesResource, } from "./resources/futures.js";
23
- import { GroupsResource, } from "./resources/groups.js";
24
- import { InsightsResource, } from "./resources/insights.js";
25
- import { JobsResource, } from "./resources/jobs.js";
26
- import { KnowledgeBanksResource, } from "./resources/knowledge-banks.js";
27
- import { LlmsResource, } from "./resources/llms.js";
28
- import { MacrosResource, } from "./resources/macros.js";
29
- import { MeaningsResource, } from "./resources/meanings.js";
30
- import { MetricsResource, } from "./resources/metrics.js";
31
- import { MlTasksResource, } from "./resources/ml-tasks.js";
32
- import { ModelEvaluationStoresResource, } from "./resources/model-evaluation-stores.js";
33
- import { NotebooksResource, } from "./resources/notebooks.js";
34
- import { PluginsResource, } from "./resources/plugins.js";
35
- import { ProjectFoldersResource, } from "./resources/project-folders.js";
36
- import { ProjectGitResource, } from "./resources/project-git.js";
37
- import { ProjectLibraryResource, } from "./resources/project-library.js";
38
- import { ProjectsResource, } from "./resources/projects.js";
39
- import { RecipesResource, } from "./resources/recipes.js";
40
- import { SavedModelsResource, } from "./resources/saved-models.js";
41
- import { ScenariosResource, } from "./resources/scenarios.js";
42
- import { SqlResource, } from "./resources/sql.js";
43
- import { StatisticsResource, } from "./resources/statistics.js";
44
- import { StreamingEndpointsResource, } from "./resources/streaming-endpoints.js";
45
- import { UsersResource, } from "./resources/users.js";
46
- import { VariablesResource, } from "./resources/variables.js";
47
- import { WebappsResource, } from "./resources/webapps.js";
48
- import { WikiResource, } from "./resources/wiki.js";
49
- import { WorkspacesResource, } from "./resources/workspaces.js";
50
6
  /* ------------------------------------------------------------------ */
51
7
  /* Constants */
52
8
  /* ------------------------------------------------------------------ */
@@ -94,6 +50,24 @@ function retryAfterDelayMs(value) {
94
50
  function isTransientError(status, body) {
95
51
  return classifyDataikuError(status, body).category === "transient";
96
52
  }
53
+ /**
54
+ * Transport failure text that keeps the system error code: Bun puts it on the
55
+ * error (`ConnectionRefused`, `ENOTFOUND`), Node's fetch on `cause`.
56
+ */
57
+ function transportErrorDetail(error) {
58
+ if (!(error instanceof Error))
59
+ return "Unknown transport error";
60
+ const cause = error.cause instanceof Error ? error.cause : undefined;
61
+ let code;
62
+ for (const candidate of [error, cause,]) {
63
+ if (candidate && "code" in candidate && typeof candidate.code === "string") {
64
+ code = candidate.code;
65
+ break;
66
+ }
67
+ }
68
+ const message = cause?.message ?? error.message;
69
+ return code && !message.includes(code) ? `${code}: ${message}` : message;
70
+ }
97
71
  function shouldRetryMethod(method) {
98
72
  return method.toUpperCase() === "GET";
99
73
  }
@@ -183,6 +157,8 @@ function buildFetchTlsOptions(config) {
183
157
  tls.rejectUnauthorized = rejectUnauthorized;
184
158
  if (caCertPath) {
185
159
  try {
160
+ // node:tls costs ~12 ms to load; only a custom CA bundle needs it.
161
+ const { getCACertificates, } = require("node:tls");
186
162
  tls.ca = [...getCACertificates("default"), readFileSync(caCertPath, "utf-8"),];
187
163
  }
188
164
  catch (error) {
@@ -249,6 +225,8 @@ export class DataikuClient {
249
225
  scenariosResource;
250
226
  foldersResource;
251
227
  flowZonesResource;
228
+ flowResource;
229
+ mlflowExtensionResource;
252
230
  variablesResource;
253
231
  connectionsResource;
254
232
  codeEnvsResource;
@@ -283,137 +261,329 @@ export class DataikuClient {
283
261
  pluginsResource;
284
262
  usersResource;
285
263
  groupsResource;
264
+ // Resource modules load on first access (like commands/index.ts): a command
265
+ // that touches one resource does not parse the other forty-odd.
286
266
  get projects() {
287
- return (this.projectsResource ??= new ProjectsResource(this));
267
+ if (!this.projectsResource) {
268
+ const { ProjectsResource: Resource, } = require("./resources/projects.js");
269
+ this.projectsResource = new Resource(this);
270
+ }
271
+ return this.projectsResource;
288
272
  }
289
273
  get datasets() {
290
- return (this.datasetsResource ??= new DatasetsResource(this));
274
+ if (!this.datasetsResource) {
275
+ const { DatasetsResource: Resource, } = require("./resources/datasets.js");
276
+ this.datasetsResource = new Resource(this);
277
+ }
278
+ return this.datasetsResource;
291
279
  }
292
280
  get dashboards() {
293
- return (this.dashboardsResource ??= new DashboardsResource(this));
281
+ if (!this.dashboardsResource) {
282
+ const { DashboardsResource: Resource, } = require("./resources/dashboards.js");
283
+ this.dashboardsResource = new Resource(this);
284
+ }
285
+ return this.dashboardsResource;
294
286
  }
295
287
  get dataQuality() {
296
- return (this.dataQualityResource ??= new DataQualityResource(this));
288
+ if (!this.dataQualityResource) {
289
+ const { DataQualityResource: Resource, } = require("./resources/data-quality.js");
290
+ this.dataQualityResource = new Resource(this);
291
+ }
292
+ return this.dataQualityResource;
297
293
  }
298
294
  get recipes() {
299
- return (this.recipesResource ??= new RecipesResource(this));
295
+ if (!this.recipesResource) {
296
+ const { RecipesResource: Resource, } = require("./resources/recipes.js");
297
+ this.recipesResource = new Resource(this);
298
+ }
299
+ return this.recipesResource;
300
300
  }
301
301
  get jobs() {
302
- return (this.jobsResource ??= new JobsResource(this));
302
+ if (!this.jobsResource) {
303
+ const { JobsResource: Resource, } = require("./resources/jobs.js");
304
+ this.jobsResource = new Resource(this);
305
+ }
306
+ return this.jobsResource;
303
307
  }
304
308
  get futures() {
305
- return (this.futuresResource ??= new FuturesResource(this));
309
+ if (!this.futuresResource) {
310
+ const { FuturesResource: Resource, } = require("./resources/futures.js");
311
+ this.futuresResource = new Resource(this);
312
+ }
313
+ return this.futuresResource;
306
314
  }
307
315
  get scenarios() {
308
- return (this.scenariosResource ??= new ScenariosResource(this));
316
+ if (!this.scenariosResource) {
317
+ const { ScenariosResource: Resource, } = require("./resources/scenarios.js");
318
+ this.scenariosResource = new Resource(this);
319
+ }
320
+ return this.scenariosResource;
309
321
  }
310
322
  get folders() {
311
- return (this.foldersResource ??= new FoldersResource(this));
323
+ if (!this.foldersResource) {
324
+ const { FoldersResource: Resource, } = require("./resources/folders.js");
325
+ this.foldersResource = new Resource(this);
326
+ }
327
+ return this.foldersResource;
312
328
  }
313
329
  get flowZones() {
314
- return (this.flowZonesResource ??= new FlowZonesResource(this));
330
+ if (!this.flowZonesResource) {
331
+ const { FlowZonesResource: Resource, } = require("./resources/flow-zones.js");
332
+ this.flowZonesResource = new Resource(this);
333
+ }
334
+ return this.flowZonesResource;
335
+ }
336
+ get flow() {
337
+ if (!this.flowResource) {
338
+ const { FlowResource: Resource, } = require("./resources/flow.js");
339
+ this.flowResource = new Resource(this);
340
+ }
341
+ return this.flowResource;
342
+ }
343
+ get mlflowExtension() {
344
+ if (!this.mlflowExtensionResource) {
345
+ const { MlflowExtensionResource: Resource, } = require("./resources/mlflow-extension.js");
346
+ this.mlflowExtensionResource = new Resource(this);
347
+ }
348
+ return this.mlflowExtensionResource;
315
349
  }
316
350
  get variables() {
317
- return (this.variablesResource ??= new VariablesResource(this));
351
+ if (!this.variablesResource) {
352
+ const { VariablesResource: Resource, } = require("./resources/variables.js");
353
+ this.variablesResource = new Resource(this);
354
+ }
355
+ return this.variablesResource;
318
356
  }
319
357
  get connections() {
320
- return (this.connectionsResource ??= new ConnectionsResource(this));
358
+ if (!this.connectionsResource) {
359
+ const { ConnectionsResource: Resource, } = require("./resources/connections.js");
360
+ this.connectionsResource = new Resource(this);
361
+ }
362
+ return this.connectionsResource;
321
363
  }
322
364
  get codeEnvs() {
323
- return (this.codeEnvsResource ??= new CodeEnvsResource(this));
365
+ if (!this.codeEnvsResource) {
366
+ const { CodeEnvsResource: Resource, } = require("./resources/code-envs.js");
367
+ this.codeEnvsResource = new Resource(this);
368
+ }
369
+ return this.codeEnvsResource;
324
370
  }
325
371
  get insights() {
326
- return (this.insightsResource ??= new InsightsResource(this));
372
+ if (!this.insightsResource) {
373
+ const { InsightsResource: Resource, } = require("./resources/insights.js");
374
+ this.insightsResource = new Resource(this);
375
+ }
376
+ return this.insightsResource;
327
377
  }
328
378
  get sql() {
329
- return (this.sqlResource ??= new SqlResource(this));
379
+ if (!this.sqlResource) {
380
+ const { SqlResource: Resource, } = require("./resources/sql.js");
381
+ this.sqlResource = new Resource(this);
382
+ }
383
+ return this.sqlResource;
330
384
  }
331
385
  get notebooks() {
332
- return (this.notebooksResource ??= new NotebooksResource(this));
386
+ if (!this.notebooksResource) {
387
+ const { NotebooksResource: Resource, } = require("./resources/notebooks.js");
388
+ this.notebooksResource = new Resource(this);
389
+ }
390
+ return this.notebooksResource;
333
391
  }
334
392
  get wiki() {
335
- return (this.wikiResource ??= new WikiResource(this));
393
+ if (!this.wikiResource) {
394
+ const { WikiResource: Resource, } = require("./resources/wiki.js");
395
+ this.wikiResource = new Resource(this);
396
+ }
397
+ return this.wikiResource;
336
398
  }
337
399
  get applications() {
338
- return (this.applicationsResource ??= new ApplicationsResource(this));
400
+ if (!this.applicationsResource) {
401
+ const { ApplicationsResource: Resource, } = require("./resources/applications.js");
402
+ this.applicationsResource = new Resource(this);
403
+ }
404
+ return this.applicationsResource;
339
405
  }
340
406
  get webapps() {
341
- return (this.webappsResource ??= new WebappsResource(this));
407
+ if (!this.webappsResource) {
408
+ const { WebappsResource: Resource, } = require("./resources/webapps.js");
409
+ this.webappsResource = new Resource(this);
410
+ }
411
+ return this.webappsResource;
342
412
  }
343
413
  get apiServices() {
344
- return (this.apiServicesResource ??= new ApiServicesResource(this));
414
+ if (!this.apiServicesResource) {
415
+ const { ApiServicesResource: Resource, } = require("./resources/api-services.js");
416
+ this.apiServicesResource = new Resource(this);
417
+ }
418
+ return this.apiServicesResource;
345
419
  }
346
420
  get apiDeployer() {
347
- return (this.apiDeployerResource ??= new ApiDeployerResource(this));
421
+ if (!this.apiDeployerResource) {
422
+ const { ApiDeployerResource: Resource, } = require("./resources/api-deployer.js");
423
+ this.apiDeployerResource = new Resource(this);
424
+ }
425
+ return this.apiDeployerResource;
348
426
  }
349
427
  get bundles() {
350
- return (this.bundlesResource ??= new BundlesResource(this));
428
+ if (!this.bundlesResource) {
429
+ const { BundlesResource: Resource, } = require("./resources/bundles.js");
430
+ this.bundlesResource = new Resource(this);
431
+ }
432
+ return this.bundlesResource;
351
433
  }
352
434
  get projectDeployer() {
353
- return (this.projectDeployerResource ??= new ProjectDeployerResource(this));
435
+ if (!this.projectDeployerResource) {
436
+ const { ProjectDeployerResource: Resource, } = require("./resources/bundles.js");
437
+ this.projectDeployerResource = new Resource(this);
438
+ }
439
+ return this.projectDeployerResource;
354
440
  }
355
441
  get projectLibrary() {
356
- return (this.projectLibraryResource ??= new ProjectLibraryResource(this));
442
+ if (!this.projectLibraryResource) {
443
+ const { ProjectLibraryResource: Resource, } = require("./resources/project-library.js");
444
+ this.projectLibraryResource = new Resource(this);
445
+ }
446
+ return this.projectLibraryResource;
357
447
  }
358
448
  get projectGit() {
359
- return (this.projectGitResource ??= new ProjectGitResource(this));
449
+ if (!this.projectGitResource) {
450
+ const { ProjectGitResource: Resource, } = require("./resources/project-git.js");
451
+ this.projectGitResource = new Resource(this);
452
+ }
453
+ return this.projectGitResource;
360
454
  }
361
455
  get streamingEndpoints() {
362
- return (this.streamingEndpointsResource ??= new StreamingEndpointsResource(this));
456
+ if (!this.streamingEndpointsResource) {
457
+ const { StreamingEndpointsResource: Resource, } = require("./resources/streaming-endpoints.js");
458
+ this.streamingEndpointsResource = new Resource(this);
459
+ }
460
+ return this.streamingEndpointsResource;
363
461
  }
364
462
  get continuousActivities() {
365
- return (this.continuousActivitiesResource ??= new ContinuousActivitiesResource(this));
463
+ if (!this.continuousActivitiesResource) {
464
+ const { ContinuousActivitiesResource: Resource, } = require("./resources/continuous-activities.js");
465
+ this.continuousActivitiesResource = new Resource(this);
466
+ }
467
+ return this.continuousActivitiesResource;
366
468
  }
367
469
  get statistics() {
368
- return (this.statisticsResource ??= new StatisticsResource(this));
470
+ if (!this.statisticsResource) {
471
+ const { StatisticsResource: Resource, } = require("./resources/statistics.js");
472
+ this.statisticsResource = new Resource(this);
473
+ }
474
+ return this.statisticsResource;
369
475
  }
370
476
  get discussions() {
371
- return (this.discussionsResource ??= new DiscussionsResource(this));
477
+ if (!this.discussionsResource) {
478
+ const { DiscussionsResource: Resource, } = require("./resources/discussions.js");
479
+ this.discussionsResource = new Resource(this);
480
+ }
481
+ return this.discussionsResource;
372
482
  }
373
483
  get workspaces() {
374
- return (this.workspacesResource ??= new WorkspacesResource(this));
484
+ if (!this.workspacesResource) {
485
+ const { WorkspacesResource: Resource, } = require("./resources/workspaces.js");
486
+ this.workspacesResource = new Resource(this);
487
+ }
488
+ return this.workspacesResource;
375
489
  }
376
490
  get metrics() {
377
- return (this.metricsResource ??= new MetricsResource(this));
491
+ if (!this.metricsResource) {
492
+ const { MetricsResource: Resource, } = require("./resources/metrics.js");
493
+ this.metricsResource = new Resource(this);
494
+ }
495
+ return this.metricsResource;
378
496
  }
379
497
  get meanings() {
380
- return (this.meaningsResource ??= new MeaningsResource(this));
498
+ if (!this.meaningsResource) {
499
+ const { MeaningsResource: Resource, } = require("./resources/meanings.js");
500
+ this.meaningsResource = new Resource(this);
501
+ }
502
+ return this.meaningsResource;
381
503
  }
382
504
  get analyses() {
383
- return (this.analysesResource ??= new AnalysesResource(this));
505
+ if (!this.analysesResource) {
506
+ const { AnalysesResource: Resource, } = require("./resources/analyses.js");
507
+ this.analysesResource = new Resource(this);
508
+ }
509
+ return this.analysesResource;
384
510
  }
385
511
  get mlTasks() {
386
- return (this.mlTasksResource ??= new MlTasksResource(this));
512
+ if (!this.mlTasksResource) {
513
+ const { MlTasksResource: Resource, } = require("./resources/ml-tasks.js");
514
+ this.mlTasksResource = new Resource(this);
515
+ }
516
+ return this.mlTasksResource;
387
517
  }
388
518
  get savedModels() {
389
- return (this.savedModelsResource ??= new SavedModelsResource(this));
519
+ if (!this.savedModelsResource) {
520
+ const { SavedModelsResource: Resource, } = require("./resources/saved-models.js");
521
+ this.savedModelsResource = new Resource(this);
522
+ }
523
+ return this.savedModelsResource;
390
524
  }
391
525
  get modelEvaluationStores() {
392
- return (this.modelEvaluationStoresResource ??= new ModelEvaluationStoresResource(this));
526
+ if (!this.modelEvaluationStoresResource) {
527
+ const { ModelEvaluationStoresResource: Resource, } = require("./resources/model-evaluation-stores.js");
528
+ this.modelEvaluationStoresResource = new Resource(this);
529
+ }
530
+ return this.modelEvaluationStoresResource;
393
531
  }
394
532
  get projectFolders() {
395
- return (this.projectFoldersResource ??= new ProjectFoldersResource(this));
533
+ if (!this.projectFoldersResource) {
534
+ const { ProjectFoldersResource: Resource, } = require("./resources/project-folders.js");
535
+ this.projectFoldersResource = new Resource(this);
536
+ }
537
+ return this.projectFoldersResource;
396
538
  }
397
539
  get dataCollections() {
398
- return (this.dataCollectionsResource ??= new DataCollectionsResource(this));
540
+ if (!this.dataCollectionsResource) {
541
+ const { DataCollectionsResource: Resource, } = require("./resources/data-collections.js");
542
+ this.dataCollectionsResource = new Resource(this);
543
+ }
544
+ return this.dataCollectionsResource;
399
545
  }
400
546
  get llms() {
401
- return (this.llmsResource ??= new LlmsResource(this));
547
+ if (!this.llmsResource) {
548
+ const { LlmsResource: Resource, } = require("./resources/llms.js");
549
+ this.llmsResource = new Resource(this);
550
+ }
551
+ return this.llmsResource;
402
552
  }
403
553
  get knowledgeBanks() {
404
- return (this.knowledgeBanksResource ??= new KnowledgeBanksResource(this));
554
+ if (!this.knowledgeBanksResource) {
555
+ const { KnowledgeBanksResource: Resource, } = require("./resources/knowledge-banks.js");
556
+ this.knowledgeBanksResource = new Resource(this);
557
+ }
558
+ return this.knowledgeBanksResource;
405
559
  }
406
560
  get macros() {
407
- return (this.macrosResource ??= new MacrosResource(this));
561
+ if (!this.macrosResource) {
562
+ const { MacrosResource: Resource, } = require("./resources/macros.js");
563
+ this.macrosResource = new Resource(this);
564
+ }
565
+ return this.macrosResource;
408
566
  }
409
567
  get plugins() {
410
- return (this.pluginsResource ??= new PluginsResource(this));
568
+ if (!this.pluginsResource) {
569
+ const { PluginsResource: Resource, } = require("./resources/plugins.js");
570
+ this.pluginsResource = new Resource(this);
571
+ }
572
+ return this.pluginsResource;
411
573
  }
412
574
  get users() {
413
- return (this.usersResource ??= new UsersResource(this));
575
+ if (!this.usersResource) {
576
+ const { UsersResource: Resource, } = require("./resources/users.js");
577
+ this.usersResource = new Resource(this);
578
+ }
579
+ return this.usersResource;
414
580
  }
415
581
  get groups() {
416
- return (this.groupsResource ??= new GroupsResource(this));
582
+ if (!this.groupsResource) {
583
+ const { GroupsResource: Resource, } = require("./resources/groups.js");
584
+ this.groupsResource = new Resource(this);
585
+ }
586
+ return this.groupsResource;
417
587
  }
418
588
  constructor(config) {
419
589
  /* oxlint-disable dss/no-direct-process-env -- SDK constructor defaults (DATAIKU_URL/DATAIKU_API_KEY) for library callers */
@@ -470,7 +640,7 @@ export class DataikuClient {
470
640
  /* ---- public: HTTP verbs ---- */
471
641
  async get(path, options) {
472
642
  const deadlineAt = resolveGetDeadlineAt(options);
473
- const res = await this.fetchWithRetry(`${this.baseUrl}${path}`, { method: "GET", headers: this.getHeaders(false), }, options?.noRetry === true ? 1 : undefined, deadlineAt);
643
+ const res = await this.fetchWithRetry(`${this.baseUrl}${path}`, { method: "GET", headers: { ...this.getHeaders(false), ...options?.headers, }, }, options?.noRetry === true ? 1 : undefined, deadlineAt);
474
644
  return this.parseJsonResponse(res, deadlineAt);
475
645
  }
476
646
  /**
@@ -543,7 +713,7 @@ export class DataikuClient {
543
713
  }
544
714
  const res = await this.fetchWithRetry(`${this.baseUrl}${path}`, {
545
715
  method: "POST",
546
- headers: this.getHeaders(body !== undefined),
716
+ headers: { ...this.getHeaders(body !== undefined), ...options?.headers, },
547
717
  body: body !== undefined ? JSON.stringify(body) : undefined,
548
718
  }, retryMaxAttempts);
549
719
  return this.parseJsonResponse(res);
@@ -1072,7 +1242,13 @@ export class DataikuClient {
1072
1242
  }
1073
1243
  timedOut = true;
1074
1244
  }
1075
- const canRetry = retryEnabled && attempt < maxAttempts;
1245
+ const detail = timedOut
1246
+ ? `Request timed out after ${attemptTimeoutMs}ms`
1247
+ : transportErrorDetail(error);
1248
+ // The classifier that labels the final error also decides the retry:
1249
+ // a refused connection, unknown host, bad URL, or untrusted certificate
1250
+ // fails the same way on every attempt.
1251
+ const canRetry = retryEnabled && attempt < maxAttempts && isTransientError(0, detail);
1076
1252
  if (canRetry) {
1077
1253
  const delayMs = computeBackoffDelayMs(attempt);
1078
1254
  if (deadlineAt === undefined || Date.now() + delayMs <= deadlineAt) {
@@ -1083,11 +1259,6 @@ export class DataikuClient {
1083
1259
  await sleep(Math.max(0, deadlineAt - Date.now()));
1084
1260
  throw new DataikuError(0, "Request Timeout", `Request deadline exceeded before backoff retry ${attempt + 1}.`, buildRetryMetadata(method, retryEnabled, maxAttempts, attempt, delaysMs, true));
1085
1261
  }
1086
- const detail = timedOut
1087
- ? `Request timed out after ${attemptTimeoutMs}ms`
1088
- : error instanceof Error
1089
- ? error.message
1090
- : "Unknown transport error";
1091
1262
  this.logTrace({
1092
1263
  phase: "error",
1093
1264
  method,
@@ -45,6 +45,10 @@ export declare const UNEXPECTED_RESPONSE_MARKER = "Unexpected DSS response";
45
45
  export declare function unexpectedResponseError(detail: string, status?: number): DataikuError;
46
46
  /** Prefix for a SQL query failure reported by DSS on a 2xx finish-streaming response. */
47
47
  export declare const SQL_QUERY_FAILED_MARKER = "SQL query failed in DSS";
48
+ /** Generic permission hint; the CLI names the project when the request was project-scoped. */
49
+ export declare const FORBIDDEN_HINT = "Check API key validity and project permissions for the requested action.";
50
+ /** Generic 404 hint; the CLI names the resource and project when it knows them. */
51
+ export declare const NOT_FOUND_HINT = "Verify projectKey and object identifiers (dataset/recipe/scenario/folder IDs).";
48
52
  export declare function classifyDataikuError(status: number, body: string): DataikuErrorTaxonomy;
49
53
  export declare class DataikuError extends Error {
50
54
  status: number;
@@ -59,8 +63,14 @@ export declare class DataikuError extends Error {
59
63
  readonly trustedElapsedMs?: number;
60
64
  readonly bodyTruncated?: boolean;
61
65
  constructor(status: number, statusText: string, body: string, retry?: DataikuRetryMetadata, requestId?: string, trustedMetadata?: DataikuErrorTrustedMetadata);
66
+ /** Status line only: never echoes response body text. */
62
67
  get safeMessage(): string;
68
+ /** The DSS message part of `message` (HTML summarized, server paths stripped, bounded). */
69
+ get summary(): string;
63
70
  private static extractSummary;
64
- private static formatRetryMetadata;
71
+ /**
72
+ * One line: status plus the DSS message. Category, retryability, hint, and
73
+ * retry metadata are structured fields on the error, not message prose.
74
+ */
65
75
  private static buildDetails;
66
76
  }