@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/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.
|
|
103
|
-
var SDK_VERSION = "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["
|
|
125
|
-
MessageType2[MessageType2["
|
|
124
|
+
MessageType2[MessageType2["AUTH"] = 7] = "AUTH";
|
|
125
|
+
MessageType2[MessageType2["ERROR"] = 8] = "ERROR";
|
|
126
126
|
MessageType2[MessageType2["DISCOVER"] = 9] = "DISCOVER";
|
|
127
|
-
MessageType2[MessageType2["
|
|
128
|
-
MessageType2[MessageType2["
|
|
129
|
-
MessageType2[MessageType2["
|
|
130
|
-
MessageType2[MessageType2["
|
|
131
|
-
MessageType2[MessageType2["
|
|
132
|
-
MessageType2[MessageType2["
|
|
133
|
-
MessageType2[MessageType2["
|
|
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["
|
|
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["
|
|
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 !==
|
|
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:
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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,
|