@with-logic/elwood 0.1.1 → 0.1.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/CHANGELOG.md +17 -3
- package/CONTRIBUTING.md +104 -0
- package/README.md +23 -17
- package/SECURITY.md +42 -0
- package/dist/claude/model-picker.d.ts.map +1 -1
- package/dist/claude/model-picker.js +4 -3
- package/dist/claude/model-picker.js.map +1 -1
- package/dist/claude/model-switch-confirmation.js +9 -1
- package/dist/claude/model-switch-confirmation.js.map +1 -1
- package/dist/claude/screen-table.js +1 -1
- package/dist/claude/screen-table.js.map +1 -1
- package/dist/claude/session/build.d.ts.map +1 -1
- package/dist/claude/session/build.js +3 -0
- package/dist/claude/session/build.js.map +1 -1
- package/dist/claude/session/start-or-resume.js +1 -0
- package/dist/claude/session/start-or-resume.js.map +1 -1
- package/dist/cli/interactive/spawn.d.ts.map +1 -1
- package/dist/cli/interactive/spawn.js +30 -9
- package/dist/cli/interactive/spawn.js.map +1 -1
- package/dist/cli/models/index.d.ts.map +1 -1
- package/dist/cli/models/index.js +6 -3
- package/dist/cli/models/index.js.map +1 -1
- package/dist/cli/request/layers.d.ts +2 -0
- package/dist/cli/request/layers.d.ts.map +1 -1
- package/dist/cli/request/layers.js +9 -5
- package/dist/cli/request/layers.js.map +1 -1
- package/dist/cli/sessions/index.d.ts +9 -2
- package/dist/cli/sessions/index.d.ts.map +1 -1
- package/dist/cli/sessions/index.js +2 -6
- package/dist/cli/sessions/index.js.map +1 -1
- package/dist/cli/sessions/settings.d.ts +11 -0
- package/dist/cli/sessions/settings.d.ts.map +1 -0
- package/dist/cli/sessions/settings.js +26 -0
- package/dist/cli/sessions/settings.js.map +1 -0
- package/dist/codex/model-picker.d.ts.map +1 -1
- package/dist/codex/model-picker.js +3 -2
- package/dist/codex/model-picker.js.map +1 -1
- package/dist/codex/session/build.d.ts.map +1 -1
- package/dist/codex/session/build.js +5 -7
- package/dist/codex/session/build.js.map +1 -1
- package/dist/codex/session/start-or-resume.js +1 -0
- package/dist/codex/session/start-or-resume.js.map +1 -1
- package/dist/core/input/index.d.ts.map +1 -1
- package/dist/core/input/index.js +15 -3
- package/dist/core/input/index.js.map +1 -1
- package/dist/core/models/input.d.ts +3 -0
- package/dist/core/models/input.d.ts.map +1 -0
- package/dist/core/models/input.js +9 -0
- package/dist/core/models/input.js.map +1 -0
- package/dist/core/models/picker.d.ts +2 -1
- package/dist/core/models/picker.d.ts.map +1 -1
- package/dist/core/models/picker.js +6 -5
- package/dist/core/models/picker.js.map +1 -1
- package/dist/core/models/tui-screen.d.ts +1 -1
- package/dist/core/models/tui-screen.d.ts.map +1 -1
- package/dist/core/models/tui-screen.js +26 -3
- package/dist/core/models/tui-screen.js.map +1 -1
- package/dist/runtime/session/base.d.ts.map +1 -1
- package/dist/runtime/session/base.js +4 -1
- package/dist/runtime/session/base.js.map +1 -1
- package/dist/runtime/session/commands.d.ts +2 -1
- package/dist/runtime/session/commands.d.ts.map +1 -1
- package/dist/runtime/session/commands.js +10 -4
- package/dist/runtime/session/commands.js.map +1 -1
- package/dist/runtime/session/lifecycle.d.ts +3 -4
- package/dist/runtime/session/lifecycle.d.ts.map +1 -1
- package/dist/runtime/session/lifecycle.js +6 -5
- package/dist/runtime/session/lifecycle.js.map +1 -1
- package/dist/state/directories.d.ts +4 -0
- package/dist/state/directories.d.ts.map +1 -0
- package/dist/state/directories.js +41 -0
- package/dist/state/directories.js.map +1 -0
- package/dist/state/files.d.ts.map +1 -1
- package/dist/state/files.js +25 -11
- package/dist/state/files.js.map +1 -1
- package/dist/state/private-session.d.ts.map +1 -1
- package/dist/state/private-session.js +2 -0
- package/dist/state/private-session.js.map +1 -1
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +7 -1
- package/dist/state/store.js.map +1 -1
- package/docs/cli-behavior.md +1 -1
- package/docs/codex/cli.md +57 -0
- package/docs/codex/config.md +47 -0
- package/docs/codex/hooks.md +70 -0
- package/examples/README.md +56 -0
- package/examples/full.ts +113 -0
- package/examples/minimal.ts +15 -0
- package/examples/stream.ts +39 -0
- package/examples/support.ts +71 -0
- package/package.json +10 -5
- package/prd/01-overview.md +21 -0
- package/prd/02-goals.md +47 -0
- package/prd/03-terminology.md +32 -0
- package/prd/04-architecture.md +121 -0
- package/prd/05-api/5.1-starting-claude.md +108 -0
- package/prd/05-api/5.2-resuming-claude.md +86 -0
- package/prd/05-api/5.3-claude-session-api.md +658 -0
- package/prd/05-api/5.4-events.md +145 -0
- package/prd/05-api/5.5-starting-codex.md +106 -0
- package/prd/05-api/5.6-resuming-codex.md +48 -0
- package/prd/05-api/5.7-codex-session-api.md +425 -0
- package/prd/05-api/5.8-session-api.md +122 -0
- package/prd/05-api/5.9-loops.md +170 -0
- package/prd/05-api/README.md +19 -0
- package/prd/06-claude-hook-bridge.md +164 -0
- package/prd/07-claude-policy.md +15 -0
- package/prd/07a-codex-hook-bridge.md +76 -0
- package/prd/08-state.md +127 -0
- package/prd/09-lifecycle.md +222 -0
- package/prd/10-errors.md +55 -0
- package/prd/11-test-app.md +53 -0
- package/prd/12-e2e.md +23 -0
- package/prd/12a-cli.md +375 -0
- package/prd/13-latitude.md +12 -0
- package/prd/14-conformance.md +333 -0
- package/prd/15-open-notes.md +8 -0
- package/prd/README.md +45 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,eAAe,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,EAC7C,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAEF,4FAA4F;AAC5F,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAI1C,OAAO,CAAC,YAAY,CAA4B;gBAEpC,IAAI,EAAE,kBAAkB;IAIpC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3C,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC;IAInE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,OAAO,CAAC,EAAE;CAOX"}
|
|
@@ -33,11 +33,13 @@ export class CommandSurface {
|
|
|
33
33
|
return this.interrupting;
|
|
34
34
|
}
|
|
35
35
|
compact(options) {
|
|
36
|
-
const
|
|
36
|
+
const pending = new AbortController();
|
|
37
|
+
const submit = () => this.deps.submit(compactCommand, "compact", pending.signal);
|
|
37
38
|
const nudge = () => {
|
|
38
|
-
|
|
39
|
+
if (!this.deps.blocked())
|
|
40
|
+
ignoreInputFailure(this.deps.terminal.sendInput("\r"));
|
|
39
41
|
};
|
|
40
|
-
return sessionCompact(this.deps.statusEvents, submit, nudge, options?.timeoutMs);
|
|
42
|
+
return sessionCompact(this.deps.statusEvents, submit, nudge, options?.timeoutMs).finally(() => pending.abort());
|
|
41
43
|
}
|
|
42
44
|
listModels(options) {
|
|
43
45
|
return listPickerModels(this.io("list_models"), this.deps.picker(), pickerTimeout(options));
|
|
@@ -46,7 +48,11 @@ export class CommandSurface {
|
|
|
46
48
|
return setPickerModel(this.io("set_model"), this.deps.picker(), id, pickerTimeout(options));
|
|
47
49
|
}
|
|
48
50
|
io(kind) {
|
|
49
|
-
return {
|
|
51
|
+
return {
|
|
52
|
+
terminal: this.deps.terminal,
|
|
53
|
+
blocked: this.deps.blocked,
|
|
54
|
+
submit: (c, signal) => this.deps.submit(c, kind, signal),
|
|
55
|
+
};
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
//# sourceMappingURL=commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/runtime/session/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,gBAAgB,EAGhB,aAAa,EACb,cAAc,GACf,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/runtime/session/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* loop/reap/shutdown wiring, record persistence, and the not-running guard every operation runs
|
|
3
|
-
* behind. Implements PRD §5.3, §5.7, §8.2, and §9.4. The caller-facing send/loop/command methods
|
|
4
|
-
* layer on top of this in `base.ts`. */
|
|
1
|
+
/** Session lifetime, input blocking, persistence and cleanup (PRD §5/§8/§9). */
|
|
5
2
|
import type { ElwoodAgentKind } from "../../core/activity/index.ts";
|
|
6
3
|
import { ControlQueue } from "../../core/control-queue/index.ts";
|
|
7
4
|
import type { TerminalReplayBuffer } from "../../core/terminal-replay.ts";
|
|
@@ -23,6 +20,7 @@ export declare abstract class SessionLifecycle {
|
|
|
23
20
|
protected readonly loops: SessionLoops;
|
|
24
21
|
protected readonly controlQueue: ControlQueue;
|
|
25
22
|
protected everReady: boolean;
|
|
23
|
+
inputBlocking: boolean;
|
|
26
24
|
private readonly agent;
|
|
27
25
|
private readonly runtime;
|
|
28
26
|
private readonly reapPolicy;
|
|
@@ -40,6 +38,7 @@ export declare abstract class SessionLifecycle {
|
|
|
40
38
|
teardown(): Promise<void>;
|
|
41
39
|
startLoops(): void;
|
|
42
40
|
pauseLoopsForStartupCleanup(cancelReadiness: () => void): void;
|
|
41
|
+
protected isInputBlocked(): boolean;
|
|
43
42
|
submitEvidence(kind: StatusEvidenceKind): StatusDecision;
|
|
44
43
|
submitExit(): StatusDecision;
|
|
45
44
|
statusDecisions(): readonly StatusDecision[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/lifecycle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/runtime/session/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* loop/reap/shutdown wiring, record persistence, and the not-running guard every operation runs
|
|
3
|
-
* behind. Implements PRD §5.3, §5.7, §8.2, and §9.4. The caller-facing send/loop/command methods
|
|
4
|
-
* layer on top of this in `base.ts`. */
|
|
1
|
+
/** Session lifetime, input blocking, persistence and cleanup (PRD §5/§8/§9). */
|
|
5
2
|
import { ControlQueue } from "../../core/control-queue/index.js";
|
|
6
3
|
import { elwoodError, toError } from "../../core/errors.js";
|
|
7
4
|
import { writeQueuedInput } from "../../core/input/index.js";
|
|
@@ -25,6 +22,7 @@ export class SessionLifecycle {
|
|
|
25
22
|
loops;
|
|
26
23
|
controlQueue;
|
|
27
24
|
everReady = false;
|
|
25
|
+
inputBlocking = false;
|
|
28
26
|
agent;
|
|
29
27
|
runtime;
|
|
30
28
|
reapPolicy;
|
|
@@ -35,7 +33,7 @@ export class SessionLifecycle {
|
|
|
35
33
|
pasteGuard = {
|
|
36
34
|
snapshot: () => this.terminal.snapshot().text,
|
|
37
35
|
staged: (screen, prompt) => this.stagedPaste(screen, prompt),
|
|
38
|
-
blocked: () => this.
|
|
36
|
+
blocked: () => this.isInputBlocked(),
|
|
39
37
|
};
|
|
40
38
|
constructor(agent, record, stateDir, runtime, pty, terminal, statusEvents, terminalReplay, loopDefinitions) {
|
|
41
39
|
registerPrivateOutputSecrets(this, [runtime.bridgeToken]);
|
|
@@ -105,6 +103,9 @@ export class SessionLifecycle {
|
|
|
105
103
|
cancelReadiness();
|
|
106
104
|
this.loops.pause();
|
|
107
105
|
}
|
|
106
|
+
isInputBlocked() {
|
|
107
|
+
return this.inputBlocking || this.status === "blocked";
|
|
108
|
+
}
|
|
108
109
|
submitEvidence(kind) {
|
|
109
110
|
return this.statusEngine.submit(kind);
|
|
110
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/runtime/session/lifecycle.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/runtime/session/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Reject planted ancestors too, while allowing root-owned OS aliases such as /tmp. */
|
|
2
|
+
export declare function assertStatePath(path: string): void;
|
|
3
|
+
export declare function makeStateDirectory(path: string, mode: number): void;
|
|
4
|
+
//# sourceMappingURL=directories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directories.d.ts","sourceRoot":"","sources":["../../src/state/directories.ts"],"names":[],"mappings":"AAaA,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBlD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBnE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** No-follow state directory creation and ownership checks (PRD §8.1/§8.2). */
|
|
2
|
+
import { closeSync, constants, fchmodSync, fstatSync, lstatSync, mkdirSync, openSync, } from "node:fs";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { elwoodError, errnoCode } from "../core/errors.js";
|
|
5
|
+
/** Reject planted ancestors too, while allowing root-owned OS aliases such as /tmp. */
|
|
6
|
+
export function assertStatePath(path) {
|
|
7
|
+
const leaf = resolve(path);
|
|
8
|
+
let current = leaf;
|
|
9
|
+
while (true) {
|
|
10
|
+
try {
|
|
11
|
+
const info = lstatSync(current);
|
|
12
|
+
if (info.isSymbolicLink() && (current === leaf || info.uid !== 0)) {
|
|
13
|
+
throw elwoodError("state_corrupt", `State path must not follow a symlink: ${current}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (errnoCode(error) !== "ENOENT")
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
const parent = dirname(current);
|
|
21
|
+
if (parent === current)
|
|
22
|
+
return;
|
|
23
|
+
current = parent;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function makeStateDirectory(path, mode) {
|
|
27
|
+
assertStatePath(path);
|
|
28
|
+
mkdirSync(path, { recursive: true, mode });
|
|
29
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
30
|
+
try {
|
|
31
|
+
const info = fstatSync(fd);
|
|
32
|
+
if (!info.isDirectory() || info.uid !== process.getuid?.()) {
|
|
33
|
+
throw elwoodError("state_corrupt", `State directory must be owned by the current user: ${path}`);
|
|
34
|
+
}
|
|
35
|
+
fchmodSync(fd, mode);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
closeSync(fd);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=directories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directories.js","sourceRoot":"","sources":["../../src/state/directories.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE3D,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,WAAW,CAAC,eAAe,EAAE,yCAAyC,OAAO,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACjD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO;QAC/B,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY;IAC3D,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAC7F,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YAC3D,MAAM,WAAW,CACf,eAAe,EACf,sDAAsD,IAAI,EAAE,CAC7D,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/state/files.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/state/files.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAInE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGpE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAsB1E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ3C"}
|
package/dist/state/files.js
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* Implements PRD §6.2 and §8.2.
|
|
4
4
|
*/
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
|
-
import {
|
|
6
|
+
import { closeSync, constants, existsSync, fchmodSync, fstatSync, fsyncSync, ftruncateSync, openSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
7
7
|
import { dirname, join, resolve } from "node:path";
|
|
8
8
|
import { elwoodError } from "../core/errors.js";
|
|
9
|
+
import { assertStatePath, makeStateDirectory } from "./directories.js";
|
|
9
10
|
export function newBridgeToken() {
|
|
10
11
|
return randomUUID();
|
|
11
12
|
}
|
|
@@ -20,22 +21,18 @@ export function safeSessionDir(stateDir, id) {
|
|
|
20
21
|
return join(root, "sessions", id);
|
|
21
22
|
}
|
|
22
23
|
export function secureMkdir(path) {
|
|
23
|
-
|
|
24
|
-
chmodSync(path, 0o700);
|
|
24
|
+
makeStateDirectory(path, 0o700);
|
|
25
25
|
}
|
|
26
26
|
export function sharedMkdir(path) {
|
|
27
|
-
|
|
28
|
-
chmodSync(path, 0o755);
|
|
27
|
+
makeStateDirectory(path, 0o755);
|
|
29
28
|
}
|
|
30
29
|
export function writeSharedFile(path, content) {
|
|
31
30
|
sharedMkdir(dirname(path));
|
|
32
|
-
|
|
33
|
-
chmodSync(path, 0o644);
|
|
31
|
+
writeStateFile(path, content, 0o644);
|
|
34
32
|
}
|
|
35
33
|
export function writePrivateFile(path, content) {
|
|
36
34
|
secureMkdir(dirname(path));
|
|
37
|
-
|
|
38
|
-
chmodSync(path, 0o600);
|
|
35
|
+
writeStateFile(path, content, 0o600);
|
|
39
36
|
}
|
|
40
37
|
/**
|
|
41
38
|
* Rename-atomic, fsync-backed private write (§8.2). The temp name carries a random
|
|
@@ -47,9 +44,10 @@ export function writePrivateFileAtomic(path, content) {
|
|
|
47
44
|
secureMkdir(dirname(path));
|
|
48
45
|
const tmp = `${path}.tmp-${process.pid}-${randomUUID().slice(0, 8)}`;
|
|
49
46
|
try {
|
|
50
|
-
const fd = openSync(tmp,
|
|
47
|
+
const fd = openSync(tmp, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
51
48
|
try {
|
|
52
49
|
writeFileSync(fd, content);
|
|
50
|
+
fchmodSync(fd, 0o600);
|
|
53
51
|
fsyncSync(fd);
|
|
54
52
|
}
|
|
55
53
|
finally {
|
|
@@ -61,7 +59,6 @@ export function writePrivateFileAtomic(path, content) {
|
|
|
61
59
|
rmSync(tmp, { force: true });
|
|
62
60
|
throw error;
|
|
63
61
|
}
|
|
64
|
-
chmodSync(path, 0o600);
|
|
65
62
|
fsyncDir(dirname(path));
|
|
66
63
|
}
|
|
67
64
|
export function fsyncDir(path) {
|
|
@@ -75,4 +72,21 @@ export function fsyncDir(path) {
|
|
|
75
72
|
closeSync(fd);
|
|
76
73
|
}
|
|
77
74
|
}
|
|
75
|
+
/** Validate before truncation; no-follow also rejects a planted leaf link. */
|
|
76
|
+
function writeStateFile(path, content, mode) {
|
|
77
|
+
assertStatePath(path);
|
|
78
|
+
const fd = openSync(path, constants.O_WRONLY | constants.O_CREAT | constants.O_NOFOLLOW | constants.O_NONBLOCK, mode);
|
|
79
|
+
try {
|
|
80
|
+
const info = fstatSync(fd);
|
|
81
|
+
if (!info.isFile() || info.uid !== process.getuid?.() || info.nlink !== 1) {
|
|
82
|
+
throw elwoodError("state_corrupt", `State file must be an owned, single-link regular file: ${path}`);
|
|
83
|
+
}
|
|
84
|
+
fchmodSync(fd, mode);
|
|
85
|
+
ftruncateSync(fd, 0);
|
|
86
|
+
writeFileSync(fd, content);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
closeSync(fd);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
78
92
|
//# sourceMappingURL=files.js.map
|
package/dist/state/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/state/files.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,UAAU,EACV,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/state/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private-session.d.ts","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"private-session.d.ts","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC;AAErC,sFAAsF;AACtF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,YAAyC,GAC/C,IAAI,CAIN;AAiBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,YAAyC,GAC/C,aAAa,CAsBf;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,QAAQ,GAAG,OAAO,GAC1B,IAAI,CAMN"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { closeSync, constants, fstatSync, lstatSync, mkdirSync, openSync, } from "node:fs";
|
|
6
6
|
import { join, resolve } from "node:path";
|
|
7
7
|
import { ElwoodError, elwoodError, errnoCode } from "../core/errors.js";
|
|
8
|
+
import { assertStatePath } from "./directories.js";
|
|
8
9
|
import { assertSessionId, safeSessionDir } from "./files.js";
|
|
9
10
|
import { sessionSocketHome } from "./socket-home.js";
|
|
10
11
|
import { readSessionRecord, removeSessionFiles } from "./store.js";
|
|
@@ -17,6 +18,7 @@ export function ensurePrivateStateRoot(stateDir, owner = { uid: process.getuid()
|
|
|
17
18
|
function ensurePrivateDirectory(path, owner) {
|
|
18
19
|
let fd;
|
|
19
20
|
try {
|
|
21
|
+
assertStatePath(path);
|
|
20
22
|
mkdirSync(path, { recursive: true, mode: 0o700 });
|
|
21
23
|
fd = openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
22
24
|
assertPrivateDirectory(fstatSync(fd), owner);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private-session.js","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"private-session.js","sourceRoot":"","sources":["../../src/state/private-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EACL,cAAc,EAKf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAoB,KAAK,SAAS,EAAmB,MAAM,mBAAmB,CAAC;AAItF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;CAClD,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,CAAC;AAExC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACvC,GAAG,aAAa,CAUhB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,IAAI,CAcN;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAElF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,SAAS,GAAG,SAA8B,GAChD,aAAa,CAcf;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC3B,QAAQ,EAAE,MAAM,GACf,aAAa,CAEf;AAED,qFAAqF;AACrF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI,CAkBvE"}
|
package/dist/state/store.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { existsSync, rmSync } from "node:fs";
|
|
9
9
|
import { join, resolve } from "node:path";
|
|
10
10
|
import { elwoodError, toError } from "../core/errors.js";
|
|
11
|
+
import { assertStatePath } from "./directories.js";
|
|
11
12
|
import { safeSessionDir, secureMkdir, sharedMkdir, writePrivateFileAtomic, writeSharedFile, } from "./files.js";
|
|
12
13
|
import { currentFileOwner, readPrivateFile } from "./private-read.js";
|
|
13
14
|
import { removeSocketHome } from "./socket-home.js";
|
|
@@ -29,6 +30,8 @@ export function createSessionRecord(input) {
|
|
|
29
30
|
}
|
|
30
31
|
export function prepareStateDir(stateDir, options = {}) {
|
|
31
32
|
const root = resolve(stateDir);
|
|
33
|
+
assertStatePath(root);
|
|
34
|
+
assertStatePath(join(root, "sessions"));
|
|
32
35
|
if (options.gitignore === true) {
|
|
33
36
|
sharedMkdir(root);
|
|
34
37
|
}
|
|
@@ -79,7 +82,10 @@ export function removeSessionFiles(input) {
|
|
|
79
82
|
// both ran, so teardown removes everything it can and still surfaces the fault.
|
|
80
83
|
let firstError;
|
|
81
84
|
firstError = tryRemove(() => removeSocketHome(input.socketHome), firstError);
|
|
82
|
-
firstError = tryRemove(() =>
|
|
85
|
+
firstError = tryRemove(() => {
|
|
86
|
+
assertStatePath(dir);
|
|
87
|
+
rmSync(dir, { recursive: true, force: true });
|
|
88
|
+
}, firstError);
|
|
83
89
|
if (firstError !== undefined) {
|
|
84
90
|
throw elwoodError("teardown_failed", "Could not remove Elwood session files.", {
|
|
85
91
|
cause: firstError instanceof Error ? firstError.message : String(firstError),
|
package/dist/state/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"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"}
|
package/docs/cli-behavior.md
CHANGED
|
@@ -17,7 +17,7 @@ sources are:
|
|
|
17
17
|
|
|
18
18
|
Each fact below was verified against a real CLI (versions noted where relevant).
|
|
19
19
|
When a fact drives an implementation decision, the code and the matching PRD
|
|
20
|
-
conformance criterion are cited. If you change behavior here, update `
|
|
20
|
+
conformance criterion are cited. If you change behavior here, update `prd/`
|
|
21
21
|
first (see `CLAUDE.md` / `AGENTS.md`), then this file.
|
|
22
22
|
|
|
23
23
|
## Readiness
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Codex CLI Notes
|
|
2
|
+
|
|
3
|
+
Sources researched:
|
|
4
|
+
|
|
5
|
+
- https://developers.openai.com/codex/cli/features
|
|
6
|
+
- https://developers.openai.com/codex/cli/reference
|
|
7
|
+
- local `codex --help` and `codex --version` output
|
|
8
|
+
|
|
9
|
+
## Interactive Mode
|
|
10
|
+
|
|
11
|
+
`codex` launches an interactive full-screen terminal UI. That is the mode Elwood
|
|
12
|
+
must wrap. The parent app should control Codex through PTY input and observe it
|
|
13
|
+
through hooks, not through `codex exec`, the SDK, or app-server APIs.
|
|
14
|
+
|
|
15
|
+
Codex accepts an optional initial prompt, but Elwood starts without one by
|
|
16
|
+
default and sends prompts later through the terminal input path.
|
|
17
|
+
|
|
18
|
+
Useful CLI capabilities for Elwood:
|
|
19
|
+
|
|
20
|
+
- `codex` starts a new interactive session.
|
|
21
|
+
- `codex resume <SESSION_ID>` resumes a specific interactive session.
|
|
22
|
+
- `codex resume --last` resumes the most recent interactive session for the
|
|
23
|
+
current working directory.
|
|
24
|
+
- `--cd <DIR>` tells Codex which project root to use.
|
|
25
|
+
- `--config key=value` applies one-off TOML configuration overrides.
|
|
26
|
+
- `--model <MODEL>`, `--profile <NAME>`, `--sandbox <MODE>`, and
|
|
27
|
+
`--ask-for-approval <POLICY>` map naturally to adapter launch options.
|
|
28
|
+
- Some Codex versions expose `--dangerously-bypass-hook-trust`, which lets
|
|
29
|
+
generated Elwood hooks run for one invocation without requiring a persisted
|
|
30
|
+
trust prompt. Elwood must detect support before passing it because other Codex
|
|
31
|
+
versions reject unknown flags. Detection is cached for the lifetime of the
|
|
32
|
+
Elwood process.
|
|
33
|
+
- Codex can also render interactive trust and update prompts before the session
|
|
34
|
+
is usable. Elwood should select `Trust all and continue` for hook prompts, and
|
|
35
|
+
skip TUI update prompts because API-level `autoupdate` runs `codex update`
|
|
36
|
+
before launch when requested. Detection should use Elwood's headless xterm.js
|
|
37
|
+
screen snapshot, not raw ANSI/PTY byte parsing.
|
|
38
|
+
- Codex may print non-fatal environment warnings before the session is ready,
|
|
39
|
+
such as MCP servers that are not logged in. Elwood should preserve raw
|
|
40
|
+
terminal output and also project recognized warnings into typed `warning`
|
|
41
|
+
events with remediation commands.
|
|
42
|
+
|
|
43
|
+
## Resume Implications
|
|
44
|
+
|
|
45
|
+
Codex stores transcripts locally under Codex-owned state. Elwood should persist
|
|
46
|
+
only the Codex session id needed to call `codex resume <SESSION_ID>`. If that id
|
|
47
|
+
has not arrived through hooks yet, Elwood fails with `resume_unavailable`.
|
|
48
|
+
Elwood must not silently fall back to `codex resume --last` because that can
|
|
49
|
+
attach the caller's Elwood session id to the wrong Codex conversation. A future
|
|
50
|
+
API may add an explicit opt-in fallback, but it is not part of the current
|
|
51
|
+
contract.
|
|
52
|
+
|
|
53
|
+
## Shell Implications
|
|
54
|
+
|
|
55
|
+
The process should still be launched from the user's normal interactive login
|
|
56
|
+
shell so `codex` resolution, auth environment, and user shell startup behavior
|
|
57
|
+
match opening Terminal.app manually.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Codex Configuration Notes
|
|
2
|
+
|
|
3
|
+
Sources researched:
|
|
4
|
+
|
|
5
|
+
- https://developers.openai.com/codex/config-basic
|
|
6
|
+
- https://developers.openai.com/codex/config-advanced
|
|
7
|
+
- https://developers.openai.com/codex/config-reference
|
|
8
|
+
- https://developers.openai.com/codex/hooks
|
|
9
|
+
|
|
10
|
+
## Layers
|
|
11
|
+
|
|
12
|
+
Codex reads configuration from CLI flags and `--config` overrides first, then
|
|
13
|
+
profiles, trusted project `.codex/config.toml` files, user config, system config,
|
|
14
|
+
and built-in defaults.
|
|
15
|
+
|
|
16
|
+
Project-local `.codex` layers are only loaded when Codex trusts the project.
|
|
17
|
+
Because Elwood should be minimally invasive, it should not edit user or project
|
|
18
|
+
Codex config by default.
|
|
19
|
+
|
|
20
|
+
## Elwood Strategy
|
|
21
|
+
|
|
22
|
+
Elwood should generate session-scoped hook bridge files under `.elwood/` and
|
|
23
|
+
inject Codex hook configuration through `--config` one-off overrides. This keeps
|
|
24
|
+
existing `.codex/config.toml` and `~/.codex/config.toml` intact while still
|
|
25
|
+
letting Codex merge user defaults and policies normally.
|
|
26
|
+
Elwood applies `hookTrust="trust-all"` after caller overrides so parent apps
|
|
27
|
+
cannot accidentally create an unusable wrapper session.
|
|
28
|
+
|
|
29
|
+
The generated command should enable or configure:
|
|
30
|
+
|
|
31
|
+
- hooks for every supported Codex hook event;
|
|
32
|
+
- the bridge command and timeout for each event;
|
|
33
|
+
- `hookTrust="trust-all"`, because Elwood cannot observe or control Codex
|
|
34
|
+
without trusted hooks;
|
|
35
|
+
- optional launch policy such as model, profile, sandbox, approval policy, and
|
|
36
|
+
caller-supplied raw config overrides;
|
|
37
|
+
- `--dangerously-bypass-hook-trust` when the installed Codex CLI advertises it,
|
|
38
|
+
because the generated hooks are ephemeral Elwood-owned bridge commands. Elwood
|
|
39
|
+
must omit this flag for Codex versions that do not support it.
|
|
40
|
+
|
|
41
|
+
If Codex still renders a `Hooks need review` TUI prompt, Elwood should select
|
|
42
|
+
`Trust all and continue` through the headless xterm.js input path so the session
|
|
43
|
+
is usable headlessly.
|
|
44
|
+
|
|
45
|
+
If a managed Codex requirement disallows unmanaged hooks, Codex may ignore or
|
|
46
|
+
reject Elwood hook config. Elwood should surface startup/bridge failures through
|
|
47
|
+
typed errors where possible and hook runtime failures through `hookError`.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Codex Hooks Notes
|
|
2
|
+
|
|
3
|
+
Sources researched:
|
|
4
|
+
|
|
5
|
+
- https://developers.openai.com/codex/hooks
|
|
6
|
+
- https://github.com/openai/codex/tree/main/docs
|
|
7
|
+
- local `codex features list` output
|
|
8
|
+
|
|
9
|
+
## Events
|
|
10
|
+
|
|
11
|
+
The current documented Codex hook events relevant to Elwood are:
|
|
12
|
+
|
|
13
|
+
- `SessionStart`
|
|
14
|
+
- `SubagentStart`
|
|
15
|
+
- `PreToolUse`
|
|
16
|
+
- `PermissionRequest`
|
|
17
|
+
- `PostToolUse`
|
|
18
|
+
- `PreCompact`
|
|
19
|
+
- `PostCompact`
|
|
20
|
+
- `UserPromptSubmit`
|
|
21
|
+
- `SubagentStop`
|
|
22
|
+
- `Stop`
|
|
23
|
+
|
|
24
|
+
`SessionStart`, `PreToolUse`, `PermissionRequest`, `PostToolUse`,
|
|
25
|
+
`UserPromptSubmit`, `SubagentStart`, `SubagentStop`, and `Stop` include a Codex
|
|
26
|
+
permission mode field. Turn-scoped hooks include `turn_id`.
|
|
27
|
+
|
|
28
|
+
## Matchers
|
|
29
|
+
|
|
30
|
+
Hook matchers are regex strings. Tool hooks match `tool_name`; compaction hooks
|
|
31
|
+
match `manual` or `auto`; `SessionStart` matches the source such as startup or
|
|
32
|
+
resume; subagent hooks match agent type. `UserPromptSubmit` and `Stop` currently
|
|
33
|
+
ignore matchers.
|
|
34
|
+
|
|
35
|
+
For file edits, Codex reports the canonical tool name `apply_patch`, while
|
|
36
|
+
matchers may also use `Edit` or `Write`.
|
|
37
|
+
|
|
38
|
+
Tool hooks currently cover `Bash`, `apply_patch`, and MCP tool calls. They do
|
|
39
|
+
not cover every TUI-visible activity. In particular, Codex docs state that web
|
|
40
|
+
search and other non-shell/non-MCP tool calls do not trigger `PreToolUse` or
|
|
41
|
+
`PostToolUse` today. Reasoning/status lines shown in the TUI are also not hook
|
|
42
|
+
events.
|
|
43
|
+
|
|
44
|
+
Elwood therefore treats hooks as the control/approval path and uses live-only
|
|
45
|
+
transcript observation as a secondary rendering path for parent apps that need
|
|
46
|
+
to display reasoning phases, web search calls, assistant messages, and other
|
|
47
|
+
Codex-visible activity.
|
|
48
|
+
|
|
49
|
+
## Response Model
|
|
50
|
+
|
|
51
|
+
No output with exit code `0` means no decision and Codex continues.
|
|
52
|
+
|
|
53
|
+
Codex accepts event-specific JSON output. Important shapes for Elwood:
|
|
54
|
+
|
|
55
|
+
- `PreToolUse` can deny a supported tool call with `permissionDecision: "deny"`
|
|
56
|
+
and a reason, add additional context, or allow a rewritten tool input.
|
|
57
|
+
- `PermissionRequest` can decide `allow` or `deny` with `{ hookSpecificOutput:
|
|
58
|
+
{ hookEventName, decision: { behavior, message? } } }`. It must not return
|
|
59
|
+
updated input or permission edits.
|
|
60
|
+
- `Stop` and `SubagentStop` can return `decision: "block"` with a reason to ask
|
|
61
|
+
Codex to continue instead of marking the turn done.
|
|
62
|
+
- `PostToolUse`, `UserPromptSubmit`, `SubagentStart`, `PreCompact`, and
|
|
63
|
+
`PostCompact` are observe-only in Elwood until Codex documents a stable
|
|
64
|
+
response contract for them.
|
|
65
|
+
|
|
66
|
+
Elwood should fail open when parent handlers are missing, time out, throw, or
|
|
67
|
+
return an invalid response for the event.
|
|
68
|
+
|
|
69
|
+
Handlers should return `undefined` for no decision. Empty objects are invalid so
|
|
70
|
+
accidentally empty responses surface as `hookError` and fail open.
|