@zelari/core 1.31.1 → 1.32.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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Lifecycle hooks — public API for hook definitions, matchers and the
3
+ * fail-open runner used by ToolRegistry.
4
+ *
5
+ * @since v1.32.0
6
+ */
7
+ export * from './types.js';
8
+ export * from './lifecycleHookRunner.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Lifecycle hooks — public API for hook definitions, matchers and the
3
+ * fail-open runner used by ToolRegistry.
4
+ *
5
+ * @since v1.32.0
6
+ */
7
+ export * from './types.js';
8
+ export * from './lifecycleHookRunner.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * LifecycleHookRunner — executes PreToolUse / PostToolUse / SessionStart /
3
+ * SessionEnd hooks as external commands (or HTTP POSTs), FAIL-OPEN.
4
+ *
5
+ * Safety model (v1.32.0):
6
+ * - A hook that crashes, times out, exits non-zero, or returns invalid JSON
7
+ * is logged and treated as ALLOW. Hooks must never brick the agent.
8
+ * - The ONLY way to block a tool is an explicit JSON decision
9
+ * `{ "decision": "deny", "reason": "..." }` on stdout / response body.
10
+ * - Tool matching is Claude-code style: `Bash` and `bash` both match the
11
+ * `bash` tool (see types.ts `normalizeToolName`).
12
+ *
13
+ * Hook files are loaded from one or more directories; each `*.json` file is
14
+ * one {@link HookDefinition}. Global hooks (`~/.zelari-code/hooks`) are
15
+ * always active; project hooks (`.zelari/hooks`) are only loaded when the
16
+ * folder is trusted — the CLI decides that via FolderTrustStore and passes
17
+ * only the allowed dirs here.
18
+ *
19
+ * @since v1.32.0
20
+ */
21
+ import { type HookDefinition, type PreToolUseResult, type SessionHookResult } from './types.js';
22
+ export interface LifecycleHookRunnerOptions {
23
+ /** Directories to scan for `*.json` hook files. */
24
+ dirs?: string[];
25
+ /** Logger sink (default: console.error). */
26
+ logger?: (msg: string) => void;
27
+ /** Default per-hook timeout in ms (default 5000). */
28
+ defaultTimeoutMs?: number;
29
+ }
30
+ /**
31
+ * Execute one hook for an event. NEVER throws: any failure becomes an
32
+ * explicit allow (fail-open) with a logged warning.
33
+ */
34
+ export declare class LifecycleHookRunner {
35
+ private hooks;
36
+ private readonly logger;
37
+ private readonly defaultTimeoutMs;
38
+ constructor(options?: LifecycleHookRunnerOptions);
39
+ /** Add a single hook definition (used by tests / programmatic config). */
40
+ addHook(hook: HookDefinition): void;
41
+ /** Scan a directory for `*.json` hook files and load them. Returns count. */
42
+ loadDir(dir: string): number;
43
+ listHooks(): HookDefinition[];
44
+ /**
45
+ * Run matching PreToolUse hooks. Returns `{ ok: false }` ONLY when a hook
46
+ * explicitly denies. All other outcomes (no match, crash, timeout, invalid
47
+ * JSON, allow decision) return `{ ok: true }`.
48
+ */
49
+ runPreToolUse(toolName: string, toolInput: unknown, ctx: {
50
+ sessionId?: string;
51
+ cwd?: string;
52
+ }): Promise<PreToolUseResult>;
53
+ /** Run matching PostToolUse hooks. Fail-open, results are logged only. */
54
+ runPostToolUse(toolName: string, toolInput: unknown, toolOutput: unknown, ctx: {
55
+ sessionId?: string;
56
+ cwd?: string;
57
+ ok?: boolean;
58
+ error?: string;
59
+ }): Promise<void>;
60
+ /** Run matching SessionStart hooks. Fail-open; deny never throws. */
61
+ runSessionStart(ctx: {
62
+ sessionId?: string;
63
+ cwd?: string;
64
+ }): Promise<SessionHookResult>;
65
+ /** Run matching SessionEnd hooks. Fail-open. */
66
+ runSessionEnd(ctx: {
67
+ sessionId?: string;
68
+ cwd?: string;
69
+ }): Promise<SessionHookResult>;
70
+ private runSessionHooks;
71
+ /** Execute a single hook, swallowing every failure into an allow. */
72
+ private runHookSafely;
73
+ /** Spawn `command`, write JSON payload to stdin, read stdout until close. */
74
+ private execCommand;
75
+ /** POST JSON payload; resolve with the response body text. */
76
+ private postHttp;
77
+ }
78
+ //# sourceMappingURL=lifecycleHookRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleHookRunner.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/lifecycleHookRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,EAGL,KAAK,cAAc,EAGnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAYD;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,OAAO,GAAE,0BAA+B;IAQpD,0EAA0E;IAC1E,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAInC,6EAA6E;IAC7E,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA2B5B,SAAS,IAAI,cAAc,EAAE;IAI7B;;;;OAIG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACxC,OAAO,CAAC,gBAAgB,CAAC;IAsB5B,0EAA0E;IACpE,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,OAAO,EACnB,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;IAiBhB,qEAAqE;IAC/D,eAAe,CAAC,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5F,gDAAgD;IAC1C,aAAa,CAAC,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAI5E,eAAe;IAuB7B,qEAAqE;YACvD,aAAa;IA2B3B,6EAA6E;IAC7E,OAAO,CAAC,WAAW;IA+CnB,8DAA8D;YAChD,QAAQ;CAsBvB"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * LifecycleHookRunner — executes PreToolUse / PostToolUse / SessionStart /
3
+ * SessionEnd hooks as external commands (or HTTP POSTs), FAIL-OPEN.
4
+ *
5
+ * Safety model (v1.32.0):
6
+ * - A hook that crashes, times out, exits non-zero, or returns invalid JSON
7
+ * is logged and treated as ALLOW. Hooks must never brick the agent.
8
+ * - The ONLY way to block a tool is an explicit JSON decision
9
+ * `{ "decision": "deny", "reason": "..." }` on stdout / response body.
10
+ * - Tool matching is Claude-code style: `Bash` and `bash` both match the
11
+ * `bash` tool (see types.ts `normalizeToolName`).
12
+ *
13
+ * Hook files are loaded from one or more directories; each `*.json` file is
14
+ * one {@link HookDefinition}. Global hooks (`~/.zelari-code/hooks`) are
15
+ * always active; project hooks (`.zelari/hooks`) are only loaded when the
16
+ * folder is trusted — the CLI decides that via FolderTrustStore and passes
17
+ * only the allowed dirs here.
18
+ *
19
+ * @since v1.32.0
20
+ */
21
+ import { spawn } from 'node:child_process';
22
+ import { readdirSync, readFileSync } from 'node:fs';
23
+ import path from 'node:path';
24
+ import { hookMatches, } from './types.js';
25
+ const DEFAULT_TIMEOUT_MS = 5000;
26
+ function parseJson(text) {
27
+ try {
28
+ return JSON.parse(text);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /**
35
+ * Execute one hook for an event. NEVER throws: any failure becomes an
36
+ * explicit allow (fail-open) with a logged warning.
37
+ */
38
+ export class LifecycleHookRunner {
39
+ hooks = [];
40
+ logger;
41
+ defaultTimeoutMs;
42
+ constructor(options = {}) {
43
+ this.logger = options.logger ?? ((msg) => console.error(`[hooks] ${msg}`));
44
+ this.defaultTimeoutMs = options.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;
45
+ for (const dir of options.dirs ?? []) {
46
+ this.loadDir(dir);
47
+ }
48
+ }
49
+ /** Add a single hook definition (used by tests / programmatic config). */
50
+ addHook(hook) {
51
+ this.hooks.push(hook);
52
+ }
53
+ /** Scan a directory for `*.json` hook files and load them. Returns count. */
54
+ loadDir(dir) {
55
+ let files;
56
+ try {
57
+ files = readdirSync(dir).filter((f) => f.endsWith('.json'));
58
+ }
59
+ catch {
60
+ return 0; // dir missing → no hooks
61
+ }
62
+ let loaded = 0;
63
+ for (const f of files) {
64
+ const full = path.join(dir, f);
65
+ try {
66
+ const parsed = parseJson(readFileSync(full, 'utf8'));
67
+ if (!parsed || !parsed.name || !parsed.match) {
68
+ this.logger(`skipping invalid hook file ${full}`);
69
+ continue;
70
+ }
71
+ // Prefer file name as the hook name when absent; keep explicit name.
72
+ parsed.name = parsed.name || path.basename(f, '.json');
73
+ this.hooks.push(parsed);
74
+ loaded += 1;
75
+ }
76
+ catch (err) {
77
+ this.logger(`failed to load hook ${full}: ${err instanceof Error ? err.message : String(err)}`);
78
+ }
79
+ }
80
+ return loaded;
81
+ }
82
+ listHooks() {
83
+ return [...this.hooks];
84
+ }
85
+ /**
86
+ * Run matching PreToolUse hooks. Returns `{ ok: false }` ONLY when a hook
87
+ * explicitly denies. All other outcomes (no match, crash, timeout, invalid
88
+ * JSON, allow decision) return `{ ok: true }`.
89
+ */
90
+ async runPreToolUse(toolName, toolInput, ctx) {
91
+ for (const hook of this.hooks) {
92
+ if (!hookMatches(hook, 'PreToolUse', toolName))
93
+ continue;
94
+ const payload = {
95
+ event: 'PreToolUse',
96
+ toolName,
97
+ toolInput,
98
+ sessionId: ctx.sessionId,
99
+ cwd: ctx.cwd,
100
+ };
101
+ const decision = await this.runHookSafely(hook, payload);
102
+ if (decision.decision === 'deny') {
103
+ return {
104
+ ok: false,
105
+ hookName: hook.name,
106
+ reason: decision.reason || `blocked by hook "${hook.name}"`,
107
+ };
108
+ }
109
+ }
110
+ return { ok: true };
111
+ }
112
+ /** Run matching PostToolUse hooks. Fail-open, results are logged only. */
113
+ async runPostToolUse(toolName, toolInput, toolOutput, ctx) {
114
+ for (const hook of this.hooks) {
115
+ if (!hookMatches(hook, 'PostToolUse', toolName))
116
+ continue;
117
+ const payload = {
118
+ event: 'PostToolUse',
119
+ toolName,
120
+ toolInput,
121
+ toolOutput,
122
+ ok: ctx.ok ?? true,
123
+ error: ctx.error,
124
+ sessionId: ctx.sessionId,
125
+ cwd: ctx.cwd,
126
+ };
127
+ await this.runHookSafely(hook, payload);
128
+ }
129
+ }
130
+ /** Run matching SessionStart hooks. Fail-open; deny never throws. */
131
+ async runSessionStart(ctx) {
132
+ return this.runSessionHooks('SessionStart', ctx);
133
+ }
134
+ /** Run matching SessionEnd hooks. Fail-open. */
135
+ async runSessionEnd(ctx) {
136
+ return this.runSessionHooks('SessionEnd', ctx);
137
+ }
138
+ async runSessionHooks(event, ctx) {
139
+ for (const hook of this.hooks) {
140
+ if (!hookMatches(hook, event, undefined))
141
+ continue;
142
+ const payload = {
143
+ event,
144
+ sessionId: ctx.sessionId,
145
+ cwd: ctx.cwd,
146
+ };
147
+ const decision = await this.runHookSafely(hook, payload);
148
+ if (decision.decision === 'deny') {
149
+ return {
150
+ ok: false,
151
+ hookName: hook.name,
152
+ reason: decision.reason || `blocked by hook "${hook.name}"`,
153
+ };
154
+ }
155
+ }
156
+ return { ok: true };
157
+ }
158
+ /** Execute a single hook, swallowing every failure into an allow. */
159
+ async runHookSafely(hook, payload) {
160
+ try {
161
+ const timeoutMs = hook.timeoutMs ?? this.defaultTimeoutMs;
162
+ const raw = hook.url
163
+ ? await this.postHttp(hook.url, payload, timeoutMs)
164
+ : await this.execCommand(hook.command ?? '', payload, timeoutMs, hook.cwd);
165
+ const decision = parseJson(raw);
166
+ if (!decision) {
167
+ this.logger(`hook "${hook.name}" returned invalid JSON (fail-open): ${raw.slice(0, 200)}`);
168
+ return { decision: 'allow' };
169
+ }
170
+ if (decision.decision === 'deny' && typeof decision.reason !== 'string') {
171
+ this.logger(`hook "${hook.name}" denied without reason (fail-open)`);
172
+ return { decision: 'allow' };
173
+ }
174
+ return decision;
175
+ }
176
+ catch (err) {
177
+ this.logger(`hook "${hook.name}" failed (fail-open): ${err instanceof Error ? err.message : String(err)}`);
178
+ return { decision: 'allow' };
179
+ }
180
+ }
181
+ /** Spawn `command`, write JSON payload to stdin, read stdout until close. */
182
+ execCommand(command, payload, timeoutMs, cwd) {
183
+ return new Promise((resolve, reject) => {
184
+ // Shell-spawn so `node script.mjs` / `deno run` both work cross-platform.
185
+ const child = spawn(command, {
186
+ shell: true,
187
+ cwd,
188
+ stdio: ['pipe', 'pipe', 'pipe'],
189
+ windowsHide: true,
190
+ });
191
+ let stdout = '';
192
+ let stderr = '';
193
+ const timer = setTimeout(() => {
194
+ child.kill('SIGKILL');
195
+ reject(new Error(`timed out after ${timeoutMs}ms`));
196
+ }, timeoutMs);
197
+ child.stdout?.on('data', (d) => {
198
+ stdout += d.toString();
199
+ });
200
+ child.stderr?.on('data', (d) => {
201
+ stderr += d.toString();
202
+ });
203
+ child.on('error', (err) => {
204
+ clearTimeout(timer);
205
+ reject(err);
206
+ });
207
+ child.on('close', (code) => {
208
+ clearTimeout(timer);
209
+ if (code !== 0) {
210
+ reject(new Error(`exited ${code}: ${stderr.trim().slice(0, 200)}`));
211
+ return;
212
+ }
213
+ resolve(stdout);
214
+ });
215
+ child.stdin?.on('error', () => {
216
+ /* ignore EPIPE */
217
+ });
218
+ child.stdin?.write(JSON.stringify(payload));
219
+ child.stdin?.end();
220
+ });
221
+ }
222
+ /** POST JSON payload; resolve with the response body text. */
223
+ async postHttp(url, payload, timeoutMs) {
224
+ const ctrl = new AbortController();
225
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
226
+ try {
227
+ const res = await fetch(url, {
228
+ method: 'POST',
229
+ headers: { 'content-type': 'application/json' },
230
+ body: JSON.stringify(payload),
231
+ signal: ctrl.signal,
232
+ });
233
+ if (!res.ok) {
234
+ throw new Error(`HTTP ${res.status}`);
235
+ }
236
+ return await res.text();
237
+ }
238
+ finally {
239
+ clearTimeout(timer);
240
+ }
241
+ }
242
+ }
243
+ //# sourceMappingURL=lifecycleHookRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleHookRunner.js","sourceRoot":"","sources":["../../../src/core/hooks/lifecycleHookRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Lifecycle hook types — provider-neutral contract for PreToolUse /
3
+ * PostToolUse / SessionStart / SessionEnd hooks.
4
+ *
5
+ * Design (v1.32.0):
6
+ * - FAIL-OPEN: a crashing, timing-out, or misbehaving hook NEVER blocks a
7
+ * tool. The only way to block is an explicit JSON decision `deny`.
8
+ * - Hooks are external processes (or HTTP endpoints) that receive a JSON
9
+ * payload on stdin / request body and reply with a JSON decision on
10
+ * stdout / response body.
11
+ * - Tool matching is Claude-code style: case/separator-insensitive and
12
+ * alias-aware (`Bash` matches tool `bash`, `Read` matches `read_file`).
13
+ *
14
+ * @see lifecycleHookRunner.ts — the runner that executes these hooks
15
+ * @since v1.32.0
16
+ */
17
+ /** Hook event names. */
18
+ export type HookEvent = 'PreToolUse' | 'PostToolUse' | 'SessionStart' | 'SessionEnd';
19
+ /** A single tool matcher entry — Claude-like glob over tool names. */
20
+ export interface HookToolMatch {
21
+ /** Tool name patterns. `*` matches any tool. Case/alias-insensitive. */
22
+ tools: string[];
23
+ /** Events this hook fires on. */
24
+ events: HookEvent[];
25
+ }
26
+ /**
27
+ * One hook definition, loaded from a JSON file (or injected in tests).
28
+ *
29
+ * File layout (`~/.zelari-code/hooks/<name>.json` or
30
+ * `<project>/.zelari/hooks/<name>.json`):
31
+ *
32
+ * ```json
33
+ * {
34
+ * "name": "deny-rm",
35
+ * "match": { "tools": ["bash"], "events": ["PreToolUse"] },
36
+ * "command": "node deny-rm.mjs",
37
+ * "timeoutMs": 5000
38
+ * }
39
+ * ```
40
+ *
41
+ * Exactly one of `command` | `url` must be present.
42
+ */
43
+ export interface HookDefinition {
44
+ /** Stable hook name (used in logs + deny reason). */
45
+ name: string;
46
+ /** Tool/event matcher. */
47
+ match: HookToolMatch;
48
+ /** Shell command to run. Receives JSON on stdin, replies JSON on stdout. */
49
+ command?: string;
50
+ /** HTTP endpoint (POST). Receives JSON body, replies JSON body. */
51
+ url?: string;
52
+ /** Per-hook timeout in ms (default: runner default, 5000). */
53
+ timeoutMs?: number;
54
+ /** Working directory for the command (default: process.cwd()). */
55
+ cwd?: string;
56
+ }
57
+ /** JSON payload sent to a hook. */
58
+ export interface HookPayload {
59
+ event: HookEvent;
60
+ /** Normalized (canonical) tool name being invoked. */
61
+ toolName?: string;
62
+ /** Raw tool input args (validated). */
63
+ toolInput?: unknown;
64
+ /** Tool result for PostToolUse. */
65
+ toolOutput?: unknown;
66
+ /** Whether the tool call succeeded (PostToolUse). */
67
+ ok?: boolean;
68
+ sessionId?: string;
69
+ cwd?: string;
70
+ /** Error message when the tool call failed. */
71
+ error?: string;
72
+ }
73
+ /** JSON decision a hook must reply with. */
74
+ export type HookDecision = {
75
+ decision: 'allow';
76
+ } | {
77
+ decision: 'deny';
78
+ reason: string;
79
+ };
80
+ /** Result of a PreToolUse evaluation (always allow unless explicitly denied). */
81
+ export interface PreToolUseResult {
82
+ ok: boolean;
83
+ /** Hook name that denied (when !ok). */
84
+ hookName?: string;
85
+ /** Deny reason surfaced to the model/user (when !ok). */
86
+ reason?: string;
87
+ }
88
+ /** Result of a SessionStart/SessionEnd evaluation. */
89
+ export interface SessionHookResult {
90
+ ok: boolean;
91
+ hookName?: string;
92
+ reason?: string;
93
+ }
94
+ /**
95
+ * Normalize a tool name for matching: lowercase + strip separators, then
96
+ * apply Claude-style aliases so `Bash`/`shell`/`terminal` all map to `bash`
97
+ * and `Read`/`cat` map to `read_file`. Mirrors the registry alias map so
98
+ * hook authors can use either spelling.
99
+ */
100
+ export declare function normalizeToolName(raw: string): string;
101
+ /** True if `pattern` matches `toolName` (case/alias-insensitive, `*` = any). */
102
+ export declare function toolMatches(pattern: string, toolName: string): boolean;
103
+ /** True if this hook matches the given event + tool name. */
104
+ export declare function hookMatches(hook: HookDefinition, event: HookEvent, toolName: string | undefined): boolean;
105
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,wBAAwB;AACxB,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;AAErF,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iCAAiC;IACjC,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mCAAmC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GACrB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrD;AA4BD,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtE;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAQT"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Lifecycle hook types — provider-neutral contract for PreToolUse /
3
+ * PostToolUse / SessionStart / SessionEnd hooks.
4
+ *
5
+ * Design (v1.32.0):
6
+ * - FAIL-OPEN: a crashing, timing-out, or misbehaving hook NEVER blocks a
7
+ * tool. The only way to block is an explicit JSON decision `deny`.
8
+ * - Hooks are external processes (or HTTP endpoints) that receive a JSON
9
+ * payload on stdin / request body and reply with a JSON decision on
10
+ * stdout / response body.
11
+ * - Tool matching is Claude-code style: case/separator-insensitive and
12
+ * alias-aware (`Bash` matches tool `bash`, `Read` matches `read_file`).
13
+ *
14
+ * @see lifecycleHookRunner.ts — the runner that executes these hooks
15
+ * @since v1.32.0
16
+ */
17
+ /**
18
+ * Normalize a tool name for matching: lowercase + strip separators, then
19
+ * apply Claude-style aliases so `Bash`/`shell`/`terminal` all map to `bash`
20
+ * and `Read`/`cat` map to `read_file`. Mirrors the registry alias map so
21
+ * hook authors can use either spelling.
22
+ */
23
+ export function normalizeToolName(raw) {
24
+ const n = raw.toLowerCase().replace(/[_-]/g, '');
25
+ return TOOL_ALIASES[n] ?? n;
26
+ }
27
+ /** Alias map (Claude-code style). Keys are normalized (no separators). */
28
+ const TOOL_ALIASES = {
29
+ read: 'read_file',
30
+ readfile: 'read_file',
31
+ cat: 'read_file',
32
+ write: 'write_file',
33
+ writefile: 'write_file',
34
+ edit: 'edit_file',
35
+ editfile: 'edit_file',
36
+ glob: 'list_files',
37
+ listdir: 'list_files',
38
+ listdirectory: 'list_files',
39
+ ls: 'list_files',
40
+ dir: 'list_files',
41
+ find: 'list_files',
42
+ grep: 'grep_content',
43
+ search: 'grep_content',
44
+ searchrag: 'searchDocuments',
45
+ rag: 'searchDocuments',
46
+ shell: 'bash',
47
+ terminal: 'bash',
48
+ cmd: 'bash',
49
+ run: 'bash',
50
+ exec: 'bash',
51
+ };
52
+ /** True if `pattern` matches `toolName` (case/alias-insensitive, `*` = any). */
53
+ export function toolMatches(pattern, toolName) {
54
+ if (pattern === '*')
55
+ return true;
56
+ return normalizeToolName(pattern) === normalizeToolName(toolName);
57
+ }
58
+ /** True if this hook matches the given event + tool name. */
59
+ export function hookMatches(hook, event, toolName) {
60
+ if (!hook.match.events.includes(event))
61
+ return false;
62
+ if (event === 'PreToolUse' || event === 'PostToolUse') {
63
+ if (!toolName)
64
+ return false;
65
+ return hook.match.tools.some((t) => toolMatches(t, toolName));
66
+ }
67
+ // Session events: no tool component.
68
+ return true;
69
+ }
70
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAmFH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,0EAA0E;AAC1E,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,WAAW;IACrB,GAAG,EAAE,WAAW;IAChB,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,YAAY;IACvB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,YAAY;IACrB,aAAa,EAAE,YAAY;IAC3B,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,iBAAiB;IAC5B,GAAG,EAAE,iBAAiB;IACtB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,MAAM;IAChB,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,QAAgB;IAC3D,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,iBAAiB,CAAC,OAAO,CAAC,KAAK,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CACzB,IAAoB,EACpB,KAAgB,EAChB,QAA4B;IAE5B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QACtD,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,qCAAqC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { LifecycleHookRunner } from '../hooks/index.js';
1
2
  import { type ToolDefinition, type TypedResult } from './toolTypes.js';
2
3
  export { spillToolOutput, resolveToolOutputDir, isToolSpillEnabled } from './toolOutputSpill.js';
3
4
  export interface InvokeOptions {
@@ -33,8 +34,13 @@ export interface TruncateToolResultOptions {
33
34
  export declare function truncateToolResult(text: string, capOrOpts?: number | TruncateToolResultOptions): string;
34
35
  export declare class ToolRegistry {
35
36
  private tools;
37
+ /** v0.10.0: lifecycle hooks (PreToolUse/PostToolUse). Null = no hooks. */
38
+ private lifecycleHooks;
36
39
  register<I, O>(def: ToolDefinition<I, O>): void;
37
40
  get(name: string): ToolDefinition | undefined;
41
+ /** v0.10.0: attach the fail-open lifecycle hook runner (null to disable). */
42
+ setLifecycleHooks(runner: LifecycleHookRunner | null): void;
43
+ getLifecycleHooks(): LifecycleHookRunner | null;
38
44
  list(): string[];
39
45
  /**
40
46
  * Resolve a hallucinated tool name to a registered one, or null.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,cAAc,EAAoB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEjG,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA0DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAM,GAAG,yBAAgD,GACnE,MAAM,CA0DR;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAElD,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAI/C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,MAAM,EAAE;IAIhB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAMlB,gFAAgF;IAC1E,MAAM,CAAC,CAAC,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAkE1B,qEAAqE;IACrE,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;CAUnI;AAID,wBAAgB,eAAe,IAAI,YAAY,CAG9C"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAY,KAAK,cAAc,EAAoB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEjG,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA0DD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAM,GAAG,yBAAgD,GACnE,MAAM,CA0DR;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAClD,0EAA0E;IAC1E,OAAO,CAAC,cAAc,CAAoC;IAE1D,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAI/C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,6EAA6E;IAC7E,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI;IAI3D,iBAAiB,IAAI,mBAAmB,GAAG,IAAI;IAI/C,IAAI,IAAI,MAAM,EAAE;IAIhB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAMlB,gFAAgF;IAC1E,MAAM,CAAC,CAAC,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA8F1B,qEAAqE;IACrE,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAA;KAAE,CAAC;CAUnI;AAID,wBAAgB,eAAe,IAAI,YAAY,CAG9C"}
@@ -125,12 +125,21 @@ export function truncateToolResult(text, capOrOpts = TOOL_RESULT_LINE_CAP) {
125
125
  }
126
126
  export class ToolRegistry {
127
127
  tools = new Map();
128
+ /** v0.10.0: lifecycle hooks (PreToolUse/PostToolUse). Null = no hooks. */
129
+ lifecycleHooks = null;
128
130
  register(def) {
129
131
  this.tools.set(def.name, def);
130
132
  }
131
133
  get(name) {
132
134
  return this.tools.get(name);
133
135
  }
136
+ /** v0.10.0: attach the fail-open lifecycle hook runner (null to disable). */
137
+ setLifecycleHooks(runner) {
138
+ this.lifecycleHooks = runner;
139
+ }
140
+ getLifecycleHooks() {
141
+ return this.lifecycleHooks;
142
+ }
134
143
  list() {
135
144
  return Array.from(this.tools.keys());
136
145
  }
@@ -166,6 +175,21 @@ export class ToolRegistry {
166
175
  audit: () => { },
167
176
  sessionId: options.sessionId ?? 'default',
168
177
  };
178
+ // v0.10.0: PreToolUse lifecycle hooks — fail-open; deny blocks the tool.
179
+ if (this.lifecycleHooks) {
180
+ try {
181
+ const pre = await this.lifecycleHooks.runPreToolUse(name, parsed.data, {
182
+ sessionId: ctx.sessionId,
183
+ cwd: ctx.cwd,
184
+ });
185
+ if (!pre.ok) {
186
+ return typedErr(`[hook:${pre.hookName ?? 'unknown'}] ${pre.reason ?? 'denied'}`);
187
+ }
188
+ }
189
+ catch (hookErr) {
190
+ // Belt-and-suspenders: a throwing runner must never block the tool.
191
+ }
192
+ }
169
193
  try {
170
194
  const result = await Promise.race([
171
195
  tool.execute(parsed.data, ctx),
@@ -197,6 +221,20 @@ export class ToolRegistry {
197
221
  }
198
222
  }
199
223
  }
224
+ // v0.10.0: PostToolUse lifecycle hooks — fail-open, never blocks.
225
+ if (this.lifecycleHooks) {
226
+ try {
227
+ await this.lifecycleHooks.runPostToolUse(name, parsed.data, result, {
228
+ sessionId: ctx.sessionId,
229
+ cwd: ctx.cwd,
230
+ ok: result.ok,
231
+ error: result.ok ? undefined : ('error' in result ? result.error : undefined),
232
+ });
233
+ }
234
+ catch {
235
+ /* fail-open */
236
+ }
237
+ }
200
238
  return result;
201
239
  }
202
240
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,5 @@
6
6
  export * from '../core/AgentHarness.js';
7
7
  export * from '../core/providerStream.js';
8
8
  export * from '../core/sessionJsonl.js';
9
+ export * from '../core/hooks/index.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AAExC,cAAc,wBAAwB,CAAC"}
@@ -6,4 +6,6 @@
6
6
  export * from '../core/AgentHarness.js';
7
7
  export * from '../core/providerStream.js';
8
8
  export * from '../core/sessionJsonl.js';
9
+ // v1.32.0: lifecycle hooks (PreToolUse/PostToolUse/SessionStart/End) + fail-open runner.
10
+ export * from '../core/hooks/index.js';
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,yFAAyF;AACzF,cAAc,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zelari/core",
3
- "version": "1.31.1",
3
+ "version": "1.32.0",
4
4
  "description": "Zelari Code core library — provider-neutral agent loop (AgentHarness), multi-agent council orchestration, and built-in skills. Used by the zelari-code CLI; consumable by other agent frontends.",
5
5
  "author": "Anathema Studio <https://anathema-studio.com/>",
6
6
  "license": "MIT",