dataiku-sdk 0.12.6 → 1.0.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.
- package/README.md +60 -14
- package/bin/dss.js +1 -1
- package/dist/packages/types/src/index.d.ts +128 -3
- package/dist/packages/types/src/index.js +106 -3
- package/dist/src/cli/coerce.d.ts +2 -1
- package/dist/src/cli/coerce.js +84 -26
- package/dist/src/cli/commands/app.js +6 -6
- package/dist/src/cli/commands/code.js +2 -2
- package/dist/src/cli/commands/dashboard.js +102 -13
- package/dist/src/cli/commands/data-quality.js +8 -8
- package/dist/src/cli/commands/dataset.js +11 -7
- package/dist/src/cli/commands/folder.js +5 -4
- package/dist/src/cli/commands/future.js +2 -2
- package/dist/src/cli/commands/index.js +2 -0
- package/dist/src/cli/commands/job.js +11 -11
- package/dist/src/cli/commands/notebook.js +1 -1
- package/dist/src/cli/commands/project-git.d.ts +2 -0
- package/dist/src/cli/commands/project-git.js +563 -0
- package/dist/src/cli/commands/project.js +2 -2
- package/dist/src/cli/commands/recipe.js +14 -17
- package/dist/src/cli/commands/scenario.js +4 -4
- package/dist/src/cli/contract.d.ts +5 -4
- package/dist/src/cli/contract.js +432 -62
- package/dist/src/cli/doctor.js +6 -6
- package/dist/src/cli/flags.js +25 -2
- package/dist/src/cli/helpers/dataset.js +1 -1
- package/dist/src/cli/output.d.ts +2 -1
- package/dist/src/cli/output.js +2 -6
- package/dist/src/cli/usage.d.ts +1 -1
- package/dist/src/cli/usage.js +2 -1
- package/dist/src/cli/version.d.ts +2 -2
- package/dist/src/cli/version.js +2 -2
- package/dist/src/cli.js +43 -26
- package/dist/src/client.d.ts +4 -0
- package/dist/src/client.js +12 -0
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.js +2 -1
- package/dist/src/resources/connections.d.ts +3 -1
- package/dist/src/resources/connections.js +82 -21
- package/dist/src/resources/dashboards.d.ts +14 -0
- package/dist/src/resources/dashboards.js +156 -4
- package/dist/src/resources/datasets.js +42 -2
- package/dist/src/resources/folders.js +7 -3
- package/dist/src/resources/project-git.d.ts +154 -0
- package/dist/src/resources/project-git.js +427 -0
- package/dist/src/resources/recipes.js +4 -4
- package/dist/src/schemas.d.ts +2 -2
- package/dist/src/schemas.js +1 -1
- package/dist/src/skill.js +9 -211
- package/package.json +7 -4
- package/packages/types/dist/index.d.ts +128 -3
- package/packages/types/dist/index.js +106 -3
- package/plugin.json +15 -0
- package/skills/dataiku-dss/SKILL.md +220 -0
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { ClientValidationError, DataikuError, } from "../errors.js";
|
|
2
|
+
import { ProjectGitActionResultSchema, ProjectGitDiffResultSchema, ProjectGitFutureResponseSchema, ProjectGitFutureStateSchema, ProjectGitLibrariesSchema, ProjectGitLogResultSchema, ProjectGitRemoteSchema, ProjectGitStatusSchema, ProjectGitTagsSchema, } from "../schemas.js";
|
|
3
|
+
import { BaseResource, } from "./base.js";
|
|
4
|
+
/**
|
|
5
|
+
* The per-project Git routes exist only under the dataikuapi base, not under
|
|
6
|
+
* the documented `/public/api` REST prefix used by the rest of this SDK, so
|
|
7
|
+
* this family carries its own mount point.
|
|
8
|
+
*/
|
|
9
|
+
const GIT_API_BASE = "/dip/publicapi";
|
|
10
|
+
const DEFAULT_REMOTE = "origin";
|
|
11
|
+
const DEFAULT_LOG_COUNT = 1_000;
|
|
12
|
+
const DEFAULT_TAG_REFERENCE = "HEAD";
|
|
13
|
+
const DEFAULT_POLL_INTERVAL_MS = 2_000;
|
|
14
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
15
|
+
function sleep(ms) {
|
|
16
|
+
const { promise, resolve, } = Promise.withResolvers();
|
|
17
|
+
setTimeout(resolve, ms);
|
|
18
|
+
return promise;
|
|
19
|
+
}
|
|
20
|
+
function encodePathSegments(path) {
|
|
21
|
+
const normalized = path.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
22
|
+
if (!normalized)
|
|
23
|
+
throw new ClientValidationError("A Git reference path is required.");
|
|
24
|
+
return normalized
|
|
25
|
+
.split("/")
|
|
26
|
+
.map((segment) => encodeURIComponent(segment))
|
|
27
|
+
.join("/");
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reject `https://user:token@host/repo` before it reaches DSS: an embedded
|
|
31
|
+
* secret would be stored in the project's Git configuration and echoed back by
|
|
32
|
+
* later reads. SSH and scp-style remotes (`git@host:org/repo.git`) are the
|
|
33
|
+
* documented way to authenticate and stay allowed.
|
|
34
|
+
*/
|
|
35
|
+
function validatedRepository(repository, field) {
|
|
36
|
+
const candidate = repository.trim();
|
|
37
|
+
if (candidate === "")
|
|
38
|
+
throw new ClientValidationError(`${field} is required.`);
|
|
39
|
+
if (/[\u0000-\u001f\u007f]/u.test(candidate)) {
|
|
40
|
+
throw new ClientValidationError(`${field} must not contain control characters.`);
|
|
41
|
+
}
|
|
42
|
+
if (/^https?:/i.test(candidate)) {
|
|
43
|
+
if (candidate.includes("\\")) {
|
|
44
|
+
throw new ClientValidationError(`${field} must be a valid HTTP(S) URL.`);
|
|
45
|
+
}
|
|
46
|
+
if (!/^https?:\/\//i.test(candidate)) {
|
|
47
|
+
throw new ClientValidationError(`${field} must be a valid HTTP(S) URL.`);
|
|
48
|
+
}
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = new URL(candidate);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
throw new ClientValidationError(`${field} must be a valid HTTP(S) URL.`);
|
|
55
|
+
}
|
|
56
|
+
if (parsed.username !== "" || parsed.password !== "") {
|
|
57
|
+
throw new ClientValidationError(`${field} must not embed credentials (user:password@host). `
|
|
58
|
+
+ "Use an SSH remote or configure the Git credentials in DSS instead.");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return candidate;
|
|
62
|
+
}
|
|
63
|
+
/** Replace every exact occurrence of a secret so echoed errors cannot leak it. */
|
|
64
|
+
function redactSecrets(text, secrets) {
|
|
65
|
+
let result = text;
|
|
66
|
+
for (const secret of secrets) {
|
|
67
|
+
if (secret !== undefined && secret !== "") {
|
|
68
|
+
result = result.split(secret).join("[redacted]");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Strip a password that a server misconfiguration may have echoed from an
|
|
75
|
+
* error response. `DataikuError.message` was built at construction, so the
|
|
76
|
+
* raw body, the message, and the stack all need scrubbing.
|
|
77
|
+
*/
|
|
78
|
+
function scrubErrorSecrets(error, secrets) {
|
|
79
|
+
if (!(error instanceof DataikuError) || secrets.length === 0)
|
|
80
|
+
return;
|
|
81
|
+
error.body = redactSecrets(error.body, secrets);
|
|
82
|
+
error.message = redactSecrets(error.message, secrets);
|
|
83
|
+
if (typeof error.stack === "string") {
|
|
84
|
+
error.stack = redactSecrets(error.stack, secrets);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function describeFutureFailure(error) {
|
|
88
|
+
if (error === undefined || error === null)
|
|
89
|
+
return undefined;
|
|
90
|
+
if (typeof error === "string")
|
|
91
|
+
return error.trim() === "" ? undefined : error;
|
|
92
|
+
if (typeof error === "object") {
|
|
93
|
+
const record = error;
|
|
94
|
+
for (const key of ["detailedMessage", "message", "errorType",]) {
|
|
95
|
+
const value = record[key];
|
|
96
|
+
if (typeof value === "string" && value.trim() !== "")
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
return JSON.stringify(error);
|
|
100
|
+
}
|
|
101
|
+
return String(error);
|
|
102
|
+
}
|
|
103
|
+
/* ------------------------------------------------------------------ */
|
|
104
|
+
/* Resource */
|
|
105
|
+
/* ------------------------------------------------------------------ */
|
|
106
|
+
export class ProjectGitResource extends BaseResource {
|
|
107
|
+
/* ---- status & remotes ---- */
|
|
108
|
+
/** Working-copy status: current branch, remotes, tracking counts, changes. */
|
|
109
|
+
async status(projectKey) {
|
|
110
|
+
const raw = await this.request("GET", `${this.gitPath(projectKey)}/status`);
|
|
111
|
+
return this.client.safeParse(ProjectGitStatusSchema, raw ?? {}, "projectGit.status");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Read a Git remote. DSS answers `{}` when the remote is not configured.
|
|
115
|
+
* The remote name defaults to `origin` like the Python client.
|
|
116
|
+
*/
|
|
117
|
+
async getRemote(projectKey, name = DEFAULT_REMOTE) {
|
|
118
|
+
const raw = await this.request("GET", `${this.gitPath(projectKey)}/remotes/${encodeURIComponent(name)}`);
|
|
119
|
+
return this.client.safeParse(ProjectGitRemoteSchema, raw ?? {}, "projectGit.getRemote");
|
|
120
|
+
}
|
|
121
|
+
/** Create or replace a Git remote. */
|
|
122
|
+
async setRemote(projectKey, options) {
|
|
123
|
+
const repository = validatedRepository(options.url, "Git remote URL");
|
|
124
|
+
const raw = await this.request("POST", `${this.gitPath(projectKey)}/remotes/${encodeURIComponent(options.name ?? DEFAULT_REMOTE)}`, { url: repository, });
|
|
125
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.setRemote");
|
|
126
|
+
}
|
|
127
|
+
/** Delete a Git remote. */
|
|
128
|
+
async removeRemote(projectKey, name = DEFAULT_REMOTE) {
|
|
129
|
+
await this.request("DELETE", `${this.gitPath(projectKey)}/remotes/${encodeURIComponent(name)}`);
|
|
130
|
+
}
|
|
131
|
+
/* ---- branches ---- */
|
|
132
|
+
/** Plain list of branch names, local by default. */
|
|
133
|
+
async listBranches(projectKey, remote = false) {
|
|
134
|
+
const raw = await this.request("GET", `${this.gitPath(projectKey)}/branches${this.query({ remote, })}`);
|
|
135
|
+
return (raw ?? []);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create a branch and switch to it. With `duplicateProject`, DSS creates a
|
|
139
|
+
* duplicate project for the branch instead of moving this one.
|
|
140
|
+
*/
|
|
141
|
+
async createBranch(projectKey, name, options = {}) {
|
|
142
|
+
// DSS consumes the full key set, so absent values travel as nulls.
|
|
143
|
+
const raw = await this.request("POST", `${this.gitPath(projectKey)}/branches/`, {
|
|
144
|
+
name,
|
|
145
|
+
commit: options.commit ?? null,
|
|
146
|
+
duplicateProject: options.duplicateProject ?? false,
|
|
147
|
+
targetProjectKey: options.targetProjectKey ?? null,
|
|
148
|
+
targetProjectFolderId: options.targetProjectFolderId ?? null,
|
|
149
|
+
});
|
|
150
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.createBranch");
|
|
151
|
+
}
|
|
152
|
+
/** Delete a branch locally and, with `deleteRemotely`, on the remote too. */
|
|
153
|
+
async deleteBranch(projectKey, name, options = {}) {
|
|
154
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/deleteBranch`, {
|
|
155
|
+
name,
|
|
156
|
+
remote: options.remote ?? false,
|
|
157
|
+
deleteRemotely: options.deleteRemotely ?? false,
|
|
158
|
+
forceDelete: options.forceDelete ?? false,
|
|
159
|
+
});
|
|
160
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.deleteBranch");
|
|
161
|
+
}
|
|
162
|
+
/** Current branch name, or null when DSS reports none. */
|
|
163
|
+
async currentBranch(projectKey) {
|
|
164
|
+
const raw = await this.request("GET", `${this.gitPath(projectKey)}/current-branch`);
|
|
165
|
+
const name = raw?.name;
|
|
166
|
+
return typeof name === "string" && name !== "" ? name : null;
|
|
167
|
+
}
|
|
168
|
+
/** Switch the project to another branch. */
|
|
169
|
+
async switchBranch(projectKey, branchName) {
|
|
170
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/switchBranch${this.query({ branchName, })}`);
|
|
171
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.switchBranch");
|
|
172
|
+
}
|
|
173
|
+
/* ---- tags ---- */
|
|
174
|
+
async listTags(projectKey) {
|
|
175
|
+
const raw = await this.request("GET", `${this.gitPath(projectKey)}/tags`);
|
|
176
|
+
return this.client.safeParse(ProjectGitTagsSchema, raw ?? [], "projectGit.listTags");
|
|
177
|
+
}
|
|
178
|
+
async createTag(projectKey, name, options = {}) {
|
|
179
|
+
const raw = await this.request("POST", `${this.gitPath(projectKey)}/tags/`, {
|
|
180
|
+
name,
|
|
181
|
+
reference: options.reference ?? DEFAULT_TAG_REFERENCE,
|
|
182
|
+
message: options.message ?? "",
|
|
183
|
+
});
|
|
184
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.createTag");
|
|
185
|
+
}
|
|
186
|
+
async deleteTag(projectKey, name) {
|
|
187
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/deleteTag`, {
|
|
188
|
+
name,
|
|
189
|
+
});
|
|
190
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.deleteTag");
|
|
191
|
+
}
|
|
192
|
+
/* ---- synchronous Git actions ---- */
|
|
193
|
+
/** Fetch from the remote. Failures arrive as `{success: false}` with HTTP 200. */
|
|
194
|
+
async fetch(projectKey) {
|
|
195
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/fetch`);
|
|
196
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.fetch");
|
|
197
|
+
}
|
|
198
|
+
/** Pull. DSS only ever exposes a rebase pull; there is no merge variant. */
|
|
199
|
+
async pull(projectKey, options = {}) {
|
|
200
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/pullRebase${this.query({ branchName: options.branchName, })}`);
|
|
201
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.pull");
|
|
202
|
+
}
|
|
203
|
+
async push(projectKey, options = {}) {
|
|
204
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/push${this.query({ branchName: options.branchName, })}`);
|
|
205
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.push");
|
|
206
|
+
}
|
|
207
|
+
/** Commit log page. Paginate by passing the previous `nextCommit` as `startCommit`. */
|
|
208
|
+
async log(projectKey, options = {}) {
|
|
209
|
+
const raw = await this.request("GET", `${this.actionPath(projectKey)}/log${this.query({
|
|
210
|
+
path: options.path,
|
|
211
|
+
startCommit: options.startCommit,
|
|
212
|
+
count: options.count ?? DEFAULT_LOG_COUNT,
|
|
213
|
+
})}`);
|
|
214
|
+
return this.client.safeParse(ProjectGitLogResultSchema, raw ?? { entries: [], }, "projectGit.log");
|
|
215
|
+
}
|
|
216
|
+
async diff(projectKey, options = {}) {
|
|
217
|
+
const raw = await this.request("GET", `${this.actionPath(projectKey)}/diff${this.query({ commitFrom: options.commitFrom, commitTo: options.commitTo, })}`);
|
|
218
|
+
return this.client.safeParse(ProjectGitDiffResultSchema, raw ?? {}, "projectGit.diff");
|
|
219
|
+
}
|
|
220
|
+
/** Commit the project. DSS stages untracked files before committing. */
|
|
221
|
+
async commit(projectKey, options) {
|
|
222
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/commit`, {
|
|
223
|
+
message: options.message,
|
|
224
|
+
});
|
|
225
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.commit");
|
|
226
|
+
}
|
|
227
|
+
/** Restore the project to the state of a past commit. */
|
|
228
|
+
async revertToRevision(projectKey, commit) {
|
|
229
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/revertToRevision${this.query({ commit, })}`);
|
|
230
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.revertToRevision");
|
|
231
|
+
}
|
|
232
|
+
/** Revert one commit, keeping later history. */
|
|
233
|
+
async revertCommit(projectKey, commit) {
|
|
234
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/revertCommit${this.query({ commit, })}`);
|
|
235
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.revertCommit");
|
|
236
|
+
}
|
|
237
|
+
/** Hard reset to local HEAD, dropping uncommitted changes. */
|
|
238
|
+
async resetToHead(projectKey) {
|
|
239
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/resetToLocalHeadState`);
|
|
240
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.resetToHead");
|
|
241
|
+
}
|
|
242
|
+
/** Hard reset to the tracked upstream branch, dropping local commits. */
|
|
243
|
+
async resetToUpstream(projectKey) {
|
|
244
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/resetToRemoteHeadState`);
|
|
245
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.resetToUpstream");
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Wipe the project's entire Git history and rebuild a fresh repository.
|
|
249
|
+
* Irreversible, so nothing is sent unless the caller acknowledges it.
|
|
250
|
+
*/
|
|
251
|
+
async dropAndRebuild(projectKey, options = {}) {
|
|
252
|
+
if (options.confirmed !== true) {
|
|
253
|
+
throw new ClientValidationError("projectGit.dropAndRebuild permanently destroys the project's Git history. "
|
|
254
|
+
+ "Pass { confirmed: true } to acknowledge before calling it.");
|
|
255
|
+
}
|
|
256
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/dropAndRebuild${this.query({ iKnowWhatIAmDoing: true, })}`);
|
|
257
|
+
return this.client.safeParse(ProjectGitActionResultSchema, raw ?? {}, "projectGit.dropAndRebuild");
|
|
258
|
+
}
|
|
259
|
+
/* ---- external libraries (async futures) ---- */
|
|
260
|
+
async listLibraries(projectKey) {
|
|
261
|
+
const raw = await this.request("GET", `${this.libraryPath(projectKey)}/`);
|
|
262
|
+
return this.client.safeParse(ProjectGitLibrariesSchema, raw ?? [], "projectGit.listLibraries");
|
|
263
|
+
}
|
|
264
|
+
/** Attach an external Git library. Runs as a DSS future. */
|
|
265
|
+
async addLibrary(projectKey, options) {
|
|
266
|
+
const repository = validatedRepository(options.repository, "Git library repository URL");
|
|
267
|
+
const secrets = [options.password,].filter((secret) => secret !== undefined && secret !== "");
|
|
268
|
+
const raw = await this.request("POST", `${this.libraryPath(projectKey)}/`, {
|
|
269
|
+
repository,
|
|
270
|
+
login: options.login ?? null,
|
|
271
|
+
password: options.password ?? null,
|
|
272
|
+
pathInGitRepository: options.pathInGitRepository ?? "",
|
|
273
|
+
localTargetPath: options.localTargetPath,
|
|
274
|
+
checkout: options.checkout,
|
|
275
|
+
addToPythonPath: options.addToPythonPath ?? true,
|
|
276
|
+
}, secrets);
|
|
277
|
+
return this.client.safeParse(ProjectGitFutureResponseSchema, raw ?? {}, "projectGit.addLibrary");
|
|
278
|
+
}
|
|
279
|
+
/** Update an attached library's repository, sub-path, or checkout. */
|
|
280
|
+
async setLibrary(projectKey, gitReferencePath, options) {
|
|
281
|
+
const repository = validatedRepository(options.repository, "Git library repository URL");
|
|
282
|
+
const secrets = [options.password,].filter((secret) => secret !== undefined && secret !== "");
|
|
283
|
+
const raw = await this.request("PUT", `${this.libraryPath(projectKey)}/${encodePathSegments(gitReferencePath)}`, {
|
|
284
|
+
repository,
|
|
285
|
+
login: options.login ?? null,
|
|
286
|
+
password: options.password ?? null,
|
|
287
|
+
pathInGitRepository: options.pathInGitRepository ?? "",
|
|
288
|
+
checkout: options.checkout,
|
|
289
|
+
}, secrets);
|
|
290
|
+
return raw;
|
|
291
|
+
}
|
|
292
|
+
/** Detach a library, optionally deleting its local directory. */
|
|
293
|
+
async removeLibrary(projectKey, gitReferencePath, deleteDirectory = false) {
|
|
294
|
+
await this.request("DELETE", `${this.libraryPath(projectKey)}/${encodePathSegments(gitReferencePath)}${this.query({ deleteDirectory, })}`);
|
|
295
|
+
}
|
|
296
|
+
/** Reset one library to its remote state. Runs as a DSS future. */
|
|
297
|
+
async resetLibrary(projectKey, gitReferencePath) {
|
|
298
|
+
const raw = await this.request("POST", `${this.libraryPath(projectKey)}/action/reset`, {
|
|
299
|
+
gitRef: gitReferencePath,
|
|
300
|
+
});
|
|
301
|
+
return this.client.safeParse(ProjectGitFutureResponseSchema, raw ?? {}, "projectGit.resetLibrary");
|
|
302
|
+
}
|
|
303
|
+
/** Commit and push one library. Runs as a DSS future. */
|
|
304
|
+
async pushLibrary(projectKey, gitReferencePath, commitMessage) {
|
|
305
|
+
const raw = await this.request("POST", `${this.libraryPath(projectKey)}/action/push`, {
|
|
306
|
+
gitRef: gitReferencePath,
|
|
307
|
+
commitMessage,
|
|
308
|
+
});
|
|
309
|
+
return this.client.safeParse(ProjectGitFutureResponseSchema, raw ?? {}, "projectGit.pushLibrary");
|
|
310
|
+
}
|
|
311
|
+
/** Commit and push every attached library. Runs as a DSS future. */
|
|
312
|
+
async pushAllLibraries(projectKey, commitMessage) {
|
|
313
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/git-refs/push-all`, { commitMessage, });
|
|
314
|
+
return this.client.safeParse(ProjectGitFutureResponseSchema, raw ?? {}, "projectGit.pushAllLibraries");
|
|
315
|
+
}
|
|
316
|
+
/** Reset every attached library to its remote state. Runs as a DSS future. */
|
|
317
|
+
async resetAllLibraries(projectKey) {
|
|
318
|
+
const raw = await this.request("POST", `${this.actionPath(projectKey)}/git-refs/reset-all`);
|
|
319
|
+
return this.client.safeParse(ProjectGitFutureResponseSchema, raw ?? {}, "projectGit.resetAllLibraries");
|
|
320
|
+
}
|
|
321
|
+
/* ---- futures ---- */
|
|
322
|
+
/**
|
|
323
|
+
* Read a future's state. `peek` leaves the future's log unconsumed, which is
|
|
324
|
+
* what polling loops want; the default consumes it like the Python client.
|
|
325
|
+
*/
|
|
326
|
+
async getFutureState(jobId, options = {}) {
|
|
327
|
+
const raw = await this.request("GET", `/futures/${encodeURIComponent(jobId)}${this.query({ peek: options.peek === true, })}`);
|
|
328
|
+
return this.client.safeParse(ProjectGitFutureStateSchema, raw ?? {}, "projectGit.getFutureState");
|
|
329
|
+
}
|
|
330
|
+
/** Abort a running future. */
|
|
331
|
+
async abortFuture(jobId) {
|
|
332
|
+
await this.request("DELETE", `/futures/${encodeURIComponent(jobId)}`);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Poll until the future carries a result and return that result. Throws on
|
|
336
|
+
* an aborted or failed future and on an exhausted budget, so a caller never
|
|
337
|
+
* mistakes an unfinished future for a successful one.
|
|
338
|
+
*/
|
|
339
|
+
async waitForFuture(jobId, options = {}) {
|
|
340
|
+
const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
341
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
342
|
+
if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {
|
|
343
|
+
throw new ClientValidationError("pollIntervalMs must be a finite positive number.");
|
|
344
|
+
}
|
|
345
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {
|
|
346
|
+
throw new ClientValidationError("timeoutMs must be a finite non-negative number.");
|
|
347
|
+
}
|
|
348
|
+
const startedAt = Date.now();
|
|
349
|
+
while (true) {
|
|
350
|
+
// Unlike peek state, the ordinary state includes the completed result.
|
|
351
|
+
const state = await this.getFutureState(jobId, { peek: false, });
|
|
352
|
+
const failure = describeFutureFailure(state.error);
|
|
353
|
+
if (failure !== undefined) {
|
|
354
|
+
throw new Error(`Dataiku future ${jobId} failed: ${failure}`);
|
|
355
|
+
}
|
|
356
|
+
if (state.aborted === true) {
|
|
357
|
+
throw new Error(`Dataiku future ${jobId} was aborted`);
|
|
358
|
+
}
|
|
359
|
+
if (state.hasResult === true)
|
|
360
|
+
return state.result;
|
|
361
|
+
if (state.unknown === true) {
|
|
362
|
+
throw new Error(`Dataiku future ${jobId} is unknown to the server`);
|
|
363
|
+
}
|
|
364
|
+
if (state.alive === false) {
|
|
365
|
+
throw new Error(`Dataiku future ${jobId} ended without producing a result`);
|
|
366
|
+
}
|
|
367
|
+
// Only the remaining budget is slept, so a caller's deadline is never
|
|
368
|
+
// overshot by a whole poll interval.
|
|
369
|
+
const elapsedMs = Date.now() - startedAt;
|
|
370
|
+
if (elapsedMs >= timeoutMs) {
|
|
371
|
+
throw new Error(`Timed out after ${String(elapsedMs)}ms waiting for Dataiku future ${jobId}`);
|
|
372
|
+
}
|
|
373
|
+
await sleep(Math.min(pollIntervalMs, timeoutMs - elapsedMs));
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/* ---- private ---- */
|
|
377
|
+
gitPath(projectKey) {
|
|
378
|
+
return `/projects/${this.enc(projectKey)}/git`;
|
|
379
|
+
}
|
|
380
|
+
actionPath(projectKey) {
|
|
381
|
+
return `${this.gitPath(projectKey)}/actions`;
|
|
382
|
+
}
|
|
383
|
+
libraryPath(projectKey) {
|
|
384
|
+
return `${this.gitPath(projectKey)}/lib-git-refs`;
|
|
385
|
+
}
|
|
386
|
+
query(params) {
|
|
387
|
+
const search = new URLSearchParams();
|
|
388
|
+
for (const [key, value,] of Object.entries(params)) {
|
|
389
|
+
if (value === undefined)
|
|
390
|
+
continue;
|
|
391
|
+
search.set(key, String(value));
|
|
392
|
+
}
|
|
393
|
+
const queryString = search.toString();
|
|
394
|
+
return queryString === "" ? "" : `?${queryString}`;
|
|
395
|
+
}
|
|
396
|
+
async request(method, path, body, secrets = []) {
|
|
397
|
+
const transport = this.client;
|
|
398
|
+
const init = {
|
|
399
|
+
method,
|
|
400
|
+
headers: {
|
|
401
|
+
// The Git routes are only reachable with dataikuapi-style Basic auth:
|
|
402
|
+
// API key as the username, empty password.
|
|
403
|
+
Authorization: `Basic ${Buffer.from(`${transport.apiKey}:`, "utf8").toString("base64")}`,
|
|
404
|
+
Accept: "application/json",
|
|
405
|
+
"Content-Type": "application/json",
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
if (body !== undefined)
|
|
409
|
+
init.body = JSON.stringify(body);
|
|
410
|
+
try {
|
|
411
|
+
const res = await transport.fetchWithRetry(`${transport.baseUrl}${GIT_API_BASE}${path}`, init);
|
|
412
|
+
const text = await res.text();
|
|
413
|
+
if (text.trim() === "")
|
|
414
|
+
return undefined;
|
|
415
|
+
try {
|
|
416
|
+
return JSON.parse(text);
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
throw new Error(`Dataiku Git API returned a non-JSON response for ${method} ${path}`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
scrubErrorSecrets(error, secrets);
|
|
424
|
+
throw error;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
@@ -502,10 +502,10 @@ export class RecipesResource extends BaseResource {
|
|
|
502
502
|
const requestedOutputDataset = asString(opts.outputDataset);
|
|
503
503
|
let inputs = asRecord(opts.inputs);
|
|
504
504
|
let outputs = asRecord(opts.outputs);
|
|
505
|
-
if (!inputs
|
|
505
|
+
if (!inputs) {
|
|
506
506
|
inputs = {
|
|
507
507
|
main: {
|
|
508
|
-
items: inputDatasets
|
|
508
|
+
items: inputDatasets?.map((ref) => ({ ref, deps: [], })) ?? [],
|
|
509
509
|
},
|
|
510
510
|
};
|
|
511
511
|
}
|
|
@@ -525,8 +525,8 @@ export class RecipesResource extends BaseResource {
|
|
|
525
525
|
},
|
|
526
526
|
};
|
|
527
527
|
}
|
|
528
|
-
if (!type || !name || !
|
|
529
|
-
throw new Error("type and
|
|
528
|
+
if (!type || !name || !outputs) {
|
|
529
|
+
throw new Error("type and outputDataset/outputFolder or (name + outputs) are required for create.");
|
|
530
530
|
}
|
|
531
531
|
const joinCols = typeof opts.joinOn === "string" ? [opts.joinOn,] : asStringArray(opts.joinOn);
|
|
532
532
|
const joinKeys = type === "join" && joinCols?.length
|
package/dist/src/schemas.d.ts
CHANGED
|
@@ -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, 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";
|
|
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, ProjectGitActionResultSchema, ProjectGitDiffResultSchema, ProjectGitFutureResponseSchema, ProjectGitFutureStateSchema, ProjectGitLibrariesSchema, ProjectGitLibrarySchema, ProjectGitLogResultSchema, ProjectGitRemoteSchema, ProjectGitStatusSchema, ProjectGitTagSchema, ProjectGitTagsSchema, 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, ProjectGitActionResult, ProjectGitDiffResult, ProjectGitFutureResponse, ProjectGitFutureState, ProjectGitLibraries, ProjectGitLibrary, ProjectGitLogResult, ProjectGitRemote, ProjectGitStatus, ProjectGitTag, ProjectGitTags, 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";
|
package/dist/src/schemas.js
CHANGED
|
@@ -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, ScenarioStepRunSchema, 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, ProjectGitActionResultSchema, ProjectGitDiffResultSchema, ProjectGitFutureResponseSchema, ProjectGitFutureStateSchema, ProjectGitLibrariesSchema, ProjectGitLibrarySchema, ProjectGitLogResultSchema, ProjectGitRemoteSchema, ProjectGitStatusSchema, ProjectGitTagSchema, ProjectGitTagsSchema, 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";
|