@scotthuang/agent-knock-knock 0.13.16 → 0.13.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/README.md +4 -4
- package/dist/src/claude-terminal-agent-adapter.js +1 -1
- package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
- package/dist/src/codex-app-server-interaction-client.js +68 -26
- package/dist/src/codex-app-server-interaction-client.js.map +1 -1
- package/dist/src/codex-app-server-read-client.js +52 -20
- package/dist/src/codex-app-server-read-client.js.map +1 -1
- package/dist/src/codex-astra-composer-proof.js +1 -1
- package/dist/src/codex-astra-composer-proof.js.map +1 -1
- package/dist/src/codex-async-question-adapter.js +14 -4
- package/dist/src/codex-async-question-adapter.js.map +1 -1
- package/dist/src/codex-lifecycle-compatibility.d.ts +1 -1
- package/dist/src/codex-lifecycle-compatibility.js +9 -3
- package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
- package/dist/src/codex-open-rollout-inventory.d.ts +51 -0
- package/dist/src/codex-open-rollout-inventory.js +365 -0
- package/dist/src/codex-open-rollout-inventory.js.map +1 -0
- package/dist/src/codex-paginated-thread-binding.js +1 -1
- package/dist/src/codex-paginated-thread-binding.js.map +1 -1
- package/dist/src/codex-permission-surface.d.ts +1 -1
- package/dist/src/codex-permission-surface.js +1 -1
- package/dist/src/codex-permission-surface.js.map +1 -1
- package/dist/src/codex-rollout-bound-completion.d.ts +44 -0
- package/dist/src/codex-rollout-bound-completion.js +357 -0
- package/dist/src/codex-rollout-bound-completion.js.map +1 -0
- package/dist/src/codex-rollout-file.d.ts +15 -0
- package/dist/src/codex-rollout-file.js +98 -0
- package/dist/src/codex-rollout-file.js.map +1 -0
- package/dist/src/codex-rollout-human-task.d.ts +61 -0
- package/dist/src/codex-rollout-human-task.js +555 -0
- package/dist/src/codex-rollout-human-task.js.map +1 -0
- package/dist/src/codex-rollout-interaction-evidence.d.ts +48 -0
- package/dist/src/codex-rollout-interaction-evidence.js +521 -0
- package/dist/src/codex-rollout-interaction-evidence.js.map +1 -0
- package/dist/src/codex-rollout-inventory.d.ts +5 -0
- package/dist/src/codex-rollout-inventory.js +81 -0
- package/dist/src/codex-rollout-inventory.js.map +1 -0
- package/dist/src/codex-rollout-records.d.ts +49 -0
- package/dist/src/codex-rollout-records.js +298 -0
- package/dist/src/codex-rollout-records.js.map +1 -0
- package/dist/src/codex-sqlite-thread-query.d.ts +85 -0
- package/dist/src/codex-sqlite-thread-query.js +440 -0
- package/dist/src/codex-sqlite-thread-query.js.map +1 -0
- package/dist/src/codex-status-history-navigation.d.ts +1 -1
- package/dist/src/codex-status-history-navigation.js +1 -1
- package/dist/src/codex-status-history-navigation.js.map +1 -1
- package/dist/src/codex-store-adapter.d.ts +3 -50
- package/dist/src/codex-store-adapter.js +5 -796
- package/dist/src/codex-store-adapter.js.map +1 -1
- package/dist/src/codex-terminal-agent-adapter.js +4 -2
- package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
- package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +4 -134
- package/dist/src/native-thread-lifecycle-cli-adapter.js +19 -633
- package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
- package/dist/src/native-thread-lifecycle-cli-contract.d.ts +138 -0
- package/dist/src/native-thread-lifecycle-cli-contract.js +2 -0
- package/dist/src/native-thread-lifecycle-cli-contract.js.map +1 -0
- package/dist/src/semantic-permission-control.js +33 -6
- package/dist/src/semantic-permission-control.js.map +1 -1
- package/dist/src/semantic-tool-descriptions.d.ts +26 -0
- package/dist/src/semantic-tool-descriptions.js +259 -0
- package/dist/src/semantic-tool-descriptions.js.map +1 -0
- package/dist/src/semantic-tool-runtime.js +45 -37
- package/dist/src/semantic-tool-runtime.js.map +1 -1
- package/dist/src/semantic-tool-schemas.js +134 -33
- package/dist/src/semantic-tool-schemas.js.map +1 -1
- package/dist/src/terminal-action-contracts.d.ts +4 -0
- package/dist/src/terminal-action-contracts.js +695 -0
- package/dist/src/terminal-action-contracts.js.map +1 -0
- package/dist/src/terminal-composer-classifier.d.ts +1 -1
- package/dist/src/terminal-composer-classifier.js +2 -2
- package/dist/src/terminal-composer-classifier.js.map +1 -1
- package/dist/src/terminal-interaction-response-bridge.js +1 -1
- package/dist/src/terminal-interaction-response-bridge.js.map +1 -1
- package/dist/src/terminal-list-renderer.d.ts +1 -2
- package/dist/src/terminal-list-renderer.js +8 -424
- package/dist/src/terminal-list-renderer.js.map +1 -1
- package/dist/src/terminal-model-control-action-policy.d.ts +1 -1
- package/dist/src/terminal-model-control-availability.d.ts +1 -1
- package/dist/src/terminal-model-control-availability.js +1 -1
- package/dist/src/terminal-model-control-availability.js.map +1 -1
- package/dist/src/terminal-model-control-cli-adapter.d.ts +34 -0
- package/dist/src/terminal-model-control-cli-adapter.js +669 -0
- package/dist/src/terminal-model-control-cli-adapter.js.map +1 -0
- package/dist/src/terminal-model-control-contract.d.ts +198 -0
- package/dist/src/terminal-model-control-contract.js +15 -0
- package/dist/src/terminal-model-control-contract.js.map +1 -0
- package/dist/src/terminal-model-control-input.d.ts +29 -0
- package/dist/src/terminal-model-control-input.js +86 -0
- package/dist/src/terminal-model-control-input.js.map +1 -0
- package/dist/src/terminal-model-control-profile.d.ts +5 -1
- package/dist/src/terminal-model-control-profile.js +21 -7
- package/dist/src/terminal-model-control-profile.js.map +1 -1
- package/dist/src/terminal-model-control-subject.d.ts +52 -0
- package/dist/src/terminal-model-control-subject.js +73 -0
- package/dist/src/terminal-model-control-subject.js.map +1 -1
- package/dist/src/terminal-model-control-surface.d.ts +82 -0
- package/dist/src/terminal-model-control-surface.js +688 -0
- package/dist/src/terminal-model-control-surface.js.map +1 -0
- package/dist/src/terminal-model-control.d.ts +6 -270
- package/dist/src/terminal-model-control.js +11 -988
- package/dist/src/terminal-model-control.js.map +1 -1
- package/dist/src/terminal-model-selection.d.ts +33 -0
- package/dist/src/terminal-model-selection.js +143 -0
- package/dist/src/terminal-model-selection.js.map +1 -0
- package/dist/src/terminal-monitor-application-service.js +38 -59
- package/dist/src/terminal-monitor-application-service.js.map +1 -1
- package/dist/src/terminal-monitor-attention-store.d.ts +65 -0
- package/dist/src/terminal-monitor-attention-store.js +518 -0
- package/dist/src/terminal-monitor-attention-store.js.map +1 -0
- package/dist/src/terminal-monitor-collateral-recovery.d.ts +12 -0
- package/dist/src/terminal-monitor-collateral-recovery.js +415 -0
- package/dist/src/terminal-monitor-collateral-recovery.js.map +1 -0
- package/dist/src/terminal-monitor-interaction-projection.d.ts +19 -0
- package/dist/src/terminal-monitor-interaction-projection.js +48 -0
- package/dist/src/terminal-monitor-interaction-projection.js.map +1 -0
- package/dist/src/terminal-monitor-startup-recovery.d.ts +15 -0
- package/dist/src/terminal-monitor-startup-recovery.js +767 -0
- package/dist/src/terminal-monitor-startup-recovery.js.map +1 -0
- package/dist/src/terminal-monitor-state-cli-adapter.d.ts +2 -104
- package/dist/src/terminal-monitor-state-cli-adapter.js +28 -1640
- package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
- package/dist/src/terminal-monitor-state-contract.d.ts +108 -0
- package/dist/src/terminal-monitor-state-contract.js +8 -0
- package/dist/src/terminal-monitor-state-contract.js.map +1 -0
- package/dist/src/terminal-native-inspection-bridge.d.ts +4 -153
- package/dist/src/terminal-native-inspection-bridge.js +7 -646
- package/dist/src/terminal-native-inspection-bridge.js.map +1 -1
- package/dist/src/terminal-native-inspection-contract.d.ts +128 -0
- package/dist/src/terminal-native-inspection-contract.js +38 -0
- package/dist/src/terminal-native-inspection-contract.js.map +1 -0
- package/dist/src/terminal-native-inspection-profile.d.ts +15 -0
- package/dist/src/terminal-native-inspection-profile.js +189 -0
- package/dist/src/terminal-native-inspection-profile.js.map +1 -0
- package/dist/src/terminal-native-inspection-proof.d.ts +62 -0
- package/dist/src/terminal-native-inspection-proof.js +362 -0
- package/dist/src/terminal-native-inspection-proof.js.map +1 -0
- package/dist/src/terminal-permission-control-bridge.js +1 -1
- package/dist/src/terminal-permission-control-bridge.js.map +1 -1
- package/dist/src/terminal-permission-control.js +5 -1
- package/dist/src/terminal-permission-control.js.map +1 -1
- package/dist/src/terminal-questionnaire-adapter.js +5 -2
- package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
- package/dist/src/terminal-runtime-cli-adapter.d.ts +2 -1
- package/dist/src/terminal-runtime-cli-adapter.js +1 -1
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
- package/dist/src/terminal-submission-acceptance.d.ts +5 -148
- package/dist/src/terminal-submission-acceptance.js +21 -1845
- package/dist/src/terminal-submission-acceptance.js.map +1 -1
- package/dist/src/terminal-watch-anchor-capture.d.ts +9 -0
- package/dist/src/terminal-watch-anchor-capture.js +139 -0
- package/dist/src/terminal-watch-anchor-capture.js.map +1 -0
- package/dist/src/terminal-watch-cli-adapter.d.ts +3 -117
- package/dist/src/terminal-watch-cli-adapter.js +10 -1992
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-cli-contract.d.ts +117 -0
- package/dist/src/terminal-watch-cli-contract.js +2 -0
- package/dist/src/terminal-watch-cli-contract.js.map +1 -0
- package/dist/src/terminal-watch-fallback-observation.d.ts +15 -0
- package/dist/src/terminal-watch-fallback-observation.js +249 -0
- package/dist/src/terminal-watch-fallback-observation.js.map +1 -0
- package/dist/src/terminal-watch-interaction-observation.d.ts +26 -0
- package/dist/src/terminal-watch-interaction-observation.js +262 -0
- package/dist/src/terminal-watch-interaction-observation.js.map +1 -0
- package/dist/src/terminal-watch-observation-adapter.d.ts +4 -0
- package/dist/src/terminal-watch-observation-adapter.js +307 -0
- package/dist/src/terminal-watch-observation-adapter.js.map +1 -0
- package/dist/src/terminal-watch-observation-evidence.d.ts +25 -0
- package/dist/src/terminal-watch-observation-evidence.js +184 -0
- package/dist/src/terminal-watch-observation-evidence.js.map +1 -0
- package/dist/src/terminal-watch-response-authority.d.ts +6 -0
- package/dist/src/terminal-watch-response-authority.js +333 -0
- package/dist/src/terminal-watch-response-authority.js.map +1 -0
- package/dist/src/terminal-watch-response-cli-adapter.d.ts +3 -0
- package/dist/src/terminal-watch-response-cli-adapter.js +230 -0
- package/dist/src/terminal-watch-response-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-terminal-identity.d.ts +39 -0
- package/dist/src/terminal-watch-terminal-identity.js +380 -0
- package/dist/src/terminal-watch-terminal-identity.js.map +1 -0
- package/docs/codex-0.160.0-compatibility.md +126 -0
- package/docs/codex-permissions.md +12 -1
- package/package.json +3 -2
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +3 -3
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { assertPrivateRegularFile, byteAtOffset, fileEndsWithNewline, openExactRollout, readCodexRolloutHeader, sameRolloutFileIdentity, sameStableFile, } from "./codex-rollout-file.js";
|
|
2
|
+
import { validateCodexOpenRootInventoryForAcceptance, } from "./codex-rollout-inventory.js";
|
|
3
|
+
import { assertExistingCodexRolloutHeader, isRecord, optionalString, parseCodexJsonlRecords, positiveByteLimit, } from "./codex-rollout-records.js";
|
|
4
|
+
import { exactNativeThreadId, fingerprint, normalizedRolloutIdentity, requiredString, } from "./terminal-submission-facts.js";
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
const CODEX_QUESTIONNAIRE_TAIL_MAX_BYTES = 1024 * 1024;
|
|
7
|
+
const CODEX_QUESTIONNAIRE_MAX_TEXT_LENGTH = 16 * 1024;
|
|
8
|
+
const CODEX_QUESTIONNAIRE_MAX_OPTIONS = 8;
|
|
9
|
+
const CODEX_QUESTIONNAIRE_MAX_QUESTIONS = 3;
|
|
10
|
+
const CODEX_QUESTIONNAIRE_OTHER_LABEL = "None of the above";
|
|
11
|
+
const CODEX_QUESTIONNAIRE_OTHER_DESCRIPTION = "Optionally, add details in notes (tab).";
|
|
12
|
+
const CODEX_QUESTIONNAIRE_CUSTOM_LABEL = "Type something.";
|
|
13
|
+
const CODEX_QUESTIONNAIRE_CUSTOM_DESCRIPTION = "Enter a free-form answer through Codex Notes.";
|
|
14
|
+
const CODEX_ASYNC_QUESTION_TAIL_MAX_BYTES = 4 * 1024 * 1024;
|
|
15
|
+
const CODEX_ASYNC_QUESTION_MAX_ITEMS = 16;
|
|
16
|
+
const CODEX_ASYNC_QUESTION_MAX_QUESTIONS = 16;
|
|
17
|
+
const CODEX_ASYNC_QUESTION_MAX_OPTIONS = 32;
|
|
18
|
+
const CODEX_ASYNC_QUESTION_MAX_TEXT_LENGTH = 4_096;
|
|
19
|
+
/**
|
|
20
|
+
* Attributes a rendered questionnaire to one exact accepted Codex turn while
|
|
21
|
+
* the process has multiple open root rollouts. No prompt or tool arguments are
|
|
22
|
+
* returned: callers receive only a bounded fingerprint or a typed failure.
|
|
23
|
+
*/
|
|
24
|
+
export function detectCodexBoundQuestionnaireAttribution(options) {
|
|
25
|
+
let inventory;
|
|
26
|
+
let acceptedThreadId;
|
|
27
|
+
let acceptedRollout;
|
|
28
|
+
let acceptanceId;
|
|
29
|
+
try {
|
|
30
|
+
inventory = validateCodexOpenRootInventoryForAcceptance(options.currentInventory);
|
|
31
|
+
acceptedThreadId = exactNativeThreadId(options.acceptedIdentity.sessionId);
|
|
32
|
+
acceptanceId = exactNativeThreadId(options.acceptanceId);
|
|
33
|
+
if (!options.acceptedIdentity.rollout) {
|
|
34
|
+
throw new Error("accepted Codex rollout identity is unavailable");
|
|
35
|
+
}
|
|
36
|
+
acceptedRollout = normalizedRolloutIdentity(options.acceptedIdentity.rollout);
|
|
37
|
+
if (requiredString(options.acceptedIdentity.processUuid, "accepted Codex process UUID") !== inventory.processUuid ||
|
|
38
|
+
requiredString(options.acceptedIdentity.processBirth, "accepted Codex process birth") !== inventory.processBirth) {
|
|
39
|
+
return { status: "not_matched", code: "accepted_root_missing" };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return { status: "unavailable", code: "invalid_inventory" };
|
|
44
|
+
}
|
|
45
|
+
let normalizedScreen;
|
|
46
|
+
try {
|
|
47
|
+
normalizedScreen = normalizedCodexQuestionnaireScreen(options.screen);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { status: "unavailable", code: "invalid_screen" };
|
|
51
|
+
}
|
|
52
|
+
const acceptedRoots = inventory.roots.filter((root) => root.sessionId.toLowerCase() === acceptedThreadId &&
|
|
53
|
+
sameRolloutFileIdentity(root.rollout, acceptedRollout));
|
|
54
|
+
if (acceptedRoots.length !== 1) {
|
|
55
|
+
return { status: "not_matched", code: "accepted_root_missing" };
|
|
56
|
+
}
|
|
57
|
+
let maxBytes;
|
|
58
|
+
try {
|
|
59
|
+
maxBytes = positiveByteLimit(options.maxBytesPerRollout, CODEX_QUESTIONNAIRE_TAIL_MAX_BYTES, "Codex questionnaire rollout scan limit");
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return { status: "unavailable", code: "rollout_scan_unavailable" };
|
|
63
|
+
}
|
|
64
|
+
const pending = [];
|
|
65
|
+
try {
|
|
66
|
+
for (const root of inventory.roots) {
|
|
67
|
+
pending.push(...readPendingCodexRequestUserInput({
|
|
68
|
+
rollout: root.rollout,
|
|
69
|
+
nativeThreadId: root.sessionId,
|
|
70
|
+
maxBytes
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { status: "unavailable", code: "rollout_scan_unavailable" };
|
|
76
|
+
}
|
|
77
|
+
const acceptedCalls = pending.filter((call) => call.nativeThreadId === acceptedThreadId &&
|
|
78
|
+
call.turnId === acceptanceId &&
|
|
79
|
+
sameRolloutFileIdentity(call.rollout, acceptedRollout));
|
|
80
|
+
if (acceptedCalls.length !== 1) {
|
|
81
|
+
return { status: "not_matched", code: "accepted_call_not_unique" };
|
|
82
|
+
}
|
|
83
|
+
const matching = options.screen.exactShape &&
|
|
84
|
+
normalizedScreen.responseKind !== "confirm" &&
|
|
85
|
+
normalizedScreen.responseKind !== "multi_select"
|
|
86
|
+
? pending.filter((call) => codexPendingQuestionnaireMatchesScreen(call, normalizedScreen))
|
|
87
|
+
: pending;
|
|
88
|
+
if (matching.length !== 1 || matching[0] !== acceptedCalls[0]) {
|
|
89
|
+
return { status: "not_matched", code: "screen_signature_not_unique" };
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
status: "matched",
|
|
93
|
+
evidenceFingerprint: fingerprint({
|
|
94
|
+
schema: "agent-knock-knock/codex-bound-questionnaire-attribution",
|
|
95
|
+
version: 1,
|
|
96
|
+
native_thread_id: acceptedThreadId,
|
|
97
|
+
turn_id: acceptanceId,
|
|
98
|
+
rollout: {
|
|
99
|
+
device: acceptedRollout.device,
|
|
100
|
+
inode: acceptedRollout.inode,
|
|
101
|
+
path: acceptedRollout.path
|
|
102
|
+
},
|
|
103
|
+
screen: normalizedScreen
|
|
104
|
+
})
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Read only the bounded, complete tail of one exact rollout and return async
|
|
109
|
+
* questions belonging to its single currently active native turn. A missing
|
|
110
|
+
* task boundary, a partial record, file drift, or an unsupported payload is a
|
|
111
|
+
* hard absence rather than permission to infer from screen text alone.
|
|
112
|
+
*/
|
|
113
|
+
export function readCodexAsyncQuestionDurableEvidence(input) {
|
|
114
|
+
const rollout = normalizedRolloutIdentity(input.rollout);
|
|
115
|
+
const nativeThreadId = exactNativeThreadId(input.nativeThreadId);
|
|
116
|
+
const maxBytes = positiveByteLimit(input.maxBytes, CODEX_ASYNC_QUESTION_TAIL_MAX_BYTES, "Codex async-question rollout scan limit");
|
|
117
|
+
const opened = openExactRollout(rollout);
|
|
118
|
+
try {
|
|
119
|
+
const before = opened.stat;
|
|
120
|
+
assertPrivateRegularFile(before);
|
|
121
|
+
const header = readCodexRolloutHeader(opened.fd, before.size);
|
|
122
|
+
assertExistingCodexRolloutHeader(header, nativeThreadId);
|
|
123
|
+
if (!fileEndsWithNewline(opened.fd, before.size)) {
|
|
124
|
+
throw new Error("Codex async-question rollout has a partial JSONL record");
|
|
125
|
+
}
|
|
126
|
+
const readStart = Math.max(0, before.size - maxBytes);
|
|
127
|
+
const length = before.size - readStart;
|
|
128
|
+
const buffer = Buffer.allocUnsafe(length);
|
|
129
|
+
if (fs.readSync(opened.fd, buffer, 0, length, readStart) !== length) {
|
|
130
|
+
throw new Error("Codex async-question rollout changed while it was read");
|
|
131
|
+
}
|
|
132
|
+
const after = fs.fstatSync(opened.fd);
|
|
133
|
+
if (!sameStableFile(before, after)) {
|
|
134
|
+
throw new Error("Codex async-question rollout changed while it was scanned");
|
|
135
|
+
}
|
|
136
|
+
const atBoundary = readStart === 0 ||
|
|
137
|
+
byteAtOffset(opened.fd, readStart - 1) === 0x0a;
|
|
138
|
+
const firstComplete = atBoundary ? 0 : buffer.indexOf(0x0a) + 1;
|
|
139
|
+
if (firstComplete <= 0 && !atBoundary) {
|
|
140
|
+
throw new Error("Codex async-question rollout record exceeded its bounded tail scan");
|
|
141
|
+
}
|
|
142
|
+
const records = parseCodexJsonlRecords(buffer.subarray(firstComplete), "async-question tail");
|
|
143
|
+
return codexAsyncQuestionEvidenceFromRecords({
|
|
144
|
+
records,
|
|
145
|
+
prefixTruncated: readStart > 0
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
fs.closeSync(opened.fd);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function codexAsyncQuestionEvidenceFromRecords(input) {
|
|
153
|
+
const active = activeCodexAsyncQuestionTask(input);
|
|
154
|
+
if (!active)
|
|
155
|
+
return undefined;
|
|
156
|
+
const evidence = [];
|
|
157
|
+
let totalQuestions = 0;
|
|
158
|
+
for (const { value } of input.records.slice(active.startIndex + 1)) {
|
|
159
|
+
const payload = isRecord(value.payload) ? value.payload : undefined;
|
|
160
|
+
if (value.type !== "event_msg" ||
|
|
161
|
+
payload?.type !== "item_completed" ||
|
|
162
|
+
exactNativeThreadId(payload.turn_id) !== active.turnId ||
|
|
163
|
+
!isRecord(payload.item) ||
|
|
164
|
+
payload.item.type !== "AgentMessage" ||
|
|
165
|
+
payload.item.delivery !== "async") {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (evidence.length >= CODEX_ASYNC_QUESTION_MAX_ITEMS) {
|
|
169
|
+
throw new Error("Codex async-question item count exceeds the safe limit");
|
|
170
|
+
}
|
|
171
|
+
const item = codexAsyncQuestionItemEvidence(payload.item, active.turnId);
|
|
172
|
+
totalQuestions += item.questions.length;
|
|
173
|
+
if (totalQuestions > CODEX_ASYNC_QUESTION_MAX_QUESTIONS) {
|
|
174
|
+
throw new Error("Codex active async-question total exceeds the safe limit");
|
|
175
|
+
}
|
|
176
|
+
evidence.push(item);
|
|
177
|
+
}
|
|
178
|
+
return evidence.length === 0 ? undefined : evidence;
|
|
179
|
+
}
|
|
180
|
+
function activeCodexAsyncQuestionTask(input) {
|
|
181
|
+
let activeTurnId;
|
|
182
|
+
let activeStartIndex = -1;
|
|
183
|
+
let activeClosed = false;
|
|
184
|
+
input.records.forEach(({ value }, index) => {
|
|
185
|
+
const payload = isRecord(value.payload) ? value.payload : undefined;
|
|
186
|
+
if (!payload || value.type !== "event_msg")
|
|
187
|
+
return;
|
|
188
|
+
if (payload.type === "task_started") {
|
|
189
|
+
activeTurnId = exactNativeThreadId(payload.turn_id);
|
|
190
|
+
activeStartIndex = index;
|
|
191
|
+
activeClosed = false;
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (activeTurnId &&
|
|
195
|
+
(payload.type === "task_complete" || payload.type === "turn_aborted") &&
|
|
196
|
+
(payload.turn_id === undefined ||
|
|
197
|
+
exactNativeThreadId(payload.turn_id) === activeTurnId)) {
|
|
198
|
+
activeClosed = true;
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
if (!activeTurnId || activeStartIndex < 0 || activeClosed) {
|
|
202
|
+
if (input.prefixTruncated && activeStartIndex < 0) {
|
|
203
|
+
throw new Error("Codex async-question tail omitted the active task boundary");
|
|
204
|
+
}
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
return { turnId: activeTurnId, startIndex: activeStartIndex };
|
|
208
|
+
}
|
|
209
|
+
function codexAsyncQuestionItemEvidence(item, turnId) {
|
|
210
|
+
const itemId = requiredString(item.id, "Codex async-question item id");
|
|
211
|
+
const rawQuestions = item.questions;
|
|
212
|
+
if (!Array.isArray(rawQuestions) ||
|
|
213
|
+
rawQuestions.length < 1 ||
|
|
214
|
+
rawQuestions.length > CODEX_ASYNC_QUESTION_MAX_QUESTIONS) {
|
|
215
|
+
throw new Error("Codex async-question count is invalid");
|
|
216
|
+
}
|
|
217
|
+
const questions = rawQuestions.map((question) => {
|
|
218
|
+
if (!isRecord(question)) {
|
|
219
|
+
throw new Error("Codex async-question payload is invalid");
|
|
220
|
+
}
|
|
221
|
+
const title = normalizedCodexQuestionnaireText(question.title, "Codex async-question title");
|
|
222
|
+
if (title.length > CODEX_ASYNC_QUESTION_MAX_TEXT_LENGTH) {
|
|
223
|
+
throw new Error("Codex async-question title exceeds the safe limit");
|
|
224
|
+
}
|
|
225
|
+
const rawOptions = question.options;
|
|
226
|
+
if (rawOptions !== undefined && rawOptions !== null &&
|
|
227
|
+
(!Array.isArray(rawOptions) ||
|
|
228
|
+
rawOptions.length < 1 ||
|
|
229
|
+
rawOptions.length > CODEX_ASYNC_QUESTION_MAX_OPTIONS)) {
|
|
230
|
+
throw new Error("Codex async-question options are invalid");
|
|
231
|
+
}
|
|
232
|
+
const options = rawOptions == null
|
|
233
|
+
? undefined
|
|
234
|
+
: rawOptions.map((option) => {
|
|
235
|
+
const label = normalizedCodexQuestionnaireText(option, "Codex async-question option");
|
|
236
|
+
if (label.length > CODEX_ASYNC_QUESTION_MAX_TEXT_LENGTH) {
|
|
237
|
+
throw new Error("Codex async-question option exceeds the safe limit");
|
|
238
|
+
}
|
|
239
|
+
return label;
|
|
240
|
+
});
|
|
241
|
+
return {
|
|
242
|
+
title,
|
|
243
|
+
...(options === undefined ? {} : { options })
|
|
244
|
+
};
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
itemId,
|
|
248
|
+
turnId,
|
|
249
|
+
questions,
|
|
250
|
+
currentIndex: 0,
|
|
251
|
+
remainingCount: questions.length
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function readPendingCodexRequestUserInput(input) {
|
|
255
|
+
const rollout = normalizedRolloutIdentity(input.rollout);
|
|
256
|
+
const nativeThreadId = exactNativeThreadId(input.nativeThreadId);
|
|
257
|
+
const opened = openExactRollout(rollout);
|
|
258
|
+
try {
|
|
259
|
+
const before = opened.stat;
|
|
260
|
+
assertPrivateRegularFile(before);
|
|
261
|
+
const header = readCodexRolloutHeader(opened.fd, before.size);
|
|
262
|
+
assertExistingCodexRolloutHeader(header, nativeThreadId);
|
|
263
|
+
if (!fileEndsWithNewline(opened.fd, before.size)) {
|
|
264
|
+
throw new Error("Codex questionnaire rollout has a partial JSONL record");
|
|
265
|
+
}
|
|
266
|
+
const readStart = Math.max(0, before.size - input.maxBytes);
|
|
267
|
+
const length = before.size - readStart;
|
|
268
|
+
const buffer = Buffer.allocUnsafe(length);
|
|
269
|
+
if (fs.readSync(opened.fd, buffer, 0, length, readStart) !== length) {
|
|
270
|
+
throw new Error("Codex questionnaire rollout changed while it was read");
|
|
271
|
+
}
|
|
272
|
+
const after = fs.fstatSync(opened.fd);
|
|
273
|
+
if (!sameStableFile(before, after)) {
|
|
274
|
+
throw new Error("Codex questionnaire rollout changed while it was scanned");
|
|
275
|
+
}
|
|
276
|
+
const atBoundary = readStart === 0 ||
|
|
277
|
+
byteAtOffset(opened.fd, readStart - 1) === 0x0a;
|
|
278
|
+
const firstComplete = atBoundary ? 0 : buffer.indexOf(0x0a) + 1;
|
|
279
|
+
if (firstComplete <= 0 && !atBoundary) {
|
|
280
|
+
throw new Error("Codex questionnaire rollout record exceeded its bounded tail scan");
|
|
281
|
+
}
|
|
282
|
+
const records = parseCodexJsonlRecords(buffer.subarray(firstComplete), "questionnaire tail");
|
|
283
|
+
return pendingCodexRequestUserInputFromRecords({
|
|
284
|
+
records,
|
|
285
|
+
nativeThreadId,
|
|
286
|
+
rollout,
|
|
287
|
+
prefixTruncated: readStart > 0
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
fs.closeSync(opened.fd);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function pendingCodexRequestUserInputFromRecords(input) {
|
|
295
|
+
const calls = [];
|
|
296
|
+
const outputs = new Map();
|
|
297
|
+
const terminalTurns = new Map();
|
|
298
|
+
const unscopedTerminalIndexes = [];
|
|
299
|
+
const startedTurns = [];
|
|
300
|
+
let sawLifecycle = false;
|
|
301
|
+
input.records.forEach(({ value }, index) => {
|
|
302
|
+
const payload = isRecord(value.payload) ? value.payload : undefined;
|
|
303
|
+
if (!payload)
|
|
304
|
+
return;
|
|
305
|
+
if (value.type === "event_msg" &&
|
|
306
|
+
payload.type === "task_started") {
|
|
307
|
+
startedTurns.push({
|
|
308
|
+
index,
|
|
309
|
+
turnId: exactNativeThreadId(payload.turn_id)
|
|
310
|
+
});
|
|
311
|
+
sawLifecycle = true;
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
if (value.type === "event_msg" &&
|
|
315
|
+
(payload.type === "task_complete" || payload.type === "turn_aborted")) {
|
|
316
|
+
const rawTurnId = optionalString(payload.turn_id);
|
|
317
|
+
if (!rawTurnId) {
|
|
318
|
+
unscopedTerminalIndexes.push(index);
|
|
319
|
+
sawLifecycle = true;
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const turnId = exactNativeThreadId(rawTurnId);
|
|
323
|
+
const indexes = terminalTurns.get(turnId) ?? [];
|
|
324
|
+
indexes.push(index);
|
|
325
|
+
terminalTurns.set(turnId, indexes);
|
|
326
|
+
sawLifecycle = true;
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
if (value.type !== "response_item" ||
|
|
330
|
+
payload.type !== "function_call" ||
|
|
331
|
+
payload.name !== "request_user_input") {
|
|
332
|
+
if (value.type === "response_item" &&
|
|
333
|
+
payload.type === "function_call_output") {
|
|
334
|
+
const callId = requiredString(payload.call_id, "Codex questionnaire output call id");
|
|
335
|
+
const indexes = outputs.get(callId) ?? [];
|
|
336
|
+
indexes.push(index);
|
|
337
|
+
outputs.set(callId, indexes);
|
|
338
|
+
}
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const metadata = isRecord(payload.internal_chat_message_metadata_passthrough)
|
|
342
|
+
? payload.internal_chat_message_metadata_passthrough
|
|
343
|
+
: undefined;
|
|
344
|
+
const callId = requiredString(payload.call_id, "Codex questionnaire call id");
|
|
345
|
+
if (calls.some((call) => call.callId === callId)) {
|
|
346
|
+
throw new Error("Codex questionnaire call id is duplicated");
|
|
347
|
+
}
|
|
348
|
+
calls.push({
|
|
349
|
+
index,
|
|
350
|
+
callId,
|
|
351
|
+
turnId: exactNativeThreadId(metadata?.turn_id),
|
|
352
|
+
questions: parseCodexRequestUserInputArguments(payload.arguments)
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
const pending = calls.filter((call) => {
|
|
356
|
+
if (outputs.get(call.callId)?.some((index) => index > call.index)) {
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
if (terminalTurns.get(call.turnId)?.some((index) => index > call.index)) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
if (unscopedTerminalIndexes.some((index) => index > call.index)) {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
const precedingStart = latestCodexTaskStartBefore(startedTurns, call.index);
|
|
366
|
+
if (precedingStart && precedingStart.turnId !== call.turnId) {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
return !startedTurns.some((started) => started.index > call.index);
|
|
370
|
+
});
|
|
371
|
+
if (input.prefixTruncated &&
|
|
372
|
+
pending.length === 0 &&
|
|
373
|
+
!sawLifecycle) {
|
|
374
|
+
throw new Error("Codex questionnaire tail cannot exclude an omitted pending request");
|
|
375
|
+
}
|
|
376
|
+
return pending.map((call) => ({
|
|
377
|
+
nativeThreadId: input.nativeThreadId,
|
|
378
|
+
rollout: input.rollout,
|
|
379
|
+
turnId: call.turnId,
|
|
380
|
+
questions: call.questions
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
function latestCodexTaskStartBefore(starts, recordIndex) {
|
|
384
|
+
let latest;
|
|
385
|
+
for (const start of starts) {
|
|
386
|
+
if (start.index >= recordIndex)
|
|
387
|
+
break;
|
|
388
|
+
latest = start;
|
|
389
|
+
}
|
|
390
|
+
return latest;
|
|
391
|
+
}
|
|
392
|
+
function parseCodexRequestUserInputArguments(value) {
|
|
393
|
+
if (typeof value !== "string" ||
|
|
394
|
+
value.length === 0 ||
|
|
395
|
+
value.length > CODEX_QUESTIONNAIRE_TAIL_MAX_BYTES) {
|
|
396
|
+
throw new Error("Codex questionnaire arguments are invalid");
|
|
397
|
+
}
|
|
398
|
+
let parsed;
|
|
399
|
+
try {
|
|
400
|
+
parsed = JSON.parse(value);
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
throw new Error("Codex questionnaire arguments are not valid JSON");
|
|
404
|
+
}
|
|
405
|
+
const questions = isRecord(parsed) ? parsed.questions : undefined;
|
|
406
|
+
if (!Array.isArray(questions) ||
|
|
407
|
+
questions.length === 0 ||
|
|
408
|
+
questions.length > CODEX_QUESTIONNAIRE_MAX_QUESTIONS) {
|
|
409
|
+
throw new Error("Codex questionnaire question count is invalid");
|
|
410
|
+
}
|
|
411
|
+
return questions.map((question) => {
|
|
412
|
+
if (!isRecord(question)) {
|
|
413
|
+
throw new Error("Codex questionnaire question is invalid");
|
|
414
|
+
}
|
|
415
|
+
const rawOptions = question.options;
|
|
416
|
+
if (rawOptions !== undefined &&
|
|
417
|
+
(!Array.isArray(rawOptions) ||
|
|
418
|
+
rawOptions.length > CODEX_QUESTIONNAIRE_MAX_OPTIONS)) {
|
|
419
|
+
throw new Error("Codex questionnaire option count is invalid");
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
prompt: normalizedCodexQuestionnaireText(question.question, "Codex questionnaire prompt"),
|
|
423
|
+
options: (rawOptions ?? []).map((option) => {
|
|
424
|
+
if (!isRecord(option)) {
|
|
425
|
+
throw new Error("Codex questionnaire option is invalid");
|
|
426
|
+
}
|
|
427
|
+
return {
|
|
428
|
+
label: normalizedCodexQuestionnaireText(option.label, "Codex questionnaire option label"),
|
|
429
|
+
...(option.description === undefined
|
|
430
|
+
? {}
|
|
431
|
+
: {
|
|
432
|
+
description: normalizedCodexQuestionnaireText(option.description, "Codex questionnaire option description")
|
|
433
|
+
})
|
|
434
|
+
};
|
|
435
|
+
})
|
|
436
|
+
};
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
function codexPendingQuestionnaireMatchesScreen(call, screen) {
|
|
440
|
+
if (screen.currentStep < 1 ||
|
|
441
|
+
screen.currentStep > screen.totalSteps ||
|
|
442
|
+
call.questions.length !== screen.totalSteps) {
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
const question = call.questions[screen.currentStep - 1];
|
|
446
|
+
if (!question)
|
|
447
|
+
return false;
|
|
448
|
+
if (question.prompt !== screen.prompt)
|
|
449
|
+
return false;
|
|
450
|
+
if (screen.responseKind === "free_text")
|
|
451
|
+
return true;
|
|
452
|
+
if (screen.responseKind !== "single_select")
|
|
453
|
+
return false;
|
|
454
|
+
return codexRenderedOptionsMatch(question.options, screen.options ?? []);
|
|
455
|
+
}
|
|
456
|
+
function normalizedCodexQuestionnaireScreen(screen) {
|
|
457
|
+
if (!Number.isSafeInteger(screen.currentStep) ||
|
|
458
|
+
!Number.isSafeInteger(screen.totalSteps) ||
|
|
459
|
+
screen.currentStep < 1 ||
|
|
460
|
+
screen.totalSteps < 1 ||
|
|
461
|
+
screen.currentStep > screen.totalSteps ||
|
|
462
|
+
screen.totalSteps > CODEX_QUESTIONNAIRE_MAX_QUESTIONS ||
|
|
463
|
+
!["single_select", "multi_select", "free_text", "confirm"].includes(screen.responseKind) ||
|
|
464
|
+
(screen.options?.length ?? 0) > CODEX_QUESTIONNAIRE_MAX_OPTIONS) {
|
|
465
|
+
throw new Error("Codex questionnaire screen evidence is invalid");
|
|
466
|
+
}
|
|
467
|
+
return {
|
|
468
|
+
currentStep: screen.currentStep,
|
|
469
|
+
totalSteps: screen.totalSteps,
|
|
470
|
+
prompt: normalizedCodexQuestionnaireText(screen.prompt, "Codex questionnaire screen prompt"),
|
|
471
|
+
responseKind: screen.responseKind,
|
|
472
|
+
...(screen.options === undefined
|
|
473
|
+
? {}
|
|
474
|
+
: {
|
|
475
|
+
options: screen.options.map((option) => ({
|
|
476
|
+
label: normalizedCodexQuestionnaireText(option.label, "Codex questionnaire screen option label"),
|
|
477
|
+
...(option.description === undefined
|
|
478
|
+
? {}
|
|
479
|
+
: {
|
|
480
|
+
description: normalizedCodexQuestionnaireText(option.description, "Codex questionnaire screen option description")
|
|
481
|
+
})
|
|
482
|
+
}))
|
|
483
|
+
})
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
function normalizedCodexQuestionnaireText(value, label) {
|
|
487
|
+
if (typeof value !== "string" ||
|
|
488
|
+
value.length === 0 ||
|
|
489
|
+
value.length > CODEX_QUESTIONNAIRE_MAX_TEXT_LENGTH ||
|
|
490
|
+
value.includes("\0")) {
|
|
491
|
+
throw new Error(`${label} is invalid`);
|
|
492
|
+
}
|
|
493
|
+
const normalized = value.replace(/\s+/gu, " ").trim();
|
|
494
|
+
if (!normalized)
|
|
495
|
+
throw new Error(`${label} is empty`);
|
|
496
|
+
return normalized;
|
|
497
|
+
}
|
|
498
|
+
function codexRenderedOptionsMatch(durable, rendered) {
|
|
499
|
+
if (sameCodexQuestionnaireOptions(durable, rendered))
|
|
500
|
+
return true;
|
|
501
|
+
const canonicalOther = {
|
|
502
|
+
label: CODEX_QUESTIONNAIRE_OTHER_LABEL,
|
|
503
|
+
description: CODEX_QUESTIONNAIRE_OTHER_DESCRIPTION
|
|
504
|
+
};
|
|
505
|
+
if (sameCodexQuestionnaireOptions([...durable, canonicalOther], rendered)) {
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
return !durable.some((option) => option.label === CODEX_QUESTIONNAIRE_CUSTOM_LABEL) && sameCodexQuestionnaireOptions([
|
|
509
|
+
...durable,
|
|
510
|
+
{
|
|
511
|
+
label: CODEX_QUESTIONNAIRE_CUSTOM_LABEL,
|
|
512
|
+
description: CODEX_QUESTIONNAIRE_CUSTOM_DESCRIPTION
|
|
513
|
+
},
|
|
514
|
+
canonicalOther
|
|
515
|
+
], rendered);
|
|
516
|
+
}
|
|
517
|
+
function sameCodexQuestionnaireOptions(left, right) {
|
|
518
|
+
return left.length === right.length && left.every((option, index) => option.label === right[index]?.label &&
|
|
519
|
+
option.description === right[index]?.description);
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=codex-rollout-interaction-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-rollout-interaction-evidence.js","sourceRoot":"","sources":["../../src/codex-rollout-interaction-evidence.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,2CAA2C,GAC5C,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,gCAAgC,EAEhC,QAAQ,EACR,cAAc,EACd,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,mBAAmB,EACnB,WAAW,EACX,yBAAyB,EACzB,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,MAAM,kCAAkC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvD,MAAM,mCAAmC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtD,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAE1C,MAAM,iCAAiC,GAAG,CAAC,CAAC;AAE5C,MAAM,+BAA+B,GAAG,mBAAmB,CAAC;AAE5D,MAAM,qCAAqC,GACzC,yCAAyC,CAAC;AAE5C,MAAM,gCAAgC,GAAG,iBAAiB,CAAC;AAE3D,MAAM,sCAAsC,GAC1C,+CAA+C,CAAC;AAElD,MAAM,mCAAmC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5D,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAE1C,MAAM,kCAAkC,GAAG,EAAE,CAAC;AAE9C,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAE5C,MAAM,oCAAoC,GAAG,KAAK,CAAC;AAiCnD;;;;GAIG;AACH,MAAM,UAAU,wCAAwC,CAAC,OAMxD;IACC,IAAI,SAAwC,CAAC;IAC7C,IAAI,gBAAwB,CAAC;IAC7B,IAAI,eAAqC,CAAC;IAC1C,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,SAAS,GAAG,2CAA2C,CACrD,OAAO,CAAC,gBAAgB,CACzB,CAAC;QACF,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC3E,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,eAAe,GAAG,yBAAyB,CACzC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CACjC,CAAC;QACF,IACE,cAAc,CACZ,OAAO,CAAC,gBAAgB,CAAC,WAAW,EACpC,6BAA6B,CAC9B,KAAK,SAAS,CAAC,WAAW;YAC3B,cAAc,CACZ,OAAO,CAAC,gBAAgB,CAAC,YAAY,EACrC,8BAA8B,CAC/B,KAAK,SAAS,CAAC,YAAY,EAC5B,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC9D,CAAC;IAED,IAAI,gBAAuE,CAAC;IAC5E,IAAI,CAAC;QACH,gBAAgB,GAAG,kCAAkC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACpD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,gBAAgB;QACjD,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CACvD,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,iBAAiB,CAC1B,OAAO,CAAC,kBAAkB,EAC1B,kCAAkC,EAClC,wCAAwC,CACzC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,GAAG,gCAAgC,CAAC;gBAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,cAAc,EAAE,IAAI,CAAC,SAAS;gBAC9B,QAAQ;aACT,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5C,IAAI,CAAC,cAAc,KAAK,gBAAgB;QACxC,IAAI,CAAC,MAAM,KAAK,YAAY;QAC5B,uBAAuB,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CACvD,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU;QACtC,gBAAgB,CAAC,YAAY,KAAK,SAAS;QAC3C,gBAAgB,CAAC,YAAY,KAAK,cAAc;QAClD,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAC/D;QACH,CAAC,CAAC,OAAO,CAAC;IACZ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;IACxE,CAAC;IACD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,mBAAmB,EAAE,WAAW,CAAC;YAC/B,MAAM,EAAE,yDAAyD;YACjE,OAAO,EAAE,CAAC;YACV,gBAAgB,EAAE,gBAAgB;YAClC,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE;gBACP,MAAM,EAAE,eAAe,CAAC,MAAM;gBAC9B,KAAK,EAAE,eAAe,CAAC,KAAK;gBAC5B,IAAI,EAAE,eAAe,CAAC,IAAI;aAC3B;YACD,MAAM,EAAE,gBAAgB;SACzB,CAAC;KACH,CAAC;AACJ,CAAC;AAiBD;;;;;GAKG;AACH,MAAM,UAAU,qCAAqC,CAAC,KAIrD;IACC,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,iBAAiB,CAChC,KAAK,CAAC,QAAQ,EACd,mCAAmC,EACnC,yCAAyC,CAC1C,CAAC;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QAC3B,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,gCAAgC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,MAAM,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,KAAK,CAAC;YAChC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAClD,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,sBAAsB,CACpC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC9B,qBAAqB,CACtB,CAAC;QACF,OAAO,qCAAqC,CAAC;YAC3C,OAAO;YACP,eAAe,EAAE,SAAS,GAAG,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,qCAAqC,CAAC,KAG9C;IACC,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,QAAQ,GAAwC,EAAE,CAAC;IACzD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;YAC1B,OAAO,EAAE,IAAI,KAAK,gBAAgB;YAClC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM;YACtD,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc;YACpC,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,EACjC,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,IAAI,8BAA8B,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,IAAI,GAAG,8BAA8B,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzE,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACxC,IAAI,cAAc,GAAG,kCAAkC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,4BAA4B,CAAC,KAGrC;IACC,IAAI,YAAgC,CAAC;IACrC,IAAI,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QACnD,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACpC,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,gBAAgB,GAAG,KAAK,CAAC;YACzB,YAAY,GAAG,KAAK,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IACE,YAAY;YACZ,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC;YACrE,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS;gBAC5B,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,EACxD,CAAC;YACD,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,YAAY,IAAI,gBAAgB,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,eAAe,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,8BAA8B,CACrC,IAA6B,EAC7B,MAAc;IAEd,MAAM,MAAM,GAAG,cAAc,CAC3B,IAAI,CAAC,EAAE,EACP,8BAA8B,CAC/B,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;IACpC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAC5B,YAAY,CAAC,MAAM,GAAG,CAAC;QACvB,YAAY,CAAC,MAAM,GAAG,kCAAkC,EACxD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,GAAG,gCAAgC,CAC5C,QAAQ,CAAC,KAAK,EACd,4BAA4B,CAC7B,CAAC;QACF,IAAI,KAAK,CAAC,MAAM,GAAG,oCAAoC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;QACpC,IACE,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI;YAC/C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;gBACzB,UAAU,CAAC,MAAM,GAAG,CAAC;gBACrB,UAAU,CAAC,MAAM,GAAG,gCAAgC,CAAC,EACvD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,IAAI,IAAI;YAChC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACxB,MAAM,KAAK,GAAG,gCAAgC,CAC5C,MAAM,EACN,6BAA6B,CAC9B,CAAC;gBACF,IAAI,KAAK,CAAC,MAAM,GAAG,oCAAoC,EAAE,CAAC;oBACxD,MAAM,IAAI,KAAK,CACb,oDAAoD,CACrD,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;QACP,OAAO;YACL,KAAK;YACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,MAAM;QACN,MAAM;QACN,SAAS;QACT,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,SAAS,CAAC,MAAM;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,KAIzC;IACC,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QAC3B,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,gCAAgC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,IACE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,MAAM,EAC/D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,KAAK,CAAC;YAChC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAClD,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,sBAAsB,CACpC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC9B,oBAAoB,CACrB,CAAC;QACF,OAAO,uCAAuC,CAAC;YAC7C,OAAO;YACP,cAAc;YACd,OAAO;YACP,eAAe,EAAE,SAAS,GAAG,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,uCAAuC,CAAC,KAKhD;IACC,MAAM,KAAK,GAKN,EAAE,CAAC;IACR,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;IAClD,MAAM,uBAAuB,GAAa,EAAE,CAAC;IAC7C,MAAM,YAAY,GAA6C,EAAE,CAAC;IAClE,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;YAC1B,OAAO,CAAC,IAAI,KAAK,cAAc,EAC/B,CAAC;YACD,YAAY,CAAC,IAAI,CAAC;gBAChB,KAAK;gBACL,MAAM,EAAE,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC;aAC7C,CAAC,CAAC;YACH,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IACE,KAAK,CAAC,IAAI,KAAK,WAAW;YAC1B,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,EACrE,CAAC;YACD,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpC,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,YAAY,GAAG,IAAI,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IACE,KAAK,CAAC,IAAI,KAAK,eAAe;YAC9B,OAAO,CAAC,IAAI,KAAK,eAAe;YAChC,OAAO,CAAC,IAAI,KAAK,oBAAoB,EACrC,CAAC;YACD,IACE,KAAK,CAAC,IAAI,KAAK,eAAe;gBAC9B,OAAO,CAAC,IAAI,KAAK,sBAAsB,EACvC,CAAC;gBACD,MAAM,MAAM,GAAG,cAAc,CAC3B,OAAO,CAAC,OAAO,EACf,oCAAoC,CACrC,CAAC;gBACF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CACvB,OAAO,CAAC,0CAA0C,CACnD;YACC,CAAC,CAAC,OAAO,CAAC,0CAA0C;YACpD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,cAAc,CAC3B,OAAO,CAAC,OAAO,EACf,6BAA6B,CAC9B,CAAC;QACF,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,KAAK;YACL,MAAM;YACN,MAAM,EAAE,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC9C,SAAS,EAAE,mCAAmC,CAAC,OAAO,CAAC,SAAS,CAAC;SAClE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,cAAc,GAAG,0BAA0B,CAC/C,YAAY,EACZ,IAAI,CAAC,KAAK,CACX,CAAC;QACF,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,IACE,KAAK,CAAC,eAAe;QACrB,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,CAAC,YAAY,EACb,CAAC;QACD,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,0BAA0B,CACjC,MAAwD,EACxD,WAAmB;IAEnB,IAAI,MAAqD,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,IAAI,WAAW;YAAE,MAAM;QACtC,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mCAAmC,CAC1C,KAAc;IAEd,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,kCAAkC,EACjD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACzB,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,SAAS,CAAC,MAAM,GAAG,iCAAiC,EACpD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;QACpC,IACE,UAAU,KAAK,SAAS;YACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;gBACzB,UAAU,CAAC,MAAM,GAAG,+BAA+B,CAAC,EACtD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO;YACL,MAAM,EAAE,gCAAgC,CACtC,QAAQ,CAAC,QAAQ,EACjB,4BAA4B,CAC7B;YACD,OAAO,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBACD,OAAO;oBACL,KAAK,EAAE,gCAAgC,CACrC,MAAM,CAAC,KAAK,EACZ,kCAAkC,CACnC;oBACD,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS;wBAClC,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC;4BACE,WAAW,EAAE,gCAAgC,CAC3C,MAAM,CAAC,WAAW,EAClB,wCAAwC,CACzC;yBACF,CAAC;iBACP,CAAC;YACJ,CAAC,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sCAAsC,CAC7C,IAAkC,EAClC,MAA6D;IAE7D,IACE,MAAM,CAAC,WAAW,GAAG,CAAC;QACtB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU;QACtC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,EAC3C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,MAAM,CAAC,YAAY,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,MAAM,CAAC,YAAY,KAAK,eAAe;QAAE,OAAO,KAAK,CAAC;IAC1D,OAAO,yBAAyB,CAC9B,QAAQ,CAAC,OAAO,EAChB,MAAM,CAAC,OAAO,IAAI,EAAE,CACrB,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CACzC,MAAwC;IAQxC,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;QACzC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;QACxC,MAAM,CAAC,WAAW,GAAG,CAAC;QACtB,MAAM,CAAC,UAAU,GAAG,CAAC;QACrB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU;QACtC,MAAM,CAAC,UAAU,GAAG,iCAAiC;QACrD,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,QAAQ,CACjE,MAAM,CAAC,YAAY,CACpB;QACD,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,+BAA+B,EAC/D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,gCAAgC,CACtC,MAAM,CAAC,MAAM,EACb,mCAAmC,CACpC;QACD,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS;YAC9B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACvC,KAAK,EAAE,gCAAgC,CACrC,MAAM,CAAC,KAAK,EACZ,yCAAyC,CAC1C;oBACD,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS;wBAClC,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC;4BACE,WAAW,EAAE,gCAAgC,CAC3C,MAAM,CAAC,WAAW,EAClB,+CAA+C,CAChD;yBACF,CAAC;iBACP,CAAC,CAAC;aACJ,CAAC;KACP,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,KAAc,EACd,KAAa;IAEb,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,MAAM,GAAG,mCAAmC;QAClD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,yBAAyB,CAChC,OAA+D,EAC/D,QAAgE;IAEhE,IAAI,6BAA6B,CAAC,OAAO,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,cAAc,GAAG;QACrB,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,qCAAqC;KACnD,CAAC;IACF,IACE,6BAA6B,CAC3B,CAAC,GAAG,OAAO,EAAE,cAAc,CAAC,EAC5B,QAAQ,CACT,EACD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9B,MAAM,CAAC,KAAK,KAAK,gCAAgC,CAClD,IAAI,6BAA6B,CAChC;QACE,GAAG,OAAO;QACV;YACE,KAAK,EAAE,gCAAgC;YACvC,WAAW,EAAE,sCAAsC;SACpD;QACD,cAAc;KACf,EACD,QAAQ,CACT,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CACpC,IAA4D,EAC5D,KAA6D;IAE7D,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAClE,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK;QACpC,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,CACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type CodexOpenRootRolloutIdentity, type CodexOpenRootRolloutInventory } from "./agent-session-provider.js";
|
|
2
|
+
import { type CodexCandidateSetRolloutAcceptanceAnchor, type CodexRolloutIdentity } from "./terminal-submission-facts.js";
|
|
3
|
+
export declare function validateCodexOpenRootInventoryForAcceptance(value: CodexOpenRootRolloutInventory): CodexOpenRootRolloutInventory;
|
|
4
|
+
export declare function validateCodexRecoveryCandidateForAcceptance(value: CodexOpenRootRolloutIdentity, anchor: CodexCandidateSetRolloutAcceptanceAnchor): CodexOpenRootRolloutIdentity;
|
|
5
|
+
export declare function codexRolloutInodeKey(rollout: CodexRolloutIdentity): string;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { isRecord, } from "./codex-rollout-records.js";
|
|
2
|
+
import { exactNativeThreadId, fingerprint, normalizedRolloutIdentity, requiredString, } from "./terminal-submission-facts.js";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export function validateCodexOpenRootInventoryForAcceptance(value) {
|
|
5
|
+
if (!isRecord(value) ||
|
|
6
|
+
value.schema !==
|
|
7
|
+
"agent-knock-knock/codex-open-root-rollout-inventory" ||
|
|
8
|
+
value.version !== 1 ||
|
|
9
|
+
!["verified_absent", "resolved", "unbound"].includes(String(value.status)) ||
|
|
10
|
+
!Number.isSafeInteger(value.pid) ||
|
|
11
|
+
value.pid <= 1 ||
|
|
12
|
+
!Array.isArray(value.roots) ||
|
|
13
|
+
value.roots.length > 128 ||
|
|
14
|
+
!/^[0-9a-f]{64}$/u.test(String(value.inventoryFingerprint))) {
|
|
15
|
+
throw new Error("Codex open-root rollout inventory is invalid");
|
|
16
|
+
}
|
|
17
|
+
requiredString(value.processUuid, "Codex process UUID");
|
|
18
|
+
requiredString(value.processBirth, "Codex process birth");
|
|
19
|
+
if (value.processUuid !==
|
|
20
|
+
`codex-pid:${value.pid}:birth:${value.processBirth}`) {
|
|
21
|
+
throw new Error("Codex open-root rollout inventory process UUID is inconsistent");
|
|
22
|
+
}
|
|
23
|
+
if (value.cwd !== undefined && !path.isAbsolute(value.cwd)) {
|
|
24
|
+
throw new Error("Codex open-root rollout inventory cwd is not absolute");
|
|
25
|
+
}
|
|
26
|
+
if ((value.status === "verified_absent" && value.roots.length !== 0) ||
|
|
27
|
+
(value.status === "resolved" && value.roots.length !== 1) ||
|
|
28
|
+
(value.status === "unbound" &&
|
|
29
|
+
(value.roots.length < 2 ||
|
|
30
|
+
value.reason !== "multiple_open_root_rollouts"))) {
|
|
31
|
+
throw new Error("Codex open-root rollout inventory status is inconsistent");
|
|
32
|
+
}
|
|
33
|
+
const seenThreads = new Set();
|
|
34
|
+
const seenFiles = new Set();
|
|
35
|
+
for (const identity of value.roots) {
|
|
36
|
+
if (!isRecord(identity)) {
|
|
37
|
+
throw new Error("Codex open-root rollout inventory identity is invalid");
|
|
38
|
+
}
|
|
39
|
+
const nativeThreadId = exactNativeThreadId(identity.sessionId);
|
|
40
|
+
if (identity.processUuid !== value.processUuid ||
|
|
41
|
+
identity.processBirth !== value.processBirth ||
|
|
42
|
+
identity.evidence !== "codex_open_root_rollout") {
|
|
43
|
+
throw new Error("Codex open-root rollout inventory has mixed process authority");
|
|
44
|
+
}
|
|
45
|
+
const rollout = normalizedRolloutIdentity(identity.rollout);
|
|
46
|
+
if (seenThreads.has(nativeThreadId) ||
|
|
47
|
+
seenFiles.has(`${rollout.device}:${rollout.inode}`)) {
|
|
48
|
+
throw new Error("Codex open-root rollout inventory is ambiguous");
|
|
49
|
+
}
|
|
50
|
+
seenThreads.add(nativeThreadId);
|
|
51
|
+
seenFiles.add(`${rollout.device}:${rollout.inode}`);
|
|
52
|
+
}
|
|
53
|
+
const { status: _status, inventoryFingerprint, reason: _reason, ...authority } = value;
|
|
54
|
+
if (fingerprint(authority) !== inventoryFingerprint) {
|
|
55
|
+
throw new Error("Codex open-root rollout inventory fingerprint does not match");
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
export function validateCodexRecoveryCandidateForAcceptance(value, anchor) {
|
|
60
|
+
if (!isRecord(value)) {
|
|
61
|
+
throw new Error("persisted Codex recovery candidate is invalid");
|
|
62
|
+
}
|
|
63
|
+
const sessionId = exactNativeThreadId(value.sessionId);
|
|
64
|
+
const rollout = normalizedRolloutIdentity(value.rollout);
|
|
65
|
+
if (value.processUuid !== anchor.process_uuid ||
|
|
66
|
+
value.processBirth !== anchor.process_birth ||
|
|
67
|
+
value.evidence !== "codex_open_root_rollout") {
|
|
68
|
+
throw new Error("persisted Codex recovery candidate has different process authority");
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
sessionId,
|
|
72
|
+
processUuid: anchor.process_uuid,
|
|
73
|
+
processBirth: anchor.process_birth,
|
|
74
|
+
rollout,
|
|
75
|
+
evidence: "codex_open_root_rollout"
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function codexRolloutInodeKey(rollout) {
|
|
79
|
+
return `${rollout.device}:${rollout.inode}`;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=codex-rollout-inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-rollout-inventory.js","sourceRoot":"","sources":["../../src/codex-rollout-inventory.ts"],"names":[],"mappings":"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"}
|