@corca-org/ceal-host-win32-x64 1.0.6 → 1.0.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/bin/ceal-host.exe +0 -0
- package/libexec/ceal-host/claude-hook.mjs +3 -0
- package/libexec/ceal-host/codex-invocation-authentication.mjs +2 -2
- package/libexec/ceal-host/control.mjs +43 -38
- package/package.json +1 -1
- package/share/ceal-host/bundle-manifest.json +7 -7
- package/share/ceal-host/bundle-manifest.sigstore.json +1 -1
package/bin/ceal-host.exe
CHANGED
|
Binary file
|
|
@@ -2420,6 +2420,9 @@ var DOCTOR_FLAGS = Object.freeze({
|
|
|
2420
2420
|
// host/client-doctor.ts
|
|
2421
2421
|
var execFileAsync = promisify(execFile);
|
|
2422
2422
|
|
|
2423
|
+
// host/claude/src/claude-installer.ts
|
|
2424
|
+
var CLAUDE_LOCAL_CAPABILITY_ACTIVATION = Object.freeze({ environment: "CLAUDE_CODE_ENTRYPOINT", value: "cli" });
|
|
2425
|
+
|
|
2423
2426
|
// host/claude/bin/ceal-claude-hook.ts
|
|
2424
2427
|
async function main() {
|
|
2425
2428
|
return runClaudeHookCli();
|
|
@@ -2201,7 +2201,7 @@ function boundedMilliseconds(value) {
|
|
|
2201
2201
|
import { createHash as createHash3 } from "node:crypto";
|
|
2202
2202
|
|
|
2203
2203
|
// host/codex/src/codex-types.ts
|
|
2204
|
-
var
|
|
2204
|
+
var CODEX_THREAD_ID_ENVIRONMENT = "CODEX_THREAD_ID";
|
|
2205
2205
|
var CODEX_OUTBOX_SCHEMA_VERSION = "ceal.codex_observation_outbox.v1";
|
|
2206
2206
|
var CODEX_TURN_BINDING_SCHEMA_VERSION = "ceal.codex_turn_binding.v1";
|
|
2207
2207
|
var CODEX_SESSION_SCHEMA_VERSION = "ceal.codex_session.v1";
|
|
@@ -3966,7 +3966,7 @@ var CODEX_INVOCATION_AUTHENTICATION_DESCRIPTOR = {
|
|
|
3966
3966
|
command_name: "ceal-codex-invocation-authentication",
|
|
3967
3967
|
producer_id: "codex",
|
|
3968
3968
|
create_store: (directory) => new CodexOutboxStore(directory),
|
|
3969
|
-
session_id_env:
|
|
3969
|
+
session_id_env: CODEX_THREAD_ID_ENVIRONMENT,
|
|
3970
3970
|
session_ref: hostSessionReference,
|
|
3971
3971
|
config_flag: HOST_PRODUCER_CONFIG_FLAG,
|
|
3972
3972
|
parse_config_flag: parseHostProducerConfigFlag,
|
|
@@ -2897,7 +2897,7 @@ var CEAL_REQUEST_RUN_BATCH_JSON_SCHEMA = {
|
|
|
2897
2897
|
};
|
|
2898
2898
|
|
|
2899
2899
|
// packages/ceal-client-protocol/src/host-observation.ts
|
|
2900
|
-
var CEAL_LOCAL_HOST_CAPABILITIES_SCHEMA_VERSION = "ceal.local_host_capabilities.
|
|
2900
|
+
var CEAL_LOCAL_HOST_CAPABILITIES_SCHEMA_VERSION = "ceal.local_host_capabilities.v7";
|
|
2901
2901
|
var CEAL_HOST_OBSERVATION_REF_PREFIX = "host-observation:";
|
|
2902
2902
|
var HOST_OBSERVATION_PRODUCER = /^[a-z][a-z0-9]{0,31}$/u;
|
|
2903
2903
|
var HOST_OBSERVATION_DIGEST = /^[a-f0-9]{8,64}$/u;
|
|
@@ -4181,7 +4181,8 @@ var CODEX_CLI_VERSION = "0.152.0";
|
|
|
4181
4181
|
var CODEX_HOOK_FEATURE = "hooks";
|
|
4182
4182
|
var CODEX_HOOKS_CONFIG_FILE = "hooks.json";
|
|
4183
4183
|
var CODEX_HOOK_OWNER = "ceal-codex-host-observation-v1";
|
|
4184
|
-
var
|
|
4184
|
+
var CODEX_THREAD_ID_ENVIRONMENT = "CODEX_THREAD_ID";
|
|
4185
|
+
var CODEX_SESSION_ID_ENVIRONMENT = "CODEX_SESSION_ID";
|
|
4185
4186
|
var CODEX_OUTBOX_SCHEMA_VERSION = "ceal.codex_observation_outbox.v1";
|
|
4186
4187
|
var CODEX_TURN_BINDING_SCHEMA_VERSION = "ceal.codex_turn_binding.v1";
|
|
4187
4188
|
var CODEX_SESSION_SCHEMA_VERSION = "ceal.codex_session.v1";
|
|
@@ -6256,7 +6257,7 @@ function hostLocalCapabilityDescriptor(input) {
|
|
|
6256
6257
|
return {
|
|
6257
6258
|
schema_version: CEAL_LOCAL_HOST_CAPABILITIES_SCHEMA_VERSION,
|
|
6258
6259
|
owner: input.owner,
|
|
6259
|
-
...input.
|
|
6260
|
+
...input.activation === void 0 ? {} : { activation: input.activation },
|
|
6260
6261
|
authentication: { mode: "nonce", execution: { mode: "verbatim", argv: [...argv, "authenticate", "--client-nonce"] } },
|
|
6261
6262
|
capabilities: []
|
|
6262
6263
|
};
|
|
@@ -6264,7 +6265,7 @@ function hostLocalCapabilityDescriptor(input) {
|
|
|
6264
6265
|
|
|
6265
6266
|
// host/claude/src/claude-installer.ts
|
|
6266
6267
|
var OWNER = "ceal-claude-host-observation-v1";
|
|
6267
|
-
var
|
|
6268
|
+
var CLAUDE_LOCAL_CAPABILITY_ACTIVATION = Object.freeze({ environment: "CLAUDE_CODE_ENTRYPOINT", value: "cli" });
|
|
6268
6269
|
function resolveClaudeSettingsPath(claudeHome, environment = process.env) {
|
|
6269
6270
|
return join8(claudeHome ?? environment.CLAUDE_CONFIG_DIR ?? join8(homedir2(), ".claude"), "settings.json");
|
|
6270
6271
|
}
|
|
@@ -6321,7 +6322,7 @@ async function doctorClaudeHooks(options) {
|
|
|
6321
6322
|
return { status, settings_path: settingsPath, configured_events: configured, missing_events: missing, ...executableSha256 === void 0 ? {} : { executable_sha256: executableSha256 }, drift_reasons: reasons };
|
|
6322
6323
|
}
|
|
6323
6324
|
function claudeLocalCapabilityDescriptor(authenticationCommand) {
|
|
6324
|
-
return hostLocalCapabilityDescriptor({ owner: OWNER, authenticationCommand,
|
|
6325
|
+
return hostLocalCapabilityDescriptor({ owner: OWNER, authenticationCommand, activation: CLAUDE_LOCAL_CAPABILITY_ACTIVATION });
|
|
6325
6326
|
}
|
|
6326
6327
|
async function installClaudeLocalCapability(path, authenticationCommand) {
|
|
6327
6328
|
if (!isAbsolute3(path)) throw new ClaudeHostError("configuration", "Claude local capability path must be absolute.");
|
|
@@ -6607,7 +6608,7 @@ async function validateAuthenticationCommand(command) {
|
|
|
6607
6608
|
}
|
|
6608
6609
|
}
|
|
6609
6610
|
function codexLocalCapabilityDescriptor(authenticationCommand) {
|
|
6610
|
-
return hostLocalCapabilityDescriptor({ owner: CODEX_LOCAL_CAPABILITY_OWNER, authenticationCommand,
|
|
6611
|
+
return hostLocalCapabilityDescriptor({ owner: CODEX_LOCAL_CAPABILITY_OWNER, authenticationCommand, activation: { environment: CODEX_THREAD_ID_ENVIRONMENT, value: { environment: CODEX_SESSION_ID_ENVIRONMENT } } });
|
|
6611
6612
|
}
|
|
6612
6613
|
async function installCodexLocalCapability(path, authenticationCommand) {
|
|
6613
6614
|
const current = await readOptionalText(path);
|
|
@@ -6961,6 +6962,9 @@ function isHostBundleComponent(value) {
|
|
|
6961
6962
|
function isHostBundleProducer(value) {
|
|
6962
6963
|
return HOST_BUNDLE_PRODUCERS.some((producer) => producer === value);
|
|
6963
6964
|
}
|
|
6965
|
+
function hostPrivateRuntimeModule(entry) {
|
|
6966
|
+
return `${entry}.mjs`;
|
|
6967
|
+
}
|
|
6964
6968
|
function hostBundleComponentsForProducers(producers) {
|
|
6965
6969
|
const selected = /* @__PURE__ */ new Set(["lifecycle", "relay", ...producers]);
|
|
6966
6970
|
return HOST_BUNDLE_COMPONENTS.filter((component) => selected.has(component));
|
|
@@ -7000,14 +7004,14 @@ function resolveInstalledHostRuntimePaths(prefix, platform = process.platform) {
|
|
|
7000
7004
|
return {
|
|
7001
7005
|
private_root: privateRoot,
|
|
7002
7006
|
node_executable: join10(privateRoot, "node", "bin", platform === "win32" ? "node.exe" : "node"),
|
|
7003
|
-
control_module: join10(privateRoot, "control
|
|
7004
|
-
codex_hook_module: join10(privateRoot, "codex-hook
|
|
7005
|
-
codex_invocation_authentication_module: join10(privateRoot, "codex-invocation-authentication
|
|
7006
|
-
claude_hook_module: join10(privateRoot, "claude-hook
|
|
7007
|
-
claude_invocation_authentication_module: join10(privateRoot, "claude-invocation-authentication
|
|
7008
|
-
relay_module: join10(privateRoot, "relay
|
|
7009
|
-
codex_producer_module: join10(privateRoot, "codex-producer
|
|
7010
|
-
claude_producer_module: join10(privateRoot, "claude-producer
|
|
7007
|
+
control_module: join10(privateRoot, hostPrivateRuntimeModule("control")),
|
|
7008
|
+
codex_hook_module: join10(privateRoot, hostPrivateRuntimeModule("codex-hook")),
|
|
7009
|
+
codex_invocation_authentication_module: join10(privateRoot, hostPrivateRuntimeModule("codex-invocation-authentication")),
|
|
7010
|
+
claude_hook_module: join10(privateRoot, hostPrivateRuntimeModule("claude-hook")),
|
|
7011
|
+
claude_invocation_authentication_module: join10(privateRoot, hostPrivateRuntimeModule("claude-invocation-authentication")),
|
|
7012
|
+
relay_module: join10(privateRoot, hostPrivateRuntimeModule("relay")),
|
|
7013
|
+
codex_producer_module: join10(privateRoot, hostPrivateRuntimeModule("codex-producer")),
|
|
7014
|
+
claude_producer_module: join10(privateRoot, hostPrivateRuntimeModule("claude-producer"))
|
|
7011
7015
|
};
|
|
7012
7016
|
}
|
|
7013
7017
|
function parseHostRuntimeControlRequest(value) {
|
|
@@ -7248,13 +7252,13 @@ var InstalledHostRuntimeHookAdapter = class {
|
|
|
7248
7252
|
const targets = { runtime: paths.private_root, services: servicesRoot };
|
|
7249
7253
|
if (producer === "codex") {
|
|
7250
7254
|
const entryRoot2 = resolveHostEntryRoot(this.homes.codex_home, ".codex");
|
|
7251
|
-
const hook2 = hostEntryCommand({ entryRoot: entryRoot2, module: "codex-hook
|
|
7252
|
-
const authentication2 = hostEntryCommand({ entryRoot: entryRoot2, module: "codex-invocation-authentication
|
|
7255
|
+
const hook2 = hostEntryCommand({ entryRoot: entryRoot2, module: hostPrivateRuntimeModule("codex-hook"), configFlag: HOST_PRODUCER_CONFIG_FLAG, configFile: "codex.json" });
|
|
7256
|
+
const authentication2 = hostEntryCommand({ entryRoot: entryRoot2, module: hostPrivateRuntimeModule("codex-invocation-authentication"), configFlag: HOST_PRODUCER_CONFIG_FLAG, configFile: "codex.json" });
|
|
7253
7257
|
return { entryRoot: entryRoot2, targets, hook: hook2, authentication: authentication2, configPath: this.configPaths.codex };
|
|
7254
7258
|
}
|
|
7255
7259
|
const entryRoot = resolveHostEntryRoot(this.homes.claude_home, ".claude");
|
|
7256
|
-
const hook = hostEntryCommand({ entryRoot, module: "claude-hook
|
|
7257
|
-
const authentication = hostEntryCommand({ entryRoot, module: "claude-invocation-authentication
|
|
7260
|
+
const hook = hostEntryCommand({ entryRoot, module: hostPrivateRuntimeModule("claude-hook"), configFlag: HOST_PRODUCER_CONFIG_FLAG, configFile: "claude.json" });
|
|
7261
|
+
const authentication = hostEntryCommand({ entryRoot, module: hostPrivateRuntimeModule("claude-invocation-authentication"), configFlag: HOST_PRODUCER_CONFIG_FLAG, configFile: "claude.json" });
|
|
7258
7262
|
return { entryRoot, targets, hook, authentication, configPath: this.configPaths.claude };
|
|
7259
7263
|
}
|
|
7260
7264
|
};
|
|
@@ -7361,11 +7365,6 @@ function equalStringLists(left, right) {
|
|
|
7361
7365
|
// host/lifecycle/src/host-runtime-services.ts
|
|
7362
7366
|
var HOST_RUNTIME_SERVICE_COMPONENTS = Object.freeze(hostBundleComponentsForProducers(HOST_BUNDLE_PRODUCERS).filter((component) => component !== "lifecycle"));
|
|
7363
7367
|
var HOST_RUNTIME_SERVICE_COMMAND_TIMEOUT_MS = 2e4;
|
|
7364
|
-
var ENTRYPOINTS = Object.freeze({
|
|
7365
|
-
relay: "relay.mjs",
|
|
7366
|
-
codex: "codex-producer.mjs",
|
|
7367
|
-
claude: "claude-producer.mjs"
|
|
7368
|
-
});
|
|
7369
7368
|
var HOST_RUNTIME_SERVICE_STATES = ["absent", "stopped", "running", "unknown"];
|
|
7370
7369
|
var HostRuntimeServiceContractError = class extends Error {
|
|
7371
7370
|
code;
|
|
@@ -7384,7 +7383,7 @@ function createHostRuntimeServiceSet(input) {
|
|
|
7384
7383
|
const node = path.join(prefix, HOST_BUNDLE_PRIVATE_RUNTIME_ROOT, "node", "bin", flavor === "windows" ? "node.exe" : "node");
|
|
7385
7384
|
const services = selected.map((component) => {
|
|
7386
7385
|
const config = absoluteNormalizedPath(input.config_paths[component], `${component} service config`, path);
|
|
7387
|
-
const entrypoint = path.join(prefix, HOST_BUNDLE_PRIVATE_RUNTIME_ROOT,
|
|
7386
|
+
const entrypoint = path.join(prefix, HOST_BUNDLE_PRIVATE_RUNTIME_ROOT, hostPrivateRuntimeModule(component === "relay" ? component : `${component}-producer`));
|
|
7388
7387
|
const command = { executable: node, args: [entrypoint, "serve", "--config", config] };
|
|
7389
7388
|
validateHostCommandVector(command);
|
|
7390
7389
|
return { component, command };
|
|
@@ -7943,7 +7942,7 @@ var WINDOWS_TASK_SCHEDULER_PROGRAM = Buffer.from(TASK_SCHEDULER_SOURCE, "utf16le
|
|
|
7943
7942
|
|
|
7944
7943
|
// host/lifecycle/src/host-runtime-systemd.ts
|
|
7945
7944
|
import { createHash as createHash8, randomUUID } from "node:crypto";
|
|
7946
|
-
import { chmod as chmod3, lstat as lstat10, mkdir as mkdir10, open as open10, readFile as readFile6, rename as rename9, unlink as unlink6 } from "node:fs/promises";
|
|
7945
|
+
import { chmod as chmod3, lstat as lstat10, mkdir as mkdir10, open as open10, readFile as readFile6, readdir as readdir3, rename as rename9, unlink as unlink6 } from "node:fs/promises";
|
|
7947
7946
|
import { join as join13 } from "node:path";
|
|
7948
7947
|
|
|
7949
7948
|
// host/lifecycle/src/systemd-unit-show.ts
|
|
@@ -8023,12 +8022,12 @@ function createLinuxUserSystemdAdapter(options) {
|
|
|
8023
8022
|
const previousByComponent = serviceMap(previous);
|
|
8024
8023
|
const targetByComponent = serviceMap(target);
|
|
8025
8024
|
await ensurePrivateUnitDirectory(unitDirectory);
|
|
8026
|
-
const ownedUnits = await
|
|
8025
|
+
const ownedUnits = await ownedHostUnits(unitDirectory);
|
|
8027
8026
|
for (const service of target.services) await replaceOwnedUnit(unitDirectory, identity, service);
|
|
8028
|
-
for (const
|
|
8029
|
-
if (targetByComponent.has(
|
|
8030
|
-
|
|
8031
|
-
await removeOwnedUnit(unitDirectory, identity,
|
|
8027
|
+
for (const unit of ownedUnits) {
|
|
8028
|
+
if (unit.identity === identity && targetByComponent.has(unit.component)) continue;
|
|
8029
|
+
await invokeSystemctl(run, systemctl, ["--user", "disable", "--now", unitName(unit.identity, unit.component)]);
|
|
8030
|
+
await removeOwnedUnit(unitDirectory, unit.identity, unit.component);
|
|
8032
8031
|
}
|
|
8033
8032
|
await invokeSystemctl(run, systemctl, ["--user", "daemon-reload"]);
|
|
8034
8033
|
for (const service of target.services) {
|
|
@@ -8037,9 +8036,7 @@ function createLinuxUserSystemdAdapter(options) {
|
|
|
8037
8036
|
if (previousByComponent.has(service.component)) await invokeSystemctl(run, systemctl, ["--user", "restart", name]);
|
|
8038
8037
|
await requireExpectedReadback(run, systemctl, unitDirectory, identity, service, "running");
|
|
8039
8038
|
}
|
|
8040
|
-
for (const
|
|
8041
|
-
if (!targetByComponent.has(service.component)) await requireAbsentReadback(run, systemctl, unitDirectory, identity, service.component);
|
|
8042
|
-
}
|
|
8039
|
+
for (const unit of ownedUnits) if (unit.identity !== identity || !targetByComponent.has(unit.component)) await requireAbsentReadback(run, systemctl, unitDirectory, unit.identity, unit.component);
|
|
8043
8040
|
},
|
|
8044
8041
|
async restart({ target, service }) {
|
|
8045
8042
|
const identity = prefixIdentity(target.prefix);
|
|
@@ -8077,12 +8074,20 @@ function unitPath(directory, identity, component) {
|
|
|
8077
8074
|
function serviceMap(set) {
|
|
8078
8075
|
return new Map(set.services.map((service) => [service.component, service]));
|
|
8079
8076
|
}
|
|
8080
|
-
async function
|
|
8081
|
-
const owned =
|
|
8082
|
-
for (const
|
|
8083
|
-
|
|
8077
|
+
async function ownedHostUnits(directory) {
|
|
8078
|
+
const owned = [];
|
|
8079
|
+
for (const name of await readdir3(directory)) {
|
|
8080
|
+
const match = /^ceal-host-([a-f0-9]{64})-(lifecycle|relay|codex|claude)\.service$/u.exec(name);
|
|
8081
|
+
if (match === null) continue;
|
|
8082
|
+
const identity = match[1];
|
|
8083
|
+
const component = match[2];
|
|
8084
|
+
if (identity === void 0 || !UNIT_ID_PATTERN.test(identity) || !isHostRuntimeServiceComponent(component)) continue;
|
|
8085
|
+
if (await ownedUnitPresent(unitPath(directory, identity, component), identity, component)) owned.push({ identity, component });
|
|
8084
8086
|
}
|
|
8085
|
-
return owned;
|
|
8087
|
+
return owned.sort((left, right) => unitName(left.identity, left.component).localeCompare(unitName(right.identity, right.component)));
|
|
8088
|
+
}
|
|
8089
|
+
function isHostRuntimeServiceComponent(value) {
|
|
8090
|
+
return value !== void 0 && HOST_RUNTIME_SERVICE_COMPONENTS.some((component) => component === value);
|
|
8086
8091
|
}
|
|
8087
8092
|
async function ensurePrivateUnitDirectory(directory) {
|
|
8088
8093
|
try {
|
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.8"
|
|
7
7
|
},
|
|
8
8
|
"source": {
|
|
9
9
|
"repository": "corca-ai/ceal",
|
|
10
|
-
"commit": "
|
|
11
|
-
"tree": "
|
|
10
|
+
"commit": "10719bbafba3b7a05a475426403c8550adbc56d2",
|
|
11
|
+
"tree": "8f0cadb1a7027e2b1415bdf1a2186dfedcb04ac6"
|
|
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": "867a472ff70f931b118962d3fe3a72b6aa1e3d05c5c5e93f68befd70e17f49c1"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"owners": [
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
],
|
|
28
28
|
"executable": false,
|
|
29
29
|
"path": "libexec/ceal-host/claude-hook.mjs",
|
|
30
|
-
"sha256": "
|
|
30
|
+
"sha256": "5d38cedda3a1178ff9debf2455ab60e5e1adaf74bcd7a6af7d7a26113360df3a"
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"owners": [
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
],
|
|
60
60
|
"executable": false,
|
|
61
61
|
"path": "libexec/ceal-host/codex-invocation-authentication.mjs",
|
|
62
|
-
"sha256": "
|
|
62
|
+
"sha256": "3056f3ea26ae59faa5ab4e1a1eef548ef4760584a337ffb480216607dc3c97a3"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
"owners": [
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
],
|
|
76
76
|
"executable": false,
|
|
77
77
|
"path": "libexec/ceal-host/control.mjs",
|
|
78
|
-
"sha256": "
|
|
78
|
+
"sha256": "31ca0d6e9d224737cf9d91fe6a3c91a6756a067c7e28f7a90f4b45e443dbb33b"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"owners": [
|
|
@@ -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":"MIIHDDCCBpKgAwIBAgIUczF6x+XnmupVnyGb9IKYOX5TtpswCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTE2MDk0NjM4WhcNMjYwOTE2MDk1NjM4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESBnjJMn6+3K9pCCCPnvPu3GbqTGiVFAOgrwSNplc2viFnaFUnD0dOe5fsJkpV12cMucz8J3OdgPInlOUE03kH6OCBbEwggWtMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUS9ryhQQeQ3zSPnt1h2IiRvcZSoIwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wZgYDVR0RAQH/BFwwWoZYaHR0cHM6Ly9naXRodWIuY29tL2NvcmNhLWFpL2NlYWwvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS1jYW5kaWRhdGUueW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDEwNzE5YmJhZmJhM2I3YTA1YTQ3NTQyNjQwM2M4NTUwYWRiYzU2ZDIwJAYKKwYBBAGDvzABBAQWQ2VhbCByZWxlYXNlIGNhbmRpZGF0ZTAbBgorBgEEAYO/MAEFBA1jb3JjYS1haS9jZWFsMB0GCisGAQQBg78wAQYED3JlZnMvaGVhZHMvbWFpbjA7BgorBgEEAYO/MAEIBC0MK2h0dHBzOi8vdG9rZW4uYWN0aW9ucy5naXRodWJ1c2VyY29udGVudC5jb20waAYKKwYBBAGDvzABCQRaDFhodHRwczovL2dpdGh1Yi5jb20vY29yY2EtYWkvY2VhbC8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLWNhbmRpZGF0ZS55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wAQoEKgwoMTA3MTliYmFmYmEzYjdhMDVhNDc1NDI2NDAzYzg1NTBhZGJjNTZkMjAdBgorBgEEAYO/MAELBA8MDWdpdGh1Yi1ob3N0ZWQwMAYKKwYBBAGDvzABDAQiDCBodHRwczovL2dpdGh1Yi5jb20vY29yY2EtYWkvY2VhbDA4BgorBgEEAYO/MAENBCoMKDEwNzE5YmJhZmJhM2I3YTA1YTQ3NTQyNjQwM2M4NTUwYWRiYzU2ZDIwHwYKKwYBBAGDvzABDgQRDA9yZWZzL2hlYWRzL21haW4wGgYKKwYBBAGDvzABDwQMDAoxMTkxNTU0NTkzMCsGCisGAQQBg78wARAEHQwbaHR0cHM6Ly9naXRodWIuY29tL2NvcmNhLWFpMBgGCisGAQQBg78wAREECgwINzI5Nzg4NjAwaAYKKwYBBAGDvzABEgRaDFhodHRwczovL2dpdGh1Yi5jb20vY29yY2EtYWkvY2VhbC8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLWNhbmRpZGF0ZS55bWxAcmVmcy9oZWFkcy9tYWluMDgGCisGAQQBg78wARMEKgwoMTA3MTliYmFmYmEzYjdhMDVhNDc1NDI2NDAzYzg1NTBhZGJjNTZkMjAhBgorBgEEAYO/MAEUBBMMEXdvcmtmbG93X2Rpc3BhdGNoMFQGCisGAQQBg78wARUERgxEaHR0cHM6Ly9naXRodWIuY29tL2NvcmNhLWFpL2NlYWwvYWN0aW9ucy9ydW5zLzM1MDgwNjkwMTgyL2F0dGVtcHRzLzEwFwYKKwYBBAGDvzABFgQJDAdwcml2YXRlMDYGCisGAQQBg78wARgEKAwmcmVwbzpjb3JjYS1haS9jZWFsOnJlZjpyZWZzL2hlYWRzL21haW4wgYkGCisGAQQB1nkCBAIEewR5AHcAdQDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAaCpnHd9AAAEAwBGMEQCIE6UvvWBkJBi80320kaWZkviEL1ICiSXecBEuFrR3xsLAiAnvgsAt3s1pnbqo76DU1QcEiPlVo2/v6D6MV4gAJ/E0DAKBggqhkjOPQQDAwNoADBlAjBDOhilF1WgJBtQ3FKGPlXk4eGv6wRA0TWJ5Dey8HwUL2R2Slt0qxSwkpgMIiroHzQCMQDX4p7v2Siz+SRfLs+Q+kLqAg0iqoXXFeIxDSKmpWXJ9v/Is4SW59/Ts2ErfFIrZOc="},"tlogEntries":[{"logIndex":"2858866240","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1789551999","inclusionPromise":{"signedEntryTimestamp":"MEQCIG13ksie/x1N9D1f8mko08B1YLsXBunLg3Y1q7/j2OrHAiBfTofFeoc69nr41scsSsI8TvTi4gZMyq6G6safwrSykg=="},"inclusionProof":{"logIndex":"2736961978","rootHash":"kyrSLuniwgV/QXpAx31bPX0/vFc8iHnXL8DRexlUEkM=","treeSize":"2736962021","hashes":["XYxNqmyl9ifJ+lzx2fjVPeg4UKOZEWkLwEARxdnjhIY=","ESzsTWoC3ObJ+XqDsGtUWn0F/TZZXDLlMOl+/2SdDHg=","NuB3NMstbM6O2it/oo0ZJDh2XVSO2jZjwcU6dkoBmbs=","RPyxkJM7FHUJwyqKEjrAt8BsE7gjI91vf0Qnl4mti4c=","7rraA6WPAy6ZaPYQHL5zMo9tBPSW4nQo0AmPooF4Hfc=","+AyxuoVaqkffrCfBz1GHPXiXhZG9P+T7oPLIDS8lTXM=","YwX7B4jCR8GVScupwPXSZ3cdDXcqVlaXez4DzyFLgiw=","dZ/pfODWORH/+jel8QSDo0Xg/i/P8dgWNViAPoA/G1Y=","5hf6vPspmEIx6OQ7hRl4fgcsuTSQZgUbIpPVfc7nZ24=","YtgvEADmpNm1POCqVzL3ayUaHjOREJEWKGIqIkykKwU=","3YoO3T3CALeO3glVMGUEBni62mt61BsvcZawvH4hMiI=","rCP8Cvn3hXw/lCxXth2xEi2igbuEWFVOoCoYpqN9U8Y=","qYx5qzTk1Et2YVoR21RO3pRYX7n91je81CoDDihjs90=","PHCwLmXkS0v1blaC472bJO3scX8pmpbhD1n9OQh4aP4=","X5JOeyZQDjcvuNcRxBItueeOjls/a+Vx2tWjZWGUv+Q=","gGfwuhE97xnhmxu6exffPtS05ABS4/ldyg66sFcxSRE=","jhevWFOJ2cWU6SvzMnAe08zHGcVquRlP7gAed39+wI4=","qxzHanAzz57SDdmJe0B7bJK72NTIBbwEMGBBKvDOROw=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2736962021\nkyrSLuniwgV/QXpAx31bPX0/vFc8iHnXL8DRexlUEkM=\n\n— rekor.sigstore.dev wNI9ajBFAiEA8ynxESeevj8DxlbKkqkvqkTN+O9MdNqRgKghSLJc3SgCICZBGMlKd4vtM8eV6P3za8TmT0a/WlErb07Y+hCdnUx6\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyNTM4OWJkMWU2OTgzMzQ4NDRmNGRiMGI4YmU2ODNiNTc2N2E4N2IwNDM3ZTkwODA3MmZlNjgyZjlmYWIwZWQwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUQ2Q0tGYlR5UDgxeDl4U2xROFRDeTFWV2N3VG00ZmlqN1F4UGEzcVM2UDZBSWdkVFNmNHRQNE5aM2huU1pPaDNXNDViQmFSM2RhcytudHd3cFR6VU1IYjM4PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaEVSRU5EUW5CTFowRjNTVUpCWjBsVlkzcEdObmdyV0c1dGRYQldibmxIWWpsSlMxbFBXRFZVZEhCemQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUlRKTlJHc3dUbXBOTkZkb1kwNU5hbGwzVDFSRk1rMUVhekZPYWswMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZUUW01cVNrMXVOaXN6U3psd1EwTkRVRzUyVUhVelIySnhWRWRwVmtaQlQyZHlkMU1LVG5Cc1l6SjJhVVp1WVVaVmJrUXdaRTlsTldaelNtdHdWakV5WTAxMVkzbzRTak5QWkdkUVNXNXNUMVZGTUROclNEWlBRMEppUlhkbloxZDBUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZUT1hKNUNtaFJVV1ZSTTNwVFVHNTBNV2d5U1dsU2RtTmFVMjlKZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDFwbldVUldVakJTUVZGSUwwSkdkM2RYYjFwWllVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKT2RtTnRUbWhNVjBad1RESk9iQXBaVjNkMlRHMWtjR1JIYURGWmFUa3pZak5LY2xwdGVIWmtNMDEyWTIxV2MxcFhSbnBhVXpGcVdWYzFhMkZYVW1oa1IxVjFaVmN4YzFGSVNteGFiazEyQ21GSFZtaGFTRTEyWWxkR2NHSnFRVFZDWjI5eVFtZEZSVUZaVHk5TlFVVkNRa04wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUNPRWREYVhOSFFWRlJRbWMzT0hkQlVVbEZSVmhrZG1OdGRHMWlSemt6V0RKU2NBcGpNMEpvWkVkT2IwMUVXVWREYVhOSFFWRlJRbWMzT0hkQlVVMUZTMFJGZDA1NlJUVlpiVXBvV20xS2FFMHlTVE5aVkVFeFdWUlJNMDVVVVhsT2FsRjNDazB5VFRST1ZGVjNXVmRTYVZsNlZUSmFSRWwzU2tGWlMwdDNXVUpDUVVkRWRucEJRa0pCVVZkUk1sWm9Za05DZVZwWGVHeFpXRTVzU1VkT2FHSnRVbkFLV2tkR01GcFVRV0pDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0V4YW1JelNtcFpVekZvWVZNNWFscFhSbk5OUWpCSFEybHpSMEZSVVVKbk56aDNRVkZaUlFwRU0wcHNXbTVOZG1GSFZtaGFTRTEyWWxkR2NHSnFRVGRDWjI5eVFtZEZSVUZaVHk5TlFVVkpRa013VFVzeWFEQmtTRUo2VDJrNGRtUkhPWEphVnpSMUNsbFhUakJoVnpsMVkzazFibUZZVW05a1Ywb3hZekpXZVZreU9YVmtSMVoxWkVNMWFtSXlNSGRoUVZsTFMzZFpRa0pCUjBSMmVrRkNRMUZTWVVSR2FHOEtaRWhTZDJONmIzWk1NbVJ3WkVkb01WbHBOV3BpTWpCMldUSTVlVmt5UlhSWlYydDJXVEpXYUdKRE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNd3BqZVRsNVdsZDRiRmxZVG14TVYwNW9ZbTFTY0ZwSFJqQmFVelUxWWxkNFFXTnRWbTFqZVRsdldsZEdhMk41T1hSWlYyeDFUVVJuUjBOcGMwZEJVVkZDQ21jM09IZEJVVzlGUzJkM2IwMVVRVE5OVkd4cFdXMUdiVmx0UlhwWmFtUm9UVVJXYUU1RVl6Rk9SRWt5VGtSQmVsbDZaekZPVkVKb1drZEthazVVV21zS1RXcEJaRUpuYjNKQ1owVkZRVmxQTDAxQlJVeENRVGhOUkZka2NHUkhhREZaYVRGdllqTk9NRnBYVVhkTlFWbExTM2RaUWtKQlIwUjJla0ZDUkVGUmFRcEVRMEp2WkVoU2QyTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJXVEk1ZVZreVJYUlpWMnQyV1RKV2FHSkVRVFJDWjI5eVFtZEZSVUZaVHk5TlFVVk9Da0pEYjAxTFJFVjNUbnBGTlZsdFNtaGFiVXBvVFRKSk0xbFVRVEZaVkZFelRsUlJlVTVxVVhkTk1rMDBUbFJWZDFsWFVtbFplbFV5V2tSSmQwaDNXVXNLUzNkWlFrSkJSMFIyZWtGQ1JHZFJVa1JCT1hsYVYxcDZUREpvYkZsWFVucE1NakZvWVZjMGQwZG5XVXRMZDFsQ1FrRkhSSFo2UVVKRWQxRk5SRUZ2ZUFwTlZHdDRUbFJWTUU1VWEzcE5RM05IUTJselIwRlJVVUpuTnpoM1FWSkJSVWhSZDJKaFNGSXdZMGhOTmt4NU9XNWhXRkp2WkZkSmRWa3lPWFJNTWs1MkNtTnRUbWhNVjBad1RVSm5SME5wYzBkQlVWRkNaemM0ZDBGU1JVVkRaM2RKVG5wSk5VNTZaelJPYWtGM1lVRlpTMHQzV1VKQ1FVZEVkbnBCUWtWblVtRUtSRVpvYjJSSVVuZGplbTkyVERKa2NHUkhhREZaYVRWcVlqSXdkbGt5T1hsWk1rVjBXVmRyZGxreVZtaGlRemgxV2pKc01HRklWbWxNTTJSMlkyMTBiUXBpUnprelkzazVlVnBYZUd4WldFNXNURmRPYUdKdFVuQmFSMFl3V2xNMU5XSlhlRUZqYlZadFkzazViMXBYUm10amVUbDBXVmRzZFUxRVowZERhWE5IQ2tGUlVVSm5OemgzUVZKTlJVdG5kMjlOVkVFelRWUnNhVmx0Um0xWmJVVjZXV3BrYUUxRVZtaE9SR014VGtSSk1rNUVRWHBaZW1jeFRsUkNhRnBIU21vS1RsUmFhMDFxUVdoQ1oyOXlRbWRGUlVGWlR5OU5RVVZWUWtKTlRVVllaSFpqYlhSdFlrYzVNMWd5VW5Cak0wSm9aRWRPYjAxR1VVZERhWE5IUVZGUlFncG5OemgzUVZKVlJWSm5lRVZoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NazUyWTIxT2FFeFhSbkJNTWs1c1dWZDNkbGxYVGpCaFZ6bDFDbU41T1hsa1Z6VjZUSHBOTVUxRVozZE9hbXQzVFZSbmVVd3lSakJrUjFaMFkwaFNla3g2UlhkR2QxbExTM2RaUWtKQlIwUjJla0ZDUm1kUlNrUkJaSGNLWTIxc01sbFlVbXhOUkZsSFEybHpSMEZSVVVKbk56aDNRVkpuUlV0QmQyMWpiVlozWW5wd2FtSXpTbXBaVXpGb1lWTTVhbHBYUm5OUGJrcHNXbXB3ZVFwYVYxcDZUREpvYkZsWFVucE1NakZvWVZjMGQyZFphMGREYVhOSFFWRlJRakZ1YTBOQ1FVbEZaWGRTTlVGSVkwRmtVVVJrVUZSQ2NYaHpZMUpOYlUxYUNraG9lVnBhZW1ORGIydHdaWFZPTkRoeVppdElhVzVMUVV4NWJuVnFaMEZCUVdGRGNHNUlaRGxCUVVGRlFYZENSMDFGVVVOSlJUWlZkblpYUW10S1Fta0tPREF6TWpCcllWZGFhM1pwUlV3eFNVTnBVMWhsWTBKRmRVWnlVak40YzB4QmFVRnVkbWR6UVhRemN6RndibUp4YnpjMlJGVXhVV05GYVZCc1ZtOHlMd3AyTmtRMlRWWTBaMEZLTDBVd1JFRkxRbWRuY1docmFrOVFVVkZFUVhkT2IwRkVRbXhCYWtKRVQyaHBiRVl4VjJkS1FuUlJNMFpMUjFCc1dHczBaVWQyQ2paM1VrRXdWRmRLTlVSbGVUaElkMVZNTWxJeVUyeDBNSEY0VTNkcmNHZE5TV2x5YjBoNlVVTk5VVVJZTkhBM2RqSlRhWG9yVTFKbVRITXJVU3RyVEhFS1FXY3dhWEZ2V0ZoR1pVbDRSRk5MYlhCWFdFbzVkaTlKY3pSVFZ6VTVMMVJ6TWtWeVprWkpjbHBQWXowS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9fX19"}]},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"JTib0eaYM0hE9NsLi+aDtXZ6h7BDfpCAcv5oL5+rDtA="},"signature":"MEUCIQD6CKFbTyP81x9xSlQ8TCy1VWcwTm4fij7QxPa3qS6P6AIgdTSf4tP4NZ3hnSZOh3W45bBaR3das+ntwwpTzUMHb38="}}
|