@rise-maritime/keelson-js 0.6.0-experimental.6 → 0.6.0-experimental.8

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/dist/index.d.ts CHANGED
@@ -257,6 +257,14 @@ export declare function getInterfaceDefinition(interfaceAndVersion: string): {
257
257
  readonly responseStream: false;
258
258
  readonly options: {};
259
259
  };
260
+ readonly set_range: {
261
+ readonly name: "set_range";
262
+ readonly requestType: import("./interfaces/ReplayControl").MessageFns<import("./interfaces/ReplayControl").SetRangeRequest>;
263
+ readonly requestStream: false;
264
+ readonly responseType: import("./interfaces/ReplayControl").MessageFns<import("./interfaces/ReplayControl").ReplaySuccessResponse>;
265
+ readonly responseStream: false;
266
+ readonly options: {};
267
+ };
260
268
  };
261
269
  } | {
262
270
  readonly name: "RoutePlanner";
@@ -13,7 +13,9 @@ export interface Caller {
13
13
  controllerId: string;
14
14
  /**
15
15
  * The token of the command_authority lease the caller holds. Absent when it holds none, which
16
- * is valid only while the responder holds the conn itself (see WHO MAY CALL).
16
+ * is valid only while the responder holds the conn itself. The token is broadcast on a stored
17
+ * slot, so this is an interlock against a station that has lost the conn, not a credential
18
+ * (protocols/navigation_conduct.yaml).
17
19
  */
18
20
  authorityToken?: string | undefined;
19
21
  }
@@ -65,7 +67,8 @@ export interface SetGuidanceOrderRequest {
65
67
  export interface SetGuidanceOrderResponse {
66
68
  /**
67
69
  * UNSUPPORTED when the responder, or the vehicle behind it, cannot hold the requested frame —
68
- * it never substitutes course for heading or the reverse.
70
+ * it never substitutes course for heading or the reverse. TEMPORARILY_REJECTED when there is no
71
+ * active voyage to steer.
69
72
  */
70
73
  result: CommandResult;
71
74
  detail: string;
@@ -58,7 +58,12 @@ export interface LoadFileRequest {
58
58
  path: string;
59
59
  }
60
60
  export interface SeekRequest {
61
- /** Target playhead timestamp. Must fall within the loaded file's window. */
61
+ /**
62
+ * Target playhead timestamp. Must fall within the ACTIVE RANGE when `set_range` has set one, and
63
+ * within the loaded file's window otherwise; outside it the reply is OUT_OF_RANGE. A seek is not
64
+ * clamped into the range, for the reason an inverted range is not swapped: a client that read its
65
+ * own position back and found it somewhere else would have nothing telling it so.
66
+ */
62
67
  target: Date | undefined;
63
68
  }
64
69
  export interface SetSpeedRequest {
@@ -72,6 +77,31 @@ export interface SetSpeedRequest {
72
77
  export interface SetLoopRequest {
73
78
  loop: boolean;
74
79
  }
80
+ /**
81
+ * Bound playback to a span of the loaded file.
82
+ *
83
+ * The operation a reviewer wants constantly: an incident occupies twenty seconds of a two-hour
84
+ * recording, and you want those twenty seconds -- repeatedly, if `set_loop` is on. Composing it from
85
+ * `seek` does not work well, because a client can only notice the end has passed AFTER it has
86
+ * published past it; see RISE-Maritime/keelson#198.
87
+ *
88
+ * BOTH FIELDS UNSET CLEARS THE RANGE and returns playback to the whole file. Clearing has to be
89
+ * expressible, and it is: these are MESSAGE fields, so proto3 gives them explicit presence and a
90
+ * server distinguishes unset from a zero Timestamp with `HasField`. That distinction is load-bearing
91
+ * rather than pedantic -- epoch 0 is a legitimate log time, and a recording from a device with no
92
+ * clock really does start there, so a zero value could not have doubled as "none".
93
+ */
94
+ export interface SetRangeRequest {
95
+ /** First message replayed. Unset means the file's start. */
96
+ start: Date | undefined;
97
+ /**
98
+ * Playback stops or loops on reaching this. Unset means the file's end.
99
+ *
100
+ * Inclusive: an operator who puts the out-point ON a message means to hear that message. Only
101
+ * `end` strictly BEFORE `start` is refused -- `end` equal to `start` is a one-message span.
102
+ */
103
+ end: Date | undefined;
104
+ }
75
105
  /** Generic acknowledgement for control commands. */
76
106
  export interface ReplaySuccessResponse {
77
107
  }
@@ -85,6 +115,7 @@ export declare const LoadFileRequest: MessageFns<LoadFileRequest>;
85
115
  export declare const SeekRequest: MessageFns<SeekRequest>;
86
116
  export declare const SetSpeedRequest: MessageFns<SetSpeedRequest>;
87
117
  export declare const SetLoopRequest: MessageFns<SetLoopRequest>;
118
+ export declare const SetRangeRequest: MessageFns<SetRangeRequest>;
88
119
  export declare const ReplaySuccessResponse: MessageFns<ReplaySuccessResponse>;
89
120
  export type ReplayControlDefinition = typeof ReplayControlDefinition;
90
121
  export declare const ReplayControlDefinition: {
@@ -164,6 +195,14 @@ export declare const ReplayControlDefinition: {
164
195
  readonly responseStream: false;
165
196
  readonly options: {};
166
197
  };
198
+ readonly set_range: {
199
+ readonly name: "set_range";
200
+ readonly requestType: MessageFns<SetRangeRequest>;
201
+ readonly requestStream: false;
202
+ readonly responseType: MessageFns<ReplaySuccessResponse>;
203
+ readonly responseStream: false;
204
+ readonly options: {};
205
+ };
167
206
  };
168
207
  };
169
208
  type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
@@ -5,7 +5,7 @@
5
5
  // protoc v6.30.2
6
6
  // source: ReplayControl.proto
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.ReplayControlDefinition = exports.ReplaySuccessResponse = exports.SetLoopRequest = exports.SetSpeedRequest = exports.SeekRequest = exports.LoadFileRequest = exports.DescribeFileResponse = exports.ChannelInfo = exports.DescribeFileRequest = exports.ListFilesResponse = exports.ListFilesRequest = exports.FileInfo = exports.protobufPackage = void 0;
8
+ exports.ReplayControlDefinition = exports.ReplaySuccessResponse = exports.SetRangeRequest = exports.SetLoopRequest = exports.SetSpeedRequest = exports.SeekRequest = exports.LoadFileRequest = exports.DescribeFileResponse = exports.ChannelInfo = exports.DescribeFileRequest = exports.ListFilesResponse = exports.ListFilesRequest = exports.FileInfo = exports.protobufPackage = void 0;
9
9
  /* eslint-disable */
10
10
  const wire_1 = require("@bufbuild/protobuf/wire");
11
11
  const empty_1 = require("./google/protobuf/empty");
@@ -751,6 +751,74 @@ exports.SetLoopRequest = {
751
751
  return message;
752
752
  },
753
753
  };
754
+ function createBaseSetRangeRequest() {
755
+ return { start: undefined, end: undefined };
756
+ }
757
+ exports.SetRangeRequest = {
758
+ encode(message, writer = new wire_1.BinaryWriter()) {
759
+ if (message.start !== undefined) {
760
+ timestamp_1.Timestamp.encode(toTimestamp(message.start), writer.uint32(10).fork()).join();
761
+ }
762
+ if (message.end !== undefined) {
763
+ timestamp_1.Timestamp.encode(toTimestamp(message.end), writer.uint32(18).fork()).join();
764
+ }
765
+ return writer;
766
+ },
767
+ decode(input, length) {
768
+ const reader = input instanceof wire_1.BinaryReader ? input : new wire_1.BinaryReader(input);
769
+ let end = length === undefined ? reader.len : reader.pos + length;
770
+ const message = createBaseSetRangeRequest();
771
+ while (reader.pos < end) {
772
+ const tag = reader.uint32();
773
+ switch (tag >>> 3) {
774
+ case 1: {
775
+ if (tag !== 10) {
776
+ break;
777
+ }
778
+ message.start = fromTimestamp(timestamp_1.Timestamp.decode(reader, reader.uint32()));
779
+ continue;
780
+ }
781
+ case 2: {
782
+ if (tag !== 18) {
783
+ break;
784
+ }
785
+ message.end = fromTimestamp(timestamp_1.Timestamp.decode(reader, reader.uint32()));
786
+ continue;
787
+ }
788
+ }
789
+ if ((tag & 7) === 4 || tag === 0) {
790
+ break;
791
+ }
792
+ reader.skip(tag & 7);
793
+ }
794
+ return message;
795
+ },
796
+ fromJSON(object) {
797
+ return {
798
+ start: isSet(object.start) ? fromJsonTimestamp(object.start) : undefined,
799
+ end: isSet(object.end) ? fromJsonTimestamp(object.end) : undefined,
800
+ };
801
+ },
802
+ toJSON(message) {
803
+ const obj = {};
804
+ if (message.start !== undefined) {
805
+ obj.start = message.start.toISOString();
806
+ }
807
+ if (message.end !== undefined) {
808
+ obj.end = message.end.toISOString();
809
+ }
810
+ return obj;
811
+ },
812
+ create(base) {
813
+ return exports.SetRangeRequest.fromPartial(base ?? {});
814
+ },
815
+ fromPartial(object) {
816
+ const message = createBaseSetRangeRequest();
817
+ message.start = object.start ?? undefined;
818
+ message.end = object.end ?? undefined;
819
+ return message;
820
+ },
821
+ };
754
822
  function createBaseReplaySuccessResponse() {
755
823
  return {};
756
824
  }
@@ -865,6 +933,14 @@ exports.ReplayControlDefinition = {
865
933
  responseStream: false,
866
934
  options: {},
867
935
  },
936
+ set_range: {
937
+ name: "set_range",
938
+ requestType: exports.SetRangeRequest,
939
+ requestStream: false,
940
+ responseType: exports.ReplaySuccessResponse,
941
+ responseStream: false,
942
+ options: {},
943
+ },
868
944
  },
869
945
  };
870
946
  function toTimestamp(date) {
@@ -410,6 +410,9 @@ export interface Waypoints {
410
410
  * route sets no default speed" as distinct from "this route defaults to
411
411
  * zero", and a consumer merging defaults into a waypoint cannot tell which
412
412
  * it was handed.
413
+ *
414
+ * `Leg.xtd_corridor_mode` and both boundary lists are ignored here: a drawn
415
+ * corridor belongs to one stretch of water and cannot be a default (§6.2.2).
413
416
  */
414
417
  export interface DefaultWaypoint {
415
418
  leg: Leg | undefined;
@@ -126,6 +126,16 @@ export interface Voyage {
126
126
  * voyages (e.g. crewed vs unmanned).
127
127
  */
128
128
  reroutingPolicy: DynamicReroutingPolicy | undefined;
129
+ /**
130
+ * -- Who writes this voyage -------------------------------------------------
131
+ * `voyage/{voyage_id}` is a slot (§2.1.1): one position per voyage, overwritten
132
+ * as the voyage runs, with no producer chunk in the key. The current writer is
133
+ * therefore in the payload, and this is it — the navigation process conducting
134
+ * the voyage, while it serves `navigation_control/v1`
135
+ * (protocols/navigation_conduct.yaml). Empty before conduct begins: a voyage
136
+ * published PLANNED by a station is not yet conducted by anybody.
137
+ */
138
+ conductedBy: string;
129
139
  }
130
140
  export declare const VoyageAuditEntry: MessageFns<VoyageAuditEntry>;
131
141
  export declare const DynamicReroutingPolicy: MessageFns<DynamicReroutingPolicy>;
@@ -425,6 +425,7 @@ function createBaseVoyage() {
425
425
  linkedProcedureIds: [],
426
426
  auditTrail: [],
427
427
  reroutingPolicy: undefined,
428
+ conductedBy: "",
428
429
  };
429
430
  }
430
431
  exports.Voyage = {
@@ -498,6 +499,9 @@ exports.Voyage = {
498
499
  if (message.reroutingPolicy !== undefined) {
499
500
  exports.DynamicReroutingPolicy.encode(message.reroutingPolicy, writer.uint32(722).fork()).join();
500
501
  }
502
+ if (message.conductedBy !== "") {
503
+ writer.uint32(730).string(message.conductedBy);
504
+ }
501
505
  return writer;
502
506
  },
503
507
  decode(input, length) {
@@ -668,6 +672,13 @@ exports.Voyage = {
668
672
  message.reroutingPolicy = exports.DynamicReroutingPolicy.decode(reader, reader.uint32());
669
673
  continue;
670
674
  }
675
+ case 91: {
676
+ if (tag !== 730) {
677
+ break;
678
+ }
679
+ message.conductedBy = reader.string();
680
+ continue;
681
+ }
671
682
  }
672
683
  if ((tag & 7) === 4 || tag === 0) {
673
684
  break;
@@ -707,6 +718,7 @@ exports.Voyage = {
707
718
  reroutingPolicy: isSet(object.reroutingPolicy)
708
719
  ? exports.DynamicReroutingPolicy.fromJSON(object.reroutingPolicy)
709
720
  : undefined,
721
+ conductedBy: isSet(object.conductedBy) ? globalThis.String(object.conductedBy) : "",
710
722
  };
711
723
  },
712
724
  toJSON(message) {
@@ -780,6 +792,9 @@ exports.Voyage = {
780
792
  if (message.reroutingPolicy !== undefined) {
781
793
  obj.reroutingPolicy = exports.DynamicReroutingPolicy.toJSON(message.reroutingPolicy);
782
794
  }
795
+ if (message.conductedBy !== "") {
796
+ obj.conductedBy = message.conductedBy;
797
+ }
783
798
  return obj;
784
799
  },
785
800
  create(base) {
@@ -816,6 +831,7 @@ exports.Voyage = {
816
831
  message.reroutingPolicy = (object.reroutingPolicy !== undefined && object.reroutingPolicy !== null)
817
832
  ? exports.DynamicReroutingPolicy.fromPartial(object.reroutingPolicy)
818
833
  : undefined;
834
+ message.conductedBy = object.conductedBy ?? "";
819
835
  return message;
820
836
  },
821
837
  };
@@ -239,6 +239,14 @@ export declare const serviceDefinitions: {
239
239
  readonly responseStream: false;
240
240
  readonly options: {};
241
241
  };
242
+ readonly set_range: {
243
+ readonly name: "set_range";
244
+ readonly requestType: import("./ReplayControl").MessageFns<import("./ReplayControl").SetRangeRequest>;
245
+ readonly requestStream: false;
246
+ readonly responseType: import("./ReplayControl").MessageFns<import("./ReplayControl").ReplaySuccessResponse>;
247
+ readonly responseStream: false;
248
+ readonly options: {};
249
+ };
242
250
  };
243
251
  };
244
252
  readonly "route_planner/v1": {
@@ -32,6 +32,13 @@ export interface ReplayStatus {
32
32
  progressPct: number;
33
33
  /** Whether the replayer is configured to loop on end-of-file. */
34
34
  loop: boolean;
35
+ /**
36
+ * The active play range, when one is set. Reported so a client that did not set it -- a second
37
+ * station watching the same replay -- can still show what is being played, and so a client can
38
+ * tell "no range" from "a range it has forgotten". Unset when playback covers the whole file.
39
+ */
40
+ rangeStart: Date | undefined;
41
+ rangeEnd: Date | undefined;
35
42
  /** Identification of the daemon producing this sample. See DaemonInfo above. */
36
43
  daemon: DaemonInfo | undefined;
37
44
  /** Progress of an in-flight load_file, 0..100. Zero outside of LOADING. */
@@ -169,6 +169,8 @@ function createBaseReplayStatus() {
169
169
  totalMessageCount: 0,
170
170
  progressPct: 0,
171
171
  loop: false,
172
+ rangeStart: undefined,
173
+ rangeEnd: undefined,
172
174
  daemon: undefined,
173
175
  loadProgressPct: 0,
174
176
  lastLoadError: "",
@@ -207,6 +209,12 @@ exports.ReplayStatus = {
207
209
  if (message.loop !== false) {
208
210
  writer.uint32(80).bool(message.loop);
209
211
  }
212
+ if (message.rangeStart !== undefined) {
213
+ timestamp_1.Timestamp.encode(toTimestamp(message.rangeStart), writer.uint32(90).fork()).join();
214
+ }
215
+ if (message.rangeEnd !== undefined) {
216
+ timestamp_1.Timestamp.encode(toTimestamp(message.rangeEnd), writer.uint32(98).fork()).join();
217
+ }
210
218
  if (message.daemon !== undefined) {
211
219
  exports.DaemonInfo.encode(message.daemon, writer.uint32(162).fork()).join();
212
220
  }
@@ -295,6 +303,20 @@ exports.ReplayStatus = {
295
303
  message.loop = reader.bool();
296
304
  continue;
297
305
  }
306
+ case 11: {
307
+ if (tag !== 90) {
308
+ break;
309
+ }
310
+ message.rangeStart = fromTimestamp(timestamp_1.Timestamp.decode(reader, reader.uint32()));
311
+ continue;
312
+ }
313
+ case 12: {
314
+ if (tag !== 98) {
315
+ break;
316
+ }
317
+ message.rangeEnd = fromTimestamp(timestamp_1.Timestamp.decode(reader, reader.uint32()));
318
+ continue;
319
+ }
298
320
  case 20: {
299
321
  if (tag !== 162) {
300
322
  break;
@@ -337,6 +359,8 @@ exports.ReplayStatus = {
337
359
  totalMessageCount: isSet(object.totalMessageCount) ? globalThis.Number(object.totalMessageCount) : 0,
338
360
  progressPct: isSet(object.progressPct) ? globalThis.Number(object.progressPct) : 0,
339
361
  loop: isSet(object.loop) ? globalThis.Boolean(object.loop) : false,
362
+ rangeStart: isSet(object.rangeStart) ? fromJsonTimestamp(object.rangeStart) : undefined,
363
+ rangeEnd: isSet(object.rangeEnd) ? fromJsonTimestamp(object.rangeEnd) : undefined,
340
364
  daemon: isSet(object.daemon) ? exports.DaemonInfo.fromJSON(object.daemon) : undefined,
341
365
  loadProgressPct: isSet(object.loadProgressPct) ? globalThis.Number(object.loadProgressPct) : 0,
342
366
  lastLoadError: isSet(object.lastLoadError) ? globalThis.String(object.lastLoadError) : "",
@@ -374,6 +398,12 @@ exports.ReplayStatus = {
374
398
  if (message.loop !== false) {
375
399
  obj.loop = message.loop;
376
400
  }
401
+ if (message.rangeStart !== undefined) {
402
+ obj.rangeStart = message.rangeStart.toISOString();
403
+ }
404
+ if (message.rangeEnd !== undefined) {
405
+ obj.rangeEnd = message.rangeEnd.toISOString();
406
+ }
377
407
  if (message.daemon !== undefined) {
378
408
  obj.daemon = exports.DaemonInfo.toJSON(message.daemon);
379
409
  }
@@ -400,6 +430,8 @@ exports.ReplayStatus = {
400
430
  message.totalMessageCount = object.totalMessageCount ?? 0;
401
431
  message.progressPct = object.progressPct ?? 0;
402
432
  message.loop = object.loop ?? false;
433
+ message.rangeStart = object.rangeStart ?? undefined;
434
+ message.rangeEnd = object.rangeEnd ?? undefined;
403
435
  message.daemon = (object.daemon !== undefined && object.daemon !== null)
404
436
  ? exports.DaemonInfo.fromPartial(object.daemon)
405
437
  : undefined;
@@ -417,6 +417,9 @@ export interface Waypoints {
417
417
  * route sets no default speed" as distinct from "this route defaults to
418
418
  * zero", and a consumer merging defaults into a waypoint cannot tell which
419
419
  * it was handed.
420
+ *
421
+ * `Leg.xtd_corridor_mode` and both boundary lists are ignored here: a drawn
422
+ * corridor belongs to one stretch of water and cannot be a default (§6.2.2).
420
423
  */
421
424
  export interface DefaultWaypoint {
422
425
  $type: "keelson.DefaultWaypoint";
@@ -128,6 +128,16 @@ export interface Voyage {
128
128
  * voyages (e.g. crewed vs unmanned).
129
129
  */
130
130
  reroutingPolicy: DynamicReroutingPolicy | undefined;
131
+ /**
132
+ * -- Who writes this voyage -------------------------------------------------
133
+ * `voyage/{voyage_id}` is a slot (§2.1.1): one position per voyage, overwritten
134
+ * as the voyage runs, with no producer chunk in the key. The current writer is
135
+ * therefore in the payload, and this is it — the navigation process conducting
136
+ * the voyage, while it serves `navigation_control/v1`
137
+ * (protocols/navigation_conduct.yaml). Empty before conduct begins: a voyage
138
+ * published PLANNED by a station is not yet conducted by anybody.
139
+ */
140
+ conductedBy: string;
131
141
  }
132
142
  export declare const VoyageAuditEntry: MessageFns<VoyageAuditEntry, "keelson.VoyageAuditEntry">;
133
143
  export declare const DynamicReroutingPolicy: MessageFns<DynamicReroutingPolicy, "keelson.DynamicReroutingPolicy">;
@@ -433,6 +433,7 @@ function createBaseVoyage() {
433
433
  linkedProcedureIds: [],
434
434
  auditTrail: [],
435
435
  reroutingPolicy: undefined,
436
+ conductedBy: "",
436
437
  };
437
438
  }
438
439
  exports.Voyage = {
@@ -507,6 +508,9 @@ exports.Voyage = {
507
508
  if (message.reroutingPolicy !== undefined) {
508
509
  exports.DynamicReroutingPolicy.encode(message.reroutingPolicy, writer.uint32(722).fork()).join();
509
510
  }
511
+ if (message.conductedBy !== "") {
512
+ writer.uint32(730).string(message.conductedBy);
513
+ }
510
514
  return writer;
511
515
  },
512
516
  decode(input, length) {
@@ -677,6 +681,13 @@ exports.Voyage = {
677
681
  message.reroutingPolicy = exports.DynamicReroutingPolicy.decode(reader, reader.uint32());
678
682
  continue;
679
683
  }
684
+ case 91: {
685
+ if (tag !== 730) {
686
+ break;
687
+ }
688
+ message.conductedBy = reader.string();
689
+ continue;
690
+ }
680
691
  }
681
692
  if ((tag & 7) === 4 || tag === 0) {
682
693
  break;
@@ -717,6 +728,7 @@ exports.Voyage = {
717
728
  reroutingPolicy: isSet(object.reroutingPolicy)
718
729
  ? exports.DynamicReroutingPolicy.fromJSON(object.reroutingPolicy)
719
730
  : undefined,
731
+ conductedBy: isSet(object.conductedBy) ? globalThis.String(object.conductedBy) : "",
720
732
  };
721
733
  },
722
734
  toJSON(message) {
@@ -790,6 +802,9 @@ exports.Voyage = {
790
802
  if (message.reroutingPolicy !== undefined) {
791
803
  obj.reroutingPolicy = exports.DynamicReroutingPolicy.toJSON(message.reroutingPolicy);
792
804
  }
805
+ if (message.conductedBy !== "") {
806
+ obj.conductedBy = message.conductedBy;
807
+ }
793
808
  return obj;
794
809
  },
795
810
  create(base) {
@@ -826,6 +841,7 @@ exports.Voyage = {
826
841
  message.reroutingPolicy = (object.reroutingPolicy !== undefined && object.reroutingPolicy !== null)
827
842
  ? exports.DynamicReroutingPolicy.fromPartial(object.reroutingPolicy)
828
843
  : undefined;
844
+ message.conductedBy = object.conductedBy ?? "";
829
845
  return message;
830
846
  },
831
847
  };
@@ -172,7 +172,6 @@
172
172
  "container_status": "keelson.ContainerHostStatus",
173
173
  "container_stats": "keelson.ContainerHostStats",
174
174
  "radio_channel_ppm_pct": "keelson.TimestampedFloat",
175
- "radio_rssi": "keelson.TimestampedFloat",
176
175
  "radio_rsrp_dbm": "keelson.TimestampedFloat",
177
176
  "radio_rsrq_db": "keelson.TimestampedFloat",
178
177
  "radio_sinr_db": "keelson.TimestampedFloat",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rise-maritime/keelson-js",
3
3
  "//version": "NOT the published version. The release workflow overwrites it from the release tag (npm version --no-git-tag-version), so tag and artifact cannot disagree. Only matters for local installs; do not hand-bump before tagging — that manual step is what broke release 0.5.4.",
4
- "version": "0.6.0-experimental.6",
4
+ "version": "0.6.0-experimental.8",
5
5
  "description": "Keelson JavaScript SDK with Node-RED nodes",
6
6
  "main": "dist/index.js",
7
7
  "files": [