@scotthuang/agent-knock-knock 0.13.13 → 0.13.15
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 +20 -0
- package/README.md +4 -4
- package/dist/src/claude-lifecycle-compatibility.js +25 -4
- package/dist/src/claude-lifecycle-compatibility.js.map +1 -1
- package/dist/src/claude-local-transcript-provider.js +12 -19
- package/dist/src/claude-local-transcript-provider.js.map +1 -1
- package/dist/src/claude-terminal-agent-adapter.js +27 -11
- package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
- package/dist/src/claude-transcript-record-order.d.ts +17 -0
- package/dist/src/claude-transcript-record-order.js +81 -0
- package/dist/src/claude-transcript-record-order.js.map +1 -0
- package/dist/src/codex-app-server-interaction-client.js +4 -3
- package/dist/src/codex-app-server-interaction-client.js.map +1 -1
- package/dist/src/codex-app-server-read-client.d.ts +19 -1
- package/dist/src/codex-app-server-read-client.js +81 -34
- package/dist/src/codex-app-server-read-client.js.map +1 -1
- package/dist/src/codex-async-question-adapter.js +4 -2
- package/dist/src/codex-async-question-adapter.js.map +1 -1
- package/dist/src/codex-fullscreen-composer-proof.d.ts +3 -1
- package/dist/src/codex-fullscreen-composer-proof.js +113 -17
- package/dist/src/codex-fullscreen-composer-proof.js.map +1 -1
- package/dist/src/codex-lifecycle-compatibility.d.ts +13 -1
- package/dist/src/codex-lifecycle-compatibility.js +37 -2
- package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
- package/dist/src/codex-paginated-async-answer.js +21 -11
- package/dist/src/codex-paginated-async-answer.js.map +1 -1
- package/dist/src/codex-paginated-async-response.js +3 -2
- package/dist/src/codex-paginated-async-response.js.map +1 -1
- package/dist/src/codex-paginated-observation.d.ts +1 -0
- package/dist/src/codex-paginated-observation.js +15 -3
- package/dist/src/codex-paginated-observation.js.map +1 -1
- package/dist/src/codex-paginated-questionnaire-runtime.js +2 -1
- package/dist/src/codex-paginated-questionnaire-runtime.js.map +1 -1
- package/dist/src/codex-paginated-task.d.ts +8 -3
- package/dist/src/codex-paginated-task.js +44 -16
- package/dist/src/codex-paginated-task.js.map +1 -1
- package/dist/src/codex-paginated-thread-binding.d.ts +9 -0
- package/dist/src/codex-paginated-thread-binding.js +66 -27
- package/dist/src/codex-paginated-thread-binding.js.map +1 -1
- package/dist/src/codex-paginated-thread-facts.d.ts +4 -2
- package/dist/src/codex-paginated-watch.d.ts +1 -1
- package/dist/src/codex-paginated-watch.js +24 -5
- package/dist/src/codex-paginated-watch.js.map +1 -1
- package/dist/src/codex-status-history-navigation.d.ts +17 -0
- package/dist/src/codex-status-history-navigation.js +261 -0
- package/dist/src/codex-status-history-navigation.js.map +1 -0
- package/dist/src/codex-terminal-agent-adapter.d.ts +2 -0
- package/dist/src/codex-terminal-agent-adapter.js +35 -17
- package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
- package/dist/src/herdr-terminal-control-provider.d.ts +2 -0
- package/dist/src/herdr-terminal-control-provider.js +35 -8
- package/dist/src/herdr-terminal-control-provider.js.map +1 -1
- package/dist/src/semantic-tool-schemas.js +1 -1
- package/dist/src/semantic-tool-schemas.js.map +1 -1
- package/dist/src/store.d.ts +1 -1
- package/dist/src/store.js +2 -2
- package/dist/src/store.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +2 -1
- package/dist/src/terminal-agent-bridge.js +80 -10
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-composer-classifier.js +8 -2
- package/dist/src/terminal-composer-classifier.js.map +1 -1
- package/dist/src/terminal-control-provider.d.ts +4 -0
- package/dist/src/terminal-control-provider.js +57 -6
- package/dist/src/terminal-control-provider.js.map +1 -1
- package/dist/src/terminal-human-explicit-send-cli-adapter.js +11 -0
- package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -1
- package/dist/src/terminal-model-control-profile.d.ts +3 -1
- package/dist/src/terminal-model-control-profile.js +45 -2
- package/dist/src/terminal-model-control-profile.js.map +1 -1
- package/dist/src/terminal-native-inspection-bridge.js +53 -22
- package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
- package/dist/src/terminal-questionnaire-adapter.js +24 -4
- package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
- package/dist/src/terminal-runtime-cli-adapter.js +3 -3
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
- package/dist/src/terminal-send-watch-policy.js +9 -11
- package/dist/src/terminal-send-watch-policy.js.map +1 -1
- package/dist/src/terminal-watch-cli-adapter.d.ts +5 -10
- package/dist/src/terminal-watch-cli-adapter.js +51 -32
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-codec.js +11 -2
- package/dist/src/terminal-watch-codec.js.map +1 -1
- package/dist/src/terminal-watch-interaction-runtime.js +3 -1
- package/dist/src/terminal-watch-interaction-runtime.js.map +1 -1
- package/dist/src/terminal-watch-record.d.ts +8 -1
- package/dist/src/terminal-watch-record.js +16 -2
- package/dist/src/terminal-watch-record.js.map +1 -1
- package/dist/src/terminal-watch-send-activity.d.ts +28 -0
- package/dist/src/terminal-watch-send-activity.js +65 -0
- package/dist/src/terminal-watch-send-activity.js.map +1 -0
- package/dist/src/terminal-watch-service.d.ts +5 -0
- package/dist/src/terminal-watch-service.js +53 -6
- package/dist/src/terminal-watch-service.js.map +1 -1
- package/docs/callback-compatibility.md +84 -0
- package/docs/claude-2.1.285-compatibility.md +133 -0
- package/docs/codex-0.159.0-compatibility.md +82 -0
- package/docs/codex-0.159.2-compatibility.md +226 -0
- package/docs/quickstart-herdr.md +2 -2
- package/docs/quickstart-tmux.md +3 -3
- package/package.json +5 -2
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +18 -18
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { codexNativeInspectionCompatibilityProfile, isCodexPaginatedReadCandidate } from "./codex-lifecycle-compatibility.js";
|
|
3
|
+
import { captureCodexFullscreenComposerFrame } from "./codex-fullscreen-composer-proof.js";
|
|
4
|
+
import { closedCodex159StatusSuffix, observeCodexNativeInspection } from "./codex-terminal-agent-adapter.js";
|
|
5
|
+
import { exactCodexReadyStyledComposerCapture, stripTerminalEscapeSequences } from "./terminal-native-inspection-bridge.js";
|
|
6
|
+
/** Only the recognized owned-screen navigation grammar, never a generic pager. */
|
|
7
|
+
const PAUSED_FOOTER = /^ {2}(?:New activity · )?enter\/esc latest · \? shortcuts(?: {2,}⚠ [1-9]\d? warnings? · f2 to view)?$/u;
|
|
8
|
+
const HISTORY_GAP = /^ +(?:New activity · )?↓ Back to bottom · esc *$/u;
|
|
9
|
+
const SESSION = /^ {2}Session: {2,}[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/u;
|
|
10
|
+
const FIELD = /^ {2}[A-Za-z][^:│]{0,63}: {2,}\S.*$/u;
|
|
11
|
+
const INFO = new Set([
|
|
12
|
+
" Visit https://chatgpt.com/codex/settings/usage for up-to-date",
|
|
13
|
+
" information on rate limits and credits"
|
|
14
|
+
]);
|
|
15
|
+
class MissingStatusOverlap extends Error {
|
|
16
|
+
}
|
|
17
|
+
function lines(screen) {
|
|
18
|
+
return screen.replace(/\r\n?/gu, "\n").split("\n");
|
|
19
|
+
}
|
|
20
|
+
function plainRows(rows) {
|
|
21
|
+
return rows.map((row) => stripTerminalEscapeSequences(row).trimEnd());
|
|
22
|
+
}
|
|
23
|
+
function trimEmptyEnd(rows) {
|
|
24
|
+
while (rows.length && !stripTerminalEscapeSequences(rows.at(-1)).trim())
|
|
25
|
+
rows.pop();
|
|
26
|
+
return rows;
|
|
27
|
+
}
|
|
28
|
+
function completeStatus(screen, version) {
|
|
29
|
+
return observeCodexNativeInspection({
|
|
30
|
+
operation: { kind: "status" }, expectedAgentVersion: version,
|
|
31
|
+
screen: stripTerminalEscapeSequences(screen)
|
|
32
|
+
}).status === "observed";
|
|
33
|
+
}
|
|
34
|
+
/** A clipped card tail is navigation eligibility, never independent identity evidence. */
|
|
35
|
+
function clippedTail(screen, version) {
|
|
36
|
+
if (!exactCodexReadyStyledComposerCapture(screen, version))
|
|
37
|
+
return undefined;
|
|
38
|
+
const frame = captureCodexFullscreenComposerFrame(screen, version);
|
|
39
|
+
const start = /^[›»](?:\s|$)/u.test(frame.plainLines[0] ?? "") ? 1 : 0;
|
|
40
|
+
let end = frame.composerIndex;
|
|
41
|
+
const session = frame.plainLines.findIndex((row, index) => index >= start && index < end && SESSION.test(row.trimEnd()));
|
|
42
|
+
if (session < 0)
|
|
43
|
+
return undefined;
|
|
44
|
+
for (let index = start; index < end; index += 1) {
|
|
45
|
+
const row = frame.plainLines[index].trimEnd();
|
|
46
|
+
if (!row.trim() || FIELD.test(row) || INFO.has(row) || /^ {4,}\S/u.test(row) ||
|
|
47
|
+
index === start && row === ` >_ OpenAI Codex (v${version})`)
|
|
48
|
+
continue;
|
|
49
|
+
if (index <= session)
|
|
50
|
+
return undefined;
|
|
51
|
+
end = index; // Native working/queue chrome is validated by the complete-card parser later.
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
const liveChrome = frame.plainLines.slice(end, frame.composerIndex).filter((row) => row.trim()).map((row) => row.trimEnd());
|
|
55
|
+
if (!closedCodex159StatusSuffix(liveChrome))
|
|
56
|
+
return undefined;
|
|
57
|
+
const rows = trimEmptyEnd(frame.styledLines.slice(start, end));
|
|
58
|
+
const plain = plainRows(rows);
|
|
59
|
+
if (!plain.some((row) => /^ {2}Directory: {2,}\S/u.test(row)) ||
|
|
60
|
+
!plain.some((row) => /^ {2}Permissions: {2,}\S/u.test(row)) ||
|
|
61
|
+
!plain.some((row) => /^ {2}Agents\.md: {2,}\S/u.test(row)))
|
|
62
|
+
return undefined;
|
|
63
|
+
return {
|
|
64
|
+
rows, plain,
|
|
65
|
+
liveChrome,
|
|
66
|
+
footer: frame.plainLines[frame.footerIndex].trimEnd()
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function normalizedChrome(rows) {
|
|
70
|
+
return JSON.stringify(rows.map((row) => row
|
|
71
|
+
.replace(/^[•◦] /u, "• ")
|
|
72
|
+
.replace(/\((?:(?:\d+h )?\d+m )?\d+s • esc to interrupt\)/u, "(elapsed • esc to interrupt)")
|
|
73
|
+
.replace(/^( {2}\? [1-9]\d{0,2} questions?) · (?:[1-9]|1\d|20)s$/u, "$1")));
|
|
74
|
+
}
|
|
75
|
+
function currentChromeBoundary(rows, end) {
|
|
76
|
+
const tail = plainRows(rows.slice(0, end)).flatMap((row, index) => row.trim() ? [{ row, index }] : []).slice(-8);
|
|
77
|
+
const start = tail.findIndex(({ row }) => row === "• Queued follow-up inputs" ||
|
|
78
|
+
closedCodex159StatusSuffix([row]) || / to interrupt/u.test(row));
|
|
79
|
+
if (start < 0)
|
|
80
|
+
return end; // The task may have finished and removed its entire live bottom pane.
|
|
81
|
+
return closedCodex159StatusSuffix(tail.slice(start).map(({ row }) => row)) ? tail[start].index : undefined;
|
|
82
|
+
}
|
|
83
|
+
function historyBeforeChrome(rows, end, tail, restoreOnly) {
|
|
84
|
+
if (restoreOnly) {
|
|
85
|
+
const boundary = currentChromeBoundary(rows, end);
|
|
86
|
+
return boundary === undefined ? undefined : {
|
|
87
|
+
rows: trimEmptyEnd(rows.slice(0, boundary)), transcriptBottom: boundary, screenRows: rows.length
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const indexed = plainRows(rows.slice(0, end)).flatMap((row, index) => row.trim() ? [{ row, index }] : []);
|
|
91
|
+
if (tail.liveChrome.length > 0) {
|
|
92
|
+
const suffix = indexed.slice(-tail.liveChrome.length);
|
|
93
|
+
const chrome = suffix.map(({ row }) => row);
|
|
94
|
+
if (!closedCodex159StatusSuffix(chrome) || normalizedChrome(chrome) !== normalizedChrome(tail.liveChrome))
|
|
95
|
+
return undefined;
|
|
96
|
+
end = suffix[0].index;
|
|
97
|
+
}
|
|
98
|
+
return { rows: trimEmptyEnd(rows.slice(0, end)), transcriptBottom: end, screenRows: rows.length };
|
|
99
|
+
}
|
|
100
|
+
/** Normalize only the exact native paused footer for the existing styled Composer proof. */
|
|
101
|
+
function pausedHistory(screen, version, tail, restoreOnly = false) {
|
|
102
|
+
const rows = trimEmptyEnd(lines(screen));
|
|
103
|
+
const plain = plainRows(rows);
|
|
104
|
+
if (!PAUSED_FOOTER.test(plain.at(-1) ?? ""))
|
|
105
|
+
return undefined;
|
|
106
|
+
const normalized = [...rows.slice(0, -1), " ← for agents · ? for shortcuts"].join("\n");
|
|
107
|
+
if (!exactCodexReadyStyledComposerCapture(normalized, version))
|
|
108
|
+
return undefined;
|
|
109
|
+
const frame = captureCodexFullscreenComposerFrame(normalized, version);
|
|
110
|
+
if (frame.plainLines[frame.footerIndex].trimEnd() !== tail.footer)
|
|
111
|
+
return undefined;
|
|
112
|
+
const gaps = plain.flatMap((row, index) => HISTORY_GAP.test(row) ? [index] : []);
|
|
113
|
+
if (gaps.length !== 1 || gaps[0] >= frame.composerIndex ||
|
|
114
|
+
plain.slice(gaps[0] + 1, frame.composerIndex).some((row) => row.trim()))
|
|
115
|
+
return undefined;
|
|
116
|
+
return historyBeforeChrome(rows, gaps[0], tail, restoreOnly);
|
|
117
|
+
}
|
|
118
|
+
function reconstruct(previous, screen, tail, version) {
|
|
119
|
+
const plain = plainRows(previous);
|
|
120
|
+
const command = plain.lastIndexOf("/status");
|
|
121
|
+
if (command < 0)
|
|
122
|
+
throw new Error("Codex history did not expose the latest /status command");
|
|
123
|
+
const prefix = previous.slice(command);
|
|
124
|
+
const prefixPlain = plain.slice(command);
|
|
125
|
+
const overlaps = [];
|
|
126
|
+
for (let size = 1; size <= Math.min(prefix.length, tail.rows.length); size += 1) {
|
|
127
|
+
const overlap = tail.plain.slice(0, size);
|
|
128
|
+
if (overlap.some((row) => row.trim().length >= 12) &&
|
|
129
|
+
JSON.stringify(prefixPlain.slice(-size)) === JSON.stringify(overlap))
|
|
130
|
+
overlaps.push(size);
|
|
131
|
+
}
|
|
132
|
+
if (overlaps.length === 0)
|
|
133
|
+
throw new MissingStatusOverlap("Codex status history overlap is missing or ambiguous");
|
|
134
|
+
if (overlaps.length !== 1)
|
|
135
|
+
throw new Error("Codex status history overlap is ambiguous");
|
|
136
|
+
const size = overlaps[0];
|
|
137
|
+
const anchor = tail.plain.slice(0, size).find((row) => row.trim().length >= 12);
|
|
138
|
+
if (prefixPlain.filter((row) => row === anchor).length !== 1 ||
|
|
139
|
+
tail.plain.filter((row) => row === anchor).length !== 1) {
|
|
140
|
+
throw new Error("Codex status history overlap is not unique");
|
|
141
|
+
}
|
|
142
|
+
const frame = captureCodexFullscreenComposerFrame(screen, version);
|
|
143
|
+
const start = /^[›»](?:\s|$)/u.test(frame.plainLines[0] ?? "") ? 1 : 0;
|
|
144
|
+
// All header/identity characters come from captured frames. The original live
|
|
145
|
+
// suffix and Composer close the reconstructed card; pager chrome never does.
|
|
146
|
+
const result = [...prefix.slice(0, -size), ...frame.styledLines.slice(start)].join("\n");
|
|
147
|
+
if (!completeStatus(result, version))
|
|
148
|
+
throw new Error("Codex reconstructed status card is incomplete or ambiguous");
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
function sameTail(screen, version, expected) {
|
|
152
|
+
const tail = clippedTail(screen, version);
|
|
153
|
+
return tail !== undefined && JSON.stringify(tail.plain) === JSON.stringify(expected.plain) &&
|
|
154
|
+
tail.footer === expected.footer;
|
|
155
|
+
}
|
|
156
|
+
function compatibleStatusPrefix(paused, screen, version) {
|
|
157
|
+
const plain = plainRows(paused.rows);
|
|
158
|
+
const command = plain.lastIndexOf("/status");
|
|
159
|
+
if (command < 0)
|
|
160
|
+
return false;
|
|
161
|
+
const frame = captureCodexFullscreenComposerFrame(screen, version);
|
|
162
|
+
if (!frame)
|
|
163
|
+
return false;
|
|
164
|
+
const start = /^[›»](?:\s|$)/u.test(frame.plainLines[0] ?? "") ? 1 : 0;
|
|
165
|
+
// This adjacency is ONLY eligibility for one read-only wheel event, never
|
|
166
|
+
// identity evidence. Reuse the strict card grammar to reject contradictory
|
|
167
|
+
// headers/fields/prose, including a command-only stub whose header is below
|
|
168
|
+
// the paused viewport. Returning identity still requires observed overlap.
|
|
169
|
+
return completeStatus([...paused.rows.slice(command), ...frame.styledLines.slice(start)].join("\n"), version);
|
|
170
|
+
}
|
|
171
|
+
async function reconstructWithBoundaryBridge(paused, screen, tail, version, ports) {
|
|
172
|
+
try {
|
|
173
|
+
return reconstruct(paused.rows, screen, tail, version);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (!(error instanceof MissingStatusOverlap) || !compatibleStatusPrefix(paused, screen, version) ||
|
|
177
|
+
!ports.inspectViewport || !ports.scrollHistoryDown)
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
const viewport = await ports.inspectViewport();
|
|
181
|
+
const fresh = pausedHistory(await ports.capture(), version, tail);
|
|
182
|
+
if (!viewport || viewport.columns < 80 || viewport.rows < 12 || !fresh ||
|
|
183
|
+
fresh.screenRows !== viewport.rows || fresh.transcriptBottom < 3 ||
|
|
184
|
+
JSON.stringify(plainRows(fresh.rows)) !== JSON.stringify(plainRows(paused.rows))) {
|
|
185
|
+
throw new Error("Codex status-boundary history scroll lacks an exact paused transcript viewport");
|
|
186
|
+
}
|
|
187
|
+
// Codex 0.159 transcript_view/input.rs: ScrollDown inside self.area advances
|
|
188
|
+
// exactly three rows. The closed provider event targets (2,2), below the
|
|
189
|
+
// one-row sticky prompt and above proven bottom-pane chrome. Never repeat it.
|
|
190
|
+
await ports.scrollHistoryDown(viewport);
|
|
191
|
+
for (let attempt = 0; attempt < 8; attempt += 1) {
|
|
192
|
+
await ports.sleep(50);
|
|
193
|
+
const after = pausedHistory(await ports.capture(), version, tail);
|
|
194
|
+
if (!after || after.screenRows !== viewport.rows)
|
|
195
|
+
throw new Error("Codex history scroll lost its exact paused viewport");
|
|
196
|
+
if (JSON.stringify(plainRows(after.rows)) !== JSON.stringify(plainRows(paused.rows))) {
|
|
197
|
+
return reconstruct(after.rows, screen, tail, version);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
throw new Error("Codex history scroll did not provide a unique nonblank status overlap");
|
|
201
|
+
}
|
|
202
|
+
async function restoreLatest(ports, version, tail) {
|
|
203
|
+
// Recapture before restoration: a user draft, modal, selection, or changed
|
|
204
|
+
// model/path footer forbids further input, even a navigation key.
|
|
205
|
+
if (!pausedHistory(await ports.capture(), version, tail, true)) {
|
|
206
|
+
throw new Error("Codex status history changed before restoring latest");
|
|
207
|
+
}
|
|
208
|
+
await ports.sendKey("C-End");
|
|
209
|
+
for (let attempt = 0; attempt < 8; attempt += 1) {
|
|
210
|
+
await ports.sleep(50);
|
|
211
|
+
const capture = await ports.capture();
|
|
212
|
+
if (sameTail(capture, version, tail))
|
|
213
|
+
return;
|
|
214
|
+
if (!pausedHistory(capture, version, tail, true))
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
throw new Error("Codex status history did not restore its exact latest card tail");
|
|
218
|
+
}
|
|
219
|
+
/** One reversible page, only after our proven closed /status Enter cleared its Composer. */
|
|
220
|
+
export async function captureCodexStatusHistory(input) {
|
|
221
|
+
const { screen, version, submission, ports } = input;
|
|
222
|
+
if (!isCodexPaginatedReadCandidate(version) || completeStatus(screen, version))
|
|
223
|
+
return screen;
|
|
224
|
+
const tail = clippedTail(screen, version);
|
|
225
|
+
if (!tail || !submission || submission.stage !== "enter_dispatched" || submission.enterCount !== 1 ||
|
|
226
|
+
submission.agent !== "codex" || submission.command !== "/status" ||
|
|
227
|
+
submission.behaviorProfile !== codexNativeInspectionCompatibilityProfile(version)?.behaviorProfile ||
|
|
228
|
+
!/^[0-9a-f]{64}$/u.test(submission.observationBaselineDigest) ||
|
|
229
|
+
createHash("sha256").update(screen).digest("hex") === submission.observationBaselineDigest)
|
|
230
|
+
return screen;
|
|
231
|
+
// The original transaction's styled command -> cleared Composer transition
|
|
232
|
+
// provides freshness. Fullscreen clipping cannot preserve occurrence counts
|
|
233
|
+
// in preEnterEvidenceInventory, including repeated identical /status cards.
|
|
234
|
+
if (!sameTail(await ports.capture(), version, tail))
|
|
235
|
+
throw new Error("Codex status tail changed before history navigation");
|
|
236
|
+
let paused;
|
|
237
|
+
let restoreNeeded = false;
|
|
238
|
+
let candidate;
|
|
239
|
+
try {
|
|
240
|
+
await ports.sendKey("PageUp");
|
|
241
|
+
for (let attempt = 0; attempt < 8; attempt += 1) {
|
|
242
|
+
await ports.sleep(50);
|
|
243
|
+
const capture = await ports.capture();
|
|
244
|
+
paused = pausedHistory(capture, version, tail);
|
|
245
|
+
restoreNeeded = paused !== undefined || pausedHistory(capture, version, tail, true) !== undefined;
|
|
246
|
+
if (paused)
|
|
247
|
+
break;
|
|
248
|
+
if (!sameTail(capture, version, tail))
|
|
249
|
+
throw new Error("Codex history navigation lost its exact Composer or native footer");
|
|
250
|
+
}
|
|
251
|
+
if (!paused)
|
|
252
|
+
throw new Error("Codex history navigation did not expose a proven paused viewport");
|
|
253
|
+
candidate = await reconstructWithBoundaryBridge(paused, screen, tail, version, ports);
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
if (restoreNeeded)
|
|
257
|
+
await restoreLatest(ports, version, tail);
|
|
258
|
+
}
|
|
259
|
+
return candidate;
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=codex-status-history-navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-status-history-navigation.js","sourceRoot":"","sources":["../../src/codex-status-history-navigation.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,8 @@ export declare function planCodexThreadLifecycle(operation: TerminalThreadLifecy
|
|
|
29
29
|
export declare function observeCodexThreadLifecycle(request: TerminalThreadLifecycleObservationRequest): TerminalThreadLifecycleObservation;
|
|
30
30
|
/** @deprecated Pass a typed observation request. */
|
|
31
31
|
export declare function observeCodexThreadLifecycle(screen: string, operation: TerminalThreadLifecycleOperation): TerminalThreadLifecycleObservation;
|
|
32
|
+
/** Native activity/details stay outside identity evidence, before the Composer. */
|
|
33
|
+
export declare function closedCodex159StatusSuffix(lines: readonly string[]): boolean;
|
|
32
34
|
export declare const codexTerminalAgentAdapter: TerminalAgentAdapter<"codex_cli">;
|
|
33
35
|
export declare function inspectCodexScreen(options: TerminalScreenInspectionOptions): TerminalScreenInspection;
|
|
34
36
|
export declare function detectCodexApprovalPrompt(screen: string): CodexApprovalPromptDetection;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { captureCodexFullscreenComposerFrame
|
|
2
|
+
import { captureCodexFullscreenComposerFrame } from "./codex-fullscreen-composer-proof.js";
|
|
3
3
|
import { classifyCodexProcess } from "./codex-session-provider.js";
|
|
4
|
-
import {
|
|
4
|
+
import { isCodexPaginatedReadCandidate, codexNativeInspectionCompatibilityProfile, codexRuntimeCompatibilityProfile, codexThreadLifecycleHistoryWarning, codexUnsupportedDurableHistoryWarning } from "./codex-lifecycle-compatibility.js";
|
|
5
5
|
import { redactString } from "./runtime-log.js";
|
|
6
6
|
import { normalizeTerminalApprovalPromptRegion, terminalApprovalPromptEvidence } from "./terminal-agent-adapter.js";
|
|
7
7
|
import { isExactNativeThreadId } from "./managed-session.js";
|
|
@@ -20,7 +20,10 @@ const CODEX_SKILLS_HINT = /^[›»]\s+Use \/skills\b/u;
|
|
|
20
20
|
const CODEX_FOOTER_LINE = /^(?:gpt-[\w.-]+(?:\s|$)|[-\w.]+ default ·)/u;
|
|
21
21
|
// Diagnostic activity only. These fullscreen rows do not prove a task identity,
|
|
22
22
|
// an empty styled Composer, or permission to use a version-bound native action.
|
|
23
|
-
|
|
23
|
+
function codexFullscreenActivityCandidate(version) {
|
|
24
|
+
return version === "0.157.0" || version === "0.157.1" ||
|
|
25
|
+
isCodexPaginatedReadCandidate(version);
|
|
26
|
+
}
|
|
24
27
|
const CODEX_FULLSCREEN_MODEL_FOOTER = /^ {2}(?:GPT-[\w.-]+|gpt-[\w.-]+) (?:low|medium|high|xhigh|max|ultra)(?: fast)? · (?:~\/|\/)[^·\r\n]+(?: · [^·\r\n]+)*$/u;
|
|
25
28
|
const CODEX_FULLSCREEN_SHORTCUT_FOOTER = /^ {2}← for agents · \? for shortcuts(?: {2,}⚠ [1-9]\d? warnings? · f2 to view)?$/u;
|
|
26
29
|
// Verified Codex releases can animate the otherwise empty Astra Composer by replacing
|
|
@@ -96,7 +99,7 @@ export function probeCodexNativeInspection(agentVersion) {
|
|
|
96
99
|
reason: "the running Codex version could not be verified"
|
|
97
100
|
};
|
|
98
101
|
}
|
|
99
|
-
const runtimeProfile =
|
|
102
|
+
const runtimeProfile = codexNativeInspectionCompatibilityProfile(agentVersion);
|
|
100
103
|
if (!runtimeProfile) {
|
|
101
104
|
return {
|
|
102
105
|
status: "unsupported",
|
|
@@ -122,11 +125,13 @@ export function probeCodexNativeInspection(agentVersion) {
|
|
|
122
125
|
statusInspection: true,
|
|
123
126
|
reason: runtimeProfile.versionCompatibility === "verified"
|
|
124
127
|
? "Codex /status native inspection is supported by the verified version"
|
|
125
|
-
:
|
|
128
|
+
: isCodexPaginatedReadCandidate(agentVersion)
|
|
129
|
+
? "Codex /status may use the shared fullscreen grammar only after exact runtime UI proof"
|
|
130
|
+
: "Codex /status native inspection will use the generic runtime profile for this unverified version"
|
|
126
131
|
};
|
|
127
132
|
}
|
|
128
133
|
export function planCodexNativeInspection(operation, capabilities) {
|
|
129
|
-
const runtimeProfile =
|
|
134
|
+
const runtimeProfile = codexNativeInspectionCompatibilityProfile(capabilities.agentVersion);
|
|
130
135
|
if (operation.kind !== "status" ||
|
|
131
136
|
capabilities.status !== "supported" ||
|
|
132
137
|
!capabilities.statusInspection ||
|
|
@@ -472,8 +477,10 @@ function parseCodexStatusCardAfterCommand(lines, commandIndex) {
|
|
|
472
477
|
while (topBorderIndex < lines.length && !lines[topBorderIndex].trim()) {
|
|
473
478
|
topBorderIndex += 1;
|
|
474
479
|
}
|
|
475
|
-
|
|
476
|
-
|
|
480
|
+
const borderlessVersion = /^>_ OpenAI Codex \(v(\d+\.\d+\.\d+)\)$/u
|
|
481
|
+
.exec(lines[topBorderIndex]?.trim() ?? "")?.[1];
|
|
482
|
+
if (isCodexPaginatedReadCandidate(borderlessVersion)) {
|
|
483
|
+
return parseCodex159StatusCard(lines, topBorderIndex, borderlessVersion);
|
|
477
484
|
}
|
|
478
485
|
if (topBorderIndex >= lines.length ||
|
|
479
486
|
!CODEX_STATUS_TOP_BORDER.test(lines[topBorderIndex])) {
|
|
@@ -557,7 +564,7 @@ function parseCodexStatusCardAfterCommand(lines, commandIndex) {
|
|
|
557
564
|
};
|
|
558
565
|
}
|
|
559
566
|
/** 0.159 removes borders. Close fields before the exact native live suffix. */
|
|
560
|
-
function parseCodex159StatusCard(lines, start) {
|
|
567
|
+
function parseCodex159StatusCard(lines, start, agentVersion) {
|
|
561
568
|
const uncertain = (reason) => ({ status: "ambiguous", reason });
|
|
562
569
|
const limit = Math.min(lines.length, start + CODEX_STATUS_MAX_LINES);
|
|
563
570
|
let end = start + 1;
|
|
@@ -570,7 +577,7 @@ function parseCodex159StatusCard(lines, start) {
|
|
|
570
577
|
// command may close an earlier card in the pre-Enter occurrence inventory.
|
|
571
578
|
if (/^[›»](?:\s|$)/u.test(lines[end]) &&
|
|
572
579
|
codexNativeCommandLine(lines[end]) === undefined &&
|
|
573
|
-
captureCodexFullscreenComposerFrame(lines.slice(end).join("\n"),
|
|
580
|
+
captureCodexFullscreenComposerFrame(lines.slice(end).join("\n"), agentVersion)?.composerIndex !== 0) {
|
|
574
581
|
return uncertain("Codex 0.159 /status closing Composer is incomplete");
|
|
575
582
|
}
|
|
576
583
|
const suffixStart = lines.findIndex((line, index) => index > start && index < end &&
|
|
@@ -625,7 +632,7 @@ function parseCodex159StatusCard(lines, start) {
|
|
|
625
632
|
return { status: "missing", reason: "Codex 0.159 /status lacks complete required fields or its exact Session UUID" };
|
|
626
633
|
}
|
|
627
634
|
return {
|
|
628
|
-
status: "observed", region, nativeThreadId: nativeThreadId.toLowerCase(), agentVersion
|
|
635
|
+
status: "observed", region, nativeThreadId: nativeThreadId.toLowerCase(), agentVersion,
|
|
629
636
|
fields: fields.map(({ name, value }) => ({
|
|
630
637
|
name: redactCodexNativeStatusText(name),
|
|
631
638
|
value: /^account$/iu.test(name) ? "[REDACTED]" : redactCodexNativeStatusText(value)
|
|
@@ -641,7 +648,7 @@ function safeCodex159StatusDisplayText(line) {
|
|
|
641
648
|
!/(?:\b(?:Session|Server):|OpenAI Codex|(?:^|\s)\/status(?:\s|$))/iu.test(line);
|
|
642
649
|
}
|
|
643
650
|
/** Native activity/details stay outside identity evidence, before the Composer. */
|
|
644
|
-
function closedCodex159StatusSuffix(lines) {
|
|
651
|
+
export function closedCodex159StatusSuffix(lines) {
|
|
645
652
|
const rows = lines.filter((line) => line.trim()).map((line) => line.trimEnd());
|
|
646
653
|
if (isCodex159ActivityRow(rows[0] ?? "")) {
|
|
647
654
|
rows.shift();
|
|
@@ -664,7 +671,7 @@ function closedCodex159StatusSuffix(lines) {
|
|
|
664
671
|
return true;
|
|
665
672
|
if (rows.length !== 3 || rows[0] !== "• Queued follow-up inputs")
|
|
666
673
|
return false;
|
|
667
|
-
const summary = /^ {2}\? ([1-9]\d{0,2}) (question|questions)(?: · [1-9]\d
|
|
674
|
+
const summary = /^ {2}\? ([1-9]\d{0,2}) (question|questions)(?: · (?:[1-9]|1\d|20)s)?$/u.exec(rows[1]);
|
|
668
675
|
return summary !== null && (Number(summary[1]) === 1) === (summary[2] === "question") &&
|
|
669
676
|
/^ {4}(?:shift\+←|⌥\+↑) to answer$/u.test(rows[2]);
|
|
670
677
|
}
|
|
@@ -806,7 +813,7 @@ export function inspectCodexScreen(options) {
|
|
|
806
813
|
const activity = detectCodexActivityState(options.screen, detectedApproval, options.runtime?.agentVersion);
|
|
807
814
|
const screenExcerpt = codexScreenExcerpt(options.screen, options.maxExcerptLength ?? 4000);
|
|
808
815
|
const completion = activity.state === "idle" &&
|
|
809
|
-
!
|
|
816
|
+
!codexFullscreenActivityCandidate(options.runtime?.agentVersion)
|
|
810
817
|
? detectCodexScreenCompletion({
|
|
811
818
|
screen: screenExcerpt,
|
|
812
819
|
requestText: options.requestText,
|
|
@@ -904,7 +911,7 @@ export function detectCodexActivityState(screen, approval = detectCodexApprovalP
|
|
|
904
911
|
}
|
|
905
912
|
const tailLines = screen.trimEnd().split(/\r?\n/).slice(-30);
|
|
906
913
|
const workingLine = tailLines.find((line) => isCodexWorkingLine(line) ||
|
|
907
|
-
agentVersion
|
|
914
|
+
isCodexPaginatedReadCandidate(agentVersion) && isCodex159ActivityRow(line.trimEnd()));
|
|
908
915
|
if (workingLine) {
|
|
909
916
|
return {
|
|
910
917
|
state: "working",
|
|
@@ -1224,6 +1231,10 @@ function codexIdlePromptLine(lines, agentVersion) {
|
|
|
1224
1231
|
const fullscreenIdle = codexFullscreenIdlePromptLine(lines, agentVersion);
|
|
1225
1232
|
if (fullscreenIdle !== undefined)
|
|
1226
1233
|
return fullscreenIdle;
|
|
1234
|
+
// A changed fullscreen footer or unknown overlay must not fall through to
|
|
1235
|
+
// the legacy bare-prompt heuristic and become an apparent stable idle.
|
|
1236
|
+
if (isCodexPaginatedReadCandidate(agentVersion))
|
|
1237
|
+
return undefined;
|
|
1227
1238
|
if (agentVersion !== undefined &&
|
|
1228
1239
|
CODEX_ASTRA_SPARKLE_AGENT_VERSIONS.has(agentVersion)) {
|
|
1229
1240
|
const sparkleIdle = codexAstraSparkleIdlePromptLine(lines);
|
|
@@ -1260,9 +1271,16 @@ function codexIdlePromptLine(lines, agentVersion) {
|
|
|
1260
1271
|
return undefined;
|
|
1261
1272
|
}
|
|
1262
1273
|
function codexFullscreenIdlePromptLine(lines, agentVersion) {
|
|
1263
|
-
if (!agentVersion || !
|
|
1274
|
+
if (!agentVersion || !codexFullscreenActivityCandidate(agentVersion)) {
|
|
1264
1275
|
return undefined;
|
|
1265
1276
|
}
|
|
1277
|
+
if (isCodexPaginatedReadCandidate(agentVersion)) {
|
|
1278
|
+
const frame = captureCodexFullscreenComposerFrame(lines.join("\n"), agentVersion);
|
|
1279
|
+
return frame?.hasShortcutFooter &&
|
|
1280
|
+
["", "Ask Codex to do anything"].includes(frame.composerText)
|
|
1281
|
+
? frame.plainLines[frame.composerIndex]
|
|
1282
|
+
: undefined;
|
|
1283
|
+
}
|
|
1266
1284
|
const reversedIndex = [...lines].reverse().findIndex((line) => /^[›»] Ask Codex to do anything\s*$/u.test(line));
|
|
1267
1285
|
if (reversedIndex < 0)
|
|
1268
1286
|
return undefined;
|
|
@@ -1271,7 +1289,7 @@ function codexFullscreenIdlePromptLine(lines, agentVersion) {
|
|
|
1271
1289
|
.filter((line) => line.trim()).map((line) => line.trimEnd());
|
|
1272
1290
|
return footer.length === 2 &&
|
|
1273
1291
|
CODEX_FULLSCREEN_MODEL_FOOTER.test(footer[0]) &&
|
|
1274
|
-
|
|
1292
|
+
CODEX_FULLSCREEN_SHORTCUT_FOOTER.test(footer[1])
|
|
1275
1293
|
? lines[composerIndex]
|
|
1276
1294
|
: undefined;
|
|
1277
1295
|
}
|