@dharta/cli 0.6.77 → 0.6.78
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/LICENSE +1 -1
- package/README.md +215 -11
- package/dist/agent.js +3 -2
- package/dist/agent.js.map +1 -1
- package/dist/api-error.js +6 -6
- package/dist/api-error.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +860 -149
- package/dist/cli.js.map +1 -1
- package/dist/command-tree.d.ts +3 -0
- package/dist/command-tree.js +10 -0
- package/dist/command-tree.js.map +1 -0
- package/dist/commands/agents.d.ts +54 -17
- package/dist/commands/agents.js +246 -136
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/analytics.js +6 -5
- package/dist/commands/analytics.js.map +1 -1
- package/dist/commands/api.js +71 -86
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/appearance.js +5 -6
- package/dist/commands/appearance.js.map +1 -1
- package/dist/commands/artifact.js +7 -6
- package/dist/commands/artifact.js.map +1 -1
- package/dist/commands/audit-log.js +2 -1
- package/dist/commands/audit-log.js.map +1 -1
- package/dist/commands/auth.js +26 -6
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/caps.js +11 -15
- package/dist/commands/caps.js.map +1 -1
- package/dist/commands/deploy.js +25 -10
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +10 -1
- package/dist/commands/dev.js +56 -25
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +60 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/embed-keys.js +4 -13
- package/dist/commands/embed-keys.js.map +1 -1
- package/dist/commands/env.js +4 -7
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/files.js +3 -4
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/fleet.d.ts +129 -0
- package/dist/commands/fleet.js +408 -0
- package/dist/commands/fleet.js.map +1 -0
- package/dist/commands/genui.d.ts +2 -0
- package/dist/commands/genui.js +53 -0
- package/dist/commands/genui.js.map +1 -0
- package/dist/commands/git-credential.js +2 -3
- package/dist/commands/git-credential.js.map +1 -1
- package/dist/commands/kartas.d.ts +9 -0
- package/dist/commands/kartas.js +33 -11
- package/dist/commands/kartas.js.map +1 -1
- package/dist/commands/keys.d.ts +17 -18
- package/dist/commands/keys.js +108 -19
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/login.js +2 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/members.d.ts +10 -0
- package/dist/commands/members.js +20 -6
- package/dist/commands/members.js.map +1 -1
- package/dist/commands/model-connections.d.ts +44 -0
- package/dist/commands/model-connections.js +435 -0
- package/dist/commands/model-connections.js.map +1 -0
- package/dist/commands/open.d.ts +2 -2
- package/dist/commands/open.js +4 -3
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/org.d.ts +9 -0
- package/dist/commands/org.js +42 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/organization.d.ts +16 -0
- package/dist/commands/organization.js +118 -0
- package/dist/commands/organization.js.map +1 -0
- package/dist/commands/parity.js +1 -3
- package/dist/commands/parity.js.map +1 -1
- package/dist/commands/repos.d.ts +4 -0
- package/dist/commands/repos.js +17 -0
- package/dist/commands/repos.js.map +1 -0
- package/dist/commands/rollback.js +2 -3
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/schedules.js +26 -21
- package/dist/commands/schedules.js.map +1 -1
- package/dist/commands/scopes.js +8 -1
- package/dist/commands/scopes.js.map +1 -1
- package/dist/commands/sessions.js +9 -3
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/setup.js +5 -4
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.js +24 -11
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/webhooks.d.ts +4 -1
- package/dist/commands/webhooks.js +21 -16
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/completions.js +24 -13
- package/dist/completions.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.js +121 -7
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.js +23 -7
- package/dist/context.js.map +1 -1
- package/dist/docs/cli-reference.d.ts +2 -0
- package/dist/docs/cli-reference.js +191 -0
- package/dist/docs/cli-reference.js.map +1 -0
- package/dist/exit-codes.d.ts +25 -0
- package/dist/exit-codes.js +107 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/genui.d.ts +178 -0
- package/dist/genui.js +1130 -0
- package/dist/genui.js.map +1 -0
- package/dist/harnesses.js +2 -1
- package/dist/harnesses.js.map +1 -1
- package/dist/jq.d.ts +4 -0
- package/dist/jq.js +91 -0
- package/dist/jq.js.map +1 -0
- package/dist/login-offer.js +6 -2
- package/dist/login-offer.js.map +1 -1
- package/dist/manifest.d.ts +12 -0
- package/dist/manifest.js +126 -0
- package/dist/manifest.js.map +1 -1
- package/dist/model-auth.d.ts +29 -0
- package/dist/model-auth.js +117 -0
- package/dist/model-auth.js.map +1 -0
- package/dist/model-settings.d.ts +23 -0
- package/dist/model-settings.js +186 -0
- package/dist/model-settings.js.map +1 -0
- package/dist/money.js +2 -1
- package/dist/money.js.map +1 -1
- package/dist/output.d.ts +6 -0
- package/dist/output.js +54 -0
- package/dist/output.js.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +1 -1
- package/dist/scaffold.js +2 -1
- package/dist/scaffold.js.map +1 -1
- package/dist/validators.js +17 -11
- package/dist/validators.js.map +1 -1
- package/dist/version-check.d.ts +1 -1
- package/dist/version-check.js +1 -1
- package/dist/version-check.js.map +1 -1
- package/node_modules/@dharta/contracts/LICENSE +21 -0
- package/node_modules/@dharta/contracts/README.md +45 -0
- package/node_modules/@dharta/contracts/artifact-runtime.json +750 -0
- package/node_modules/@dharta/contracts/dist/activity.d.ts +62 -0
- package/node_modules/@dharta/contracts/dist/activity.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/activity.js +178 -0
- package/node_modules/@dharta/contracts/dist/activity.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-formats.d.ts +20 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-formats.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-formats.js +53 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-formats.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-validators.generated.d.ts +37 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-validators.generated.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-validators.generated.js +5107 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime-validators.generated.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.d.ts +154 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.generated.d.ts +1670 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.generated.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.generated.js +1903 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.generated.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.js +377 -0
- package/node_modules/@dharta/contracts/dist/artifact-runtime.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/index.d.ts +6 -0
- package/node_modules/@dharta/contracts/dist/index.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/index.js +6 -0
- package/node_modules/@dharta/contracts/dist/index.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/model-auth.d.ts +31 -0
- package/node_modules/@dharta/contracts/dist/model-auth.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/model-auth.js +45 -0
- package/node_modules/@dharta/contracts/dist/model-auth.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/tasks.d.ts +44 -0
- package/node_modules/@dharta/contracts/dist/tasks.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/tasks.js +127 -0
- package/node_modules/@dharta/contracts/dist/tasks.js.map +1 -0
- package/node_modules/@dharta/contracts/dist/wire-events.d.ts +71 -0
- package/node_modules/@dharta/contracts/dist/wire-events.d.ts.map +1 -0
- package/node_modules/@dharta/contracts/dist/wire-events.js +48 -0
- package/node_modules/@dharta/contracts/dist/wire-events.js.map +1 -0
- package/node_modules/@dharta/contracts/model-auth-capabilities-v1.json +168 -0
- package/node_modules/@dharta/contracts/model-auth-reasons-v1.json +38 -0
- package/node_modules/@dharta/contracts/package.json +44 -0
- package/node_modules/@dharta/contracts/src/activity.ts +215 -0
- package/node_modules/@dharta/contracts/src/artifact-runtime-formats.ts +54 -0
- package/node_modules/@dharta/contracts/src/artifact-runtime-validators.generated.ts +29 -0
- package/node_modules/@dharta/contracts/src/artifact-runtime.generated.ts +2093 -0
- package/node_modules/@dharta/contracts/src/artifact-runtime.ts +520 -0
- package/node_modules/@dharta/contracts/src/index.ts +5 -0
- package/node_modules/@dharta/contracts/src/model-auth.ts +82 -0
- package/node_modules/@dharta/contracts/src/tasks.ts +142 -0
- package/node_modules/@dharta/contracts/src/wire-events.ts +150 -0
- package/node_modules/@dharta/contracts/wire-events.json +29 -0
- package/node_modules/@dharta/sdk/LICENSE +1 -1
- package/node_modules/@dharta/sdk/README.md +22 -8
- package/node_modules/@dharta/sdk/dist/errors.d.ts +9 -7
- package/node_modules/@dharta/sdk/dist/errors.d.ts.map +1 -1
- package/node_modules/@dharta/sdk/dist/errors.js +36 -18
- package/node_modules/@dharta/sdk/dist/errors.js.map +1 -1
- package/node_modules/@dharta/sdk/dist/fleet.d.ts +69 -0
- package/node_modules/@dharta/sdk/dist/fleet.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/fleet.js +240 -0
- package/node_modules/@dharta/sdk/dist/fleet.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/http.d.ts +6 -2
- package/node_modules/@dharta/sdk/dist/http.d.ts.map +1 -1
- package/node_modules/@dharta/sdk/dist/http.js +71 -12
- package/node_modules/@dharta/sdk/dist/http.js.map +1 -1
- package/node_modules/@dharta/sdk/dist/idempotency.d.ts +12 -0
- package/node_modules/@dharta/sdk/dist/idempotency.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/idempotency.js +72 -0
- package/node_modules/@dharta/sdk/dist/idempotency.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/index.d.ts +20 -6
- package/node_modules/@dharta/sdk/dist/index.d.ts.map +1 -1
- package/node_modules/@dharta/sdk/dist/index.js +27 -4
- package/node_modules/@dharta/sdk/dist/index.js.map +1 -1
- package/node_modules/@dharta/sdk/dist/resources.d.ts +108 -13
- package/node_modules/@dharta/sdk/dist/resources.d.ts.map +1 -1
- package/node_modules/@dharta/sdk/dist/resources.js +403 -57
- package/node_modules/@dharta/sdk/dist/resources.js.map +1 -1
- package/node_modules/@dharta/sdk/dist/types.d.ts +436 -16
- package/node_modules/@dharta/sdk/dist/types.d.ts.map +1 -1
- package/node_modules/@dharta/sdk/dist/types.js +31 -2
- package/node_modules/@dharta/sdk/dist/types.js.map +1 -1
- package/node_modules/@dharta/sdk/package.json +9 -3
- package/node_modules/@dharta/sdk/src/errors.ts +41 -18
- package/node_modules/@dharta/sdk/src/fleet.ts +339 -0
- package/node_modules/@dharta/sdk/src/http.ts +110 -17
- package/node_modules/@dharta/sdk/src/idempotency.ts +101 -0
- package/node_modules/@dharta/sdk/src/index.ts +50 -11
- package/node_modules/@dharta/sdk/src/resources.ts +549 -68
- package/node_modules/@dharta/sdk/src/types.ts +629 -20
- package/package.json +16 -6
- package/src/agent.ts +3 -2
- package/src/api-error.ts +6 -5
- package/src/cli.ts +978 -163
- package/src/command-tree.ts +13 -0
- package/src/commands/agents.ts +365 -167
- package/src/commands/analytics.ts +6 -5
- package/src/commands/api.ts +73 -92
- package/src/commands/appearance.ts +5 -6
- package/src/commands/artifact.ts +7 -6
- package/src/commands/audit-log.ts +2 -1
- package/src/commands/auth.ts +25 -5
- package/src/commands/caps.ts +11 -15
- package/src/commands/deploy.ts +18 -4
- package/src/commands/dev.ts +86 -25
- package/src/commands/doctor.ts +69 -0
- package/src/commands/embed-keys.ts +4 -14
- package/src/commands/env.ts +4 -7
- package/src/commands/files.ts +3 -4
- package/src/commands/fleet.ts +672 -0
- package/src/commands/genui.ts +59 -0
- package/src/commands/git-credential.ts +2 -3
- package/src/commands/kartas.ts +45 -11
- package/src/commands/keys.ts +152 -35
- package/src/commands/login.ts +2 -1
- package/src/commands/members.ts +31 -6
- package/src/commands/model-connections.ts +547 -0
- package/src/commands/open.ts +5 -4
- package/src/commands/org.ts +57 -0
- package/src/commands/organization.ts +153 -0
- package/src/commands/parity.ts +1 -3
- package/src/commands/repos.ts +23 -0
- package/src/commands/rollback.ts +2 -3
- package/src/commands/schedules.ts +33 -22
- package/src/commands/scopes.ts +8 -1
- package/src/commands/sessions.ts +9 -3
- package/src/commands/setup.ts +5 -4
- package/src/commands/update.ts +28 -12
- package/src/commands/webhooks.ts +30 -19
- package/src/completions.ts +25 -13
- package/src/config.ts +141 -9
- package/src/context.ts +34 -7
- package/src/docs/cli-reference.ts +206 -0
- package/src/exit-codes.ts +122 -0
- package/src/genui.ts +1398 -0
- package/src/harnesses.ts +2 -1
- package/src/jq.ts +109 -0
- package/src/login-offer.ts +6 -2
- package/src/manifest.ts +134 -0
- package/src/model-auth.ts +173 -0
- package/src/model-settings.ts +222 -0
- package/src/money.ts +5 -1
- package/src/output.ts +60 -0
- package/src/runtime.ts +1 -1
- package/src/scaffold.ts +2 -1
- package/src/validators.ts +18 -11
- package/src/version-check.ts +1 -1
- package/dist/commands/model-keys.d.ts +0 -22
- package/dist/commands/model-keys.js +0 -222
- package/dist/commands/model-keys.js.map +0 -1
- package/src/commands/model-keys.ts +0 -278
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
// The fleet mutations (RFC 0048 PR7). Reads stay on the catalog endpoint; this
|
|
2
|
+
// file covers the writes the fleet console makes.
|
|
3
|
+
//
|
|
4
|
+
// Two scopes: `fleet:write` for routine work, and `fleet:operations:write`,
|
|
5
|
+
// which expires within 90 days, for the eight actions that move live releases:
|
|
6
|
+
// every operation verb past the preview, and every rollout verb.
|
|
7
|
+
export class FleetOperationsResource {
|
|
8
|
+
http;
|
|
9
|
+
constructor(http) {
|
|
10
|
+
this.http = http;
|
|
11
|
+
}
|
|
12
|
+
// Freezes the selection and returns a draft. Nothing is applied until
|
|
13
|
+
// `confirm`, so this is safe to call to find out what an action would touch.
|
|
14
|
+
async create(params, options = {}) {
|
|
15
|
+
const res = await this.http.request({
|
|
16
|
+
method: "POST",
|
|
17
|
+
path: "/api/fleet/operations",
|
|
18
|
+
idempotencyKey: options.idempotencyKey,
|
|
19
|
+
body: { operation: params },
|
|
20
|
+
});
|
|
21
|
+
return res.operation;
|
|
22
|
+
}
|
|
23
|
+
// `phrase` is the `confirmation_phrase` the draft returned. It is derived
|
|
24
|
+
// from the frozen manifest, which does not change after the preview, so the
|
|
25
|
+
// phrase proves the caller saw that preview. It says nothing about whether
|
|
26
|
+
// the fleet has moved since.
|
|
27
|
+
async confirm(id, phrase, options = {}) {
|
|
28
|
+
return this.post(id, "confirm", { confirmation_phrase: phrase }, options);
|
|
29
|
+
}
|
|
30
|
+
async cancel(id, options = {}) {
|
|
31
|
+
return this.post(id, "cancel", undefined, options);
|
|
32
|
+
}
|
|
33
|
+
async retry(id, options = {}) {
|
|
34
|
+
return this.post(id, "retry", undefined, options);
|
|
35
|
+
}
|
|
36
|
+
async post(id, action, body, options = {}) {
|
|
37
|
+
const res = await this.http.request({
|
|
38
|
+
method: "POST",
|
|
39
|
+
path: `/api/fleet/operations/${encodeURIComponent(id)}/${action}`,
|
|
40
|
+
idempotencyKey: options.idempotencyKey,
|
|
41
|
+
body,
|
|
42
|
+
});
|
|
43
|
+
return res.operation;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class FleetRolloutsResource {
|
|
47
|
+
http;
|
|
48
|
+
constructor(http) {
|
|
49
|
+
this.http = http;
|
|
50
|
+
}
|
|
51
|
+
async advance(id, options = {}) {
|
|
52
|
+
return this.post(id, "advance", options);
|
|
53
|
+
}
|
|
54
|
+
async pause(id, options = {}) {
|
|
55
|
+
return this.post(id, "pause", options);
|
|
56
|
+
}
|
|
57
|
+
async resume(id, options = {}) {
|
|
58
|
+
return this.post(id, "resume", options);
|
|
59
|
+
}
|
|
60
|
+
// Runs the health check now instead of waiting for the next observation
|
|
61
|
+
// window. The rollout comes back as it was read, because the evaluation runs
|
|
62
|
+
// in the background.
|
|
63
|
+
async evaluate(id, options = {}) {
|
|
64
|
+
return this.post(id, "evaluate", options);
|
|
65
|
+
}
|
|
66
|
+
// Answers with the operation it queued as well as the rollout: the rollout is
|
|
67
|
+
// finished at that point, and the operation is the thing still worth watching.
|
|
68
|
+
async rollback(id, options = {}) {
|
|
69
|
+
return this.http.request({
|
|
70
|
+
method: "POST",
|
|
71
|
+
path: `/api/fleet/rollouts/${encodeURIComponent(id)}/rollback`,
|
|
72
|
+
idempotencyKey: options.idempotencyKey,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async post(id, action, options = {}) {
|
|
76
|
+
const res = await this.http.request({
|
|
77
|
+
method: "POST",
|
|
78
|
+
path: `/api/fleet/rollouts/${encodeURIComponent(id)}/${action}`,
|
|
79
|
+
idempotencyKey: options.idempotencyKey,
|
|
80
|
+
});
|
|
81
|
+
return res.rollout;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export class FleetFindingsResource {
|
|
85
|
+
http;
|
|
86
|
+
constructor(http) {
|
|
87
|
+
this.http = http;
|
|
88
|
+
}
|
|
89
|
+
async acknowledge(id, options = {}) {
|
|
90
|
+
return this.post(id, "acknowledge", undefined, options);
|
|
91
|
+
}
|
|
92
|
+
async snooze(id, duration, options = {}) {
|
|
93
|
+
return this.post(id, "snooze", duration === undefined ? undefined : { duration }, options);
|
|
94
|
+
}
|
|
95
|
+
async resolve(id, options = {}) {
|
|
96
|
+
return this.post(id, "resolve", undefined, options);
|
|
97
|
+
}
|
|
98
|
+
async reopen(id, options = {}) {
|
|
99
|
+
return this.post(id, "reopen", undefined, options);
|
|
100
|
+
}
|
|
101
|
+
async classify(id, classification, options = {}) {
|
|
102
|
+
return this.post(id, "classify", { classification }, options);
|
|
103
|
+
}
|
|
104
|
+
// Omit `membershipId`, or pass null, to unassign. The wire value for "no
|
|
105
|
+
// owner" is null, which is what the spec declares; the server treats any
|
|
106
|
+
// blank as unassign, but sending null keeps the client honest.
|
|
107
|
+
async assign(id, membershipId, options = {}) {
|
|
108
|
+
return this.post(id, "assign", { membership_id: membershipId ?? null }, options);
|
|
109
|
+
}
|
|
110
|
+
// Raises the finding to an incident so it leaves the routine triage queue.
|
|
111
|
+
async promote(id, options = {}) {
|
|
112
|
+
return this.post(id, "promote", undefined, options);
|
|
113
|
+
}
|
|
114
|
+
// Sets the runbook link. Pass null to clear it; the server also accepts an
|
|
115
|
+
// empty string, which is what the CLI flag sends.
|
|
116
|
+
async updateRunbook(id, runbookUrl, options = {}) {
|
|
117
|
+
const res = await this.http.request({
|
|
118
|
+
method: "PATCH",
|
|
119
|
+
path: `/api/fleet/findings/${encodeURIComponent(id)}`,
|
|
120
|
+
idempotencyKey: options.idempotencyKey,
|
|
121
|
+
body: { runbook_url: runbookUrl },
|
|
122
|
+
});
|
|
123
|
+
return res.finding;
|
|
124
|
+
}
|
|
125
|
+
async post(id, action, body, options = {}) {
|
|
126
|
+
const res = await this.http.request({
|
|
127
|
+
method: "POST",
|
|
128
|
+
path: `/api/fleet/findings/${encodeURIComponent(id)}/${action}`,
|
|
129
|
+
idempotencyKey: options.idempotencyKey,
|
|
130
|
+
body,
|
|
131
|
+
});
|
|
132
|
+
return res.finding;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export class FleetSavedViewsResource {
|
|
136
|
+
http;
|
|
137
|
+
constructor(http) {
|
|
138
|
+
this.http = http;
|
|
139
|
+
}
|
|
140
|
+
async create(params, options = {}) {
|
|
141
|
+
const res = await this.http.request({
|
|
142
|
+
method: "POST",
|
|
143
|
+
path: "/api/fleet/saved_views",
|
|
144
|
+
idempotencyKey: options.idempotencyKey,
|
|
145
|
+
body: { saved_view: params },
|
|
146
|
+
});
|
|
147
|
+
return res.saved_view;
|
|
148
|
+
}
|
|
149
|
+
async update(id, params, options = {}) {
|
|
150
|
+
const res = await this.http.request({
|
|
151
|
+
method: "PATCH",
|
|
152
|
+
path: `/api/fleet/saved_views/${encodeURIComponent(id)}`,
|
|
153
|
+
idempotencyKey: options.idempotencyKey,
|
|
154
|
+
body: { saved_view: params },
|
|
155
|
+
});
|
|
156
|
+
return res.saved_view;
|
|
157
|
+
}
|
|
158
|
+
async delete(id, options = {}) {
|
|
159
|
+
await this.http.request({
|
|
160
|
+
method: "DELETE",
|
|
161
|
+
path: `/api/fleet/saved_views/${encodeURIComponent(id)}`,
|
|
162
|
+
idempotencyKey: options.idempotencyKey,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
// Favorites are per membership, so this marks the view for the person who
|
|
166
|
+
// created the API key, not for the organization.
|
|
167
|
+
async favorite(id, options = {}) {
|
|
168
|
+
await this.http.request({
|
|
169
|
+
method: "POST",
|
|
170
|
+
path: `/api/fleet/saved_views/${encodeURIComponent(id)}/favorite`,
|
|
171
|
+
idempotencyKey: options.idempotencyKey,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
async unfavorite(id, options = {}) {
|
|
175
|
+
await this.http.request({
|
|
176
|
+
method: "DELETE",
|
|
177
|
+
path: `/api/fleet/saved_views/${encodeURIComponent(id)}/favorite`,
|
|
178
|
+
idempotencyKey: options.idempotencyKey,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
export class FleetAnalyticsResource {
|
|
183
|
+
http;
|
|
184
|
+
constructor(http) {
|
|
185
|
+
this.http = http;
|
|
186
|
+
}
|
|
187
|
+
// Stores an explorer chart as a private saved view pinned to the caller. The
|
|
188
|
+
// parameters are the same ones the console's chart URL carries.
|
|
189
|
+
async save(params, options = {}) {
|
|
190
|
+
const res = await this.http.request({
|
|
191
|
+
method: "POST",
|
|
192
|
+
path: "/api/fleet/analytics/saved_views",
|
|
193
|
+
idempotencyKey: options.idempotencyKey,
|
|
194
|
+
body: params,
|
|
195
|
+
});
|
|
196
|
+
return res.saved_view;
|
|
197
|
+
}
|
|
198
|
+
// Removes the chart from the caller's pinned list. The view itself survives.
|
|
199
|
+
async unpin(id, options = {}) {
|
|
200
|
+
await this.http.request({
|
|
201
|
+
method: "DELETE",
|
|
202
|
+
path: `/api/fleet/analytics/saved_views/${encodeURIComponent(id)}/pin`,
|
|
203
|
+
idempotencyKey: options.idempotencyKey,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export class FleetExportsResource {
|
|
208
|
+
http;
|
|
209
|
+
constructor(http) {
|
|
210
|
+
this.http = http;
|
|
211
|
+
}
|
|
212
|
+
// Returns the CSV body as a string. `users` and `sessions` exports carry
|
|
213
|
+
// personal data, so they need a membership that may read sessions.
|
|
214
|
+
async create(params, options = {}) {
|
|
215
|
+
return this.http.request({
|
|
216
|
+
method: "POST",
|
|
217
|
+
path: "/api/fleet/exports",
|
|
218
|
+
headers: { Accept: "text/csv" },
|
|
219
|
+
idempotencyKey: options.idempotencyKey,
|
|
220
|
+
body: { export: params },
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
export class FleetResource {
|
|
225
|
+
operations;
|
|
226
|
+
rollouts;
|
|
227
|
+
findings;
|
|
228
|
+
savedViews;
|
|
229
|
+
analytics;
|
|
230
|
+
exports;
|
|
231
|
+
constructor(http) {
|
|
232
|
+
this.operations = new FleetOperationsResource(http);
|
|
233
|
+
this.rollouts = new FleetRolloutsResource(http);
|
|
234
|
+
this.findings = new FleetFindingsResource(http);
|
|
235
|
+
this.savedViews = new FleetSavedViewsResource(http);
|
|
236
|
+
this.analytics = new FleetAnalyticsResource(http);
|
|
237
|
+
this.exports = new FleetExportsResource(http);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../src/fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface DhartaOptions {
|
|
2
2
|
apiKey: string;
|
|
3
3
|
baseUrl?: string;
|
|
4
4
|
fetch?: typeof fetch;
|
|
5
5
|
formatError?: (status: number, body: unknown) => Error;
|
|
6
6
|
formatNetworkError?: (url: string, error: unknown) => Error;
|
|
7
|
+
idempotencyKey?: string;
|
|
7
8
|
}
|
|
8
9
|
export interface RequestOptions {
|
|
9
10
|
method?: string;
|
|
@@ -11,6 +12,7 @@ export interface RequestOptions {
|
|
|
11
12
|
query?: Record<string, string | number | boolean | undefined>;
|
|
12
13
|
body?: unknown;
|
|
13
14
|
headers?: Record<string, string>;
|
|
15
|
+
idempotencyKey?: string;
|
|
14
16
|
}
|
|
15
17
|
export declare class HttpClient {
|
|
16
18
|
private readonly apiKey;
|
|
@@ -18,9 +20,11 @@ export declare class HttpClient {
|
|
|
18
20
|
private readonly fetchImpl;
|
|
19
21
|
private readonly formatError?;
|
|
20
22
|
private readonly formatNetworkError?;
|
|
21
|
-
|
|
23
|
+
private readonly idempotencyKey?;
|
|
24
|
+
constructor(opts: DhartaOptions);
|
|
22
25
|
request<T>(opts: RequestOptions): Promise<T>;
|
|
23
26
|
raw(path: string, init?: RequestInit): Promise<Response>;
|
|
27
|
+
private withIdempotencyKey;
|
|
24
28
|
private networkError;
|
|
25
29
|
}
|
|
26
30
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAE5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAIrB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC;IAGvD,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC;IAY5D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IASjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAA2C;IACxE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAyC;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IAEzC,YAAY,IAAI,EAAE,aAAa,EAwB9B;IAEK,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAmEjD;IAIK,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkB7D;IAWD,OAAO,CAAC,kBAAkB;IA6B1B,OAAO,CAAC,YAAY;CAIrB"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import { errorFor } from "./errors.js";
|
|
1
|
+
import { errorFor, parseRetryAfterSeconds } from "./errors.js";
|
|
2
|
+
import { assertIdempotencyKey, randomIdempotencyKey } from "./idempotency.js";
|
|
3
|
+
const IDEMPOTENCY_HEADER = "Idempotency-Key";
|
|
4
|
+
// The methods the platform installs its idempotency filter on. A read carries
|
|
5
|
+
// the header only when the caller put it there, and never a minted one.
|
|
6
|
+
const MUTATING_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
2
7
|
const PROTECTED_HEADER_NAMES = new Set([
|
|
3
8
|
"authorization",
|
|
4
9
|
"host",
|
|
@@ -14,6 +19,7 @@ export class HttpClient {
|
|
|
14
19
|
fetchImpl;
|
|
15
20
|
formatError;
|
|
16
21
|
formatNetworkError;
|
|
22
|
+
idempotencyKey;
|
|
17
23
|
constructor(opts) {
|
|
18
24
|
if (!opts.apiKey) {
|
|
19
25
|
throw new Error("DhartaSDK: `apiKey` is required.");
|
|
@@ -30,6 +36,12 @@ export class HttpClient {
|
|
|
30
36
|
this.fetchImpl = f.bind(globalThis);
|
|
31
37
|
this.formatError = opts.formatError;
|
|
32
38
|
this.formatNetworkError = opts.formatNetworkError;
|
|
39
|
+
// Checked here rather than at first use, so a bad client-wide key fails
|
|
40
|
+
// where it was set instead of on whichever request happens to go first.
|
|
41
|
+
this.idempotencyKey =
|
|
42
|
+
opts.idempotencyKey === undefined
|
|
43
|
+
? undefined
|
|
44
|
+
: assertIdempotencyKey(opts.idempotencyKey, "idempotencyKey");
|
|
33
45
|
}
|
|
34
46
|
async request(opts) {
|
|
35
47
|
const url = new URL(this.baseUrl + opts.path);
|
|
@@ -40,11 +52,11 @@ export class HttpClient {
|
|
|
40
52
|
}
|
|
41
53
|
}
|
|
42
54
|
const extraHeaders = sanitizeHeaders(opts.headers);
|
|
43
|
-
const headers = {
|
|
55
|
+
const headers = this.withIdempotencyKey({
|
|
44
56
|
Authorization: `Bearer ${this.apiKey}`,
|
|
45
57
|
Accept: "application/json",
|
|
46
58
|
...extraHeaders,
|
|
47
|
-
};
|
|
59
|
+
}, opts.method ?? "GET", opts.idempotencyKey);
|
|
48
60
|
let body;
|
|
49
61
|
if (opts.body !== undefined) {
|
|
50
62
|
headers["Content-Type"] = "application/json";
|
|
@@ -75,9 +87,21 @@ export class HttpClient {
|
|
|
75
87
|
}
|
|
76
88
|
}
|
|
77
89
|
if (!res.ok) {
|
|
78
|
-
|
|
90
|
+
const retryAfterSeconds = parseRetryAfterSeconds(res.headers.get("Retry-After"));
|
|
91
|
+
const error = this.formatError
|
|
79
92
|
? this.formatError(res.status, parsed)
|
|
80
|
-
: errorFor(res.status, parsed);
|
|
93
|
+
: errorFor(res.status, parsed, retryAfterSeconds);
|
|
94
|
+
// A caller-supplied `formatError` builds its own Error and never sees
|
|
95
|
+
// the response, so attach the delay here too. Otherwise the CLI, which
|
|
96
|
+
// supplies one, would print "you are rate limited" and drop the only
|
|
97
|
+
// part of the answer the user needs: how long to wait.
|
|
98
|
+
if (retryAfterSeconds !== undefined && !("retryAfterSeconds" in error)) {
|
|
99
|
+
Object.defineProperty(error, "retryAfterSeconds", {
|
|
100
|
+
value: retryAfterSeconds,
|
|
101
|
+
enumerable: true,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
throw error;
|
|
81
105
|
}
|
|
82
106
|
return parsed;
|
|
83
107
|
}
|
|
@@ -86,19 +110,54 @@ export class HttpClient {
|
|
|
86
110
|
async raw(path, init) {
|
|
87
111
|
const extraHeaders = sanitizeHeaders(init?.headers);
|
|
88
112
|
const url = this.baseUrl + path;
|
|
113
|
+
// Built OUTSIDE the try. It rejects a malformed Idempotency-Key, and a
|
|
114
|
+
// rejected value is not a transport failure: catching it here would report
|
|
115
|
+
// "could not reach the host" for a key the caller mistyped.
|
|
116
|
+
const headers = this.withIdempotencyKey({
|
|
117
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
118
|
+
...extraHeaders,
|
|
119
|
+
}, init?.method ?? "GET");
|
|
89
120
|
try {
|
|
90
|
-
return await this.fetchImpl(url, {
|
|
91
|
-
...init,
|
|
92
|
-
headers: {
|
|
93
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
94
|
-
...extraHeaders,
|
|
95
|
-
},
|
|
96
|
-
});
|
|
121
|
+
return await this.fetchImpl(url, { ...init, headers });
|
|
97
122
|
}
|
|
98
123
|
catch (error) {
|
|
99
124
|
throw this.networkError(url, error);
|
|
100
125
|
}
|
|
101
126
|
}
|
|
127
|
+
// One place decides the Idempotency-Key, most specific first: the key this
|
|
128
|
+
// request named, then one a caller wrote as a header by hand, then the
|
|
129
|
+
// client-wide key, then a fresh UUID on a mutation. A read that named none of
|
|
130
|
+
// them carries no key, which is what it did before minting moved here.
|
|
131
|
+
//
|
|
132
|
+
// Whatever wins is written back under the canonical spelling and every other
|
|
133
|
+
// spelling is dropped. HTTP header names are case-insensitive, so leaving a
|
|
134
|
+
// lowercase `idempotency-key` beside the winner would send the value twice
|
|
135
|
+
// and let the server choose.
|
|
136
|
+
withIdempotencyKey(headers, method, requestKey) {
|
|
137
|
+
const merged = {};
|
|
138
|
+
let handWritten;
|
|
139
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
140
|
+
if (key.toLowerCase() === IDEMPOTENCY_HEADER.toLowerCase()) {
|
|
141
|
+
handWritten = value;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
merged[key] = value;
|
|
145
|
+
}
|
|
146
|
+
// Both caller-supplied sources are checked, not only the winner: a key that
|
|
147
|
+
// is wrong is worth saying so about, and a caller who supplied two would
|
|
148
|
+
// otherwise learn about the loser's mistake only after changing the winner.
|
|
149
|
+
if (requestKey !== undefined)
|
|
150
|
+
assertIdempotencyKey(requestKey, "idempotencyKey");
|
|
151
|
+
if (handWritten !== undefined)
|
|
152
|
+
assertIdempotencyKey(handWritten, "the Idempotency-Key header");
|
|
153
|
+
const chosen = requestKey
|
|
154
|
+
?? handWritten
|
|
155
|
+
?? this.idempotencyKey
|
|
156
|
+
?? (MUTATING_METHODS.has(method.toUpperCase()) ? randomIdempotencyKey() : undefined);
|
|
157
|
+
if (chosen !== undefined)
|
|
158
|
+
merged[IDEMPOTENCY_HEADER] = chosen;
|
|
159
|
+
return merged;
|
|
160
|
+
}
|
|
102
161
|
networkError(url, error) {
|
|
103
162
|
if (this.formatNetworkError)
|
|
104
163
|
return this.formatNetworkError(url, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAgD9E,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAE7C,8EAA8E;AAC9E,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAErE,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,eAAe;IACf,MAAM;IACN,QAAQ;IACR,gBAAgB;IAChB,YAAY;IACZ,mBAAmB;IACnB,qBAAqB;CACtB,CAAC,CAAC;AAEH,MAAM,OAAO,UAAU;IACJ,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,SAAS,CAAe;IACxB,WAAW,CAA4C;IACvD,kBAAkB,CAA0C;IAC5D,cAAc,CAAU;IAEzC,YAAY,IAAmB;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,kEAAkE;QAClE,2DAA2D;QAC3D,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzE,iEAAiE;QACjE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,wEAAwE;QACxE,wEAAwE;QACxE,IAAI,CAAC,cAAc;YACjB,IAAI,CAAC,cAAc,KAAK,SAAS;gBAC/B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAoB;QACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,SAAS;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,OAAO,GAA2B,IAAI,CAAC,kBAAkB,CAC7D;YACE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,MAAM,EAAE,kBAAkB;YAC1B,GAAG,YAAY;SAChB,EACD,IAAI,CAAC,MAAM,IAAI,KAAK,EACpB,IAAI,CAAC,cAAc,CACpB,CAAC;QACF,IAAI,IAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;gBACzC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;gBAC5B,OAAO;gBACP,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,OAAO,SAAc,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;gBAC5B,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;gBACtC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAmC,EAAE,iBAAiB,CAAC,CAAC;YACjF,sEAAsE;YACtE,uEAAuE;YACvE,qEAAqE;YACrE,uDAAuD;YACvD,IAAI,iBAAiB,KAAK,SAAS,IAAI,CAAC,CAAC,mBAAmB,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE;oBAChD,KAAK,EAAE,iBAAiB;oBACxB,UAAU,EAAE,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC;IAED,sEAAsE;IACtE,2EAA2E;IAC3E,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,IAAkB;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,uEAAuE;QACvE,2EAA2E;QAC3E,4DAA4D;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CACrC;YACE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;YACtC,GAAG,YAAY;SAChB,EACD,IAAI,EAAE,MAAM,IAAI,KAAK,CACtB,CAAC;QACF,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,uEAAuE;IACvE,8EAA8E;IAC9E,uEAAuE;IACvE,EAAE;IACF,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,6BAA6B;IACrB,kBAAkB,CACxB,OAA+B,EAC/B,MAAc,EACd,UAAmB;QAEnB,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,WAA+B,CAAC;QACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,kBAAkB,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC3D,WAAW,GAAG,KAAK,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,UAAU,KAAK,SAAS;YAAE,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACjF,IAAI,WAAW,KAAK,SAAS;YAAE,oBAAoB,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;QAE/F,MAAM,MAAM,GAAG,UAAU;eACpB,WAAW;eACX,IAAI,CAAC,cAAc;eACnB,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvF,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,GAAW,EAAE,KAAc;QAC9C,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjG,CAAC;CACF;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,eAAe,CAAC,OAAqB;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,sDAAsD,CAAC,CAAC;QACnG,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface MutationOptions {
|
|
2
|
+
idempotencyKey?: string;
|
|
3
|
+
}
|
|
4
|
+
export declare const MAX_IDEMPOTENCY_KEY_LENGTH = 255;
|
|
5
|
+
export declare const INVALID_IDEMPOTENCY_KEY_CODE = "invalid_idempotency_key";
|
|
6
|
+
export declare class InvalidIdempotencyKeyError extends Error {
|
|
7
|
+
readonly code = "invalid_idempotency_key";
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
export declare function assertIdempotencyKey(key: string, source: string): string;
|
|
11
|
+
export declare function randomIdempotencyKey(): string;
|
|
12
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAI9C,eAAO,MAAM,4BAA4B,4BAA4B,CAAC;AAItE,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,IAAI,6BAAgC;IAE7C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAmBxE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAoB7C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Every Dharta mutation takes an `Idempotency-Key`. The header itself is set by
|
|
2
|
+
// `HttpClient`, which is the one place that can see a caller's key, a
|
|
3
|
+
// client-wide key and the need to mint at the same time; a resource method
|
|
4
|
+
// passes what the caller chose and nothing else.
|
|
5
|
+
// THE rule for an Idempotency-Key, in one place. Every caller-supplied key goes
|
|
6
|
+
// through `assertIdempotencyKey`, wherever it came from: `MutationOptions`, a
|
|
7
|
+
// header a caller wrote by hand, or the client-wide `idempotencyKey` option.
|
|
8
|
+
//
|
|
9
|
+
// 255 is the server's cap (`Idempotent::MAX_KEY_LENGTH`), which it measures with
|
|
10
|
+
// Ruby's `String#length`, counting code points. Printable ASCII is narrower than
|
|
11
|
+
// the server insists on, and deliberately so: the value has to survive an HTTP
|
|
12
|
+
// header, and `fetch` throws a TypeError while BUILDING the request for anything
|
|
13
|
+
// outside ASCII, which surfaces as a message about headers long after the
|
|
14
|
+
// mistake. Excluding the space and the control characters also means a key
|
|
15
|
+
// cannot split a header. Inside 0x21 to 0x7E one character is one byte is one
|
|
16
|
+
// code point, so this cap and the server's measure the same thing.
|
|
17
|
+
//
|
|
18
|
+
// An empty key is rejected rather than passed on. A blank `Idempotency-Key` is
|
|
19
|
+
// how the platform spells "not idempotent", so accepting one would quietly turn
|
|
20
|
+
// the protection OFF for a caller who thought they were turning it on.
|
|
21
|
+
export const MAX_IDEMPOTENCY_KEY_LENGTH = 255;
|
|
22
|
+
const IDEMPOTENCY_KEY_PATTERN = /^[\x21-\x7e]+$/;
|
|
23
|
+
export const INVALID_IDEMPOTENCY_KEY_CODE = "invalid_idempotency_key";
|
|
24
|
+
// Carries a stable `code` so a consumer can map it without matching on English.
|
|
25
|
+
// The CLI maps it to exit 2, the same code every other rejected value gets.
|
|
26
|
+
export class InvalidIdempotencyKeyError extends Error {
|
|
27
|
+
code = INVALID_IDEMPOTENCY_KEY_CODE;
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "InvalidIdempotencyKeyError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// `source` names where the key came from, so a caller with three ways to supply
|
|
34
|
+
// one is told which is wrong. Returns the key, so it reads as a checkpoint.
|
|
35
|
+
export function assertIdempotencyKey(key, source) {
|
|
36
|
+
if (key.length === 0) {
|
|
37
|
+
throw new InvalidIdempotencyKeyError(`${source} cannot be empty. An empty Idempotency-Key turns idempotency off ` +
|
|
38
|
+
"rather than on; omit it to have one minted, or pass a value you keep.");
|
|
39
|
+
}
|
|
40
|
+
if (key.length > MAX_IDEMPOTENCY_KEY_LENGTH) {
|
|
41
|
+
throw new InvalidIdempotencyKeyError(`${source} must be at most ${MAX_IDEMPOTENCY_KEY_LENGTH} characters, got ${key.length}.`);
|
|
42
|
+
}
|
|
43
|
+
if (!IDEMPOTENCY_KEY_PATTERN.test(key)) {
|
|
44
|
+
throw new InvalidIdempotencyKeyError(`${source} must be printable ASCII with no spaces (0x21 to 0x7E). ` +
|
|
45
|
+
"The value travels as an HTTP header, which cannot carry anything else.");
|
|
46
|
+
}
|
|
47
|
+
return key;
|
|
48
|
+
}
|
|
49
|
+
export function randomIdempotencyKey() {
|
|
50
|
+
if (globalThis.crypto?.randomUUID)
|
|
51
|
+
return globalThis.crypto.randomUUID();
|
|
52
|
+
const bytes = new Uint8Array(16);
|
|
53
|
+
if (globalThis.crypto?.getRandomValues) {
|
|
54
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
58
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
62
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
63
|
+
const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, "0"));
|
|
64
|
+
return [
|
|
65
|
+
hex.slice(0, 4).join(""),
|
|
66
|
+
hex.slice(4, 6).join(""),
|
|
67
|
+
hex.slice(6, 8).join(""),
|
|
68
|
+
hex.slice(8, 10).join(""),
|
|
69
|
+
hex.slice(10, 16).join(""),
|
|
70
|
+
].join("-");
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=idempotency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../src/idempotency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { FleetResource } from "./fleet.js";
|
|
2
|
+
import { type DhartaOptions } from "./http.js";
|
|
3
|
+
import { AgentsResource, ApiKeysResource, BillingResource, GithubRepositoriesResource, KartasResource, MembersResource, ModelConnectionsResource, OrganizationResource, ReleasesResource, SourceReposResource, UsageResource, WebhookEndpointsResource } from "./resources.js";
|
|
3
4
|
export declare class Dharta {
|
|
5
|
+
readonly agents: AgentsResource;
|
|
6
|
+
readonly releases: ReleasesResource;
|
|
7
|
+
readonly githubRepositories: GithubRepositoriesResource;
|
|
4
8
|
readonly apiKeys: ApiKeysResource;
|
|
5
|
-
readonly
|
|
9
|
+
readonly kartas: KartasResource;
|
|
10
|
+
readonly members: MembersResource;
|
|
11
|
+
readonly modelConnections: ModelConnectionsResource;
|
|
12
|
+
readonly organization: OrganizationResource;
|
|
13
|
+
readonly sourceRepos: SourceReposResource;
|
|
6
14
|
readonly webhookEndpoints: WebhookEndpointsResource;
|
|
7
15
|
readonly usage: UsageResource;
|
|
8
16
|
readonly billing: BillingResource;
|
|
9
|
-
|
|
17
|
+
readonly fleet: FleetResource;
|
|
18
|
+
constructor(opts: DhartaOptions);
|
|
10
19
|
}
|
|
11
|
-
export type {
|
|
20
|
+
export type { DhartaOptions, RequestOptions } from "./http.js";
|
|
21
|
+
export type { MutationOptions } from "./idempotency.js";
|
|
22
|
+
export { assertIdempotencyKey, InvalidIdempotencyKeyError, INVALID_IDEMPOTENCY_KEY_CODE, MAX_IDEMPOTENCY_KEY_LENGTH, } from "./idempotency.js";
|
|
12
23
|
export { HttpClient } from "./http.js";
|
|
24
|
+
export type { ModelConnectionApiFormat } from "./types.js";
|
|
25
|
+
export * from "./fleet.js";
|
|
13
26
|
export * from "./types.js";
|
|
14
|
-
export
|
|
27
|
+
export * from "./resources.js";
|
|
28
|
+
export { DhartaError, DhartaAuthError, DhartaForbiddenError, DhartaNotFoundError, DhartaValidationError, } from "./errors.js";
|
|
15
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAExB,qBAAa,MAAM;IACjB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;IACpD,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,YAAY,IAAI,EAAE,aAAa,EAe9B;CACF;AAED,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG/D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3D,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAI3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
|
|
@@ -1,21 +1,44 @@
|
|
|
1
|
+
import { FleetResource } from "./fleet.js";
|
|
1
2
|
import { HttpClient } from "./http.js";
|
|
2
|
-
import { ApiKeysResource, BillingResource,
|
|
3
|
+
import { AgentsResource, ApiKeysResource, BillingResource, GithubRepositoriesResource, KartasResource, MembersResource, ModelConnectionsResource, OrganizationResource, ReleasesResource, SourceReposResource, UsageResource, WebhookEndpointsResource, } from "./resources.js";
|
|
3
4
|
export class Dharta {
|
|
5
|
+
agents;
|
|
6
|
+
releases;
|
|
7
|
+
githubRepositories;
|
|
4
8
|
apiKeys;
|
|
5
|
-
|
|
9
|
+
kartas;
|
|
10
|
+
members;
|
|
11
|
+
modelConnections;
|
|
12
|
+
organization;
|
|
13
|
+
sourceRepos;
|
|
6
14
|
webhookEndpoints;
|
|
7
15
|
usage;
|
|
8
16
|
billing;
|
|
17
|
+
fleet;
|
|
9
18
|
constructor(opts) {
|
|
10
19
|
const http = new HttpClient(opts);
|
|
20
|
+
this.agents = new AgentsResource(http);
|
|
21
|
+
this.releases = new ReleasesResource(http);
|
|
22
|
+
this.githubRepositories = new GithubRepositoriesResource(http);
|
|
11
23
|
this.apiKeys = new ApiKeysResource(http);
|
|
12
|
-
this.
|
|
24
|
+
this.kartas = new KartasResource(http);
|
|
25
|
+
this.members = new MembersResource(http);
|
|
26
|
+
this.modelConnections = new ModelConnectionsResource(http);
|
|
27
|
+
this.organization = new OrganizationResource(http);
|
|
28
|
+
this.sourceRepos = new SourceReposResource(http);
|
|
13
29
|
this.webhookEndpoints = new WebhookEndpointsResource(http);
|
|
14
30
|
this.usage = new UsageResource(http);
|
|
15
31
|
this.billing = new BillingResource(http);
|
|
32
|
+
this.fleet = new FleetResource(http);
|
|
16
33
|
}
|
|
17
34
|
}
|
|
35
|
+
export { assertIdempotencyKey, InvalidIdempotencyKeyError, INVALID_IDEMPOTENCY_KEY_CODE, MAX_IDEMPOTENCY_KEY_LENGTH, } from "./idempotency.js";
|
|
18
36
|
export { HttpClient } from "./http.js";
|
|
37
|
+
export * from "./fleet.js";
|
|
19
38
|
export * from "./types.js";
|
|
20
|
-
|
|
39
|
+
// The resource classes and their parameter and result shapes. Consumers reach
|
|
40
|
+
// them through `new Dharta(...)`, but the types have to be nameable: the CLI
|
|
41
|
+
// annotates its command functions with them.
|
|
42
|
+
export * from "./resources.js";
|
|
43
|
+
export { DhartaError, DhartaAuthError, DhartaForbiddenError, DhartaNotFoundError, DhartaValidationError, } from "./errors.js";
|
|
21
44
|
//# sourceMappingURL=index.js.map
|