@corca-org/ceal-host-win32-x64 1.0.5 → 1.0.7
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/bin/ceal-host.exe +0 -0
- package/libexec/ceal-host/claude-hook.mjs +35 -17
- package/libexec/ceal-host/claude-invocation-authentication.mjs +2680 -0
- package/libexec/ceal-host/claude-producer.mjs +34 -18
- package/libexec/ceal-host/codex-hook.mjs +38 -21
- package/libexec/ceal-host/codex-invocation-authentication.mjs +49 -31
- package/libexec/ceal-host/codex-producer.mjs +38 -21
- package/libexec/ceal-host/control.mjs +97 -68
- package/libexec/ceal-host/relay.mjs +44 -26
- package/package.json +1 -1
- package/share/ceal-host/bundle-manifest.json +19 -11
- package/share/ceal-host/bundle-manifest.sigstore.json +1 -1
|
@@ -142,6 +142,7 @@ var CEAL_OPERATION_RECOVERY_KINDS = vocabulary(["none", "reconcile", "compensate
|
|
|
142
142
|
var CEAL_OPERATION_RECOVERY_STATUSES = vocabulary(["not_started", "active", "completed"]);
|
|
143
143
|
var CEAL_OPERATION_PROVIDER_READBACK_AVAILABILITY = vocabulary(["not_started", "not_applicable", "not_available", "pending", "available"]);
|
|
144
144
|
var CEAL_OPERATION_OFFERED_HANDOFF_STATES = vocabulary(["accepted", "rejected", "unknown"]);
|
|
145
|
+
var CEAL_OPERATION_RECEIPT_AUTHORITY_KEYS = Object.freeze(["instance_ref", "profile_ref", "principal_ref", "execution_subject_ref", "authority_revision_ref"]);
|
|
145
146
|
var CEAL_OPERATION_APPROVAL_DISPOSITIONS = vocabulary([
|
|
146
147
|
"approval_not_required_by_policy",
|
|
147
148
|
"interactive_pending",
|
|
@@ -398,7 +399,13 @@ var CEAL_OPERATION_JSON_SCHEMA_BUDGET = Object.freeze({
|
|
|
398
399
|
max_string_length: OPERATION_SCHEMA_LITERAL_MAX_BYTES / 4,
|
|
399
400
|
max_alternatives: 8,
|
|
400
401
|
max_enum_values: 64,
|
|
401
|
-
max_literal_bytes: OPERATION_SCHEMA_LITERAL_MAX_BYTES
|
|
402
|
+
max_literal_bytes: OPERATION_SCHEMA_LITERAL_MAX_BYTES,
|
|
403
|
+
/** @basis our_policy -- bounds explanatory schema prose carried in one catalog. */
|
|
404
|
+
max_description_characters: 1024,
|
|
405
|
+
/** @basis our_policy -- bounds regular-expression compilation input from one schema. */
|
|
406
|
+
max_pattern_characters: 256,
|
|
407
|
+
/** @basis our_policy -- bounds traversal work inside one already byte-bounded schema literal. */
|
|
408
|
+
max_literal_nodes: 512
|
|
402
409
|
});
|
|
403
410
|
|
|
404
411
|
// packages/ceal-client-protocol/src/operation-validation-primitives.ts
|
|
@@ -418,6 +425,9 @@ function requireIsoTimestamp(value, message) {
|
|
|
418
425
|
if (typeof value !== "string" || !ISO_TIMESTAMP.test(value) || !Number.isFinite(Date.parse(value))) throw new TypeError(message);
|
|
419
426
|
}
|
|
420
427
|
|
|
428
|
+
// packages/ceal-client-protocol/src/operation-json-schema.ts
|
|
429
|
+
var JSON_DESCRIPTION_CONTROL_CHARACTER = new RegExp("\\p{Cc}", "u");
|
|
430
|
+
|
|
421
431
|
// packages/ceal-client-protocol/src/operation-contract-validation.ts
|
|
422
432
|
var CEAL_OPERATION_AUTHORITY_POLICY_KEYS = Object.freeze(["profile", "instance_binding", "target", "admission_recheck"]);
|
|
423
433
|
var MAX_OPERATION_INPUT_RESOLVER_BINDINGS = 96;
|
|
@@ -518,7 +528,6 @@ var CEAL_BOUNDED_SERIES_CATALOG = Object.freeze({
|
|
|
518
528
|
control_commit: (root) => join(root, "control-auto-commit.jsonl"),
|
|
519
529
|
engagement_signal: (root) => join(root, "runtime-state", "slack-feedback.jsonl"),
|
|
520
530
|
runtime_error: (root) => join(root, "runtime-state", "runtime-errors.jsonl"),
|
|
521
|
-
provider_retry: (root) => join(root, "observability", "provider-retry-queue", "queue.jsonl"),
|
|
522
531
|
turn_bridge_request: (root) => join(root, ".ceal", "turn-bridge", "requests.jsonl"),
|
|
523
532
|
channel_log: (root) => join(root, "log.jsonl"),
|
|
524
533
|
thread_run_events: (root) => join(root, "run-events.jsonl"),
|
|
@@ -527,8 +536,6 @@ var CEAL_BOUNDED_SERIES_CATALOG = Object.freeze({
|
|
|
527
536
|
gateway_capability_audit: (root) => join(root, "capability-audit.jsonl"),
|
|
528
537
|
gateway_retrieval_waste_partition: (root) => `${root}.jsonl`,
|
|
529
538
|
gateway_access_policy_publication: (root) => join(root, "access-policy-publications.jsonl"),
|
|
530
|
-
gateway_event_lease_journal: (root) => `${root}.journal.jsonl`,
|
|
531
|
-
gateway_control_audit: (root) => `${root}.control-audits.jsonl`,
|
|
532
539
|
gateway_profile_connector_control_audit: (root) => `${root}.audit.jsonl`,
|
|
533
540
|
gateway_profile_connector_scope_audit: (root) => join(root, "profile-connector-scope-audit.jsonl"),
|
|
534
541
|
gateway_profile_connector_activity_scope_audit: (root) => join(root, "profile-connector-activity-scope-audit.jsonl"),
|
|
@@ -543,6 +550,11 @@ var CEAL_BOUNDED_SERIES_CATALOG = Object.freeze({
|
|
|
543
550
|
gateway_admin_access_token: (root) => join(root, "access-tokens.jsonl")
|
|
544
551
|
});
|
|
545
552
|
|
|
553
|
+
// packages/ceal-client-protocol/src/gateway-installation-activation.ts
|
|
554
|
+
var CEAL_GATEWAY_INSTALLATION_ACTIVATION_CODE_DATA_CHARACTERS = 32;
|
|
555
|
+
var CEAL_GATEWAY_INSTALLATION_ACTIVATION_CODE_CHECK_CHARACTERS = 8;
|
|
556
|
+
var CEAL_GATEWAY_INSTALLATION_ACTIVATION_CODE_COMPACT_CHARACTERS = CEAL_GATEWAY_INSTALLATION_ACTIVATION_CODE_DATA_CHARACTERS + CEAL_GATEWAY_INSTALLATION_ACTIVATION_CODE_CHECK_CHARACTERS;
|
|
557
|
+
|
|
546
558
|
// packages/ceal-client-protocol/src/host-registration.ts
|
|
547
559
|
var CEAL_HOST_REGISTRATION_RESULT_KEYS = Object.freeze(["credential_generation", "host_access_token", "host_installation_ref", "host_source_ref", "ok", "registration_attempt_ref", "schema_version", "status"]);
|
|
548
560
|
|
|
@@ -1131,7 +1143,7 @@ var CEAL_ACTOR_KINDS = vocabulary(["human", "bot", "app", "unknown"]);
|
|
|
1131
1143
|
// packages/ceal-client-protocol/src/leased-consumer-vocabulary.ts
|
|
1132
1144
|
var CEAL_TERMINAL_DISPOSITIONS = vocabulary(["completed", "failed", "cancelled"]);
|
|
1133
1145
|
var CEAL_LEASE_DISPOSITIONS = vocabulary([...CEAL_TERMINAL_DISPOSITIONS, "deferred"]);
|
|
1134
|
-
var CEAL_AUTOMATIC_FEEDBACK_INTENTS = vocabulary(["
|
|
1146
|
+
var CEAL_AUTOMATIC_FEEDBACK_INTENTS = vocabulary(["initial"]);
|
|
1135
1147
|
var CEAL_LEASED_MESSAGE_DELIVERY_CAPABILITY_IDS = vocabulary(["message.create", "message.update", "message.delete"]);
|
|
1136
1148
|
var CEAL_REPOSITORY_VISIBILITIES = vocabulary(["public", "private", "internal"]);
|
|
1137
1149
|
var CEAL_RESULT_DELIVERY_OFFERS = vocabulary(["pending", "offered", "transport_lost"]);
|
|
@@ -1372,6 +1384,7 @@ function skipWhitespace(text, start) {
|
|
|
1372
1384
|
import { createHash as createHash2 } from "node:crypto";
|
|
1373
1385
|
var HOST_PRODUCER_FRAME_SCHEMA = "ceal.host_producer_frame.v1";
|
|
1374
1386
|
var HOST_PRODUCER_MAX_JSON_BYTES = 262144;
|
|
1387
|
+
var HOST_PRODUCER_FRAME_LENGTH_BYTES = Uint32Array.BYTES_PER_ELEMENT;
|
|
1375
1388
|
var SAFE_REF2 = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
|
|
1376
1389
|
var DIGEST2 = /^[a-f0-9]{64}$/u;
|
|
1377
1390
|
var PRODUCERS = /* @__PURE__ */ new Set(["codex", "claude"]);
|
|
@@ -1391,18 +1404,18 @@ function encodeHostProducerFrame(frame) {
|
|
|
1391
1404
|
validateFrame(frame);
|
|
1392
1405
|
const json = Buffer.from(JSON.stringify(frame), "utf8");
|
|
1393
1406
|
if (json.byteLength > HOST_PRODUCER_MAX_JSON_BYTES) throw new HostProducerFrameError("frame_too_large", `frame_too_large: ${refusalFact("frame_bytes", json.byteLength, `at most ${HOST_PRODUCER_MAX_JSON_BYTES}`)}`);
|
|
1394
|
-
const result2 = Buffer.allocUnsafe(json.byteLength +
|
|
1407
|
+
const result2 = Buffer.allocUnsafe(json.byteLength + HOST_PRODUCER_FRAME_LENGTH_BYTES);
|
|
1395
1408
|
result2.writeUInt32BE(json.byteLength, 0);
|
|
1396
|
-
json.copy(result2,
|
|
1409
|
+
json.copy(result2, HOST_PRODUCER_FRAME_LENGTH_BYTES);
|
|
1397
1410
|
return result2;
|
|
1398
1411
|
}
|
|
1399
1412
|
function decodeHostProducerFrame(input) {
|
|
1400
|
-
if (input.byteLength <
|
|
1413
|
+
if (input.byteLength < HOST_PRODUCER_FRAME_LENGTH_BYTES) throw new HostProducerFrameError("frame_truncated", `frame_truncated: ${refusalFact("frame_bytes", input.byteLength, `at least ${HOST_PRODUCER_FRAME_LENGTH_BYTES}`)}`);
|
|
1401
1414
|
const length = input.readUInt32BE(0);
|
|
1402
1415
|
if (length > HOST_PRODUCER_MAX_JSON_BYTES) throw new HostProducerFrameError("frame_too_large", `frame_too_large: ${refusalFact("declared_bytes", length, `at most ${HOST_PRODUCER_MAX_JSON_BYTES}`)}`);
|
|
1403
1416
|
if (length === 0) throw new HostProducerFrameError("invalid_frame_length");
|
|
1404
|
-
if (input.byteLength !== length +
|
|
1405
|
-
const bytes2 = input.subarray(
|
|
1417
|
+
if (input.byteLength !== length + HOST_PRODUCER_FRAME_LENGTH_BYTES) throw new HostProducerFrameError(input.byteLength < length + HOST_PRODUCER_FRAME_LENGTH_BYTES ? "frame_truncated" : "invalid_frame_length");
|
|
1418
|
+
const bytes2 = input.subarray(HOST_PRODUCER_FRAME_LENGTH_BYTES);
|
|
1406
1419
|
const text = new TextDecoder("utf-8", { fatal: true });
|
|
1407
1420
|
let value;
|
|
1408
1421
|
try {
|
|
@@ -2429,6 +2442,7 @@ var HOST_REGISTRATION_STATE_KEYS = Object.freeze([
|
|
|
2429
2442
|
"status"
|
|
2430
2443
|
]);
|
|
2431
2444
|
var HOST_INGRESS_PATH = "/api/ceal/v2/host-ingress";
|
|
2445
|
+
var HOST_REGISTRATION_STATE_MAX_BYTES = 65536;
|
|
2432
2446
|
var HostRelayGatewayError = class extends Error {
|
|
2433
2447
|
name = "HostRelayGatewayError";
|
|
2434
2448
|
code;
|
|
@@ -2545,7 +2559,7 @@ async function readHostRegistrationAuthority(path, expectedHostSourceRef) {
|
|
|
2545
2559
|
const stats = await handle.stat();
|
|
2546
2560
|
if (!stats.isFile() || !ownerPrivate3(stats)) throw new HostRelayGatewayError("credential", "Host Relay credential file is not owner-private.");
|
|
2547
2561
|
const raw = await handle.readFile("utf8");
|
|
2548
|
-
if (raw
|
|
2562
|
+
if (Buffer.byteLength(raw, "utf8") > HOST_REGISTRATION_STATE_MAX_BYTES) throw new HostRelayGatewayError("credential", `Host registration state is invalid: ${refusalFact("registration_state_bytes", Buffer.byteLength(raw, "utf8"), `at most ${HOST_REGISTRATION_STATE_MAX_BYTES}`)}.`);
|
|
2549
2563
|
let value;
|
|
2550
2564
|
try {
|
|
2551
2565
|
value = JSON.parse(raw);
|
|
@@ -2628,6 +2642,7 @@ var HOST_RELAY_BINDING_QUERY_SCHEMA = "ceal.host_relay_binding_query.v1";
|
|
|
2628
2642
|
var HOST_RELAY_BINDING_RESULT_SCHEMA = "ceal.host_relay_binding_result.v1";
|
|
2629
2643
|
var HOST_RELAY_INVOCATION_CONTEXT_QUERY_SCHEMA = "ceal.host_relay_invocation_context_query.v1";
|
|
2630
2644
|
var HOST_RELAY_INVOCATION_CONTEXT_RESULT_SCHEMA = "ceal.host_relay_invocation_context_result.v1";
|
|
2645
|
+
var HOST_RELAY_IPC_LENGTH_BYTES = Uint32Array.BYTES_PER_ELEMENT;
|
|
2631
2646
|
var HostRelayIpcError = class extends Error {
|
|
2632
2647
|
code;
|
|
2633
2648
|
constructor(code, message = code) {
|
|
@@ -2647,9 +2662,9 @@ async function startHostRelayIpcServer(options) {
|
|
|
2647
2662
|
}
|
|
2648
2663
|
function encodeHostRelayIpcResponse(response2) {
|
|
2649
2664
|
const body = Buffer.from(JSON.stringify(response2), "utf8");
|
|
2650
|
-
const result2 = Buffer.allocUnsafe(body.length +
|
|
2665
|
+
const result2 = Buffer.allocUnsafe(body.length + HOST_RELAY_IPC_LENGTH_BYTES);
|
|
2651
2666
|
result2.writeUInt32BE(body.length, 0);
|
|
2652
|
-
body.copy(result2,
|
|
2667
|
+
body.copy(result2, HOST_RELAY_IPC_LENGTH_BYTES);
|
|
2653
2668
|
return result2;
|
|
2654
2669
|
}
|
|
2655
2670
|
function serveSocket(socket, admission, bindings, mintInvocationContext, quarantine, active, sockets) {
|
|
@@ -2673,23 +2688,23 @@ function serveSocket(socket, admission, bindings, mintInvocationContext, quarant
|
|
|
2673
2688
|
});
|
|
2674
2689
|
}
|
|
2675
2690
|
async function drainFrames(socket, state, admission, bindings, mintInvocationContext, quarantine, active) {
|
|
2676
|
-
while (!state.closed && state.buffer.length >=
|
|
2691
|
+
while (!state.closed && state.buffer.length >= HOST_RELAY_IPC_LENGTH_BYTES && await processBufferedRequest(socket, state, admission, bindings, mintInvocationContext, quarantine, active)) {
|
|
2677
2692
|
}
|
|
2678
2693
|
}
|
|
2679
2694
|
async function processBufferedRequest(socket, state, admission, bindings, mintInvocationContext, quarantine, active) {
|
|
2680
2695
|
const length = state.buffer.readUInt32BE(0);
|
|
2681
2696
|
if (length === 0 || length > HOST_PRODUCER_MAX_JSON_BYTES) {
|
|
2682
2697
|
const code = length === 0 ? "invalid_frame_length" : "frame_too_large";
|
|
2683
|
-
const raw = state.buffer.subarray(0, Math.min(state.buffer.length, length +
|
|
2698
|
+
const raw = state.buffer.subarray(0, Math.min(state.buffer.length, length + HOST_RELAY_IPC_LENGTH_BYTES));
|
|
2684
2699
|
await quarantine.retainMalformed(raw, code);
|
|
2685
2700
|
writeResponse(socket, errorResponse(code));
|
|
2686
2701
|
state.buffer = Buffer.alloc(0);
|
|
2687
2702
|
socket.end();
|
|
2688
2703
|
return false;
|
|
2689
2704
|
}
|
|
2690
|
-
if (state.buffer.length < length +
|
|
2691
|
-
const encoded = state.buffer.subarray(0, length +
|
|
2692
|
-
state.buffer = state.buffer.subarray(length +
|
|
2705
|
+
if (state.buffer.length < length + HOST_RELAY_IPC_LENGTH_BYTES) return false;
|
|
2706
|
+
const encoded = state.buffer.subarray(0, length + HOST_RELAY_IPC_LENGTH_BYTES);
|
|
2707
|
+
state.buffer = state.buffer.subarray(length + HOST_RELAY_IPC_LENGTH_BYTES);
|
|
2693
2708
|
let request2;
|
|
2694
2709
|
try {
|
|
2695
2710
|
request2 = decodeIpcRequest(encoded);
|
|
@@ -2797,22 +2812,22 @@ function validQueryIdentity(value, schema) {
|
|
|
2797
2812
|
return record4(value) && value.schema_version === schema && (value.producer_id === "codex" || value.producer_id === "claude") && safeRef3(value.producer_installation_ref) && safeRef3(value.local_session_ref) && safeRef3(value.local_turn_ref);
|
|
2798
2813
|
}
|
|
2799
2814
|
function decodeLengthPrefixedJson(input, maximum) {
|
|
2800
|
-
if (input.length <
|
|
2815
|
+
if (input.length < HOST_RELAY_IPC_LENGTH_BYTES) return null;
|
|
2801
2816
|
const length = input.readUInt32BE(0);
|
|
2802
2817
|
if (length === 0 || length > maximum) throw new HostRelayIpcError("relay_unavailable", `Host Relay IPC message length is invalid: ${refusalFact("declared_bytes", length, `between 1 and ${maximum}`)}.`);
|
|
2803
|
-
if (input.length < length +
|
|
2804
|
-
if (input.length !== length +
|
|
2818
|
+
if (input.length < length + HOST_RELAY_IPC_LENGTH_BYTES) return null;
|
|
2819
|
+
if (input.length !== length + HOST_RELAY_IPC_LENGTH_BYTES) throw new HostRelayIpcError("relay_unavailable", `Host Relay IPC message has trailing bytes: ${refusalFacts([{ name: "declared_bytes", value: length, expected: `the received message length minus ${HOST_RELAY_IPC_LENGTH_BYTES}` }, { name: "received_bytes", value: input.byteLength, expected: `exactly ${length + HOST_RELAY_IPC_LENGTH_BYTES}` }])}.`);
|
|
2805
2820
|
try {
|
|
2806
|
-
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(input.subarray(
|
|
2821
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(input.subarray(HOST_RELAY_IPC_LENGTH_BYTES)));
|
|
2807
2822
|
} catch {
|
|
2808
2823
|
throw new HostRelayIpcError("relay_unavailable", "Host Relay IPC message is invalid.");
|
|
2809
2824
|
}
|
|
2810
2825
|
}
|
|
2811
2826
|
function encodeLengthPrefixed(value) {
|
|
2812
2827
|
const body = Buffer.from(JSON.stringify(value), "utf8");
|
|
2813
|
-
const output = Buffer.allocUnsafe(body.length +
|
|
2828
|
+
const output = Buffer.allocUnsafe(body.length + HOST_RELAY_IPC_LENGTH_BYTES);
|
|
2814
2829
|
output.writeUInt32BE(body.length, 0);
|
|
2815
|
-
body.copy(output,
|
|
2830
|
+
body.copy(output, HOST_RELAY_IPC_LENGTH_BYTES);
|
|
2816
2831
|
return output;
|
|
2817
2832
|
}
|
|
2818
2833
|
function exactKeys4(value, keys) {
|
|
@@ -2849,6 +2864,9 @@ function errorCode7(error) {
|
|
|
2849
2864
|
|
|
2850
2865
|
// host/relay/src/host-relay-runtime.ts
|
|
2851
2866
|
var HOST_RELAY_CONFIG_SCHEMA = "ceal.host_relay_config.v1";
|
|
2867
|
+
var HOST_RELAY_SERVE_COMMAND_PREFIX = ["serve", "--config"];
|
|
2868
|
+
var HOST_RELAY_CONFIG_MIN_BYTES = Buffer.byteLength("{}", "utf8");
|
|
2869
|
+
var HOST_RELAY_CONFIG_MAX_BYTES = 65536;
|
|
2852
2870
|
var HostRelayConfigError = class extends Error {
|
|
2853
2871
|
name = "HostRelayConfigError";
|
|
2854
2872
|
code;
|
|
@@ -2865,7 +2883,7 @@ async function readHostRelayConfig(path) {
|
|
|
2865
2883
|
handle = await open4(path, O_RDONLY4 | O_NOFOLLOW3);
|
|
2866
2884
|
const stats = await handle.stat();
|
|
2867
2885
|
if (!stats.isFile() || !ownerPrivate4(stats)) throw new HostRelayConfigError("config_not_private", "Host Relay config file is not owner-private.");
|
|
2868
|
-
if (stats.size <
|
|
2886
|
+
if (stats.size < HOST_RELAY_CONFIG_MIN_BYTES || stats.size > HOST_RELAY_CONFIG_MAX_BYTES) throw new HostRelayConfigError("invalid_config", `invalid_config: Host Relay config size is invalid: ${refusalFact("config_bytes", stats.size, `between ${HOST_RELAY_CONFIG_MIN_BYTES} and ${HOST_RELAY_CONFIG_MAX_BYTES}`)}.`);
|
|
2869
2887
|
const text = await handle.readFile("utf8");
|
|
2870
2888
|
assertNoDuplicateJsonKeys(text);
|
|
2871
2889
|
let value;
|
|
@@ -2934,7 +2952,7 @@ async function runHostRelayCli(args, signal, dependencies = {}) {
|
|
|
2934
2952
|
}
|
|
2935
2953
|
}
|
|
2936
2954
|
function parseServeArgs(args) {
|
|
2937
|
-
if (args.length !==
|
|
2955
|
+
if (args.length !== HOST_RELAY_SERVE_COMMAND_PREFIX.length + 1 || args[0] !== HOST_RELAY_SERVE_COMMAND_PREFIX[0] || args[1] !== HOST_RELAY_SERVE_COMMAND_PREFIX[1] || !isAbsoluteNormalizedNonRootPath(args[2], process.platform, true)) {
|
|
2938
2956
|
throw new HostRelayConfigError("invalid_config_path", `invalid_config_path: Use: relay.mjs serve --config <absolute-owner-private-json>: ${refusalFact("args", args, "serve --config <absolute normalized non-root path>")}.`);
|
|
2939
2957
|
}
|
|
2940
2958
|
return args[2];
|
package/package.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"product": "ceal-host",
|
|
4
4
|
"version_source": {
|
|
5
5
|
"product": "ceal-host",
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.7"
|
|
7
7
|
},
|
|
8
8
|
"source": {
|
|
9
9
|
"repository": "corca-ai/ceal",
|
|
10
|
-
"commit": "
|
|
11
|
-
"tree": "
|
|
10
|
+
"commit": "a8d2e68372289765d006db4dfa5a3153e2401cd0",
|
|
11
|
+
"tree": "7e9df152ec5dd90a6eb54d4811b9b8af6c1673ea"
|
|
12
12
|
},
|
|
13
13
|
"target": "windows-x64",
|
|
14
14
|
"required_features": [],
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
],
|
|
20
20
|
"executable": true,
|
|
21
21
|
"path": "bin/ceal-host.exe",
|
|
22
|
-
"sha256": "
|
|
22
|
+
"sha256": "27328ae848c8d3113485b773859899ce41090caa32fb232093f831fc699675c3"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"owners": [
|
|
@@ -27,7 +27,15 @@
|
|
|
27
27
|
],
|
|
28
28
|
"executable": false,
|
|
29
29
|
"path": "libexec/ceal-host/claude-hook.mjs",
|
|
30
|
-
"sha256": "
|
|
30
|
+
"sha256": "5d38cedda3a1178ff9debf2455ab60e5e1adaf74bcd7a6af7d7a26113360df3a"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"owners": [
|
|
34
|
+
"claude"
|
|
35
|
+
],
|
|
36
|
+
"executable": false,
|
|
37
|
+
"path": "libexec/ceal-host/claude-invocation-authentication.mjs",
|
|
38
|
+
"sha256": "cd3e714180a62b24f3b248f63c5f0111dbd6d60ab903f273d25b99d809479eae"
|
|
31
39
|
},
|
|
32
40
|
{
|
|
33
41
|
"owners": [
|
|
@@ -35,7 +43,7 @@
|
|
|
35
43
|
],
|
|
36
44
|
"executable": false,
|
|
37
45
|
"path": "libexec/ceal-host/claude-producer.mjs",
|
|
38
|
-
"sha256": "
|
|
46
|
+
"sha256": "d87bace242f088ead68e6b648c590255673b1169e06d17255fe54c1320319c2d"
|
|
39
47
|
},
|
|
40
48
|
{
|
|
41
49
|
"owners": [
|
|
@@ -43,7 +51,7 @@
|
|
|
43
51
|
],
|
|
44
52
|
"executable": false,
|
|
45
53
|
"path": "libexec/ceal-host/codex-hook.mjs",
|
|
46
|
-
"sha256": "
|
|
54
|
+
"sha256": "b91ec9e7c482bbb3bb8a4a365070babcfc898ce6533083bb214dacb518b23665"
|
|
47
55
|
},
|
|
48
56
|
{
|
|
49
57
|
"owners": [
|
|
@@ -51,7 +59,7 @@
|
|
|
51
59
|
],
|
|
52
60
|
"executable": false,
|
|
53
61
|
"path": "libexec/ceal-host/codex-invocation-authentication.mjs",
|
|
54
|
-
"sha256": "
|
|
62
|
+
"sha256": "3056f3ea26ae59faa5ab4e1a1eef548ef4760584a337ffb480216607dc3c97a3"
|
|
55
63
|
},
|
|
56
64
|
{
|
|
57
65
|
"owners": [
|
|
@@ -59,7 +67,7 @@
|
|
|
59
67
|
],
|
|
60
68
|
"executable": false,
|
|
61
69
|
"path": "libexec/ceal-host/codex-producer.mjs",
|
|
62
|
-
"sha256": "
|
|
70
|
+
"sha256": "9d17c53f736030fe0950082de48aac493565700490f5600f848c918ccdf7ddc7"
|
|
63
71
|
},
|
|
64
72
|
{
|
|
65
73
|
"owners": [
|
|
@@ -67,7 +75,7 @@
|
|
|
67
75
|
],
|
|
68
76
|
"executable": false,
|
|
69
77
|
"path": "libexec/ceal-host/control.mjs",
|
|
70
|
-
"sha256": "
|
|
78
|
+
"sha256": "31ca0d6e9d224737cf9d91fe6a3c91a6756a067c7e28f7a90f4b45e443dbb33b"
|
|
71
79
|
},
|
|
72
80
|
{
|
|
73
81
|
"owners": [
|
|
@@ -83,7 +91,7 @@
|
|
|
83
91
|
],
|
|
84
92
|
"executable": false,
|
|
85
93
|
"path": "libexec/ceal-host/relay.mjs",
|
|
86
|
-
"sha256": "
|
|
94
|
+
"sha256": "e41da7308e4c59f67b86b8e6fb5516fc5ed8218817dda1790b2e619071f776da"
|
|
87
95
|
}
|
|
88
96
|
]
|
|
89
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"
|
|
1
|
+
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHDTCCBpOgAwIBAgIUZ38mm05zd5+67J62K7Z4Oio9ysswCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTE2MDkxNDMwWhcNMjYwOTE2MDkyNDMwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtxXj68MHJcFk8lAhWHD63UZ4MquvXrE585OyqW+kJetSjpLeiad9sqGSLcroBtwt/kA+r5Rhm7MKrEakAESqMaOCBbIwggWuMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUHB0LdSwU3Dlnf4v514gMdMWyqJQwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wZgYDVR0RAQH/BFwwWoZYaHR0cHM6Ly9naXRodWIuY29tL2NvcmNhLWFpL2NlYWwvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS1jYW5kaWRhdGUueW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKGE4ZDJlNjgzNzIyODk3NjVkMDA2ZGI0ZGZhNWEzMTUzZTI0MDFjZDAwJAYKKwYBBAGDvzABBAQWQ2VhbCByZWxlYXNlIGNhbmRpZGF0ZTAbBgorBgEEAYO/MAEFBA1jb3JjYS1haS9jZWFsMB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20waAYKKwYBBAGDvzABCQRaDFhodHRwczovL2dpdGh1Yi5jb20vY29yY2EtYWkvY2VhbC8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLWNhbmRpZGF0ZS55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoYThkMmU2ODM3MjI4OTc2NWQwMDZkYjRkZmE1YTMxNTNlMjQwMWNkMDAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwMAYKKwYBBAGDvzABDAQiDCBodHRwczovL2dpdGh1Yi5jb20vY29yY2EtYWkvY2VhbDA4BgorBgEEAYO/MAENBCoMKGE4ZDJlNjgzNzIyODk3NjVkMDA2ZGI0ZGZhNWEzMTUzZTI0MDFjZDAwHwYKKwYBBAGDvzABDgQRDA9yZWZzL2hlYWRzL21haW4wGgYKKwYBBAGDvzABDwQMDAoxMTkxNTU0NTkzMCsGCisGAQQBg78wARAEHQwbaHR0cHM6Ly9naXRodWIuY29tL2NvcmNhLWFpMBgGCisGAQQBg78wAREECgwINzI5Nzg4NjAwaAYKKwYBBAGDvzABEgRaDFhodHRwczovL2dpdGh1Yi5jb20vY29yY2EtYWkvY2VhbC8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLWNhbmRpZGF0ZS55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wARMEKgwoYThkMmU2ODM3MjI4OTc2NWQwMDZkYjRkZmE1YTMxNTNlMjQwMWNkMDAhBgorBgEEAYO/MAEUBBMMEXdvcmtmbG93X2Rpc3BhdGNoMFQGCisGAQQBg78wARUERgxEaHR0cHM6Ly9naXRodWIuY29tL2NvcmNhLWFpL2NlYWwvYWN0aW9ucy9ydW5zLzM1MDc3NTUyMDA4L2F0dGVtcHRzLzEwFwYKKwYBBAGDvzABFgQJDAdwcml2YXRlMDYGCisGAQQBg78wARgEKAwmcmVwbzpjb3JjYS1haS9jZWFsOnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAaCpfwlAAAAEAwBHMEUCIFP9pHpZBdmKukit7Ezmvs2njh72wdUX6ibbNOU32xOgAiEA6gdU357o217ckm/0NpDjiv/OQof/SICIxVFlxOI/uPUwCgYIKoZIzj0EAwMDaAAwZQIwTKXYCQNFTNN5hHm84OsE9Ugb2UVggh35+CaRI58LdoVBBLsGvslc9TPBkE159TdCAjEAsoLO7cHpHIqlNglEMC8XGSexDUrKXITmbI7Fi7g56OR6pRHEI9UYnUAa4zPQmSUC"},"tlogEntries":[{"logIndex":"2858466272","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1789550070","inclusionPromise":{"signedEntryTimestamp":"MEUCIQDiF5nV4Mt6LSIaIh9DM5xjly0PEaFQ+fuhhxfNzB7ySQIgKIisBJO479klCpXvdtwzsTUOCjVjMHMDjS4fL34MWvI="},"inclusionProof":{"logIndex":"2736562010","rootHash":"bnus1pcYPiJKfEui+8wiHi4Y1fkOPx3fNoxAfcN6wnI=","treeSize":"2736562015","hashes":["/j84qo4igSCtxTxvt12SZfZ/xkQmpxOuNXuVpsxLdQQ=","sGCAULLT4ILqAIQRE5LM4yLerMSZJPetQQne8FOlrvs=","hP/7gJMF1cagXxGi6iWZm1+p/GGNmKGPg/xUV8bORVw=","j4AbHhpES+b5VkPFkLDk4yfgLD8UgJZBlI/zxM+fpz8=","jt/wuoeqJKg64rSEGp8eJ6q7tdr9iCRhzRVxqBLAfj8=","lJWF7fD8svJ/gj8o5xQb1TwjSs+8FrhxdXifb95LRT0=","sNnDtIUPNqmm1Fx1QJRdOJtjXNpFpPwn3lnmfHv8ju8=","m3YO7nPrj+FMoYESXrJ0umhoFIG11zFVYeEhPCDg4z0=","awPmL5bGIELflE6W9kwonBK7FlPH86Bgy1F2/M6FHXs=","jFjGo6VJPBdBZS0IQT2SFWeCHafVY/GIVxsb4rVn5Uc=","EPvjiG9k0nRuUUDSiEMTlFyOaKfz+TNIMltVVL91vV4=","5+SCCtj7/SurODJSftta27gfnuDkHqX53akXW2hhyzA=","n+hxEhyY8wOf+95n5A1RtNWPjG3kTLmhzLyAzxUY9xA=","imrIvZj6JTyKLlSm0Orl7ea26tZp+b9u+qI7QmzJJEM=","bUR40APIlDp+hSRs9Sn61sQzjB3I1nWW/EVYUSplyQk=","gGfwuhE97xnhmxu6exffPtS05ABS4/ldyg66sFcxSRE=","jhevWFOJ2cWU6SvzMnAe08zHGcVquRlP7gAed39+wI4=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2736562015\nbnus1pcYPiJKfEui+8wiHi4Y1fkOPx3fNoxAfcN6wnI=\n\n— rekor.sigstore.dev wNI9ajBFAiEAvTcwWnXOmDJZEyx9mXUStsqKPCAvylmSWxfi3/8wlfcCIBIF3H6YMchHCNTAX5xtvSg1VD0Vhb7WeTHnjasvqzez\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzMmVlYjcwYzU5ODBmYTMwNzMzZDJlYWM2MjY5NTAwYWJlYjA4NjllMGU4ZTkxOTZlZmY5NWNkZDA0ODM1MzdlIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJSGQyTkZwNEVVRnArQjFuUHh0Z0YyVGo1WlJYNXRrMVlKZFJRK3NWY0FnakFpRUFrNFpUSGw4NlJWUmhCNTBZM3F4cFBUcDdoT2JoNEg0bEVFSW1KcHZzZnI0PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaEVWRU5EUW5CUFowRjNTVUpCWjBsVldqTTRiVzB3Tlhwa05TczJOMG8yTWtzM1dqUlBhVzg1ZVhOemQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUlRKTlJHdDRUa1JOZDFkb1kwNU5hbGwzVDFSRk1rMUVhM2xPUkUxM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVYwZUZocU5qaE5TRXBqUm1zNGJFRm9WMGhFTmpOVldqUk5jWFYyV0hKRk5UZzFUM2tLY1ZjcmEwcGxkRk5xY0V4bGFXRmtPWE54UjFOTVkzSnZRblIzZEM5clFTdHlOVkpvYlRkTlMzSkZZV3RCUlZOeFRXRlBRMEppU1hkbloxZDFUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZJUWpCTUNtUlRkMVV6Ukd4dVpqUjJOVEUwWjAxa1RWZDVjVXBSZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDFwbldVUldVakJTUVZGSUwwSkdkM2RYYjFwWllVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKT2RtTnRUbWhNVjBad1RESk9iQXBaVjNkMlRHMWtjR1JIYURGWmFUa3pZak5LY2xwdGVIWmtNMDEyWTIxV2MxcFhSbnBhVXpGcVdWYzFhMkZYVW1oa1IxVjFaVmN4YzFGSVNteGFiazEyQ21GSFZtaGFTRTEyWWxkR2NHSnFRVFZDWjI5eVFtZEZSVUZaVHk5TlFVVkNRa04wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUNPRWREYVhOSFFWRlJRbWMzT0hkQlVVbEZSVmhrZG1OdGRHMWlSemt6V0RKU2NBcGpNMEpvWkVkT2IwMUVXVWREYVhOSFFWRlJRbWMzT0hkQlVVMUZTMGRGTkZwRVNteE9hbWQ2VG5wSmVVOUVhek5PYWxaclRVUkJNbHBIU1RCYVIxcG9DazVYUlhwTlZGVjZXbFJKTUUxRVJtcGFSRUYzU2tGWlMwdDNXVUpDUVVkRWRucEJRa0pCVVZkUk1sWm9Za05DZVZwWGVHeFpXRTVzU1VkT2FHSnRVbkFLV2tkR01GcFVRV0pDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0V4YW1JelNtcFpVekZvWVZNNWFscFhSbk5OUWpCSFEybHpSMEZSVVVKbk56aDNRVkZaUlFwRU0wcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRVGRDWjI5eVFtZEZSVUZaVHk5TlFVVkpRa013VFVzeWFEQmtTRUo2VDJrNGRtUkhPWEphVnpSMUNsbFhUakJoVnpsMVkzazFibUZZVW05a1Ywb3hZekpXZVZreU9YVmtSMVoxWkVNMWFtSXlNSGRoUVZsTFMzZFpRa0pCUjBSMmVrRkNRMUZTWVVSR2FHOEtaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV3BpTWpCMldUSTVlVmt5UlhSWlYydDJXVEpXYUdKRE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNd3BqZVRsNVdsZDRiRmxZVG14TVYwNW9ZbTFTY0ZwSFJqQmFVelUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVVJuUjBOcGMwZEJVVkZDQ21jM09IZEJVVzlGUzJkM2IxbFVhR3ROYlZVeVQwUk5NMDFxU1RSUFZHTXlUbGRSZDAxRVdtdFphbEpyV20xRk1WbFVUWGhPVkU1c1RXcFJkMDFYVG1zS1RVUkJaRUpuYjNKQ1owVkZRVmxQTDAxQlJVeENRVGhOUkZka2NHUkhhREZaYVRGdllqTk9NRnBYVVhkTlFWbExTM2RaUWtKQlIwUjJla0ZDUkVGUmFRcEVRMEp2WkVoU2QyTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJXVEk1ZVZreVJYUlpWMnQyV1RKV2FHSkVRVFJDWjI5eVFtZEZSVUZaVHk5TlFVVk9Da0pEYjAxTFIwVTBXa1JLYkU1cVozcE9la2w1VDBSck0wNXFWbXROUkVFeVdrZEpNRnBIV21oT1YwVjZUVlJWZWxwVVNUQk5SRVpxV2tSQmQwaDNXVXNLUzNkWlFrSkJSMFIyZWtGQ1JHZFJVa1JCT1hsYVYxcDZUREpvYkZsWFVucE1NakZvWVZjMGQwZG5XVXRMZDFsQ1FrRkhSSFo2UVVKRWQxRk5SRUZ2ZUFwTlZHdDRUbFJWTUU1VWEzcE5RM05IUTJselIwRlJVVUpuTnpoM1FWSkJSVWhSZDJKaFNGSXdZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWs1MkNtTnRUbWhNVjBad1RVSm5SME5wYzBkQlVWRkNaemM0ZDBGU1JVVkRaM2RKVG5wSk5VNTZaelJPYWtGM1lVRlpTMHQzV1VKQ1FVZEVkbnBCUWtWblVtRUtSRVpvYjJSSVVuZGplbTkyVERKa2NHUkhhREZaYVRWcVlqSXdkbGt5T1hsWk1rVjBXVmRyZGxreVZtaGlRemgxV2pKc01HRklWbWxNTTJSMlkyMTBiUXBpUnprelkzazVlVnBYZUd4WldFNXNURmRPYUdKdFVuQmFSMFl3V2xNMU5XSlhlRUZqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxRVowZERhWE5IQ2tGUlVVSm5OemgzUVZKTlJVdG5kMjlaVkdoclRXMVZNazlFVFROTmFrazBUMVJqTWs1WFVYZE5SRnByV1dwU2ExcHRSVEZaVkUxNFRsUk9iRTFxVVhjS1RWZE9hMDFFUVdoQ1oyOXlRbWRGUlVGWlR5OU5RVVZWUWtKTlRVVllaSFpqYlhSdFlrYzVNMWd5VW5Cak0wSm9aRWRPYjAxR1VVZERhWE5IUVZGUlFncG5OemgzUVZKVlJWSm5lRVZoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NazUyWTIxT2FFeFhSbkJNTWs1c1dWZDNkbGxYVGpCaFZ6bDFDbU41T1hsa1Z6VjZUSHBOTVUxRVl6Tk9WRlY1VFVSQk5Fd3lSakJrUjFaMFkwaFNla3g2UlhkR2QxbExTM2RaUWtKQlIwUjJla0ZDUm1kUlNrUkJaSGNLWTIxc01sbFlVbXhOUkZsSFEybHpSMEZSVVVKbk56aDNRVkpuUlV0QmQyMWpiVlozWW5wd2FtSXpTbXBaVXpGb1lWTTVhbHBYUm5OUGJrcHNXbXB3ZVFwYVYxcDZUREpvYkZsWFVucE1NakZvWVZjMGQyZFpiMGREYVhOSFFWRlJRakZ1YTBOQ1FVbEZaa0ZTTmtGSVowRmtaMFJrVUZSQ2NYaHpZMUpOYlUxYUNraG9lVnBhZW1ORGIydHdaWFZPTkRoeVppdElhVzVMUVV4NWJuVnFaMEZCUVdGRGNHWjNiRUZCUVVGRlFYZENTRTFGVlVOSlJsQTVjRWh3V2tKa2JVc0tkV3RwZERkRmVtMTJjekp1YW1nM01uZGtWVmcyYVdKaVRrOVZNeko0VDJkQmFVVkJObWRrVlRNMU4yOHlNVGRqYTIwdk1FNXdSR3BwZGk5UFVXOW1Md3BUU1VOSmVGWkdiSGhQU1M5MVVGVjNRMmRaU1V0dldrbDZhakJGUVhkTlJHRkJRWGRhVVVsM1ZFdFlXVU5SVGtaVVRrNDFhRWh0T0RSUGMwVTVWV2RpQ2pKVlZtZG5hRE0xSzBOaFVrazFPRXhrYjFaQ1FreHpSM1p6YkdNNVZGQkNhMFV4TlRsVVpFTkJha1ZCYzI5TVR6ZGpTSEJJU1hGc1RtZHNSVTFET0ZnS1IxTmxlRVJWY2t0WVNWUnRZa2szUm1rM1p6VTJUMUkyY0ZKSVJVazVWVmx1VlVGaE5IcFFVVzFUVlVNS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}]},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"Mu63DFmA+jBzPS6sYmlQCr6whp4OjpGW7/lc3QSDU34="},"signature":"MEUCIHd2NFp4EUFp+B1nPxtgF2Tj5ZRX5tk1YJdRQ+sVcAgjAiEAk4ZTHl86RVRhB50Y3qxpPTp7hObh4H4lEEImJpvsfr4="}}
|