@dzhechkov/harness-core 0.4.5 → 0.5.1
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/.dz-manifest.json +489 -105
- package/README.md +116 -5
- package/dist/agents-policy.d.ts +67 -0
- package/dist/agents-policy.d.ts.map +1 -0
- package/dist/agents-policy.js +258 -0
- package/dist/agents-policy.js.map +1 -0
- package/dist/codex-hooks-assets.d.ts +47 -0
- package/dist/codex-hooks-assets.d.ts.map +1 -0
- package/dist/codex-hooks-assets.js +324 -0
- package/dist/codex-hooks-assets.js.map +1 -0
- package/dist/codex-hooks-verify.d.ts +95 -0
- package/dist/codex-hooks-verify.d.ts.map +1 -0
- package/dist/codex-hooks-verify.js +169 -0
- package/dist/codex-hooks-verify.js.map +1 -0
- package/dist/codex-hooks.d.ts +341 -0
- package/dist/codex-hooks.d.ts.map +1 -0
- package/dist/codex-hooks.js +541 -0
- package/dist/codex-hooks.js.map +1 -0
- package/dist/discrimination-gate.d.ts +88 -15
- package/dist/discrimination-gate.d.ts.map +1 -1
- package/dist/discrimination-gate.js +343 -51
- package/dist/discrimination-gate.js.map +1 -1
- package/dist/feature-adr-checkpoints.d.ts +22 -0
- package/dist/feature-adr-checkpoints.d.ts.map +1 -1
- package/dist/feature-adr-checkpoints.js +42 -0
- package/dist/feature-adr-checkpoints.js.map +1 -1
- package/dist/feature-adr-routing.d.ts +218 -5
- package/dist/feature-adr-routing.d.ts.map +1 -1
- package/dist/feature-adr-routing.js +583 -54
- package/dist/feature-adr-routing.js.map +1 -1
- package/dist/guard.d.ts +13 -0
- package/dist/guard.d.ts.map +1 -1
- package/dist/guard.js +25 -1
- package/dist/guard.js.map +1 -1
- package/dist/index.d.ts +23 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -4
- package/dist/index.js.map +1 -1
- package/dist/loop-blobs.generated.d.ts +1 -1
- package/dist/loop-blobs.generated.d.ts.map +1 -1
- package/dist/loop-blobs.generated.js +12 -3
- package/dist/loop-blobs.generated.js.map +1 -1
- package/dist/loop-plan.d.ts +70 -0
- package/dist/loop-plan.d.ts.map +1 -1
- package/dist/loop-plan.js +103 -0
- package/dist/loop-plan.js.map +1 -1
- package/dist/loop-render.d.ts.map +1 -1
- package/dist/loop-render.js +37 -129
- package/dist/loop-render.js.map +1 -1
- package/dist/loop-run-semantics.d.ts +130 -0
- package/dist/loop-run-semantics.d.ts.map +1 -0
- package/dist/loop-run-semantics.js +257 -0
- package/dist/loop-run-semantics.js.map +1 -0
- package/dist/loop-trace.d.ts +31 -2
- package/dist/loop-trace.d.ts.map +1 -1
- package/dist/loop-trace.js +89 -12
- package/dist/loop-trace.js.map +1 -1
- package/dist/managed-hooks.d.ts +86 -0
- package/dist/managed-hooks.d.ts.map +1 -0
- package/dist/managed-hooks.js +101 -0
- package/dist/managed-hooks.js.map +1 -0
- package/dist/mutation-gate.d.ts +14 -0
- package/dist/mutation-gate.d.ts.map +1 -1
- package/dist/mutation-gate.js +25 -2
- package/dist/mutation-gate.js.map +1 -1
- package/dist/named-lock.d.ts +57 -0
- package/dist/named-lock.d.ts.map +1 -0
- package/dist/named-lock.js +247 -0
- package/dist/named-lock.js.map +1 -0
- package/dist/operations.d.ts +229 -0
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +880 -26
- package/dist/operations.js.map +1 -1
- package/dist/parity.d.ts +106 -1
- package/dist/parity.d.ts.map +1 -1
- package/dist/parity.js +209 -5
- package/dist/parity.js.map +1 -1
- package/dist/qe-bridge.d.ts +291 -0
- package/dist/qe-bridge.d.ts.map +1 -0
- package/dist/qe-bridge.js +538 -0
- package/dist/qe-bridge.js.map +1 -0
- package/dist/recall-usage.d.ts +53 -0
- package/dist/recall-usage.d.ts.map +1 -1
- package/dist/recall-usage.js +125 -2
- package/dist/recall-usage.js.map +1 -1
- package/dist/score.d.ts.map +1 -1
- package/dist/score.js +43 -9
- package/dist/score.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +14 -26
- package/dist/setup.js.map +1 -1
- package/dist/shell-veto-policy.d.ts +53 -0
- package/dist/shell-veto-policy.d.ts.map +1 -0
- package/dist/shell-veto-policy.js +103 -0
- package/dist/shell-veto-policy.js.map +1 -0
- package/dist/skills.d.ts +86 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +116 -1
- package/dist/skills.js.map +1 -1
- package/dist/targets.d.ts +75 -0
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +160 -0
- package/dist/targets.js.map +1 -1
- package/dist/workflow-run-dispatch.d.ts +230 -0
- package/dist/workflow-run-dispatch.d.ts.map +1 -0
- package/dist/workflow-run-dispatch.js +363 -0
- package/dist/workflow-run-dispatch.js.map +1 -0
- package/dist/workflow-run.d.ts +498 -0
- package/dist/workflow-run.d.ts.map +1 -0
- package/dist/workflow-run.js +1359 -0
- package/dist/workflow-run.js.map +1 -0
- package/package.json +6 -5
- package/sbom.json +1099 -139
- package/src/agents-policy.ts +338 -0
- package/src/codex-hooks-assets.ts +328 -0
- package/src/codex-hooks-verify.ts +237 -0
- package/src/codex-hooks.ts +723 -0
- package/src/discrimination-gate.ts +456 -58
- package/src/feature-adr-checkpoints.ts +38 -0
- package/src/feature-adr-routing.ts +697 -75
- package/src/guard.ts +36 -1
- package/src/index.ts +162 -2
- package/src/loop-blobs.generated.ts +12 -3
- package/src/loop-plan.ts +185 -0
- package/src/loop-render.ts +37 -127
- package/src/loop-run-semantics.ts +278 -0
- package/src/loop-trace.ts +84 -10
- package/src/managed-hooks.ts +150 -0
- package/src/mutation-gate.ts +24 -2
- package/src/named-lock.ts +277 -0
- package/src/operations.ts +1121 -29
- package/src/parity.ts +295 -6
- package/src/qe-bridge.ts +737 -0
- package/src/recall-usage.ts +184 -1
- package/src/score.ts +50 -9
- package/src/setup.ts +26 -27
- package/src/shell-veto-policy.ts +119 -0
- package/src/skills.ts +174 -1
- package/src/targets.ts +189 -0
- package/src/workflow-run-dispatch.ts +459 -0
- package/src/workflow-run.ts +1743 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Codex hook registry model (`crossrt-2-codex-hooks`, ADR-001).
|
|
3
|
+
*
|
|
4
|
+
* Pure: paths, the managed entry set, sha-based attribution, the manifest, drift, and the TOML text
|
|
5
|
+
* of a trust block. Every filesystem and process action lives in `operations.ts`.
|
|
6
|
+
*
|
|
7
|
+
* ## Measured facts this module encodes (M0 spike, codex-cli 0.147.0 — see
|
|
8
|
+
* `features/crossrt-2-codex-hooks/07_code_changes/probe-results/spike-arming.md`)
|
|
9
|
+
*
|
|
10
|
+
* - `$CODEX_HOME/hooks.json` is the user registry and **`CODEX_HOME` relocates discovery**, which is
|
|
11
|
+
* what makes every automated probe hermetic (G-H). `$CODEX_HOME/hooks/hooks.json` is the PLUGIN
|
|
12
|
+
* bundle layout and does not fire.
|
|
13
|
+
* - Entries are trust-gated. An untrusted entry is silently not run. Trust is persisted per entry in
|
|
14
|
+
* `$CODEX_HOME/config.toml` as `[hooks.state."<key>"] trusted_hash = "<currentHash>"`, and both
|
|
15
|
+
* `key` and `currentHash` come from the runtime's own `hooks/list` RPC — they are **read, never
|
|
16
|
+
* computed**, because `currentHash`'s preimage is internal to codex.
|
|
17
|
+
* - `timeout` is in SECONDS and IS honored (600 → 5, MEASURED). `timeoutSec` in an entry is
|
|
18
|
+
* **silently ignored** and leaves the 600 s default in place — which is why this module emits
|
|
19
|
+
* `timeout` and a test pins the key set (AM-15, now probe-proven by spike S2).
|
|
20
|
+
* - The hook runner spawns via `$SHELL -lc`, so the emitted command is a SHELL string: the
|
|
21
|
+
* interpreter is an absolute `process.execPath` and both paths are single-quoted (AM-32/AM-35d).
|
|
22
|
+
*
|
|
23
|
+
* @packageDocumentation
|
|
24
|
+
*/
|
|
25
|
+
import { createHash } from 'node:crypto';
|
|
26
|
+
import { join } from 'node:path';
|
|
27
|
+
import { mergeManagedHookEntries } from './managed-hooks.js';
|
|
28
|
+
/**
|
|
29
|
+
* Bump when a helper BODY changes: a changed body changes codex's `currentHash` ⇒ re-trust.
|
|
30
|
+
*
|
|
31
|
+
* 2 — the independent-QE fix round: the veto note stopped persisting the raw command line and the
|
|
32
|
+
* notes log/dir modes are now enforced on every write (finding 8).
|
|
33
|
+
* 3 — fix round 2: the note's `commandSynopsis` is a binary NAME or `(redacted)` — an
|
|
34
|
+
* env-assignment first token (`SECRET=xyz ssh …`) carried the credential the redaction removed
|
|
35
|
+
* everywhere else (R2-8).
|
|
36
|
+
*/
|
|
37
|
+
export const DZ_HOOK_HELPER_VERSION = 3;
|
|
38
|
+
/** Seconds. Probe-proven (spike S2): `timeout` is honored, the unset default is 600 s. */
|
|
39
|
+
export const DZ_HOOK_TIMEOUT_SECONDS = 5;
|
|
40
|
+
/** The wide matcher (AM-8). Narrowing needs a recorded live probe; the guard keys on the payload. */
|
|
41
|
+
export const DZ_VETO_MATCHER = 'Bash|shell|local_shell';
|
|
42
|
+
/** Every path this leg touches, all `CODEX_HOME`-relative (AM-13). */
|
|
43
|
+
export function codexHooksPaths(codexHome) {
|
|
44
|
+
const helperDir = join(codexHome, 'dz-hooks');
|
|
45
|
+
return {
|
|
46
|
+
codexHome,
|
|
47
|
+
registry: join(codexHome, 'hooks.json'),
|
|
48
|
+
configToml: join(codexHome, 'config.toml'),
|
|
49
|
+
helperDir,
|
|
50
|
+
vetoHelper: join(helperDir, 'dz-codex-veto.cjs'),
|
|
51
|
+
recallHelper: join(helperDir, 'dz-codex-recall.cjs'),
|
|
52
|
+
manifest: join(helperDir, 'manifest.json'),
|
|
53
|
+
errorLog: join(helperDir, 'helper-errors.jsonl'),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** The EMITTER's write-set (AM-12). The RUNTIME's is stated separately — see {@link runtimeWriteSet}. */
|
|
57
|
+
export function emitterWriteSet(paths) {
|
|
58
|
+
return [paths.registry, paths.vetoHelper, paths.recallHelper, paths.manifest];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The RUNTIME's write-set (AM-33). Exactly one path beyond the emitter's, and it is
|
|
62
|
+
* `CODEX_HOME`-local: a helper must never create a `.dz/` inside a repository the user merely ran
|
|
63
|
+
* `codex` in. (Recall rows are the one exception and they are opt-in-gated: they land in an
|
|
64
|
+
* ALREADY-EXISTING opted-in project's `.dz/`, so nothing is ever created.)
|
|
65
|
+
*/
|
|
66
|
+
export function runtimeWriteSet(paths) {
|
|
67
|
+
return [paths.errorLog];
|
|
68
|
+
}
|
|
69
|
+
/* -------------------------------------------------------------------------- */
|
|
70
|
+
/* Quoting */
|
|
71
|
+
/* -------------------------------------------------------------------------- */
|
|
72
|
+
/** A single quote inside a single-quoted shell word cannot be escaped — such a path is REFUSED. */
|
|
73
|
+
export function isSafeForSingleQuote(path) {
|
|
74
|
+
return typeof path === 'string' && path !== '' && !path.includes("'") && !path.includes('\n');
|
|
75
|
+
}
|
|
76
|
+
export function singleQuote(path) {
|
|
77
|
+
return `'${path}'`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The shell string codex runs. Absolute interpreter + single-quoted paths (AM-32/AM-35d).
|
|
81
|
+
* @throws when either path cannot be safely quoted — never emit a broken entry that READS installed.
|
|
82
|
+
*/
|
|
83
|
+
export function buildHookCommand(nodePath, scriptPath) {
|
|
84
|
+
if (!isSafeForSingleQuote(nodePath) || !isSafeForSingleQuote(scriptPath)) {
|
|
85
|
+
throw new Error(`refusing to emit a hook command containing an unquotable path (single quote or newline): ${nodePath} ${scriptPath}`);
|
|
86
|
+
}
|
|
87
|
+
return `${singleQuote(nodePath)} ${singleQuote(scriptPath)}`;
|
|
88
|
+
}
|
|
89
|
+
/** The two entries this leg ships, and nothing else. */
|
|
90
|
+
export const CODEX_MANAGED_HOOKS = [
|
|
91
|
+
{ id: 'codex-veto', event: 'PreToolUse', matcher: DZ_VETO_MATCHER, script: 'veto' },
|
|
92
|
+
{ id: 'codex-recall', event: 'UserPromptSubmit', script: 'recall' },
|
|
93
|
+
];
|
|
94
|
+
/**
|
|
95
|
+
* Build the managed entries.
|
|
96
|
+
*
|
|
97
|
+
* Key set is EXACTLY `{matcher?, hooks:[{type, command, timeout}]}` (AM-15). `timeout` is included
|
|
98
|
+
* because spike S2 recorded a probe proving the registry loads with it AND honors it; every other
|
|
99
|
+
* key stays out until it has its own probe.
|
|
100
|
+
*/
|
|
101
|
+
export function buildManagedEntries(opts) {
|
|
102
|
+
return CODEX_MANAGED_HOOKS.map((spec) => {
|
|
103
|
+
const script = spec.script === 'veto' ? opts.paths.vetoHelper : opts.paths.recallHelper;
|
|
104
|
+
const command = buildHookCommand(opts.nodePath, script);
|
|
105
|
+
const entry = {
|
|
106
|
+
...(spec.matcher !== undefined ? { matcher: spec.matcher } : {}),
|
|
107
|
+
hooks: [{ type: 'command', command, timeout: DZ_HOOK_TIMEOUT_SECONDS }],
|
|
108
|
+
};
|
|
109
|
+
return { id: spec.id, event: spec.event, command, entry };
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/** `managed` in the shape {@link mergeManagedHookEntries} takes. */
|
|
113
|
+
export function managedByEvent(entries) {
|
|
114
|
+
const out = {};
|
|
115
|
+
for (const e of entries) {
|
|
116
|
+
(out[e.event] ??= []).push(e.entry);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
/* -------------------------------------------------------------------------- */
|
|
121
|
+
/* Manifest + attribution */
|
|
122
|
+
/* -------------------------------------------------------------------------- */
|
|
123
|
+
export function codexHookSha256(text) {
|
|
124
|
+
return createHash('sha256').update(text, 'utf8').digest('hex');
|
|
125
|
+
}
|
|
126
|
+
export function buildCodexHookManifest(opts) {
|
|
127
|
+
return {
|
|
128
|
+
version: 1,
|
|
129
|
+
writtenAt: opts.writtenAt,
|
|
130
|
+
codexVersion: opts.codexVersion,
|
|
131
|
+
registryPath: opts.paths.registry,
|
|
132
|
+
helperVersion: DZ_HOOK_HELPER_VERSION,
|
|
133
|
+
nodePath: opts.nodePath,
|
|
134
|
+
entries: opts.entries.map((e) => {
|
|
135
|
+
const spec = CODEX_MANAGED_HOOKS.find((s) => s.id === e.id);
|
|
136
|
+
const trustKey = opts.trustKeys?.[e.id];
|
|
137
|
+
return {
|
|
138
|
+
id: e.id,
|
|
139
|
+
event: e.event,
|
|
140
|
+
...(spec?.matcher !== undefined ? { matcher: spec.matcher } : {}),
|
|
141
|
+
commandSha256: codexHookSha256(e.command),
|
|
142
|
+
...(trustKey !== undefined ? { trustKey } : {}),
|
|
143
|
+
};
|
|
144
|
+
}),
|
|
145
|
+
...(opts.lastVerify !== undefined ? { lastVerify: opts.lastVerify } : {}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export function parseCodexHookManifest(text) {
|
|
149
|
+
try {
|
|
150
|
+
const parsed = JSON.parse(text);
|
|
151
|
+
if (parsed === null || typeof parsed !== 'object')
|
|
152
|
+
return undefined;
|
|
153
|
+
const m = parsed;
|
|
154
|
+
if (m.version !== 1 || !Array.isArray(m.entries))
|
|
155
|
+
return undefined;
|
|
156
|
+
return m;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function entryCommands(entry) {
|
|
163
|
+
const e = entry;
|
|
164
|
+
if (Array.isArray(e?.hooks))
|
|
165
|
+
return e.hooks.map((h) => String(h?.command ?? ''));
|
|
166
|
+
return [String(e?.command ?? '')];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Attribution is `codexHookSha256(command) ∈ manifest` — never a substring guess.
|
|
170
|
+
*
|
|
171
|
+
* ADR-001 §3: dz deletes only what it can PROVE it wrote. An entry that merely looks like ours (it
|
|
172
|
+
* mentions our helper filename) but whose command hash is absent from the manifest is KEPT, counted
|
|
173
|
+
* in `unattributable`, and warned about. A hand-edited managed command therefore survives.
|
|
174
|
+
*/
|
|
175
|
+
export function isDzManagedEntry(entry, manifest) {
|
|
176
|
+
if (manifest === undefined)
|
|
177
|
+
return false;
|
|
178
|
+
const known = new Set(manifest.entries.map((e) => e.commandSha256));
|
|
179
|
+
return entryCommands(entry).some((cmd) => cmd !== '' && known.has(codexHookSha256(cmd)));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Rebuild an OWNED entry from only the handlers that are NOT ours — per-HANDLER attribution.
|
|
183
|
+
*
|
|
184
|
+
* ADR-001 §5 promises that dz deletes only what it can prove it wrote. Attribution was applied to a
|
|
185
|
+
* whole MATCHER GROUP: a group holding one dz handler and one of the user's was removed (or
|
|
186
|
+
* replaced) wholesale, so a foreign handler was deleted by a rule written to protect it
|
|
187
|
+
* (independent review, finding 6). One dz handler in the group must cost exactly that handler.
|
|
188
|
+
*
|
|
189
|
+
* Returns `null` when every handler in the entry was ours (the entry itself is then dropped), and
|
|
190
|
+
* a rebuilt entry — same keys, same order, minus our handlers — when something foreign survives.
|
|
191
|
+
* A legacy FLAT entry (`{type, command}`) is one handler and has nothing to salvage.
|
|
192
|
+
*/
|
|
193
|
+
export function retainForeignHandlers(entry, manifest) {
|
|
194
|
+
if (manifest === undefined)
|
|
195
|
+
return entry;
|
|
196
|
+
const known = new Set(manifest.entries.map((e) => e.commandSha256));
|
|
197
|
+
const isOurs = (cmd) => typeof cmd === 'string' && cmd !== '' && known.has(codexHookSha256(cmd));
|
|
198
|
+
const e = entry;
|
|
199
|
+
if (!Array.isArray(e?.hooks))
|
|
200
|
+
return null; // flat shape: the entry IS the handler
|
|
201
|
+
const kept = e.hooks.filter((h) => !isOurs(h?.command));
|
|
202
|
+
if (kept.length === 0)
|
|
203
|
+
return null;
|
|
204
|
+
return { ...entry, hooks: kept };
|
|
205
|
+
}
|
|
206
|
+
/** Cheap resemblance test — drives the `unattributable` COUNT only, never a deletion. */
|
|
207
|
+
export function looksLikeDzEntry(entry) {
|
|
208
|
+
return entryCommands(entry).some((cmd) => cmd.includes('dz-codex-veto.cjs') || cmd.includes('dz-codex-recall.cjs'));
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Parse an existing registry. An unparseable file is an ERROR, never an empty registry: silently
|
|
212
|
+
* treating it as `{}` would overwrite entries we promised to preserve (I1).
|
|
213
|
+
*/
|
|
214
|
+
export function parseCodexRegistry(text) {
|
|
215
|
+
if (text === undefined || text.trim() === '') {
|
|
216
|
+
return { ok: true, registry: { rest: {}, hooks: {} } };
|
|
217
|
+
}
|
|
218
|
+
let parsed;
|
|
219
|
+
try {
|
|
220
|
+
parsed = JSON.parse(text);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
return { ok: false, error: `hooks.json is not valid JSON: ${err.message}` };
|
|
224
|
+
}
|
|
225
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
226
|
+
return { ok: false, error: 'hooks.json must be a JSON object' };
|
|
227
|
+
}
|
|
228
|
+
const obj = parsed;
|
|
229
|
+
const rawHooks = obj['hooks'];
|
|
230
|
+
if (rawHooks !== undefined && (rawHooks === null || typeof rawHooks !== 'object' || Array.isArray(rawHooks))) {
|
|
231
|
+
return { ok: false, error: 'hooks.json "hooks" must be an object keyed by event name' };
|
|
232
|
+
}
|
|
233
|
+
const hooks = {};
|
|
234
|
+
for (const [event, value] of Object.entries((rawHooks ?? {}))) {
|
|
235
|
+
// REFUSE, never coerce. `Array.isArray(value) ? [...value] : []` silently turned a foreign
|
|
236
|
+
// event whose value dz does not understand into an EMPTY list, and the next write persisted
|
|
237
|
+
// that emptiness — configuration loss dressed as a merge (independent review, finding 5). An
|
|
238
|
+
// unparseable shape is the same class of fact as unparseable JSON: refuse before planning.
|
|
239
|
+
if (!Array.isArray(value)) {
|
|
240
|
+
return {
|
|
241
|
+
ok: false,
|
|
242
|
+
error: `hooks.json event ${JSON.stringify(event)} must be an array of entries (found ${value === null ? 'null' : typeof value}) — dz refuses to rewrite a registry it cannot read without losing it`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
hooks[event] = [...value];
|
|
246
|
+
}
|
|
247
|
+
const rest = {};
|
|
248
|
+
for (const [k, v] of Object.entries(obj))
|
|
249
|
+
if (k !== 'hooks')
|
|
250
|
+
rest[k] = v;
|
|
251
|
+
return { ok: true, registry: { rest, hooks } };
|
|
252
|
+
}
|
|
253
|
+
export function serializeCodexRegistry(registry) {
|
|
254
|
+
return `${JSON.stringify({ ...registry.rest, hooks: registry.hooks }, null, 2)}\n`;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Compute the merged registry.
|
|
258
|
+
*
|
|
259
|
+
* The merge itself is `mergeManagedHookEntries` — the SAME implementation the Claude path uses
|
|
260
|
+
* (AM-3 / G-E). Only the attribution predicate differs.
|
|
261
|
+
*/
|
|
262
|
+
export function planCodexHooks(input) {
|
|
263
|
+
const parsed = parseCodexRegistry(input.currentText);
|
|
264
|
+
if (!parsed.ok)
|
|
265
|
+
return { ok: false, error: parsed.error };
|
|
266
|
+
// The union of the manifest's hashes and the ones we are about to write: on a re-run the manifest
|
|
267
|
+
// is current, on a helper-version bump it is not, and BOTH vintages of our own entry must be
|
|
268
|
+
// replaced rather than duplicated.
|
|
269
|
+
const selfManifest = {
|
|
270
|
+
version: 1,
|
|
271
|
+
writtenAt: '',
|
|
272
|
+
codexVersion: '',
|
|
273
|
+
registryPath: '',
|
|
274
|
+
helperVersion: DZ_HOOK_HELPER_VERSION,
|
|
275
|
+
nodePath: '',
|
|
276
|
+
entries: [
|
|
277
|
+
...(input.manifest?.entries ?? []),
|
|
278
|
+
...input.entries.map((e) => ({ id: e.id, event: e.event, commandSha256: codexHookSha256(e.command) })),
|
|
279
|
+
],
|
|
280
|
+
};
|
|
281
|
+
const plan = mergeManagedHookEntries(parsed.registry.hooks, managedByEvent(input.entries), {
|
|
282
|
+
isManaged: (entry) => isDzManagedEntry(entry, selfManifest),
|
|
283
|
+
looksLikeOurs: (entry) => looksLikeDzEntry(entry) && !isDzManagedEntry(entry, selfManifest),
|
|
284
|
+
// Per-HANDLER salvage (finding 6): an owned entry that also carries the user's own handler is
|
|
285
|
+
// rebuilt without ours, never dropped whole. The Claude path passes no salvage and is
|
|
286
|
+
// byte-identical to before (AM-3).
|
|
287
|
+
retainForeign: (entry) => retainForeignHandlers(entry, selfManifest),
|
|
288
|
+
reportLabel: 'codex',
|
|
289
|
+
});
|
|
290
|
+
const registry = { rest: parsed.registry.rest, hooks: plan.hooks };
|
|
291
|
+
return {
|
|
292
|
+
ok: true,
|
|
293
|
+
plan: {
|
|
294
|
+
registry,
|
|
295
|
+
text: serializeCodexRegistry(registry),
|
|
296
|
+
changed: plan.changed,
|
|
297
|
+
foreignPreserved: plan.foreignPreserved,
|
|
298
|
+
unattributable: plan.unattributable,
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* `--remove`: delete ONLY manifest-attributed entries.
|
|
304
|
+
*
|
|
305
|
+
* With the manifest deleted this removes **zero** entries and reports them all as `unattributable`.
|
|
306
|
+
* That is the intended, conservative behaviour: dz never deletes what it cannot prove it wrote.
|
|
307
|
+
*/
|
|
308
|
+
export function removeCodexHooks(currentText, manifest) {
|
|
309
|
+
const parsed = parseCodexRegistry(currentText);
|
|
310
|
+
if (!parsed.ok)
|
|
311
|
+
return { ok: false, error: parsed.error };
|
|
312
|
+
const hooks = {};
|
|
313
|
+
let removed = 0;
|
|
314
|
+
let unattributable = 0;
|
|
315
|
+
for (const [event, entries] of Object.entries(parsed.registry.hooks)) {
|
|
316
|
+
const kept = [];
|
|
317
|
+
for (const entry of entries) {
|
|
318
|
+
if (isDzManagedEntry(entry, manifest)) {
|
|
319
|
+
removed += 1;
|
|
320
|
+
// Per-HANDLER removal (finding 6): a mixed matcher group keeps every handler that is not
|
|
321
|
+
// ours. Removing dz's guard must never remove the user's alongside it.
|
|
322
|
+
const salvaged = retainForeignHandlers(entry, manifest);
|
|
323
|
+
if (salvaged !== null)
|
|
324
|
+
kept.push(salvaged);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
if (looksLikeDzEntry(entry))
|
|
328
|
+
unattributable += 1;
|
|
329
|
+
kept.push(entry);
|
|
330
|
+
}
|
|
331
|
+
hooks[event] = kept;
|
|
332
|
+
}
|
|
333
|
+
const registry = { rest: parsed.registry.rest, hooks };
|
|
334
|
+
return {
|
|
335
|
+
ok: true,
|
|
336
|
+
result: { registry, text: serializeCodexRegistry(registry), removed, changed: removed > 0, unattributable },
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
/** `--check` recomputes from the FILE; it never trusts the manifest's claim on its own. */
|
|
340
|
+
export function diffCodexHooks(currentText, entries, manifest) {
|
|
341
|
+
const parsed = parseCodexRegistry(currentText);
|
|
342
|
+
const hooks = parsed.ok ? parsed.registry.hooks : {};
|
|
343
|
+
const present = [];
|
|
344
|
+
const drifted = [];
|
|
345
|
+
let foreignPreserved = 0;
|
|
346
|
+
let unattributable = 0;
|
|
347
|
+
const wantByEvent = new Map(entries.map((e) => [e.event, e]));
|
|
348
|
+
for (const [event, list] of Object.entries(hooks)) {
|
|
349
|
+
for (const entry of list) {
|
|
350
|
+
const want = wantByEvent.get(event);
|
|
351
|
+
const cmds = entryCommands(entry);
|
|
352
|
+
if (want !== undefined && cmds.includes(want.command)) {
|
|
353
|
+
present.push(want.id);
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
if (isDzManagedEntry(entry, manifest)) {
|
|
357
|
+
// Ours by manifest, but not the command we would write now: an old helper version.
|
|
358
|
+
const id = manifest?.entries.find((m) => cmds.some((c) => codexHookSha256(c) === m.commandSha256))?.id;
|
|
359
|
+
if (id !== undefined)
|
|
360
|
+
drifted.push(id);
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
foreignPreserved += 1;
|
|
364
|
+
if (looksLikeDzEntry(entry))
|
|
365
|
+
unattributable += 1;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const missing = entries.map((e) => e.id).filter((id) => !present.includes(id));
|
|
369
|
+
return {
|
|
370
|
+
installed: missing.length === 0,
|
|
371
|
+
presentIds: present,
|
|
372
|
+
missingIds: missing,
|
|
373
|
+
foreignPreserved,
|
|
374
|
+
unattributable,
|
|
375
|
+
drifted,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/* -------------------------------------------------------------------------- */
|
|
379
|
+
/* Trust (the M0 arming route) */
|
|
380
|
+
/* -------------------------------------------------------------------------- */
|
|
381
|
+
/** codex's snake_case event spelling inside a trust key (MEASURED from `hooks/list`). */
|
|
382
|
+
export function trustEventName(event) {
|
|
383
|
+
return event === 'PreToolUse' ? 'pre_tool_use' : 'user_prompt_submit';
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Compare two event spellings the way the runtime actually spells them.
|
|
387
|
+
*
|
|
388
|
+
* MEASURED, both on this machine, on the SAME response shape:
|
|
389
|
+
* - the trust KEY embeds `pre_tool_use` / `user_prompt_submit` (snake_case);
|
|
390
|
+
* - `hooks/list`'s `eventName` FIELD is `preToolUse` / `userPromptSubmit` on **codex-cli 0.148.0**
|
|
391
|
+
* (reproducer: `listCodexHooks(<temp home>)` after an install — the rows are printed verbatim in
|
|
392
|
+
* `07_code_changes/probe-results/fixround/trust-diagnosis.txt`).
|
|
393
|
+
*
|
|
394
|
+
* Pinning either spelling alone silently drops every row: the fix round's first cut compared the
|
|
395
|
+
* field against the KEY spelling, `hooks/list` matched 0 of 2 entries, trust was never written, and
|
|
396
|
+
* the live probe's ARMED leg stopped blocking. Case and separators are therefore normalised away —
|
|
397
|
+
* the spelling is the runtime's cosmetic choice, the EVENT is the fact.
|
|
398
|
+
*/
|
|
399
|
+
export function sameHookEvent(a, b) {
|
|
400
|
+
const norm = (v) => v.toLowerCase().replace(/[-_\s]/g, '');
|
|
401
|
+
return norm(a) === norm(b);
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* The trust key codex uses: `<sourcePath>:<snake_event>:<groupIndex>:<hookIndex>`.
|
|
405
|
+
*
|
|
406
|
+
* This is the EXPECTED spelling, used only to cross-check what `hooks/list` reports. The install
|
|
407
|
+
* path uses the reported key verbatim — a computed key that drifts from the runtime's would arm
|
|
408
|
+
* nothing while reading like success.
|
|
409
|
+
*/
|
|
410
|
+
export function expectedTrustKey(registryPath, event, groupIndex, hookIndex) {
|
|
411
|
+
return `${registryPath}:${trustEventName(event)}:${groupIndex}:${hookIndex}`;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Split a `hooks/list` trust key into its parts, or `null` when it is not one.
|
|
415
|
+
*
|
|
416
|
+
* MEASURED shape: `<sourcePath>:<snake_event>:<groupIndex>:<hookIndex>`. The path may itself carry
|
|
417
|
+
* a colon, so the split is anchored at the END — the last two fields are the indices and the third
|
|
418
|
+
* from the end is the event.
|
|
419
|
+
*
|
|
420
|
+
* The INDICES are deliberately not predicted: they are positions inside the user's registry, and a
|
|
421
|
+
* foreign entry shifts them. What IS ours to require is the rest — this key names OUR registry and
|
|
422
|
+
* OUR event (fix round 2, R2-7: a row carrying an arbitrary key was selected on path+event+command
|
|
423
|
+
* alone, and the key is what dz then writes trust against).
|
|
424
|
+
*/
|
|
425
|
+
export function parseTrustKey(key) {
|
|
426
|
+
const m = /^(.*):([A-Za-z_][A-Za-z_]*):(\d+):(\d+)$/.exec(key);
|
|
427
|
+
if (m === null)
|
|
428
|
+
return null;
|
|
429
|
+
return { sourcePath: m[1] ?? '', event: m[2] ?? '', groupIndex: Number(m[3]), hookIndex: Number(m[4]) };
|
|
430
|
+
}
|
|
431
|
+
/** TOML-escape a bare-string key (the key is an absolute path plus `:` separators). */
|
|
432
|
+
function tomlQuote(value) {
|
|
433
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
434
|
+
}
|
|
435
|
+
export const DZ_TRUST_BEGIN = '# --- dz codex hooks trust (managed block, dz-rewritten) ---';
|
|
436
|
+
export const DZ_TRUST_END = '# --- end dz codex hooks trust ---';
|
|
437
|
+
/**
|
|
438
|
+
* Render dz's trust rows as a MANAGED BLOCK in `config.toml`.
|
|
439
|
+
*
|
|
440
|
+
* A managed block, not a whole-file rewrite: `~/.codex/config.toml` already carries a
|
|
441
|
+
* `ruvnet-brain` managed block and seven `[projects."…"]` trust rows on this machine (MEASURED),
|
|
442
|
+
* and dz is not the only writer. The block is delimited so a re-run replaces exactly dz's rows and
|
|
443
|
+
* nothing else.
|
|
444
|
+
*/
|
|
445
|
+
export function renderTrustBlock(rows) {
|
|
446
|
+
if (rows.length === 0)
|
|
447
|
+
return '';
|
|
448
|
+
const body = rows
|
|
449
|
+
.map((r) => `[hooks.state.${tomlQuote(r.key)}]\ntrusted_hash = ${tomlQuote(r.trustedHash)}`)
|
|
450
|
+
.join('\n');
|
|
451
|
+
return `${DZ_TRUST_BEGIN}\n${body}\n${DZ_TRUST_END}\n`;
|
|
452
|
+
}
|
|
453
|
+
function countOccurrences(haystack, needle) {
|
|
454
|
+
let n = 0;
|
|
455
|
+
let i = haystack.indexOf(needle);
|
|
456
|
+
while (i >= 0) {
|
|
457
|
+
n += 1;
|
|
458
|
+
i = haystack.indexOf(needle, i + needle.length);
|
|
459
|
+
}
|
|
460
|
+
return n;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Replace (or append) dz's managed trust block, leaving every other byte of config.toml alone.
|
|
464
|
+
*
|
|
465
|
+
* The fence must be **exactly one well-ordered pair**, or dz refuses (independent review, finding
|
|
466
|
+
* 9). The old `indexOf`-pair logic was satisfiable by a damaged file in three ways, and each one
|
|
467
|
+
* eats the user's TOML on the NEXT sync: a lone BEGIN made the rewrite append a second block, so
|
|
468
|
+
* the following run's `begin…end` window spanned everything between the orphan marker and the new
|
|
469
|
+
* block's END; a reversed pair did the same; duplicate pairs left an orphan block behind. Refusing
|
|
470
|
+
* costs one manual edit — the alternative silently deletes `[projects."…"]` trust rows.
|
|
471
|
+
*/
|
|
472
|
+
export function upsertTrustBlock(configToml, rows) {
|
|
473
|
+
const block = renderTrustBlock(rows);
|
|
474
|
+
const begins = countOccurrences(configToml, DZ_TRUST_BEGIN);
|
|
475
|
+
const ends = countOccurrences(configToml, DZ_TRUST_END);
|
|
476
|
+
const heal = `heal by hand: leave exactly one ${JSON.stringify(DZ_TRUST_BEGIN)} … ${JSON.stringify(DZ_TRUST_END)} pair (or delete both markers) and re-run`;
|
|
477
|
+
if (begins > 1 || ends > 1) {
|
|
478
|
+
return { ok: false, error: `config.toml carries ${begins} dz trust BEGIN and ${ends} END markers — dz refuses to guess which block is its own. ${heal}` };
|
|
479
|
+
}
|
|
480
|
+
if (begins !== ends) {
|
|
481
|
+
return { ok: false, error: `config.toml carries an UNPAIRED dz trust marker (${begins} BEGIN, ${ends} END) — rewriting it would consume unrelated TOML. ${heal}` };
|
|
482
|
+
}
|
|
483
|
+
if (begins === 1) {
|
|
484
|
+
const begin = configToml.indexOf(DZ_TRUST_BEGIN);
|
|
485
|
+
const end = configToml.indexOf(DZ_TRUST_END);
|
|
486
|
+
if (end < begin) {
|
|
487
|
+
return { ok: false, error: `config.toml carries the dz trust END marker BEFORE its BEGIN — the fence is inverted and the span between them is not dz's. ${heal}` };
|
|
488
|
+
}
|
|
489
|
+
const before = configToml.slice(0, begin);
|
|
490
|
+
const after = configToml.slice(end + DZ_TRUST_END.length).replace(/^\n/, '');
|
|
491
|
+
return { ok: true, text: `${before}${block}${after}` };
|
|
492
|
+
}
|
|
493
|
+
const base = configToml === '' || configToml.endsWith('\n') ? configToml : `${configToml}\n`;
|
|
494
|
+
return { ok: true, text: `${base}${base === '' ? '' : '\n'}${block}` };
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Pick, from a `hooks/list` response, the metadata of the entries WE wrote.
|
|
498
|
+
*
|
|
499
|
+
* The match is on THREE facts, not one (independent review, finding 7): the row's `sourcePath` is
|
|
500
|
+
* the registry dz wrote, its `eventName` is the event dz registered the entry under, and the
|
|
501
|
+
* command string is byte-equal. Command alone was not enough — a project-scoped
|
|
502
|
+
* `<repo>/.codex/hooks.json` DOES load on codex 0.148 (MEASURED, see ADR-004's addendum), so a
|
|
503
|
+
* shadow copy of dz's own command line could supply the `trusted` row that armed the user-global
|
|
504
|
+
* entry nobody had approved.
|
|
505
|
+
*
|
|
506
|
+
* AMBIGUITY IS REFUSED, not resolved: two rows claiming the same entry drop BOTH, because the one
|
|
507
|
+
* dz would arm is then a coin flip and the trust write is keyed by the row it picked.
|
|
508
|
+
*/
|
|
509
|
+
export function selectOwnHookMetadata(hooks, entries, options) {
|
|
510
|
+
const byCommand = new Map(entries.map((e) => [e.command, e]));
|
|
511
|
+
const claims = new Map();
|
|
512
|
+
for (const meta of hooks) {
|
|
513
|
+
if (typeof meta.command !== 'string')
|
|
514
|
+
continue;
|
|
515
|
+
const entry = byCommand.get(meta.command);
|
|
516
|
+
if (entry === undefined)
|
|
517
|
+
continue;
|
|
518
|
+
if (meta.sourcePath !== options.registryPath)
|
|
519
|
+
continue;
|
|
520
|
+
if (!sameHookEvent(meta.eventName, trustEventName(entry.event)))
|
|
521
|
+
continue;
|
|
522
|
+
// The KEY is the thing dz writes trust against, so it — not just the row's other fields — has
|
|
523
|
+
// to be the key our entry would own (R2-7). An arbitrary or foreign key is ambiguous by
|
|
524
|
+
// construction: arming it would persist trust for something we cannot identify.
|
|
525
|
+
const parsedKey = typeof meta.key === 'string' ? parseTrustKey(meta.key) : null;
|
|
526
|
+
if (parsedKey === null)
|
|
527
|
+
continue;
|
|
528
|
+
if (parsedKey.sourcePath !== options.registryPath)
|
|
529
|
+
continue;
|
|
530
|
+
if (!sameHookEvent(parsedKey.event, trustEventName(entry.event)))
|
|
531
|
+
continue;
|
|
532
|
+
(claims.get(entry.id) ?? claims.set(entry.id, []).get(entry.id)).push({ id: entry.id, meta });
|
|
533
|
+
}
|
|
534
|
+
const out = [];
|
|
535
|
+
for (const rows of claims.values()) {
|
|
536
|
+
if (rows.length === 1)
|
|
537
|
+
out.push(rows[0]);
|
|
538
|
+
}
|
|
539
|
+
return out;
|
|
540
|
+
}
|
|
541
|
+
//# sourceMappingURL=codex-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-hooks.js","sourceRoot":"","sources":["../src/codex-hooks.ts"],"names":[],"mappings":"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"}
|