@continuonai/rcan-ts 0.6.0 → 0.8.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/dist/browser.mjs CHANGED
@@ -99,8 +99,8 @@ var RobotURI = class _RobotURI {
99
99
  };
100
100
 
101
101
  // src/version.ts
102
- var SPEC_VERSION = "1.6";
103
- var SDK_VERSION = "0.6.0";
102
+ var SPEC_VERSION = "1.9.0";
103
+ var SDK_VERSION = "0.8.0";
104
104
  function validateVersionCompat(incomingVersion, localVersion = SPEC_VERSION) {
105
105
  const parseParts = (v) => {
106
106
  const parts = v.split(".");
@@ -121,18 +121,18 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
121
121
  MessageType2[MessageType2["HEARTBEAT"] = 4] = "HEARTBEAT";
122
122
  MessageType2[MessageType2["CONFIG"] = 5] = "CONFIG";
123
123
  MessageType2[MessageType2["SAFETY"] = 6] = "SAFETY";
124
- MessageType2[MessageType2["SENSOR_DATA"] = 7] = "SENSOR_DATA";
125
- MessageType2[MessageType2["AUDIT"] = 8] = "AUDIT";
124
+ MessageType2[MessageType2["AUTH"] = 7] = "AUTH";
125
+ MessageType2[MessageType2["ERROR"] = 8] = "ERROR";
126
126
  MessageType2[MessageType2["DISCOVER"] = 9] = "DISCOVER";
127
- MessageType2[MessageType2["TRAINING_DATA"] = 10] = "TRAINING_DATA";
128
- MessageType2[MessageType2["TRANSPARENCY"] = 11] = "TRANSPARENCY";
129
- MessageType2[MessageType2["FEDERATION_SYNC"] = 12] = "FEDERATION_SYNC";
130
- MessageType2[MessageType2["ALERT"] = 13] = "ALERT";
131
- MessageType2[MessageType2["TELEOP"] = 14] = "TELEOP";
132
- MessageType2[MessageType2["CHAT"] = 15] = "CHAT";
133
- MessageType2[MessageType2["ERROR"] = 16] = "ERROR";
127
+ MessageType2[MessageType2["PENDING_AUTH"] = 10] = "PENDING_AUTH";
128
+ MessageType2[MessageType2["INVOKE"] = 11] = "INVOKE";
129
+ MessageType2[MessageType2["INVOKE_RESULT"] = 12] = "INVOKE_RESULT";
130
+ MessageType2[MessageType2["INVOKE_CANCEL"] = 13] = "INVOKE_CANCEL";
131
+ MessageType2[MessageType2["REGISTRY_REGISTER"] = 14] = "REGISTRY_REGISTER";
132
+ MessageType2[MessageType2["REGISTRY_RESOLVE"] = 15] = "REGISTRY_RESOLVE";
133
+ MessageType2[MessageType2["TRANSPARENCY"] = 16] = "TRANSPARENCY";
134
134
  MessageType2[MessageType2["COMMAND_ACK"] = 17] = "COMMAND_ACK";
135
- MessageType2[MessageType2["COMMAND_COMMIT"] = 18] = "COMMAND_COMMIT";
135
+ MessageType2[MessageType2["COMMAND_NACK"] = 18] = "COMMAND_NACK";
136
136
  MessageType2[MessageType2["ROBOT_REVOCATION"] = 19] = "ROBOT_REVOCATION";
137
137
  MessageType2[MessageType2["CONSENT_REQUEST"] = 20] = "CONSENT_REQUEST";
138
138
  MessageType2[MessageType2["CONSENT_GRANT"] = 21] = "CONSENT_GRANT";
@@ -141,7 +141,19 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
141
141
  MessageType2[MessageType2["SUBSCRIBE"] = 24] = "SUBSCRIBE";
142
142
  MessageType2[MessageType2["UNSUBSCRIBE"] = 25] = "UNSUBSCRIBE";
143
143
  MessageType2[MessageType2["FAULT_REPORT"] = 26] = "FAULT_REPORT";
144
- MessageType2[MessageType2["COMMAND_NACK"] = 27] = "COMMAND_NACK";
144
+ MessageType2[MessageType2["KEY_ROTATION"] = 27] = "KEY_ROTATION";
145
+ MessageType2[MessageType2["COMMAND_COMMIT"] = 28] = "COMMAND_COMMIT";
146
+ MessageType2[MessageType2["SENSOR_DATA"] = 29] = "SENSOR_DATA";
147
+ MessageType2[MessageType2["TRAINING_CONSENT_REQUEST"] = 30] = "TRAINING_CONSENT_REQUEST";
148
+ MessageType2[MessageType2["TRAINING_CONSENT_GRANT"] = 31] = "TRAINING_CONSENT_GRANT";
149
+ MessageType2[MessageType2["TRAINING_CONSENT_DENY"] = 32] = "TRAINING_CONSENT_DENY";
150
+ MessageType2[MessageType2["CONTRIBUTE_REQUEST"] = 33] = "CONTRIBUTE_REQUEST";
151
+ MessageType2[MessageType2["CONTRIBUTE_RESULT"] = 34] = "CONTRIBUTE_RESULT";
152
+ MessageType2[MessageType2["CONTRIBUTE_CANCEL"] = 35] = "CONTRIBUTE_CANCEL";
153
+ MessageType2[MessageType2["TRAINING_DATA"] = 36] = "TRAINING_DATA";
154
+ MessageType2[MessageType2["FEDERATION_SYNC"] = 23] = "FEDERATION_SYNC";
155
+ MessageType2[MessageType2["ALERT"] = 26] = "ALERT";
156
+ MessageType2[MessageType2["AUDIT"] = 16] = "AUDIT";
145
157
  return MessageType2;
146
158
  })(MessageType || {});
147
159
  var RCANMessageError = class extends Error {
@@ -1263,6 +1275,7 @@ async function fetchCanonicalSchema(schemaName) {
1263
1275
  try {
1264
1276
  const controller = new AbortController();
1265
1277
  const timer = setTimeout(() => controller.abort(), 5e3);
1278
+ timer.unref?.();
1266
1279
  const res = await fetch(`${SCHEMA_BASE}/${schemaName}`, { signal: controller.signal });
1267
1280
  clearTimeout(timer);
1268
1281
  if (!res.ok) return null;
@@ -1907,7 +1920,7 @@ function makeTrainingConsentDeny(params) {
1907
1920
  return makeConsentDeny(params);
1908
1921
  }
1909
1922
  function validateTrainingDataMessage(msg) {
1910
- if (msg.params.message_type !== 10 /* TRAINING_DATA */) {
1923
+ if (msg.params.message_type !== 36 /* TRAINING_DATA */) {
1911
1924
  return { valid: false, reason: "not a TRAINING_DATA message" };
1912
1925
  }
1913
1926
  const token = msg.params.consent_token;
@@ -2097,6 +2110,9 @@ function minLoaForScope(scope, policy) {
2097
2110
  return policy.minLoaStatus;
2098
2111
  case "chat":
2099
2112
  return policy.minLoaChat;
2113
+ case "contribute":
2114
+ return policy.minLoaChat;
2115
+ // v1.7: between chat and control
2100
2116
  case "control":
2101
2117
  return policy.minLoaControl;
2102
2118
  case "safety":
@@ -2248,7 +2264,7 @@ function makeFederationSync(source, target, syncType, payload) {
2248
2264
  cmd: "federation_sync",
2249
2265
  target,
2250
2266
  params: {
2251
- msg_type: 12 /* FEDERATION_SYNC */,
2267
+ msg_type: 23 /* FEDERATION_SYNC */,
2252
2268
  msg_id: generateId5(),
2253
2269
  source_registry: source,
2254
2270
  target_registry: target,
@@ -2374,7 +2390,8 @@ async function sha256Bytes(input) {
2374
2390
  const encoded = new TextEncoder().encode(input);
2375
2391
  const ab = new ArrayBuffer(encoded.byteLength);
2376
2392
  new Uint8Array(ab).set(encoded);
2377
- const hashBuffer = await crypto.subtle.digest("SHA-256", ab);
2393
+ const subtle = globalThis.crypto?.subtle ?? (await import("crypto")).webcrypto.subtle;
2394
+ const hashBuffer = await subtle.digest("SHA-256", ab);
2378
2395
  return new Uint8Array(hashBuffer);
2379
2396
  }
2380
2397
  async function encodeMinimal(message) {
@@ -2525,9 +2542,10 @@ function generateId6() {
2525
2542
  return `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
2526
2543
  }
2527
2544
  async function computeSha256Hex(data) {
2545
+ const subtle = globalThis.crypto?.subtle ?? (await import("crypto")).webcrypto.subtle;
2528
2546
  const ab = new ArrayBuffer(data.byteLength);
2529
2547
  new Uint8Array(ab).set(data);
2530
- const hashBuffer = await crypto.subtle.digest("SHA-256", ab);
2548
+ const hashBuffer = await subtle.digest("SHA-256", ab);
2531
2549
  const hashArray = new Uint8Array(hashBuffer);
2532
2550
  return Array.from(hashArray).map((b) => b.toString(16).padStart(2, "0")).join("");
2533
2551
  }
@@ -2620,7 +2638,7 @@ async function makeTrainingDataMessage(media) {
2620
2638
  cmd: "training_data",
2621
2639
  target: "rcan://training/data",
2622
2640
  params: {
2623
- msg_type: 10 /* TRAINING_DATA */,
2641
+ msg_type: 36 /* TRAINING_DATA */,
2624
2642
  msg_id: generateId6()
2625
2643
  },
2626
2644
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
@@ -2653,7 +2671,7 @@ async function makeStreamChunk(streamId, data, mimeType, chunkIndex, isFinal) {
2653
2671
  cmd: "stream_chunk",
2654
2672
  target: "rcan://streaming/chunk",
2655
2673
  params: {
2656
- msg_type: 7 /* SENSOR_DATA */,
2674
+ msg_type: 29 /* SENSOR_DATA */,
2657
2675
  msg_id: generateId6(),
2658
2676
  stream_chunk: streamChunkMeta
2659
2677
  },
@@ -2663,12 +2681,72 @@ async function makeStreamChunk(streamId, data, mimeType, chunkIndex, isFinal) {
2663
2681
  return msg;
2664
2682
  }
2665
2683
 
2684
+ // src/contribute.ts
2685
+ var CONTRIBUTE_SCOPE_LEVEL = 2.5;
2686
+ var _idCounter = 0;
2687
+ function _generateId() {
2688
+ return `cr-${Date.now()}-${++_idCounter}`;
2689
+ }
2690
+ function makeContributeRequest(params = {}) {
2691
+ return {
2692
+ type: 33 /* CONTRIBUTE_REQUEST */,
2693
+ request_id: params.request_id ?? _generateId(),
2694
+ project_id: params.project_id ?? "",
2695
+ project_name: params.project_name ?? "",
2696
+ work_unit_id: params.work_unit_id ?? "",
2697
+ resource_type: params.resource_type ?? "cpu",
2698
+ estimated_duration_s: params.estimated_duration_s ?? 0,
2699
+ priority: params.priority ?? 0,
2700
+ payload: params.payload ?? {},
2701
+ timestamp: params.timestamp ?? Date.now() / 1e3
2702
+ };
2703
+ }
2704
+ function makeContributeResult(params = {}) {
2705
+ const result = {
2706
+ type: 34 /* CONTRIBUTE_RESULT */,
2707
+ request_id: params.request_id ?? "",
2708
+ work_unit_id: params.work_unit_id ?? "",
2709
+ status: params.status ?? "completed",
2710
+ resource_type: params.resource_type ?? "cpu",
2711
+ duration_s: params.duration_s ?? 0,
2712
+ compute_units: params.compute_units ?? 0,
2713
+ result_payload: params.result_payload ?? {},
2714
+ timestamp: params.timestamp ?? Date.now() / 1e3
2715
+ };
2716
+ if (params.error_message !== void 0) {
2717
+ result.error_message = params.error_message;
2718
+ }
2719
+ return result;
2720
+ }
2721
+ function makeContributeCancel(params = {}) {
2722
+ return {
2723
+ type: 35 /* CONTRIBUTE_CANCEL */,
2724
+ request_id: params.request_id ?? "",
2725
+ work_unit_id: params.work_unit_id ?? "",
2726
+ reason: params.reason ?? "",
2727
+ timestamp: params.timestamp ?? Date.now() / 1e3
2728
+ };
2729
+ }
2730
+ function validateContributeScope(scopeLevel, action = "request") {
2731
+ if (action === "request" || action === "result") {
2732
+ return scopeLevel >= CONTRIBUTE_SCOPE_LEVEL;
2733
+ }
2734
+ if (action === "cancel") {
2735
+ return scopeLevel >= 2;
2736
+ }
2737
+ return false;
2738
+ }
2739
+ function isPreemptedBy(scopeLevel) {
2740
+ return scopeLevel >= 3;
2741
+ }
2742
+
2666
2743
  // src/index.ts
2667
2744
  var VERSION = "0.6.0";
2668
2745
  var RCAN_VERSION = "1.6";
2669
2746
  export {
2670
2747
  AuditChain,
2671
2748
  AuditError,
2749
+ CONTRIBUTE_SCOPE_LEVEL,
2672
2750
  ClockDriftError,
2673
2751
  CommitmentRecord,
2674
2752
  ConfidenceGate,
@@ -2732,12 +2810,16 @@ export {
2732
2810
  encodeMinimal,
2733
2811
  extractLoaFromJwt,
2734
2812
  fetchCanonicalSchema,
2813
+ isPreemptedBy,
2735
2814
  isSafetyMessage,
2736
2815
  makeCloudRelayMessage,
2737
2816
  makeConfigUpdate,
2738
2817
  makeConsentDeny,
2739
2818
  makeConsentGrant,
2740
2819
  makeConsentRequest,
2820
+ makeContributeCancel,
2821
+ makeContributeRequest,
2822
+ makeContributeResult,
2741
2823
  makeEstopMessage,
2742
2824
  makeEstopWithQoS,
2743
2825
  makeFaultReport,
@@ -2757,6 +2839,7 @@ export {
2757
2839
  validateConfigAgainstSchema,
2758
2840
  validateConfigUpdate,
2759
2841
  validateConsentMessage,
2842
+ validateContributeScope,
2760
2843
  validateCrossRegistryCommand,
2761
2844
  validateDelegationChain,
2762
2845
  validateLoaForScope,