codex-chatgpt-control 0.5.1-alpha.2 → 0.5.1-alpha.3

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.
Files changed (191) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +27 -0
  3. package/contracts/v1/fixtures/backend-capabilities.json +40 -1
  4. package/contracts/v1/fixtures/backend-compatibility.json +21 -0
  5. package/contracts/v1/fixtures/backend-version.json +6 -1
  6. package/contracts/v1/fixtures/operation-action-prepared-event.json +42 -0
  7. package/contracts/v1/fixtures/operation-action.json +13 -0
  8. package/contracts/v1/fixtures/operation-artifact-receipt.json +14 -0
  9. package/contracts/v1/fixtures/operation-artifact-transfer-intent-event.json +24 -0
  10. package/contracts/v1/fixtures/operation-artifact-transfer-receipt-event.json +26 -0
  11. package/contracts/v1/fixtures/operation-artifact-transfer-state.json +178 -0
  12. package/contracts/v1/fixtures/operation-blocker.json +10 -0
  13. package/contracts/v1/fixtures/operation-collect-request.json +17 -0
  14. package/contracts/v1/fixtures/operation-collect-result.json +42 -0
  15. package/contracts/v1/fixtures/operation-control-receipt.json +13 -0
  16. package/contracts/v1/fixtures/operation-control-request.json +18 -0
  17. package/contracts/v1/fixtures/operation-control-result.json +31 -0
  18. package/contracts/v1/fixtures/operation-event.json +18 -0
  19. package/contracts/v1/fixtures/operation-handle.json +10 -0
  20. package/contracts/v1/fixtures/operation-inspect-request.json +13 -0
  21. package/contracts/v1/fixtures/operation-inspect-result.json +205 -0
  22. package/contracts/v1/fixtures/operation-ownership-baseline-event.json +34 -0
  23. package/contracts/v1/fixtures/operation-receipt.json +32 -0
  24. package/contracts/v1/fixtures/operation-recovery-decision.json +7 -0
  25. package/contracts/v1/fixtures/operation-recovery-observation.json +12 -0
  26. package/contracts/v1/fixtures/operation-request.json +33 -0
  27. package/contracts/v1/fixtures/operation-state.json +144 -0
  28. package/contracts/v1/fixtures/operation-submission-witness-event.json +20 -0
  29. package/contracts/v1/fixtures/operation-submission-witness.json +11 -0
  30. package/contracts/v1/fixtures/operation-submit-result.json +16 -0
  31. package/contracts/v1/fixtures/operation-target-established-event.json +21 -0
  32. package/contracts/v1/manifest.json +155 -1
  33. package/contracts/v1/parity-suite.json +96 -1
  34. package/contracts/v1/schemas/backend-compatibility.schema.json +65 -0
  35. package/contracts/v1/schemas/backend-request.schema.json +8 -2
  36. package/contracts/v1/schemas/capabilities.schema.json +81 -1
  37. package/contracts/v1/schemas/manifest.schema.json +57 -0
  38. package/contracts/v1/schemas/operation-action.schema.json +155 -0
  39. package/contracts/v1/schemas/operation-artifact-receipt.schema.json +89 -0
  40. package/contracts/v1/schemas/operation-blocker.schema.json +70 -0
  41. package/contracts/v1/schemas/operation-collect-request.schema.json +46 -0
  42. package/contracts/v1/schemas/operation-collect-result.schema.json +74 -0
  43. package/contracts/v1/schemas/operation-control-receipt.schema.json +108 -0
  44. package/contracts/v1/schemas/operation-control-request.schema.json +111 -0
  45. package/contracts/v1/schemas/operation-control-result.schema.json +112 -0
  46. package/contracts/v1/schemas/operation-event.schema.json +756 -0
  47. package/contracts/v1/schemas/operation-handle.schema.json +55 -0
  48. package/contracts/v1/schemas/operation-inspect-request.schema.json +42 -0
  49. package/contracts/v1/schemas/operation-inspect-result.schema.json +1662 -0
  50. package/contracts/v1/schemas/operation-receipt.schema.json +153 -0
  51. package/contracts/v1/schemas/operation-recovery.schema.json +314 -0
  52. package/contracts/v1/schemas/operation-request.schema.json +158 -0
  53. package/contracts/v1/schemas/operation-state.schema.json +691 -0
  54. package/contracts/v1/schemas/operation-submission-witness.schema.json +48 -0
  55. package/contracts/v1/schemas/operation-submit-result.schema.json +94 -0
  56. package/contracts/v1/surface-drift-policy.json +50 -0
  57. package/contracts/v1/vectors/operation-request-digest-v1.json +43 -0
  58. package/dist/codex-chatgpt-control-backend.mjs +43897 -9094
  59. package/dist/codex-chatgpt-control.bundle.mjs +46360 -10262
  60. package/dist/src/backend/client.d.ts +103 -2
  61. package/dist/src/backend/client.js +1436 -97
  62. package/dist/src/backend/compatibility.d.ts +12 -0
  63. package/dist/src/backend/compatibility.js +208 -0
  64. package/dist/src/backend/protocol.d.ts +84 -1
  65. package/dist/src/backend/protocol.js +31 -5
  66. package/dist/src/backend/runtime-identity.d.ts +10 -0
  67. package/dist/src/backend/runtime-identity.js +141 -0
  68. package/dist/src/backend/session.d.ts +10 -2
  69. package/dist/src/backend/session.js +478 -7
  70. package/dist/src/backend/stdio-server.d.ts +4 -1
  71. package/dist/src/backend/stdio-server.js +240 -28
  72. package/dist/src/browser/active-composer-file-input.d.ts +9 -0
  73. package/dist/src/browser/active-composer-file-input.js +33 -0
  74. package/dist/src/browser/attach.d.ts +4 -1
  75. package/dist/src/browser/attach.js +136 -28
  76. package/dist/src/browser/downloads.d.ts +2 -0
  77. package/dist/src/client.d.ts +38 -0
  78. package/dist/src/client.js +1222 -59
  79. package/dist/src/commands/configuration.js +13 -7
  80. package/dist/src/commands/doctor.d.ts +1 -1
  81. package/dist/src/commands/doctor.js +26 -3
  82. package/dist/src/commands/experience.js +35 -0
  83. package/dist/src/commands/files.js +4 -27
  84. package/dist/src/commands/modes.js +49 -17
  85. package/dist/src/commands/power-discovery.d.ts +130 -0
  86. package/dist/src/commands/power-discovery.js +627 -0
  87. package/dist/src/commands/project-sources.js +325 -31
  88. package/dist/src/commands/sequence.js +59 -32
  89. package/dist/src/commands/session.js +7 -2
  90. package/dist/src/commands/work.js +31 -0
  91. package/dist/src/errors.d.ts +9 -0
  92. package/dist/src/errors.js +22 -0
  93. package/dist/src/index.d.ts +6 -0
  94. package/dist/src/index.js +9 -0
  95. package/dist/src/operations/artifact-output.d.ts +69 -0
  96. package/dist/src/operations/artifact-output.js +1748 -0
  97. package/dist/src/operations/artifact-stream.d.ts +19 -0
  98. package/dist/src/operations/artifact-stream.js +35 -0
  99. package/dist/src/operations/artifact-transfer.d.ts +149 -0
  100. package/dist/src/operations/artifact-transfer.js +1312 -0
  101. package/dist/src/operations/browser-adapter.d.ts +161 -0
  102. package/dist/src/operations/browser-adapter.js +2023 -0
  103. package/dist/src/operations/browser-observation.d.ts +110 -0
  104. package/dist/src/operations/browser-observation.js +1208 -0
  105. package/dist/src/operations/browser-target.d.ts +103 -0
  106. package/dist/src/operations/browser-target.js +489 -0
  107. package/dist/src/operations/canonical.d.ts +4 -0
  108. package/dist/src/operations/canonical.js +412 -0
  109. package/dist/src/operations/chatgpt-runtime.d.ts +72 -0
  110. package/dist/src/operations/chatgpt-runtime.js +1150 -0
  111. package/dist/src/operations/client.d.ts +138 -0
  112. package/dist/src/operations/client.js +1143 -0
  113. package/dist/src/operations/collector.d.ts +195 -0
  114. package/dist/src/operations/collector.js +1039 -0
  115. package/dist/src/operations/control.d.ts +372 -0
  116. package/dist/src/operations/control.js +1498 -0
  117. package/dist/src/operations/file-identity.d.ts +33 -0
  118. package/dist/src/operations/file-identity.js +153 -0
  119. package/dist/src/operations/handle.d.ts +19 -0
  120. package/dist/src/operations/handle.js +727 -0
  121. package/dist/src/operations/index.d.ts +22 -0
  122. package/dist/src/operations/index.js +22 -0
  123. package/dist/src/operations/journal.d.ts +142 -0
  124. package/dist/src/operations/journal.js +1931 -0
  125. package/dist/src/operations/production-attachments.d.ts +116 -0
  126. package/dist/src/operations/production-attachments.js +1018 -0
  127. package/dist/src/operations/production-chatgpt-artifacts.d.ts +74 -0
  128. package/dist/src/operations/production-chatgpt-artifacts.js +1146 -0
  129. package/dist/src/operations/production-chatgpt-attachments.d.ts +71 -0
  130. package/dist/src/operations/production-chatgpt-attachments.js +1563 -0
  131. package/dist/src/operations/production-configuration.d.ts +42 -0
  132. package/dist/src/operations/production-configuration.js +1363 -0
  133. package/dist/src/operations/production-primitives.d.ts +53 -0
  134. package/dist/src/operations/production-primitives.js +1073 -0
  135. package/dist/src/operations/production-work-steer.d.ts +203 -0
  136. package/dist/src/operations/production-work-steer.js +1218 -0
  137. package/dist/src/operations/recovery.d.ts +80 -0
  138. package/dist/src/operations/recovery.js +174 -0
  139. package/dist/src/operations/runtime-adapter.d.ts +118 -0
  140. package/dist/src/operations/runtime-adapter.js +786 -0
  141. package/dist/src/operations/send-once.d.ts +224 -0
  142. package/dist/src/operations/send-once.js +1081 -0
  143. package/dist/src/operations/service.d.ts +281 -0
  144. package/dist/src/operations/service.js +2810 -0
  145. package/dist/src/operations/staging.d.ts +136 -0
  146. package/dist/src/operations/staging.js +630 -0
  147. package/dist/src/operations/state-machine.d.ts +29 -0
  148. package/dist/src/operations/state-machine.js +2047 -0
  149. package/dist/src/operations/submission.d.ts +423 -0
  150. package/dist/src/operations/submission.js +1676 -0
  151. package/dist/src/operations/turn-ownership.d.ts +202 -0
  152. package/dist/src/operations/turn-ownership.js +700 -0
  153. package/dist/src/operations/types.d.ts +454 -0
  154. package/dist/src/operations/types.js +20 -0
  155. package/dist/src/operations/wire-requests.d.ts +21 -0
  156. package/dist/src/operations/wire-requests.js +396 -0
  157. package/dist/src/operations/wire-results.d.ts +97 -0
  158. package/dist/src/operations/wire-results.js +818 -0
  159. package/dist/src/runner/responses.d.ts +3 -1
  160. package/dist/src/runner/responses.js +19 -1
  161. package/dist/src/runner/result.js +227 -55
  162. package/dist/src/runner/types.d.ts +12 -0
  163. package/dist/src/runtime/command-routing.d.ts +149 -0
  164. package/dist/src/runtime/command-routing.js +431 -0
  165. package/dist/src/runtime/coordinated-browser.d.ts +24 -0
  166. package/dist/src/runtime/coordinated-browser.js +315 -0
  167. package/dist/src/runtime/coordinated-page.d.ts +39 -0
  168. package/dist/src/runtime/coordinated-page.js +634 -0
  169. package/dist/src/runtime/operation-context.d.ts +142 -0
  170. package/dist/src/runtime/operation-context.js +410 -0
  171. package/dist/src/runtime/runtime-session.d.ts +95 -0
  172. package/dist/src/runtime/runtime-session.js +314 -0
  173. package/dist/src/runtime/tab-coordinator.d.ts +200 -0
  174. package/dist/src/runtime/tab-coordinator.js +1200 -0
  175. package/dist/src/runtime/value-boundaries.d.ts +18 -0
  176. package/dist/src/runtime/value-boundaries.js +49 -0
  177. package/dist/src/safety/untrusted-output.js +2 -1
  178. package/dist/src/scripts/backend-server.js +4 -1
  179. package/dist/src/scripts/live-smoke/harness.js +79 -7
  180. package/dist/src/scripts/live-smoke/scenarios.d.ts +28 -0
  181. package/dist/src/scripts/live-smoke/scenarios.js +110 -18
  182. package/dist/src/scripts/live-smoke/types.d.ts +3 -0
  183. package/dist/src/scripts/release-canary-module.js +17 -4
  184. package/dist/src/types.d.ts +38 -1
  185. package/package.json +1 -1
  186. package/references/2026-08-16-transactional-operations.md +459 -0
  187. package/references/agents-runner.md +34 -0
  188. package/references/backend-protocol.md +73 -0
  189. package/references/python-parity.md +72 -0
  190. package/references/responses-adapter.md +19 -0
  191. 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
+ };