@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/README.md +90 -182
- package/dist/browser.d.mts +90 -14
- package/dist/browser.mjs +102 -19
- package/dist/browser.mjs.map +1 -1
- package/dist/index.d.mts +90 -14
- package/dist/index.d.ts +90 -14
- package/dist/index.js +118 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +102 -19
- package/dist/index.mjs.map +1 -1
- package/dist/rcan-validate.js +1 -1
- package/dist/rcan.iife.js +3 -3
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -96,8 +96,8 @@ var RobotURI = class _RobotURI {
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
// src/version.ts
|
|
99
|
-
var SPEC_VERSION = "1.
|
|
100
|
-
var SDK_VERSION = "0.
|
|
99
|
+
var SPEC_VERSION = "1.9.0";
|
|
100
|
+
var SDK_VERSION = "0.8.0";
|
|
101
101
|
function validateVersionCompat(incomingVersion, localVersion = SPEC_VERSION) {
|
|
102
102
|
const parseParts = (v) => {
|
|
103
103
|
const parts = v.split(".");
|
|
@@ -118,18 +118,18 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
|
118
118
|
MessageType2[MessageType2["HEARTBEAT"] = 4] = "HEARTBEAT";
|
|
119
119
|
MessageType2[MessageType2["CONFIG"] = 5] = "CONFIG";
|
|
120
120
|
MessageType2[MessageType2["SAFETY"] = 6] = "SAFETY";
|
|
121
|
-
MessageType2[MessageType2["
|
|
122
|
-
MessageType2[MessageType2["
|
|
121
|
+
MessageType2[MessageType2["AUTH"] = 7] = "AUTH";
|
|
122
|
+
MessageType2[MessageType2["ERROR"] = 8] = "ERROR";
|
|
123
123
|
MessageType2[MessageType2["DISCOVER"] = 9] = "DISCOVER";
|
|
124
|
-
MessageType2[MessageType2["
|
|
125
|
-
MessageType2[MessageType2["
|
|
126
|
-
MessageType2[MessageType2["
|
|
127
|
-
MessageType2[MessageType2["
|
|
128
|
-
MessageType2[MessageType2["
|
|
129
|
-
MessageType2[MessageType2["
|
|
130
|
-
MessageType2[MessageType2["
|
|
124
|
+
MessageType2[MessageType2["PENDING_AUTH"] = 10] = "PENDING_AUTH";
|
|
125
|
+
MessageType2[MessageType2["INVOKE"] = 11] = "INVOKE";
|
|
126
|
+
MessageType2[MessageType2["INVOKE_RESULT"] = 12] = "INVOKE_RESULT";
|
|
127
|
+
MessageType2[MessageType2["INVOKE_CANCEL"] = 13] = "INVOKE_CANCEL";
|
|
128
|
+
MessageType2[MessageType2["REGISTRY_REGISTER"] = 14] = "REGISTRY_REGISTER";
|
|
129
|
+
MessageType2[MessageType2["REGISTRY_RESOLVE"] = 15] = "REGISTRY_RESOLVE";
|
|
130
|
+
MessageType2[MessageType2["TRANSPARENCY"] = 16] = "TRANSPARENCY";
|
|
131
131
|
MessageType2[MessageType2["COMMAND_ACK"] = 17] = "COMMAND_ACK";
|
|
132
|
-
MessageType2[MessageType2["
|
|
132
|
+
MessageType2[MessageType2["COMMAND_NACK"] = 18] = "COMMAND_NACK";
|
|
133
133
|
MessageType2[MessageType2["ROBOT_REVOCATION"] = 19] = "ROBOT_REVOCATION";
|
|
134
134
|
MessageType2[MessageType2["CONSENT_REQUEST"] = 20] = "CONSENT_REQUEST";
|
|
135
135
|
MessageType2[MessageType2["CONSENT_GRANT"] = 21] = "CONSENT_GRANT";
|
|
@@ -138,7 +138,19 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
|
138
138
|
MessageType2[MessageType2["SUBSCRIBE"] = 24] = "SUBSCRIBE";
|
|
139
139
|
MessageType2[MessageType2["UNSUBSCRIBE"] = 25] = "UNSUBSCRIBE";
|
|
140
140
|
MessageType2[MessageType2["FAULT_REPORT"] = 26] = "FAULT_REPORT";
|
|
141
|
-
MessageType2[MessageType2["
|
|
141
|
+
MessageType2[MessageType2["KEY_ROTATION"] = 27] = "KEY_ROTATION";
|
|
142
|
+
MessageType2[MessageType2["COMMAND_COMMIT"] = 28] = "COMMAND_COMMIT";
|
|
143
|
+
MessageType2[MessageType2["SENSOR_DATA"] = 29] = "SENSOR_DATA";
|
|
144
|
+
MessageType2[MessageType2["TRAINING_CONSENT_REQUEST"] = 30] = "TRAINING_CONSENT_REQUEST";
|
|
145
|
+
MessageType2[MessageType2["TRAINING_CONSENT_GRANT"] = 31] = "TRAINING_CONSENT_GRANT";
|
|
146
|
+
MessageType2[MessageType2["TRAINING_CONSENT_DENY"] = 32] = "TRAINING_CONSENT_DENY";
|
|
147
|
+
MessageType2[MessageType2["CONTRIBUTE_REQUEST"] = 33] = "CONTRIBUTE_REQUEST";
|
|
148
|
+
MessageType2[MessageType2["CONTRIBUTE_RESULT"] = 34] = "CONTRIBUTE_RESULT";
|
|
149
|
+
MessageType2[MessageType2["CONTRIBUTE_CANCEL"] = 35] = "CONTRIBUTE_CANCEL";
|
|
150
|
+
MessageType2[MessageType2["TRAINING_DATA"] = 36] = "TRAINING_DATA";
|
|
151
|
+
MessageType2[MessageType2["FEDERATION_SYNC"] = 23] = "FEDERATION_SYNC";
|
|
152
|
+
MessageType2[MessageType2["ALERT"] = 26] = "ALERT";
|
|
153
|
+
MessageType2[MessageType2["AUDIT"] = 16] = "AUDIT";
|
|
142
154
|
return MessageType2;
|
|
143
155
|
})(MessageType || {});
|
|
144
156
|
var RCANMessageError = class extends Error {
|
|
@@ -1258,6 +1270,7 @@ async function fetchCanonicalSchema(schemaName) {
|
|
|
1258
1270
|
try {
|
|
1259
1271
|
const controller = new AbortController();
|
|
1260
1272
|
const timer = setTimeout(() => controller.abort(), 5e3);
|
|
1273
|
+
timer.unref?.();
|
|
1261
1274
|
const res = await fetch(`${SCHEMA_BASE}/${schemaName}`, { signal: controller.signal });
|
|
1262
1275
|
clearTimeout(timer);
|
|
1263
1276
|
if (!res.ok) return null;
|
|
@@ -1898,7 +1911,7 @@ function makeTrainingConsentDeny(params) {
|
|
|
1898
1911
|
return makeConsentDeny(params);
|
|
1899
1912
|
}
|
|
1900
1913
|
function validateTrainingDataMessage(msg) {
|
|
1901
|
-
if (msg.params.message_type !==
|
|
1914
|
+
if (msg.params.message_type !== 36 /* TRAINING_DATA */) {
|
|
1902
1915
|
return { valid: false, reason: "not a TRAINING_DATA message" };
|
|
1903
1916
|
}
|
|
1904
1917
|
const token = msg.params.consent_token;
|
|
@@ -2088,6 +2101,9 @@ function minLoaForScope(scope, policy) {
|
|
|
2088
2101
|
return policy.minLoaStatus;
|
|
2089
2102
|
case "chat":
|
|
2090
2103
|
return policy.minLoaChat;
|
|
2104
|
+
case "contribute":
|
|
2105
|
+
return policy.minLoaChat;
|
|
2106
|
+
// v1.7: between chat and control
|
|
2091
2107
|
case "control":
|
|
2092
2108
|
return policy.minLoaControl;
|
|
2093
2109
|
case "safety":
|
|
@@ -2237,7 +2253,7 @@ function makeFederationSync(source, target, syncType, payload) {
|
|
|
2237
2253
|
cmd: "federation_sync",
|
|
2238
2254
|
target,
|
|
2239
2255
|
params: {
|
|
2240
|
-
msg_type:
|
|
2256
|
+
msg_type: 23 /* FEDERATION_SYNC */,
|
|
2241
2257
|
msg_id: generateId5(),
|
|
2242
2258
|
source_registry: source,
|
|
2243
2259
|
target_registry: target,
|
|
@@ -2363,7 +2379,8 @@ async function sha256Bytes(input) {
|
|
|
2363
2379
|
const encoded = new TextEncoder().encode(input);
|
|
2364
2380
|
const ab = new ArrayBuffer(encoded.byteLength);
|
|
2365
2381
|
new Uint8Array(ab).set(encoded);
|
|
2366
|
-
const
|
|
2382
|
+
const subtle = globalThis.crypto?.subtle ?? (await import("crypto")).webcrypto.subtle;
|
|
2383
|
+
const hashBuffer = await subtle.digest("SHA-256", ab);
|
|
2367
2384
|
return new Uint8Array(hashBuffer);
|
|
2368
2385
|
}
|
|
2369
2386
|
async function encodeMinimal(message) {
|
|
@@ -2514,9 +2531,10 @@ function generateId6() {
|
|
|
2514
2531
|
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("")}`;
|
|
2515
2532
|
}
|
|
2516
2533
|
async function computeSha256Hex(data) {
|
|
2534
|
+
const subtle = globalThis.crypto?.subtle ?? (await import("crypto")).webcrypto.subtle;
|
|
2517
2535
|
const ab = new ArrayBuffer(data.byteLength);
|
|
2518
2536
|
new Uint8Array(ab).set(data);
|
|
2519
|
-
const hashBuffer = await
|
|
2537
|
+
const hashBuffer = await subtle.digest("SHA-256", ab);
|
|
2520
2538
|
const hashArray = new Uint8Array(hashBuffer);
|
|
2521
2539
|
return Array.from(hashArray).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
2522
2540
|
}
|
|
@@ -2609,7 +2627,7 @@ async function makeTrainingDataMessage(media) {
|
|
|
2609
2627
|
cmd: "training_data",
|
|
2610
2628
|
target: "rcan://training/data",
|
|
2611
2629
|
params: {
|
|
2612
|
-
msg_type:
|
|
2630
|
+
msg_type: 36 /* TRAINING_DATA */,
|
|
2613
2631
|
msg_id: generateId6()
|
|
2614
2632
|
},
|
|
2615
2633
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -2642,7 +2660,7 @@ async function makeStreamChunk(streamId, data, mimeType, chunkIndex, isFinal) {
|
|
|
2642
2660
|
cmd: "stream_chunk",
|
|
2643
2661
|
target: "rcan://streaming/chunk",
|
|
2644
2662
|
params: {
|
|
2645
|
-
msg_type:
|
|
2663
|
+
msg_type: 29 /* SENSOR_DATA */,
|
|
2646
2664
|
msg_id: generateId6(),
|
|
2647
2665
|
stream_chunk: streamChunkMeta
|
|
2648
2666
|
},
|
|
@@ -2652,12 +2670,72 @@ async function makeStreamChunk(streamId, data, mimeType, chunkIndex, isFinal) {
|
|
|
2652
2670
|
return msg;
|
|
2653
2671
|
}
|
|
2654
2672
|
|
|
2673
|
+
// src/contribute.ts
|
|
2674
|
+
var CONTRIBUTE_SCOPE_LEVEL = 2.5;
|
|
2675
|
+
var _idCounter = 0;
|
|
2676
|
+
function _generateId() {
|
|
2677
|
+
return `cr-${Date.now()}-${++_idCounter}`;
|
|
2678
|
+
}
|
|
2679
|
+
function makeContributeRequest(params = {}) {
|
|
2680
|
+
return {
|
|
2681
|
+
type: 33 /* CONTRIBUTE_REQUEST */,
|
|
2682
|
+
request_id: params.request_id ?? _generateId(),
|
|
2683
|
+
project_id: params.project_id ?? "",
|
|
2684
|
+
project_name: params.project_name ?? "",
|
|
2685
|
+
work_unit_id: params.work_unit_id ?? "",
|
|
2686
|
+
resource_type: params.resource_type ?? "cpu",
|
|
2687
|
+
estimated_duration_s: params.estimated_duration_s ?? 0,
|
|
2688
|
+
priority: params.priority ?? 0,
|
|
2689
|
+
payload: params.payload ?? {},
|
|
2690
|
+
timestamp: params.timestamp ?? Date.now() / 1e3
|
|
2691
|
+
};
|
|
2692
|
+
}
|
|
2693
|
+
function makeContributeResult(params = {}) {
|
|
2694
|
+
const result = {
|
|
2695
|
+
type: 34 /* CONTRIBUTE_RESULT */,
|
|
2696
|
+
request_id: params.request_id ?? "",
|
|
2697
|
+
work_unit_id: params.work_unit_id ?? "",
|
|
2698
|
+
status: params.status ?? "completed",
|
|
2699
|
+
resource_type: params.resource_type ?? "cpu",
|
|
2700
|
+
duration_s: params.duration_s ?? 0,
|
|
2701
|
+
compute_units: params.compute_units ?? 0,
|
|
2702
|
+
result_payload: params.result_payload ?? {},
|
|
2703
|
+
timestamp: params.timestamp ?? Date.now() / 1e3
|
|
2704
|
+
};
|
|
2705
|
+
if (params.error_message !== void 0) {
|
|
2706
|
+
result.error_message = params.error_message;
|
|
2707
|
+
}
|
|
2708
|
+
return result;
|
|
2709
|
+
}
|
|
2710
|
+
function makeContributeCancel(params = {}) {
|
|
2711
|
+
return {
|
|
2712
|
+
type: 35 /* CONTRIBUTE_CANCEL */,
|
|
2713
|
+
request_id: params.request_id ?? "",
|
|
2714
|
+
work_unit_id: params.work_unit_id ?? "",
|
|
2715
|
+
reason: params.reason ?? "",
|
|
2716
|
+
timestamp: params.timestamp ?? Date.now() / 1e3
|
|
2717
|
+
};
|
|
2718
|
+
}
|
|
2719
|
+
function validateContributeScope(scopeLevel, action = "request") {
|
|
2720
|
+
if (action === "request" || action === "result") {
|
|
2721
|
+
return scopeLevel >= CONTRIBUTE_SCOPE_LEVEL;
|
|
2722
|
+
}
|
|
2723
|
+
if (action === "cancel") {
|
|
2724
|
+
return scopeLevel >= 2;
|
|
2725
|
+
}
|
|
2726
|
+
return false;
|
|
2727
|
+
}
|
|
2728
|
+
function isPreemptedBy(scopeLevel) {
|
|
2729
|
+
return scopeLevel >= 3;
|
|
2730
|
+
}
|
|
2731
|
+
|
|
2655
2732
|
// src/index.ts
|
|
2656
2733
|
var VERSION = "0.6.0";
|
|
2657
2734
|
var RCAN_VERSION = "1.6";
|
|
2658
2735
|
export {
|
|
2659
2736
|
AuditChain,
|
|
2660
2737
|
AuditError,
|
|
2738
|
+
CONTRIBUTE_SCOPE_LEVEL,
|
|
2661
2739
|
ClockDriftError,
|
|
2662
2740
|
CommitmentRecord,
|
|
2663
2741
|
ConfidenceGate,
|
|
@@ -2721,12 +2799,16 @@ export {
|
|
|
2721
2799
|
encodeMinimal,
|
|
2722
2800
|
extractLoaFromJwt,
|
|
2723
2801
|
fetchCanonicalSchema,
|
|
2802
|
+
isPreemptedBy,
|
|
2724
2803
|
isSafetyMessage,
|
|
2725
2804
|
makeCloudRelayMessage,
|
|
2726
2805
|
makeConfigUpdate,
|
|
2727
2806
|
makeConsentDeny,
|
|
2728
2807
|
makeConsentGrant,
|
|
2729
2808
|
makeConsentRequest,
|
|
2809
|
+
makeContributeCancel,
|
|
2810
|
+
makeContributeRequest,
|
|
2811
|
+
makeContributeResult,
|
|
2730
2812
|
makeEstopMessage,
|
|
2731
2813
|
makeEstopWithQoS,
|
|
2732
2814
|
makeFaultReport,
|
|
@@ -2746,6 +2828,7 @@ export {
|
|
|
2746
2828
|
validateConfigAgainstSchema,
|
|
2747
2829
|
validateConfigUpdate,
|
|
2748
2830
|
validateConsentMessage,
|
|
2831
|
+
validateContributeScope,
|
|
2749
2832
|
validateCrossRegistryCommand,
|
|
2750
2833
|
validateDelegationChain,
|
|
2751
2834
|
validateLoaForScope,
|