@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.
- package/CHANGELOG.md +15 -0
- package/README.md +4 -4
- package/dist/src/claude-terminal-agent-adapter.js +1 -1
- package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
- package/dist/src/codex-app-server-interaction-client.js +68 -26
- package/dist/src/codex-app-server-interaction-client.js.map +1 -1
- package/dist/src/codex-app-server-read-client.js +52 -20
- package/dist/src/codex-app-server-read-client.js.map +1 -1
- package/dist/src/codex-astra-composer-proof.js +1 -1
- package/dist/src/codex-astra-composer-proof.js.map +1 -1
- package/dist/src/codex-async-question-adapter.js +14 -4
- package/dist/src/codex-async-question-adapter.js.map +1 -1
- package/dist/src/codex-lifecycle-compatibility.d.ts +1 -1
- package/dist/src/codex-lifecycle-compatibility.js +9 -3
- package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
- package/dist/src/codex-open-rollout-inventory.d.ts +51 -0
- package/dist/src/codex-open-rollout-inventory.js +365 -0
- package/dist/src/codex-open-rollout-inventory.js.map +1 -0
- package/dist/src/codex-paginated-thread-binding.js +1 -1
- package/dist/src/codex-paginated-thread-binding.js.map +1 -1
- package/dist/src/codex-permission-surface.d.ts +1 -1
- package/dist/src/codex-permission-surface.js +1 -1
- package/dist/src/codex-permission-surface.js.map +1 -1
- package/dist/src/codex-rollout-bound-completion.d.ts +44 -0
- package/dist/src/codex-rollout-bound-completion.js +357 -0
- package/dist/src/codex-rollout-bound-completion.js.map +1 -0
- package/dist/src/codex-rollout-file.d.ts +15 -0
- package/dist/src/codex-rollout-file.js +98 -0
- package/dist/src/codex-rollout-file.js.map +1 -0
- package/dist/src/codex-rollout-human-task.d.ts +61 -0
- package/dist/src/codex-rollout-human-task.js +555 -0
- package/dist/src/codex-rollout-human-task.js.map +1 -0
- package/dist/src/codex-rollout-interaction-evidence.d.ts +48 -0
- package/dist/src/codex-rollout-interaction-evidence.js +521 -0
- package/dist/src/codex-rollout-interaction-evidence.js.map +1 -0
- package/dist/src/codex-rollout-inventory.d.ts +5 -0
- package/dist/src/codex-rollout-inventory.js +81 -0
- package/dist/src/codex-rollout-inventory.js.map +1 -0
- package/dist/src/codex-rollout-records.d.ts +49 -0
- package/dist/src/codex-rollout-records.js +298 -0
- package/dist/src/codex-rollout-records.js.map +1 -0
- package/dist/src/codex-sqlite-thread-query.d.ts +85 -0
- package/dist/src/codex-sqlite-thread-query.js +440 -0
- package/dist/src/codex-sqlite-thread-query.js.map +1 -0
- package/dist/src/codex-status-history-navigation.d.ts +1 -1
- package/dist/src/codex-status-history-navigation.js +1 -1
- package/dist/src/codex-status-history-navigation.js.map +1 -1
- package/dist/src/codex-store-adapter.d.ts +3 -50
- package/dist/src/codex-store-adapter.js +5 -796
- package/dist/src/codex-store-adapter.js.map +1 -1
- package/dist/src/codex-terminal-agent-adapter.js +4 -2
- package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
- package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +4 -134
- package/dist/src/native-thread-lifecycle-cli-adapter.js +19 -633
- package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
- package/dist/src/native-thread-lifecycle-cli-contract.d.ts +138 -0
- package/dist/src/native-thread-lifecycle-cli-contract.js +2 -0
- package/dist/src/native-thread-lifecycle-cli-contract.js.map +1 -0
- package/dist/src/semantic-permission-control.js +33 -6
- package/dist/src/semantic-permission-control.js.map +1 -1
- package/dist/src/semantic-tool-descriptions.d.ts +26 -0
- package/dist/src/semantic-tool-descriptions.js +259 -0
- package/dist/src/semantic-tool-descriptions.js.map +1 -0
- package/dist/src/semantic-tool-runtime.js +45 -37
- package/dist/src/semantic-tool-runtime.js.map +1 -1
- package/dist/src/semantic-tool-schemas.js +134 -33
- package/dist/src/semantic-tool-schemas.js.map +1 -1
- package/dist/src/terminal-action-contracts.d.ts +4 -0
- package/dist/src/terminal-action-contracts.js +695 -0
- package/dist/src/terminal-action-contracts.js.map +1 -0
- package/dist/src/terminal-composer-classifier.d.ts +1 -1
- package/dist/src/terminal-composer-classifier.js +2 -2
- package/dist/src/terminal-composer-classifier.js.map +1 -1
- package/dist/src/terminal-interaction-response-bridge.js +1 -1
- package/dist/src/terminal-interaction-response-bridge.js.map +1 -1
- package/dist/src/terminal-list-renderer.d.ts +1 -2
- package/dist/src/terminal-list-renderer.js +8 -424
- package/dist/src/terminal-list-renderer.js.map +1 -1
- package/dist/src/terminal-model-control-action-policy.d.ts +1 -1
- package/dist/src/terminal-model-control-availability.d.ts +1 -1
- package/dist/src/terminal-model-control-availability.js +1 -1
- package/dist/src/terminal-model-control-availability.js.map +1 -1
- package/dist/src/terminal-model-control-cli-adapter.d.ts +34 -0
- package/dist/src/terminal-model-control-cli-adapter.js +669 -0
- package/dist/src/terminal-model-control-cli-adapter.js.map +1 -0
- package/dist/src/terminal-model-control-contract.d.ts +198 -0
- package/dist/src/terminal-model-control-contract.js +15 -0
- package/dist/src/terminal-model-control-contract.js.map +1 -0
- package/dist/src/terminal-model-control-input.d.ts +29 -0
- package/dist/src/terminal-model-control-input.js +86 -0
- package/dist/src/terminal-model-control-input.js.map +1 -0
- package/dist/src/terminal-model-control-profile.d.ts +5 -1
- package/dist/src/terminal-model-control-profile.js +21 -7
- package/dist/src/terminal-model-control-profile.js.map +1 -1
- package/dist/src/terminal-model-control-subject.d.ts +52 -0
- package/dist/src/terminal-model-control-subject.js +73 -0
- package/dist/src/terminal-model-control-subject.js.map +1 -1
- package/dist/src/terminal-model-control-surface.d.ts +82 -0
- package/dist/src/terminal-model-control-surface.js +688 -0
- package/dist/src/terminal-model-control-surface.js.map +1 -0
- package/dist/src/terminal-model-control.d.ts +6 -270
- package/dist/src/terminal-model-control.js +11 -988
- package/dist/src/terminal-model-control.js.map +1 -1
- package/dist/src/terminal-model-selection.d.ts +33 -0
- package/dist/src/terminal-model-selection.js +143 -0
- package/dist/src/terminal-model-selection.js.map +1 -0
- package/dist/src/terminal-monitor-application-service.js +38 -59
- package/dist/src/terminal-monitor-application-service.js.map +1 -1
- package/dist/src/terminal-monitor-attention-store.d.ts +65 -0
- package/dist/src/terminal-monitor-attention-store.js +518 -0
- package/dist/src/terminal-monitor-attention-store.js.map +1 -0
- package/dist/src/terminal-monitor-collateral-recovery.d.ts +12 -0
- package/dist/src/terminal-monitor-collateral-recovery.js +415 -0
- package/dist/src/terminal-monitor-collateral-recovery.js.map +1 -0
- package/dist/src/terminal-monitor-interaction-projection.d.ts +19 -0
- package/dist/src/terminal-monitor-interaction-projection.js +48 -0
- package/dist/src/terminal-monitor-interaction-projection.js.map +1 -0
- package/dist/src/terminal-monitor-startup-recovery.d.ts +15 -0
- package/dist/src/terminal-monitor-startup-recovery.js +767 -0
- package/dist/src/terminal-monitor-startup-recovery.js.map +1 -0
- package/dist/src/terminal-monitor-state-cli-adapter.d.ts +2 -104
- package/dist/src/terminal-monitor-state-cli-adapter.js +28 -1640
- package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-state-contract.d.ts +108 -0
- package/dist/src/terminal-monitor-state-contract.js +8 -0
- package/dist/src/terminal-monitor-state-contract.js.map +1 -0
- package/dist/src/terminal-native-inspection-bridge.d.ts +4 -153
- package/dist/src/terminal-native-inspection-bridge.js +7 -646
- package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
- package/dist/src/terminal-native-inspection-contract.d.ts +128 -0
- package/dist/src/terminal-native-inspection-contract.js +38 -0
- package/dist/src/terminal-native-inspection-contract.js.map +1 -0
- package/dist/src/terminal-native-inspection-profile.d.ts +15 -0
- package/dist/src/terminal-native-inspection-profile.js +189 -0
- package/dist/src/terminal-native-inspection-profile.js.map +1 -0
- package/dist/src/terminal-native-inspection-proof.d.ts +62 -0
- package/dist/src/terminal-native-inspection-proof.js +362 -0
- package/dist/src/terminal-native-inspection-proof.js.map +1 -0
- package/dist/src/terminal-permission-control-bridge.js +1 -1
- package/dist/src/terminal-permission-control-bridge.js.map +1 -1
- package/dist/src/terminal-permission-control.js +5 -1
- package/dist/src/terminal-permission-control.js.map +1 -1
- package/dist/src/terminal-questionnaire-adapter.js +5 -2
- package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
- package/dist/src/terminal-runtime-cli-adapter.d.ts +2 -1
- package/dist/src/terminal-runtime-cli-adapter.js +1 -1
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
- package/dist/src/terminal-submission-acceptance.d.ts +5 -148
- package/dist/src/terminal-submission-acceptance.js +21 -1845
- package/dist/src/terminal-submission-acceptance.js.map +1 -1
- package/dist/src/terminal-watch-anchor-capture.d.ts +9 -0
- package/dist/src/terminal-watch-anchor-capture.js +139 -0
- package/dist/src/terminal-watch-anchor-capture.js.map +1 -0
- package/dist/src/terminal-watch-cli-adapter.d.ts +3 -117
- package/dist/src/terminal-watch-cli-adapter.js +10 -1992
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-cli-contract.d.ts +117 -0
- package/dist/src/terminal-watch-cli-contract.js +2 -0
- package/dist/src/terminal-watch-cli-contract.js.map +1 -0
- package/dist/src/terminal-watch-fallback-observation.d.ts +15 -0
- package/dist/src/terminal-watch-fallback-observation.js +249 -0
- package/dist/src/terminal-watch-fallback-observation.js.map +1 -0
- package/dist/src/terminal-watch-interaction-observation.d.ts +26 -0
- package/dist/src/terminal-watch-interaction-observation.js +262 -0
- package/dist/src/terminal-watch-interaction-observation.js.map +1 -0
- package/dist/src/terminal-watch-observation-adapter.d.ts +4 -0
- package/dist/src/terminal-watch-observation-adapter.js +307 -0
- package/dist/src/terminal-watch-observation-adapter.js.map +1 -0
- package/dist/src/terminal-watch-observation-evidence.d.ts +25 -0
- package/dist/src/terminal-watch-observation-evidence.js +184 -0
- package/dist/src/terminal-watch-observation-evidence.js.map +1 -0
- package/dist/src/terminal-watch-response-authority.d.ts +6 -0
- package/dist/src/terminal-watch-response-authority.js +333 -0
- package/dist/src/terminal-watch-response-authority.js.map +1 -0
- package/dist/src/terminal-watch-response-cli-adapter.d.ts +3 -0
- package/dist/src/terminal-watch-response-cli-adapter.js +230 -0
- package/dist/src/terminal-watch-response-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-terminal-identity.d.ts +39 -0
- package/dist/src/terminal-watch-terminal-identity.js +380 -0
- package/dist/src/terminal-watch-terminal-identity.js.map +1 -0
- package/docs/codex-0.160.0-compatibility.md +126 -0
- package/docs/codex-permissions.md +12 -1
- package/package.json +3 -2
- 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":"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"}
|
|
@@ -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;
|