@scotthuang/agent-knock-knock 0.13.15 → 0.13.17
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 +13 -0
- package/README.md +2 -1
- package/dist/src/claude-terminal-agent-adapter.js +1 -1
- package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
- package/dist/src/cli-core.js +6 -3
- package/dist/src/cli-core.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-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 +23 -0
- package/dist/src/codex-permission-surface.js +211 -0
- package/dist/src/codex-permission-surface.js.map +1 -0
- 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 +1 -1
- package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
- package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +7 -136
- package/dist/src/native-thread-lifecycle-cli-adapter.js +39 -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.d.ts +19 -0
- package/dist/src/semantic-permission-control.js +201 -0
- package/dist/src/semantic-permission-control.js.map +1 -0
- package/dist/src/semantic-tool-command-helpers.d.ts +7 -0
- package/dist/src/semantic-tool-command-helpers.js +29 -1
- package/dist/src/semantic-tool-command-helpers.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-list-projection.js +4 -0
- package/dist/src/semantic-tool-list-projection.js.map +1 -1
- package/dist/src/semantic-tool-presentation.js +5 -2
- package/dist/src/semantic-tool-presentation.js.map +1 -1
- package/dist/src/semantic-tool-runtime.js +50 -36
- package/dist/src/semantic-tool-runtime.js.map +1 -1
- package/dist/src/semantic-tool-schemas.d.ts +33 -0
- package/dist/src/semantic-tool-schemas.js +165 -31
- 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-action-projection.d.ts +1 -1
- package/dist/src/terminal-action-projection.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +3 -0
- package/dist/src/terminal-agent-bridge.js +11 -0
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-composer-classifier.d.ts +1 -1
- package/dist/src/terminal-composer-classifier.js +31 -5
- 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-cli-adapter.js +7 -12
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-renderer.d.ts +8 -2
- package/dist/src/terminal-list-renderer.js +37 -400
- 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 +2 -0
- package/dist/src/terminal-model-control-profile.js +6 -0
- 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-decision-policy.d.ts +1 -1
- 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-control-cli-contract.d.ts +16 -0
- package/dist/src/terminal-native-control-cli-contract.js +2 -0
- package/dist/src/terminal-native-control-cli-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 +185 -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-availability.d.ts +31 -0
- package/dist/src/terminal-permission-control-availability.js +50 -0
- package/dist/src/terminal-permission-control-availability.js.map +1 -0
- package/dist/src/terminal-permission-control-bridge.d.ts +16 -0
- package/dist/src/terminal-permission-control-bridge.js +93 -0
- package/dist/src/terminal-permission-control-bridge.js.map +1 -0
- package/dist/src/terminal-permission-control-cli-adapter.d.ts +31 -0
- package/dist/src/terminal-permission-control-cli-adapter.js +152 -0
- package/dist/src/terminal-permission-control-cli-adapter.js.map +1 -0
- package/dist/src/terminal-permission-control-list-projection.d.ts +23 -0
- package/dist/src/terminal-permission-control-list-projection.js +47 -0
- package/dist/src/terminal-permission-control-list-projection.js.map +1 -0
- package/dist/src/terminal-permission-control-runtime.d.ts +28 -0
- package/dist/src/terminal-permission-control-runtime.js +88 -0
- package/dist/src/terminal-permission-control-runtime.js.map +1 -0
- package/dist/src/terminal-permission-control.d.ts +69 -0
- package/dist/src/terminal-permission-control.js +217 -0
- package/dist/src/terminal-permission-control.js.map +1 -0
- 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-permissions.md +95 -0
- package/openclaw.plugin.json +9 -1
- package/package.json +3 -2
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +6 -1
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { isCodexPaginatedReadCandidate } from "./codex-lifecycle-compatibility.js";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { captureCodexFullscreenComposerFrame, exactCodexFullscreenSlashComposerCapture } from "./codex-fullscreen-composer-proof.js";
|
|
4
|
+
import { NativeInspectionDiagnosticError } from "./terminal-native-inspection-contract.js";
|
|
5
|
+
import { CLAUDE_NATIVE_STATUS_POPUP_BY_PROFILE, codexFullscreenStatusVersion, codexNativeStatusPopupRows } from "./terminal-native-inspection-profile.js";
|
|
6
|
+
/** Pure current-frame proofs. Native input remains owned by the inspection bridge. */
|
|
7
|
+
export const CODEX_COMPOSER_MARKER = /^[›»](?:\s|$)/u;
|
|
8
|
+
export const CODEX_COMPOSER_FOOTER = /^(?:gpt-[\w.-]+(?:\s|$)|[-\w.]+ default ·)/u;
|
|
9
|
+
export function assertNativeInspectionComposerSafe(inspection, displayName = "terminal agent", allowWorkingCodexStatus = false) {
|
|
10
|
+
if (inspection.approval.blocked ||
|
|
11
|
+
inspection.activity.state === "awaiting_approval" ||
|
|
12
|
+
inspection.activity.state === "working" && !allowWorkingCodexStatus) {
|
|
13
|
+
throw new NativeInspectionDiagnosticError("composer_not_ready", `${displayName} became busy or blocked while its /status composer was settling`);
|
|
14
|
+
}
|
|
15
|
+
// Codex's generic activity parser deliberately reports a non-empty slash
|
|
16
|
+
// composer as unknown. At this stage the caller has already proved an idle,
|
|
17
|
+
// empty styled composer under the terminal lock; the exact-current composer
|
|
18
|
+
// capture below is the stronger continuation proof after AKK injected only
|
|
19
|
+
// the adapter-owned /status command.
|
|
20
|
+
}
|
|
21
|
+
export function exactNativeInspectionComposerCapture(agent, screen, plan) {
|
|
22
|
+
return agent === "codex"
|
|
23
|
+
? exactCodexNativeInspectionComposerCapture(screen, plan)
|
|
24
|
+
: exactClaudeNativeInspectionComposerCapture(screen, plan);
|
|
25
|
+
}
|
|
26
|
+
export function exactCodexNativeInspectionComposerCapture(screen, plan) {
|
|
27
|
+
if (codexFullscreenStatusVersion(plan) !== undefined) {
|
|
28
|
+
const captured = exactCodexFullscreenSlashComposerCapture(stripTerminalEscapeSequences(screen), plan.command, codexNativeStatusPopupRows(plan), false, codexFullscreenStatusVersion(plan));
|
|
29
|
+
return captured && { digest: captured.digest, kind: "exact_slash_popup" };
|
|
30
|
+
}
|
|
31
|
+
const lines = screen.replace(/\r\n?/gu, "\n").split("\n");
|
|
32
|
+
let currentComposerIndex = -1;
|
|
33
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
34
|
+
if (CODEX_COMPOSER_MARKER.test(lines[index])) {
|
|
35
|
+
currentComposerIndex = index;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (currentComposerIndex < 0) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const composerText = lines[currentComposerIndex]
|
|
43
|
+
.replace(/^[›»]\s?/u, "")
|
|
44
|
+
.trimEnd();
|
|
45
|
+
if (composerText !== plan.command) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const footerIndex = lines.findIndex((line, candidateIndex) => candidateIndex > currentComposerIndex &&
|
|
49
|
+
CODEX_COMPOSER_FOOTER.test(line.trim()));
|
|
50
|
+
const region = lines.slice(currentComposerIndex, footerIndex < 0 ? lines.length : footerIndex);
|
|
51
|
+
while (region.length > 1 && region.at(-1)?.trim() === "") {
|
|
52
|
+
region.pop();
|
|
53
|
+
}
|
|
54
|
+
const popupRows = region.slice(1).filter((line) => line.trim().length > 0);
|
|
55
|
+
let kind;
|
|
56
|
+
if (popupRows.length === 0) {
|
|
57
|
+
kind = "exact_slash_composer";
|
|
58
|
+
}
|
|
59
|
+
else if (JSON.stringify(popupRows.map((line) => line.trimEnd())) ===
|
|
60
|
+
JSON.stringify(codexNativeStatusPopupRows(plan))) {
|
|
61
|
+
kind = "exact_slash_popup";
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
kind,
|
|
68
|
+
digest: createHash("sha256").update(region.join("\n")).digest("hex")
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function exactClaudeNativeInspectionComposerCapture(screen, plan) {
|
|
72
|
+
const frame = exactClaudeComposerFrame(screen);
|
|
73
|
+
if (!frame) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const { lines, openIndex, closeIndex, composerRows, trailing } = frame;
|
|
77
|
+
if (composerRows.length !== 1 ||
|
|
78
|
+
!/^\s*❯(?:\s|$)/u.test(composerRows[0]) ||
|
|
79
|
+
composerRows[0].replace(/^\s*❯\s?/u, "").trimEnd() !== plan.command) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
let kind;
|
|
83
|
+
if (trailing.length === 0 || claudeNativeInspectionTrailingIsFooter(trailing)) {
|
|
84
|
+
kind = "exact_slash_composer";
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const suggestions = [];
|
|
88
|
+
for (const line of trailing) {
|
|
89
|
+
const trimmed = line.trim();
|
|
90
|
+
if (trimmed.startsWith("/")) {
|
|
91
|
+
suggestions.push(trimmed.replace(/\s+/gu, " "));
|
|
92
|
+
}
|
|
93
|
+
else if (suggestions.length > 0) {
|
|
94
|
+
suggestions[suggestions.length - 1] +=
|
|
95
|
+
` ${trimmed.replace(/\s+/gu, " ")}`;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!closedClaudeNativeStatusSuggestionsMatch(suggestions, CLAUDE_NATIVE_STATUS_POPUP_BY_PROFILE[plan.behaviorProfile])) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
kind = "exact_slash_popup";
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
kind,
|
|
108
|
+
digest: createHash("sha256")
|
|
109
|
+
.update(lines.slice(openIndex, closeIndex + 1).concat(trailing).join("\n"))
|
|
110
|
+
.digest("hex")
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Claude truncates a suggestion row with a Unicode ellipsis at narrow pane
|
|
115
|
+
* widths. Keep authorization closed by accepting only an exact ordered row or
|
|
116
|
+
* an explicit ellipsis whose preceding text is an exact, non-trivial prefix of
|
|
117
|
+
* that same profiled row. A caller still cannot introduce, omit, or reorder a
|
|
118
|
+
* slash command.
|
|
119
|
+
*/
|
|
120
|
+
export function closedClaudeNativeStatusSuggestionsMatch(observed, expected) {
|
|
121
|
+
if (!expected || observed.length !== expected.length) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
return observed.every((row, index) => {
|
|
125
|
+
const exact = expected[index];
|
|
126
|
+
if (row === exact) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
if (!row.endsWith("…")) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const prefix = row.slice(0, -1);
|
|
133
|
+
const commandEnd = exact.indexOf(" ");
|
|
134
|
+
return (commandEnd > 0 &&
|
|
135
|
+
prefix.length >= commandEnd + 12 &&
|
|
136
|
+
exact.startsWith(prefix));
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Prove Claude Code's exact current idle input frame. This is shared by every
|
|
141
|
+
* automated-input path: a loose or historical `❯` prompt is not authority to
|
|
142
|
+
* inject text into the terminal.
|
|
143
|
+
*/
|
|
144
|
+
export function isExactClaudeIdleComposer(screen) {
|
|
145
|
+
const frame = exactClaudeComposerFrame(screen);
|
|
146
|
+
if (!frame) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return (frame.composerRows.length === 1 &&
|
|
150
|
+
/^\s*❯\s*$/u.test(frame.composerRows[0]) &&
|
|
151
|
+
(frame.trailing.length === 0 ||
|
|
152
|
+
claudeNativeInspectionTrailingIsFooter(frame.trailing)));
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Compatibility export retained for callers that adopted the native-status
|
|
156
|
+
* name before the same exact-frame proof was reused by lifecycle handoff.
|
|
157
|
+
*/
|
|
158
|
+
export function isExactClaudeNativeInspectionIdleComposer(screen) {
|
|
159
|
+
return isExactClaudeIdleComposer(screen);
|
|
160
|
+
}
|
|
161
|
+
export function exactClaudeComposerFrame(screen) {
|
|
162
|
+
const lines = screen.replace(/\r\n?/gu, "\n").replace(/\u00a0/gu, " ")
|
|
163
|
+
.split("\n");
|
|
164
|
+
// Named Claude sessions render the display name inside the upper border.
|
|
165
|
+
// It is only frame decoration, never native session or task identity.
|
|
166
|
+
const plainDivider = /^\s*[─━]{8,}\s*$/u;
|
|
167
|
+
const namedDivider = /^\s*[─━]{8,} [^\x00-\x1f\x7f]{1,128} [─━]+\s*$/u;
|
|
168
|
+
const dividerIndexes = lines
|
|
169
|
+
.map((line, index) => plainDivider.test(line) || namedDivider.test(line) ? index : -1)
|
|
170
|
+
.filter((index) => index >= 0);
|
|
171
|
+
if (dividerIndexes.length < 2) {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
const closeIndex = dividerIndexes.at(-1);
|
|
175
|
+
if (!plainDivider.test(lines[closeIndex])) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
const openIndex = dividerIndexes.at(-2);
|
|
179
|
+
return {
|
|
180
|
+
lines,
|
|
181
|
+
openIndex,
|
|
182
|
+
closeIndex,
|
|
183
|
+
composerRows: lines.slice(openIndex + 1, closeIndex)
|
|
184
|
+
.filter((line) => line.trim().length > 0),
|
|
185
|
+
trailing: lines.slice(closeIndex + 1)
|
|
186
|
+
.filter((line) => line.trim().length > 0)
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
export function claudeNativeInspectionTrailingIsFooter(lines) {
|
|
190
|
+
return lines.length <= 2 && lines.every(isClaudeNativeComposerFooterLine);
|
|
191
|
+
}
|
|
192
|
+
export function isClaudeNativeComposerFooterLine(line) {
|
|
193
|
+
return /^\s*(?:[⏵⏴⏸]{1,2}|\?)\s*.*(?:manual mode|shift\+tab|accept edits|bypass permissions|for shortcuts|← for agents)/iu
|
|
194
|
+
.test(line);
|
|
195
|
+
}
|
|
196
|
+
export function nativeInspectionScreenFingerprint(screen) {
|
|
197
|
+
return `sha256:${createHash("sha256").update(screen).digest("hex")}`;
|
|
198
|
+
}
|
|
199
|
+
export function bareDigestFromNativeInspectionScreenFingerprint(fingerprint) {
|
|
200
|
+
const match = /^sha256:([0-9a-f]{64})$/u.exec(fingerprint);
|
|
201
|
+
if (!match) {
|
|
202
|
+
throw new Error("native inspection screen fingerprint is malformed");
|
|
203
|
+
}
|
|
204
|
+
return match[1];
|
|
205
|
+
}
|
|
206
|
+
export function stripTerminalEscapeSequences(value) {
|
|
207
|
+
return value.replace(/\x1B(?:\[[0-?]*[ -/]*[@-~]|\][^\x07\x1B]*(?:\x07|\x1B\\))/gu, "");
|
|
208
|
+
}
|
|
209
|
+
export function exactCodexReadyStyledComposerCapture(screen, agentVersion) {
|
|
210
|
+
if (isCodexPaginatedReadCandidate(agentVersion)) {
|
|
211
|
+
const frame = captureCodexFullscreenComposerFrame(screen, agentVersion);
|
|
212
|
+
if (!frame || !frame.hasShortcutFooter ||
|
|
213
|
+
!["", "Ask Codex to do anything"].includes(frame.composerText)) {
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const lines = screen.replace(/\r\n?/gu, "\n").split("\n");
|
|
218
|
+
while (lines.length > 0 &&
|
|
219
|
+
stripTerminalEscapeSequences(lines.at(-1) ?? "").trim().length === 0) {
|
|
220
|
+
lines.pop();
|
|
221
|
+
}
|
|
222
|
+
const composerLine = [...lines.slice(-12)].reverse().find((line) => CODEX_COMPOSER_MARKER.test(stripTerminalEscapeSequences(line).trimEnd()));
|
|
223
|
+
if (composerLine === undefined) {
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
let dim = false;
|
|
227
|
+
const visible = [];
|
|
228
|
+
for (let index = 0; index < composerLine.length;) {
|
|
229
|
+
if (composerLine[index] === "\x1b") {
|
|
230
|
+
const escape = /^(?:\x1B\[([0-9;]*)m|\x1B\][^\x07\x1B]*(?:\x07|\x1B\\))/u
|
|
231
|
+
.exec(composerLine.slice(index));
|
|
232
|
+
if (escape) {
|
|
233
|
+
if (escape[1] !== undefined) {
|
|
234
|
+
const codes = escape[1] === ""
|
|
235
|
+
? [0]
|
|
236
|
+
: escape[1].split(";").map((value) => Number(value));
|
|
237
|
+
for (let codeIndex = 0; codeIndex < codes.length; codeIndex += 1) {
|
|
238
|
+
const code = codes[codeIndex];
|
|
239
|
+
if ([38, 48, 58].includes(code) &&
|
|
240
|
+
codes[codeIndex + 1] === 2) {
|
|
241
|
+
codeIndex += 4;
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if ([38, 48, 58].includes(code) &&
|
|
245
|
+
codes[codeIndex + 1] === 5) {
|
|
246
|
+
codeIndex += 2;
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
if (code === 0 || code === 22) {
|
|
250
|
+
dim = false;
|
|
251
|
+
}
|
|
252
|
+
else if (code === 2) {
|
|
253
|
+
dim = true;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
index += escape[0].length;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const codePoint = composerLine.codePointAt(index);
|
|
262
|
+
if (codePoint === undefined) {
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
const character = String.fromCodePoint(codePoint);
|
|
266
|
+
visible.push({ character, dim });
|
|
267
|
+
index += character.length;
|
|
268
|
+
}
|
|
269
|
+
const promptIndex = visible.findIndex(({ character }) => character === "›" || character === "»");
|
|
270
|
+
if (promptIndex < 0) {
|
|
271
|
+
return undefined;
|
|
272
|
+
}
|
|
273
|
+
const content = visible.slice(promptIndex + 1)
|
|
274
|
+
.filter(({ character }) => !/^\s$/u.test(character));
|
|
275
|
+
if (content.length > 0 && !content.every((entry) => entry.dim)) {
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
digest: createHash("sha256").update(composerLine).digest("hex")
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Infer a viewport only from fixed-width visible-buffer rows. Trimmed captures
|
|
284
|
+
* deliberately return undefined: a short content row is not proof of a short
|
|
285
|
+
* terminal. This keeps the fallback provider-neutral and fail-closed only on
|
|
286
|
+
* positive geometry evidence.
|
|
287
|
+
*/
|
|
288
|
+
export function inferCodexVisibleViewportColumns(screen) {
|
|
289
|
+
const rows = screen.replace(/\r\n?/gu, "\n").split("\n")
|
|
290
|
+
.map(stripTerminalEscapeSequences);
|
|
291
|
+
const widthOneRows = rows.filter((row) => /^[\x20-\x7e›»·─━╭╮╰╯│]*$/u.test(row));
|
|
292
|
+
const maxWidth = widthOneRows.reduce((maximum, row) => Math.max(maximum, Array.from(row).length), 0);
|
|
293
|
+
if (maxWidth < 20) {
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
const paddedAtMax = widthOneRows.filter((row) => row.endsWith(" ") && Array.from(row).length === maxWidth);
|
|
297
|
+
const composerAtMax = paddedAtMax.some((row) => CODEX_COMPOSER_MARKER.test(row.trimEnd()));
|
|
298
|
+
return paddedAtMax.length >= 3 && composerAtMax
|
|
299
|
+
? maxWidth
|
|
300
|
+
: undefined;
|
|
301
|
+
}
|
|
302
|
+
export function hasTruncatedCodexStatusSessionLine(screen) {
|
|
303
|
+
return screen.replace(/\r\n?/gu, "\n").split("\n").some((line) => {
|
|
304
|
+
const match = /^\s*│\s*Session:\s*([^│\s]+).*│?\s*$/iu.exec(line);
|
|
305
|
+
if (!match) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
return !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu
|
|
309
|
+
.test(match[1]);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
export function codexNativeInspectionComposerMismatchDiagnostic(screen, plan) {
|
|
313
|
+
const expectedRows = codexNativeStatusPopupRows(plan);
|
|
314
|
+
if (!expectedRows) {
|
|
315
|
+
return "composer_not_exact";
|
|
316
|
+
}
|
|
317
|
+
const lines = screen.replace(/\r\n?/gu, "\n").split("\n");
|
|
318
|
+
let composerIndex = -1;
|
|
319
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
320
|
+
if (CODEX_COMPOSER_MARKER.test(lines[index])) {
|
|
321
|
+
composerIndex = index;
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (composerIndex < 0 ||
|
|
326
|
+
lines[composerIndex].replace(/^[›»]\s?/u, "").trimEnd() !== plan.command) {
|
|
327
|
+
return "composer_not_exact";
|
|
328
|
+
}
|
|
329
|
+
const footerIndex = lines.findIndex((line, index) => index > composerIndex && CODEX_COMPOSER_FOOTER.test(line.trim()));
|
|
330
|
+
const popupRows = lines.slice(composerIndex + 1, footerIndex < 0 ? lines.length : footerIndex).filter((line) => line.trim().length > 0);
|
|
331
|
+
if (popupRows.length === 0) {
|
|
332
|
+
return "composer_not_exact";
|
|
333
|
+
}
|
|
334
|
+
const logicalRows = [];
|
|
335
|
+
let observedTruncation = false;
|
|
336
|
+
for (const row of popupRows) {
|
|
337
|
+
const trimmed = row.trim().replace(/\s+/gu, " ");
|
|
338
|
+
if (trimmed.startsWith("/")) {
|
|
339
|
+
logicalRows.push(trimmed);
|
|
340
|
+
}
|
|
341
|
+
else if (logicalRows.length > 0) {
|
|
342
|
+
logicalRows[logicalRows.length - 1] += ` ${trimmed}`;
|
|
343
|
+
observedTruncation = true;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
return "composer_not_exact";
|
|
347
|
+
}
|
|
348
|
+
observedTruncation ||= trimmed.endsWith("…");
|
|
349
|
+
}
|
|
350
|
+
const normalizedExpected = expectedRows.map((row) => row.trim().replace(/\s+/gu, " "));
|
|
351
|
+
const everyKnownPrefix = logicalRows.length <= normalizedExpected.length &&
|
|
352
|
+
logicalRows.every((row, index) => {
|
|
353
|
+
const withoutEllipsis = row.endsWith("…")
|
|
354
|
+
? row.slice(0, -1).trimEnd()
|
|
355
|
+
: row;
|
|
356
|
+
return normalizedExpected[index]?.startsWith(withoutEllipsis) === true;
|
|
357
|
+
});
|
|
358
|
+
return observedTruncation && everyKnownPrefix
|
|
359
|
+
? "composer_viewport_truncated"
|
|
360
|
+
: "composer_not_exact";
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=terminal-native-inspection-proof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-native-inspection-proof.js","sourceRoot":"","sources":["../../src/terminal-native-inspection-proof.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type TerminalControlRef } from "./terminal-control-ref.js";
|
|
2
|
+
export interface TerminalPermissionControlSafetyFacts {
|
|
3
|
+
readonly exactTerminalRow: boolean;
|
|
4
|
+
readonly terminalId: string;
|
|
5
|
+
readonly processState: string;
|
|
6
|
+
readonly agent: string;
|
|
7
|
+
readonly pid: number;
|
|
8
|
+
readonly terminalControl: TerminalControlRef;
|
|
9
|
+
readonly processUuid?: string;
|
|
10
|
+
readonly processBirth?: string;
|
|
11
|
+
readonly agentVersion?: string;
|
|
12
|
+
readonly approvalScanned: boolean;
|
|
13
|
+
readonly approvalBlocked: boolean;
|
|
14
|
+
readonly terminalHasInteraction: boolean;
|
|
15
|
+
readonly terminalHasBlockingTurn: boolean;
|
|
16
|
+
readonly hasOrphanedDispatch: boolean;
|
|
17
|
+
readonly inputOwnerBlocked: boolean;
|
|
18
|
+
readonly exactEmptyComposer: boolean;
|
|
19
|
+
readonly screenState: string;
|
|
20
|
+
readonly activityState: string;
|
|
21
|
+
}
|
|
22
|
+
export type TerminalPermissionControlAvailability = {
|
|
23
|
+
readonly available: false;
|
|
24
|
+
readonly reason: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly available: true;
|
|
27
|
+
readonly terminalId: string;
|
|
28
|
+
readonly expectedBindingToken: string;
|
|
29
|
+
};
|
|
30
|
+
/** Physical authority is separate from native task identity and model control. */
|
|
31
|
+
export declare function terminalPermissionControlAvailability(facts: TerminalPermissionControlSafetyFacts): TerminalPermissionControlAvailability;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { hasCanonicalTerminalEndpoint } from "./terminal-control-ref.js";
|
|
2
|
+
import { terminalPermissionControlBindingToken, terminalPermissionControlProfileFor } from "./terminal-permission-control.js";
|
|
3
|
+
/** Physical authority is separate from native task identity and model control. */
|
|
4
|
+
export function terminalPermissionControlAvailability(facts) {
|
|
5
|
+
const profile = facts.agentVersion
|
|
6
|
+
? terminalPermissionControlProfileFor(facts.agentVersion)
|
|
7
|
+
: undefined;
|
|
8
|
+
if (facts.agent !== "codex" || !profile) {
|
|
9
|
+
return { available: false, reason: "unsupported_permission_profile" };
|
|
10
|
+
}
|
|
11
|
+
if (!permissionSubjectReady(facts)) {
|
|
12
|
+
return { available: false, reason: "incomplete_physical_identity" };
|
|
13
|
+
}
|
|
14
|
+
if (!facts.terminalControl.capabilities.includes("send_keys") ||
|
|
15
|
+
!facts.terminalControl.capabilities.includes("screen_status")) {
|
|
16
|
+
return { available: false, reason: "terminal_transport_unavailable" };
|
|
17
|
+
}
|
|
18
|
+
if (!permissionSurfaceReady(facts)) {
|
|
19
|
+
return { available: false, reason: "terminal_not_ready" };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
available: true,
|
|
23
|
+
terminalId: facts.terminalId,
|
|
24
|
+
expectedBindingToken: terminalPermissionControlBindingToken({
|
|
25
|
+
terminalId: facts.terminalId,
|
|
26
|
+
terminalControl: facts.terminalControl,
|
|
27
|
+
pid: facts.pid,
|
|
28
|
+
workspace: facts.terminalControl.currentPath,
|
|
29
|
+
processUuid: facts.processUuid,
|
|
30
|
+
processBirth: facts.processBirth,
|
|
31
|
+
agentVersion: profile.agentVersion,
|
|
32
|
+
behaviorProfile: profile.behaviorProfile
|
|
33
|
+
})
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function permissionSubjectReady(facts) {
|
|
37
|
+
return facts.exactTerminalRow && facts.processState === "active" &&
|
|
38
|
+
Boolean(facts.processUuid) && Boolean(facts.processBirth) &&
|
|
39
|
+
Boolean(facts.terminalControl.currentPath) &&
|
|
40
|
+
hasCanonicalTerminalEndpoint(facts.terminalControl) &&
|
|
41
|
+
Number.isSafeInteger(facts.pid) && facts.pid > 0;
|
|
42
|
+
}
|
|
43
|
+
function permissionSurfaceReady(facts) {
|
|
44
|
+
return facts.approvalScanned && !facts.approvalBlocked &&
|
|
45
|
+
!facts.terminalHasInteraction && !facts.terminalHasBlockingTurn &&
|
|
46
|
+
!facts.hasOrphanedDispatch && !facts.inputOwnerBlocked &&
|
|
47
|
+
facts.exactEmptyComposer && facts.screenState === "idle" &&
|
|
48
|
+
facts.activityState === "idle";
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=terminal-permission-control-availability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-permission-control-availability.js","sourceRoot":"","sources":["../../src/terminal-permission-control-availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAA2B,MAC9D,2BAA2B,CAAC;AAC9B,OAAO,EACL,qCAAqC,EACrC,mCAAmC,EACpC,MAAM,kCAAkC,CAAC;AA+B1C,kFAAkF;AAClF,MAAM,UAAU,qCAAqC,CACnD,KAA2C;IAE3C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY;QAChC,CAAC,CAAC,mCAAmC,CAAC,KAAK,CAAC,YAAY,CAAC;QACzD,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;QACzD,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,oBAAoB,EAAE,qCAAqC,CAAC;YAC1D,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS,EAAE,KAAK,CAAC,eAAe,CAAC,WAAW;YAC5C,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAA2C;IAM3C,OAAO,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ;QAC9D,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC;QAC1C,4BAA4B,CAAC,KAAK,CAAC,eAAe,CAAC;QACnD,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA2C;IACzE,OAAO,KAAK,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,eAAe;QACpD,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,uBAAuB;QAC/D,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,iBAAiB;QACtD,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM;QACxD,KAAK,CAAC,aAAa,KAAK,MAAM,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TerminalAgentAdapter, TerminalRuntimeIdentity } from "./terminal-agent-adapter.js";
|
|
2
|
+
import { type TerminalPermissionControlPorts, type TerminalPermissionStatus } from "./terminal-permission-control.js";
|
|
3
|
+
export interface PermissionBridgeRuntime {
|
|
4
|
+
readonly agentVersion: string;
|
|
5
|
+
readonly runtime: TerminalRuntimeIdentity;
|
|
6
|
+
readonly adapter: TerminalAgentAdapter;
|
|
7
|
+
verifyIdentity(): Promise<void>;
|
|
8
|
+
captureStyled(): Promise<string>;
|
|
9
|
+
beforeInput(): void | Promise<void>;
|
|
10
|
+
inspectStatus(): Promise<TerminalPermissionStatus>;
|
|
11
|
+
sendText(text: string): Promise<void>;
|
|
12
|
+
sendKeys(keys: readonly string[]): Promise<void>;
|
|
13
|
+
sleep(milliseconds: number): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/** The caller holds the terminal lock; every input consumes a fresh exact frame. */
|
|
16
|
+
export declare function createTerminalPermissionControlPorts(ports: PermissionBridgeRuntime): TerminalPermissionControlPorts;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { observeCodexPermissionSurface } from "./codex-permission-surface.js";
|
|
3
|
+
import { exactCodexFullscreenBareCommandCapture, exactCodexFullscreenSlashComposerCapture } from "./codex-fullscreen-composer-proof.js";
|
|
4
|
+
import { exactCodexReadyStyledComposerCapture, stripTerminalEscapeSequences } from "./terminal-native-inspection-proof.js";
|
|
5
|
+
import { codexActiveWriterViewerVisible, codexBlockingModalVisible, inspectCodexAsyncQuestionInputMode } from "./terminal-composer-classifier.js";
|
|
6
|
+
import { inspectNativeQuestionnaire } from "./terminal-questionnaire-adapter.js";
|
|
7
|
+
import { TerminalPermissionInputUncertainError, terminalPermissionControlProfileFor } from "./terminal-permission-control.js";
|
|
8
|
+
/** The caller holds the terminal lock; every input consumes a fresh exact frame. */
|
|
9
|
+
export function createTerminalPermissionControlPorts(ports) {
|
|
10
|
+
if (ports.adapter.agent !== "codex" ||
|
|
11
|
+
!terminalPermissionControlProfileFor(ports.agentVersion) ||
|
|
12
|
+
ports.runtime.agentVersion !== ports.agentVersion) {
|
|
13
|
+
throw new Error("permission control requires an exact matching Codex behavior profile");
|
|
14
|
+
}
|
|
15
|
+
let inputPermit;
|
|
16
|
+
const captureFrame = async () => {
|
|
17
|
+
await ports.verifyIdentity();
|
|
18
|
+
const styled = await ports.captureStyled();
|
|
19
|
+
await ports.verifyIdentity();
|
|
20
|
+
const owned = observeCodexPermissionSurface(styled);
|
|
21
|
+
if (owned.state === "picker" || owned.state === "full_access_confirmation")
|
|
22
|
+
return owned;
|
|
23
|
+
const fingerprint = createHash("sha256").update(styled).digest("hex");
|
|
24
|
+
if (owned.state === "ambiguous")
|
|
25
|
+
return { state: "blocked", fingerprint };
|
|
26
|
+
const plain = stripTerminalEscapeSequences(styled);
|
|
27
|
+
const inspected = ports.adapter.inspectScreen({ screen: plain, runtime: ports.runtime });
|
|
28
|
+
const question = inspectNativeQuestionnaire({ agent: "codex", version: ports.agentVersion, screen: styled });
|
|
29
|
+
const asyncMode = inspectCodexAsyncQuestionInputMode(styled);
|
|
30
|
+
if (inspected.approval.blocked || inspected.activity.state === "working" ||
|
|
31
|
+
inspected.activity.state === "awaiting_approval" || codexBlockingModalVisible(styled) ||
|
|
32
|
+
question.status !== "none" || codexActiveWriterViewerVisible(styled) ||
|
|
33
|
+
asyncMode !== "absent")
|
|
34
|
+
return { state: "blocked", fingerprint };
|
|
35
|
+
// Native slash completions intentionally replace the idle shortcut footer,
|
|
36
|
+
// so the general activity classifier reports unknown. Their exact styled
|
|
37
|
+
// command grammar is the input proof; positive activity still blocks above.
|
|
38
|
+
const command = exactCodexFullscreenSlashComposerCapture(styled, "/permissions", ["› /permissions choose what Codex is allowed to do"], true, ports.agentVersion);
|
|
39
|
+
if (command)
|
|
40
|
+
return { state: "command", fingerprint: command.digest };
|
|
41
|
+
const bare = exactCodexFullscreenBareCommandCapture(styled, "/permissions", ports.agentVersion);
|
|
42
|
+
if (bare)
|
|
43
|
+
return { state: "bare_command", fingerprint: bare.digest };
|
|
44
|
+
const empty = exactCodexReadyStyledComposerCapture(styled, ports.agentVersion);
|
|
45
|
+
return empty && inspected.activity.state === "idle"
|
|
46
|
+
? { state: "idle", fingerprint: empty.digest } : { state: "blocked", fingerprint };
|
|
47
|
+
};
|
|
48
|
+
const capture = async () => {
|
|
49
|
+
inputPermit = undefined;
|
|
50
|
+
const observed = await captureFrame();
|
|
51
|
+
inputPermit = observed;
|
|
52
|
+
return observed;
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
capture, inspectStatus: ports.inspectStatus, sleep: ports.sleep,
|
|
56
|
+
input: async (action, expected) => {
|
|
57
|
+
const permitted = inputPermit === expected;
|
|
58
|
+
inputPermit = undefined;
|
|
59
|
+
if (!permitted)
|
|
60
|
+
throw new Error("permission input requires one fresh operation-local surface permit");
|
|
61
|
+
if (!inputAllowed(action, expected))
|
|
62
|
+
throw new Error("permission input is not authorized by the observed native surface");
|
|
63
|
+
await ports.beforeInput();
|
|
64
|
+
const fresh = await captureFrame();
|
|
65
|
+
if (fresh.state !== expected.state || fresh.fingerprint !== expected.fingerprint ||
|
|
66
|
+
!inputAllowed(action, fresh)) {
|
|
67
|
+
throw new Error("native permission surface changed immediately before terminal input");
|
|
68
|
+
}
|
|
69
|
+
await ports.verifyIdentity();
|
|
70
|
+
try {
|
|
71
|
+
if (action === "command")
|
|
72
|
+
await ports.sendText("/permissions");
|
|
73
|
+
else
|
|
74
|
+
await ports.sendKeys([action]);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new TerminalPermissionInputUncertainError("native permission input outcome is uncertain; do not retry automatically", { cause: error });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function inputAllowed(action, frame) {
|
|
83
|
+
switch (action) {
|
|
84
|
+
case "command": return frame.state === "idle";
|
|
85
|
+
case "Up":
|
|
86
|
+
case "Down": return frame.state === "picker" || frame.state === "full_access_confirmation";
|
|
87
|
+
case "Escape": return frame.state === "picker" || frame.state === "command";
|
|
88
|
+
case "C-u": return frame.state === "bare_command";
|
|
89
|
+
case "C-m": return frame.state === "command" || frame.state === "picker" ||
|
|
90
|
+
frame.state === "full_access_confirmation" && frame.selectedIndex === 0;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=terminal-permission-control-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-permission-control-bridge.js","sourceRoot":"","sources":["../../src/terminal-permission-control-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FileLockAcquisitionOptions } from "./file-lock-cli-adapter.js";
|
|
2
|
+
import type { TerminalNativeControlCliOptions as NativeLifecycleCliOptions, TerminalNativeControlCliBoundary } from "./terminal-native-control-cli-contract.js";
|
|
3
|
+
import type { ResolvedTerminalConversation } from "./terminal-agent-bridge.js";
|
|
4
|
+
import type { TerminalControlRef, TerminalRuntimeIdentity } from "./terminal-agent-adapter.js";
|
|
5
|
+
import type { TerminalRuntimeCliAdapter } from "./terminal-runtime-cli-adapter.js";
|
|
6
|
+
export interface TerminalPermissionControlCliPorts {
|
|
7
|
+
readonly runtime: {
|
|
8
|
+
forOptions(options: NativeLifecycleCliOptions): TerminalRuntimeCliAdapter;
|
|
9
|
+
physicalProcessIncarnation(pid: number): {
|
|
10
|
+
processUuid: string;
|
|
11
|
+
processBirth: string;
|
|
12
|
+
};
|
|
13
|
+
physicalRuntime(terminal: ResolvedTerminalConversation): TerminalRuntimeIdentity;
|
|
14
|
+
};
|
|
15
|
+
readonly lifecycle: TerminalNativeControlCliBoundary;
|
|
16
|
+
readonly state: {
|
|
17
|
+
storeDir(options: NativeLifecycleCliOptions): string;
|
|
18
|
+
inspectStore(storeDir: string): {
|
|
19
|
+
writable: boolean;
|
|
20
|
+
};
|
|
21
|
+
acquireTerminal(storeDir: string, terminalControl: TerminalControlRef, options?: FileLockAcquisitionOptions): () => void;
|
|
22
|
+
};
|
|
23
|
+
readonly output: {
|
|
24
|
+
print(value: unknown): void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Closed native permission operations; no task, Session, or Watch is created. */
|
|
28
|
+
export declare function createTerminalPermissionControlCliAdapter(ports: TerminalPermissionControlCliPorts): {
|
|
29
|
+
runPermissionOptions(options: NativeLifecycleCliOptions): Promise<void>;
|
|
30
|
+
runSetPermissions(options: NativeLifecycleCliOptions): Promise<void>;
|
|
31
|
+
};
|