@scotthuang/agent-knock-knock 0.13.11 → 0.13.13
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 +23 -0
- package/README.md +8 -9
- package/dist/src/codex-app-server-interaction-client.d.ts +72 -0
- package/dist/src/codex-app-server-interaction-client.js +311 -0
- package/dist/src/codex-app-server-interaction-client.js.map +1 -0
- package/dist/src/codex-app-server-questionnaire.d.ts +73 -0
- package/dist/src/codex-app-server-questionnaire.js +366 -0
- package/dist/src/codex-app-server-questionnaire.js.map +1 -0
- package/dist/src/codex-app-server-read-client.d.ts +118 -0
- package/dist/src/codex-app-server-read-client.js +300 -0
- package/dist/src/codex-app-server-read-client.js.map +1 -0
- package/dist/src/codex-app-server-transport.d.ts +11 -0
- package/dist/src/codex-app-server-transport.js +47 -0
- package/dist/src/codex-app-server-transport.js.map +1 -0
- package/dist/src/codex-async-question-adapter.d.ts +5 -0
- package/dist/src/codex-async-question-adapter.js +61 -17
- package/dist/src/codex-async-question-adapter.js.map +1 -1
- package/dist/src/codex-fullscreen-composer-proof.d.ts +23 -0
- package/dist/src/codex-fullscreen-composer-proof.js +125 -0
- package/dist/src/codex-fullscreen-composer-proof.js.map +1 -0
- package/dist/src/codex-lifecycle-compatibility.d.ts +5 -0
- package/dist/src/codex-lifecycle-compatibility.js +13 -1
- package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
- package/dist/src/codex-paginated-answer-proof.d.ts +25 -0
- package/dist/src/codex-paginated-answer-proof.js +189 -0
- package/dist/src/codex-paginated-answer-proof.js.map +1 -0
- package/dist/src/codex-paginated-async-answer.d.ts +36 -0
- package/dist/src/codex-paginated-async-answer.js +322 -0
- package/dist/src/codex-paginated-async-answer.js.map +1 -0
- package/dist/src/codex-paginated-async-response.d.ts +21 -0
- package/dist/src/codex-paginated-async-response.js +118 -0
- package/dist/src/codex-paginated-async-response.js.map +1 -0
- package/dist/src/codex-paginated-observation.d.ts +30 -0
- package/dist/src/codex-paginated-observation.js +139 -0
- package/dist/src/codex-paginated-observation.js.map +1 -0
- package/dist/src/codex-paginated-questionnaire-runtime.d.ts +33 -0
- package/dist/src/codex-paginated-questionnaire-runtime.js +157 -0
- package/dist/src/codex-paginated-questionnaire-runtime.js.map +1 -0
- package/dist/src/codex-paginated-task.d.ts +78 -0
- package/dist/src/codex-paginated-task.js +441 -0
- package/dist/src/codex-paginated-task.js.map +1 -0
- package/dist/src/codex-paginated-thread-binding.d.ts +18 -0
- package/dist/src/codex-paginated-thread-binding.js +56 -0
- package/dist/src/codex-paginated-thread-binding.js.map +1 -0
- package/dist/src/codex-paginated-thread-facts.d.ts +11 -0
- package/dist/src/codex-paginated-thread-facts.js +2 -0
- package/dist/src/codex-paginated-thread-facts.js.map +1 -0
- package/dist/src/codex-paginated-watch.d.ts +29 -0
- package/dist/src/codex-paginated-watch.js +107 -0
- package/dist/src/codex-paginated-watch.js.map +1 -0
- package/dist/src/codex-terminal-agent-adapter.js +127 -7
- package/dist/src/codex-terminal-agent-adapter.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-adapter.d.ts +3 -0
- package/dist/src/terminal-agent-adapter.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +13 -5
- package/dist/src/terminal-agent-bridge.js +28 -103
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-approval-fingerprint.d.ts +7 -0
- package/dist/src/terminal-approval-fingerprint.js +107 -0
- package/dist/src/terminal-approval-fingerprint.js.map +1 -0
- package/dist/src/terminal-command-cli-ports.d.ts +1 -0
- package/dist/src/terminal-composer-classifier.js +39 -1
- package/dist/src/terminal-composer-classifier.js.map +1 -1
- package/dist/src/terminal-control-provider.d.ts +6 -2
- package/dist/src/terminal-control-provider.js +4 -4
- package/dist/src/terminal-control-provider.js.map +1 -1
- package/dist/src/terminal-human-explicit-send-cli-adapter.js +22 -15
- package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -1
- package/dist/src/terminal-interaction-core.js +3 -1
- package/dist/src/terminal-interaction-core.js.map +1 -1
- package/dist/src/terminal-interaction-response-bridge.d.ts +21 -1
- package/dist/src/terminal-interaction-response-bridge.js +148 -3
- package/dist/src/terminal-interaction-response-bridge.js.map +1 -1
- package/dist/src/terminal-list-cli-adapter.js +4 -4
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-facts.d.ts +1 -1
- package/dist/src/terminal-list-facts.js +1 -1
- package/dist/src/terminal-list-facts.js.map +1 -1
- package/dist/src/terminal-managed-send-cli-adapter.d.ts +1 -1
- package/dist/src/terminal-managed-send-cli-adapter.js +27 -0
- package/dist/src/terminal-managed-send-cli-adapter.js.map +1 -1
- package/dist/src/terminal-model-control-bridge.d.ts +1 -1
- package/dist/src/terminal-model-control-bridge.js +1 -1
- package/dist/src/terminal-model-control-bridge.js.map +1 -1
- package/dist/src/terminal-model-control-profile.d.ts +3 -1
- package/dist/src/terminal-model-control-profile.js +47 -1
- package/dist/src/terminal-model-control-profile.js.map +1 -1
- package/dist/src/terminal-model-control.js +63 -21
- package/dist/src/terminal-model-control.js.map +1 -1
- package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
- package/dist/src/terminal-native-inspection-bridge.d.ts +6 -1
- package/dist/src/terminal-native-inspection-bridge.js +126 -79
- package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
- package/dist/src/terminal-questionnaire-adapter.js +20 -16
- package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
- package/dist/src/terminal-runtime-cli-adapter.js +17 -0
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
- package/dist/src/terminal-send-watch-policy.d.ts +38 -0
- package/dist/src/terminal-send-watch-policy.js +79 -0
- package/dist/src/terminal-send-watch-policy.js.map +1 -0
- package/dist/src/terminal-submission-facts.d.ts +1 -1
- package/dist/src/terminal-submission-facts.js +11 -9
- package/dist/src/terminal-submission-facts.js.map +1 -1
- package/dist/src/terminal-watch-cli-adapter.d.ts +9 -1
- package/dist/src/terminal-watch-cli-adapter.js +199 -210
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-codec.js +23 -1
- package/dist/src/terminal-watch-codec.js.map +1 -1
- package/dist/src/terminal-watch-interaction-runtime.js +27 -6
- package/dist/src/terminal-watch-interaction-runtime.js.map +1 -1
- package/dist/src/terminal-watch-presentation.d.ts +4 -0
- package/dist/src/terminal-watch-presentation.js +153 -0
- package/dist/src/terminal-watch-presentation.js.map +1 -0
- package/dist/src/terminal-watch-record.d.ts +4 -2
- package/dist/src/terminal-watch-record.js +15 -10
- package/dist/src/terminal-watch-record.js.map +1 -1
- package/dist/src/terminal-watch-service.js +13 -1
- package/dist/src/terminal-watch-service.js.map +1 -1
- package/docs/codex-0.158.0-compatibility.md +129 -0
- package/docs/codex-0.159.0-compatibility.md +150 -0
- package/docs/quickstart-herdr.md +3 -3
- package/docs/quickstart-tmux.md +5 -5
- package/package.json +7 -3
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +14 -12
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isCodexPaginatedVersion } from "./codex-lifecycle-compatibility.js";
|
|
4
|
+
import { validateCodexBlockingQuestionDraft } from "./codex-app-server-questionnaire.js";
|
|
5
|
+
import { exactNativeThreadId, fingerprint, requiredString, sha256Value, validTimestamp, validateTerminalSubmissionAcceptanceEvidence } from "./terminal-submission-facts.js";
|
|
6
|
+
import { isRecord } from "./value-guards.js";
|
|
7
|
+
const ANCHOR_KEYS = new Set([
|
|
8
|
+
"schema", "version", "origin", "captured_at", "codex_home", "codex_version",
|
|
9
|
+
"native_thread_id", "process_uuid", "process_birth", "pid", "request_hash",
|
|
10
|
+
"baseline_latest_turn_id", "turn_id", "anchor_fingerprint"
|
|
11
|
+
]);
|
|
12
|
+
const CHECKPOINT_KEYS = new Set([
|
|
13
|
+
"schema", "version", "safe_resume_offset_bytes", "acceptance_evidence",
|
|
14
|
+
"blocking_question_draft"
|
|
15
|
+
]);
|
|
16
|
+
const TURN_STATUSES = new Set(["inProgress", "completed", "failed", "interrupted"]);
|
|
17
|
+
const MAX_TURNS = 128;
|
|
18
|
+
const MAX_ITEMS = 1_024;
|
|
19
|
+
const MAX_TEXT_CHARACTERS = 1024 * 1024;
|
|
20
|
+
const MAX_QUESTIONS = 16;
|
|
21
|
+
const MAX_OPTIONS = 32;
|
|
22
|
+
export function createCodexPaginatedTaskAnchor(input) {
|
|
23
|
+
const base = {
|
|
24
|
+
schema: "agent-knock-knock/codex-paginated-task-anchor",
|
|
25
|
+
version: 1,
|
|
26
|
+
origin: input.origin,
|
|
27
|
+
captured_at: input.captured_at,
|
|
28
|
+
codex_home: input.codex_home,
|
|
29
|
+
codex_version: input.codex_version,
|
|
30
|
+
native_thread_id: input.native_thread_id,
|
|
31
|
+
process_uuid: input.process_uuid,
|
|
32
|
+
process_birth: input.process_birth,
|
|
33
|
+
pid: input.pid,
|
|
34
|
+
request_hash: input.request_hash,
|
|
35
|
+
...(input.baseline_latest_turn_id === undefined
|
|
36
|
+
? {} : { baseline_latest_turn_id: input.baseline_latest_turn_id }),
|
|
37
|
+
...(input.turn_id === undefined ? {} : { turn_id: input.turn_id })
|
|
38
|
+
};
|
|
39
|
+
return validateCodexPaginatedTaskAnchor({
|
|
40
|
+
...base,
|
|
41
|
+
anchor_fingerprint: fingerprint(base)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export function validateCodexPaginatedTaskAnchor(value) {
|
|
45
|
+
if (!isRecord(value) ||
|
|
46
|
+
Object.keys(value).some((key) => !ANCHOR_KEYS.has(key)) ||
|
|
47
|
+
value.schema !== "agent-knock-knock/codex-paginated-task-anchor" ||
|
|
48
|
+
value.version !== 1 ||
|
|
49
|
+
!["user_explicit_send", "active_task"].includes(String(value.origin)) ||
|
|
50
|
+
!isCodexPaginatedVersion(value.codex_version) ||
|
|
51
|
+
!validTimestamp(value.captured_at) ||
|
|
52
|
+
typeof value.codex_home !== "string" ||
|
|
53
|
+
!path.isAbsolute(value.codex_home) ||
|
|
54
|
+
!Number.isSafeInteger(value.pid) || Number(value.pid) <= 1)
|
|
55
|
+
throw new Error("Codex paginated task anchor is invalid");
|
|
56
|
+
if (exactNativeThreadId(String(value.native_thread_id)) !== value.native_thread_id) {
|
|
57
|
+
throw new Error("Codex paginated anchor has an invalid native thread");
|
|
58
|
+
}
|
|
59
|
+
requiredString(value.process_uuid, "Codex process UUID");
|
|
60
|
+
requiredString(value.process_birth, "Codex process birth");
|
|
61
|
+
if (sha256Value(value.request_hash, "Codex request hash") !== value.request_hash) {
|
|
62
|
+
throw new Error("Codex paginated request hash is not canonical");
|
|
63
|
+
}
|
|
64
|
+
validateAnchorTaskBinding(value);
|
|
65
|
+
const { anchor_fingerprint, ...base } = value;
|
|
66
|
+
if (fingerprint(base) !== anchor_fingerprint) {
|
|
67
|
+
throw new Error("Codex paginated anchor fingerprint does not match");
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
function validateAnchorTaskBinding(value) {
|
|
72
|
+
if (value.baseline_latest_turn_id !== undefined)
|
|
73
|
+
boundedId(value.baseline_latest_turn_id);
|
|
74
|
+
if (value.turn_id !== undefined)
|
|
75
|
+
boundedId(value.turn_id);
|
|
76
|
+
if ((value.origin === "active_task" && value.turn_id === undefined) ||
|
|
77
|
+
(value.origin === "user_explicit_send" && value.turn_id !== undefined))
|
|
78
|
+
throw new Error("Codex paginated anchor has inconsistent task binding");
|
|
79
|
+
}
|
|
80
|
+
export function createCodexPaginatedTaskCheckpoint(acceptanceEvidence, blockingQuestionDraft) {
|
|
81
|
+
return validateCodexPaginatedTaskCheckpoint({
|
|
82
|
+
schema: "agent-knock-knock/codex-paginated-task-checkpoint",
|
|
83
|
+
version: 1,
|
|
84
|
+
safe_resume_offset_bytes: 0,
|
|
85
|
+
...(acceptanceEvidence === undefined ? {} : { acceptance_evidence: acceptanceEvidence }),
|
|
86
|
+
...(blockingQuestionDraft === undefined ? {} : { blocking_question_draft: blockingQuestionDraft })
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export function validateCodexPaginatedTaskCheckpoint(value, anchor) {
|
|
90
|
+
if (!isRecord(value) ||
|
|
91
|
+
Object.keys(value).some((key) => !CHECKPOINT_KEYS.has(key)) ||
|
|
92
|
+
value.schema !== "agent-knock-knock/codex-paginated-task-checkpoint" ||
|
|
93
|
+
value.version !== 1 ||
|
|
94
|
+
value.safe_resume_offset_bytes !== 0)
|
|
95
|
+
throw new Error("Codex paginated checkpoint is invalid");
|
|
96
|
+
if (value.acceptance_evidence !== undefined) {
|
|
97
|
+
if (!isRecord(value.acceptance_evidence))
|
|
98
|
+
throw new Error("Codex acceptance is invalid");
|
|
99
|
+
const evidence = validateTerminalSubmissionAcceptanceEvidence(value.acceptance_evidence, {
|
|
100
|
+
source: "codex_paginated",
|
|
101
|
+
nativeThreadId: anchor?.native_thread_id ??
|
|
102
|
+
requiredString(value.acceptance_evidence.nativeThreadId, "Codex acceptance thread"),
|
|
103
|
+
requestHash: anchor?.request_hash ??
|
|
104
|
+
requiredString(value.acceptance_evidence.requestHash, "Codex acceptance request")
|
|
105
|
+
});
|
|
106
|
+
boundedId(evidence.acceptanceId);
|
|
107
|
+
if (evidence.metadata?.turn_id !== evidence.acceptanceId ||
|
|
108
|
+
(anchor && evidence.anchorFingerprint !== anchor.anchor_fingerprint) ||
|
|
109
|
+
(anchor?.origin === "active_task" && evidence.acceptanceId !== anchor.turn_id))
|
|
110
|
+
throw new Error("Codex paginated acceptance belongs to a different task");
|
|
111
|
+
}
|
|
112
|
+
if (value.blocking_question_draft !== undefined) {
|
|
113
|
+
const draft = validateCodexBlockingQuestionDraft(value.blocking_question_draft);
|
|
114
|
+
if (!isRecord(value.acceptance_evidence) ||
|
|
115
|
+
draft.threadId !== value.acceptance_evidence.nativeThreadId ||
|
|
116
|
+
draft.turnId !== value.acceptance_evidence.acceptanceId) {
|
|
117
|
+
throw new Error("Codex question draft belongs to a different accepted task");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
/** Inspect already-read data only; this module never opens a socket or a file. */
|
|
123
|
+
export function observeCodexPaginatedTask(input) {
|
|
124
|
+
let anchor;
|
|
125
|
+
let checkpoint;
|
|
126
|
+
try {
|
|
127
|
+
anchor = validateCodexPaginatedTaskAnchor(input.anchor);
|
|
128
|
+
checkpoint = validateCodexPaginatedTaskCheckpoint(input.checkpoint ?? createCodexPaginatedTaskCheckpoint(), anchor);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return { status: "invalidated", reason: errorText(error) };
|
|
132
|
+
}
|
|
133
|
+
const snapshot = input.snapshot;
|
|
134
|
+
if (snapshot.codexHome !== anchor.codex_home ||
|
|
135
|
+
snapshot.serverVersion !== anchor.codex_version ||
|
|
136
|
+
snapshot.thread.id !== anchor.native_thread_id ||
|
|
137
|
+
snapshot.thread.historyMode !== "paginated")
|
|
138
|
+
return { status: "invalidated", reason: "Codex paginated history identity changed" };
|
|
139
|
+
if (!snapshot.completeToBoundary) {
|
|
140
|
+
return unavailable("Codex paginated history did not reach the exact task boundary");
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
validateTurns(snapshot.turns);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
return unavailable(errorText(error));
|
|
147
|
+
}
|
|
148
|
+
const selected = selectPaginatedTaskTurn(anchor, checkpoint, snapshot.turns);
|
|
149
|
+
if (selected.status !== "matched")
|
|
150
|
+
return selected;
|
|
151
|
+
const turn = selected.turn;
|
|
152
|
+
const evidence = checkpoint.acceptance_evidence ?? createTaskAcceptance(anchor, turn);
|
|
153
|
+
if (!checkpoint.acceptance_evidence)
|
|
154
|
+
checkpoint = createCodexPaginatedTaskCheckpoint(evidence);
|
|
155
|
+
const turnIndex = snapshot.turns.findIndex((candidate) => candidate.id === turn.id);
|
|
156
|
+
return acceptedTaskObservation({
|
|
157
|
+
turn, evidence, checkpoint, newerTurns: snapshot.turns.slice(0, turnIndex)
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function selectPaginatedTaskTurn(anchor, checkpoint, turns) {
|
|
161
|
+
const evidence = checkpoint.acceptance_evidence;
|
|
162
|
+
let turn;
|
|
163
|
+
if (evidence || anchor.origin === "active_task") {
|
|
164
|
+
turn = turns.find((candidate) => candidate.id === (evidence?.acceptanceId ?? anchor.turn_id));
|
|
165
|
+
if (!turn)
|
|
166
|
+
return unavailable("The accepted Codex turn is absent from its complete boundary");
|
|
167
|
+
if (codexPaginatedTurnRequestHash(turn) !== anchor.request_hash) {
|
|
168
|
+
return { status: "invalidated", reason: "The accepted Codex native input changed" };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
let candidates = turns;
|
|
173
|
+
if (anchor.baseline_latest_turn_id !== undefined) {
|
|
174
|
+
const baseline = turns.findIndex((candidate) => candidate.id === anchor.baseline_latest_turn_id);
|
|
175
|
+
if (baseline < 0)
|
|
176
|
+
return unavailable("Codex pre-Send turn boundary is absent");
|
|
177
|
+
candidates = turns.slice(0, baseline);
|
|
178
|
+
}
|
|
179
|
+
const matches = candidates.filter((candidate) => codexPaginatedTurnRequestHash(candidate) === anchor.request_hash);
|
|
180
|
+
if (matches.length > 1) {
|
|
181
|
+
return { status: "uncertain", reason: "multiple_exact_request_acceptances" };
|
|
182
|
+
}
|
|
183
|
+
turn = matches[0];
|
|
184
|
+
if (!turn)
|
|
185
|
+
return { status: "pending", checkpoint, questions: [] };
|
|
186
|
+
}
|
|
187
|
+
return { status: "matched", turn };
|
|
188
|
+
}
|
|
189
|
+
function createTaskAcceptance(anchor, turn) {
|
|
190
|
+
const acceptedAt = epochTimestamp(turn.startedAt);
|
|
191
|
+
const base = {
|
|
192
|
+
source: "codex_paginated",
|
|
193
|
+
kind: "native_user_turn",
|
|
194
|
+
nativeThreadId: anchor.native_thread_id,
|
|
195
|
+
requestHash: anchor.request_hash,
|
|
196
|
+
acceptanceId: turn.id,
|
|
197
|
+
...(acceptedAt === undefined ? {} : { acceptedAt }),
|
|
198
|
+
anchorFingerprint: anchor.anchor_fingerprint,
|
|
199
|
+
metadata: { turn_id: turn.id }
|
|
200
|
+
};
|
|
201
|
+
return { ...base, evidenceFingerprint: fingerprint(base) };
|
|
202
|
+
}
|
|
203
|
+
function acceptedTaskObservation(input) {
|
|
204
|
+
const { turn, evidence, checkpoint } = input;
|
|
205
|
+
let questionState;
|
|
206
|
+
try {
|
|
207
|
+
questionState = taskQuestions(turn, input.newerTurns);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
return unavailable(errorText(error));
|
|
211
|
+
}
|
|
212
|
+
const accepted = { evidence, checkpoint, questions: questionState.questions };
|
|
213
|
+
if (turn.status === "inProgress")
|
|
214
|
+
return { status: "accepted", ...accepted };
|
|
215
|
+
// A native turn ends its pending-question queue. Historical unanswered async
|
|
216
|
+
// items therefore cannot, on their own, prevent its completion callback.
|
|
217
|
+
const lastAnswerTurn = questionState.answerTurns[0];
|
|
218
|
+
if (turn.status === "completed" &&
|
|
219
|
+
questionState.answerTurns.some((answerTurn) => answerTurn.status === "inProgress"))
|
|
220
|
+
return { status: "accepted", ...accepted };
|
|
221
|
+
const settledTurn = turn.status === "completed" && lastAnswerTurn
|
|
222
|
+
? lastAnswerTurn : turn;
|
|
223
|
+
return {
|
|
224
|
+
status: "completed",
|
|
225
|
+
...accepted,
|
|
226
|
+
completion: {
|
|
227
|
+
source: "durable",
|
|
228
|
+
outcome: settledTurn.status === "completed" ? "success" : "failure",
|
|
229
|
+
text: completionText(settledTurn),
|
|
230
|
+
id: turn.id,
|
|
231
|
+
confidence: "high",
|
|
232
|
+
timestamp: epochTimestamp(settledTurn.completedAt),
|
|
233
|
+
metadata: {
|
|
234
|
+
detector: "codex_exact_paginated_task",
|
|
235
|
+
native_thread_id: evidence.nativeThreadId,
|
|
236
|
+
turn_id: turn.id,
|
|
237
|
+
status: settledTurn.status,
|
|
238
|
+
...(settledTurn === turn ? {} : { answer_turn_id: settledTurn.id })
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function validateTurns(turns) {
|
|
244
|
+
if (!Array.isArray(turns) || turns.length > MAX_TURNS) {
|
|
245
|
+
throw new Error("Codex paginated turn snapshot exceeded its bound");
|
|
246
|
+
}
|
|
247
|
+
const turnIds = new Set();
|
|
248
|
+
const itemIds = new Set();
|
|
249
|
+
let newerStartedAt;
|
|
250
|
+
for (const turn of turns) {
|
|
251
|
+
boundedId(turn.id);
|
|
252
|
+
if (turnIds.has(turn.id) || !TURN_STATUSES.has(turn.status)) {
|
|
253
|
+
throw new Error("Codex paginated turns are duplicated or unsupported");
|
|
254
|
+
}
|
|
255
|
+
turnIds.add(turn.id);
|
|
256
|
+
if (turn.itemsView !== "full" || !Array.isArray(turn.items) ||
|
|
257
|
+
turn.items.length > MAX_ITEMS)
|
|
258
|
+
throw new Error("Codex paginated turn items are incomplete");
|
|
259
|
+
if (typeof turn.startedAt === "number" && Number.isFinite(turn.startedAt)) {
|
|
260
|
+
if (newerStartedAt !== undefined && turn.startedAt > newerStartedAt) {
|
|
261
|
+
throw new Error("Codex paginated turns are not ordered newest first");
|
|
262
|
+
}
|
|
263
|
+
newerStartedAt = turn.startedAt;
|
|
264
|
+
}
|
|
265
|
+
for (const item of turn.items) {
|
|
266
|
+
boundedId(item.id);
|
|
267
|
+
if (itemIds.has(item.id))
|
|
268
|
+
throw new Error("Codex paginated items are duplicated");
|
|
269
|
+
itemIds.add(item.id);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function nativeUserText(item) {
|
|
274
|
+
if (item.type !== "userMessage" || !Array.isArray(item.content))
|
|
275
|
+
return undefined;
|
|
276
|
+
const input = item.content.filter((entry) => entry.type !== "skill" && entry.type !== "mention");
|
|
277
|
+
return input.length === 1 && input[0]?.type === "text" &&
|
|
278
|
+
typeof input[0].text === "string" && input[0].text.length <= MAX_TEXT_CHARACTERS
|
|
279
|
+
? input[0].text : undefined;
|
|
280
|
+
}
|
|
281
|
+
/** Hash the native stored input; the pre-Send caller profiles input normalization. */
|
|
282
|
+
export function codexPaginatedTurnRequestHash(turn) {
|
|
283
|
+
const root = turn.items.find((item) => item.type === "userMessage");
|
|
284
|
+
const text = root && nativeUserText(root);
|
|
285
|
+
return text === undefined ? undefined : createHash("sha256").update(text).digest("hex");
|
|
286
|
+
}
|
|
287
|
+
/** Native completion clears its question queue, regardless of retained history. */
|
|
288
|
+
export function codexPaginatedAsyncQuestionEvidence(turn, newerTurns = []) {
|
|
289
|
+
return turn.status === "inProgress" ? taskQuestions(turn, newerTurns).questions : [];
|
|
290
|
+
}
|
|
291
|
+
function taskQuestions(turn, newerTurns) {
|
|
292
|
+
const items = turn.items.filter((item) => item.type === "agentMessage" && item.delivery === "async" &&
|
|
293
|
+
Array.isArray(item.questions) && item.questions.length > 0);
|
|
294
|
+
let totalQuestions = 0;
|
|
295
|
+
const questionsById = new Map();
|
|
296
|
+
for (const item of items) {
|
|
297
|
+
const questions = item.questions;
|
|
298
|
+
totalQuestions += questions.length;
|
|
299
|
+
if (totalQuestions > MAX_QUESTIONS)
|
|
300
|
+
throw new Error("Codex question count exceeded its bound");
|
|
301
|
+
questions.forEach((question, index) => {
|
|
302
|
+
questionText(question.title, 4_096);
|
|
303
|
+
if (question.options !== null &&
|
|
304
|
+
(!Array.isArray(question.options) || question.options.length > MAX_OPTIONS))
|
|
305
|
+
throw new Error("Codex question options are invalid");
|
|
306
|
+
question.options?.forEach((option) => questionText(option, 512));
|
|
307
|
+
questionsById.set(JSON.stringify(["request_user_input_async", item.id, index]), {
|
|
308
|
+
itemId: item.id, index
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
const answered = new Set();
|
|
313
|
+
const answerTurns = [];
|
|
314
|
+
for (const candidate of [turn, ...newerTurns]) {
|
|
315
|
+
let exactAnswer = false;
|
|
316
|
+
for (const item of candidate.items) {
|
|
317
|
+
const text = nativeUserText(item);
|
|
318
|
+
if (text === undefined)
|
|
319
|
+
continue;
|
|
320
|
+
const ids = answeredQuestionIds(text);
|
|
321
|
+
for (const id of ids) {
|
|
322
|
+
if (questionsById.has(id)) {
|
|
323
|
+
answered.add(id);
|
|
324
|
+
exactAnswer = true;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Only an entire native root input made of exact question answers can
|
|
329
|
+
// extend task completion into a subsequent turn.
|
|
330
|
+
const root = candidate.items.find((item) => item.type === "userMessage");
|
|
331
|
+
const rootText = root && nativeUserText(root);
|
|
332
|
+
const rootIds = rootText === undefined ? [] : answeredQuestionIds(rootText);
|
|
333
|
+
if (candidate !== turn && exactAnswer && rootIds.length > 0 &&
|
|
334
|
+
rootIds.every((id) => questionsById.has(id)))
|
|
335
|
+
answerTurns.push(candidate);
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
questions: items.flatMap((item) => {
|
|
339
|
+
const rawQuestions = item.questions;
|
|
340
|
+
const pending = rawQuestions.map((_, index) => index).filter((index) => !answered.has(JSON.stringify(["request_user_input_async", item.id, index])));
|
|
341
|
+
return pending.length === 0 ? [] : [{
|
|
342
|
+
itemId: item.id,
|
|
343
|
+
turnId: turn.id,
|
|
344
|
+
questions: rawQuestions.map((question) => ({
|
|
345
|
+
title: questionText(question.title, 4_096),
|
|
346
|
+
...(question.options === null ? {} : { options: question.options })
|
|
347
|
+
})),
|
|
348
|
+
currentIndex: pending[0],
|
|
349
|
+
remainingCount: pending.length
|
|
350
|
+
}];
|
|
351
|
+
}),
|
|
352
|
+
answerTurns
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
function answeredQuestionIds(input) {
|
|
356
|
+
let text = input.trim();
|
|
357
|
+
const idePrefix = "# Context from my IDE setup:\n";
|
|
358
|
+
const ideRequest = "\n## My request for Codex:\n";
|
|
359
|
+
if (text.startsWith(idePrefix)) {
|
|
360
|
+
const requestIndex = text.lastIndexOf(ideRequest);
|
|
361
|
+
if (requestIndex >= 0)
|
|
362
|
+
text = text.slice(requestIndex + ideRequest.length).trim();
|
|
363
|
+
}
|
|
364
|
+
const match = /^<send_user_message_question_reply>\s*([\s\S]*?)\s*<\/send_user_message_question_reply>$/u.exec(text);
|
|
365
|
+
if (!match)
|
|
366
|
+
return [];
|
|
367
|
+
let parsed;
|
|
368
|
+
try {
|
|
369
|
+
parsed = JSON.parse(match[1]);
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
return [];
|
|
373
|
+
}
|
|
374
|
+
const values = Array.isArray(parsed) ? parsed : [parsed];
|
|
375
|
+
if (values.length === 0 || values.length > MAX_QUESTIONS)
|
|
376
|
+
return [];
|
|
377
|
+
const ids = [];
|
|
378
|
+
for (const value of values) {
|
|
379
|
+
const id = answeredQuestionId(value);
|
|
380
|
+
if (id === undefined)
|
|
381
|
+
return [];
|
|
382
|
+
ids.push(id);
|
|
383
|
+
}
|
|
384
|
+
return ids;
|
|
385
|
+
}
|
|
386
|
+
function answeredQuestionId(value) {
|
|
387
|
+
if (!isRecord(value) || typeof value.answer !== "string" ||
|
|
388
|
+
typeof value.question !== "string" || typeof value.questionItemId !== "string")
|
|
389
|
+
return undefined;
|
|
390
|
+
let id;
|
|
391
|
+
try {
|
|
392
|
+
id = JSON.parse(value.questionItemId);
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
397
|
+
if (!Array.isArray(id) || id.length !== 3 ||
|
|
398
|
+
id[0] !== "request_user_input_async" ||
|
|
399
|
+
typeof id[1] !== "string" ||
|
|
400
|
+
!Number.isSafeInteger(id[2]) || Number(id[2]) < 0)
|
|
401
|
+
return undefined;
|
|
402
|
+
return JSON.stringify(id);
|
|
403
|
+
}
|
|
404
|
+
function completionText(turn) {
|
|
405
|
+
const messages = turn.items.filter((item) => (item.type === "agentMessage" || item.type === "plan") && item.delivery !== "async" &&
|
|
406
|
+
item.questions == null && typeof item.text === "string");
|
|
407
|
+
// Native Plan-mode output is a plan item instead of an agentMessage.
|
|
408
|
+
const final = [...messages].reverse().find((item) => item.type === "plan" || item.phase === "final_answer") ??
|
|
409
|
+
[...messages].reverse().find((item) => item.phase == null);
|
|
410
|
+
const text = final?.text ?? (turn.status === "completed"
|
|
411
|
+
? "" : turn.error?.message ?? "Codex native turn " + turn.status);
|
|
412
|
+
return text.slice(-4_000);
|
|
413
|
+
}
|
|
414
|
+
function questionText(value, maxCharacters) {
|
|
415
|
+
if (typeof value !== "string" || value.length > maxCharacters ||
|
|
416
|
+
/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/u.test(value))
|
|
417
|
+
throw new Error("Codex question text is invalid");
|
|
418
|
+
const text = value.replace(/\s+/gu, " ").trim();
|
|
419
|
+
if (!text)
|
|
420
|
+
throw new Error("Codex question text is empty");
|
|
421
|
+
return text;
|
|
422
|
+
}
|
|
423
|
+
function boundedId(value) {
|
|
424
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 256 ||
|
|
425
|
+
!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(value))
|
|
426
|
+
throw new Error("Codex native item or turn id is invalid");
|
|
427
|
+
return value;
|
|
428
|
+
}
|
|
429
|
+
function epochTimestamp(value) {
|
|
430
|
+
if (value === null || !Number.isFinite(value))
|
|
431
|
+
return undefined;
|
|
432
|
+
const milliseconds = value * 1000;
|
|
433
|
+
return Math.abs(milliseconds) <= 8.64e15 ? new Date(milliseconds).toISOString() : undefined;
|
|
434
|
+
}
|
|
435
|
+
function unavailable(reason) {
|
|
436
|
+
return { status: "unavailable", reason, retryable: true };
|
|
437
|
+
}
|
|
438
|
+
function errorText(error) {
|
|
439
|
+
return error instanceof Error ? error.message : String(error);
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=codex-paginated-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-paginated-task.js","sourceRoot":"","sources":["../../src/codex-paginated-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { codexProcessIncarnationForPid } from "./codex-process-incarnation.js";
|
|
2
|
+
import type { TerminalAgentBridge } from "./terminal-agent-bridge.js";
|
|
3
|
+
import type { TerminalControlRef } from "./terminal-control-ref.js";
|
|
4
|
+
import type { CodexPaginatedThreadBinding } from "./codex-paginated-thread-facts.js";
|
|
5
|
+
export type { CodexPaginatedThreadBinding } from "./codex-paginated-thread-facts.js";
|
|
6
|
+
export declare function codexPaginatedHome(configured?: string): string;
|
|
7
|
+
export declare function captureCodexPaginatedThreadBinding(input: {
|
|
8
|
+
bridge: Pick<TerminalAgentBridge, "submitCodexStatusProbe" | "captureCodexStatusFrame">;
|
|
9
|
+
terminalControl: TerminalControlRef;
|
|
10
|
+
pid: number;
|
|
11
|
+
agentVersion: string;
|
|
12
|
+
codexHome?: string;
|
|
13
|
+
allowWorking?: boolean;
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
sleep?: (milliseconds: number) => Promise<void>;
|
|
16
|
+
incarnation?: typeof codexProcessIncarnationForPid;
|
|
17
|
+
}): Promise<CodexPaginatedThreadBinding>;
|
|
18
|
+
export declare function assertCodexPaginatedProcess(binding: CodexPaginatedThreadBinding): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { codexProcessIncarnationForPid } from "./codex-process-incarnation.js";
|
|
5
|
+
import { isCodexPaginatedVersion } from "./codex-lifecycle-compatibility.js";
|
|
6
|
+
import { createCodexTerminalAgentAdapter } from "./codex-terminal-agent-adapter.js";
|
|
7
|
+
import { stripTerminalEscapeSequences } from "./terminal-native-inspection-bridge.js";
|
|
8
|
+
export function codexPaginatedHome(configured) {
|
|
9
|
+
const value = configured ?? process.env.CODEX_HOME ?? path.join(os.homedir(), ".codex");
|
|
10
|
+
return path.resolve(value.startsWith("~/") ? path.join(os.homedir(), value.slice(2)) : value);
|
|
11
|
+
}
|
|
12
|
+
export async function captureCodexPaginatedThreadBinding(input) {
|
|
13
|
+
if (!isCodexPaginatedVersion(input.agentVersion)) {
|
|
14
|
+
throw new Error("Codex paginated foreground inspection requires version 0.158.0 or 0.159.0");
|
|
15
|
+
}
|
|
16
|
+
const incarnation = input.incarnation ?? codexProcessIncarnationForPid;
|
|
17
|
+
const before = incarnation(input.pid);
|
|
18
|
+
const runtime = { pid: input.pid, agentVersion: input.agentVersion };
|
|
19
|
+
const submission = await input.bridge.submitCodexStatusProbe(input.terminalControl, input.agentVersion, { runtime, ...(input.allowWorking ? { allowWorkingCodexStatus: true } : {}) });
|
|
20
|
+
const adapter = createCodexTerminalAgentAdapter();
|
|
21
|
+
const sleep = input.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
22
|
+
for (let attempt = 0; attempt < 40; attempt += 1) {
|
|
23
|
+
const frame = await input.bridge.captureCodexStatusFrame(input.terminalControl, runtime);
|
|
24
|
+
const observed = adapter.observeNativeInspection?.({
|
|
25
|
+
operation: { kind: "status" }, expectedAgentVersion: input.agentVersion,
|
|
26
|
+
screen: stripTerminalEscapeSequences(frame.screen),
|
|
27
|
+
previousScreenFingerprint: submission.preEnterScreenDigest
|
|
28
|
+
});
|
|
29
|
+
// LocalDaemon processes the /status history cell before its next Draw.
|
|
30
|
+
// A cleared styled Composer plus complete card proves this closed command
|
|
31
|
+
// finished; fullscreen clipping cannot preserve a monotonic card count.
|
|
32
|
+
if (frame.emptyComposer && createHash("sha256").update(frame.screen).digest("hex") !== submission.observationBaselineDigest &&
|
|
33
|
+
observed?.status === "observed" && observed.nativeThreadId &&
|
|
34
|
+
observed.result?.fields.some((field) => field.name === "Server" && field.value === "Local background server")) {
|
|
35
|
+
const after = incarnation(input.pid);
|
|
36
|
+
if (after.processUuid !== before.processUuid || after.processBirth !== before.processBirth) {
|
|
37
|
+
throw new Error("Codex process changed during foreground thread inspection");
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
codexHome: codexPaginatedHome(input.codexHome),
|
|
41
|
+
threadId: observed.nativeThreadId, serverVersion: input.agentVersion,
|
|
42
|
+
processUuid: after.processUuid, processBirth: after.processBirth,
|
|
43
|
+
pid: input.pid, observedAt: (input.now?.() ?? new Date()).toISOString()
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
await sleep(100);
|
|
47
|
+
}
|
|
48
|
+
throw new Error("Codex did not provide a fresh exact foreground thread in /status");
|
|
49
|
+
}
|
|
50
|
+
export function assertCodexPaginatedProcess(binding) {
|
|
51
|
+
const current = codexProcessIncarnationForPid(binding.pid);
|
|
52
|
+
if (current.processUuid !== binding.processUuid || current.processBirth !== binding.processBirth) {
|
|
53
|
+
throw new Error("Codex paginated thread's physical process incarnation changed");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=codex-paginated-thread-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-paginated-thread-binding.js","sourceRoot":"","sources":["../../src/codex-paginated-thread-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CodexPaginatedVersion } from "./codex-lifecycle-compatibility.js";
|
|
2
|
+
/** A fresh status transaction binds a physical TUI to a daemon-owned thread. */
|
|
3
|
+
export interface CodexPaginatedThreadBinding {
|
|
4
|
+
codexHome: string;
|
|
5
|
+
threadId: string;
|
|
6
|
+
serverVersion: CodexPaginatedVersion;
|
|
7
|
+
processUuid: string;
|
|
8
|
+
processBirth: string;
|
|
9
|
+
pid: number;
|
|
10
|
+
observedAt: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-paginated-thread-facts.js","sourceRoot":"","sources":["../../src/codex-paginated-thread-facts.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { readCodexPaginatedTaskSnapshot } from "./codex-paginated-observation.js";
|
|
2
|
+
import { type CodexPaginatedTaskAnchor, type CodexPaginatedTaskCheckpoint } from "./codex-paginated-task.js";
|
|
3
|
+
import type { TerminalAgentBridge } from "./terminal-agent-bridge.js";
|
|
4
|
+
import type { TerminalRuntimeIdentity } from "./terminal-agent-adapter.js";
|
|
5
|
+
import type { TerminalControlRef } from "./terminal-control-ref.js";
|
|
6
|
+
import type { TerminalWatch } from "./terminal-watch-record.js";
|
|
7
|
+
import { type TerminalWatchObservation } from "./terminal-watch-service.js";
|
|
8
|
+
import type { CodexAsyncQuestionDurableEvidence } from "./codex-async-question-adapter.js";
|
|
9
|
+
export { isPaginatedSendWatch } from "./terminal-watch-record.js";
|
|
10
|
+
export declare function paginatedWatchProcessMatches(terminal: Record<string, unknown>, anchor: CodexPaginatedTaskAnchor): boolean;
|
|
11
|
+
/** The caller holds the terminal input lease during this closed status probe. */
|
|
12
|
+
export declare function capturePaginatedWatchAnchor(input: {
|
|
13
|
+
terminal: Record<string, unknown>;
|
|
14
|
+
bridge: TerminalAgentBridge;
|
|
15
|
+
codexHome?: string;
|
|
16
|
+
requestHash?: string;
|
|
17
|
+
now: () => Date;
|
|
18
|
+
}): Promise<CodexPaginatedTaskAnchor | undefined>;
|
|
19
|
+
export declare function observePaginatedWatch(input: {
|
|
20
|
+
watch: TerminalWatch;
|
|
21
|
+
observedAt: string;
|
|
22
|
+
terminalMatches: boolean;
|
|
23
|
+
terminalAvailable: boolean;
|
|
24
|
+
questionnaire: (checkpoint: CodexPaginatedTaskCheckpoint, questions: readonly CodexAsyncQuestionDurableEvidence[]) => TerminalWatchObservation | undefined;
|
|
25
|
+
blockingQuestionnaire?: (checkpoint: CodexPaginatedTaskCheckpoint) => Promise<TerminalWatchObservation | undefined>;
|
|
26
|
+
readSnapshot?: typeof readCodexPaginatedTaskSnapshot;
|
|
27
|
+
}): Promise<TerminalWatchObservation>;
|
|
28
|
+
/** Reversible navigation happens before the one-shot answer reservation. */
|
|
29
|
+
export declare function refreshPaginatedResponseForeground(bridge: TerminalAgentBridge, control: TerminalControlRef, runtime: TerminalRuntimeIdentity, now: () => Date): Promise<void>;
|