dataiku-sdk 0.10.0 → 0.11.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 (133) hide show
  1. package/dist/packages/types/src/index.d.ts +15 -2
  2. package/dist/packages/types/src/index.js +9 -1
  3. package/dist/src/cli/coerce.d.ts +36 -0
  4. package/dist/src/cli/coerce.js +239 -0
  5. package/dist/src/cli/commands/api-deployer.d.ts +2 -0
  6. package/dist/src/cli/commands/api-deployer.js +170 -0
  7. package/dist/src/cli/commands/api-service.d.ts +2 -0
  8. package/dist/src/cli/commands/api-service.js +102 -0
  9. package/dist/src/cli/commands/app.d.ts +2 -0
  10. package/dist/src/cli/commands/app.js +78 -0
  11. package/dist/src/cli/commands/bundle.d.ts +2 -0
  12. package/dist/src/cli/commands/bundle.js +107 -0
  13. package/dist/src/cli/commands/business-app.d.ts +2 -0
  14. package/dist/src/cli/commands/business-app.js +76 -0
  15. package/dist/src/cli/commands/code-env.d.ts +2 -0
  16. package/dist/src/cli/commands/code-env.js +255 -0
  17. package/dist/src/cli/commands/code.d.ts +2 -0
  18. package/dist/src/cli/commands/code.js +63 -0
  19. package/dist/src/cli/commands/connection.d.ts +2 -0
  20. package/dist/src/cli/commands/connection.js +54 -0
  21. package/dist/src/cli/commands/continuous-activity.d.ts +2 -0
  22. package/dist/src/cli/commands/continuous-activity.js +38 -0
  23. package/dist/src/cli/commands/dashboard.d.ts +2 -0
  24. package/dist/src/cli/commands/dashboard.js +99 -0
  25. package/dist/src/cli/commands/data-quality.d.ts +2 -0
  26. package/dist/src/cli/commands/data-quality.js +235 -0
  27. package/dist/src/cli/commands/dataset.d.ts +2 -0
  28. package/dist/src/cli/commands/dataset.js +288 -0
  29. package/dist/src/cli/commands/discussion.d.ts +2 -0
  30. package/dist/src/cli/commands/discussion.js +47 -0
  31. package/dist/src/cli/commands/doctor.d.ts +2 -0
  32. package/dist/src/cli/commands/doctor.js +9 -0
  33. package/dist/src/cli/commands/flow-zone.d.ts +2 -0
  34. package/dist/src/cli/commands/flow-zone.js +282 -0
  35. package/dist/src/cli/commands/folder.d.ts +2 -0
  36. package/dist/src/cli/commands/folder.js +202 -0
  37. package/dist/src/cli/commands/future.d.ts +2 -0
  38. package/dist/src/cli/commands/future.js +57 -0
  39. package/dist/src/cli/commands/index.d.ts +2 -0
  40. package/dist/src/cli/commands/index.js +70 -0
  41. package/dist/src/cli/commands/insight.d.ts +2 -0
  42. package/dist/src/cli/commands/insight.js +156 -0
  43. package/dist/src/cli/commands/job.d.ts +2 -0
  44. package/dist/src/cli/commands/job.js +406 -0
  45. package/dist/src/cli/commands/meaning.d.ts +2 -0
  46. package/dist/src/cli/commands/meaning.js +115 -0
  47. package/dist/src/cli/commands/metrics.d.ts +2 -0
  48. package/dist/src/cli/commands/metrics.js +39 -0
  49. package/dist/src/cli/commands/notebook.d.ts +2 -0
  50. package/dist/src/cli/commands/notebook.js +242 -0
  51. package/dist/src/cli/commands/project-deployer.d.ts +2 -0
  52. package/dist/src/cli/commands/project-deployer.js +118 -0
  53. package/dist/src/cli/commands/project-library.d.ts +2 -0
  54. package/dist/src/cli/commands/project-library.js +197 -0
  55. package/dist/src/cli/commands/project.d.ts +2 -0
  56. package/dist/src/cli/commands/project.js +132 -0
  57. package/dist/src/cli/commands/recipe.d.ts +2 -0
  58. package/dist/src/cli/commands/recipe.js +632 -0
  59. package/dist/src/cli/commands/scenario.d.ts +2 -0
  60. package/dist/src/cli/commands/scenario.js +190 -0
  61. package/dist/src/cli/commands/sql.d.ts +2 -0
  62. package/dist/src/cli/commands/sql.js +109 -0
  63. package/dist/src/cli/commands/statistics.d.ts +2 -0
  64. package/dist/src/cli/commands/statistics.js +165 -0
  65. package/dist/src/cli/commands/streaming-endpoint.d.ts +2 -0
  66. package/dist/src/cli/commands/streaming-endpoint.js +50 -0
  67. package/dist/src/cli/commands/variable.d.ts +2 -0
  68. package/dist/src/cli/commands/variable.js +49 -0
  69. package/dist/src/cli/commands/webapp.d.ts +2 -0
  70. package/dist/src/cli/commands/webapp.js +67 -0
  71. package/dist/src/cli/commands/wiki.d.ts +2 -0
  72. package/dist/src/cli/commands/wiki.js +123 -0
  73. package/dist/src/cli/commands/workspace.d.ts +2 -0
  74. package/dist/src/cli/commands/workspace.js +68 -0
  75. package/dist/src/cli/contract.d.ts +104 -0
  76. package/dist/src/cli/contract.js +2031 -0
  77. package/dist/src/cli/doctor.d.ts +104 -0
  78. package/dist/src/cli/doctor.js +356 -0
  79. package/dist/src/cli/env.d.ts +2 -0
  80. package/dist/src/cli/env.js +37 -0
  81. package/dist/src/cli/flags.d.ts +16 -0
  82. package/dist/src/cli/flags.js +255 -0
  83. package/dist/src/cli/helpers/cleanup.d.ts +3 -0
  84. package/dist/src/cli/helpers/cleanup.js +158 -0
  85. package/dist/src/cli/helpers/dataset.d.ts +2 -0
  86. package/dist/src/cli/helpers/dataset.js +17 -0
  87. package/dist/src/cli/helpers/flow-zone.d.ts +69 -0
  88. package/dist/src/cli/helpers/flow-zone.js +420 -0
  89. package/dist/src/cli/helpers/recipe.d.ts +11 -0
  90. package/dist/src/cli/helpers/recipe.js +83 -0
  91. package/dist/src/cli/output.d.ts +38 -0
  92. package/dist/src/cli/output.js +159 -0
  93. package/dist/src/cli/runtime.d.ts +15 -0
  94. package/dist/src/cli/runtime.js +59 -0
  95. package/dist/src/cli/types.d.ts +25 -0
  96. package/dist/src/cli/types.js +1 -0
  97. package/dist/src/cli/usage.d.ts +16 -0
  98. package/dist/src/cli/usage.js +80 -0
  99. package/dist/src/cli/version.d.ts +14 -0
  100. package/dist/src/cli/version.js +63 -0
  101. package/dist/src/cli.js +671 -8254
  102. package/dist/src/client.d.ts +1 -1
  103. package/dist/src/client.js +14 -13
  104. package/dist/src/errors.d.ts +6 -0
  105. package/dist/src/errors.js +127 -4
  106. package/dist/src/index.d.ts +3 -3
  107. package/dist/src/index.js +2 -2
  108. package/dist/src/resources/applications.d.ts +1 -1
  109. package/dist/src/resources/applications.js +27 -1
  110. package/dist/src/resources/bundles.js +2 -2
  111. package/dist/src/resources/continuous-activities.js +1 -0
  112. package/dist/src/resources/data-quality.js +5 -3
  113. package/dist/src/resources/datasets.d.ts +3 -0
  114. package/dist/src/resources/datasets.js +3 -0
  115. package/dist/src/resources/flow-zones.d.ts +2 -2
  116. package/dist/src/resources/flow-zones.js +4 -1
  117. package/dist/src/resources/meanings.d.ts +2 -0
  118. package/dist/src/resources/meanings.js +4 -0
  119. package/dist/src/resources/notebooks.d.ts +5 -7
  120. package/dist/src/resources/notebooks.js +10 -7
  121. package/dist/src/resources/projects.d.ts +1 -1
  122. package/dist/src/resources/projects.js +2 -2
  123. package/dist/src/resources/recipes.d.ts +3 -3
  124. package/dist/src/resources/recipes.js +50 -7
  125. package/dist/src/resources/scenarios.js +67 -26
  126. package/dist/src/resources/statistics.js +9 -0
  127. package/dist/src/schemas.d.ts +2 -2
  128. package/dist/src/schemas.js +1 -1
  129. package/dist/src/skill.js +2 -2
  130. package/dist/src/utils/sanitize.js +2 -1
  131. package/package.json +1 -1
  132. package/packages/types/dist/index.d.ts +15 -2
  133. package/packages/types/dist/index.js +9 -1
@@ -147,6 +147,20 @@ function rewriteSqlTableReferences(payload, rewrites) {
147
147
  }
148
148
  return next;
149
149
  }
150
+ function rewritePayloadText(payload, rewrites) {
151
+ const entries = Object
152
+ .entries(rewrites)
153
+ .filter(([from,]) => from.length > 0)
154
+ .sort(([left,], [right,]) => right.length - left.length);
155
+ if (entries.length === 0)
156
+ return payload;
157
+ const replacements = new Map(entries);
158
+ const alternatives = entries
159
+ .map(([from,]) => escapedRegExp(from))
160
+ .join("|");
161
+ const pattern = new RegExp(String.raw `(?<![A-Za-z0-9_$])(${alternatives})(?![A-Za-z0-9_$])`, "g");
162
+ return payload.replace(pattern, (match) => replacements.get(match) ?? match);
163
+ }
150
164
  function rewritePayload(payload, rewrites, payloadTextRewrites = {}, recipeType) {
151
165
  if (payload === undefined
152
166
  || (Object.keys(rewrites).length === 0 && Object.keys(payloadTextRewrites).length === 0)) {
@@ -162,10 +176,7 @@ function rewritePayload(payload, rewrites, payloadTextRewrites = {}, recipeType)
162
176
  if (isSqlRecipeType(recipeType)) {
163
177
  next = rewriteSqlTableReferences(next, rewrites);
164
178
  }
165
- for (const [from, to,] of Object.entries(payloadTextRewrites)) {
166
- if (from.length > 0)
167
- next = next.split(from).join(to);
168
- }
179
+ next = rewritePayloadText(next, payloadTextRewrites);
169
180
  return next;
170
181
  }
171
182
  function cloneRecipeDefinition(recipe, targetName, projectKey, rewrites) {
@@ -553,6 +564,37 @@ export class RecipesResource extends BaseResource {
553
564
  await provisionOutputDatasets();
554
565
  await createRecipe();
555
566
  }
567
+ // For sync recipes (a 1:1 copy) DSS does not propagate schema on build, so a
568
+ // schemaless dataset output silently builds to an empty dataset. Copy the
569
+ // single input's schema onto any schemaless dataset output so the build
570
+ // materializes rows (mirrors the DSS UI, which sets the sync output schema).
571
+ let syncOutputSchemaPropagated;
572
+ if (type.toLowerCase() === "sync" && !outputFolder) {
573
+ const inputRefs = recipeInputItems({ inputs, }).map((item) => item.ref);
574
+ const outputDatasetRefs = recipeOutputItems({ outputs, })
575
+ .filter((item) => item.type !== "MANAGED_FOLDER")
576
+ .map((item) => item.ref);
577
+ if (inputRefs.length === 1 && outputDatasetRefs.length > 0) {
578
+ const inputSchema = await this.client.datasets
579
+ .schema(inputRefs[0], pk)
580
+ .catch(() => undefined);
581
+ const inputColumns = inputSchema?.columns;
582
+ if (inputColumns && inputColumns.length > 0) {
583
+ const propagated = [];
584
+ for (const ref of outputDatasetRefs) {
585
+ const current = await this.client.datasets
586
+ .schema(ref, pk)
587
+ .catch(() => undefined);
588
+ if (current && current.columns.length === 0) {
589
+ await this.client.datasets.updateSchema(ref, inputColumns, pk);
590
+ propagated.push(ref);
591
+ }
592
+ }
593
+ if (propagated.length > 0)
594
+ syncOutputSchemaPropagated = propagated;
595
+ }
596
+ }
597
+ }
556
598
  // For join recipes: configure join conditions after creation
557
599
  let joinConfigured = false;
558
600
  const joinCols = typeof opts.joinOn === "string" ? [opts.joinOn,] : asStringArray(opts.joinOn);
@@ -627,6 +669,7 @@ export class RecipesResource extends BaseResource {
627
669
  createdDatasets,
628
670
  joinConfigured,
629
671
  outputProvisioningFallbackUsed: usedOutputProvisioningFallback,
672
+ ...(syncOutputSchemaPropagated ? { syncOutputSchemaPropagated, } : {}),
630
673
  ...(outputFolder ? { outputFolder, } : {}),
631
674
  ...(temporaryOutputDataset ? { temporaryOutputDataset, } : {}),
632
675
  ...(temporaryOutputDatasetDeleted !== undefined ? { temporaryOutputDatasetDeleted, } : {}),
@@ -719,10 +762,10 @@ export class RecipesResource extends BaseResource {
719
762
  };
720
763
  }
721
764
  /**
722
- * Download a recipe code payload to a local file.
765
+ * Download a recipe code payload to a local file.
723
766
 
724
- * Returns the path to the written file.
725
- */
767
+ * Returns the path to the written file.
768
+ */
726
769
  async downloadCode(recipeName, opts) {
727
770
  const result = await this.get(recipeName, {
728
771
  includePayload: true,
@@ -291,46 +291,87 @@ export class ScenariosResource extends BaseResource {
291
291
  * Returns `{ success: false, timedOut: true }` on timeout rather than throwing.
292
292
  */
293
293
  async runAndWait(scenarioId, opts) {
294
- const { runId, } = await this.run(scenarioId, opts?.projectKey);
294
+ const pkEnc = this.enc(opts?.projectKey);
295
+ const base = `/public/api/projects/${pkEnc}/scenarios/${encodeURIComponent(scenarioId)}`;
295
296
  const baseIntervalMs = Math.max(1, opts?.pollIntervalMs ?? 2_000);
296
297
  const adaptivePolling = opts?.pollIntervalMs === undefined;
297
298
  const timeout = Math.max(baseIntervalMs, opts?.timeoutMs ?? 120_000);
298
299
  const startedAt = Date.now();
300
+ // POST /run/ returns a TRIGGER run id, which differs from the actual scenario
301
+ // run id; resolve the real run via get-run-for-trigger so a completed scenario
302
+ // is not misreported as a timeout (the trigger id never matches lastRun).
303
+ const trigger = await this.client.post(`${base}/run/`, {});
304
+ const triggerObj = trigger.trigger;
305
+ const triggerId = triggerObj?.id ?? "manual";
306
+ const triggerRunId = String(trigger.runId ?? trigger.id ?? "");
307
+ if (!triggerRunId) {
308
+ throw new DataikuError(500, "Scenario run not started", `Scenario "${scenarioId}" run trigger returned no run id; cannot track the run.`);
309
+ }
310
+ const trigQuery = `triggerId=${encodeURIComponent(triggerId)}&triggerRunId=${encodeURIComponent(triggerRunId)}`;
311
+ let runId = "";
312
+ let outcome = "UNKNOWN";
299
313
  let pollCount = 0;
314
+ let timedOut = false;
300
315
  while (true) {
301
- pollCount += 1;
302
- const st = await this.status(scenarioId, opts?.projectKey);
303
- const elapsedMs = Date.now() - startedAt;
304
- // Scenario finished when it's no longer running and lastRun matches our runId
305
- if (!st.running && st.lastRun?.runId === runId) {
306
- const outcome = st.lastRun?.outcome ?? "UNKNOWN";
307
- return {
308
- scenarioId,
309
- runId,
310
- outcome,
311
- success: outcome === "SUCCESS",
312
- elapsedMs,
313
- pollCount,
314
- };
316
+ if (Date.now() - startedAt >= timeout) {
317
+ outcome = "TIMEOUT";
318
+ timedOut = true;
319
+ break;
315
320
  }
316
- if (elapsedMs >= timeout) {
317
- return {
318
- scenarioId,
319
- runId,
320
- outcome: "TIMEOUT",
321
- success: false,
322
- elapsedMs,
323
- pollCount,
324
- timedOut: true,
325
- };
321
+ pollCount += 1;
322
+ const run = await this.client.get(`${base}/get-run-for-trigger?${trigQuery}`);
323
+ const scenarioRun = run.scenarioRun;
324
+ if (scenarioRun) {
325
+ runId = scenarioRun.runId ?? runId;
326
+ const result = scenarioRun.result;
327
+ const finished = result?.outcome;
328
+ if (finished) {
329
+ outcome = finished;
330
+ break;
331
+ }
326
332
  }
327
333
  const nextDelayMs = computeNextPollDelayMs({
328
334
  pollCount,
329
335
  baseIntervalMs,
330
336
  adaptiveEnabled: adaptivePolling,
331
337
  });
332
- await new Promise((r) => setTimeout(r, Math.min(nextDelayMs, timeout - elapsedMs)));
338
+ const { promise, resolve, } = Promise.withResolvers();
339
+ setTimeout(resolve, Math.min(nextDelayMs, Math.max(1, timeout - (Date.now() - startedAt))));
340
+ await promise;
333
341
  }
342
+ const resolvedRunId = runId || triggerRunId;
343
+ let steps;
344
+ if (!timedOut && runId) {
345
+ try {
346
+ const details = await this.client.get(`${base}/${encodeURIComponent(runId)}/`);
347
+ const stepRuns = details.stepRuns ?? [];
348
+ const mapped = stepRuns.map((entry) => {
349
+ const stepDef = entry.step;
350
+ const stepResult = entry.result;
351
+ return {
352
+ name: stepDef?.name,
353
+ type: stepDef?.type,
354
+ outcome: stepResult?.outcome ?? "UNKNOWN",
355
+ };
356
+ });
357
+ if (mapped.length > 0)
358
+ steps = mapped;
359
+ }
360
+ catch {
361
+ // Best-effort diagnostics: never fail the wait because the run report is unavailable.
362
+ }
363
+ }
364
+ return {
365
+ scenarioId,
366
+ runId: resolvedRunId,
367
+ outcome,
368
+ success: outcome === "SUCCESS",
369
+ elapsedMs: Date.now() - startedAt,
370
+ pollCount,
371
+ ...(triggerRunId !== resolvedRunId ? { triggerRunId, } : {}),
372
+ ...(timedOut ? { timedOut: true, } : {}),
373
+ ...(steps ? { steps, } : {}),
374
+ };
334
375
  }
335
376
  /**
336
377
  * Run a one-off Python script in a throwaway custom-python scenario and return
@@ -1,7 +1,15 @@
1
+ import { UsageError, } from "../cli/usage.js";
1
2
  import { BaseResource, } from "./base.js";
2
3
  function isRecord(value) {
3
4
  return typeof value === "object" && value !== null && !Array.isArray(value);
4
5
  }
6
+ function validateWorksheetCreateRequest(body) {
7
+ const bodyRecord = isRecord(body) ? body : undefined;
8
+ const dataSpec = bodyRecord?.dataSpec;
9
+ if (!isRecord(dataSpec) || !isRecord(dataSpec.datasetSelection)) {
10
+ throw new UsageError("statistics.createWorksheet requires body.dataSpec.datasetSelection.", "validation_failed", "Include dataSpec.datasetSelection in the worksheet definition.", { requiredField: "dataSpec.datasetSelection", });
11
+ }
12
+ }
5
13
  export class StatisticsResource extends BaseResource {
6
14
  /** List statistics worksheets associated with a dataset. */
7
15
  async listWorksheets(datasetName, projectKey) {
@@ -13,6 +21,7 @@ export class StatisticsResource extends BaseResource {
13
21
  }
14
22
  /** Create a statistics worksheet for a dataset. */
15
23
  async createWorksheet(datasetName, body, projectKey) {
24
+ validateWorksheetCreateRequest(body);
16
25
  return this.client.post(this.worksheetsPath(datasetName, projectKey), body);
17
26
  }
18
27
  /** Replace a statistics worksheet definition. */
@@ -3,5 +3,5 @@
3
3
  * The types package (packages/types/) owns the TypeBox schema definitions.
4
4
  * SDK consumers get everything through this re-export.
5
5
  */
6
- export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
7
- export type { BuildMode, CodeEnvActionResult, CodeEnvCreateOptions, CodeEnvDetails, CodeEnvPackageList, CodeEnvSetPackagesOptions, CodeEnvSummary, CodeEnvUpdatePackagesOptions, CodeEnvUsage, CodeEnvWaitOptions, ConnectionSummary, DashboardDetails, DashboardSummary, DataQualityComputeResult, DataQualityProjectStatus, DataQualityRule, DataQualityRuleResult, DataQualityRules, DataQualityStatus, DataQualityStatusByPartition, DataQualityTimeline, DataQualityTimelineEntry, DatasetCreateOptions, DatasetDetails, DatasetSchema, DatasetSummary, FlowMapOptions, FlowZone, FlowZoneCreateOptions, FlowZoneItem, FlowZoneObjectType, FlowZonePosition, FlowZoneUpdateOptions, FolderCreateOptions, FolderDetails, FolderItem, FolderSummary, FutureState, FutureWaitResult, InsightDetails, InsightSummary, JobSummary, JobWaitResult, JupyterCell, JupyterNotebookContent, JupyterNotebookSummary, NotebookSession, ProjectDetails, ProjectMetadata, ProjectSummary, ProjectVariables, RecipeCreateOptions, RecipeCreateResult, RecipeDetails, RecipeSummary, SafeParseResult, ScenarioDetails, ScenarioStatus, ScenarioSummary, ScenarioWaitResult, SqlNotebookCell, SqlNotebookContent, SqlNotebookSummary, SqlQueryResponse, SqlQueryResult, SqlQuerySchema, WikiArticleData, WikiArticleMetadata, WikiSettings, WikiTaxonomyNode, } from "../packages/types/src/index.js";
6
+ export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioStepRunSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
7
+ export type { BuildMode, CodeEnvActionResult, CodeEnvCreateOptions, CodeEnvDetails, CodeEnvPackageList, CodeEnvSetPackagesOptions, CodeEnvSummary, CodeEnvUpdatePackagesOptions, CodeEnvUsage, CodeEnvWaitOptions, ConnectionSummary, DashboardDetails, DashboardSummary, DataQualityComputeResult, DataQualityProjectStatus, DataQualityRule, DataQualityRuleResult, DataQualityRules, DataQualityStatus, DataQualityStatusByPartition, DataQualityTimeline, DataQualityTimelineEntry, DatasetCreateOptions, DatasetDetails, DatasetSchema, DatasetSummary, FlowMapOptions, FlowZone, FlowZoneCreateOptions, FlowZoneItem, FlowZoneObjectType, FlowZonePosition, FlowZoneUpdateOptions, FolderCreateOptions, FolderDetails, FolderItem, FolderSummary, FutureState, FutureWaitResult, InsightDetails, InsightSummary, JobSummary, JobWaitResult, JupyterCell, JupyterNotebookContent, JupyterNotebookSummary, NotebookSession, ProjectDetails, ProjectMetadata, ProjectSummary, ProjectVariables, RecipeCreateOptions, RecipeCreateResult, RecipeDetails, RecipeSummary, SafeParseResult, ScenarioDetails, ScenarioStatus, ScenarioStepRun, ScenarioSummary, ScenarioWaitResult, SqlNotebookCell, SqlNotebookContent, SqlNotebookSummary, SqlQueryResponse, SqlQueryResult, SqlQuerySchema, WikiArticleData, WikiArticleMetadata, WikiSettings, WikiTaxonomyNode, } from "../packages/types/src/index.js";
@@ -3,4 +3,4 @@
3
3
  * The types package (packages/types/) owns the TypeBox schema definitions.
4
4
  * SDK consumers get everything through this re-export.
5
5
  */
6
- export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
6
+ export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioStepRunSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
package/dist/src/skill.js CHANGED
@@ -87,8 +87,8 @@ Mutations print a small JSON ack to stdout and exit 0 on success (e.g. \`{"updat
87
87
  - Pass code and SQL via \`--file\`/\`--sql-file\`, not inline: shells (especially PowerShell) mangle quotes, \`$\`, and newlines in multi-line snippets.
88
88
  - On a non-UTF-8 console (e.g. Windows cp1252), don't print non-ASCII results; write them to a UTF-8 file and read that, or use \`--output PATH\`.
89
89
  - Build failures: \`dss job log <id> --errors-only\` surfaces just error/traceback lines, and \`--output PATH\` saves the full log to a file. Logs are one long line with JVM noise; the \`Error in Python process: At line <N>\` marker maps \`<N>\` straight to your recipe payload's source line.
90
- - Schema changes aren't automatic: after changing a recipe's output columns run \`dss dataset refresh-schema\` (or rebuild) before downstream reads, and \`dss dataset validate-build\` to catch file-backed misconfig before launching a build.
91
- - \`dss dataset download\` is capped (default 100k rows) and returns \`{ path, rows, truncated, limit }\`: check \`truncated\` and raise \`--limit N\` when you need more — treat it as a sample, not a guaranteed full export. For very large tables, aggregate in SQL or read inside a recipe instead.
90
+ - Schema changes aren't automatic for code recipes: after changing a python/SQL/prepare recipe's output columns run \`dss dataset refresh-schema\` (or rebuild) before downstream reads, and \`dss dataset validate-build\` to catch file-backed misconfig before launching a build. Exception: \`dss recipe create --type sync\` copies the input schema onto a schemaless dataset output at create time (see \`syncOutputSchemaPropagated\` in the result), so a fresh sync output builds populated without a manual refresh.
91
+ - \`dss dataset download\` is capped (default 100k rows) and returns \`{ path, rows, truncated, limit }\`: check \`truncated\` and raise \`--limit N\` when you need more — treat it as a sample, not a guaranteed full export. Without \`--output\` the file lands in the current working directory (and a \`dataset_download_default_location\` warning names that path); pass \`--output PATH\` to control the destination. For very large tables, aggregate in SQL or read inside a recipe instead.
92
92
 
93
93
  ## Error envelope
94
94
 
@@ -4,7 +4,8 @@ export function sanitizeFileName(name, fallback) {
4
4
  const sanitized = name
5
5
  .replace(/[<>:"/\\|?*\u0000-\u001F]/g, "_")
6
6
  .replace(/[. ]+$/g, "")
7
- .trim();
7
+ .trim()
8
+ .replace(/^\.+/, "");
8
9
  if (!sanitized)
9
10
  return fallback;
10
11
  const dotIndex = sanitized.indexOf(".");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dataiku-sdk",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Dataiku DSS SDK and CLI for programmatic access to DSS REST APIs",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -160,6 +160,7 @@ export declare const RecipeCreateResultSchema: import("@sinclair/typebox").TObje
160
160
  outputFolder: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
161
161
  temporaryOutputDataset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
162
162
  temporaryOutputDatasetDeleted: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
163
+ syncOutputSchemaPropagated: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
163
164
  }>;
164
165
  export type RecipeCreateResult = Static<typeof RecipeCreateResultSchema>;
165
166
  export declare const JobSummarySchema: import("@sinclair/typebox").TObject<{
@@ -264,6 +265,12 @@ export declare const ScenarioStatusSchema: import("@sinclair/typebox").TObject<{
264
265
  }>>;
265
266
  }>;
266
267
  export type ScenarioStatus = Static<typeof ScenarioStatusSchema>;
268
+ export declare const ScenarioStepRunSchema: import("@sinclair/typebox").TObject<{
269
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
270
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
271
+ outcome: import("@sinclair/typebox").TString;
272
+ }>;
273
+ export type ScenarioStepRun = Static<typeof ScenarioStepRunSchema>;
267
274
  export declare const ScenarioWaitResultSchema: import("@sinclair/typebox").TObject<{
268
275
  scenarioId: import("@sinclair/typebox").TString;
269
276
  runId: import("@sinclair/typebox").TString;
@@ -272,6 +279,12 @@ export declare const ScenarioWaitResultSchema: import("@sinclair/typebox").TObje
272
279
  elapsedMs: import("@sinclair/typebox").TNumber;
273
280
  pollCount: import("@sinclair/typebox").TNumber;
274
281
  timedOut: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
282
+ triggerRunId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
283
+ steps: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
284
+ name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
285
+ type: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
286
+ outcome: import("@sinclair/typebox").TString;
287
+ }>>>;
275
288
  }>;
276
289
  export type ScenarioWaitResult = Static<typeof ScenarioWaitResultSchema>;
277
290
  export declare const FlowZoneObjectTypeSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"DATASET">, import("@sinclair/typebox").TLiteral<"MANAGED_FOLDER">, import("@sinclair/typebox").TLiteral<"SAVED_MODEL">, import("@sinclair/typebox").TLiteral<"RECIPE">, import("@sinclair/typebox").TLiteral<"MODEL_EVALUATION_STORE">, import("@sinclair/typebox").TLiteral<"STREAMING_ENDPOINT">, import("@sinclair/typebox").TLiteral<"LABELING_TASK">, import("@sinclair/typebox").TLiteral<"RETRIEVABLE_KNOWLEDGE">]>;
@@ -552,7 +565,7 @@ export declare const JupyterCellSchema: import("@sinclair/typebox").TObject<{
552
565
  source: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
553
566
  metadata: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
554
567
  outputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
555
- execution_count: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TNull]>>;
568
+ execution_count: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNull, import("@sinclair/typebox").TNumber]>>;
556
569
  }>;
557
570
  export type JupyterCell = Static<typeof JupyterCellSchema>;
558
571
  export declare const JupyterNotebookSummarySchema: import("@sinclair/typebox").TObject<{
@@ -575,7 +588,7 @@ export declare const JupyterNotebookContentSchema: import("@sinclair/typebox").T
575
588
  source: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
576
589
  metadata: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
577
590
  outputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
578
- execution_count: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TNull]>>;
591
+ execution_count: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNull, import("@sinclair/typebox").TNumber]>>;
579
592
  }>>;
580
593
  }>;
581
594
  export type JupyterNotebookContent = Static<typeof JupyterNotebookContentSchema>;
@@ -207,6 +207,7 @@ export const RecipeCreateResultSchema = Type.Object({
207
207
  outputFolder: Type.Optional(Type.String()),
208
208
  temporaryOutputDataset: Type.Optional(Type.String()),
209
209
  temporaryOutputDatasetDeleted: Type.Optional(Type.Boolean()),
210
+ syncOutputSchemaPropagated: Type.Optional(Type.Array(Type.String())),
210
211
  });
211
212
  // ---------------------------------------------------------------------------
212
213
  // Jobs
@@ -313,6 +314,11 @@ export const ScenarioStatusSchema = Type.Object({
313
314
  }, { additionalProperties: true, })),
314
315
  }, { additionalProperties: true, })),
315
316
  }, { additionalProperties: true, });
317
+ export const ScenarioStepRunSchema = Type.Object({
318
+ name: Type.Optional(Type.String()),
319
+ type: Type.Optional(Type.String()),
320
+ outcome: Type.String(),
321
+ }, { additionalProperties: false, });
316
322
  export const ScenarioWaitResultSchema = Type.Object({
317
323
  scenarioId: Type.String(),
318
324
  runId: Type.String(),
@@ -321,6 +327,8 @@ export const ScenarioWaitResultSchema = Type.Object({
321
327
  elapsedMs: Type.Number(),
322
328
  pollCount: Type.Number(),
323
329
  timedOut: Type.Optional(Type.Boolean()),
330
+ triggerRunId: Type.Optional(Type.String()),
331
+ steps: Type.Optional(Type.Array(ScenarioStepRunSchema)),
324
332
  });
325
333
  // ---------------------------------------------------------------------------
326
334
  // Flow zones
@@ -548,7 +556,7 @@ export const JupyterCellSchema = Type.Object({
548
556
  source: Type.Array(Type.String()),
549
557
  metadata: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
550
558
  outputs: Type.Optional(Type.Array(Type.Unknown())),
551
- execution_count: Type.Optional(Type.Union([Type.Number(), Type.Null(),])),
559
+ execution_count: Type.Optional(Type.Union([Type.Null(), Type.Number(),])),
552
560
  }, { additionalProperties: true, });
553
561
  export const JupyterNotebookSummarySchema = Type.Object({
554
562
  name: Type.String(),