@autopilot-harness/port-codex 0.3.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Autopilot Harness contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,123 @@
1
+ import { type PhaseActionConfig, type ReviewEngine, type StateStore } from "@autopilot-harness/core";
2
+ /** Codex UserPromptSubmit stdin fields. */
3
+ export interface CodexSubmitPayload {
4
+ session_id?: string;
5
+ sessionId?: string;
6
+ prompt?: string;
7
+ /** Informational only — store always uses install-root projectRoot. */
8
+ cwd?: string;
9
+ transcript_path?: string;
10
+ transcriptPath?: string;
11
+ conversation_id?: string;
12
+ conversationId?: string;
13
+ /** Codex may send plan/default/… — Autopilot ignores (no auto-ON). */
14
+ permission_mode?: string;
15
+ permissionMode?: string;
16
+ turn_id?: string;
17
+ model?: string;
18
+ }
19
+ /** Codex PostToolUse stdin (apply_patch / Edit / Write / …). */
20
+ export interface CodexEditPayload {
21
+ session_id?: string;
22
+ sessionId?: string;
23
+ conversation_id?: string;
24
+ conversationId?: string;
25
+ cwd?: string;
26
+ tool_name?: string;
27
+ toolName?: string;
28
+ tool_input?: Record<string, unknown> | string;
29
+ toolInput?: Record<string, unknown> | string;
30
+ }
31
+ /** Codex Stop stdin (no StopFailure event in this port). */
32
+ export interface CodexStopPayload {
33
+ session_id?: string;
34
+ sessionId?: string;
35
+ conversation_id?: string;
36
+ conversationId?: string;
37
+ cwd?: string;
38
+ transcript_path?: string;
39
+ transcriptPath?: string;
40
+ status?: string;
41
+ stop_hook_active?: boolean;
42
+ stopHookActive?: boolean;
43
+ hook_event_name?: string;
44
+ hookEventName?: string;
45
+ last_assistant_message?: string;
46
+ turn_id?: string;
47
+ error?: unknown;
48
+ message?: unknown;
49
+ reason?: unknown;
50
+ }
51
+ export interface CodexPortConfig {
52
+ phaseActions?: PhaseActionConfig;
53
+ }
54
+ export declare const CODEX_PLATFORM = "codex";
55
+ /** Cap needPick list for Codex ~2500-token hook-output budget. */
56
+ export declare const MAX_NEED_PICK_SLUGS = 40;
57
+ export declare const MAX_NEED_PICK_CONTEXT_CHARS = 2000;
58
+ /** Bound hostile/huge apply_patch command parsing. */
59
+ export declare const MAX_APPLY_PATCH_COMMAND_CHARS = 1048576;
60
+ export declare const MAX_APPLY_PATCH_PATHS = 256;
61
+ export interface CodexSubmitResult {
62
+ decision?: "block";
63
+ reason?: string;
64
+ continue?: boolean;
65
+ stopReason?: string;
66
+ hookSpecificOutput?: {
67
+ hookEventName: "UserPromptSubmit";
68
+ additionalContext?: string;
69
+ };
70
+ }
71
+ export interface CodexStopResult {
72
+ decision?: "block";
73
+ reason?: string;
74
+ continue?: boolean;
75
+ stopReason?: string;
76
+ }
77
+ /**
78
+ * Map Codex stop_hook_active → ReviewEngine loopCount.
79
+ * true ⇒ in auto-continuation chain.
80
+ */
81
+ export declare function loopCountFromStopHookActive(payload: CodexStopPayload): number;
82
+ export declare function collectCodexStopErrorText(payload: CodexStopPayload): string;
83
+ export declare function normalizeCodexStopStatus(payload: CodexStopPayload, opts?: {
84
+ status?: "completed" | "error" | "aborted";
85
+ }): "completed" | "error" | "aborted";
86
+ /**
87
+ * Channel A needPick via additionalContext — never decision:block for pick.
88
+ * Slugs capped for Codex hook output budget.
89
+ * @internal Exported for tests.
90
+ */
91
+ export declare function allowNeedPickContext(userMessage: unknown, candidates?: ReadonlyArray<{
92
+ slug?: string;
93
+ }>): CodexSubmitResult;
94
+ /**
95
+ * Parse file paths from Codex apply_patch `tool_input.command` text.
96
+ * Supports `*** Add|Update|Delete File:`, `*** Rename File: a -> b`, and `+++` lines.
97
+ */
98
+ export declare function pathsFromApplyPatchCommand(command: string): string[];
99
+ /**
100
+ * Paths touched by this PostToolUse (0..n).
101
+ * apply_patch → parse command; Edit/Write → file_path-style fields.
102
+ */
103
+ export declare function filePathsFromCodexEdit(payload: CodexEditPayload): string[];
104
+ /** File-mutating tools Autopilot arms from (Bash relies on dirty-arm). */
105
+ export declare function isCodexEditTool(toolName: string): boolean;
106
+ /**
107
+ * UserPromptSubmit → core triggers / fail-closed.
108
+ * needPick → additionalContext (Channel A). Busy/errors → decision:block.
109
+ * permission_mode is ignored (no auto-ON).
110
+ */
111
+ export declare function handleUserPromptSubmit(store: StateStore, payload: CodexSubmitPayload, projectRoot: string, portConfig?: CodexPortConfig): CodexSubmitResult;
112
+ /** PostToolUse → markCodeEdited when any product path is touched. */
113
+ export declare function handlePostToolUse(store: StateStore, payload: CodexEditPayload, projectRoot: string): void;
114
+ /**
115
+ * Stop → ReviewEngine.
116
+ * Continuing followups: decision:block + reason only (never continue:false to keep going).
117
+ * loop:false hard-stop may use continue:false (Codex stop precedence).
118
+ * No StopFailure handler in this port — hook boundary fail-open.
119
+ */
120
+ export declare function handleStop(engine: ReviewEngine, payload: CodexStopPayload, opts?: {
121
+ status?: "completed" | "error" | "aborted";
122
+ }): CodexStopResult;
123
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,458 @@
1
+ import { applyOff, applyOn, applyReplan, applyResume, applyResumeReview, applyRun, applyTrackPick, ensureAmbientReviewSession, effectiveReviewingItemId, firstUnchecked, isChannelANeedPick, isHarnessFollowupMessage, isProductCodeEdit, isRecoverOrStuckFollowupMessage, isSafeTrackSlug, isUserAbortText, loadProjectHookConfig, loadProjectReviewConfig, notePlansDirEdit, parseAdvanceNextItemId, parseChecklist, parseTrigger, } from "@autopilot-harness/core";
2
+ export const CODEX_PLATFORM = "codex";
3
+ /** Cap needPick list for Codex ~2500-token hook-output budget. */
4
+ export const MAX_NEED_PICK_SLUGS = 40;
5
+ export const MAX_NEED_PICK_CONTEXT_CHARS = 2_000;
6
+ /** Bound hostile/huge apply_patch command parsing. */
7
+ export const MAX_APPLY_PATCH_COMMAND_CHARS = 1_048_576;
8
+ export const MAX_APPLY_PATCH_PATHS = 256;
9
+ function sid(p) {
10
+ return (p.session_id ??
11
+ p.sessionId ??
12
+ p.conversation_id ??
13
+ p.conversationId ??
14
+ "").trim();
15
+ }
16
+ /**
17
+ * Map Codex stop_hook_active → ReviewEngine loopCount.
18
+ * true ⇒ in auto-continuation chain.
19
+ */
20
+ export function loopCountFromStopHookActive(payload) {
21
+ const active = payload.stop_hook_active ?? payload.stopHookActive;
22
+ return active === true ? 1 : 0;
23
+ }
24
+ export function collectCodexStopErrorText(payload) {
25
+ if (!payload || typeof payload !== "object")
26
+ return "";
27
+ const MAX_CHARS = 8_192;
28
+ const parts = [];
29
+ try {
30
+ const push = (value) => {
31
+ if (typeof value === "string" && value.trim()) {
32
+ parts.push(value);
33
+ return;
34
+ }
35
+ if (value && typeof value === "object" && !Array.isArray(value)) {
36
+ const o = value;
37
+ for (const key of ["message", "error", "name", "stack", "detail"]) {
38
+ const nested = o[key];
39
+ if (typeof nested === "string" && nested.trim())
40
+ parts.push(nested);
41
+ }
42
+ }
43
+ };
44
+ push(payload.error);
45
+ push(payload.message);
46
+ push(payload.reason);
47
+ }
48
+ catch {
49
+ return "";
50
+ }
51
+ const joined = parts.join("\n");
52
+ return joined.length > MAX_CHARS ? joined.slice(0, MAX_CHARS) : joined;
53
+ }
54
+ export function normalizeCodexStopStatus(payload, opts) {
55
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
56
+ return opts?.status ?? "completed";
57
+ }
58
+ const statusRaw = String(payload.status ?? "")
59
+ .toLowerCase()
60
+ .trim();
61
+ const errText = collectCodexStopErrorText(payload);
62
+ if (statusRaw === "aborted" ||
63
+ statusRaw === "cancelled" ||
64
+ statusRaw === "canceled") {
65
+ return "aborted";
66
+ }
67
+ if (opts?.status === "aborted")
68
+ return "aborted";
69
+ if (statusRaw === "error" || statusRaw === "failed") {
70
+ if (isUserAbortText(errText))
71
+ return "aborted";
72
+ return "error";
73
+ }
74
+ if (opts?.status === "error") {
75
+ if (isUserAbortText(errText))
76
+ return "aborted";
77
+ return "error";
78
+ }
79
+ if (opts?.status === "completed")
80
+ return "completed";
81
+ if (!statusRaw && isUserAbortText(errText))
82
+ return "aborted";
83
+ return "completed";
84
+ }
85
+ function blockReason(message, fallback) {
86
+ const m = typeof message === "string" ? message.trim() : "";
87
+ return m || fallback;
88
+ }
89
+ /**
90
+ * Channel A needPick via additionalContext — never decision:block for pick.
91
+ * Slugs capped for Codex hook output budget.
92
+ * @internal Exported for tests.
93
+ */
94
+ export function allowNeedPickContext(userMessage, candidates) {
95
+ const fromMessage = typeof userMessage === "string" && userMessage.trim().length > 0
96
+ ? userMessage.trim()
97
+ : "";
98
+ const slugs = [
99
+ ...new Set((candidates ?? [])
100
+ .map((c) => (c && typeof c.slug === "string" ? c.slug.trim() : ""))
101
+ .filter((s) => s.length > 0 && isSafeTrackSlug(s))),
102
+ ].slice(0, MAX_NEED_PICK_SLUGS);
103
+ let ctx = fromMessage ||
104
+ (slugs.length > 0
105
+ ? `Select a plan to execute:\n\n${slugs
106
+ .map((s, i) => ` ${i + 1}. ${s}`)
107
+ .join("\n")}\n\nReply with a number or /autopilot-run <slug>.`
108
+ : "Select a plan to execute. Reply with a number or /autopilot-run <slug>.");
109
+ if (ctx.length > MAX_NEED_PICK_CONTEXT_CHARS) {
110
+ ctx = `${ctx.slice(0, MAX_NEED_PICK_CONTEXT_CHARS - 1)}…`;
111
+ }
112
+ return {
113
+ hookSpecificOutput: {
114
+ hookEventName: "UserPromptSubmit",
115
+ additionalContext: ctx,
116
+ },
117
+ };
118
+ }
119
+ /**
120
+ * Parse file paths from Codex apply_patch `tool_input.command` text.
121
+ * Supports `*** Add|Update|Delete File:`, `*** Rename File: a -> b`, and `+++` lines.
122
+ */
123
+ export function pathsFromApplyPatchCommand(command) {
124
+ if (typeof command !== "string" || !command.trim())
125
+ return [];
126
+ // Truncate oversized payloads before split (DoS / hostile hooks).
127
+ const text = command.length > MAX_APPLY_PATCH_COMMAND_CHARS
128
+ ? command.slice(0, MAX_APPLY_PATCH_COMMAND_CHARS)
129
+ : command;
130
+ const found = [];
131
+ const seen = new Set();
132
+ const push = (raw) => {
133
+ if (found.length >= MAX_APPLY_PATCH_PATHS)
134
+ return;
135
+ let p = raw.trim();
136
+ if (!p || p === "/dev/null")
137
+ return;
138
+ // Reject NULs / newlines smuggled into a "path".
139
+ if (/[\0\r\n]/.test(p))
140
+ return;
141
+ // Strip optional a/ or b/ prefix from diff paths.
142
+ p = p.replace(/^[ab]\//, "");
143
+ if (!p || seen.has(p))
144
+ return;
145
+ seen.add(p);
146
+ found.push(p);
147
+ };
148
+ for (const line of text.split(/\r?\n/)) {
149
+ if (found.length >= MAX_APPLY_PATCH_PATHS)
150
+ break;
151
+ const rename = line.match(/^\*\*\*\s+Rename\s+File:\s*(.+?)\s*->\s*(.+?)\s*$/i);
152
+ if (rename?.[1] && rename[2]) {
153
+ push(rename[1]);
154
+ push(rename[2]);
155
+ continue;
156
+ }
157
+ const header = line.match(/^\*\*\*\s+(?:Add|Update|Delete)\s+File:\s*(.+?)\s*$/i);
158
+ if (header?.[1]) {
159
+ push(header[1]);
160
+ continue;
161
+ }
162
+ const plus = line.match(/^\+\+\+\s+(?:[ab]\/)?(.+?)\s*$/);
163
+ if (plus?.[1] && plus[1] !== "/dev/null") {
164
+ push(plus[1]);
165
+ }
166
+ }
167
+ return found;
168
+ }
169
+ function toolInputObject(payload) {
170
+ const input = payload.tool_input ?? payload.toolInput;
171
+ if (!input)
172
+ return null;
173
+ if (typeof input === "object" && !Array.isArray(input)) {
174
+ return input;
175
+ }
176
+ return null;
177
+ }
178
+ /**
179
+ * Paths touched by this PostToolUse (0..n).
180
+ * apply_patch → parse command; Edit/Write → file_path-style fields.
181
+ */
182
+ export function filePathsFromCodexEdit(payload) {
183
+ const toolName = String(payload.tool_name ?? payload.toolName ?? "").trim();
184
+ const rawInput = payload.tool_input ?? payload.toolInput;
185
+ if (toolName === "apply_patch" || toolName === "ApplyPatch") {
186
+ // Object `{ command }` or rare stringified command body.
187
+ if (typeof rawInput === "string") {
188
+ return pathsFromApplyPatchCommand(rawInput);
189
+ }
190
+ const input = toolInputObject(payload);
191
+ if (!input)
192
+ return [];
193
+ const cmd = input.command;
194
+ if (typeof cmd === "string")
195
+ return pathsFromApplyPatchCommand(cmd);
196
+ return [];
197
+ }
198
+ const input = toolInputObject(payload);
199
+ if (!input)
200
+ return [];
201
+ const candidates = [
202
+ input.file_path,
203
+ input.filePath,
204
+ input.path,
205
+ input.notebook_path,
206
+ input.notebookPath,
207
+ ];
208
+ for (const c of candidates) {
209
+ if (typeof c === "string" && c.trim())
210
+ return [c.trim()];
211
+ }
212
+ return [];
213
+ }
214
+ /** File-mutating tools Autopilot arms from (Bash relies on dirty-arm). */
215
+ export function isCodexEditTool(toolName) {
216
+ const n = toolName.trim();
217
+ return (n === "apply_patch" ||
218
+ n === "ApplyPatch" ||
219
+ n === "Edit" ||
220
+ n === "Write");
221
+ }
222
+ function stampCodexPlatform(store, conversationId, projectRoot) {
223
+ const session = store.getSession(conversationId);
224
+ if (!session || session.platform === CODEX_PLATFORM)
225
+ return;
226
+ store.upsertSession({
227
+ conversation_id: conversationId,
228
+ project_root: session.project_root || projectRoot,
229
+ code_root: session.code_root || projectRoot,
230
+ platform: CODEX_PLATFORM,
231
+ });
232
+ }
233
+ /**
234
+ * UserPromptSubmit → core triggers / fail-closed.
235
+ * needPick → additionalContext (Channel A). Busy/errors → decision:block.
236
+ * permission_mode is ignored (no auto-ON).
237
+ */
238
+ export function handleUserPromptSubmit(store, payload, projectRoot, portConfig) {
239
+ const conversationId = sid(payload);
240
+ if (!conversationId)
241
+ return {};
242
+ const prompt = typeof payload.prompt === "string" ? payload.prompt : "";
243
+ try {
244
+ store.clearPendingFollowupIf(conversationId, isRecoverOrStuckFollowupMessage);
245
+ }
246
+ catch {
247
+ /* best-effort */
248
+ }
249
+ const session = store.getSession(conversationId);
250
+ const hookCfg = loadProjectHookConfig(projectRoot);
251
+ const trigger = parseTrigger({
252
+ prompt,
253
+ conversationId,
254
+ projectRoot,
255
+ pendingAction: session?.pending_action,
256
+ triggers: hookCfg.triggers,
257
+ });
258
+ const actionConfig = {
259
+ ...portConfig?.phaseActions,
260
+ plansDir: portConfig?.phaseActions?.plansDir ?? hookCfg.plansDir,
261
+ };
262
+ const gateFallback = "Autopilot rejected this prompt. Check `npx autopilot-harness status`.";
263
+ if (trigger) {
264
+ if (trigger.kind === "off") {
265
+ applyOff(store, conversationId);
266
+ stampCodexPlatform(store, conversationId, projectRoot);
267
+ return {};
268
+ }
269
+ if (trigger.kind === "on") {
270
+ const result = applyOn(store, conversationId, projectRoot, {
271
+ initialBrief: trigger.initialBrief,
272
+ slug: trigger.slug,
273
+ platform: CODEX_PLATFORM,
274
+ });
275
+ if (!result.ok) {
276
+ stampCodexPlatform(store, conversationId, projectRoot);
277
+ return {
278
+ decision: "block",
279
+ reason: blockReason(result.userMessage, gateFallback),
280
+ };
281
+ }
282
+ return {};
283
+ }
284
+ if (trigger.kind === "resume") {
285
+ const result = applyResume(store, conversationId, {
286
+ slug: trigger.slug,
287
+ });
288
+ if (!result.ok) {
289
+ stampCodexPlatform(store, conversationId, projectRoot);
290
+ return {
291
+ decision: "block",
292
+ reason: blockReason(result.userMessage, gateFallback),
293
+ };
294
+ }
295
+ stampCodexPlatform(store, conversationId, projectRoot);
296
+ return {};
297
+ }
298
+ if (trigger.kind === "resume_review") {
299
+ applyResumeReview(store, conversationId);
300
+ stampCodexPlatform(store, conversationId, projectRoot);
301
+ return {};
302
+ }
303
+ if (trigger.kind === "run") {
304
+ const result = applyRun(store, conversationId, projectRoot, {
305
+ slug: trigger.slug,
306
+ config: actionConfig,
307
+ platform: CODEX_PLATFORM,
308
+ });
309
+ if (!result.ok) {
310
+ stampCodexPlatform(store, conversationId, projectRoot);
311
+ if (isChannelANeedPick(result)) {
312
+ return allowNeedPickContext(result.userMessage, result.candidates);
313
+ }
314
+ return {
315
+ decision: "block",
316
+ reason: blockReason(result.userMessage, gateFallback),
317
+ };
318
+ }
319
+ return {};
320
+ }
321
+ if (trigger.kind === "replan") {
322
+ const result = applyReplan(store, conversationId, projectRoot, {
323
+ slug: trigger.slug,
324
+ config: actionConfig,
325
+ platform: CODEX_PLATFORM,
326
+ });
327
+ if (!result.ok) {
328
+ stampCodexPlatform(store, conversationId, projectRoot);
329
+ return {
330
+ decision: "block",
331
+ reason: blockReason(result.userMessage, gateFallback),
332
+ };
333
+ }
334
+ return {};
335
+ }
336
+ if (trigger.kind === "track_pick" && trigger.trackPick) {
337
+ const result = applyTrackPick(store, conversationId, projectRoot, trigger.trackPick, { config: actionConfig, platform: CODEX_PLATFORM });
338
+ if (!result.ok) {
339
+ stampCodexPlatform(store, conversationId, projectRoot);
340
+ if (isChannelANeedPick(result)) {
341
+ return allowNeedPickContext(result.userMessage, result.candidates);
342
+ }
343
+ return {
344
+ decision: "block",
345
+ reason: blockReason(result.userMessage, gateFallback),
346
+ };
347
+ }
348
+ return {};
349
+ }
350
+ return {};
351
+ }
352
+ if (!isHarnessFollowupMessage(prompt)) {
353
+ store.clearChainPending(conversationId);
354
+ }
355
+ stampCodexPlatform(store, conversationId, projectRoot);
356
+ return {};
357
+ }
358
+ function armCodeEdited(store, conversationId, projectRoot) {
359
+ const cfg = loadProjectReviewConfig(projectRoot);
360
+ if (cfg.reviewScope === "project") {
361
+ ensureAmbientReviewSession(store, conversationId, projectRoot, cfg.reviewScope, CODEX_PLATFORM);
362
+ }
363
+ stampCodexPlatform(store, conversationId, projectRoot);
364
+ const session = store.getSession(conversationId);
365
+ const checklistPath = session?.checklist_path?.trim() ?? "";
366
+ let checklistSnap = null;
367
+ if (checklistPath) {
368
+ try {
369
+ checklistSnap = parseChecklist(checklistPath, { projectRoot });
370
+ }
371
+ catch {
372
+ /* still arm */
373
+ }
374
+ }
375
+ store.markCodeEdited(conversationId, (chain) => {
376
+ const fromPending = parseAdvanceNextItemId(chain.pending_followup);
377
+ if (checklistSnap) {
378
+ if (fromPending && effectiveReviewingItemId(checklistSnap, fromPending)) {
379
+ return fromPending;
380
+ }
381
+ return firstUnchecked(checklistSnap)?.id ?? null;
382
+ }
383
+ return fromPending;
384
+ });
385
+ }
386
+ /** PostToolUse → markCodeEdited when any product path is touched. */
387
+ export function handlePostToolUse(store, payload, projectRoot) {
388
+ const conversationId = sid(payload);
389
+ const toolName = String(payload.tool_name ?? payload.toolName ?? "").trim();
390
+ if (!conversationId || !isCodexEditTool(toolName))
391
+ return;
392
+ const filePaths = filePathsFromCodexEdit(payload);
393
+ if (filePaths.length === 0) {
394
+ // apply_patch with unparsable command: still stamp platform; dirty-arm
395
+ // on Stop covers product paths. Do not false-arm without a path.
396
+ stampCodexPlatform(store, conversationId, projectRoot);
397
+ return;
398
+ }
399
+ let plansDir;
400
+ try {
401
+ plansDir = loadProjectHookConfig(projectRoot).plansDir;
402
+ }
403
+ catch {
404
+ plansDir = undefined;
405
+ }
406
+ let armed = false;
407
+ for (const filePath of filePaths) {
408
+ try {
409
+ notePlansDirEdit(store, conversationId, projectRoot, filePath, plansDir);
410
+ }
411
+ catch {
412
+ /* best-effort */
413
+ }
414
+ if (!isProductCodeEdit(filePath, { projectRoot }))
415
+ continue;
416
+ if (!armed) {
417
+ armCodeEdited(store, conversationId, projectRoot);
418
+ armed = true;
419
+ }
420
+ }
421
+ if (!armed) {
422
+ stampCodexPlatform(store, conversationId, projectRoot);
423
+ }
424
+ }
425
+ /**
426
+ * Stop → ReviewEngine.
427
+ * Continuing followups: decision:block + reason only (never continue:false to keep going).
428
+ * loop:false hard-stop may use continue:false (Codex stop precedence).
429
+ * No StopFailure handler in this port — hook boundary fail-open.
430
+ */
431
+ export function handleStop(engine, payload, opts) {
432
+ const conversationId = sid(payload);
433
+ if (!conversationId)
434
+ return {};
435
+ const status = normalizeCodexStopStatus(payload, opts);
436
+ const transcriptRaw = payload.transcript_path ?? payload.transcriptPath;
437
+ const transcriptPath = typeof transcriptRaw === "string" && transcriptRaw.trim()
438
+ ? transcriptRaw.trim()
439
+ : undefined;
440
+ const action = engine.handleStop({
441
+ conversationId,
442
+ status,
443
+ loopCount: loopCountFromStopHookActive(payload),
444
+ transcriptPath,
445
+ platform: CODEX_PLATFORM,
446
+ });
447
+ if (!action?.message)
448
+ return {};
449
+ const reason = blockReason(action.message, "Autopilot followup");
450
+ if (!action.loop) {
451
+ return { continue: false, stopReason: reason };
452
+ }
453
+ return {
454
+ decision: "block",
455
+ reason,
456
+ };
457
+ }
458
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@autopilot-harness/port-codex",
3
+ "version": "0.3.0",
4
+ "description": "Autopilot harness host port for OpenAI Codex hooks",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/mt2007/autopilot-harness.git",
9
+ "directory": "packages/ports/codex"
10
+ },
11
+ "homepage": "https://github.com/mt2007/autopilot-harness#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/mt2007/autopilot-harness/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "dependencies": {
28
+ "@autopilot-harness/core": "0.3.0"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.8.2"
32
+ },
33
+ "engines": {
34
+ "node": ">=22"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "author": "mt2007 (https://github.com/mt2007)",
40
+ "keywords": [
41
+ "autopilot",
42
+ "harness",
43
+ "agent",
44
+ "ai",
45
+ "vibecoding",
46
+ "codex",
47
+ "openai",
48
+ "checklist",
49
+ "code-review"
50
+ ],
51
+ "scripts": {
52
+ "build": "tsc -p tsconfig.json",
53
+ "typecheck": "tsc -p tsconfig.json --noEmit"
54
+ }
55
+ }