@getmarrow/mcp 3.9.97 → 3.9.99
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/README.md +57 -338
- package/dist/cli.js +249 -47
- package/dist/cli.js.map +1 -1
- package/dist/hook-context.d.ts.map +1 -1
- package/dist/hook-context.js +135 -9
- package/dist/hook-context.js.map +1 -1
- package/dist/hook-contract.d.ts +26 -5
- package/dist/hook-contract.d.ts.map +1 -1
- package/dist/hook-contract.js +144 -10
- package/dist/hook-contract.js.map +1 -1
- package/dist/hook-pre-action.d.ts +40 -1
- package/dist/hook-pre-action.d.ts.map +1 -1
- package/dist/hook-pre-action.js +429 -35
- package/dist/hook-pre-action.js.map +1 -1
- package/dist/hook-session.d.ts.map +1 -1
- package/dist/hook-session.js +32 -0
- package/dist/hook-session.js.map +1 -1
- package/dist/hook.d.ts +12 -0
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +149 -5
- package/dist/hook.js.map +1 -1
- package/dist/host-approval-state.d.ts +137 -0
- package/dist/host-approval-state.d.ts.map +1 -0
- package/dist/host-approval-state.js +510 -0
- package/dist/host-approval-state.js.map +1 -0
- package/dist/host-approval.d.ts +436 -0
- package/dist/host-approval.d.ts.map +1 -0
- package/dist/host-approval.js +1417 -0
- package/dist/host-approval.js.map +1 -0
- package/dist/host-session.d.ts +82 -0
- package/dist/host-session.d.ts.map +1 -0
- package/dist/host-session.js +570 -0
- package/dist/host-session.js.map +1 -0
- package/dist/index.d.ts +150 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +748 -33
- package/dist/index.js.map +1 -1
- package/dist/lifecycle-spool.d.ts.map +1 -1
- package/dist/lifecycle-spool.js +6 -5
- package/dist/lifecycle-spool.js.map +1 -1
- package/dist/normalized-action.d.ts +120 -0
- package/dist/normalized-action.d.ts.map +1 -0
- package/dist/normalized-action.js +1109 -0
- package/dist/normalized-action.js.map +1 -0
- package/dist/runtime-contract.d.ts +108 -4
- package/dist/runtime-contract.d.ts.map +1 -1
- package/dist/runtime-contract.js +178 -35
- package/dist/runtime-contract.js.map +1 -1
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +21 -25
- package/server.json +15 -4
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.localInteractiveSession = localInteractiveSession;
|
|
4
|
+
exports.parseCodexSettings = parseCodexSettings;
|
|
5
|
+
exports.codexApprovalPromptOff = codexApprovalPromptOff;
|
|
6
|
+
exports.hostApprovalPromptOff = hostApprovalPromptOff;
|
|
7
|
+
exports.geminiApprovalPromptOff = geminiApprovalPromptOff;
|
|
8
|
+
exports.typedReplyPromptOff = typedReplyPromptOff;
|
|
9
|
+
exports.hookLauncherHeadStartMs = hookLauncherHeadStartMs;
|
|
10
|
+
const node_child_process_1 = require("node:child_process");
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_os_1 = require("node:os");
|
|
13
|
+
const node_path_1 = require("node:path");
|
|
14
|
+
const MAX_DEPTH = 8;
|
|
15
|
+
const CODEX_NON_INTERACTIVE = new Set([
|
|
16
|
+
'exec', 'e', 'app-server', 'mcp', 'mcp-server', 'proto', 'cloud', 'apply', 'a', 'review',
|
|
17
|
+
'login', 'logout', 'completion', 'debug', 'sandbox', 'features', '--json',
|
|
18
|
+
]);
|
|
19
|
+
function linuxProcess(pid) {
|
|
20
|
+
try {
|
|
21
|
+
const stat = (0, node_fs_1.readFileSync)(`/proc/${pid}/stat`, 'utf8');
|
|
22
|
+
const close = stat.lastIndexOf(')');
|
|
23
|
+
const fields = stat.slice(close + 2).split(' ');
|
|
24
|
+
const ppid = Number(fields[1]);
|
|
25
|
+
const startTicks = Number(fields[19]);
|
|
26
|
+
const args = (0, node_fs_1.readFileSync)(`/proc/${pid}/cmdline`).toString('utf8').split('\0').filter(Boolean).slice(0, 64);
|
|
27
|
+
let terminal = false;
|
|
28
|
+
try {
|
|
29
|
+
const stdin = (0, node_fs_1.readlinkSync)(`/proc/${pid}/fd/0`);
|
|
30
|
+
terminal = /^\/dev\/(?:pts\/\d+|tty\w*)$/.test(stdin);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
terminal = false;
|
|
34
|
+
}
|
|
35
|
+
return Number.isSafeInteger(ppid) ? { pid, ppid, args, terminal, ...(Number.isSafeInteger(startTicks) ? { startTicks } : {}) } : null;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function psProcess(pid) {
|
|
42
|
+
try {
|
|
43
|
+
const line = (0, node_child_process_1.execFileSync)('ps', ['-o', 'ppid=,tty=,command=', '-p', String(pid)], {
|
|
44
|
+
encoding: 'utf8', timeout: 1_000, stdio: ['ignore', 'pipe', 'ignore'],
|
|
45
|
+
}).trim();
|
|
46
|
+
const match = line.match(/^(\d+)\s+(\S+)\s+(.*)$/s);
|
|
47
|
+
if (!match)
|
|
48
|
+
return null;
|
|
49
|
+
return { pid, ppid: Number(match[1]), args: match[3].split(/\s+/).slice(0, 64), terminal: !/^(?:\?\??|-)$/.test(match[2]) };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const TEST_PROCESS_TABLE = Symbol.for('marrow.test.processTable');
|
|
56
|
+
function defaultReader() {
|
|
57
|
+
// Test seam: a preloaded test module may supply a synthetic process table.
|
|
58
|
+
const table = globalThis[TEST_PROCESS_TABLE];
|
|
59
|
+
if (table && typeof table === 'object') {
|
|
60
|
+
return (pid) => (table[String(pid)] ?? null);
|
|
61
|
+
}
|
|
62
|
+
if (process.platform === 'linux')
|
|
63
|
+
return linuxProcess;
|
|
64
|
+
if (process.platform === 'darwin' || process.platform === 'freebsd')
|
|
65
|
+
return psProcess;
|
|
66
|
+
return () => null;
|
|
67
|
+
}
|
|
68
|
+
function programNames(args) {
|
|
69
|
+
return args.slice(0, 2).map((arg) => (0, node_path_1.basename)(arg).toLowerCase());
|
|
70
|
+
}
|
|
71
|
+
function isCodex(args) {
|
|
72
|
+
return programNames(args).some((name) => /^codex(?:-[a-z0-9_.-]+)?(?:\.exe|\.js|\.mjs)?$/.test(name));
|
|
73
|
+
}
|
|
74
|
+
function isGemini(args) {
|
|
75
|
+
return programNames(args).some((name) => /^gemini(?:\.exe|\.js|\.mjs)?$/.test(name));
|
|
76
|
+
}
|
|
77
|
+
/** The editor app (VS Code and its forks) or its extension host, where Cline and Windsurf's Cascade run for a person. */
|
|
78
|
+
function isEditorApp(args) {
|
|
79
|
+
const names = programNames(args);
|
|
80
|
+
if (names.some((name) => /^(?:code|code-insiders|codium|vscodium|windsurf|windsurf-next|code helper(?: \(plugin\))?)(?:\.exe)?$/.test(name)))
|
|
81
|
+
return true;
|
|
82
|
+
return args.slice(0, 8).some((arg) => /^--type=extensionHost$/.test(arg) || /[/\\](?:Visual Studio Code|VSCodium|Windsurf)(?:\.app)?[/\\]/i.test(arg));
|
|
83
|
+
}
|
|
84
|
+
function isGrokCli(args) {
|
|
85
|
+
return programNames(args).some((name) => /^grok(?:\.exe|\.js|\.mjs)?$/.test(name));
|
|
86
|
+
}
|
|
87
|
+
function isClineCli(args) {
|
|
88
|
+
return programNames(args).some((name) => /^cline(?:\.exe|\.js|\.mjs)?$/.test(name));
|
|
89
|
+
}
|
|
90
|
+
function findHostProcess(match, reader, startPid) {
|
|
91
|
+
let pid = startPid;
|
|
92
|
+
for (let depth = 0; depth < MAX_DEPTH && pid > 1; depth += 1) {
|
|
93
|
+
const info = reader(pid);
|
|
94
|
+
if (!info)
|
|
95
|
+
return null;
|
|
96
|
+
if (match(info.args))
|
|
97
|
+
return info;
|
|
98
|
+
pid = info.ppid;
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/** true only with positive evidence; false or null means no typed approval is offered. */
|
|
103
|
+
function localInteractiveSession(host, reader = defaultReader(), startPid = process.ppid) {
|
|
104
|
+
if (host === 'codex') {
|
|
105
|
+
const codex = findHostProcess(isCodex, reader, startPid);
|
|
106
|
+
if (!codex)
|
|
107
|
+
return null;
|
|
108
|
+
const tokens = codex.args.slice(1).map((arg) => arg.toLowerCase());
|
|
109
|
+
return codex.terminal && !tokens.some((token) => CODEX_NON_INTERACTIVE.has(token));
|
|
110
|
+
}
|
|
111
|
+
if (host === 'grok') {
|
|
112
|
+
const grok = findHostProcess(isGrokCli, reader, startPid);
|
|
113
|
+
if (!grok)
|
|
114
|
+
return null;
|
|
115
|
+
const tokens = grok.args.slice(1).map((arg) => arg.toLowerCase());
|
|
116
|
+
return grok.terminal && !tokens.some((token) => ['-p', '--prompt', '--print', '--headless', '--json'].includes(token) || token.startsWith('--prompt='));
|
|
117
|
+
}
|
|
118
|
+
if (host === 'cline' || host === 'windsurf') {
|
|
119
|
+
// In the editor a person is at the session; the Cline CLI counts only with a terminal and no scripted mode.
|
|
120
|
+
const editor = findHostProcess(isEditorApp, reader, startPid);
|
|
121
|
+
if (editor)
|
|
122
|
+
return true;
|
|
123
|
+
if (host === 'cline') {
|
|
124
|
+
const cli = findHostProcess(isClineCli, reader, startPid);
|
|
125
|
+
if (!cli)
|
|
126
|
+
return null;
|
|
127
|
+
const tokens = cli.args.slice(1).map((arg) => arg.toLowerCase());
|
|
128
|
+
return cli.terminal && !tokens.some((token) => ['-p', '--prompt', '--yolo', '--json', '--headless', '--oneshot', 'task'].includes(token));
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
if (host === 'gemini') {
|
|
133
|
+
const gemini = findHostProcess(isGemini, reader, startPid);
|
|
134
|
+
if (!gemini)
|
|
135
|
+
return null;
|
|
136
|
+
const tokens = gemini.args.slice(1);
|
|
137
|
+
const scripted = tokens.some((token) => token === '-p' || token === '--prompt' || token.startsWith('--prompt=')
|
|
138
|
+
|| token === '--experimental-acp' || token === '--acp');
|
|
139
|
+
return gemini.terminal && !scripted;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// The host's own approval prompt
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
const CODEX_KEYS = ['approval_policy', 'approvals_reviewer', 'sandbox_mode'];
|
|
147
|
+
/** Codex flags that turn its approval prompt off for the session. */
|
|
148
|
+
const CODEX_NO_PROMPT_FLAGS = new Set([
|
|
149
|
+
'--dangerously-bypass-approvals-and-sandbox', '--yolo', '--full-auto', '--approve-for-me', '--not-so-yolo',
|
|
150
|
+
]);
|
|
151
|
+
const MAX_CONFIG_BYTES = 256 * 1024;
|
|
152
|
+
const RELEVANT_KEY_NAME = /(?:^|[^A-Za-z0-9_])(?:approval_policy|approvals_reviewer|sandbox_mode|profiles?)(?:$|[^A-Za-z0-9_])/;
|
|
153
|
+
/** Reads a config file into memory (never logged); null when missing, unreadable or too large. */
|
|
154
|
+
function readConfigFile(path) {
|
|
155
|
+
try {
|
|
156
|
+
if ((0, node_fs_1.statSync)(path).size > MAX_CONFIG_BYTES)
|
|
157
|
+
return null;
|
|
158
|
+
return (0, node_fs_1.readFileSync)(path, 'utf8');
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
class TomlError extends Error {
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* A small TOML reader for the keys above only: tables and array tables,
|
|
168
|
+
* dotted and quoted keys, basic, literal and multi-line strings, inline
|
|
169
|
+
* tables and arrays. Values of every other key are skipped and never kept.
|
|
170
|
+
*/
|
|
171
|
+
function parseCodexSettings(input) {
|
|
172
|
+
const text = input.replace(/^\uFEFF/, '').replace(/\r\n?/g, '\n');
|
|
173
|
+
const result = { top: {}, profiles: {}, unreadable: false };
|
|
174
|
+
const n = text.length;
|
|
175
|
+
let i = 0;
|
|
176
|
+
let table = [];
|
|
177
|
+
const fail = () => { throw new TomlError(); };
|
|
178
|
+
const skipSpaces = () => { while (i < n && (text[i] === ' ' || text[i] === '\t'))
|
|
179
|
+
i += 1; };
|
|
180
|
+
const skipComment = () => { if (text[i] === '#')
|
|
181
|
+
while (i < n && text[i] !== '\n')
|
|
182
|
+
i += 1; };
|
|
183
|
+
const skipBlank = () => {
|
|
184
|
+
for (;;) {
|
|
185
|
+
skipSpaces();
|
|
186
|
+
skipComment();
|
|
187
|
+
if (text[i] !== '\n')
|
|
188
|
+
return;
|
|
189
|
+
i += 1;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const record = (path, value) => {
|
|
193
|
+
if (path.length === 1 && (CODEX_KEYS.includes(path[0]) || path[0] === 'profile')) {
|
|
194
|
+
result.top[path[0]] = value;
|
|
195
|
+
}
|
|
196
|
+
else if (path.length === 3 && path[0] === 'profiles' && CODEX_KEYS.includes(path[2])) {
|
|
197
|
+
(result.profiles[path[1]] ??= {})[path[2]] = value;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const multiline = (quote) => {
|
|
201
|
+
i += 3;
|
|
202
|
+
if (text[i] === '\n')
|
|
203
|
+
i += 1;
|
|
204
|
+
const close = text.indexOf(quote.repeat(3), i);
|
|
205
|
+
if (close < 0)
|
|
206
|
+
fail();
|
|
207
|
+
let end = close;
|
|
208
|
+
while (text[end + 3] === quote && end - close < 2)
|
|
209
|
+
end += 1;
|
|
210
|
+
const value = text.slice(i, end);
|
|
211
|
+
i = end + 3;
|
|
212
|
+
return value;
|
|
213
|
+
};
|
|
214
|
+
const basicString = () => {
|
|
215
|
+
if (text.startsWith('"""', i))
|
|
216
|
+
return multiline('"').replace(/\\\n[ \t\n]*/g, '').replace(/\\(["\\])/g, '$1');
|
|
217
|
+
i += 1;
|
|
218
|
+
let out = '';
|
|
219
|
+
while (i < n && text[i] !== '"') {
|
|
220
|
+
if (text[i] === '\n')
|
|
221
|
+
fail();
|
|
222
|
+
if (text[i] === '\\') {
|
|
223
|
+
const next = text[i + 1];
|
|
224
|
+
const simple = { n: '\n', t: '\t', r: '\r', b: '\b', f: '\f', '"': '"', '\\': '\\' };
|
|
225
|
+
if (next in simple) {
|
|
226
|
+
out += simple[next];
|
|
227
|
+
i += 2;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const width = next === 'u' ? 4 : next === 'U' ? 8 : 0;
|
|
231
|
+
const hex = text.slice(i + 2, i + 2 + width);
|
|
232
|
+
if (!width || hex.length !== width || !/^[0-9A-Fa-f]+$/.test(hex))
|
|
233
|
+
fail();
|
|
234
|
+
out += String.fromCodePoint(parseInt(hex, 16));
|
|
235
|
+
i += 2 + width;
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
out += text[i];
|
|
239
|
+
i += 1;
|
|
240
|
+
}
|
|
241
|
+
if (text[i] !== '"')
|
|
242
|
+
fail();
|
|
243
|
+
i += 1;
|
|
244
|
+
return out;
|
|
245
|
+
};
|
|
246
|
+
const literalString = () => {
|
|
247
|
+
if (text.startsWith("'''", i))
|
|
248
|
+
return multiline("'");
|
|
249
|
+
const close = text.indexOf("'", i + 1);
|
|
250
|
+
const newline = text.indexOf('\n', i + 1);
|
|
251
|
+
if (close < 0 || (newline >= 0 && newline < close))
|
|
252
|
+
fail();
|
|
253
|
+
const value = text.slice(i + 1, close);
|
|
254
|
+
i = close + 1;
|
|
255
|
+
return value;
|
|
256
|
+
};
|
|
257
|
+
const keyPart = () => {
|
|
258
|
+
skipSpaces();
|
|
259
|
+
if (text[i] === '"')
|
|
260
|
+
return basicString();
|
|
261
|
+
if (text[i] === "'")
|
|
262
|
+
return literalString();
|
|
263
|
+
const bare = /^[A-Za-z0-9_-]+/.exec(text.slice(i, i + 256));
|
|
264
|
+
if (!bare)
|
|
265
|
+
return fail();
|
|
266
|
+
i += bare[0].length;
|
|
267
|
+
return bare[0];
|
|
268
|
+
};
|
|
269
|
+
const key = () => {
|
|
270
|
+
const parts = [keyPart()];
|
|
271
|
+
for (;;) {
|
|
272
|
+
skipSpaces();
|
|
273
|
+
if (text[i] !== '.')
|
|
274
|
+
return parts;
|
|
275
|
+
i += 1;
|
|
276
|
+
parts.push(keyPart());
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const value = (path, depth) => {
|
|
280
|
+
if (depth > 16)
|
|
281
|
+
fail();
|
|
282
|
+
skipSpaces();
|
|
283
|
+
const c = text[i];
|
|
284
|
+
if (c === '"') {
|
|
285
|
+
record(path, basicString());
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (c === "'") {
|
|
289
|
+
record(path, literalString());
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (c === '{' || c === '[') {
|
|
293
|
+
const close = c === '{' ? '}' : ']';
|
|
294
|
+
i += 1;
|
|
295
|
+
skipBlank();
|
|
296
|
+
if (text[i] === close) {
|
|
297
|
+
i += 1;
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
for (;;) {
|
|
301
|
+
if (c === '{') {
|
|
302
|
+
const inner = key();
|
|
303
|
+
skipSpaces();
|
|
304
|
+
if (text[i] !== '=')
|
|
305
|
+
fail();
|
|
306
|
+
i += 1;
|
|
307
|
+
value([...path, ...inner], depth + 1);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
value([...path, '[]'], depth + 1);
|
|
311
|
+
}
|
|
312
|
+
skipBlank();
|
|
313
|
+
if (text[i] === ',') {
|
|
314
|
+
i += 1;
|
|
315
|
+
skipBlank();
|
|
316
|
+
if (text[i] === close) {
|
|
317
|
+
i += 1;
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (text[i] === close) {
|
|
323
|
+
i += 1;
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
fail();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const bare = /^[A-Za-z0-9_+.:-]+/.exec(text.slice(i, i + 128));
|
|
330
|
+
if (!bare)
|
|
331
|
+
return fail();
|
|
332
|
+
i += bare[0].length;
|
|
333
|
+
record(path, bare[0]);
|
|
334
|
+
};
|
|
335
|
+
while (i < n) {
|
|
336
|
+
const lineStart = i;
|
|
337
|
+
try {
|
|
338
|
+
skipBlank();
|
|
339
|
+
if (i >= n)
|
|
340
|
+
break;
|
|
341
|
+
if (text[i] === '[') {
|
|
342
|
+
const arrayTable = text[i + 1] === '[';
|
|
343
|
+
i += arrayTable ? 2 : 1;
|
|
344
|
+
const header = key();
|
|
345
|
+
skipSpaces();
|
|
346
|
+
if (arrayTable ? !text.startsWith(']]', i) : text[i] !== ']')
|
|
347
|
+
fail();
|
|
348
|
+
i += arrayTable ? 2 : 1;
|
|
349
|
+
table = arrayTable ? [...header, '[]'] : header;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
const name = key();
|
|
353
|
+
skipSpaces();
|
|
354
|
+
if (text[i] !== '=')
|
|
355
|
+
fail();
|
|
356
|
+
i += 1;
|
|
357
|
+
value([...table, ...name], 0);
|
|
358
|
+
}
|
|
359
|
+
skipSpaces();
|
|
360
|
+
skipComment();
|
|
361
|
+
if (i < n && text[i] !== '\n')
|
|
362
|
+
fail();
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
if (!(error instanceof TomlError))
|
|
366
|
+
throw error;
|
|
367
|
+
// This line could not be read. If it names a key that decides the prompt, treat the prompt as off.
|
|
368
|
+
const lineEnd = text.indexOf('\n', Math.max(i, lineStart));
|
|
369
|
+
const stop = lineEnd < 0 ? n : lineEnd;
|
|
370
|
+
if (RELEVANT_KEY_NAME.test(text.slice(lineStart, stop)))
|
|
371
|
+
result.unreadable = true;
|
|
372
|
+
i = stop + 1;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return result;
|
|
376
|
+
}
|
|
377
|
+
function emptySettings() {
|
|
378
|
+
return { top: {}, profiles: {}, unreadable: false };
|
|
379
|
+
}
|
|
380
|
+
/** A `-c key=value` override: the value is TOML, or a plain string when it is not (as Codex reads it). */
|
|
381
|
+
function parseCodexOverride(text) {
|
|
382
|
+
const equals = text.indexOf('=');
|
|
383
|
+
if (equals < 0) {
|
|
384
|
+
const settings = emptySettings();
|
|
385
|
+
settings.unreadable = RELEVANT_KEY_NAME.test(text);
|
|
386
|
+
return settings;
|
|
387
|
+
}
|
|
388
|
+
const keyText = text.slice(0, equals).trim();
|
|
389
|
+
const valueText = text.slice(equals + 1).trim();
|
|
390
|
+
const parsed = parseCodexSettings(`${keyText} = ${valueText}\n`);
|
|
391
|
+
if (!parsed.unreadable)
|
|
392
|
+
return parsed;
|
|
393
|
+
return parseCodexSettings(`${keyText} = ${JSON.stringify(valueText)}\n`);
|
|
394
|
+
}
|
|
395
|
+
function mergeSettings(into, from) {
|
|
396
|
+
Object.assign(into.top, from.top);
|
|
397
|
+
for (const [name, values] of Object.entries(from.profiles))
|
|
398
|
+
Object.assign((into.profiles[name] ??= {}), values);
|
|
399
|
+
into.unreadable = into.unreadable || from.unreadable;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Whether Codex, as started, shows no approval prompt for a held action:
|
|
403
|
+
* approval bypass (`--dangerously-bypass-approvals-and-sandbox`, `--yolo`),
|
|
404
|
+
* never-ask (`-a never`), automatic review (`--approve-for-me`, or an
|
|
405
|
+
* `approvals_reviewer` other than `user`), `--full-auto`, or full access
|
|
406
|
+
* (`-s danger-full-access`), on the command line, in `-c` overrides
|
|
407
|
+
* (including `profiles.NAME.key`), or in its config: `$CODEX_HOME/config.toml`
|
|
408
|
+
* with its active profile, and a `-p NAME` profile file. A flag decides its
|
|
409
|
+
* own setting; otherwise any of those sources that turns the prompt off
|
|
410
|
+
* counts, since their order cannot be known for certain from outside Codex.
|
|
411
|
+
* A line naming one of these keys that cannot be read also counts as off.
|
|
412
|
+
*/
|
|
413
|
+
function codexApprovalPromptOff(args, readConfig = readConfigFile, env = process.env) {
|
|
414
|
+
const tokens = args.slice(1);
|
|
415
|
+
const cli = {};
|
|
416
|
+
const overrides = emptySettings();
|
|
417
|
+
const take = (i, long, short) => {
|
|
418
|
+
const token = tokens[i];
|
|
419
|
+
if (token === long || (short && token === short))
|
|
420
|
+
return i + 1 < tokens.length ? { value: tokens[i + 1], next: i + 1 } : null;
|
|
421
|
+
if (token.startsWith(`${long}=`))
|
|
422
|
+
return { value: token.slice(long.length + 1), next: i };
|
|
423
|
+
if (short && token.startsWith(short) && !token.startsWith('--') && token.length > short.length)
|
|
424
|
+
return { value: token.slice(short.length).replace(/^=/, ''), next: i };
|
|
425
|
+
return null;
|
|
426
|
+
};
|
|
427
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
428
|
+
const token = tokens[i];
|
|
429
|
+
if (CODEX_NO_PROMPT_FLAGS.has(token))
|
|
430
|
+
return true;
|
|
431
|
+
const approval = take(i, '--ask-for-approval', '-a');
|
|
432
|
+
if (approval) {
|
|
433
|
+
cli.approval = approval.value;
|
|
434
|
+
i = approval.next;
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
const sandbox = take(i, '--sandbox', '-s');
|
|
438
|
+
if (sandbox) {
|
|
439
|
+
cli.sandbox = sandbox.value;
|
|
440
|
+
i = sandbox.next;
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
const profile = take(i, '--profile', '-p');
|
|
444
|
+
if (profile) {
|
|
445
|
+
cli.profile = profile.value;
|
|
446
|
+
i = profile.next;
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
const config = take(i, '--config', '-c');
|
|
450
|
+
if (config) {
|
|
451
|
+
mergeSettings(overrides, parseCodexOverride(config.value));
|
|
452
|
+
i = config.next;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (overrides.unreadable)
|
|
456
|
+
return true;
|
|
457
|
+
const home = env.CODEX_HOME && env.CODEX_HOME.trim() ? env.CODEX_HOME : (0, node_path_1.join)((0, node_os_1.homedir)(), '.codex');
|
|
458
|
+
const baseText = readConfig((0, node_path_1.join)(home, 'config.toml'));
|
|
459
|
+
const base = baseText === null ? emptySettings() : parseCodexSettings(baseText);
|
|
460
|
+
if (base.unreadable)
|
|
461
|
+
return true;
|
|
462
|
+
const profileName = cli.profile ?? overrides.top.profile ?? base.top.profile;
|
|
463
|
+
const validName = typeof profileName === 'string' && /^[A-Za-z0-9_-][A-Za-z0-9_.-]{0,63}$/.test(profileName) ? profileName : null;
|
|
464
|
+
const fileText = validName ? readConfig((0, node_path_1.join)(home, `${validName}.config.toml`)) : null;
|
|
465
|
+
const file = fileText === null ? emptySettings() : parseCodexSettings(fileText);
|
|
466
|
+
if (file.unreadable)
|
|
467
|
+
return true;
|
|
468
|
+
const sources = [base.top, file.top, overrides.top];
|
|
469
|
+
if (validName)
|
|
470
|
+
sources.push(base.profiles[validName] ?? {}, file.profiles[validName] ?? {}, overrides.profiles[validName] ?? {});
|
|
471
|
+
const anyOff = (key, off) => sources.some((source) => source[key] !== undefined && off(source[key].trim().toLowerCase()));
|
|
472
|
+
const approvalOff = cli.approval !== undefined ? cli.approval.trim().toLowerCase() === 'never' : anyOff('approval_policy', (value) => value === 'never');
|
|
473
|
+
const sandboxOff = cli.sandbox !== undefined ? cli.sandbox.trim().toLowerCase() === 'danger-full-access' : anyOff('sandbox_mode', (value) => value === 'danger-full-access');
|
|
474
|
+
const reviewerOff = anyOff('approvals_reviewer', (value) => value !== 'user');
|
|
475
|
+
return approvalOff || sandboxOff || reviewerOff;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Whether the host's own approval prompt is off in this session, so leaving a
|
|
479
|
+
* held action to it would let it run with no one asked. Codex is read from
|
|
480
|
+
* its process and config (see codexApprovalPromptOff). Cline's auto-approve
|
|
481
|
+
* and Windsurf's Turbo mode live in editor state with no reliable signal, so
|
|
482
|
+
* they are not detected (false).
|
|
483
|
+
*/
|
|
484
|
+
function hostApprovalPromptOff(host, reader = defaultReader(), startPid = process.ppid, readConfig = readConfigFile) {
|
|
485
|
+
if (host !== 'codex')
|
|
486
|
+
return false;
|
|
487
|
+
const codex = findHostProcess(isCodex, reader, startPid);
|
|
488
|
+
if (!codex)
|
|
489
|
+
return false;
|
|
490
|
+
return codexApprovalPromptOff(codex.args, readConfig);
|
|
491
|
+
}
|
|
492
|
+
/** Gemini CLI started in YOLO mode runs every tool without asking. */
|
|
493
|
+
function geminiApprovalPromptOff(args) {
|
|
494
|
+
const tokens = args.slice(1);
|
|
495
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
496
|
+
const token = tokens[i];
|
|
497
|
+
const lower = token.toLowerCase();
|
|
498
|
+
if (lower === '--yolo' || lower.startsWith('--yolo='))
|
|
499
|
+
return lower !== '--yolo=false';
|
|
500
|
+
// -y, also inside a cluster of short flags (-yd).
|
|
501
|
+
if (/^-[A-Za-z]+$/.test(token) && token.includes('y'))
|
|
502
|
+
return true;
|
|
503
|
+
if (lower === '--approval-mode' && (tokens[i + 1] ?? '').trim().toLowerCase() === 'yolo')
|
|
504
|
+
return true;
|
|
505
|
+
if (lower === '--approval-mode=yolo')
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Whether a typed reply could come from someone other than the person: the
|
|
512
|
+
* host runs tools without asking, so the agent could run the prompt hook
|
|
513
|
+
* itself with a code it read from this user's files. Codex: its approval
|
|
514
|
+
* prompt off (codexApprovalPromptOff). Gemini CLI: YOLO. Cursor: its auto-run
|
|
515
|
+
* mode cannot be seen, so always. A host process that cannot be found counts
|
|
516
|
+
* as off.
|
|
517
|
+
*/
|
|
518
|
+
function typedReplyPromptOff(host, reader = defaultReader(), startPid = process.ppid, readConfig = readConfigFile) {
|
|
519
|
+
if (host === 'codex') {
|
|
520
|
+
const codex = findHostProcess(isCodex, reader, startPid);
|
|
521
|
+
return !codex || codexApprovalPromptOff(codex.args, readConfig);
|
|
522
|
+
}
|
|
523
|
+
if (host === 'gemini') {
|
|
524
|
+
const gemini = findHostProcess(isGemini, reader, startPid);
|
|
525
|
+
return !gemini || geminiApprovalPromptOff(gemini.args);
|
|
526
|
+
}
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
// ---------------------------------------------------------------------------
|
|
530
|
+
// Hook start-up time
|
|
531
|
+
// ---------------------------------------------------------------------------
|
|
532
|
+
/** /proc reports start times in USER_HZ, which is 100 on Linux. */
|
|
533
|
+
const TICK_MS = 10;
|
|
534
|
+
/** Longer than this is not a hook's own start-up (a long-lived wrapper shell): unknown. */
|
|
535
|
+
const MAX_HEAD_START_MS = 4_000;
|
|
536
|
+
/** A process that only launches the hook: npx or npm (exec), or a `sh -c` wrapper. */
|
|
537
|
+
function isHookLauncher(args) {
|
|
538
|
+
// npm rewrites its process title: /proc shows "npm exec …" (or "npx …") as one string.
|
|
539
|
+
if (/^(?:npm exec|npx)(?:\s|$)/.test(args[0] || ''))
|
|
540
|
+
return true;
|
|
541
|
+
const first = (0, node_path_1.basename)(args[0] || '').toLowerCase();
|
|
542
|
+
if (first === 'npx' || first === 'npm')
|
|
543
|
+
return true;
|
|
544
|
+
if (/^(?:node|nodejs)(?:\.exe)?$/.test(first) && /(?:^|[/\\])(?:npx-cli|npm-cli)\.js$|(?:^|[/\\])(?:npx|npm)$/.test(args[1] || ''))
|
|
545
|
+
return true;
|
|
546
|
+
return /^(?:sh|bash|dash|zsh)$/.test(first) && args.slice(1, 3).some((arg) => /^-[a-z]*c$/.test(arg));
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* How long before this process the host started launching it (npx, npm, a
|
|
550
|
+
* `sh -c` wrapper), in milliseconds, so a host's kill clock that started at
|
|
551
|
+
* spawn can be honored. Linux only (from /proc start times); 0 when unknown,
|
|
552
|
+
* including a launcher older than 4 s (a long-lived wrapper, not start-up).
|
|
553
|
+
*/
|
|
554
|
+
function hookLauncherHeadStartMs(reader = defaultReader(), selfPid = process.pid) {
|
|
555
|
+
const self = reader(selfPid);
|
|
556
|
+
if (!self || typeof self.startTicks !== 'number')
|
|
557
|
+
return 0;
|
|
558
|
+
let earliest = self.startTicks;
|
|
559
|
+
let pid = self.ppid;
|
|
560
|
+
for (let depth = 0; depth < 6 && pid > 1; depth += 1) {
|
|
561
|
+
const info = reader(pid);
|
|
562
|
+
if (!info || typeof info.startTicks !== 'number' || !isHookLauncher(info.args))
|
|
563
|
+
break;
|
|
564
|
+
earliest = Math.min(earliest, info.startTicks);
|
|
565
|
+
pid = info.ppid;
|
|
566
|
+
}
|
|
567
|
+
const headStart = Math.max(0, (self.startTicks - earliest) * TICK_MS);
|
|
568
|
+
return headStart > MAX_HEAD_START_MS ? 0 : headStart;
|
|
569
|
+
}
|
|
570
|
+
//# sourceMappingURL=host-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-session.js","sourceRoot":"","sources":["../src/host-session.ts"],"names":[],"mappings":"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"}
|