@scotthuang/agent-knock-knock 0.2.40 → 0.2.42

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 CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.42 - 2026-07-13
4
+
5
+ ### Fixed
6
+
7
+ - Detect idle Codex terminal completion from the `Worked for ...` divider when rollout history is unavailable and the visible final answer contains no progress bullet markers.
8
+ - Exclude the completion divider, input placeholder, and model footer from terminal-screen fallback callbacks.
9
+
10
+ ## 0.2.41 - 2026-07-11
11
+
12
+ ### Added
13
+
14
+ - Add deterministic, default-disabled auto-approval policies for terminal-controlled Codex command prompts, with exact command and workspace rules configured through the trusted OpenClaw plugin config.
15
+
16
+ ### Security
17
+
18
+ - Revalidate approval fingerprints immediately before automatic approval, reject shell composition and workspace escapes, and audit the matched rule and policy fingerprint without involving an LLM.
19
+
3
20
  ## 0.2.40 - 2026-07-10
4
21
 
5
22
  ### Fixed
package/README.md CHANGED
@@ -175,6 +175,38 @@ Optional default-agent config:
175
175
  }
176
176
  ```
177
177
 
178
+ Optional deterministic auto-approval policy for terminal-controlled Codex sessions:
179
+
180
+ ```json5
181
+ {
182
+ plugins: {
183
+ entries: {
184
+ "agent-knock-knock": {
185
+ config: {
186
+ autoApprove: {
187
+ enabled: true,
188
+ rules: [
189
+ {
190
+ id: "project-read-status",
191
+ agents: ["codex"],
192
+ workspaces: ["/Users/scott/project"],
193
+ commands: [
194
+ ["pwd"],
195
+ ["git", "status"],
196
+ ["git", "diff", "--stat"]
197
+ ]
198
+ }
199
+ ]
200
+ }
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+ ```
207
+
208
+ Auto-approval is disabled by default. Rules use exact argument-vector matching and apply only to Codex `run command` prompts in the configured workspace. Shell composition, command substitution, glob expansion, environment assignments, unparseable commands, and paths outside the workspace always fall back to user approval. The OpenClaw plugin reads this trusted configuration inside the Gateway; it is not exposed as model-controlled tool input. AKK rechecks the visible prompt fingerprint immediately before sending the approval key and records the matched rule and policy fingerprint in the conversation event log.
209
+
178
210
  ## Native Codex Takeover
179
211
 
180
212
  Experimental: AKK can list and take over Codex CLI sessions that were started outside AKK. This is useful when you started Codex in a terminal, left the machine, and want OpenClaw to continue managing that work from chat.
@@ -0,0 +1,46 @@
1
+ export interface ApprovalCandidate {
2
+ agent: string;
3
+ kind: string;
4
+ command?: string;
5
+ cwd?: string;
6
+ fingerprint: string;
7
+ terminalTarget?: string;
8
+ }
9
+ export interface ApprovalPolicyDecision {
10
+ action: "approve" | "ask";
11
+ reason: string;
12
+ policyFingerprint: string;
13
+ ruleId?: string;
14
+ argv?: string[];
15
+ }
16
+ export interface SimpleCommandParseResult {
17
+ ok: boolean;
18
+ argv?: string[];
19
+ reason?: string;
20
+ }
21
+ export interface AutoApprovalAttempt {
22
+ approved: boolean;
23
+ action: "approved" | "ask";
24
+ reason: string;
25
+ rule_id?: string;
26
+ policy_fingerprint: string;
27
+ approval_fingerprint: string;
28
+ monitor_pid?: number | null;
29
+ }
30
+ export declare function approvalCandidateFromMessage(message: unknown): ApprovalCandidate | undefined;
31
+ export declare function evaluateApprovalPolicy({ policy, candidate }: {
32
+ policy: unknown;
33
+ candidate: ApprovalCandidate;
34
+ }): ApprovalPolicyDecision;
35
+ export declare function autoApprovalCliArgs({ statePath, candidate, decision }: {
36
+ statePath: string;
37
+ candidate: ApprovalCandidate;
38
+ decision: ApprovalPolicyDecision;
39
+ }): string[] | undefined;
40
+ export declare function attemptAutoApproval({ message, policy, statePath, execute }: {
41
+ message: unknown;
42
+ policy: unknown;
43
+ statePath?: string;
44
+ execute: (args: string[]) => Record<string, any>;
45
+ }): AutoApprovalAttempt | undefined;
46
+ export declare function parseSimpleShellCommand(command: string): SimpleCommandParseResult;
@@ -0,0 +1,321 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ export function approvalCandidateFromMessage(message) {
6
+ if (!isRecord(message)) {
7
+ return undefined;
8
+ }
9
+ const metadata = isRecord(message.metadata) ? message.metadata : undefined;
10
+ if (message.type !== "question" ||
11
+ metadata?.source !== "terminal_bridge" ||
12
+ metadata?.reason !== "approval_required") {
13
+ return undefined;
14
+ }
15
+ const candidate = isRecord(metadata?.approval_candidate) ? metadata.approval_candidate : undefined;
16
+ const agent = stringValue(candidate?.agent);
17
+ const kind = stringValue(candidate?.kind);
18
+ const fingerprint = stringValue(candidate?.fingerprint);
19
+ if (!agent || !kind || !fingerprint) {
20
+ return undefined;
21
+ }
22
+ return {
23
+ agent,
24
+ kind,
25
+ fingerprint,
26
+ command: stringValue(candidate?.command),
27
+ cwd: stringValue(candidate?.cwd),
28
+ terminalTarget: stringValue(candidate?.terminal_target)
29
+ };
30
+ }
31
+ export function evaluateApprovalPolicy({ policy, candidate }) {
32
+ const policyFingerprint = fingerprintValue(policy);
33
+ if (!isRecord(policy) || policy.enabled !== true) {
34
+ return ask("auto approval is disabled", policyFingerprint);
35
+ }
36
+ if (candidate.kind !== "run_command") {
37
+ return ask(`approval kind is not supported: ${candidate.kind}`, policyFingerprint);
38
+ }
39
+ if (!candidate.command) {
40
+ return ask("approval command is unavailable", policyFingerprint);
41
+ }
42
+ if (!candidate.cwd) {
43
+ return ask("approval cwd is unavailable", policyFingerprint);
44
+ }
45
+ const parsed = parseSimpleShellCommand(candidate.command);
46
+ if (!parsed.ok || !parsed.argv) {
47
+ return ask(parsed.reason ?? "approval command could not be parsed", policyFingerprint);
48
+ }
49
+ const rules = Array.isArray(policy.rules) ? policy.rules : [];
50
+ for (const rawRule of rules) {
51
+ const rule = normalizeRule(rawRule);
52
+ if (!rule || !rule.agents.includes(candidate.agent)) {
53
+ continue;
54
+ }
55
+ const workspace = rule.workspaces.find((value) => isPathWithin(candidate.cwd, value));
56
+ if (!workspace) {
57
+ continue;
58
+ }
59
+ if (!commandPathsStayWithinWorkspace(parsed.argv, candidate.cwd, workspace)) {
60
+ continue;
61
+ }
62
+ if (!rule.commands.some((command) => arraysEqual(command, parsed.argv))) {
63
+ continue;
64
+ }
65
+ return {
66
+ action: "approve",
67
+ reason: `matched auto-approval rule ${rule.id}`,
68
+ policyFingerprint,
69
+ ruleId: rule.id,
70
+ argv: parsed.argv
71
+ };
72
+ }
73
+ return ask("no explicit auto-approval rule matched", policyFingerprint, parsed.argv);
74
+ }
75
+ export function autoApprovalCliArgs({ statePath, candidate, decision }) {
76
+ if (decision.action !== "approve" || !decision.ruleId || !statePath) {
77
+ return undefined;
78
+ }
79
+ return [
80
+ "approve",
81
+ "--state",
82
+ statePath,
83
+ "--expected-approval-fingerprint",
84
+ candidate.fingerprint,
85
+ "--auto-approved",
86
+ "--policy-rule-id",
87
+ decision.ruleId,
88
+ "--policy-fingerprint",
89
+ decision.policyFingerprint
90
+ ];
91
+ }
92
+ export function attemptAutoApproval({ message, policy, statePath, execute }) {
93
+ const candidate = approvalCandidateFromMessage(message);
94
+ if (!candidate) {
95
+ return undefined;
96
+ }
97
+ const decision = evaluateApprovalPolicy({ policy, candidate });
98
+ const cliArgs = statePath ? autoApprovalCliArgs({ statePath, candidate, decision }) : undefined;
99
+ if (!cliArgs || !decision.ruleId) {
100
+ return {
101
+ approved: false,
102
+ action: "ask",
103
+ reason: decision.reason,
104
+ rule_id: decision.ruleId,
105
+ policy_fingerprint: decision.policyFingerprint,
106
+ approval_fingerprint: candidate.fingerprint
107
+ };
108
+ }
109
+ const result = execute(cliArgs);
110
+ return {
111
+ approved: result.approved === true,
112
+ action: result.approved === true ? "approved" : "ask",
113
+ reason: result.approved === true
114
+ ? decision.reason
115
+ : stringValue(result.reason) ?? "automatic approval was not executed",
116
+ rule_id: decision.ruleId,
117
+ policy_fingerprint: decision.policyFingerprint,
118
+ approval_fingerprint: candidate.fingerprint,
119
+ monitor_pid: typeof result.monitor_pid === "number" ? result.monitor_pid : null
120
+ };
121
+ }
122
+ export function parseSimpleShellCommand(command) {
123
+ const text = String(command ?? "").trim();
124
+ if (!text) {
125
+ return { ok: false, reason: "command is empty" };
126
+ }
127
+ const argv = [];
128
+ let token = "";
129
+ let tokenStarted = false;
130
+ let quote;
131
+ const pushToken = () => {
132
+ if (tokenStarted) {
133
+ argv.push(token);
134
+ token = "";
135
+ tokenStarted = false;
136
+ }
137
+ };
138
+ for (let index = 0; index < text.length; index += 1) {
139
+ const char = text[index];
140
+ if (char === "\n" || char === "\r") {
141
+ return { ok: false, reason: "multiline commands are not allowed" };
142
+ }
143
+ if (quote === "single") {
144
+ if (char === "'") {
145
+ quote = undefined;
146
+ }
147
+ else {
148
+ token += char;
149
+ }
150
+ continue;
151
+ }
152
+ if (quote === "double") {
153
+ if (char === "\"") {
154
+ quote = undefined;
155
+ continue;
156
+ }
157
+ if (char === "$" || char === "`" || char === "!") {
158
+ return { ok: false, reason: "command expansion is not allowed" };
159
+ }
160
+ if (char === "\\") {
161
+ const next = text[index + 1];
162
+ if (next === undefined || next === "\n" || next === "\r") {
163
+ return { ok: false, reason: "invalid command escape" };
164
+ }
165
+ token += next;
166
+ index += 1;
167
+ continue;
168
+ }
169
+ token += char;
170
+ continue;
171
+ }
172
+ if (/\s/u.test(char)) {
173
+ pushToken();
174
+ continue;
175
+ }
176
+ if (char === "'") {
177
+ quote = "single";
178
+ tokenStarted = true;
179
+ continue;
180
+ }
181
+ if (char === "\"") {
182
+ quote = "double";
183
+ tokenStarted = true;
184
+ continue;
185
+ }
186
+ if (char === "\\") {
187
+ const next = text[index + 1];
188
+ if (next === undefined || next === "\n" || next === "\r") {
189
+ return { ok: false, reason: "invalid command escape" };
190
+ }
191
+ token += next;
192
+ tokenStarted = true;
193
+ index += 1;
194
+ continue;
195
+ }
196
+ if ("|&;<>()`{}!".includes(char)) {
197
+ return { ok: false, reason: `shell composition is not allowed: ${char}` };
198
+ }
199
+ if (char === "$" || char === "#") {
200
+ return { ok: false, reason: "command expansion or comments are not allowed" };
201
+ }
202
+ if (char === "*" || char === "?" || char === "[" || char === "]") {
203
+ return { ok: false, reason: "shell glob expansion is not allowed" };
204
+ }
205
+ token += char;
206
+ tokenStarted = true;
207
+ }
208
+ if (quote) {
209
+ return { ok: false, reason: "command contains an unterminated quote" };
210
+ }
211
+ pushToken();
212
+ if (argv.length === 0) {
213
+ return { ok: false, reason: "command is empty" };
214
+ }
215
+ if (!/^[A-Za-z0-9._+-]+$/u.test(argv[0]) || argv[0].includes("/")) {
216
+ return { ok: false, reason: "command executable must be a simple PATH name" };
217
+ }
218
+ if (/^[A-Za-z_][A-Za-z0-9_]*=/u.test(argv[0])) {
219
+ return { ok: false, reason: "environment assignments are not allowed" };
220
+ }
221
+ return { ok: true, argv };
222
+ }
223
+ function normalizeRule(value) {
224
+ if (!isRecord(value)) {
225
+ return undefined;
226
+ }
227
+ const id = stringValue(value.id);
228
+ const agents = stringArray(value.agents);
229
+ const workspaces = stringArray(value.workspaces).map((workspace) => path.resolve(expandHome(workspace)));
230
+ const commands = Array.isArray(value.commands)
231
+ ? value.commands.filter((command) => (Array.isArray(command) && command.length > 0 && command.every((part) => typeof part === "string")))
232
+ : [];
233
+ if (!id || agents.length === 0 || workspaces.length === 0 || commands.length === 0) {
234
+ return undefined;
235
+ }
236
+ return { id, agents, workspaces, commands };
237
+ }
238
+ function commandPathsStayWithinWorkspace(argv, cwd, workspace) {
239
+ for (const argument of argv.slice(1)) {
240
+ const value = argument.startsWith("-") && argument.includes("=")
241
+ ? argument.slice(argument.indexOf("=") + 1)
242
+ : argument;
243
+ if (!looksLikePath(value)) {
244
+ continue;
245
+ }
246
+ if (value.startsWith("~")) {
247
+ return false;
248
+ }
249
+ const resolved = path.resolve(cwd, value);
250
+ if (!isPathWithin(resolved, workspace)) {
251
+ return false;
252
+ }
253
+ }
254
+ return true;
255
+ }
256
+ function looksLikePath(value) {
257
+ return value === "." || value === ".." || value.startsWith("./") || value.startsWith("../") ||
258
+ value.startsWith("/") || value.startsWith("~") || value.includes("/");
259
+ }
260
+ function isPathWithin(candidate, workspace) {
261
+ const relative = path.relative(canonicalPath(workspace), canonicalPath(candidate));
262
+ return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
263
+ }
264
+ function canonicalPath(value) {
265
+ const resolved = path.resolve(value);
266
+ const suffix = [];
267
+ let existing = resolved;
268
+ while (!fs.existsSync(existing)) {
269
+ const parent = path.dirname(existing);
270
+ if (parent === existing) {
271
+ return resolved;
272
+ }
273
+ suffix.unshift(path.basename(existing));
274
+ existing = parent;
275
+ }
276
+ try {
277
+ return path.join(fs.realpathSync(existing), ...suffix);
278
+ }
279
+ catch {
280
+ return resolved;
281
+ }
282
+ }
283
+ function arraysEqual(left, right) {
284
+ return left.length === right.length && left.every((value, index) => value === right[index]);
285
+ }
286
+ function ask(reason, policyFingerprint, argv) {
287
+ return {
288
+ action: "ask",
289
+ reason,
290
+ policyFingerprint,
291
+ argv
292
+ };
293
+ }
294
+ function fingerprintValue(value) {
295
+ return createHash("sha256").update(JSON.stringify(sortValue(value))).digest("hex").slice(0, 16);
296
+ }
297
+ function sortValue(value) {
298
+ if (Array.isArray(value)) {
299
+ return value.map(sortValue);
300
+ }
301
+ if (isRecord(value)) {
302
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, sortValue(value[key])]));
303
+ }
304
+ return value;
305
+ }
306
+ function expandHome(value) {
307
+ if (value === "~") {
308
+ return os.homedir();
309
+ }
310
+ return value.startsWith("~/") ? path.join(os.homedir(), value.slice(2)) : value;
311
+ }
312
+ function stringArray(value) {
313
+ return Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.trim().length > 0) : [];
314
+ }
315
+ function stringValue(value) {
316
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
317
+ }
318
+ function isRecord(value) {
319
+ return value !== null && typeof value === "object" && !Array.isArray(value);
320
+ }
321
+ //# sourceMappingURL=approval-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../../src/approval-policy.ts"],"names":[],"mappings":"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"}