@openrouter/agent 0.7.1 → 0.8.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.
Files changed (64) hide show
  1. package/README.md +248 -17
  2. package/esm/index.d.ts +8 -5
  3. package/esm/index.d.ts.map +1 -1
  4. package/esm/index.js +12 -4
  5. package/esm/index.js.map +1 -1
  6. package/esm/inner-loop/call-model.d.ts +8 -5
  7. package/esm/inner-loop/call-model.d.ts.map +1 -1
  8. package/esm/inner-loop/call-model.js +16 -6
  9. package/esm/inner-loop/call-model.js.map +1 -1
  10. package/esm/lib/async-params.d.ts +25 -6
  11. package/esm/lib/async-params.d.ts.map +1 -1
  12. package/esm/lib/async-params.js +3 -1
  13. package/esm/lib/async-params.js.map +1 -1
  14. package/esm/lib/conversation-state.d.ts +44 -1
  15. package/esm/lib/conversation-state.d.ts.map +1 -1
  16. package/esm/lib/conversation-state.js +111 -0
  17. package/esm/lib/conversation-state.js.map +1 -1
  18. package/esm/lib/hooks-emit.d.ts +50 -0
  19. package/esm/lib/hooks-emit.d.ts.map +1 -0
  20. package/esm/lib/hooks-emit.js +307 -0
  21. package/esm/lib/hooks-emit.js.map +1 -0
  22. package/esm/lib/hooks-manager.d.ts +141 -0
  23. package/esm/lib/hooks-manager.d.ts.map +1 -0
  24. package/esm/lib/hooks-manager.js +282 -0
  25. package/esm/lib/hooks-manager.js.map +1 -0
  26. package/esm/lib/hooks-matchers.d.ts +12 -0
  27. package/esm/lib/hooks-matchers.d.ts.map +1 -0
  28. package/esm/lib/hooks-matchers.js +26 -0
  29. package/esm/lib/hooks-matchers.js.map +1 -0
  30. package/esm/lib/hooks-resolve.d.ts +17 -0
  31. package/esm/lib/hooks-resolve.d.ts.map +1 -0
  32. package/esm/lib/hooks-resolve.js +42 -0
  33. package/esm/lib/hooks-resolve.js.map +1 -0
  34. package/esm/lib/hooks-schemas.d.ts +188 -0
  35. package/esm/lib/hooks-schemas.d.ts.map +1 -0
  36. package/esm/lib/hooks-schemas.js +184 -0
  37. package/esm/lib/hooks-schemas.js.map +1 -0
  38. package/esm/lib/hooks-types.d.ts +174 -0
  39. package/esm/lib/hooks-types.d.ts.map +1 -0
  40. package/esm/lib/hooks-types.js +45 -0
  41. package/esm/lib/hooks-types.js.map +1 -0
  42. package/esm/lib/model-result.d.ts +209 -9
  43. package/esm/lib/model-result.d.ts.map +1 -1
  44. package/esm/lib/model-result.js +1397 -348
  45. package/esm/lib/model-result.js.map +1 -1
  46. package/esm/lib/reusable-stream.d.ts +6 -0
  47. package/esm/lib/reusable-stream.d.ts.map +1 -1
  48. package/esm/lib/reusable-stream.js +8 -0
  49. package/esm/lib/reusable-stream.js.map +1 -1
  50. package/esm/lib/tool-executor.d.ts.map +1 -1
  51. package/esm/lib/tool-executor.js +11 -1
  52. package/esm/lib/tool-executor.js.map +1 -1
  53. package/esm/lib/tool-orchestrator.d.ts.map +1 -1
  54. package/esm/lib/tool-orchestrator.js +4 -1
  55. package/esm/lib/tool-orchestrator.js.map +1 -1
  56. package/esm/lib/tool-types.d.ts +137 -45
  57. package/esm/lib/tool-types.d.ts.map +1 -1
  58. package/esm/lib/tool-types.js +13 -0
  59. package/esm/lib/tool-types.js.map +1 -1
  60. package/esm/lib/tool.d.ts +35 -25
  61. package/esm/lib/tool.d.ts.map +1 -1
  62. package/esm/lib/tool.js +19 -0
  63. package/esm/lib/tool.js.map +1 -1
  64. package/package.json +7 -3
@@ -5,16 +5,59 @@ import type { ConversationState, ParsedToolCall, Tool, TurnContext, UnsentToolRe
5
5
  * Uses crypto.randomUUID if available, falls back to timestamp + random
6
6
  */
7
7
  export declare function generateConversationId(): string;
8
+ /** Currently supported ConversationState serialization version. */
9
+ export declare const CONVERSATION_STATE_VERSION: 1;
8
10
  /**
9
11
  * Create an initial conversation state
10
12
  * @param id - Optional custom ID, generates one if not provided
11
13
  */
12
14
  export declare function createInitialState<TTools extends readonly Tool[] = readonly Tool[]>(id?: string): ConversationState<TTools>;
15
+ /**
16
+ * Thrown when {@link deserializeConversationState} encounters a state blob whose
17
+ * `version` is not supported by this SDK build.
18
+ */
19
+ export declare class UnsupportedStateVersionError extends Error {
20
+ readonly found: number;
21
+ readonly supported: readonly number[];
22
+ constructor(found: number, supported?: readonly number[]);
23
+ }
24
+ /**
25
+ * Thrown when {@link deserializeConversationState} receives JSON that is not a
26
+ * well-formed ConversationState (missing/wrong required fields, or invalid JSON).
27
+ */
28
+ export declare class InvalidStateError extends Error {
29
+ constructor(message: string);
30
+ }
31
+ /**
32
+ * Serialize a {@link ConversationState} to a stable JSON string for durable storage.
33
+ *
34
+ * Guarantees the `version` field is present (injects `1` when the input state
35
+ * lacks it). Treat the returned JSON as **opaque**: consumers should round-trip
36
+ * via these helpers rather than introspecting item shapes.
37
+ *
38
+ * **Compat policy:** additive field changes within a major version. On version
39
+ * bumps, migrations run inside {@link deserializeConversationState}. The
40
+ * StateAccessor load/save contract is unchanged — these helpers are opt-in.
41
+ */
42
+ export declare function serializeConversationState<TTools extends readonly Tool[] = readonly Tool[]>(state: ConversationState<TTools>): string;
43
+ /**
44
+ * Parse and validate a previously serialized {@link ConversationState}.
45
+ *
46
+ * Accepts version-less legacy blobs and states with `version: 1`, normalizing
47
+ * both to `version: 1`. Throws {@link UnsupportedStateVersionError} for any
48
+ * other version (fail loudly so stores don't silently misinterpret future
49
+ * shapes). Throws {@link InvalidStateError} for malformed JSON or missing
50
+ * required fields (`id`, `messages`, `status`).
51
+ *
52
+ * **Compat policy:** absence of `version` means v1. Migrations for future
53
+ * versions happen here; callers should treat the JSON as opaque.
54
+ */
55
+ export declare function deserializeConversationState<TTools extends readonly Tool[] = readonly Tool[]>(json: string): ConversationState<TTools>;
13
56
  /**
14
57
  * Update a conversation state with new values
15
58
  * Automatically updates the updatedAt timestamp
16
59
  */
17
- export declare function updateState<TTools extends readonly Tool[] = readonly Tool[]>(state: ConversationState<TTools>, updates: Partial<Omit<ConversationState<TTools>, 'id' | 'createdAt' | 'updatedAt'>>): ConversationState<TTools>;
60
+ export declare function updateState<TTools extends readonly Tool[] = readonly Tool[]>(state: ConversationState<TTools>, updates: Partial<Omit<ConversationState<TTools>, 'id' | 'createdAt' | 'updatedAt' | 'version'>>): ConversationState<TTools>;
18
61
  /**
19
62
  * Append new items to the message history
20
63
  */
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-state.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-state.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-state.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,8 @@ export function generateConversationId() {
37
37
  // Fallback for environments without crypto.randomUUID
38
38
  return `conv_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
39
39
  }
40
+ /** Currently supported ConversationState serialization version. */
41
+ export const CONVERSATION_STATE_VERSION = 1;
40
42
  /**
41
43
  * Create an initial conversation state
42
44
  * @param id - Optional custom ID, generates one if not provided
@@ -44,6 +46,7 @@ export function generateConversationId() {
44
46
  export function createInitialState(id) {
45
47
  const now = Date.now();
46
48
  return {
49
+ version: CONVERSATION_STATE_VERSION,
47
50
  id: id ?? generateConversationId(),
48
51
  messages: [],
49
52
  status: 'in_progress',
@@ -51,6 +54,114 @@ export function createInitialState(id) {
51
54
  updatedAt: now,
52
55
  };
53
56
  }
57
+ /**
58
+ * Thrown when {@link deserializeConversationState} encounters a state blob whose
59
+ * `version` is not supported by this SDK build.
60
+ */
61
+ export class UnsupportedStateVersionError extends Error {
62
+ constructor(found, supported = [
63
+ CONVERSATION_STATE_VERSION,
64
+ ]) {
65
+ super(`Unsupported ConversationState version ${found}; supported version(s): ${supported.join(', ')}`);
66
+ this.name = 'UnsupportedStateVersionError';
67
+ this.found = found;
68
+ this.supported = supported;
69
+ }
70
+ }
71
+ /**
72
+ * Thrown when {@link deserializeConversationState} receives JSON that is not a
73
+ * well-formed ConversationState (missing/wrong required fields, or invalid JSON).
74
+ */
75
+ export class InvalidStateError extends Error {
76
+ constructor(message) {
77
+ super(message);
78
+ this.name = 'InvalidStateError';
79
+ }
80
+ }
81
+ /**
82
+ * Serialize a {@link ConversationState} to a stable JSON string for durable storage.
83
+ *
84
+ * Guarantees the `version` field is present (injects `1` when the input state
85
+ * lacks it). Treat the returned JSON as **opaque**: consumers should round-trip
86
+ * via these helpers rather than introspecting item shapes.
87
+ *
88
+ * **Compat policy:** additive field changes within a major version. On version
89
+ * bumps, migrations run inside {@link deserializeConversationState}. The
90
+ * StateAccessor load/save contract is unchanged — these helpers are opt-in.
91
+ */
92
+ export function serializeConversationState(state) {
93
+ return JSON.stringify({
94
+ ...state,
95
+ version: state.version ?? CONVERSATION_STATE_VERSION,
96
+ });
97
+ }
98
+ /**
99
+ * Parse and validate a previously serialized {@link ConversationState}.
100
+ *
101
+ * Accepts version-less legacy blobs and states with `version: 1`, normalizing
102
+ * both to `version: 1`. Throws {@link UnsupportedStateVersionError} for any
103
+ * other version (fail loudly so stores don't silently misinterpret future
104
+ * shapes). Throws {@link InvalidStateError} for malformed JSON or missing
105
+ * required fields (`id`, `messages`, `status`).
106
+ *
107
+ * **Compat policy:** absence of `version` means v1. Migrations for future
108
+ * versions happen here; callers should treat the JSON as opaque.
109
+ */
110
+ export function deserializeConversationState(json) {
111
+ let parsed;
112
+ try {
113
+ parsed = JSON.parse(json);
114
+ }
115
+ catch (error) {
116
+ throw new InvalidStateError(`Invalid ConversationState JSON: ${error instanceof Error ? error.message : String(error)}`);
117
+ }
118
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
119
+ throw new InvalidStateError('ConversationState must be a JSON object');
120
+ }
121
+ const obj = parsed;
122
+ // Version check runs before structural validation: a future-version blob may
123
+ // have a different shape, and it must fail with UnsupportedStateVersionError
124
+ // rather than a misleading InvalidStateError about v1 fields.
125
+ const version = obj['version'];
126
+ if (version !== undefined && version !== CONVERSATION_STATE_VERSION) {
127
+ if (typeof version !== 'number') {
128
+ throw new InvalidStateError(`ConversationState field "version" must be a number when present (got ${describeType(version)})`);
129
+ }
130
+ throw new UnsupportedStateVersionError(version, [
131
+ CONVERSATION_STATE_VERSION,
132
+ ]);
133
+ }
134
+ if (typeof obj['id'] !== 'string') {
135
+ throw new InvalidStateError(`ConversationState missing or invalid field "id" (expected string, got ${describeType(obj['id'])})`);
136
+ }
137
+ // messages is models.InputsUnion — typically an array of items, but the type
138
+ // also allows a single item / string; require array for durable store blobs.
139
+ if (!Array.isArray(obj['messages'])) {
140
+ throw new InvalidStateError(`ConversationState missing or invalid field "messages" (expected array, got ${describeType(obj['messages'])})`);
141
+ }
142
+ if (typeof obj['status'] !== 'string') {
143
+ throw new InvalidStateError(`ConversationState missing or invalid field "status" (expected string, got ${describeType(obj['status'])})`);
144
+ }
145
+ if (typeof obj['createdAt'] !== 'number') {
146
+ throw new InvalidStateError(`ConversationState missing or invalid field "createdAt" (expected number, got ${describeType(obj['createdAt'])})`);
147
+ }
148
+ if (typeof obj['updatedAt'] !== 'number') {
149
+ throw new InvalidStateError(`ConversationState missing or invalid field "updatedAt" (expected number, got ${describeType(obj['updatedAt'])})`);
150
+ }
151
+ return {
152
+ ...obj,
153
+ version: CONVERSATION_STATE_VERSION,
154
+ };
155
+ }
156
+ function describeType(value) {
157
+ if (value === null) {
158
+ return 'null';
159
+ }
160
+ if (Array.isArray(value)) {
161
+ return 'array';
162
+ }
163
+ return typeof value;
164
+ }
54
165
  /**
55
166
  * Update a conversation state with new values
56
167
  * Automatically updates the updatedAt timestamp
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-state.js","sourceRoot":"","sources":["../../src/lib/conversation-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-state.js","sourceRoot":"","sources":["../../src/lib/conversation-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { $ZodType } from 'zod/v4/core';
2
+ import type { EmitResult, HookEntry, LifecycleHookContext } from './hooks-types.js';
3
+ export interface ExecuteChainOptions {
4
+ readonly hookName: string;
5
+ readonly throwOnHandlerError: boolean;
6
+ readonly toolName?: string | undefined;
7
+ /**
8
+ * Optional Zod schema to validate each handler's result BEFORE the chain
9
+ * applies mutation piping or short-circuit logic. Validation errors are
10
+ * handled the same way as handler throws: either re-thrown (strict mode) or
11
+ * logged as a warning (default).
12
+ *
13
+ * Void-typed hooks typically pass `undefined` here; results in that case are
14
+ * not validated.
15
+ */
16
+ readonly resultSchema?: $ZodType | undefined;
17
+ /**
18
+ * Invoked when a handler's fire-and-forget `work` exceeds its
19
+ * `asyncTimeout`. The manager uses this to abort the emit's signal so
20
+ * handlers that observe `context.signal` can cancel the stale work.
21
+ */
22
+ readonly onAsyncTimeout?: ((hookName: string) => void) | undefined;
23
+ }
24
+ /**
25
+ * Execute a chain of hook handlers sequentially.
26
+ *
27
+ * Supports:
28
+ * - ToolMatcher and filter-based skipping (matcher fails closed: a handler with
29
+ * a matcher and no `options.toolName` is skipped)
30
+ * - Sync results validated against `options.resultSchema` and collected into `results`
31
+ * - Async fire-and-forget via a returned {@link AsyncOutput} -- the handler's
32
+ * `work` promise is pushed to `pending` without being awaited; the manager is
33
+ * responsible for draining/timing out that work
34
+ * - Per-hook mutation piping (driven by {@link HOOK_BEHAVIOR})
35
+ * - Short-circuit on block/reject fields (non-empty string or `true`)
36
+ * - Cooperative abort via `context.signal`: the chain checks
37
+ * `signal.aborted` between handlers and bails out when set so
38
+ * `abortInflight()` has a deterministic effect on the chain itself (not just
39
+ * on handlers that happen to consult the signal).
40
+ *
41
+ * Payload isolation: the initial payload is shallow-cloned before entering the
42
+ * chain so mutation piping (via {@link HOOK_BEHAVIOR}) doesn't mutate the
43
+ * caller's payload at the top level. This is a top-level-only guarantee:
44
+ * handlers that directly mutate a nested object (e.g.
45
+ * `payload.toolInput.foo = 'bar'`) still reach the caller's original nested
46
+ * reference. Handlers MUST return mutations via the documented result fields
47
+ * (e.g. `mutatedInput`) rather than mutating nested payload fields in place.
48
+ */
49
+ export declare function executeHandlerChain<P, R>(entries: ReadonlyArray<HookEntry<P, R>>, initialPayload: P, context: LifecycleHookContext, options: ExecuteChainOptions): Promise<EmitResult<R, P>>;
50
+ //# sourceMappingURL=hooks-emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-emit.d.ts","sourceRoot":"","sources":["../../src/lib/hooks-emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAEV,UAAU,EAEV,SAAS,EACT,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACpE;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAC5C,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACvC,cAAc,EAAE,CAAC,EACjB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CA6F3B"}
@@ -0,0 +1,307 @@
1
+ import { safeParse } from 'zod/v4/core';
2
+ import { matchesTool } from './hooks-matchers.js';
3
+ import { DEFAULT_ASYNC_TIMEOUT, HOOK_BEHAVIOR, isAsyncOutput } from './hooks-types.js';
4
+ /**
5
+ * Returns true only for plain objects (prototype of `Object.prototype` or
6
+ * `null`) -- values where object-spread cloning is safe. Custom hooks can
7
+ * register payload schemas like `z.number()`, `z.string()`, `z.array(...)`,
8
+ * or `z.date()`; spreading a primitive silently produces `{}`, spreading an
9
+ * array reindexes it into an object, and spreading a `Date`/`Map`/class
10
+ * instance flattens it to a near-empty POJO. All of those would hand handlers
11
+ * a mangled value, so only true plain objects are cloned; everything else
12
+ * passes through untouched (and does not participate in mutation piping).
13
+ */
14
+ function isPlainMutableObject(value) {
15
+ if (typeof value !== 'object' || value === null) {
16
+ return false;
17
+ }
18
+ const proto = Object.getPrototypeOf(value);
19
+ return proto === Object.prototype || proto === null;
20
+ }
21
+ /**
22
+ * Execute a chain of hook handlers sequentially.
23
+ *
24
+ * Supports:
25
+ * - ToolMatcher and filter-based skipping (matcher fails closed: a handler with
26
+ * a matcher and no `options.toolName` is skipped)
27
+ * - Sync results validated against `options.resultSchema` and collected into `results`
28
+ * - Async fire-and-forget via a returned {@link AsyncOutput} -- the handler's
29
+ * `work` promise is pushed to `pending` without being awaited; the manager is
30
+ * responsible for draining/timing out that work
31
+ * - Per-hook mutation piping (driven by {@link HOOK_BEHAVIOR})
32
+ * - Short-circuit on block/reject fields (non-empty string or `true`)
33
+ * - Cooperative abort via `context.signal`: the chain checks
34
+ * `signal.aborted` between handlers and bails out when set so
35
+ * `abortInflight()` has a deterministic effect on the chain itself (not just
36
+ * on handlers that happen to consult the signal).
37
+ *
38
+ * Payload isolation: the initial payload is shallow-cloned before entering the
39
+ * chain so mutation piping (via {@link HOOK_BEHAVIOR}) doesn't mutate the
40
+ * caller's payload at the top level. This is a top-level-only guarantee:
41
+ * handlers that directly mutate a nested object (e.g.
42
+ * `payload.toolInput.foo = 'bar'`) still reach the caller's original nested
43
+ * reference. Handlers MUST return mutations via the documented result fields
44
+ * (e.g. `mutatedInput`) rather than mutating nested payload fields in place.
45
+ */
46
+ export async function executeHandlerChain(entries, initialPayload, context, options) {
47
+ const results = [];
48
+ const pending = [];
49
+ // Only clone when the payload is a plain mutable object. Spreading a
50
+ // primitive (e.g. a custom hook's `z.number()` payload) would silently
51
+ // produce `{}`; spreading an array reindexes it into an object. For those
52
+ // cases we pass the value through untouched so handlers see the original
53
+ // typed-`P` value. For plain objects we still clone so the chain can apply
54
+ // mutation piping without mutating the caller's payload at the top level.
55
+ // Nested fields are shared with the caller; see the function-level docstring
56
+ // for the invariant handlers are expected to respect.
57
+ let currentPayload = isPlainMutableObject(initialPayload)
58
+ ? {
59
+ ...initialPayload,
60
+ }
61
+ : initialPayload;
62
+ let blocked = false;
63
+ let mutated = false;
64
+ // Per-hook mutation/block behavior. Hooks absent from the table (all
65
+ // observation-only hooks and every custom hook) collect results without
66
+ // altering the payload or short-circuiting.
67
+ const behavior = HOOK_BEHAVIOR[options.hookName];
68
+ for (let i = 0; i < entries.length; i++) {
69
+ // Cooperative abort: bail out of the chain when abortInflight() has fired.
70
+ // Checked before each handler so synchronous chains stop promptly instead
71
+ // of running to completion with only advisory notice to each handler.
72
+ if (context.signal.aborted) {
73
+ break;
74
+ }
75
+ const entry = entries[i];
76
+ if (!entry) {
77
+ continue;
78
+ }
79
+ // Matcher and filter checks run under the same error policy as handlers:
80
+ // in non-strict mode a throwing user-supplied matcher function or filter
81
+ // is logged and the entry skipped, instead of crashing the whole chain.
82
+ const gate = evaluateEntryGate(entry, currentPayload, i, options);
83
+ if (gate === 'skip') {
84
+ continue;
85
+ }
86
+ try {
87
+ const returnValue = await entry.handler(currentPayload, context);
88
+ const outcome = classifyHandlerReturn(returnValue, i, options);
89
+ if (outcome.kind === 'async') {
90
+ // Fire-and-forget: track the (optional) work promise for drain/timeout.
91
+ if (outcome.trackedWork !== undefined) {
92
+ pending.push(outcome.trackedWork);
93
+ }
94
+ continue;
95
+ }
96
+ if (outcome.kind === 'skip') {
97
+ // Void return, or result-schema validation failed in non-strict mode.
98
+ continue;
99
+ }
100
+ const result = outcome.result;
101
+ results.push(result);
102
+ // Apply mutation piping -- only hooks with declared mutations participate.
103
+ if (behavior?.mutations) {
104
+ const applied = applyMutations(currentPayload, result, behavior.mutations);
105
+ if (applied !== currentPayload) {
106
+ currentPayload = applied;
107
+ mutated = true;
108
+ }
109
+ }
110
+ // Short-circuit on the hook's declared block field.
111
+ if (behavior?.blockField && isBlockTriggered(result, behavior.blockField)) {
112
+ blocked = true;
113
+ break;
114
+ }
115
+ }
116
+ catch (error) {
117
+ if (options.throwOnHandlerError) {
118
+ throw error;
119
+ }
120
+ console.warn(`[HooksManager] Handler ${i} for hook "${options.hookName}" threw:`, error);
121
+ }
122
+ }
123
+ return {
124
+ results,
125
+ pending,
126
+ finalPayload: currentPayload,
127
+ blocked,
128
+ mutated,
129
+ };
130
+ }
131
+ /**
132
+ * Evaluate an entry's matcher and filter under the chain's error policy.
133
+ *
134
+ * Matchers fail closed: if a matcher is registered and no toolName is
135
+ * available for this emit, the handler is skipped rather than invoked
136
+ * globally. A throwing matcher function or filter is re-thrown in strict
137
+ * mode, or logged and treated as a skip otherwise.
138
+ */
139
+ function evaluateEntryGate(entry, payload, index, options) {
140
+ try {
141
+ // Matcher first; the filter must not run when the matcher already
142
+ // rejected the entry (filters can be effectful or expensive).
143
+ const matcherPasses = entry.matcher === undefined ||
144
+ (options.toolName !== undefined && matchesTool(entry.matcher, options.toolName));
145
+ if (!matcherPasses) {
146
+ return 'skip';
147
+ }
148
+ return !entry.filter || Boolean(entry.filter(payload)) ? 'run' : 'skip';
149
+ }
150
+ catch (error) {
151
+ if (options.throwOnHandlerError) {
152
+ throw error;
153
+ }
154
+ console.warn(`[HooksManager] Matcher/filter for handler ${index} of hook "${options.hookName}" threw:`, error);
155
+ return 'skip';
156
+ }
157
+ }
158
+ /**
159
+ * Classify a handler's return value into one of three outcomes:
160
+ *
161
+ * - `async`: an {@link AsyncOutput} fire-and-forget signal (with the tracked
162
+ * work promise, if any)
163
+ * - `skip`: void/undefined/null (side-effect only), or a result that failed
164
+ * schema validation in non-strict mode
165
+ * - `result`: a validated result. When a result schema is supplied, the
166
+ * parsed output is returned -- which may differ from the input for schemas
167
+ * with .transform() / .default() / .catch() / .coerce -- so downstream
168
+ * callers see transformed values. Validation failure in strict mode throws.
169
+ */
170
+ function classifyHandlerReturn(returnValue, index, options) {
171
+ if (isAsyncOutput(returnValue)) {
172
+ return {
173
+ kind: 'async',
174
+ trackedWork: trackAsyncWork(returnValue, options.hookName, options.onAsyncTimeout),
175
+ };
176
+ }
177
+ if (returnValue === undefined || returnValue === null) {
178
+ return {
179
+ kind: 'skip',
180
+ };
181
+ }
182
+ if (!options.resultSchema) {
183
+ return {
184
+ kind: 'result',
185
+ result: returnValue,
186
+ };
187
+ }
188
+ const validation = safeParse(options.resultSchema, returnValue);
189
+ if (!validation.success) {
190
+ const err = new Error(`[HooksManager] Handler ${index} for hook "${options.hookName}" returned an invalid result: ${validation.error.message}`);
191
+ if (options.throwOnHandlerError) {
192
+ throw err;
193
+ }
194
+ console.warn(err.message);
195
+ return {
196
+ kind: 'skip',
197
+ };
198
+ }
199
+ return {
200
+ kind: 'result',
201
+ result: validation.data,
202
+ };
203
+ }
204
+ /**
205
+ * Given an {@link AsyncOutput} signal, return a Promise<void> that resolves
206
+ * when the handler's detached `work` settles OR the timeout fires -- whichever
207
+ * is first. Returns `undefined` if there is no work to track.
208
+ *
209
+ * On timeout, `onTimeout` is invoked (the manager uses it to abort the emit's
210
+ * signal) and the tracking promise resolves so `drain()` stops waiting. The
211
+ * detached `work` itself cannot be forcibly cancelled -- handlers must observe
212
+ * `context.signal` to actually stop; the timeout only bounds how long the
213
+ * manager waits and signals cancellation cooperatively.
214
+ *
215
+ * Rejections of the detached `work` promise are logged as warnings. Note:
216
+ * `throwOnHandlerError` governs synchronous handler failures only -- detached
217
+ * fire-and-forget work never re-throws here, it just surfaces via the warning.
218
+ */
219
+ function trackAsyncWork(output, hookName, onTimeout) {
220
+ if (output.work === undefined) {
221
+ return undefined;
222
+ }
223
+ const timeout = output.asyncTimeout ?? DEFAULT_ASYNC_TIMEOUT;
224
+ return new Promise((resolve) => {
225
+ let settled = false;
226
+ const finish = () => {
227
+ if (settled) {
228
+ return;
229
+ }
230
+ settled = true;
231
+ clearTimeout(timeoutId);
232
+ resolve();
233
+ };
234
+ const timeoutId = setTimeout(() => {
235
+ if (!settled) {
236
+ console.warn(`[HooksManager] Async work for hook "${hookName}" exceeded its ${timeout}ms timeout; abandoning wait.`);
237
+ onTimeout?.(hookName);
238
+ }
239
+ finish();
240
+ }, timeout);
241
+ // In Node.js, Timeout objects expose `.unref()` to remove the reference
242
+ // the timer holds on the event loop. Without this, a leaked hook whose
243
+ // `work` never settles keeps the process alive for the full
244
+ // DEFAULT_ASYNC_TIMEOUT window after the main workload has finished.
245
+ // Guarded for browsers / other environments that return a plain number
246
+ // from setTimeout and don't expose the method.
247
+ if (isUnrefable(timeoutId)) {
248
+ timeoutId.unref();
249
+ }
250
+ output.work?.then(finish, (error) => {
251
+ console.warn(`[HooksManager] Async work for hook "${hookName}" rejected:`, error);
252
+ finish();
253
+ });
254
+ });
255
+ }
256
+ /**
257
+ * Typeguard for the Node.js Timeout object that carries a `.unref()` method.
258
+ * Browsers and other environments return a number from setTimeout, which has
259
+ * no such method.
260
+ */
261
+ function isUnrefable(handle) {
262
+ if (typeof handle !== 'object' || handle === null || !('unref' in handle)) {
263
+ return false;
264
+ }
265
+ const candidate = handle;
266
+ return typeof candidate.unref === 'function';
267
+ }
268
+ /**
269
+ * Apply mutation fields from a result onto the current payload.
270
+ */
271
+ function applyMutations(payload, result, mutationMap) {
272
+ if (typeof result !== 'object' || result === null) {
273
+ return payload;
274
+ }
275
+ let mutated = payload;
276
+ for (const [resultField, payloadField] of Object.entries(mutationMap)) {
277
+ if (resultField in result) {
278
+ const value = result[resultField];
279
+ if (value !== undefined) {
280
+ mutated = {
281
+ ...mutated,
282
+ [payloadField]: value,
283
+ };
284
+ }
285
+ }
286
+ }
287
+ return mutated;
288
+ }
289
+ /**
290
+ * Check if a result triggers a short-circuit block.
291
+ *
292
+ * A block fires when the field is `=== true` or a non-empty string. Empty
293
+ * strings are treated as "no block reason supplied" -- they do NOT trigger a
294
+ * short-circuit, which keeps emit consistent with callers that look up the
295
+ * first block reason with a truthy check.
296
+ */
297
+ function isBlockTriggered(result, blockField) {
298
+ if (typeof result !== 'object' || result === null) {
299
+ return false;
300
+ }
301
+ const value = result[blockField];
302
+ if (value === true) {
303
+ return true;
304
+ }
305
+ return typeof value === 'string' && value.length > 0;
306
+ }
307
+ //# sourceMappingURL=hooks-emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-emit.js","sourceRoot":"","sources":["../../src/lib/hooks-emit.ts"],"names":[],"mappings":"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"}