@varveai/adit-hooks 0.3.0 → 0.3.2
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/dist/adapters/codex.d.ts +16 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +481 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/cursor.d.ts +19 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +330 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/gemini.d.ts +9 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +216 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +5 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/registry.d.ts +11 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +92 -11
- package/dist/adapters/registry.js.map +1 -1
- package/dist/adapters/stub.d.ts +0 -4
- package/dist/adapters/stub.d.ts.map +1 -1
- package/dist/adapters/stub.js +0 -4
- package/dist/adapters/stub.js.map +1 -1
- package/dist/handlers/unified.d.ts.map +1 -1
- package/dist/handlers/unified.js +70 -1
- package/dist/handlers/unified.js.map +1 -1
- package/dist/index.js +42 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Maps Codex's hook events to ADIT's internal model.
|
|
5
|
+
* Supports all Codex clients: CLI, desktop App, and IDE Extension.
|
|
6
|
+
* All clients share the same hooks.json format and event schema.
|
|
7
|
+
* Handles installation into .codex/hooks.json.
|
|
8
|
+
*
|
|
9
|
+
* Key differences from Claude Code:
|
|
10
|
+
* - Timeout is in **seconds** (not milliseconds)
|
|
11
|
+
* - SessionStart uses matcher "startup|resume"
|
|
12
|
+
* - PostToolUse uses matcher "Bash"
|
|
13
|
+
*/
|
|
14
|
+
import type { PlatformAdapter } from "./types.js";
|
|
15
|
+
export declare const codexAdapter: PlatformAdapter;
|
|
16
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AA6BpB,eAAO,MAAM,YAAY,EAAE,eA4P1B,CAAC"}
|
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Maps Codex's hook events to ADIT's internal model.
|
|
5
|
+
* Supports all Codex clients: CLI, desktop App, and IDE Extension.
|
|
6
|
+
* All clients share the same hooks.json format and event schema.
|
|
7
|
+
* Handles installation into .codex/hooks.json.
|
|
8
|
+
*
|
|
9
|
+
* Key differences from Claude Code:
|
|
10
|
+
* - Timeout is in **seconds** (not milliseconds)
|
|
11
|
+
* - SessionStart uses matcher "startup|resume"
|
|
12
|
+
* - PostToolUse uses matcher "Bash"
|
|
13
|
+
*/
|
|
14
|
+
import { createHash } from "node:crypto";
|
|
15
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { dirname, join, resolve } from "node:path";
|
|
18
|
+
/** Timeout for Codex hooks — in SECONDS (not ms like Claude Code) */
|
|
19
|
+
const HOOK_TIMEOUT = 30;
|
|
20
|
+
const HOOK_MAPPINGS = [
|
|
21
|
+
{ platformEvent: "SessionStart", aditHandler: "session-start", matcher: "startup|resume" },
|
|
22
|
+
{ platformEvent: "UserPromptSubmit", aditHandler: "prompt-submit" },
|
|
23
|
+
{ platformEvent: "Stop", aditHandler: "stop" },
|
|
24
|
+
{ platformEvent: "PostToolUse", aditHandler: "notification", matcher: "Bash" },
|
|
25
|
+
];
|
|
26
|
+
const CODEX_HOOK_KEY_LABELS = {
|
|
27
|
+
SessionStart: "session_start",
|
|
28
|
+
UserPromptSubmit: "user_prompt_submit",
|
|
29
|
+
Stop: "stop",
|
|
30
|
+
PostToolUse: "post_tool_use",
|
|
31
|
+
};
|
|
32
|
+
/** Map Codex CLI platform events to ADIT hook types (derived from HOOK_MAPPINGS) */
|
|
33
|
+
const PLATFORM_TO_ADIT = Object.fromEntries(HOOK_MAPPINGS.map((m) => [m.platformEvent, m.aditHandler]));
|
|
34
|
+
/** Check if a command string is an ADIT hook (matches both npx and resolved-path formats) */
|
|
35
|
+
function isAditHookCommand(command) {
|
|
36
|
+
return command.includes("adit-hook") || command.includes("hooks/dist/index.js");
|
|
37
|
+
}
|
|
38
|
+
export const codexAdapter = {
|
|
39
|
+
platform: "codex",
|
|
40
|
+
displayName: "Codex",
|
|
41
|
+
hookMappings: HOOK_MAPPINGS,
|
|
42
|
+
parseInput(raw, hookType) {
|
|
43
|
+
const aditHookType = PLATFORM_TO_ADIT[hookType] ?? hookType;
|
|
44
|
+
const cwd = raw.cwd ?? process.cwd();
|
|
45
|
+
return {
|
|
46
|
+
cwd,
|
|
47
|
+
hookType: aditHookType,
|
|
48
|
+
platformCli: "codex",
|
|
49
|
+
platformSessionId: raw.session_id,
|
|
50
|
+
transcriptPath: raw.transcript_path,
|
|
51
|
+
// Prompt
|
|
52
|
+
prompt: raw.prompt,
|
|
53
|
+
// Stop
|
|
54
|
+
stopReason: raw.stop_reason,
|
|
55
|
+
lastAssistantMessage: raw.last_assistant_message,
|
|
56
|
+
stopHookActive: raw.stop_hook_active,
|
|
57
|
+
// Tool use (from PostToolUse)
|
|
58
|
+
toolName: raw.tool_name,
|
|
59
|
+
toolInput: raw.tool_input,
|
|
60
|
+
toolOutput: raw.tool_response,
|
|
61
|
+
// Session lifecycle
|
|
62
|
+
sessionSource: raw.source,
|
|
63
|
+
sessionEndReason: raw.reason,
|
|
64
|
+
// Common metadata (present in all events)
|
|
65
|
+
permissionMode: raw.permission_mode,
|
|
66
|
+
model: raw.model,
|
|
67
|
+
rawPlatformData: raw,
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
generateHookConfig(aditBinaryPath) {
|
|
71
|
+
const makeHookEntry = (command) => [
|
|
72
|
+
{ hooks: [{ type: "command", command: `CODEX=1 ${command}`, timeout: HOOK_TIMEOUT }] },
|
|
73
|
+
];
|
|
74
|
+
const makeMatcherEntry = (matcher, command) => [
|
|
75
|
+
{ matcher, hooks: [{ type: "command", command: `CODEX=1 ${command}`, timeout: HOOK_TIMEOUT }] },
|
|
76
|
+
];
|
|
77
|
+
return {
|
|
78
|
+
configPath: ".codex/hooks.json",
|
|
79
|
+
content: {
|
|
80
|
+
hooks: {
|
|
81
|
+
SessionStart: makeMatcherEntry("startup|resume", `${aditBinaryPath} session-start`),
|
|
82
|
+
UserPromptSubmit: makeHookEntry(`${aditBinaryPath} prompt-submit`),
|
|
83
|
+
Stop: makeHookEntry(`${aditBinaryPath} stop`),
|
|
84
|
+
PostToolUse: makeMatcherEntry("Bash", `${aditBinaryPath} notification`),
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
async validateInstallation(projectRoot) {
|
|
90
|
+
const checks = [];
|
|
91
|
+
// Check .codex directory exists
|
|
92
|
+
const codexDir = join(projectRoot, ".codex");
|
|
93
|
+
const codexDirExists = existsSync(codexDir);
|
|
94
|
+
checks.push({
|
|
95
|
+
name: ".codex directory",
|
|
96
|
+
ok: codexDirExists,
|
|
97
|
+
detail: codexDirExists ? codexDir : "Not found",
|
|
98
|
+
});
|
|
99
|
+
// Check hooks file for hook configuration
|
|
100
|
+
const hooksPath = join(projectRoot, ".codex", "hooks.json");
|
|
101
|
+
let hooksFound = false;
|
|
102
|
+
let hooksDetail = "No hook configuration found";
|
|
103
|
+
const requiredHooks = HOOK_MAPPINGS.map((m) => m.platformEvent);
|
|
104
|
+
const missingHooks = [];
|
|
105
|
+
if (existsSync(hooksPath)) {
|
|
106
|
+
try {
|
|
107
|
+
const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
108
|
+
if (!hooksConfig.hooks) {
|
|
109
|
+
hooksDetail = "No hooks section found in hooks.json";
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
for (const hookName of requiredHooks) {
|
|
113
|
+
const entries = hooksConfig.hooks[hookName];
|
|
114
|
+
if (!Array.isArray(entries)) {
|
|
115
|
+
missingHooks.push(hookName);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const hasAdit = entries.some((entry) => {
|
|
119
|
+
if (typeof entry.command === "string" && isAditHookCommand(entry.command))
|
|
120
|
+
return true;
|
|
121
|
+
if (Array.isArray(entry.hooks)) {
|
|
122
|
+
return entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
});
|
|
126
|
+
if (!hasAdit)
|
|
127
|
+
missingHooks.push(hookName);
|
|
128
|
+
}
|
|
129
|
+
hooksFound = missingHooks.length === 0;
|
|
130
|
+
hooksDetail = hooksFound
|
|
131
|
+
? `All hooks registered in ${hooksPath}`
|
|
132
|
+
: `Missing hooks: ${missingHooks.join(", ")}`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
hooksDetail = `Failed to parse ${hooksPath}`;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
checks.push({
|
|
140
|
+
name: "Hook configuration",
|
|
141
|
+
ok: hooksFound,
|
|
142
|
+
detail: hooksDetail,
|
|
143
|
+
});
|
|
144
|
+
const configPath = join(projectRoot, ".codex", "config.toml");
|
|
145
|
+
const projectConfig = readTextFile(configPath);
|
|
146
|
+
const featureEnabled = projectConfig !== null && hasTomlBooleanFeature(projectConfig, "hooks");
|
|
147
|
+
checks.push({
|
|
148
|
+
name: "Codex hooks feature",
|
|
149
|
+
ok: featureEnabled,
|
|
150
|
+
detail: featureEnabled ? `Enabled in ${configPath}` : "Missing [features] hooks = true",
|
|
151
|
+
});
|
|
152
|
+
let trustOk = false;
|
|
153
|
+
let trustDetail = "No trusted ADIT hook commands found";
|
|
154
|
+
if (existsSync(hooksPath)) {
|
|
155
|
+
try {
|
|
156
|
+
const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
157
|
+
const states = buildCodexHookStates(hooksPath, hooksConfig.hooks);
|
|
158
|
+
const userConfigPath = getCodexUserConfigPath();
|
|
159
|
+
const userConfig = readTextFile(userConfigPath);
|
|
160
|
+
const missingStates = userConfig === null
|
|
161
|
+
? states.map((state) => state.key)
|
|
162
|
+
: states.filter((state) => !hasTrustedHookState(userConfig, state)).map((state) => state.key);
|
|
163
|
+
trustOk = states.length > 0 && missingStates.length === 0;
|
|
164
|
+
trustDetail = trustOk
|
|
165
|
+
? `Trusted in ${userConfigPath}`
|
|
166
|
+
: `Missing trusted hook state${missingStates.length > 1 ? "s" : ""} in ${userConfigPath}`;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
trustDetail = "Failed to validate Codex trusted hook state";
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
checks.push({
|
|
173
|
+
name: "Codex hook trust",
|
|
174
|
+
ok: trustOk,
|
|
175
|
+
detail: trustDetail,
|
|
176
|
+
});
|
|
177
|
+
return {
|
|
178
|
+
valid: checks.every((c) => c.ok),
|
|
179
|
+
checks,
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
async installHooks(projectRoot, aditBinaryPath) {
|
|
183
|
+
const codexDir = join(projectRoot, ".codex");
|
|
184
|
+
if (!existsSync(codexDir)) {
|
|
185
|
+
mkdirSync(codexDir, { recursive: true });
|
|
186
|
+
}
|
|
187
|
+
const hooksPath = join(codexDir, "hooks.json");
|
|
188
|
+
let hooksConfig = {};
|
|
189
|
+
if (existsSync(hooksPath)) {
|
|
190
|
+
try {
|
|
191
|
+
hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Start fresh if hooks are invalid
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const hookConfig = this.generateHookConfig(aditBinaryPath);
|
|
198
|
+
const existingHooks = hooksConfig.hooks ?? {};
|
|
199
|
+
const newHooks = hookConfig.content.hooks;
|
|
200
|
+
// Merge hook entries per event key: preserve other tools' hooks,
|
|
201
|
+
// remove stale ADIT entries, then append new ADIT entries.
|
|
202
|
+
const mergedHooks = { ...existingHooks };
|
|
203
|
+
for (const [eventKey, aditEntries] of Object.entries(newHooks)) {
|
|
204
|
+
const existing = Array.isArray(mergedHooks[eventKey]) ? mergedHooks[eventKey] : [];
|
|
205
|
+
// Remove stale ADIT entries (same logic as uninstallHooks)
|
|
206
|
+
const nonAditEntries = existing.filter((raw) => {
|
|
207
|
+
const entry = raw;
|
|
208
|
+
if (typeof entry.command === "string" && isAditHookCommand(entry.command))
|
|
209
|
+
return false;
|
|
210
|
+
if (Array.isArray(entry.hooks)) {
|
|
211
|
+
return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
});
|
|
215
|
+
// Append new ADIT entries after other tools' hooks
|
|
216
|
+
mergedHooks[eventKey] = [...nonAditEntries, ...aditEntries];
|
|
217
|
+
}
|
|
218
|
+
hooksConfig.hooks = mergedHooks;
|
|
219
|
+
writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
|
|
220
|
+
const configPath = join(codexDir, "config.toml");
|
|
221
|
+
writeFileSync(configPath, enableCodexHooksFeature(readTextFile(configPath) ?? ""));
|
|
222
|
+
installCodexHookTrustConfig(hooksPath, mergedHooks);
|
|
223
|
+
},
|
|
224
|
+
getResumeCommand(_projectRoot) {
|
|
225
|
+
return "codex --continue";
|
|
226
|
+
},
|
|
227
|
+
async uninstallHooks(projectRoot) {
|
|
228
|
+
const hooksPath = join(projectRoot, ".codex", "hooks.json");
|
|
229
|
+
if (!existsSync(hooksPath))
|
|
230
|
+
return;
|
|
231
|
+
try {
|
|
232
|
+
const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
233
|
+
if (!hooksConfig.hooks)
|
|
234
|
+
return;
|
|
235
|
+
// Remove ADIT hook entries
|
|
236
|
+
for (const hookName of Object.keys(hooksConfig.hooks)) {
|
|
237
|
+
const entries = hooksConfig.hooks[hookName];
|
|
238
|
+
if (!Array.isArray(entries))
|
|
239
|
+
continue;
|
|
240
|
+
hooksConfig.hooks[hookName] = entries.filter((entry) => {
|
|
241
|
+
if (typeof entry.command === "string" && isAditHookCommand(entry.command))
|
|
242
|
+
return false;
|
|
243
|
+
if (Array.isArray(entry.hooks)) {
|
|
244
|
+
return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
|
|
245
|
+
}
|
|
246
|
+
return true;
|
|
247
|
+
});
|
|
248
|
+
// Clean up empty arrays
|
|
249
|
+
if (hooksConfig.hooks[hookName].length === 0) {
|
|
250
|
+
delete hooksConfig.hooks[hookName];
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Clean up empty hooks object
|
|
254
|
+
if (Object.keys(hooksConfig.hooks).length === 0) {
|
|
255
|
+
delete hooksConfig.hooks;
|
|
256
|
+
}
|
|
257
|
+
writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
|
|
258
|
+
uninstallCodexHookTrustConfig(hooksPath);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// Ignore parse errors
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
function readTextFile(path) {
|
|
266
|
+
try {
|
|
267
|
+
return readFileSync(path, "utf-8");
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function enableTomlBooleanFeature(text, key) {
|
|
274
|
+
const lines = text ? text.replace(/\s+$/u, "").split(/\r?\n/u) : [];
|
|
275
|
+
const featureHeaderIndex = lines.findIndex((line) => /^\s*\[features\]\s*$/u.test(line));
|
|
276
|
+
if (featureHeaderIndex < 0) {
|
|
277
|
+
if (lines.length > 0)
|
|
278
|
+
lines.push("");
|
|
279
|
+
lines.push("[features]", `${key} = true`);
|
|
280
|
+
return `${lines.join("\n")}\n`;
|
|
281
|
+
}
|
|
282
|
+
let insertIndex = lines.length;
|
|
283
|
+
for (let index = featureHeaderIndex + 1; index < lines.length; index++) {
|
|
284
|
+
if (/^\s*\[[^\]]+\]\s*$/u.test(lines[index] ?? "")) {
|
|
285
|
+
insertIndex = index;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
if (new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`, "u").test(lines[index] ?? "")) {
|
|
289
|
+
lines[index] = `${key} = true`;
|
|
290
|
+
return `${lines.join("\n")}\n`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
lines.splice(insertIndex, 0, `${key} = true`);
|
|
294
|
+
return `${lines.join("\n")}\n`;
|
|
295
|
+
}
|
|
296
|
+
function enableCodexHooksFeature(text) {
|
|
297
|
+
const cleaned = text
|
|
298
|
+
.split(/\r?\n/u)
|
|
299
|
+
.filter((line) => !/^\s*codex_hooks\s*=/u.test(line))
|
|
300
|
+
.join("\n")
|
|
301
|
+
.replace(/\s+$/u, "");
|
|
302
|
+
return enableTomlBooleanFeature(cleaned, "hooks");
|
|
303
|
+
}
|
|
304
|
+
function hasTomlBooleanFeature(text, key) {
|
|
305
|
+
const lines = text.split(/\r?\n/u);
|
|
306
|
+
let inFeatures = false;
|
|
307
|
+
for (const line of lines) {
|
|
308
|
+
if (/^\s*\[features\]\s*$/u.test(line)) {
|
|
309
|
+
inFeatures = true;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (/^\s*\[[^\]]+\]\s*$/u.test(line)) {
|
|
313
|
+
inFeatures = false;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (inFeatures && new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*true\\s*(?:#.*)?$`, "u").test(line)) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
function buildCodexHookStates(hooksPath, hooks) {
|
|
323
|
+
if (!hooks || typeof hooks !== "object")
|
|
324
|
+
return [];
|
|
325
|
+
const absoluteHooksPath = resolve(hooksPath);
|
|
326
|
+
const states = [];
|
|
327
|
+
for (const mapping of HOOK_MAPPINGS) {
|
|
328
|
+
const entries = hooks[mapping.platformEvent];
|
|
329
|
+
if (!Array.isArray(entries))
|
|
330
|
+
continue;
|
|
331
|
+
const keyLabel = CODEX_HOOK_KEY_LABELS[mapping.platformEvent];
|
|
332
|
+
if (!keyLabel)
|
|
333
|
+
continue;
|
|
334
|
+
for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {
|
|
335
|
+
const entry = entries[entryIndex];
|
|
336
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry))
|
|
337
|
+
continue;
|
|
338
|
+
const entryRecord = entry;
|
|
339
|
+
if (!Array.isArray(entryRecord.hooks))
|
|
340
|
+
continue;
|
|
341
|
+
for (let hookIndex = 0; hookIndex < entryRecord.hooks.length; hookIndex++) {
|
|
342
|
+
const hook = entryRecord.hooks[hookIndex];
|
|
343
|
+
if (!hook || typeof hook !== "object" || Array.isArray(hook))
|
|
344
|
+
continue;
|
|
345
|
+
const hookRecord = hook;
|
|
346
|
+
if (typeof hookRecord.command !== "string" || !isAditHookCommand(hookRecord.command))
|
|
347
|
+
continue;
|
|
348
|
+
const timeout = typeof hookRecord.timeout === "number" ? hookRecord.timeout : HOOK_TIMEOUT;
|
|
349
|
+
const matcher = typeof entryRecord.matcher === "string" ? entryRecord.matcher : undefined;
|
|
350
|
+
states.push({
|
|
351
|
+
key: `${absoluteHooksPath}:${keyLabel}:${entryIndex}:${hookIndex}`,
|
|
352
|
+
trustedHash: codexHookTrustedHash({
|
|
353
|
+
eventName: keyLabel,
|
|
354
|
+
matcher,
|
|
355
|
+
command: hookRecord.command,
|
|
356
|
+
timeout,
|
|
357
|
+
}),
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return states;
|
|
363
|
+
}
|
|
364
|
+
function getCodexUserConfigPath() {
|
|
365
|
+
const codexHome = process.env.CODEX_HOME ?? join(homedir(), ".codex");
|
|
366
|
+
return join(codexHome, "config.toml");
|
|
367
|
+
}
|
|
368
|
+
function installCodexHookTrustConfig(hooksPath, hooks) {
|
|
369
|
+
const states = buildCodexHookStates(hooksPath, hooks);
|
|
370
|
+
if (states.length === 0)
|
|
371
|
+
return;
|
|
372
|
+
const configPath = getCodexUserConfigPath();
|
|
373
|
+
try {
|
|
374
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
375
|
+
const current = readTextFile(configPath) ?? "";
|
|
376
|
+
writeFileSync(configPath, appendCodexHookTrustBlock(current, codexTrustMarker(hooksPath), states));
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Fail-open: hooks can still prompt for trust if the user config cannot be updated.
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
function uninstallCodexHookTrustConfig(hooksPath) {
|
|
383
|
+
const configPath = getCodexUserConfigPath();
|
|
384
|
+
try {
|
|
385
|
+
const current = readTextFile(configPath);
|
|
386
|
+
if (current === null)
|
|
387
|
+
return;
|
|
388
|
+
writeFileSync(configPath, `${stripAditCodexHookTrustBlocks(current, { marker: codexTrustMarker(hooksPath) }).replace(/\s+$/u, "")}\n`);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// Fail-open.
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function appendCodexHookTrustBlock(text, marker, states) {
|
|
395
|
+
const cleaned = stripAditCodexHookTrustBlocks(text, {
|
|
396
|
+
marker,
|
|
397
|
+
keys: states.map((state) => state.key),
|
|
398
|
+
}).replace(/\s+$/u, "");
|
|
399
|
+
const block = [
|
|
400
|
+
`# >>> adit-codex-hooks ${marker}`,
|
|
401
|
+
...states.flatMap((state) => [
|
|
402
|
+
`[hooks.state.${JSON.stringify(state.key)}]`,
|
|
403
|
+
"enabled = true",
|
|
404
|
+
`trusted_hash = ${JSON.stringify(state.trustedHash)}`,
|
|
405
|
+
"",
|
|
406
|
+
]),
|
|
407
|
+
`# <<< adit-codex-hooks ${marker}`,
|
|
408
|
+
].join("\n").replace(/\n+$/u, "");
|
|
409
|
+
return `${cleaned ? `${cleaned}\n\n` : ""}${block}\n`;
|
|
410
|
+
}
|
|
411
|
+
function stripAditCodexHookTrustBlocks(text, opts) {
|
|
412
|
+
const lines = text.split(/\r?\n/u);
|
|
413
|
+
const kept = [];
|
|
414
|
+
const keys = opts?.keys ?? [];
|
|
415
|
+
for (let index = 0; index < lines.length; index++) {
|
|
416
|
+
const line = lines[index] ?? "";
|
|
417
|
+
if (!/^\s*# >>> adit-codex-hooks\b/u.test(line)) {
|
|
418
|
+
kept.push(line);
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
const block = [line];
|
|
422
|
+
while (index + 1 < lines.length) {
|
|
423
|
+
index++;
|
|
424
|
+
const blockLine = lines[index] ?? "";
|
|
425
|
+
block.push(blockLine);
|
|
426
|
+
if (/^\s*# <<< adit-codex-hooks\b/u.test(blockLine))
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
const blockText = block.join("\n");
|
|
430
|
+
const matchesMarker = opts?.marker ? block[0]?.includes(opts.marker) : false;
|
|
431
|
+
const matchesKey = keys.some((key) => blockText.includes(JSON.stringify(key)));
|
|
432
|
+
const stripBlock = matchesMarker || matchesKey || (!opts?.marker && keys.length === 0);
|
|
433
|
+
if (stripBlock) {
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
kept.push(...block);
|
|
437
|
+
}
|
|
438
|
+
return kept.join("\n");
|
|
439
|
+
}
|
|
440
|
+
function hasTrustedHookState(text, state) {
|
|
441
|
+
const escapedKey = escapeRegExp(JSON.stringify(state.key));
|
|
442
|
+
const blockPattern = new RegExp(`\\[hooks\\.state\\.${escapedKey}\\]([\\s\\S]*?)(?=\\n\\s*\\[|$)`, "u");
|
|
443
|
+
const match = text.match(blockPattern);
|
|
444
|
+
if (!match)
|
|
445
|
+
return false;
|
|
446
|
+
const block = match[1] ?? "";
|
|
447
|
+
return /^\s*enabled\s*=\s*true\s*$/mu.test(block)
|
|
448
|
+
&& new RegExp(`^\\s*trusted_hash\\s*=\\s*${escapeRegExp(JSON.stringify(state.trustedHash))}\\s*$`, "mu").test(block);
|
|
449
|
+
}
|
|
450
|
+
function codexHookTrustedHash(input) {
|
|
451
|
+
const identity = {
|
|
452
|
+
event_name: input.eventName,
|
|
453
|
+
hooks: [{
|
|
454
|
+
async: false,
|
|
455
|
+
command: input.command,
|
|
456
|
+
timeout: input.timeout,
|
|
457
|
+
type: "command",
|
|
458
|
+
}],
|
|
459
|
+
};
|
|
460
|
+
if (input.matcher)
|
|
461
|
+
identity.matcher = input.matcher;
|
|
462
|
+
const canonical = JSON.stringify(canonicalJson(identity));
|
|
463
|
+
return `sha256:${createHash("sha256").update(canonical).digest("hex")}`;
|
|
464
|
+
}
|
|
465
|
+
function canonicalJson(value) {
|
|
466
|
+
if (Array.isArray(value))
|
|
467
|
+
return value.map(canonicalJson);
|
|
468
|
+
if (!value || typeof value !== "object")
|
|
469
|
+
return value;
|
|
470
|
+
const record = value;
|
|
471
|
+
return Object.fromEntries(Object.keys(record)
|
|
472
|
+
.sort()
|
|
473
|
+
.map((key) => [key, canonicalJson(record[key])]));
|
|
474
|
+
}
|
|
475
|
+
function codexTrustMarker(hooksPath) {
|
|
476
|
+
return createHash("sha256").update(resolve(hooksPath)).digest("hex").slice(0, 16);
|
|
477
|
+
}
|
|
478
|
+
function escapeRegExp(value) {
|
|
479
|
+
return value.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor IDE platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Maps Cursor's hook events to ADIT's internal model.
|
|
5
|
+
* Handles installation into .cursor/hooks.json.
|
|
6
|
+
*/
|
|
7
|
+
import type { PlatformAdapter } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Extract the last assistant message text from a Cursor transcript JSONL file.
|
|
10
|
+
*
|
|
11
|
+
* Cursor's stop event does not include the assistant's response text — only
|
|
12
|
+
* `status` and `transcript_path`. The actual response is in the JSONL transcript.
|
|
13
|
+
*
|
|
14
|
+
* Reads the tail of the file for efficiency, then scans backwards for the
|
|
15
|
+
* last `role: "assistant"` entry with text content.
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractLastAssistantMessage(transcriptPath: string): string | undefined;
|
|
18
|
+
export declare const cursorAdapter: PlatformAdapter;
|
|
19
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AAuCpB;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0CtF;AAoBD,eAAO,MAAM,aAAa,EAAE,eA+P3B,CAAC"}
|