codex-chatgpt-control 0.5.1-alpha.2 → 0.5.1-alpha.4
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/CHANGELOG.md +42 -0
- package/README.md +43 -0
- package/contracts/v1/fixtures/backend-capabilities.json +40 -1
- package/contracts/v1/fixtures/backend-compatibility.json +21 -0
- package/contracts/v1/fixtures/backend-version.json +6 -1
- package/contracts/v1/fixtures/download-blocked-by-browser.json +22 -0
- package/contracts/v1/fixtures/download-receipt-failed.json +22 -0
- package/contracts/v1/fixtures/download-receipt-timeout.json +22 -0
- package/contracts/v1/fixtures/journal-rpc-indeterminate.json +32 -0
- package/contracts/v1/fixtures/journal-rpc-unsupported-platform.json +32 -0
- package/contracts/v1/fixtures/journal-runtime-unavailable.json +32 -0
- package/contracts/v1/fixtures/operation-action-prepared-event.json +42 -0
- package/contracts/v1/fixtures/operation-action.json +13 -0
- package/contracts/v1/fixtures/operation-artifact-receipt.json +14 -0
- package/contracts/v1/fixtures/operation-artifact-transfer-intent-event.json +24 -0
- package/contracts/v1/fixtures/operation-artifact-transfer-receipt-event.json +26 -0
- package/contracts/v1/fixtures/operation-artifact-transfer-state.json +178 -0
- package/contracts/v1/fixtures/operation-blocker.json +10 -0
- package/contracts/v1/fixtures/operation-collect-request.json +17 -0
- package/contracts/v1/fixtures/operation-collect-result.json +42 -0
- package/contracts/v1/fixtures/operation-control-receipt.json +13 -0
- package/contracts/v1/fixtures/operation-control-request.json +18 -0
- package/contracts/v1/fixtures/operation-control-result.json +31 -0
- package/contracts/v1/fixtures/operation-event.json +18 -0
- package/contracts/v1/fixtures/operation-handle.json +10 -0
- package/contracts/v1/fixtures/operation-inspect-request.json +13 -0
- package/contracts/v1/fixtures/operation-inspect-result.json +205 -0
- package/contracts/v1/fixtures/operation-ownership-baseline-event.json +34 -0
- package/contracts/v1/fixtures/operation-receipt.json +32 -0
- package/contracts/v1/fixtures/operation-recovery-decision.json +7 -0
- package/contracts/v1/fixtures/operation-recovery-observation.json +12 -0
- package/contracts/v1/fixtures/operation-request.json +33 -0
- package/contracts/v1/fixtures/operation-state.json +144 -0
- package/contracts/v1/fixtures/operation-submission-witness-event.json +20 -0
- package/contracts/v1/fixtures/operation-submission-witness.json +11 -0
- package/contracts/v1/fixtures/operation-submit-result.json +16 -0
- package/contracts/v1/fixtures/operation-target-established-event.json +21 -0
- package/contracts/v1/manifest.json +185 -1
- package/contracts/v1/parity-suite.json +106 -8
- package/contracts/v1/schemas/backend-compatibility.schema.json +65 -0
- package/contracts/v1/schemas/backend-request.schema.json +8 -2
- package/contracts/v1/schemas/capabilities.schema.json +81 -1
- package/contracts/v1/schemas/manifest.schema.json +57 -0
- package/contracts/v1/schemas/operation-action.schema.json +155 -0
- package/contracts/v1/schemas/operation-artifact-receipt.schema.json +89 -0
- package/contracts/v1/schemas/operation-blocker.schema.json +70 -0
- package/contracts/v1/schemas/operation-collect-request.schema.json +46 -0
- package/contracts/v1/schemas/operation-collect-result.schema.json +74 -0
- package/contracts/v1/schemas/operation-control-receipt.schema.json +108 -0
- package/contracts/v1/schemas/operation-control-request.schema.json +111 -0
- package/contracts/v1/schemas/operation-control-result.schema.json +112 -0
- package/contracts/v1/schemas/operation-event.schema.json +756 -0
- package/contracts/v1/schemas/operation-handle.schema.json +55 -0
- package/contracts/v1/schemas/operation-inspect-request.schema.json +42 -0
- package/contracts/v1/schemas/operation-inspect-result.schema.json +1662 -0
- package/contracts/v1/schemas/operation-receipt.schema.json +153 -0
- package/contracts/v1/schemas/operation-recovery.schema.json +314 -0
- package/contracts/v1/schemas/operation-request.schema.json +158 -0
- package/contracts/v1/schemas/operation-state.schema.json +691 -0
- package/contracts/v1/schemas/operation-submission-witness.schema.json +48 -0
- package/contracts/v1/schemas/operation-submit-result.schema.json +94 -0
- package/contracts/v1/surface-drift-policy.json +50 -0
- package/contracts/v1/vectors/operation-request-digest-v1.json +43 -0
- package/dist/codex-chatgpt-control-backend.mjs +45882 -9361
- package/dist/codex-chatgpt-control-journal.mjs +5547 -0
- package/dist/codex-chatgpt-control-live-smoke.bundle.mjs +51677 -0
- package/dist/codex-chatgpt-control-release-canary.bundle.mjs +52104 -0
- package/dist/codex-chatgpt-control.bundle.mjs +48392 -10260
- package/dist/src/backend/client.d.ts +103 -2
- package/dist/src/backend/client.js +1436 -97
- package/dist/src/backend/compatibility.d.ts +12 -0
- package/dist/src/backend/compatibility.js +208 -0
- package/dist/src/backend/protocol.d.ts +84 -1
- package/dist/src/backend/protocol.js +31 -5
- package/dist/src/backend/runtime-identity.d.ts +10 -0
- package/dist/src/backend/runtime-identity.js +141 -0
- package/dist/src/backend/session.d.ts +10 -2
- package/dist/src/backend/session.js +478 -7
- package/dist/src/backend/stdio-server.d.ts +4 -1
- package/dist/src/backend/stdio-server.js +240 -28
- package/dist/src/browser/active-composer-file-input.d.ts +9 -0
- package/dist/src/browser/active-composer-file-input.js +33 -0
- package/dist/src/browser/attach.d.ts +4 -1
- package/dist/src/browser/attach.js +136 -28
- package/dist/src/browser/chatgpt-url.d.ts +2 -0
- package/dist/src/browser/chatgpt-url.js +9 -0
- package/dist/src/browser/downloads.d.ts +17 -1
- package/dist/src/browser/downloads.js +150 -28
- package/dist/src/browser/page-state.js +6 -0
- package/dist/src/client.d.ts +43 -0
- package/dist/src/client.js +1279 -59
- package/dist/src/commands/artifacts.js +6 -4
- package/dist/src/commands/chat-popover.d.ts +37 -0
- package/dist/src/commands/chat-popover.js +537 -0
- package/dist/src/commands/configuration.d.ts +5 -0
- package/dist/src/commands/configuration.js +134 -21
- package/dist/src/commands/context.js +10 -3
- package/dist/src/commands/doctor.d.ts +1 -1
- package/dist/src/commands/doctor.js +27 -4
- package/dist/src/commands/experience.d.ts +5 -0
- package/dist/src/commands/experience.js +104 -21
- package/dist/src/commands/files.js +14 -33
- package/dist/src/commands/modes.js +85 -21
- package/dist/src/commands/power-discovery.d.ts +130 -0
- package/dist/src/commands/power-discovery.js +669 -0
- package/dist/src/commands/project-sources.js +325 -31
- package/dist/src/commands/sequence.js +59 -32
- package/dist/src/commands/session.js +19 -6
- package/dist/src/commands/work.js +31 -0
- package/dist/src/dom/composer-text.d.ts +6 -0
- package/dist/src/dom/composer-text.js +85 -0
- package/dist/src/errors.d.ts +9 -0
- package/dist/src/errors.js +22 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +9 -0
- package/dist/src/operations/artifact-output.d.ts +69 -0
- package/dist/src/operations/artifact-output.js +1748 -0
- package/dist/src/operations/artifact-stream.d.ts +19 -0
- package/dist/src/operations/artifact-stream.js +35 -0
- package/dist/src/operations/artifact-transfer.d.ts +149 -0
- package/dist/src/operations/artifact-transfer.js +1312 -0
- package/dist/src/operations/browser-adapter.d.ts +167 -0
- package/dist/src/operations/browser-adapter.js +2103 -0
- package/dist/src/operations/browser-observation.d.ts +110 -0
- package/dist/src/operations/browser-observation.js +1256 -0
- package/dist/src/operations/browser-target.d.ts +105 -0
- package/dist/src/operations/browser-target.js +531 -0
- package/dist/src/operations/canonical.d.ts +4 -0
- package/dist/src/operations/canonical.js +412 -0
- package/dist/src/operations/chatgpt-runtime.d.ts +72 -0
- package/dist/src/operations/chatgpt-runtime.js +1232 -0
- package/dist/src/operations/client.d.ts +138 -0
- package/dist/src/operations/client.js +1145 -0
- package/dist/src/operations/collector.d.ts +195 -0
- package/dist/src/operations/collector.js +1039 -0
- package/dist/src/operations/configuration-routing.d.ts +4 -0
- package/dist/src/operations/configuration-routing.js +14 -0
- package/dist/src/operations/control.d.ts +372 -0
- package/dist/src/operations/control.js +1498 -0
- package/dist/src/operations/file-identity.d.ts +33 -0
- package/dist/src/operations/file-identity.js +153 -0
- package/dist/src/operations/handle.d.ts +19 -0
- package/dist/src/operations/handle.js +727 -0
- package/dist/src/operations/index.d.ts +25 -0
- package/dist/src/operations/index.js +25 -0
- package/dist/src/operations/journal-authority.d.ts +12 -0
- package/dist/src/operations/journal-authority.js +1 -0
- package/dist/src/operations/journal-rpc-client.d.ts +12 -0
- package/dist/src/operations/journal-rpc-client.js +225 -0
- package/dist/src/operations/journal-rpc-protocol.d.ts +32 -0
- package/dist/src/operations/journal-rpc-protocol.js +214 -0
- package/dist/src/operations/journal-rpc-server.d.ts +15 -0
- package/dist/src/operations/journal-rpc-server.js +272 -0
- package/dist/src/operations/journal.d.ts +143 -0
- package/dist/src/operations/journal.js +1957 -0
- package/dist/src/operations/production-attachments.d.ts +118 -0
- package/dist/src/operations/production-attachments.js +1035 -0
- package/dist/src/operations/production-chatgpt-artifacts.d.ts +74 -0
- package/dist/src/operations/production-chatgpt-artifacts.js +1146 -0
- package/dist/src/operations/production-chatgpt-attachments.d.ts +80 -0
- package/dist/src/operations/production-chatgpt-attachments.js +1639 -0
- package/dist/src/operations/production-configuration.d.ts +42 -0
- package/dist/src/operations/production-configuration.js +1544 -0
- package/dist/src/operations/production-primitives.d.ts +53 -0
- package/dist/src/operations/production-primitives.js +856 -0
- package/dist/src/operations/production-work-steer.d.ts +203 -0
- package/dist/src/operations/production-work-steer.js +1218 -0
- package/dist/src/operations/recovery.d.ts +80 -0
- package/dist/src/operations/recovery.js +174 -0
- package/dist/src/operations/runtime-adapter.d.ts +126 -0
- package/dist/src/operations/runtime-adapter.js +802 -0
- package/dist/src/operations/send-once.d.ts +224 -0
- package/dist/src/operations/send-once.js +1081 -0
- package/dist/src/operations/service.d.ts +286 -0
- package/dist/src/operations/service.js +2831 -0
- package/dist/src/operations/staging.d.ts +136 -0
- package/dist/src/operations/staging.js +630 -0
- package/dist/src/operations/state-machine.d.ts +29 -0
- package/dist/src/operations/state-machine.js +2047 -0
- package/dist/src/operations/submission.d.ts +423 -0
- package/dist/src/operations/submission.js +1676 -0
- package/dist/src/operations/transactional-chat-power.d.ts +17 -0
- package/dist/src/operations/transactional-chat-power.js +212 -0
- package/dist/src/operations/turn-ownership.d.ts +202 -0
- package/dist/src/operations/turn-ownership.js +700 -0
- package/dist/src/operations/types.d.ts +454 -0
- package/dist/src/operations/types.js +20 -0
- package/dist/src/operations/wire-requests.d.ts +21 -0
- package/dist/src/operations/wire-requests.js +396 -0
- package/dist/src/operations/wire-results.d.ts +97 -0
- package/dist/src/operations/wire-results.js +818 -0
- package/dist/src/runner/responses.d.ts +3 -1
- package/dist/src/runner/responses.js +19 -1
- package/dist/src/runner/result.js +227 -55
- package/dist/src/runner/types.d.ts +12 -0
- package/dist/src/runtime/command-routing.d.ts +149 -0
- package/dist/src/runtime/command-routing.js +431 -0
- package/dist/src/runtime/coordinated-browser.d.ts +24 -0
- package/dist/src/runtime/coordinated-browser.js +315 -0
- package/dist/src/runtime/coordinated-page.d.ts +41 -0
- package/dist/src/runtime/coordinated-page.js +651 -0
- package/dist/src/runtime/operation-context.d.ts +142 -0
- package/dist/src/runtime/operation-context.js +410 -0
- package/dist/src/runtime/runtime-session.d.ts +95 -0
- package/dist/src/runtime/runtime-session.js +314 -0
- package/dist/src/runtime/tab-coordinator.d.ts +200 -0
- package/dist/src/runtime/tab-coordinator.js +1200 -0
- package/dist/src/runtime/value-boundaries.d.ts +18 -0
- package/dist/src/runtime/value-boundaries.js +49 -0
- package/dist/src/safety/blockers.js +8 -1
- package/dist/src/safety/untrusted-output.js +2 -1
- package/dist/src/scripts/backend-server.js +4 -1
- package/dist/src/scripts/capture-surface-profile.js +7 -2
- package/dist/src/scripts/journal-server.d.ts +2 -0
- package/dist/src/scripts/journal-server.js +37 -0
- package/dist/src/scripts/live-smoke/harness.js +79 -7
- package/dist/src/scripts/live-smoke/scenarios.d.ts +42 -1
- package/dist/src/scripts/live-smoke/scenarios.js +147 -30
- package/dist/src/scripts/live-smoke/transactional.d.ts +17 -0
- package/dist/src/scripts/live-smoke/transactional.js +254 -0
- package/dist/src/scripts/live-smoke/types.d.ts +3 -0
- package/dist/src/scripts/release-canary-module.js +17 -4
- package/dist/src/types.d.ts +38 -1
- package/package.json +8 -3
- package/references/2026-08-16-transactional-operations.md +459 -0
- package/references/2026-09-06-journal-service.md +140 -0
- package/references/agents-runner.md +34 -0
- package/references/backend-protocol.md +176 -0
- package/references/python-parity.md +137 -0
- package/references/responses-adapter.md +19 -0
- package/references/streaming.md +6 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type OperationFileManifestEntryV1 = {
|
|
2
|
+
displayName: string;
|
|
3
|
+
bytes: number;
|
|
4
|
+
contentSha256: string;
|
|
5
|
+
};
|
|
6
|
+
export type OperationFileIdentity = {
|
|
7
|
+
/** Ephemeral local input. This value must never be written to the journal. */
|
|
8
|
+
sourcePath: string;
|
|
9
|
+
manifest: OperationFileManifestEntryV1;
|
|
10
|
+
proof: {
|
|
11
|
+
device: string;
|
|
12
|
+
inode: string;
|
|
13
|
+
size: string;
|
|
14
|
+
modifiedNs: string;
|
|
15
|
+
changedNs: string;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export type OperationFileHashOptions = {
|
|
19
|
+
signal?: AbortSignal;
|
|
20
|
+
chunkBytes?: number;
|
|
21
|
+
onChunk?: (bytes: number) => void;
|
|
22
|
+
};
|
|
23
|
+
export declare class OperationFileIdentityError extends Error {
|
|
24
|
+
readonly code: string;
|
|
25
|
+
constructor(code: string, message: string);
|
|
26
|
+
}
|
|
27
|
+
export declare function fingerprintOperationFile(sourcePath: string, displayName?: string, options?: OperationFileHashOptions): Promise<OperationFileIdentity>;
|
|
28
|
+
/**
|
|
29
|
+
* Re-open and stream the file immediately before handoff. The unavoidable gap
|
|
30
|
+
* between this check and the browser accepting the file remains explicit; DOM
|
|
31
|
+
* attachment labels must never be presented as proof of the content hash.
|
|
32
|
+
*/
|
|
33
|
+
export declare function revalidateOperationFile(identity: OperationFileIdentity, options?: OperationFileHashOptions): Promise<void>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { constants as fsConstants } from "node:fs";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { lstat, open } from "node:fs/promises";
|
|
5
|
+
import { nodeErrorCode } from "../errors.js";
|
|
6
|
+
const DEFAULT_HASH_CHUNK_BYTES = 64 * 1024;
|
|
7
|
+
export class OperationFileIdentityError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
constructor(code, message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.name = "OperationFileIdentityError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function fingerprintOperationFile(sourcePath, displayName, options = {}) {
|
|
16
|
+
if (typeof sourcePath !== "string"
|
|
17
|
+
|| sourcePath.length === 0
|
|
18
|
+
|| sourcePath.length > 4096
|
|
19
|
+
|| /[\u0000-\u001f\u007f]/u.test(sourcePath)) {
|
|
20
|
+
throw new OperationFileIdentityError("invalid_file_path", "Operation input path must be a bounded local path without control characters.");
|
|
21
|
+
}
|
|
22
|
+
const canonicalPath = resolve(sourcePath);
|
|
23
|
+
const normalizedDisplayName = validateDisplayName(displayName ?? basename(canonicalPath));
|
|
24
|
+
const hashed = await hashRegularFile(canonicalPath, options);
|
|
25
|
+
return {
|
|
26
|
+
sourcePath: canonicalPath,
|
|
27
|
+
manifest: {
|
|
28
|
+
displayName: normalizedDisplayName,
|
|
29
|
+
bytes: safeByteCount(hashed.stats.size),
|
|
30
|
+
contentSha256: hashed.sha256
|
|
31
|
+
},
|
|
32
|
+
proof: fileProof(hashed.stats)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Re-open and stream the file immediately before handoff. The unavoidable gap
|
|
37
|
+
* between this check and the browser accepting the file remains explicit; DOM
|
|
38
|
+
* attachment labels must never be presented as proof of the content hash.
|
|
39
|
+
*/
|
|
40
|
+
export async function revalidateOperationFile(identity, options = {}) {
|
|
41
|
+
const current = await fingerprintOperationFile(identity.sourcePath, identity.manifest.displayName, options);
|
|
42
|
+
if (current.manifest.bytes !== identity.manifest.bytes ||
|
|
43
|
+
current.manifest.contentSha256 !== identity.manifest.contentSha256 ||
|
|
44
|
+
current.proof.device !== identity.proof.device ||
|
|
45
|
+
current.proof.inode !== identity.proof.inode) {
|
|
46
|
+
throw new OperationFileIdentityError("operation_file_changed", "An operation input file changed after its immutable request identity was established.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function hashRegularFile(sourcePath, options) {
|
|
50
|
+
assertNotAborted(options.signal);
|
|
51
|
+
const chunkBytes = options.chunkBytes ?? DEFAULT_HASH_CHUNK_BYTES;
|
|
52
|
+
if (!Number.isSafeInteger(chunkBytes) || chunkBytes <= 0 || chunkBytes > 16 * 1024 * 1024) {
|
|
53
|
+
throw new OperationFileIdentityError("invalid_hash_chunk_size", "chunkBytes must be between 1 and 16777216 bytes.");
|
|
54
|
+
}
|
|
55
|
+
let pathMetadata;
|
|
56
|
+
try {
|
|
57
|
+
pathMetadata = await lstat(sourcePath, { bigint: true });
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw localFileError(error, "operation_file_unavailable", "The operation input file is unavailable.");
|
|
61
|
+
}
|
|
62
|
+
if (pathMetadata.isSymbolicLink() || !pathMetadata.isFile()) {
|
|
63
|
+
throw new OperationFileIdentityError("operation_file_not_regular", "Operation input must be a regular, non-symlinked file.");
|
|
64
|
+
}
|
|
65
|
+
let handle;
|
|
66
|
+
try {
|
|
67
|
+
handle = await open(sourcePath, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw localFileError(error, "operation_file_unavailable", "The operation input file could not be opened safely.");
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const before = await handle.stat({ bigint: true });
|
|
74
|
+
if (!before.isFile() || before.dev !== pathMetadata.dev || before.ino !== pathMetadata.ino) {
|
|
75
|
+
throw new OperationFileIdentityError("operation_file_changed", "The operation input file changed while it was being opened.");
|
|
76
|
+
}
|
|
77
|
+
const digest = createHash("sha256");
|
|
78
|
+
const stream = handle.createReadStream({
|
|
79
|
+
autoClose: false,
|
|
80
|
+
highWaterMark: chunkBytes,
|
|
81
|
+
signal: options.signal
|
|
82
|
+
});
|
|
83
|
+
try {
|
|
84
|
+
for await (const chunk of stream) {
|
|
85
|
+
const bytes = chunk;
|
|
86
|
+
digest.update(bytes);
|
|
87
|
+
options.onChunk?.(bytes.byteLength);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (options.signal?.aborted) {
|
|
92
|
+
throw new OperationFileIdentityError("file_hash_aborted", "Operation file hashing was cancelled.");
|
|
93
|
+
}
|
|
94
|
+
throw localFileError(error, "operation_file_read_failed", "The operation input file could not be read completely.");
|
|
95
|
+
}
|
|
96
|
+
const after = await handle.stat({ bigint: true });
|
|
97
|
+
if (!sameOpenFileSnapshot(before, after)) {
|
|
98
|
+
throw new OperationFileIdentityError("operation_file_changed", "The operation input file changed while it was being hashed.");
|
|
99
|
+
}
|
|
100
|
+
return { sha256: digest.digest("hex"), stats: after };
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
await handle.close();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function validateDisplayName(displayName) {
|
|
107
|
+
if (typeof displayName !== "string") {
|
|
108
|
+
throw new OperationFileIdentityError("invalid_file_display_name", "Operation file displayName must be one safe path-free name.");
|
|
109
|
+
}
|
|
110
|
+
const normalized = displayName.normalize("NFC");
|
|
111
|
+
if (normalized.length === 0
|
|
112
|
+
|| normalized.length > 512
|
|
113
|
+
|| normalized === "."
|
|
114
|
+
|| normalized === ".."
|
|
115
|
+
|| /[\\/\u0000-\u001f\u007f]/u.test(normalized)) {
|
|
116
|
+
throw new OperationFileIdentityError("invalid_file_display_name", "Operation file displayName must be one safe path-free name.");
|
|
117
|
+
}
|
|
118
|
+
return normalized;
|
|
119
|
+
}
|
|
120
|
+
function sameOpenFileSnapshot(left, right) {
|
|
121
|
+
return left.dev === right.dev
|
|
122
|
+
&& left.ino === right.ino
|
|
123
|
+
&& left.size === right.size
|
|
124
|
+
&& left.mtimeNs === right.mtimeNs
|
|
125
|
+
&& left.ctimeNs === right.ctimeNs;
|
|
126
|
+
}
|
|
127
|
+
function fileProof(stats) {
|
|
128
|
+
return {
|
|
129
|
+
device: stats.dev.toString(),
|
|
130
|
+
inode: stats.ino.toString(),
|
|
131
|
+
size: stats.size.toString(),
|
|
132
|
+
modifiedNs: stats.mtimeNs.toString(),
|
|
133
|
+
changedNs: stats.ctimeNs.toString()
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function safeByteCount(size) {
|
|
137
|
+
if (size < 0n || size > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
138
|
+
throw new OperationFileIdentityError("operation_file_too_large", "Operation input size exceeds the supported safe integer range.");
|
|
139
|
+
}
|
|
140
|
+
return Number(size);
|
|
141
|
+
}
|
|
142
|
+
function assertNotAborted(signal) {
|
|
143
|
+
if (signal?.aborted) {
|
|
144
|
+
throw new OperationFileIdentityError("file_hash_aborted", "Operation file hashing was cancelled.");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function localFileError(error, code, fallback) {
|
|
148
|
+
if (error instanceof OperationFileIdentityError)
|
|
149
|
+
return error;
|
|
150
|
+
const errno = nodeErrorCode(error);
|
|
151
|
+
const suffix = errno === undefined ? "" : ` (${errno})`;
|
|
152
|
+
return new OperationFileIdentityError(code, `${fallback}${suffix}`);
|
|
153
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type OperationControlRequestV1, type OperationHandleV1, type OperationStateV1, type OperationSubmitRequestV1 } from "./types.js";
|
|
2
|
+
import type { OperationFileManifestEntryV1 } from "./file-identity.js";
|
|
3
|
+
export declare class OperationHandleError extends Error {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
constructor(code: string, message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare function operationSubmitRequestDigest(key: Uint8Array, request: OperationSubmitRequestV1, files: readonly OperationFileManifestEntryV1[]): string;
|
|
8
|
+
export declare function operationControlRequestDigest(key: Uint8Array, request: OperationControlRequestV1): string;
|
|
9
|
+
export declare function operationHandleFromState(key: Uint8Array, state: OperationStateV1): OperationHandleV1;
|
|
10
|
+
/**
|
|
11
|
+
* Return only the immutable target material used for action/handle binding.
|
|
12
|
+
* A provider-assigned identity may be added to a new target after Send, but
|
|
13
|
+
* it must never change the digest that authorizes the original action.
|
|
14
|
+
*/
|
|
15
|
+
export declare function operationTargetBindingProjection(target: NonNullable<OperationStateV1["target"]>): unknown;
|
|
16
|
+
export declare function validateOperationHandle(key: Uint8Array, handle: OperationHandleV1, state: OperationStateV1): {
|
|
17
|
+
stale: boolean;
|
|
18
|
+
current: OperationHandleV1;
|
|
19
|
+
};
|