@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.
Files changed (102) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +4 -4
  3. package/dist/src/claude-lifecycle-compatibility.js +25 -4
  4. package/dist/src/claude-lifecycle-compatibility.js.map +1 -1
  5. package/dist/src/claude-local-transcript-provider.js +12 -19
  6. package/dist/src/claude-local-transcript-provider.js.map +1 -1
  7. package/dist/src/claude-terminal-agent-adapter.js +27 -11
  8. package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
  9. package/dist/src/claude-transcript-record-order.d.ts +17 -0
  10. package/dist/src/claude-transcript-record-order.js +81 -0
  11. package/dist/src/claude-transcript-record-order.js.map +1 -0
  12. package/dist/src/codex-app-server-interaction-client.js +4 -3
  13. package/dist/src/codex-app-server-interaction-client.js.map +1 -1
  14. package/dist/src/codex-app-server-read-client.d.ts +19 -1
  15. package/dist/src/codex-app-server-read-client.js +81 -34
  16. package/dist/src/codex-app-server-read-client.js.map +1 -1
  17. package/dist/src/codex-async-question-adapter.js +4 -2
  18. package/dist/src/codex-async-question-adapter.js.map +1 -1
  19. package/dist/src/codex-fullscreen-composer-proof.d.ts +3 -1
  20. package/dist/src/codex-fullscreen-composer-proof.js +113 -17
  21. package/dist/src/codex-fullscreen-composer-proof.js.map +1 -1
  22. package/dist/src/codex-lifecycle-compatibility.d.ts +13 -1
  23. package/dist/src/codex-lifecycle-compatibility.js +37 -2
  24. package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
  25. package/dist/src/codex-paginated-async-answer.js +21 -11
  26. package/dist/src/codex-paginated-async-answer.js.map +1 -1
  27. package/dist/src/codex-paginated-async-response.js +3 -2
  28. package/dist/src/codex-paginated-async-response.js.map +1 -1
  29. package/dist/src/codex-paginated-observation.d.ts +1 -0
  30. package/dist/src/codex-paginated-observation.js +15 -3
  31. package/dist/src/codex-paginated-observation.js.map +1 -1
  32. package/dist/src/codex-paginated-questionnaire-runtime.js +2 -1
  33. package/dist/src/codex-paginated-questionnaire-runtime.js.map +1 -1
  34. package/dist/src/codex-paginated-task.d.ts +8 -3
  35. package/dist/src/codex-paginated-task.js +44 -16
  36. package/dist/src/codex-paginated-task.js.map +1 -1
  37. package/dist/src/codex-paginated-thread-binding.d.ts +9 -0
  38. package/dist/src/codex-paginated-thread-binding.js +66 -27
  39. package/dist/src/codex-paginated-thread-binding.js.map +1 -1
  40. package/dist/src/codex-paginated-thread-facts.d.ts +4 -2
  41. package/dist/src/codex-paginated-watch.d.ts +1 -1
  42. package/dist/src/codex-paginated-watch.js +24 -5
  43. package/dist/src/codex-paginated-watch.js.map +1 -1
  44. package/dist/src/codex-status-history-navigation.d.ts +17 -0
  45. package/dist/src/codex-status-history-navigation.js +261 -0
  46. package/dist/src/codex-status-history-navigation.js.map +1 -0
  47. package/dist/src/codex-terminal-agent-adapter.d.ts +2 -0
  48. package/dist/src/codex-terminal-agent-adapter.js +35 -17
  49. package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
  50. package/dist/src/herdr-terminal-control-provider.d.ts +2 -0
  51. package/dist/src/herdr-terminal-control-provider.js +35 -8
  52. package/dist/src/herdr-terminal-control-provider.js.map +1 -1
  53. package/dist/src/semantic-tool-schemas.js +1 -1
  54. package/dist/src/semantic-tool-schemas.js.map +1 -1
  55. package/dist/src/store.d.ts +1 -1
  56. package/dist/src/store.js +2 -2
  57. package/dist/src/store.js.map +1 -1
  58. package/dist/src/terminal-agent-bridge.d.ts +2 -1
  59. package/dist/src/terminal-agent-bridge.js +80 -10
  60. package/dist/src/terminal-agent-bridge.js.map +1 -1
  61. package/dist/src/terminal-composer-classifier.js +8 -2
  62. package/dist/src/terminal-composer-classifier.js.map +1 -1
  63. package/dist/src/terminal-control-provider.d.ts +4 -0
  64. package/dist/src/terminal-control-provider.js +57 -6
  65. package/dist/src/terminal-control-provider.js.map +1 -1
  66. package/dist/src/terminal-human-explicit-send-cli-adapter.js +11 -0
  67. package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -1
  68. package/dist/src/terminal-model-control-profile.d.ts +3 -1
  69. package/dist/src/terminal-model-control-profile.js +45 -2
  70. package/dist/src/terminal-model-control-profile.js.map +1 -1
  71. package/dist/src/terminal-native-inspection-bridge.js +53 -22
  72. package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
  73. package/dist/src/terminal-questionnaire-adapter.js +24 -4
  74. package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
  75. package/dist/src/terminal-runtime-cli-adapter.js +3 -3
  76. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
  77. package/dist/src/terminal-send-watch-policy.js +9 -11
  78. package/dist/src/terminal-send-watch-policy.js.map +1 -1
  79. package/dist/src/terminal-watch-cli-adapter.d.ts +5 -10
  80. package/dist/src/terminal-watch-cli-adapter.js +51 -32
  81. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  82. package/dist/src/terminal-watch-codec.js +11 -2
  83. package/dist/src/terminal-watch-codec.js.map +1 -1
  84. package/dist/src/terminal-watch-interaction-runtime.js +3 -1
  85. package/dist/src/terminal-watch-interaction-runtime.js.map +1 -1
  86. package/dist/src/terminal-watch-record.d.ts +8 -1
  87. package/dist/src/terminal-watch-record.js +16 -2
  88. package/dist/src/terminal-watch-record.js.map +1 -1
  89. package/dist/src/terminal-watch-send-activity.d.ts +28 -0
  90. package/dist/src/terminal-watch-send-activity.js +65 -0
  91. package/dist/src/terminal-watch-send-activity.js.map +1 -0
  92. package/dist/src/terminal-watch-service.d.ts +5 -0
  93. package/dist/src/terminal-watch-service.js +53 -6
  94. package/dist/src/terminal-watch-service.js.map +1 -1
  95. package/docs/callback-compatibility.md +84 -0
  96. package/docs/claude-2.1.285-compatibility.md +133 -0
  97. package/docs/codex-0.159.0-compatibility.md +82 -0
  98. package/docs/codex-0.159.2-compatibility.md +226 -0
  99. package/docs/quickstart-herdr.md +2 -2
  100. package/docs/quickstart-tmux.md +3 -3
  101. package/package.json +5 -2
  102. 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, CODEX_FULLSCREEN_SHORTCUT_FOOTER as CODEX_PAGINATED_SHORTCUT_FOOTER } from "./codex-fullscreen-composer-proof.js";
2
+ import { captureCodexFullscreenComposerFrame } from "./codex-fullscreen-composer-proof.js";
3
3
  import { classifyCodexProcess } from "./codex-session-provider.js";
4
- import { isCodexPaginatedVersion, codexRuntimeCompatibilityProfile, codexThreadLifecycleHistoryWarning, codexUnsupportedDurableHistoryWarning } from "./codex-lifecycle-compatibility.js";
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
- const CODEX_FULLSCREEN_ACTIVITY_VERSIONS = new Set(["0.157.0", "0.157.1", "0.158.0", "0.159.0"]);
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 = codexRuntimeCompatibilityProfile(agentVersion);
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
- : "Codex /status native inspection will use the generic runtime profile for this unverified version"
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 = codexRuntimeCompatibilityProfile(capabilities.agentVersion);
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
- if (lines[topBorderIndex]?.trim() === ">_ OpenAI Codex (v0.159.0)") {
476
- return parseCodex159StatusCard(lines, topBorderIndex);
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"), "0.159.0")?.composerIndex !== 0) {
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: "0.159.0",
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{0,2}s)?$/u.exec(rows[1]);
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
- !CODEX_FULLSCREEN_ACTIVITY_VERSIONS.has(options.runtime?.agentVersion ?? "")
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 === "0.159.0" && isCodex159ActivityRow(line.trimEnd()));
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 || !CODEX_FULLSCREEN_ACTIVITY_VERSIONS.has(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
- (isCodexPaginatedVersion(agentVersion) ? CODEX_PAGINATED_SHORTCUT_FOOTER : CODEX_FULLSCREEN_SHORTCUT_FOOTER).test(footer[1])
1292
+ CODEX_FULLSCREEN_SHORTCUT_FOOTER.test(footer[1])
1275
1293
  ? lines[composerIndex]
1276
1294
  : undefined;
1277
1295
  }