@synapticon/motion-master-client 6.0.0-alpha.63 → 6.0.0-alpha.65

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.
@@ -1,4 +1,4 @@
1
- import { AlStatusCode, Cia402Status, DcSyncStatus, DeviceDiagnostics, DeviceParameter, EscRegister, EsiParseResult, FoeErrorCode, GameLoopHealth, MailboxErrorCode, Monitoring, ObjectDataTypeInfo, OutputStageResult, ParameterCacheEntry, PdoMapping, PdoMappingRequest, ProcessDataWatchdog, ProcessImageObject, SdoAbortCode, SlaveConfig, SlaveInformationInterface, UserCacheListing } from "./data-contracts.js";
1
+ import { AlStatusCode, BrakeState, Cia402Status, DcSyncStatus, DeviceDiagnostics, DeviceParameter, EscRegister, EsiParseResult, FoeErrorCode, GameLoopHealth, MailboxErrorCode, Monitoring, ObjectDataTypeInfo, OutputStageResult, ParameterCacheEntry, PdoMapping, PdoMappingRequest, ProcedureListing, ProcedureRequest, ProcedureSnapshot, ProcessDataWatchdog, ProcessImageObject, SdoAbortCode, SlaveConfig, SlaveInformationInterface, UserCacheListing } from "./data-contracts.js";
2
2
  import { HttpClient, RequestParams } from "./http-client.js";
3
3
  export declare class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
4
4
  /**
@@ -662,6 +662,78 @@ export declare class Api<SecurityDataType = unknown> extends HttpClient<Security
662
662
  */
663
663
  value: number;
664
664
  }, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<void, void>>;
665
+ /**
666
+ * @description Returns every procedure available on the device, each with its descriptor and the state of its current or last run. One request is enough to render a whole per-device procedures view: the descriptor carries the title, description and caveats to display, and the snapshot says whether anything is running or how the last run went. The list is per device, not global — a procedure is offered only where it applies, so a third-party slave reports an empty list rather than controls that could only ever fail. A procedure that has never run reports an idle snapshot (`status` `idle`, `runCount` 0, every step `idle`), so every entry has the same shape.
667
+ *
668
+ * @name ListProcedures
669
+ * @summary List the procedures a device supports
670
+ * @request GET:/api/devices/{slavePosition}/procedures
671
+ */
672
+ listProcedures: (slavePosition: number, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<ProcedureListing[], void>>;
673
+ /**
674
+ * @description Starts the named procedure and returns as soon as the run is under way — this does **not** wait for it to finish. Poll `GET` on the same path for its outcome, or `DELETE` to cancel it. The request body carries the procedure's parameters; which fields it accepts (and whether it needs any at all) is per procedure, so consult the descriptor from `GET /api/devices/{slavePosition}/procedures`. A procedure that takes no parameters may be started with no body. Only one procedure may run on a device at a time; a second start is refused with 409 while the first is in flight. Most procedures require an active mailbox, so the device must be in PRE-OP, SAFE-OP or OP. A run the drive answers with an error is not a failure of *this* request — it is reported in the snapshot as a failed run.
675
+ *
676
+ * @name StartProcedure
677
+ * @summary Start a procedure on a device
678
+ * @request POST:/api/devices/{slavePosition}/procedures/{procedureName}
679
+ */
680
+ startProcedure: (slavePosition: number, procedureName: string, data?: ProcedureRequest, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<ProcedureSnapshot, void>>;
681
+ /**
682
+ * @description Returns the current run, or the last one to have finished. This is the whole progress surface — there is no push channel — and polling it is lossless: every finished step keeps its terminal status and value, so a step that both starts and completes between two polls is still reported as succeeded. A polling loop is `while status == "running"`. A procedure that has never run is not an absence: it reports an idle snapshot built from the procedure's step template, so a client renders one shape and needs no empty-state branch. The snapshot is retained after a run ends, so a client that reconnects (or a user returning to a page) sees how the last run went. It is dropped when the device set is rebuilt by a scan or reset, because bus positions may then name different hardware.
683
+ *
684
+ * @name GetProcedure
685
+ * @summary Read the state of a procedure on a device
686
+ * @request GET:/api/devices/{slavePosition}/procedures/{procedureName}
687
+ */
688
+ getProcedure: (slavePosition: number, procedureName: string, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<ProcedureSnapshot, void>>;
689
+ /**
690
+ * @description Asks the running procedure to stop and returns immediately. Where the procedure is waiting on the drive it also tells the drive to abort (for an OS command, 0x1024 = 3), so a run that is waiting stops when asked rather than carrying on to completion. The run then finishes with status `cancelled`. This cancels the *run*, not the record: the snapshot remains and reports how far it got.
691
+ *
692
+ * @name CancelProcedure
693
+ * @summary Cancel a running procedure on a device
694
+ * @request DELETE:/api/devices/{slavePosition}/procedures/{procedureName}
695
+ */
696
+ cancelProcedure: (slavePosition: number, procedureName: string, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<void, void>>;
697
+ /**
698
+ * @description Reports the brake objects (0x2004) that decide what a release or engage will do: its current state, the release strategy, the pull time and the pull/hold voltages. Read this before commanding the brake. `softwareControllable` is false when the release strategy is `manualOutputVoltage`, meaning the firmware does not drive the brake at all and both commands below are no-ops. `releaseMovesShaft` is true for a pin brake, whose release procedure turns the motor to lift the load off the pin.
699
+ *
700
+ * @name GetBrake
701
+ * @summary Read a drive's brake configuration and state
702
+ * @request GET:/api/devices/{slavePosition}/brake
703
+ */
704
+ getBrake: (slavePosition: number, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<BrakeState, void>>;
705
+ /**
706
+ * @description Writes "disengaged" to the brake state object (0x2004:07) and waits the drive's pull time (0x2004:03) plus `settle` before answering, because the firmware blocks motion — and motion-related OS commands — until the pull time expires. Answers with the brake state read back. **The release only actually happens while the drive is in OP ENABLED.** In any other state the write merely energises the brake output (phase D). Note also that entering OP ENABLED releases the brake automatically in normal operation but **not** in diagnostics mode, where the master owns the brake — which is why a diagnostics procedure has to call this. **On a pin brake this moves the shaft**: the controller raises current progressively until the load has lifted off the pin by the minimum displacement (0x2004:08), reversing direction if it reaches the current ceiling (0x2004:09, a percentage of rated current) first. Check `releaseMovesShaft` on `GET .../brake`. Brake release is open-loop — nothing confirms the brake let go — so the wait is the only margin there is. A brake whose release strategy is `manualOutputVoltage` is left alone and the returned state says so; that is not an error. **A released brake stays released**: nothing re-engages it for you, so on a vertical or loaded axis engage it again when you are done.
707
+ *
708
+ * @name ReleaseBrake
709
+ * @summary Release (disengage) a drive's brake
710
+ * @request POST:/api/devices/{slavePosition}/brake/release
711
+ */
712
+ releaseBrake: (slavePosition: number, query?: {
713
+ /**
714
+ * Extra wait in milliseconds on top of the drive's pull time. Size it for the machine — release is open-loop, so this is the only margin between "commanded" and "assumed released".
715
+ * @min 0
716
+ * @default 50
717
+ * @example 50
718
+ */
719
+ settle?: number;
720
+ }, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<BrakeState, void>>;
721
+ /**
722
+ * @description Writes "engaged" to the brake state object (0x2004:07) and waits `settle` before answering with the brake state read back. There is no pull time on the way in — a brake is spring-engaged, so engaging it is the removal of voltage — so the wait is only `settle`. As with release, a brake whose release strategy is `manualOutputVoltage` is left alone and the returned state says so.
723
+ *
724
+ * @name EngageBrake
725
+ * @summary Engage a drive's brake
726
+ * @request POST:/api/devices/{slavePosition}/brake/engage
727
+ */
728
+ engageBrake: (slavePosition: number, query?: {
729
+ /**
730
+ * How long to wait in milliseconds after commanding the brake before answering.
731
+ * @min 0
732
+ * @default 50
733
+ * @example 50
734
+ */
735
+ settle?: number;
736
+ }, params?: RequestParams) => Promise<import("./http-client.js").HttpResponse<BrakeState, void>>;
665
737
  /**
666
738
  * @description Commands the device to persist its current parameters (the generic CANopen "store parameters" object 0x1010:01) and waits for confirmation. The server writes the ASCII "save" signature, waits a fixed settle (~1 s) for the drive to begin the flash write, then polls 0x1010:01 until it reads back 1 ("save completed"). Because a store in progress can leave the mailbox briefly unresponsive, a poll that does not yet confirm — a value mismatch or a transient read error alike — is retried up to `retries` more times, `interval` apart. The call blocks until the store is confirmed or the retry budget is exhausted (up to a few seconds); the device's mailbox must be active (PRE-OP/SAFE-OP/OP).
667
739
  *
@@ -456,6 +456,100 @@ export class Api extends HttpClient {
456
456
  type: ContentType.Json,
457
457
  ...params,
458
458
  });
459
+ /**
460
+ * @description Returns every procedure available on the device, each with its descriptor and the state of its current or last run. One request is enough to render a whole per-device procedures view: the descriptor carries the title, description and caveats to display, and the snapshot says whether anything is running or how the last run went. The list is per device, not global — a procedure is offered only where it applies, so a third-party slave reports an empty list rather than controls that could only ever fail. A procedure that has never run reports an idle snapshot (`status` `idle`, `runCount` 0, every step `idle`), so every entry has the same shape.
461
+ *
462
+ * @name ListProcedures
463
+ * @summary List the procedures a device supports
464
+ * @request GET:/api/devices/{slavePosition}/procedures
465
+ */
466
+ listProcedures = (slavePosition, params = {}) => this.request({
467
+ path: `/api/devices/${slavePosition}/procedures`,
468
+ method: "GET",
469
+ format: "json",
470
+ ...params,
471
+ });
472
+ /**
473
+ * @description Starts the named procedure and returns as soon as the run is under way — this does **not** wait for it to finish. Poll `GET` on the same path for its outcome, or `DELETE` to cancel it. The request body carries the procedure's parameters; which fields it accepts (and whether it needs any at all) is per procedure, so consult the descriptor from `GET /api/devices/{slavePosition}/procedures`. A procedure that takes no parameters may be started with no body. Only one procedure may run on a device at a time; a second start is refused with 409 while the first is in flight. Most procedures require an active mailbox, so the device must be in PRE-OP, SAFE-OP or OP. A run the drive answers with an error is not a failure of *this* request — it is reported in the snapshot as a failed run.
474
+ *
475
+ * @name StartProcedure
476
+ * @summary Start a procedure on a device
477
+ * @request POST:/api/devices/{slavePosition}/procedures/{procedureName}
478
+ */
479
+ startProcedure = (slavePosition, procedureName, data, params = {}) => this.request({
480
+ path: `/api/devices/${slavePosition}/procedures/${procedureName}`,
481
+ method: "POST",
482
+ body: data,
483
+ type: ContentType.Json,
484
+ format: "json",
485
+ ...params,
486
+ });
487
+ /**
488
+ * @description Returns the current run, or the last one to have finished. This is the whole progress surface — there is no push channel — and polling it is lossless: every finished step keeps its terminal status and value, so a step that both starts and completes between two polls is still reported as succeeded. A polling loop is `while status == "running"`. A procedure that has never run is not an absence: it reports an idle snapshot built from the procedure's step template, so a client renders one shape and needs no empty-state branch. The snapshot is retained after a run ends, so a client that reconnects (or a user returning to a page) sees how the last run went. It is dropped when the device set is rebuilt by a scan or reset, because bus positions may then name different hardware.
489
+ *
490
+ * @name GetProcedure
491
+ * @summary Read the state of a procedure on a device
492
+ * @request GET:/api/devices/{slavePosition}/procedures/{procedureName}
493
+ */
494
+ getProcedure = (slavePosition, procedureName, params = {}) => this.request({
495
+ path: `/api/devices/${slavePosition}/procedures/${procedureName}`,
496
+ method: "GET",
497
+ format: "json",
498
+ ...params,
499
+ });
500
+ /**
501
+ * @description Asks the running procedure to stop and returns immediately. Where the procedure is waiting on the drive it also tells the drive to abort (for an OS command, 0x1024 = 3), so a run that is waiting stops when asked rather than carrying on to completion. The run then finishes with status `cancelled`. This cancels the *run*, not the record: the snapshot remains and reports how far it got.
502
+ *
503
+ * @name CancelProcedure
504
+ * @summary Cancel a running procedure on a device
505
+ * @request DELETE:/api/devices/{slavePosition}/procedures/{procedureName}
506
+ */
507
+ cancelProcedure = (slavePosition, procedureName, params = {}) => this.request({
508
+ path: `/api/devices/${slavePosition}/procedures/${procedureName}`,
509
+ method: "DELETE",
510
+ ...params,
511
+ });
512
+ /**
513
+ * @description Reports the brake objects (0x2004) that decide what a release or engage will do: its current state, the release strategy, the pull time and the pull/hold voltages. Read this before commanding the brake. `softwareControllable` is false when the release strategy is `manualOutputVoltage`, meaning the firmware does not drive the brake at all and both commands below are no-ops. `releaseMovesShaft` is true for a pin brake, whose release procedure turns the motor to lift the load off the pin.
514
+ *
515
+ * @name GetBrake
516
+ * @summary Read a drive's brake configuration and state
517
+ * @request GET:/api/devices/{slavePosition}/brake
518
+ */
519
+ getBrake = (slavePosition, params = {}) => this.request({
520
+ path: `/api/devices/${slavePosition}/brake`,
521
+ method: "GET",
522
+ format: "json",
523
+ ...params,
524
+ });
525
+ /**
526
+ * @description Writes "disengaged" to the brake state object (0x2004:07) and waits the drive's pull time (0x2004:03) plus `settle` before answering, because the firmware blocks motion — and motion-related OS commands — until the pull time expires. Answers with the brake state read back. **The release only actually happens while the drive is in OP ENABLED.** In any other state the write merely energises the brake output (phase D). Note also that entering OP ENABLED releases the brake automatically in normal operation but **not** in diagnostics mode, where the master owns the brake — which is why a diagnostics procedure has to call this. **On a pin brake this moves the shaft**: the controller raises current progressively until the load has lifted off the pin by the minimum displacement (0x2004:08), reversing direction if it reaches the current ceiling (0x2004:09, a percentage of rated current) first. Check `releaseMovesShaft` on `GET .../brake`. Brake release is open-loop — nothing confirms the brake let go — so the wait is the only margin there is. A brake whose release strategy is `manualOutputVoltage` is left alone and the returned state says so; that is not an error. **A released brake stays released**: nothing re-engages it for you, so on a vertical or loaded axis engage it again when you are done.
527
+ *
528
+ * @name ReleaseBrake
529
+ * @summary Release (disengage) a drive's brake
530
+ * @request POST:/api/devices/{slavePosition}/brake/release
531
+ */
532
+ releaseBrake = (slavePosition, query, params = {}) => this.request({
533
+ path: `/api/devices/${slavePosition}/brake/release`,
534
+ method: "POST",
535
+ query: query,
536
+ format: "json",
537
+ ...params,
538
+ });
539
+ /**
540
+ * @description Writes "engaged" to the brake state object (0x2004:07) and waits `settle` before answering with the brake state read back. There is no pull time on the way in — a brake is spring-engaged, so engaging it is the removal of voltage — so the wait is only `settle`. As with release, a brake whose release strategy is `manualOutputVoltage` is left alone and the returned state says so.
541
+ *
542
+ * @name EngageBrake
543
+ * @summary Engage a drive's brake
544
+ * @request POST:/api/devices/{slavePosition}/brake/engage
545
+ */
546
+ engageBrake = (slavePosition, query, params = {}) => this.request({
547
+ path: `/api/devices/${slavePosition}/brake/engage`,
548
+ method: "POST",
549
+ query: query,
550
+ format: "json",
551
+ ...params,
552
+ });
459
553
  /**
460
554
  * @description Commands the device to persist its current parameters (the generic CANopen "store parameters" object 0x1010:01) and waits for confirmation. The server writes the ASCII "save" signature, waits a fixed settle (~1 s) for the drive to begin the flash write, then polls 0x1010:01 until it reads back 1 ("save completed"). Because a store in progress can leave the mailbox briefly unresponsive, a poll that does not yet confirm — a value mismatch or a transient read error alike — is retried up to `retries` more times, `interval` apart. The call blocks until the store is confirmed or the retry budget is exhausted (up to a few seconds); the device's mailbox must be active (PRE-OP/SAFE-OP/OP).
461
555
  *
@@ -344,6 +344,155 @@ export interface ProcessImageObject {
344
344
  */
345
345
  bitLength: number;
346
346
  }
347
+ /** One step of a procedure. `id` is stable across runs, so a client keys its label and its value formatting off it. A step never reports cancellation: cancelling stops the procedure, leaving the step it was on `running` and the rest `idle`, which records how far it got. */
348
+ export interface ProgressStep {
349
+ /**
350
+ * Stable identifier of the step within its procedure.
351
+ * @example "command"
352
+ */
353
+ id: string;
354
+ /** @example "succeeded" */
355
+ status: "idle" | "running" | "succeeded" | "failed";
356
+ /**
357
+ * What the step produced, if anything — shape is per procedure. Absent when the step produced nothing. For `os-command` it is an object with `status`, `data`, and `errorCode` when the drive sent one.
358
+ * @example {"status":1,"data":[1,2,3,4,5,6]}
359
+ */
360
+ value?: any;
361
+ /** Why the step failed. Absent unless it did. */
362
+ error?: string;
363
+ }
364
+ /** The complete state of a procedure on one device — an accumulating snapshot rather than an event, which is what makes polling lossless. */
365
+ export interface ProcedureSnapshot {
366
+ /**
367
+ * The one field a polling loop checks. `cancelled` is distinct from `failed` on purpose: "I stopped it" and "the drive could not do it" are different outcomes.
368
+ * @example "succeeded"
369
+ */
370
+ status: "idle" | "running" | "succeeded" | "failed" | "cancelled";
371
+ /**
372
+ * How many runs have been accepted on this device since the last scan or reset; a rejected start does not count. Doubles as a generation counter — with no run id, a changed `runCount` is how a poller can tell one run from the next.
373
+ * @example 3
374
+ */
375
+ runCount: number;
376
+ /**
377
+ * Epoch milliseconds the run began. Absent when never run.
378
+ * @format int64
379
+ * @example 1735821000123
380
+ */
381
+ startedAt?: number;
382
+ /**
383
+ * Epoch milliseconds the run ended. Absent while running.
384
+ * @format int64
385
+ * @example 1735821042456
386
+ */
387
+ finishedAt?: number;
388
+ /** The procedure's ordered steps, always the full template. */
389
+ steps: ProgressStep[];
390
+ /** Why the run failed when no step captured it — a failure belonging to no step, such as the device not being the kind the procedure needs. Absent otherwise. */
391
+ error?: string;
392
+ }
393
+ /** A drive's brake configuration and current state — the parts of object 0x2004 that decide what commanding the brake will actually do. Returned by every brake endpoint, so the outcome of a release or engage arrives in the same shape as a plain read. */
394
+ export interface BrakeState {
395
+ /**
396
+ * Brake state (0x2004:07). A brake is spring-engaged, so `engaged` is also its powered-off state.
397
+ * @example "engaged"
398
+ */
399
+ status: "notConfigured" | "engaged" | "disengaged";
400
+ /**
401
+ * How the brake is driven (0x2004:04). `manualOutputVoltage` means the firmware does not drive it — the brake is a raw output voltage (0x2004:10) instead.
402
+ * @example "clutch"
403
+ */
404
+ releaseStrategy: "manualOutputVoltage" | "clutch" | "pin";
405
+ /**
406
+ * How long the pull voltage is applied to release the brake (0x2004:03). The firmware blocks motion, and motion-related OS commands, until this expires.
407
+ * @example 120
408
+ */
409
+ pullTimeMs: number;
410
+ /**
411
+ * Voltage that disengages the brake, in millivolts (0x2004:01).
412
+ * @example 24000
413
+ */
414
+ pullVoltageMv: number;
415
+ /**
416
+ * Lower voltage that keeps it disengaged once released, in millivolts (0x2004:02).
417
+ * @example 12000
418
+ */
419
+ holdVoltageMv: number;
420
+ /**
421
+ * Whether commanding the brake does anything at all — false for `manualOutputVoltage`. Derived from the release strategy and served so a client need not encode that rule.
422
+ * @example true
423
+ */
424
+ softwareControllable: boolean;
425
+ /**
426
+ * Whether releasing this brake turns the motor. True only for a pin brake, whose release raises current progressively to lift the load off the pin.
427
+ * @example false
428
+ */
429
+ releaseMovesShaft: boolean;
430
+ }
431
+ /** What a procedure *is*, independent of any run — everything needed to render a control for it. The text is served rather than held per client, because the house rule that every action carries a description and its caveats means it has to exist somewhere, and duplicating it in each client is how it goes stale. */
432
+ export interface ProcedureDescriptor {
433
+ /**
434
+ * Identifier: the `procedureName` path segment, and the key its snapshot is retained under.
435
+ * @example "os-command"
436
+ */
437
+ name: string;
438
+ /**
439
+ * Short human-readable name.
440
+ * @example "OS command"
441
+ */
442
+ title: string;
443
+ /** What the procedure does. */
444
+ description: string;
445
+ /** What a user must know before running it. May be empty. */
446
+ caveats: string[];
447
+ /**
448
+ * True if running it can move the shaft.
449
+ * @example true
450
+ */
451
+ movesMotor: boolean;
452
+ /**
453
+ * True if the drive must be enabled before it will run.
454
+ * @example false
455
+ */
456
+ requiresEnabled: boolean;
457
+ /**
458
+ * The ordered step ids the procedure reports against — bare ids, because a template's per-step status is always idle and says nothing. Live status for the same ids is in the snapshot's `steps`.
459
+ * @example ["command"]
460
+ */
461
+ steps: string[];
462
+ }
463
+ /** One procedure paired with how its last run on this device went — an entry of `GET /api/devices/{slavePosition}/procedures`. The pairing is what lets a page render in a single request instead of one per procedure. */
464
+ export interface ProcedureListing {
465
+ /** What a procedure *is*, independent of any run — everything needed to render a control for it. The text is served rather than held per client, because the house rule that every action carries a description and its caveats means it has to exist somewhere, and duplicating it in each client is how it goes stale. */
466
+ descriptor: ProcedureDescriptor;
467
+ /** The complete state of a procedure on one device — an accumulating snapshot rather than an event, which is what makes polling lossless. */
468
+ snapshot: ProcedureSnapshot;
469
+ }
470
+ /** A procedure's parameters. Which fields apply is per procedure — consult its descriptor — so this schema is open, and a procedure that takes none may be started with no body at all. The properties below are those of `os-command`, where `command` is required. */
471
+ export interface ProcedureRequest {
472
+ /**
473
+ * `os-command` only, and required for it: the eight request bytes. Byte 0 is the OS command ID; bytes 1-7 are that command's parameters.
474
+ * @maxItems 8
475
+ * @minItems 8
476
+ * @example [8,0,0,0,0,0,0,0]
477
+ */
478
+ command?: number[];
479
+ /**
480
+ * Ceiling on the whole command. Not a liveness check — the drive fails a command no service acknowledges within 5 s on its own — so size it for the command being run. Hitting it aborts the command on the drive.
481
+ * @min 1
482
+ * @max 600000
483
+ * @default 1000
484
+ * @example 30000
485
+ */
486
+ timeoutMs?: number;
487
+ /**
488
+ * How often the server reads the drive's response object while waiting.
489
+ * @min 1
490
+ * @max 1000
491
+ * @default 10
492
+ */
493
+ pollIntervalMs?: number;
494
+ [key: string]: any;
495
+ }
347
496
  export interface OutputStageResult {
348
497
  /**
349
498
  * 1-based bus position of the owning device (echoes the request)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synapticon/motion-master-client",
3
- "version": "6.0.0-alpha.63",
3
+ "version": "6.0.0-alpha.65",
4
4
  "description": "Isomorphic TypeScript client for Motion Master: the generated HTTP API client, the WebSocket connection, and helpers.",
5
5
  "license": "MIT",
6
6
  "repository": {