@scotthuang/agent-knock-knock 0.13.16 → 0.13.18

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 (184) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +4 -4
  3. package/dist/src/claude-terminal-agent-adapter.js +1 -1
  4. package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
  5. package/dist/src/codex-app-server-interaction-client.js +68 -26
  6. package/dist/src/codex-app-server-interaction-client.js.map +1 -1
  7. package/dist/src/codex-app-server-read-client.js +52 -20
  8. package/dist/src/codex-app-server-read-client.js.map +1 -1
  9. package/dist/src/codex-astra-composer-proof.js +1 -1
  10. package/dist/src/codex-astra-composer-proof.js.map +1 -1
  11. package/dist/src/codex-async-question-adapter.js +14 -4
  12. package/dist/src/codex-async-question-adapter.js.map +1 -1
  13. package/dist/src/codex-lifecycle-compatibility.d.ts +1 -1
  14. package/dist/src/codex-lifecycle-compatibility.js +9 -3
  15. package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
  16. package/dist/src/codex-open-rollout-inventory.d.ts +51 -0
  17. package/dist/src/codex-open-rollout-inventory.js +365 -0
  18. package/dist/src/codex-open-rollout-inventory.js.map +1 -0
  19. package/dist/src/codex-paginated-thread-binding.js +1 -1
  20. package/dist/src/codex-paginated-thread-binding.js.map +1 -1
  21. package/dist/src/codex-permission-surface.d.ts +1 -1
  22. package/dist/src/codex-permission-surface.js +1 -1
  23. package/dist/src/codex-permission-surface.js.map +1 -1
  24. package/dist/src/codex-rollout-bound-completion.d.ts +44 -0
  25. package/dist/src/codex-rollout-bound-completion.js +357 -0
  26. package/dist/src/codex-rollout-bound-completion.js.map +1 -0
  27. package/dist/src/codex-rollout-file.d.ts +15 -0
  28. package/dist/src/codex-rollout-file.js +98 -0
  29. package/dist/src/codex-rollout-file.js.map +1 -0
  30. package/dist/src/codex-rollout-human-task.d.ts +61 -0
  31. package/dist/src/codex-rollout-human-task.js +555 -0
  32. package/dist/src/codex-rollout-human-task.js.map +1 -0
  33. package/dist/src/codex-rollout-interaction-evidence.d.ts +48 -0
  34. package/dist/src/codex-rollout-interaction-evidence.js +521 -0
  35. package/dist/src/codex-rollout-interaction-evidence.js.map +1 -0
  36. package/dist/src/codex-rollout-inventory.d.ts +5 -0
  37. package/dist/src/codex-rollout-inventory.js +81 -0
  38. package/dist/src/codex-rollout-inventory.js.map +1 -0
  39. package/dist/src/codex-rollout-records.d.ts +49 -0
  40. package/dist/src/codex-rollout-records.js +298 -0
  41. package/dist/src/codex-rollout-records.js.map +1 -0
  42. package/dist/src/codex-sqlite-thread-query.d.ts +85 -0
  43. package/dist/src/codex-sqlite-thread-query.js +440 -0
  44. package/dist/src/codex-sqlite-thread-query.js.map +1 -0
  45. package/dist/src/codex-status-history-navigation.d.ts +1 -1
  46. package/dist/src/codex-status-history-navigation.js +1 -1
  47. package/dist/src/codex-status-history-navigation.js.map +1 -1
  48. package/dist/src/codex-store-adapter.d.ts +3 -50
  49. package/dist/src/codex-store-adapter.js +5 -796
  50. package/dist/src/codex-store-adapter.js.map +1 -1
  51. package/dist/src/codex-terminal-agent-adapter.js +4 -2
  52. package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
  53. package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +4 -134
  54. package/dist/src/native-thread-lifecycle-cli-adapter.js +19 -633
  55. package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
  56. package/dist/src/native-thread-lifecycle-cli-contract.d.ts +138 -0
  57. package/dist/src/native-thread-lifecycle-cli-contract.js +2 -0
  58. package/dist/src/native-thread-lifecycle-cli-contract.js.map +1 -0
  59. package/dist/src/semantic-permission-control.js +33 -6
  60. package/dist/src/semantic-permission-control.js.map +1 -1
  61. package/dist/src/semantic-tool-descriptions.d.ts +26 -0
  62. package/dist/src/semantic-tool-descriptions.js +259 -0
  63. package/dist/src/semantic-tool-descriptions.js.map +1 -0
  64. package/dist/src/semantic-tool-runtime.js +45 -37
  65. package/dist/src/semantic-tool-runtime.js.map +1 -1
  66. package/dist/src/semantic-tool-schemas.js +134 -33
  67. package/dist/src/semantic-tool-schemas.js.map +1 -1
  68. package/dist/src/terminal-action-contracts.d.ts +4 -0
  69. package/dist/src/terminal-action-contracts.js +695 -0
  70. package/dist/src/terminal-action-contracts.js.map +1 -0
  71. package/dist/src/terminal-composer-classifier.d.ts +1 -1
  72. package/dist/src/terminal-composer-classifier.js +2 -2
  73. package/dist/src/terminal-composer-classifier.js.map +1 -1
  74. package/dist/src/terminal-interaction-response-bridge.js +1 -1
  75. package/dist/src/terminal-interaction-response-bridge.js.map +1 -1
  76. package/dist/src/terminal-list-renderer.d.ts +1 -2
  77. package/dist/src/terminal-list-renderer.js +8 -424
  78. package/dist/src/terminal-list-renderer.js.map +1 -1
  79. package/dist/src/terminal-model-control-action-policy.d.ts +1 -1
  80. package/dist/src/terminal-model-control-availability.d.ts +1 -1
  81. package/dist/src/terminal-model-control-availability.js +1 -1
  82. package/dist/src/terminal-model-control-availability.js.map +1 -1
  83. package/dist/src/terminal-model-control-cli-adapter.d.ts +34 -0
  84. package/dist/src/terminal-model-control-cli-adapter.js +669 -0
  85. package/dist/src/terminal-model-control-cli-adapter.js.map +1 -0
  86. package/dist/src/terminal-model-control-contract.d.ts +198 -0
  87. package/dist/src/terminal-model-control-contract.js +15 -0
  88. package/dist/src/terminal-model-control-contract.js.map +1 -0
  89. package/dist/src/terminal-model-control-input.d.ts +29 -0
  90. package/dist/src/terminal-model-control-input.js +86 -0
  91. package/dist/src/terminal-model-control-input.js.map +1 -0
  92. package/dist/src/terminal-model-control-profile.d.ts +5 -1
  93. package/dist/src/terminal-model-control-profile.js +21 -7
  94. package/dist/src/terminal-model-control-profile.js.map +1 -1
  95. package/dist/src/terminal-model-control-subject.d.ts +52 -0
  96. package/dist/src/terminal-model-control-subject.js +73 -0
  97. package/dist/src/terminal-model-control-subject.js.map +1 -1
  98. package/dist/src/terminal-model-control-surface.d.ts +82 -0
  99. package/dist/src/terminal-model-control-surface.js +688 -0
  100. package/dist/src/terminal-model-control-surface.js.map +1 -0
  101. package/dist/src/terminal-model-control.d.ts +6 -270
  102. package/dist/src/terminal-model-control.js +11 -988
  103. package/dist/src/terminal-model-control.js.map +1 -1
  104. package/dist/src/terminal-model-selection.d.ts +33 -0
  105. package/dist/src/terminal-model-selection.js +143 -0
  106. package/dist/src/terminal-model-selection.js.map +1 -0
  107. package/dist/src/terminal-monitor-application-service.js +38 -59
  108. package/dist/src/terminal-monitor-application-service.js.map +1 -1
  109. package/dist/src/terminal-monitor-attention-store.d.ts +65 -0
  110. package/dist/src/terminal-monitor-attention-store.js +518 -0
  111. package/dist/src/terminal-monitor-attention-store.js.map +1 -0
  112. package/dist/src/terminal-monitor-collateral-recovery.d.ts +12 -0
  113. package/dist/src/terminal-monitor-collateral-recovery.js +415 -0
  114. package/dist/src/terminal-monitor-collateral-recovery.js.map +1 -0
  115. package/dist/src/terminal-monitor-interaction-projection.d.ts +19 -0
  116. package/dist/src/terminal-monitor-interaction-projection.js +48 -0
  117. package/dist/src/terminal-monitor-interaction-projection.js.map +1 -0
  118. package/dist/src/terminal-monitor-startup-recovery.d.ts +15 -0
  119. package/dist/src/terminal-monitor-startup-recovery.js +767 -0
  120. package/dist/src/terminal-monitor-startup-recovery.js.map +1 -0
  121. package/dist/src/terminal-monitor-state-cli-adapter.d.ts +2 -104
  122. package/dist/src/terminal-monitor-state-cli-adapter.js +28 -1640
  123. package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
  124. package/dist/src/terminal-monitor-state-contract.d.ts +108 -0
  125. package/dist/src/terminal-monitor-state-contract.js +8 -0
  126. package/dist/src/terminal-monitor-state-contract.js.map +1 -0
  127. package/dist/src/terminal-native-inspection-bridge.d.ts +4 -153
  128. package/dist/src/terminal-native-inspection-bridge.js +7 -646
  129. package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
  130. package/dist/src/terminal-native-inspection-contract.d.ts +128 -0
  131. package/dist/src/terminal-native-inspection-contract.js +38 -0
  132. package/dist/src/terminal-native-inspection-contract.js.map +1 -0
  133. package/dist/src/terminal-native-inspection-profile.d.ts +15 -0
  134. package/dist/src/terminal-native-inspection-profile.js +189 -0
  135. package/dist/src/terminal-native-inspection-profile.js.map +1 -0
  136. package/dist/src/terminal-native-inspection-proof.d.ts +62 -0
  137. package/dist/src/terminal-native-inspection-proof.js +362 -0
  138. package/dist/src/terminal-native-inspection-proof.js.map +1 -0
  139. package/dist/src/terminal-permission-control-bridge.js +1 -1
  140. package/dist/src/terminal-permission-control-bridge.js.map +1 -1
  141. package/dist/src/terminal-permission-control.js +5 -1
  142. package/dist/src/terminal-permission-control.js.map +1 -1
  143. package/dist/src/terminal-questionnaire-adapter.js +5 -2
  144. package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
  145. package/dist/src/terminal-runtime-cli-adapter.d.ts +2 -1
  146. package/dist/src/terminal-runtime-cli-adapter.js +1 -1
  147. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
  148. package/dist/src/terminal-submission-acceptance.d.ts +5 -148
  149. package/dist/src/terminal-submission-acceptance.js +21 -1845
  150. package/dist/src/terminal-submission-acceptance.js.map +1 -1
  151. package/dist/src/terminal-watch-anchor-capture.d.ts +9 -0
  152. package/dist/src/terminal-watch-anchor-capture.js +139 -0
  153. package/dist/src/terminal-watch-anchor-capture.js.map +1 -0
  154. package/dist/src/terminal-watch-cli-adapter.d.ts +3 -117
  155. package/dist/src/terminal-watch-cli-adapter.js +10 -1992
  156. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  157. package/dist/src/terminal-watch-cli-contract.d.ts +117 -0
  158. package/dist/src/terminal-watch-cli-contract.js +2 -0
  159. package/dist/src/terminal-watch-cli-contract.js.map +1 -0
  160. package/dist/src/terminal-watch-fallback-observation.d.ts +15 -0
  161. package/dist/src/terminal-watch-fallback-observation.js +249 -0
  162. package/dist/src/terminal-watch-fallback-observation.js.map +1 -0
  163. package/dist/src/terminal-watch-interaction-observation.d.ts +26 -0
  164. package/dist/src/terminal-watch-interaction-observation.js +262 -0
  165. package/dist/src/terminal-watch-interaction-observation.js.map +1 -0
  166. package/dist/src/terminal-watch-observation-adapter.d.ts +4 -0
  167. package/dist/src/terminal-watch-observation-adapter.js +307 -0
  168. package/dist/src/terminal-watch-observation-adapter.js.map +1 -0
  169. package/dist/src/terminal-watch-observation-evidence.d.ts +25 -0
  170. package/dist/src/terminal-watch-observation-evidence.js +184 -0
  171. package/dist/src/terminal-watch-observation-evidence.js.map +1 -0
  172. package/dist/src/terminal-watch-response-authority.d.ts +6 -0
  173. package/dist/src/terminal-watch-response-authority.js +333 -0
  174. package/dist/src/terminal-watch-response-authority.js.map +1 -0
  175. package/dist/src/terminal-watch-response-cli-adapter.d.ts +3 -0
  176. package/dist/src/terminal-watch-response-cli-adapter.js +230 -0
  177. package/dist/src/terminal-watch-response-cli-adapter.js.map +1 -0
  178. package/dist/src/terminal-watch-terminal-identity.d.ts +39 -0
  179. package/dist/src/terminal-watch-terminal-identity.js +380 -0
  180. package/dist/src/terminal-watch-terminal-identity.js.map +1 -0
  181. package/docs/codex-0.160.0-compatibility.md +126 -0
  182. package/docs/codex-permissions.md +12 -1
  183. package/package.json +3 -2
  184. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +3 -3
@@ -0,0 +1,357 @@
1
+ // Completion proof for one already-accepted legacy Codex turn.
2
+ import { assertPrivateRegularFile, CODEX_COMPLETION_MAX_BYTES, fileEndsWithNewline, openExactRollout, readCodexRolloutHeader, sameRolloutFileIdentity, sameRolloutIdentity, sameStableFile, } from "./codex-rollout-file.js";
3
+ import { assertCodexRolloutLegacyHistory, optionalString, scanExactCodexTaskComplete, truncateCompletionText, } from "./codex-rollout-records.js";
4
+ import { redactString, } from "./runtime-log.js";
5
+ import { exactNativeThreadId, fingerprint, normalizedRolloutIdentity, requiredString, sha256Value, validateCodexRolloutAcceptanceAnchor, validateTerminalSubmissionAcceptanceEvidence, } from "./terminal-submission-facts.js";
6
+ import fs from "node:fs";
7
+ /**
8
+ * Scans the exact rollout and native turn proven by terminal acceptance.
9
+ *
10
+ * Unlike the general Codex context loader, this detector does not retain only
11
+ * a recent-turn window. It starts at the immutable pre-submission byte anchor
12
+ * and matches only the persisted acceptance UUID, so a delayed monitor can
13
+ * recover completion even after later native turns have been appended.
14
+ */
15
+ export function detectCodexBoundRolloutCompletion(options) {
16
+ const prepared = prepareCompletionAcceptance(options);
17
+ if (prepared.status !== "ready")
18
+ return prepared;
19
+ const accepted = validateCompletionAcceptanceMetadata(prepared.context);
20
+ if (accepted.status !== "ready")
21
+ return accepted;
22
+ const bound = bindCompletionRollout(options.currentIdentity, accepted.context);
23
+ if (bound.status !== "ready")
24
+ return bound;
25
+ const context = bound.context;
26
+ const { rollout, rolloutDiagnostics, acceptanceId } = context;
27
+ let opened;
28
+ try {
29
+ opened = openExactRollout(rollout);
30
+ }
31
+ catch (error) {
32
+ const message = error instanceof Error ? error.message : String(error);
33
+ return codexCompletionFailure(/identity does not match/u.test(message)
34
+ ? "rollout_identity_mismatch"
35
+ : "rollout_unreadable", error, rolloutDiagnostics);
36
+ }
37
+ try {
38
+ const suffix = readCompletionSuffix(opened, context);
39
+ if (suffix.status !== "ready")
40
+ return suffix;
41
+ const scan = scanExactCodexTaskComplete(suffix.context.buffer.toString("utf8"), acceptanceId);
42
+ return projectCompletionScan(scan, context, suffix.context);
43
+ }
44
+ catch (error) {
45
+ return codexCompletionFailure("rollout_unreadable", error, rolloutDiagnostics);
46
+ }
47
+ finally {
48
+ try {
49
+ fs.closeSync(opened.fd);
50
+ }
51
+ catch {
52
+ // The scan result is already fenced by the descriptor identity and both
53
+ // file snapshots. A close failure cannot make it safe to retry a native
54
+ // turn, so do not replace that deterministic result with an exception.
55
+ }
56
+ }
57
+ }
58
+ function prepareCompletionAcceptance(options) {
59
+ let anchor;
60
+ try {
61
+ anchor = validateCodexRolloutAcceptanceAnchor(options.anchor);
62
+ }
63
+ catch (error) {
64
+ return codexCompletionFailure("invalid_anchor", error);
65
+ }
66
+ const initialDiagnostics = {
67
+ detector: "codex_exact_bound_rollout",
68
+ anchor_fingerprint: anchor.anchor_fingerprint,
69
+ scan_start_offset_bytes: anchor.offset_bytes
70
+ };
71
+ let requestHash;
72
+ let acceptance;
73
+ let expectedNativeThreadId;
74
+ try {
75
+ requestHash = sha256Value(options.requestHash, "terminal request hash");
76
+ expectedNativeThreadId = anchor.version === 1
77
+ ? anchor.native_thread_id
78
+ : exactNativeThreadId(options.acceptanceEvidence.nativeThreadId);
79
+ acceptance = validateTerminalSubmissionAcceptanceEvidence(options.acceptanceEvidence, {
80
+ source: "codex_rollout",
81
+ nativeThreadId: expectedNativeThreadId,
82
+ requestHash
83
+ });
84
+ }
85
+ catch (error) {
86
+ return codexCompletionFailure("invalid_acceptance_evidence", error, initialDiagnostics);
87
+ }
88
+ const acceptedCandidate = anchor.version === 3
89
+ ? anchor.candidate_rollouts.find((candidate) => candidate.native_thread_id === expectedNativeThreadId)
90
+ : undefined;
91
+ const scanStartOffset = acceptedCandidate?.offset_bytes ??
92
+ anchor.offset_bytes;
93
+ const baseDiagnostics = {
94
+ ...initialDiagnostics,
95
+ scan_start_offset_bytes: scanStartOffset,
96
+ native_thread_id: expectedNativeThreadId
97
+ };
98
+ return {
99
+ status: "ready",
100
+ context: {
101
+ anchor, acceptance, acceptedCandidate, expectedNativeThreadId,
102
+ scanStartOffset, baseDiagnostics
103
+ }
104
+ };
105
+ }
106
+ function validateCompletionAcceptanceMetadata(context) {
107
+ const { anchor, acceptance, scanStartOffset, baseDiagnostics } = context;
108
+ let acceptanceId;
109
+ try {
110
+ acceptanceId = exactNativeThreadId(acceptance.acceptanceId);
111
+ }
112
+ catch (error) {
113
+ return codexCompletionFailure("acceptance_turn_mismatch", error, baseDiagnostics);
114
+ }
115
+ const diagnostics = {
116
+ ...baseDiagnostics,
117
+ acceptance_id: acceptanceId
118
+ };
119
+ if (acceptance.anchorFingerprint !== anchor.anchor_fingerprint) {
120
+ return codexCompletionFailure("acceptance_anchor_mismatch", new Error("Codex acceptance evidence belongs to a different byte anchor"), diagnostics);
121
+ }
122
+ const evidenceTurnId = optionalString(acceptance.metadata?.turn_id);
123
+ if (evidenceTurnId !== undefined) {
124
+ let normalizedEvidenceTurnId;
125
+ try {
126
+ normalizedEvidenceTurnId = exactNativeThreadId(evidenceTurnId);
127
+ }
128
+ catch (error) {
129
+ return codexCompletionFailure("acceptance_turn_mismatch", error, diagnostics);
130
+ }
131
+ if (normalizedEvidenceTurnId !== acceptanceId) {
132
+ return codexCompletionFailure("acceptance_turn_mismatch", new Error("Codex acceptance metadata names a different native turn"), diagnostics);
133
+ }
134
+ }
135
+ let evidenceAnchorOffset;
136
+ try {
137
+ evidenceAnchorOffset = optionalSafeOffset(acceptance.metadata?.anchor_offset_bytes);
138
+ }
139
+ catch (error) {
140
+ return codexCompletionFailure("invalid_acceptance_evidence", error, diagnostics);
141
+ }
142
+ if (evidenceAnchorOffset !== undefined &&
143
+ evidenceAnchorOffset !== scanStartOffset) {
144
+ return codexCompletionFailure("acceptance_anchor_mismatch", new Error("Codex acceptance evidence has a different byte offset"), diagnostics);
145
+ }
146
+ return {
147
+ status: "ready",
148
+ context: { ...context, acceptanceId, diagnostics }
149
+ };
150
+ }
151
+ function bindCompletionRollout(current, context) {
152
+ const { anchor, acceptedCandidate, expectedNativeThreadId, diagnostics } = context;
153
+ try {
154
+ if (exactNativeThreadId(current.sessionId) !== expectedNativeThreadId ||
155
+ requiredString(current.processUuid, "Codex process UUID") !==
156
+ anchor.process_uuid ||
157
+ requiredString(current.processBirth, "Codex process birth") !==
158
+ anchor.process_birth) {
159
+ throw new Error("Codex process or native thread identity changed during completion polling");
160
+ }
161
+ }
162
+ catch (error) {
163
+ return codexCompletionFailure("binding_identity_mismatch", error, diagnostics);
164
+ }
165
+ if (!current.rollout) {
166
+ return codexCompletionFailure("rollout_identity_mismatch", new Error("the accepted Codex Turn lost its persisted exact rollout identity"), diagnostics);
167
+ }
168
+ let rollout;
169
+ try {
170
+ rollout = normalizedRolloutIdentity(current.rollout);
171
+ }
172
+ catch (error) {
173
+ return codexCompletionFailure("rollout_identity_mismatch", error, diagnostics);
174
+ }
175
+ const rolloutDiagnostics = {
176
+ ...diagnostics,
177
+ rollout_identity_fingerprint: fingerprint(rollout)
178
+ };
179
+ const anchoredRollout = anchor.version === 3
180
+ ? acceptedCandidate?.rollout
181
+ : anchor.rollout;
182
+ const anchoredRolloutMatches = !anchoredRollout || (anchor.version === 3
183
+ ? sameRolloutFileIdentity(anchoredRollout, rollout)
184
+ : sameRolloutIdentity(anchoredRollout, rollout));
185
+ if (!anchoredRolloutMatches) {
186
+ return codexCompletionFailure("rollout_identity_mismatch", new Error("Codex rollout identity changed after terminal acceptance"), rolloutDiagnostics);
187
+ }
188
+ return {
189
+ status: "ready",
190
+ context: { ...context, rollout, rolloutDiagnostics }
191
+ };
192
+ }
193
+ function readCompletionSuffix(opened, context) {
194
+ const { acceptance, scanStartOffset, rolloutDiagnostics } = context;
195
+ const before = opened.stat;
196
+ try {
197
+ assertPrivateRegularFile(before);
198
+ }
199
+ catch (error) {
200
+ return codexCompletionFailure("rollout_unreadable", error, rolloutDiagnostics);
201
+ }
202
+ let evidenceEndOffset;
203
+ try {
204
+ evidenceEndOffset = optionalSafeOffset(acceptance.metadata?.observed_end_offset_bytes);
205
+ }
206
+ catch (error) {
207
+ return codexCompletionFailure("invalid_acceptance_evidence", error, rolloutDiagnostics);
208
+ }
209
+ if (before.size < scanStartOffset ||
210
+ (evidenceEndOffset !== undefined && before.size < evidenceEndOffset)) {
211
+ return codexCompletionFailure("rollout_truncated", new Error("Codex rollout was truncated after native acceptance"), {
212
+ ...rolloutDiagnostics,
213
+ observed_end_offset_bytes: before.size
214
+ });
215
+ }
216
+ const bytesToRead = before.size - scanStartOffset;
217
+ const observedDiagnostics = {
218
+ ...rolloutDiagnostics,
219
+ observed_end_offset_bytes: before.size
220
+ };
221
+ if (bytesToRead > CODEX_COMPLETION_MAX_BYTES) {
222
+ return codexCompletionFailure("scan_limit_exceeded", new Error("Codex bound completion suffix exceeded the safe scan limit"), observedDiagnostics);
223
+ }
224
+ try {
225
+ if (before.size > 0) {
226
+ assertCodexRolloutLegacyHistory(readCodexRolloutHeader(opened.fd, before.size));
227
+ }
228
+ }
229
+ catch (error) {
230
+ return codexCompletionFailure("rollout_unreadable", error, observedDiagnostics);
231
+ }
232
+ if (bytesToRead === 0) {
233
+ return codexCompletionPending("exact_turn_not_complete", observedDiagnostics, "no post-anchor Codex rollout records are available yet");
234
+ }
235
+ if (!fileEndsWithNewline(opened.fd, before.size)) {
236
+ return codexCompletionPending("partial_rollout_record", observedDiagnostics, "the exact Codex rollout ends with a partial JSONL record");
237
+ }
238
+ const buffer = Buffer.allocUnsafe(bytesToRead);
239
+ const bytesRead = fs.readSync(opened.fd, buffer, 0, bytesToRead, scanStartOffset);
240
+ const after = fs.fstatSync(opened.fd);
241
+ if (bytesRead !== bytesToRead || !sameStableFile(before, after)) {
242
+ return codexCompletionPending("rollout_changed_during_scan", observedDiagnostics, "the exact Codex rollout changed while completion was scanned");
243
+ }
244
+ return {
245
+ status: "ready",
246
+ context: { buffer, observedEndOffsetBytes: before.size, observedDiagnostics }
247
+ };
248
+ }
249
+ function projectCompletionScan(scan, context, suffix) {
250
+ const { acceptanceId, expectedNativeThreadId, anchor, rolloutDiagnostics, scanStartOffset } = context;
251
+ const { observedDiagnostics, observedEndOffsetBytes } = suffix;
252
+ const scanDiagnostics = {
253
+ ...observedDiagnostics,
254
+ scanned_records: scan.scannedRecords,
255
+ observed_task_complete_records: scan.observedTaskCompleteRecords,
256
+ observed_turn_aborted_records: scan.observedTurnAbortedRecords
257
+ };
258
+ if (scan.status === "failure") {
259
+ return codexCompletionFailure(scan.code, scan.detail, scanDiagnostics);
260
+ }
261
+ if (scan.status === "pending") {
262
+ return codexCompletionPending("exact_turn_not_complete", scanDiagnostics, "the accepted Codex native turn has no durable task_complete record yet");
263
+ }
264
+ if (scan.status === "aborted") {
265
+ const reason = truncateCompletionText(redactString(scan.reason ?? "interrupted"));
266
+ const completion = {
267
+ source: "durable",
268
+ outcome: "failure",
269
+ text: truncateCompletionText(redactString(`Codex task stopped: ${reason}`)),
270
+ ...(scan.timestamp ? { timestamp: scan.timestamp } : {}),
271
+ id: acceptanceId,
272
+ confidence: "high",
273
+ metadata: {
274
+ match: "bound_rollout_turn_aborted",
275
+ turn_id: acceptanceId,
276
+ native_thread_id: expectedNativeThreadId,
277
+ anchor_fingerprint: anchor.anchor_fingerprint,
278
+ rollout_identity_fingerprint: rolloutDiagnostics.rollout_identity_fingerprint,
279
+ abort_reason: reason,
280
+ scan_start_offset_bytes: scanStartOffset,
281
+ observed_end_offset_bytes: observedEndOffsetBytes,
282
+ scanned_records: scan.scannedRecords,
283
+ observed_task_complete_records: scan.observedTaskCompleteRecords,
284
+ observed_turn_aborted_records: scan.observedTurnAbortedRecords
285
+ }
286
+ };
287
+ return {
288
+ status: "completed",
289
+ completion,
290
+ diagnostics: {
291
+ ...scanDiagnostics,
292
+ code: "abort_found"
293
+ }
294
+ };
295
+ }
296
+ const completion = {
297
+ source: "durable",
298
+ outcome: "success",
299
+ text: truncateCompletionText(redactString(scan.text)),
300
+ ...(scan.timestamp ? { timestamp: scan.timestamp } : {}),
301
+ id: acceptanceId,
302
+ confidence: "high",
303
+ metadata: {
304
+ match: "bound_rollout_task_complete",
305
+ turn_id: acceptanceId,
306
+ native_thread_id: expectedNativeThreadId,
307
+ anchor_fingerprint: anchor.anchor_fingerprint,
308
+ rollout_identity_fingerprint: rolloutDiagnostics.rollout_identity_fingerprint,
309
+ scan_start_offset_bytes: scanStartOffset,
310
+ observed_end_offset_bytes: observedEndOffsetBytes,
311
+ scanned_records: scan.scannedRecords,
312
+ observed_task_complete_records: scan.observedTaskCompleteRecords,
313
+ observed_turn_aborted_records: scan.observedTurnAbortedRecords
314
+ }
315
+ };
316
+ return {
317
+ status: "completed",
318
+ completion,
319
+ diagnostics: {
320
+ ...scanDiagnostics,
321
+ code: "completion_found"
322
+ }
323
+ };
324
+ }
325
+ function codexCompletionPending(code, diagnostics, detail) {
326
+ return {
327
+ status: "pending",
328
+ diagnostics: {
329
+ ...diagnostics,
330
+ code,
331
+ detail
332
+ }
333
+ };
334
+ }
335
+ function codexCompletionFailure(code, error, diagnostics = {
336
+ detector: "codex_exact_bound_rollout"
337
+ }) {
338
+ const detail = error instanceof Error ? error.message : String(error);
339
+ return {
340
+ status: "failure",
341
+ diagnostics: {
342
+ ...diagnostics,
343
+ code,
344
+ detail: truncateCompletionText(redactString(detail))
345
+ }
346
+ };
347
+ }
348
+ function optionalSafeOffset(value) {
349
+ if (value === undefined) {
350
+ return undefined;
351
+ }
352
+ if (!Number.isSafeInteger(value) || Number(value) < 0) {
353
+ throw new Error("Codex acceptance evidence byte offset is invalid");
354
+ }
355
+ return Number(value);
356
+ }
357
+ //# sourceMappingURL=codex-rollout-bound-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-rollout-bound-completion.js","sourceRoot":"","sources":["../../src/codex-rollout-bound-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type CodexRolloutIdentity } from "./terminal-submission-facts.js";
2
+ import fs from "node:fs";
3
+ export declare const CODEX_COMPLETION_MAX_BYTES: number;
4
+ export declare function readCodexRolloutHeader(fd: number, size: number): Buffer;
5
+ export declare function readExactBytes(fd: number, offset: number, length: number): Buffer;
6
+ export declare function openExactRollout(rollout: CodexRolloutIdentity): {
7
+ fd: number;
8
+ stat: fs.Stats;
9
+ };
10
+ export declare function assertPrivateRegularFile(stat: fs.Stats): void;
11
+ export declare function fileEndsWithNewline(fd: number, size: number): boolean;
12
+ export declare function byteAtOffset(fd: number, offset: number): number | undefined;
13
+ export declare function sameStableFile(left: fs.Stats, right: fs.Stats): boolean;
14
+ export declare function sameRolloutIdentity(left: CodexRolloutIdentity, right: CodexRolloutIdentity): boolean;
15
+ export declare function sameRolloutFileIdentity(left: CodexRolloutIdentity, right: CodexRolloutIdentity): boolean;
@@ -0,0 +1,98 @@
1
+ // Descriptor identity and stable byte reads for legacy Codex rollouts.
2
+ import { parsedInteger, } from "./terminal-submission-facts.js";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ export const CODEX_COMPLETION_MAX_BYTES = 256 * 1024 * 1024;
6
+ const CODEX_ROLLOUT_HEADER_MAX_BYTES = 1024 * 1024;
7
+ const NO_FOLLOW_FLAG = typeof fs.constants.O_NOFOLLOW === "number"
8
+ ? fs.constants.O_NOFOLLOW
9
+ : 0;
10
+ export function readCodexRolloutHeader(fd, size) {
11
+ const bytesToRead = Math.min(size, CODEX_ROLLOUT_HEADER_MAX_BYTES);
12
+ const buffer = readExactBytes(fd, 0, bytesToRead);
13
+ const newline = buffer.indexOf(0x0a);
14
+ if (newline < 0) {
15
+ throw new Error("Codex active-task rollout header exceeded the safe read limit");
16
+ }
17
+ return buffer.subarray(0, newline + 1);
18
+ }
19
+ export function readExactBytes(fd, offset, length) {
20
+ const buffer = Buffer.allocUnsafe(length);
21
+ let total = 0;
22
+ while (total < length) {
23
+ const read = fs.readSync(fd, buffer, total, length - total, offset + total);
24
+ if (read === 0) {
25
+ break;
26
+ }
27
+ total += read;
28
+ }
29
+ if (total !== length) {
30
+ throw new Error("Codex rollout changed while it was being read");
31
+ }
32
+ return buffer;
33
+ }
34
+ export function openExactRollout(rollout) {
35
+ if (!path.isAbsolute(rollout.path)) {
36
+ throw new Error("Codex rollout path is not absolute");
37
+ }
38
+ const before = fs.lstatSync(rollout.path);
39
+ if (!before.isFile() || before.isSymbolicLink()) {
40
+ throw new Error("Codex rollout path is not a regular file");
41
+ }
42
+ const fd = fs.openSync(rollout.path, fs.constants.O_RDONLY | NO_FOLLOW_FLAG);
43
+ try {
44
+ const stat = fs.fstatSync(fd);
45
+ if (BigInt(stat.dev) !== parsedInteger(rollout.device) ||
46
+ BigInt(stat.ino) !== parsedInteger(rollout.inode)) {
47
+ throw new Error("Codex rollout descriptor identity does not match its open file");
48
+ }
49
+ return { fd, stat };
50
+ }
51
+ catch (error) {
52
+ fs.closeSync(fd);
53
+ throw error;
54
+ }
55
+ }
56
+ export function assertPrivateRegularFile(stat) {
57
+ if (!stat.isFile()) {
58
+ throw new Error("Codex rollout is not a regular file");
59
+ }
60
+ if (process.platform !== "win32" &&
61
+ typeof process.getuid === "function" &&
62
+ stat.uid !== process.getuid()) {
63
+ throw new Error("Codex rollout is not owned by the current user");
64
+ }
65
+ if (process.platform !== "win32" && (stat.mode & 0o022) !== 0) {
66
+ throw new Error("Codex rollout is writable by another user");
67
+ }
68
+ }
69
+ export function fileEndsWithNewline(fd, size) {
70
+ if (size <= 0) {
71
+ return true;
72
+ }
73
+ const last = Buffer.allocUnsafe(1);
74
+ return fs.readSync(fd, last, 0, 1, size - 1) === 1 && last[0] === 0x0a;
75
+ }
76
+ export function byteAtOffset(fd, offset) {
77
+ const buffer = Buffer.allocUnsafe(1);
78
+ return fs.readSync(fd, buffer, 0, 1, offset) === 1
79
+ ? buffer[0]
80
+ : undefined;
81
+ }
82
+ export function sameStableFile(left, right) {
83
+ return left.dev === right.dev &&
84
+ left.ino === right.ino &&
85
+ left.size === right.size &&
86
+ left.mtimeMs === right.mtimeMs &&
87
+ left.ctimeMs === right.ctimeMs;
88
+ }
89
+ export function sameRolloutIdentity(left, right) {
90
+ return left.fd === right.fd &&
91
+ sameRolloutFileIdentity(left, right);
92
+ }
93
+ export function sameRolloutFileIdentity(left, right) {
94
+ return left.device === right.device &&
95
+ left.inode === right.inode &&
96
+ left.path === right.path;
97
+ }
98
+ //# sourceMappingURL=codex-rollout-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-rollout-file.js","sourceRoot":"","sources":["../../src/codex-rollout-file.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,OAAO,EAEL,aAAa,GACd,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5D,MAAM,8BAA8B,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD,MAAM,cAAc,GAAG,OAAO,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,QAAQ;IAChE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU;IACzB,CAAC,CAAC,CAAC,CAAC;AAEN,MAAM,UAAU,sBAAsB,CAAC,EAAU,EAAE,IAAY;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,MAAc,EAAE,MAAc;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;QAC5E,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,IAAI,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA6B;IAI5D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CACpB,OAAO,CAAC,IAAI,EACZ,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,cAAc,CACvC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9B,IACE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EACjD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5B,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;QACpC,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,EAC7B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU,EAAE,IAAY;IAC1D,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,MAAc;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAc,EAAE,KAAe;IAC5D,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QAC3B,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QACtB,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;QACxB,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC9B,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAA0B,EAC1B,KAA2B;IAE3B,OAAO,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;QACzB,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAA0B,EAC1B,KAA2B;IAE3B,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QACjC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAC1B,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { type TerminalCompletionEvidence } from "./terminal-agent-adapter.js";
2
+ import { type CodexRolloutAcceptanceIdentity, type CodexRolloutIdentity } from "./terminal-submission-facts.js";
3
+ /**
4
+ * Durable identity for one already-running Codex task that was started by the
5
+ * human in the TUI. The prompt itself is deliberately omitted; the exact root
6
+ * user row is represented only by its SHA-256 digest and native turn UUID.
7
+ */
8
+ export interface CodexHumanStartedActiveTaskAnchor {
9
+ schema: "agent-knock-knock/codex-human-started-active-task-anchor";
10
+ version: 1;
11
+ native_thread_id: string;
12
+ process_uuid: string;
13
+ process_birth: string;
14
+ captured_at: string;
15
+ rollout: CodexRolloutIdentity;
16
+ turn_id: string;
17
+ request_hash: string;
18
+ codex_version: string;
19
+ task_started_offset_bytes: number;
20
+ user_message_offset_bytes: number;
21
+ observed_end_offset_bytes: number;
22
+ anchor_fingerprint: string;
23
+ }
24
+ export interface CaptureCodexHumanStartedActiveTaskOptions {
25
+ currentIdentity: CodexRolloutAcceptanceIdentity;
26
+ now?: Date;
27
+ maxBytes?: number;
28
+ }
29
+ export interface ObserveCodexHumanStartedActiveTaskOptions {
30
+ anchor: CodexHumanStartedActiveTaskAnchor;
31
+ currentIdentity: CodexRolloutAcceptanceIdentity;
32
+ maxBytes?: number;
33
+ /** Last complete, stable JSONL boundary returned by a prior observation. */
34
+ resumeOffsetBytes?: number;
35
+ }
36
+ export type CodexHumanStartedActiveTaskObservation = {
37
+ status: "pending";
38
+ observedEndOffsetBytes: number;
39
+ safeResumeOffsetBytes: number;
40
+ } | {
41
+ status: "completed";
42
+ completion: TerminalCompletionEvidence & {
43
+ outcome: "success" | "failure";
44
+ };
45
+ } | {
46
+ status: "invalidated";
47
+ reason: string;
48
+ } | {
49
+ status: "unavailable";
50
+ reason: string;
51
+ retryable: true;
52
+ };
53
+ /**
54
+ * Capture the latest active native task in an exact open Codex rollout.
55
+ * This is intentionally separate from the pre-send acceptance anchor: all
56
+ * task-start and root-user evidence already exists when this function runs.
57
+ */
58
+ export declare function captureCodexHumanStartedActiveTaskAnchor(options: CaptureCodexHumanStartedActiveTaskOptions): CodexHumanStartedActiveTaskAnchor | undefined;
59
+ /** Observe only the exact human-started task named by the persisted anchor. */
60
+ export declare function observeCodexHumanStartedActiveTask(options: ObserveCodexHumanStartedActiveTaskOptions): CodexHumanStartedActiveTaskObservation;
61
+ export declare function validateCodexHumanStartedActiveTaskAnchor(value: unknown): CodexHumanStartedActiveTaskAnchor;