@exedev/sdk 0.1.0 → 0.3.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 CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  Official JavaScript/TypeScript SDK for the [exe.dev](https://exe.dev) HTTPS API.
4
4
 
5
- ## Install
6
-
7
5
  ```sh
8
6
  npm install @exedev/sdk
9
7
  ```
@@ -14,91 +12,199 @@ npm install @exedev/sdk
14
12
  import exedev from "@exedev/sdk";
15
13
 
16
14
  const exe = exedev({ token: process.env.EXE_TOKEN! });
17
-
18
- // Every exe.dev command is a method. Positional arguments are parameters;
19
- // flags go in an options object, spelled as on the command line.
20
15
  const vm = await exe.new({ name: "my-vm", image: "ubuntu:24.04", tag: ["dev"] });
21
- console.log(vm.https_url);
22
-
23
- const { vms } = await exe.ls();
24
- await exe.resize("my-vm", { memory: "8GB" });
25
- await exe.pause("my-vm");
26
- await exe.resume("my-vm");
27
- await exe.shareAdd("my-vm", "friend@example.com", { message: "have a look" });
28
- await exe.rm("my-vm");
29
-
30
- // Run a raw command line.
31
- const result = await exe.exec("help");
32
- console.log(result.body);
16
+ // new waits for SSH by default. No create-then-ssh retry loop is needed.
17
+ try {
18
+ console.log(vm.name, vm.httpsUrl);
19
+ const result = await vm.ssh("uname -a");
20
+ console.log(result.exitCode, result.stdout, result.stderr);
21
+ await vm.shareAdd("friend@example.com", { message: "have a look" });
22
+ } finally {
23
+ await vm.rm();
24
+ }
33
25
  ```
34
26
 
35
- ## Authentication
27
+ ## Client and VM API
28
+
29
+ `exedev({ token, baseURL?, fetch? })` creates a client. `baseURL` defaults to
30
+ `https://exe.dev`; `fetch` defaults to the global implementation. Named imports
31
+ of `exedev`, `ExedevClient`, and `VM` are also available.
32
+
33
+ - `exe.new(options?)` creates a VM and returns a `VM` object.
34
+ - `exe.ls(nameOrPattern?, options?)` returns `VM[]`.
35
+ - `exe.vm(name)` references an existing VM without making a request.
36
+ - `vm.refresh(options?)` refreshes its metadata and returns the same object.
37
+ - `vm.ssh(command, options?)` runs a shell command on that VM.
38
+ - `vm.cp({ name?, ...options })` copies it and returns a new `VM` object.
39
+ - `exe.rm(vms)` deletes an array of VMs or names in one request; the server
40
+ deletes several at a time. It resolves to `{ deleted, failed, not_found,
41
+ errors }` rather than throwing for VMs it could not delete.
42
+ - Lifecycle and VM-scoped commands are methods on the VM: `vm.rm()`,
43
+ `vm.pause()`, `vm.resume()`, `vm.restart()`, `vm.rename(newName)`,
44
+ `vm.resize(options)`, `vm.stat(options)`, `vm.tag(tags)`, `vm.comment(text)`,
45
+ `vm.shareShow()`, `vm.sharePort(port)`, and the other generated VM commands.
46
+ - Account commands remain on the client: `exe.whoami()`, `exe.sshKeyList()`,
47
+ `exe.integrationsList()`, `exe.billingPlan()`, etc.
48
+
49
+ There is no parallel raw-command API or client-level `ssh` or `cp`. `vm.rm()`
50
+ throws `ExeAPIError` if the VM is not deleted, with `status` 404 if it does not
51
+ exist.
52
+ Options for generated commands retain CLI flag names (for example,
53
+ `{ "no-email": true }`); each method carries the server's help text.
54
+ Every VM command except `grantSupportRoot`, and `whoami`, has a known JSON
55
+ response: its method rejects anything else and resolves to the response's
56
+ type. The wire types (`VMRecord`, `NewResponse`, `ShareShowResponse`, ...) are
57
+ exported. A few report a problem in the result rather than as an error:
58
+ `domainAdd` when DNS does not point at exe.dev yet and `shelleyInstall` when
59
+ Shelley is missing; narrow with `"error" in result`. Other account commands
60
+ may return JSON or text and are typed as `unknown`.
61
+
62
+ `vm.name` is the current name. `vm.httpsUrl`, `vm.sshDest`, and `vm.tags` expose
63
+ common metadata. `vm.info` is a read-only snapshot with `status`, `region`,
64
+ `comment`, `createdAt`, and `promptError` (why `new`'s `prompt` did not reach
65
+ Shelley) when available. A reference from `exe.vm(name)` initially knows only
66
+ its name, with no tags; call `refresh()` to fetch the rest. A copy from `cp()`
67
+ has the tags and web URL the server reports for it. A successful `rename()`
68
+ updates the same object and invalidates old destinations; other references do
69
+ not automatically change.
70
+
71
+ ## Readiness and cancellation
72
+
73
+ `new`, `cp`, `restart`, and `resume` wait for SSH by default. Pass
74
+ `{ waitUntil: "created" }` to return without probing, including when the token
75
+ has no `ssh` permission. `vm.waitUntilReady({ waitUntil?, timeoutMs?, signal? })`
76
+ explicitly waits later. The default readiness deadline is 60 seconds **after**
77
+ creation or the lifecycle operation returns, including probe requests and backoff.
78
+
79
+ Readiness runs only the harmless command `true`, retrying transient connection
80
+ failures. It never retries a user command or the creation request, and it does
81
+ not wait for application servers.
82
+
83
+ `{ waitUntil: "setup" }` also waits for the VM's setup script (`new`'s
84
+ `"setup-script"`, run by exeuntu's `exe-setup.service`) to finish, polling the
85
+ unit over SSH with a default deadline of 10 minutes. If the script failed, the
86
+ `VMReadyError`'s `cause` is a `VMSetupError` with `exitCode` (or `signal`) and
87
+ systemd's `result`; `details().output` has the end of its journal. Images
88
+ without that unit, such as `ubuntu:24.04`, do not run setup scripts, so there
89
+ is nothing to wait for.
36
90
 
37
- Generate an API token via SSH:
38
-
39
- ```sh
40
- ssh exe.dev ssh-key generate-api-key --label=my-app --exp=30d
91
+ ```ts
92
+ const vm = await exe.new({ "setup-script": "#!/bin/sh\nsudo apt-get install -y jq", waitUntil: "setup" });
41
93
  ```
42
94
 
43
- See the [HTTPS API docs](https://exe.dev/docs/https-api) for full details on
44
- authentication, token permissions, and scoping.
95
+ If waiting fails, `VMReadyError.vm` gives you the VM for inspection or cleanup;
96
+ it is not automatically deleted. That includes a token without `ssh`
97
+ permission: the probe is refused, and the error says to use
98
+ `waitUntil: "created"`. All operations accept an `AbortSignal`.
99
+ Caller cancellation preserves `signal.reason`, including during streaming and
100
+ callbacks, rather than wrapping it in another error. An aborted creation may
101
+ still have created a VM; use an explicit name or `ls()` to recover it.
45
102
 
46
- ## API
103
+ ## Running commands
47
104
 
48
- ### `exedev(options)`
105
+ `vm.ssh()` resolves to `{ exitCode, stdout, stderr, stdoutBytes, stderrBytes,
106
+ captured }`. A nonzero exit code is a result, not an exception; a command killed
107
+ by signal N exits 128+N, as in a shell. Byte arrays preserve binary output;
108
+ strings are decoded as UTF-8. The command is a shell script: quote any untrusted
109
+ values you interpolate into it with `quote`.
49
110
 
50
- | Option | Type | Required | Default |
51
- | --------- | ------ | -------- | ------------------- |
52
- | `token` | string | Yes | |
53
- | `baseURL` | string | No | `https://exe.dev` |
54
- | `fetch` | function | No | global `fetch` |
111
+ ```ts
112
+ import { quote } from "@exedev/sdk";
113
+ await vm.ssh(`cat ${quote(path)}`);
114
+ ```
55
115
 
56
- ### Commands
116
+ Commands run in a non-login shell. Variables from `new`'s `env` are set for
117
+ them (once the VM's exe-init has the update that does so; until then use
118
+ `bash -lc`). Long silent commands are fine: the server keeps the response alive.
57
119
 
58
- Each public exe.dev command that runs over the HTTPS API is a method, named by
59
- camel-casing its path: `ls`, `new`, `ssh-key list` is `sshKeyList`,
60
- `team settings auto-join` is `teamSettingsAutoJoin`. Each method's doc comment
61
- is the command's own help text, so `help <command>` and your editor agree.
120
+ ```ts
121
+ await vm.ssh("make", {
122
+ capture: false,
123
+ onStdout: (chunk) => { process.stdout.write(chunk); },
124
+ onStderr: (chunk) => { process.stderr.write(chunk); },
125
+ });
126
+ ```
62
127
 
63
- Methods resolve to the command's JSON output, typed for the commands listed in
64
- `CommandResults` (`src/types.ts`) and `unknown` otherwise. They reject with
65
- `ExeAPIError` (`status`, `command`, `body`) when a command fails. Every
66
- options object accepts `signal` (an `AbortSignal`) for cancellation.
128
+ Callbacks are awaited serially, with incremental UTF-8 decoding per stream.
129
+ Their cross-stream order is approximate. Throwing from a callback cancels the
130
+ response and rejects with that error.
131
+
132
+ Output is captured by default, with an **8 MiB combined limit** on stdout and
133
+ stderr. Change it with `maxOutputBytes`; exceeding it cancels the response and
134
+ throws `SSHStreamError` with code `output_limit`. Set `capture: false` for
135
+ bounded-memory streaming of arbitrarily long output: callbacks still receive
136
+ it, but result/error output is empty and `captured` is false. The capture limit
137
+ is ignored in this mode. Invalid or oversized NDJSON frames are always rejected.
138
+
139
+ ## Errors
140
+
141
+ - `ExeAPIError`: `operation` and HTTP `status`. The message includes the
142
+ server's error text, on one line and shortened to 200 characters, for example
143
+ `exe.dev API error (422) during ssh: VM "web" is not running`. It never
144
+ includes the request, but the server's text can mention values you sent.
145
+ `error.details().body` has the full response; this may contain secrets.
146
+ - `ExeProtocolError`: an incompatible response, including malformed JSON or a
147
+ server that does not support NDJSON SSH output.
148
+ - `SSHStreamError`: interrupted/invalid output or a capture limit. `code` is
149
+ `interrupted`, `protocol`, or `output_limit`; getters provide captured partial
150
+ output. The exit status is unknown. A request that fails before a response
151
+ (for example, a network error) is `interrupted` too, since the command may
152
+ have started. `details()` exposes opt-in diagnostics: the server's message or
153
+ the transport's error.
154
+ - `VMReadyError`: readiness failed; `vm` and `cause` are available.
155
+ - `VMSetupError`: the setup script failed; the `cause` of a `VMReadyError`.
156
+
157
+ Errors do not establish that an operation never ran. Do not blindly retry a
158
+ mutation or remote command after a transport failure.
67
159
 
68
- The command methods live in `src/commands.gen.ts`, which is generated from the
69
- exe.dev command tree; don't edit it by hand. To pick up new commands, run
70
- `npm run sync-commands -- path/to/exe` (default `../exe`) with an up-to-date
71
- checkout of the exe.dev repository, then `npm test`.
160
+ ## Authentication
72
161
 
73
- ### Named import
162
+ Generate a token via SSH:
74
163
 
75
- ```ts
76
- import { exedev } from "@exedev/sdk";
164
+ ```sh
165
+ ssh exe.dev ssh-key generate-api-key --label=my-app --exp=30d --cmds="new,ls,ssh,share add,rm"
77
166
  ```
78
167
 
168
+ See the [HTTPS API docs](https://exe.dev/docs/https-api) for permissions and scoping.
169
+
79
170
  ## Development
80
171
 
172
+ **All of `src/` is generated.** Edit `cmd/gensdkjs` and its TypeScript templates
173
+ in the exe.dev repository, then run `go run ./cmd/gensdkjs` there. Copy the
174
+ outputs into this checkout and test:
175
+
81
176
  ```sh
82
177
  npm install
178
+ npm run sync-commands -- ../exe
83
179
  npm test
84
180
  ```
85
181
 
86
- `npm test` builds the package, then runs the unit tests and the integration
87
- tests. The integration tests run against the real exe.dev API and create,
88
- restart, rename and delete a VM. They need a tag-scoped API token, which can
89
- only see and touch VMs with its tag, and they fail without one (set
90
- `EXE_SKIP_INTEGRATION=1` to skip them). To create the token:
182
+ `npm test` builds the package, checks the public TypeScript API, and runs unit
183
+ and live integration tests. Live tests require a tag-scoped token and create,
184
+ copy, execute commands on, restart, rename, and delete their own test VMs.
185
+ They read `$EXE_TOKEN`, or `$EXE_TOKEN_FILE` (a bare token or JSON containing
186
+ `token`), or `~/.config/exedev/sdk-test-token`. The expected tag is `sdk-test`
187
+ (override with `$EXE_TEST_TAG`). Set `$EXE_BASE_URL` to test another
188
+ deployment, such as `https://exe-staging.dev`. To create a test token:
91
189
 
92
190
  ```sh
93
- mkdir -p ~/.config/exedev
94
- ssh exe.dev 'ssh-key generate-api-key --label=sdk-test --tag=sdk-test --exp=30d --cmds="help,ls,new,whoami,stat,rm,restart,rename,ssh-key list,share show" --json' \
95
- | jq -r .token > ~/.config/exedev/sdk-test-token
96
- chmod 600 ~/.config/exedev/sdk-test-token
191
+ ssh exe.dev 'ssh-key generate-api-key --label=sdk-test --tag=sdk-test --exp=30d --cmds="ls,new,whoami,stat,rm,restart,rename,cp,ssh,ssh-key list,share show" --json'
97
192
  ```
98
193
 
99
- The tests read the token from `$EXE_TOKEN` or `~/.config/exedev/sdk-test-token`.
100
- They check that the VM they create is tagged `sdk-test` (override with
101
- `$EXE_TEST_TAG`). Revoke the token with `ssh exe.dev ssh-key remove sdk-test`.
194
+ Set `EXE_SKIP_INTEGRATION=1` to run without live access. Set
195
+ `EXE_SKIP_SSH_INTEGRATION=1` to exercise only the live control plane when the
196
+ server has not yet deployed NDJSON SSH support; this explicitly skips live SSH
197
+ and readiness assertions, not the corresponding unit tests. The full live
198
+ suite requires that protocol and does not silently fall back to raw SSH output.
199
+
200
+ The generator's Go tests check regeneration and command grammar assumptions.
201
+ Server-side wire-contract tests exercise creation, listing, copying, and SSH.
202
+ To run the generated SDK end-to-end against the local Go HTTP/SSH fixture:
203
+
204
+ ```sh
205
+ # In the exe.dev checkout, with this SDK's npm dependencies installed:
206
+ EXE_SDK_JS_DIR=/absolute/path/to/exe-sdk-js go test ./execore -run TestSDKJSHTTP
207
+ ```
102
208
 
103
209
  ## License
104
210
 
package/dist/client.d.ts CHANGED
@@ -1,59 +1,86 @@
1
- import { Commands } from "./commands.gen.js";
2
1
  import type { Arg, CallOptions, FlagKind } from "./commands.gen.js";
3
2
  export interface ExedevOptions {
4
- /** Bearer token (exe0.* or exe1.*). */
3
+ /** API bearer token. */
5
4
  token: string;
6
- /** Base URL for the API. Defaults to "https://exe.dev". */
5
+ /** Defaults to https://exe.dev. */
7
6
  baseURL?: string;
8
- /** fetch implementation. Defaults to the global fetch. */
7
+ /** Defaults to global fetch. */
9
8
  fetch?: typeof fetch;
10
9
  }
11
- /** @deprecated Use CallOptions. */
12
- export type ExecOptions = CallOptions;
13
- export interface ExecResult {
14
- /** HTTP status code. */
15
- status: number;
16
- /** Raw response body. */
17
- body: string;
18
- /** Whether the request succeeded (2xx). */
19
- ok: boolean;
10
+ export interface SSHOptions extends CallOptions {
11
+ /** Awaited serially as UTF-8 output arrives. Throwing cancels the response. */
12
+ onStdout?: (data: string) => void | Promise<void>;
13
+ onStderr?: (data: string) => void | Promise<void>;
14
+ /** Retain output in the result/error. Set false for bounded-memory streaming. Default true. */
15
+ capture?: boolean;
16
+ /** Maximum combined captured bytes. Default 8 MiB. Ignored with capture: false. */
17
+ maxOutputBytes?: number;
18
+ }
19
+ export interface SSHResult {
20
+ /** The command's exit status; 128+N if it was killed by signal N, as in a shell. */
21
+ readonly exitCode: number;
22
+ readonly captured: boolean;
23
+ readonly stdout: string;
24
+ readonly stderr: string;
25
+ readonly stdoutBytes: Uint8Array;
26
+ readonly stderrBytes: Uint8Array;
20
27
  }
21
28
  /**
22
- * An exe.dev API client. Each exe.dev command is a method (see Commands);
23
- * exec runs a raw command line.
24
- *
25
- * Command methods resolve to the command's parsed JSON output and reject with
26
- * ExeAPIError when the command fails.
29
+ * API rejection. The message carries the server's error text, shortened; the
30
+ * request and the full response body stay out of it.
27
31
  */
28
- export declare class ExedevClient extends Commands {
32
+ export declare class ExeAPIError extends Error {
33
+ #private;
34
+ readonly operation: string;
35
+ /** The HTTP status, or 404 for a VM the server reported missing. */
36
+ readonly status: number;
37
+ constructor(operation: string, status: number, body: string);
38
+ /** Opt-in server diagnostics; may contain secrets. Does not establish whether an operation ran. */
39
+ details(): {
40
+ body: string;
41
+ };
42
+ }
43
+ export declare class ExeProtocolError extends Error {
44
+ readonly operation: string;
45
+ constructor(operation: string);
46
+ }
47
+ /** The command's exit status is unknown; captured output is only a prefix. Do not blindly retry. */
48
+ export declare class SSHStreamError extends Error {
49
+ #private;
50
+ readonly code: "interrupted" | "protocol" | "output_limit";
51
+ readonly captured: boolean;
52
+ constructor(code: "interrupted" | "protocol" | "output_limit", captured: boolean, stdout: Uint8Array, stderr: Uint8Array, detail?: string, cause?: unknown);
53
+ get stdoutBytes(): Uint8Array;
54
+ get stderrBytes(): Uint8Array;
55
+ get stdout(): string;
56
+ get stderr(): string;
57
+ /** Opt-in diagnostics: the server's message, or the transport's error. Either may contain secrets. */
58
+ details(): {
59
+ message?: string;
60
+ cause?: unknown;
61
+ };
62
+ }
63
+ /** Internal transport, deliberately not exported from the package entry point. */
64
+ export declare class Transport {
29
65
  #private;
30
66
  constructor(opts: ExedevOptions);
31
- /** Executes a raw command line against the exe.dev API. */
32
- exec(command: string, options?: CallOptions): Promise<ExecResult>;
33
- protected run(path: string, args: readonly Arg[], options: CallOptions | undefined, flags: Readonly<Record<string, FlagKind>>): Promise<any>;
67
+ call(path: string, args: readonly Arg[], options: CallOptions | undefined, flags: Readonly<Record<string, FlagKind>>, json?: boolean): Promise<any>;
68
+ /** A successful response's JSON documents, including any in-band error documents. */
69
+ documents(path: string, args: readonly Arg[], options: CallOptions | undefined, flags: Readonly<Record<string, FlagKind>>): Promise<{
70
+ status: number;
71
+ body: string;
72
+ docs: unknown[] | undefined;
73
+ }>;
74
+ ssh(vm: string, command: string, options?: SSHOptions): Promise<SSHResult>;
34
75
  }
76
+ export declare function commandLine(path: string, args: readonly Arg[], options: CallOptions | undefined, flags: Readonly<Record<string, FlagKind>>): string;
35
77
  /**
36
- * Create an exe.dev API client.
37
- *
38
- * @example
39
- * ```ts
40
- * import exedev from "@exedev/sdk";
41
- *
42
- * const exe = exedev({ token: process.env.EXE_TOKEN! });
43
- * const { vms } = await exe.ls();
44
- * console.log(vms);
45
- * ```
78
+ * Quote a string as one POSIX shell word, for untrusted values interpolated
79
+ * into vm.ssh() commands: vm.ssh(`cat ${quote(path)}`).
46
80
  */
47
- export default function exedev(opts: ExedevOptions): ExedevClient;
48
- /** Builds the command line for a generated command method. */
49
- export declare function commandLine(path: string, args: readonly Arg[], options: CallOptions | undefined, flags: Readonly<Record<string, FlagKind>>): string;
50
- /** Quotes s for the exe.dev command-line parser (POSIX shell rules). */
51
81
  export declare function quote(s: string): string;
52
- /** Error thrown when the exe.dev API reports a failed command. */
53
- export declare class ExeAPIError extends Error {
54
- readonly command: string;
55
- readonly status: number;
56
- readonly body: string;
57
- constructor(command: string, status: number, body: string);
58
- }
82
+ /** Stop waiting for an uncooperative fetch/body/callback when the caller cancels. */
83
+ export declare function abortable<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T>;
84
+ export declare function delay(ms: number, signal: AbortSignal): Promise<void>;
85
+ export declare function isErrorDocument(doc: unknown): boolean;
59
86
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,mCAAmC;AACnC,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,QAAQ;;gBAK5B,IAAI,EAAE,aAAa;IAU/B,2DAA2D;IACrD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;cAcvD,GAAG,CACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GACxC,OAAO,CAAC,GAAG,CAAC;CAiBhB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAEhE;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,GAAG,EAAE,EACpB,OAAO,EAAE,WAAW,GAAG,SAAS,EAChC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GACxC,MAAM,CA2CR;AAED,wEAAwE;AACxE,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKvC;AA4BD,kEAAkE;AAClE,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAO1D"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}