@yeshwanthyk/runtime-effect 0.1.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 (130) hide show
  1. package/README.md +19 -0
  2. package/dist/agent.d.ts +15 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +28 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/config.d.ts +65 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +232 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/extensibility/custom-commands.d.ts +51 -0
  11. package/dist/extensibility/custom-commands.d.ts.map +1 -0
  12. package/dist/extensibility/custom-commands.js +139 -0
  13. package/dist/extensibility/custom-commands.js.map +1 -0
  14. package/dist/extensibility/custom-tools/index.d.ts +6 -0
  15. package/dist/extensibility/custom-tools/index.d.ts.map +1 -0
  16. package/dist/extensibility/custom-tools/index.js +5 -0
  17. package/dist/extensibility/custom-tools/index.js.map +1 -0
  18. package/dist/extensibility/custom-tools/loader.d.ts +24 -0
  19. package/dist/extensibility/custom-tools/loader.d.ts.map +1 -0
  20. package/dist/extensibility/custom-tools/loader.js +219 -0
  21. package/dist/extensibility/custom-tools/loader.js.map +1 -0
  22. package/dist/extensibility/custom-tools/types.d.ts +102 -0
  23. package/dist/extensibility/custom-tools/types.d.ts.map +1 -0
  24. package/dist/extensibility/custom-tools/types.js +5 -0
  25. package/dist/extensibility/custom-tools/types.js.map +1 -0
  26. package/dist/extensibility/index.d.ts +36 -0
  27. package/dist/extensibility/index.d.ts.map +1 -0
  28. package/dist/extensibility/index.js +79 -0
  29. package/dist/extensibility/index.js.map +1 -0
  30. package/dist/extensibility/schema.d.ts +40 -0
  31. package/dist/extensibility/schema.d.ts.map +1 -0
  32. package/dist/extensibility/schema.js +75 -0
  33. package/dist/extensibility/schema.js.map +1 -0
  34. package/dist/extensibility/validation.d.ts +11 -0
  35. package/dist/extensibility/validation.d.ts.map +1 -0
  36. package/dist/extensibility/validation.js +59 -0
  37. package/dist/extensibility/validation.js.map +1 -0
  38. package/dist/hooks/context-controller.d.ts +25 -0
  39. package/dist/hooks/context-controller.d.ts.map +1 -0
  40. package/dist/hooks/context-controller.js +21 -0
  41. package/dist/hooks/context-controller.js.map +1 -0
  42. package/dist/hooks/effects.d.ts +25 -0
  43. package/dist/hooks/effects.d.ts.map +1 -0
  44. package/dist/hooks/effects.js +45 -0
  45. package/dist/hooks/effects.js.map +1 -0
  46. package/dist/hooks/hook-messages.d.ts +10 -0
  47. package/dist/hooks/hook-messages.d.ts.map +1 -0
  48. package/dist/hooks/hook-messages.js +28 -0
  49. package/dist/hooks/hook-messages.js.map +1 -0
  50. package/dist/hooks/hook-tool-adapter.d.ts +12 -0
  51. package/dist/hooks/hook-tool-adapter.d.ts.map +1 -0
  52. package/dist/hooks/hook-tool-adapter.js +39 -0
  53. package/dist/hooks/hook-tool-adapter.js.map +1 -0
  54. package/dist/hooks/hook-transport.d.ts +19 -0
  55. package/dist/hooks/hook-transport.d.ts.map +1 -0
  56. package/dist/hooks/hook-transport.js +29 -0
  57. package/dist/hooks/hook-transport.js.map +1 -0
  58. package/dist/hooks/hook-ui-context.d.ts +20 -0
  59. package/dist/hooks/hook-ui-context.d.ts.map +1 -0
  60. package/dist/hooks/hook-ui-context.js +16 -0
  61. package/dist/hooks/hook-ui-context.js.map +1 -0
  62. package/dist/hooks/index.d.ts +17 -0
  63. package/dist/hooks/index.d.ts.map +1 -0
  64. package/dist/hooks/index.js +27 -0
  65. package/dist/hooks/index.js.map +1 -0
  66. package/dist/hooks/loader.d.ts +59 -0
  67. package/dist/hooks/loader.d.ts.map +1 -0
  68. package/dist/hooks/loader.js +170 -0
  69. package/dist/hooks/loader.js.map +1 -0
  70. package/dist/hooks/message-transformer.d.ts +16 -0
  71. package/dist/hooks/message-transformer.d.ts.map +1 -0
  72. package/dist/hooks/message-transformer.js +46 -0
  73. package/dist/hooks/message-transformer.js.map +1 -0
  74. package/dist/hooks/runner.d.ts +109 -0
  75. package/dist/hooks/runner.d.ts.map +1 -0
  76. package/dist/hooks/runner.js +426 -0
  77. package/dist/hooks/runner.js.map +1 -0
  78. package/dist/hooks/tool-wrapper.d.ts +16 -0
  79. package/dist/hooks/tool-wrapper.d.ts.map +1 -0
  80. package/dist/hooks/tool-wrapper.js +74 -0
  81. package/dist/hooks/tool-wrapper.js.map +1 -0
  82. package/dist/hooks/types.d.ts +431 -0
  83. package/dist/hooks/types.d.ts.map +1 -0
  84. package/dist/hooks/types.js +8 -0
  85. package/dist/hooks/types.js.map +1 -0
  86. package/dist/index.d.ts +17 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +17 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/instrumentation.d.ts +56 -0
  91. package/dist/instrumentation.d.ts.map +1 -0
  92. package/dist/instrumentation.js +13 -0
  93. package/dist/instrumentation.js.map +1 -0
  94. package/dist/lazy-tool-loader.d.ts +67 -0
  95. package/dist/lazy-tool-loader.d.ts.map +1 -0
  96. package/dist/lazy-tool-loader.js +129 -0
  97. package/dist/lazy-tool-loader.js.map +1 -0
  98. package/dist/lsp.d.ts +16 -0
  99. package/dist/lsp.d.ts.map +1 -0
  100. package/dist/lsp.js +24 -0
  101. package/dist/lsp.js.map +1 -0
  102. package/dist/runtime.d.ts +62 -0
  103. package/dist/runtime.d.ts.map +1 -0
  104. package/dist/runtime.js +243 -0
  105. package/dist/runtime.js.map +1 -0
  106. package/dist/session/execution-plan.d.ts +53 -0
  107. package/dist/session/execution-plan.d.ts.map +1 -0
  108. package/dist/session/execution-plan.js +170 -0
  109. package/dist/session/execution-plan.js.map +1 -0
  110. package/dist/session/orchestrator.d.ts +21 -0
  111. package/dist/session/orchestrator.d.ts.map +1 -0
  112. package/dist/session/orchestrator.js +154 -0
  113. package/dist/session/orchestrator.js.map +1 -0
  114. package/dist/session/prompt-queue.d.ts +50 -0
  115. package/dist/session/prompt-queue.d.ts.map +1 -0
  116. package/dist/session/prompt-queue.js +155 -0
  117. package/dist/session/prompt-queue.js.map +1 -0
  118. package/dist/session-manager.d.ts +80 -0
  119. package/dist/session-manager.d.ts.map +1 -0
  120. package/dist/session-manager.js +257 -0
  121. package/dist/session-manager.js.map +1 -0
  122. package/dist/tools.d.ts +10 -0
  123. package/dist/tools.d.ts.map +1 -0
  124. package/dist/tools.js +19 -0
  125. package/dist/tools.js.map +1 -0
  126. package/dist/transports.d.ts +18 -0
  127. package/dist/transports.d.ts.map +1 -0
  128. package/dist/transports.js +37 -0
  129. package/dist/transports.js.map +1 -0
  130. package/package.json +43 -0
@@ -0,0 +1,426 @@
1
+ /**
2
+ * Hook runner - executes hooks and manages event emission.
3
+ */
4
+ import { spawn } from "node:child_process";
5
+ import { Effect } from "effect";
6
+ class HookHandlerError extends Error {
7
+ _tag = "HookHandlerError";
8
+ constructor(message) {
9
+ super(message);
10
+ }
11
+ }
12
+ /** No-op UI context for headless/ACP modes */
13
+ const noOpUIContext = {
14
+ select: async () => undefined,
15
+ confirm: async () => false,
16
+ input: async () => undefined,
17
+ editor: async () => undefined,
18
+ notify: () => { },
19
+ custom: async () => undefined,
20
+ setEditorText: () => { },
21
+ getEditorText: () => "",
22
+ };
23
+ /** No-op session context for headless/ACP modes */
24
+ const noOpSessionContext = {
25
+ summarize: async () => { },
26
+ toast: () => { },
27
+ getTokenUsage: () => undefined,
28
+ getContextLimit: () => undefined,
29
+ newSession: async () => ({ cancelled: true }),
30
+ getApiKey: async () => undefined,
31
+ complete: async () => ({ text: "", stopReason: "error" }),
32
+ };
33
+ /**
34
+ * Execute a command and return stdout/stderr/code.
35
+ */
36
+ const execEffect = (command, args, cwd, options) => Effect.async((resume) => {
37
+ const proc = spawn(command, args, { cwd, shell: false });
38
+ let stdout = "";
39
+ let stderr = "";
40
+ let killed = false;
41
+ let completed = false;
42
+ let timeoutId;
43
+ const finish = (result) => {
44
+ if (completed)
45
+ return;
46
+ completed = true;
47
+ if (timeoutId)
48
+ clearTimeout(timeoutId);
49
+ if (options?.signal)
50
+ options.signal.removeEventListener("abort", abortHandler);
51
+ resume(Effect.succeed(result));
52
+ };
53
+ const killProcess = () => {
54
+ if (!killed) {
55
+ killed = true;
56
+ proc.kill("SIGTERM");
57
+ setTimeout(() => {
58
+ if (!proc.killed)
59
+ proc.kill("SIGKILL");
60
+ }, 5000);
61
+ }
62
+ };
63
+ const abortHandler = () => {
64
+ killProcess();
65
+ };
66
+ if (options?.signal) {
67
+ if (options.signal.aborted) {
68
+ abortHandler();
69
+ }
70
+ else {
71
+ options.signal.addEventListener("abort", abortHandler, { once: true });
72
+ }
73
+ }
74
+ if (options?.timeout && options.timeout > 0) {
75
+ timeoutId = setTimeout(() => {
76
+ killProcess();
77
+ }, options.timeout);
78
+ }
79
+ proc.stdout?.on("data", (data) => {
80
+ stdout += data.toString();
81
+ });
82
+ proc.stderr?.on("data", (data) => {
83
+ stderr += data.toString();
84
+ });
85
+ proc.on("close", (code) => {
86
+ finish({ stdout, stderr, code: code ?? 0, killed });
87
+ });
88
+ proc.on("error", () => {
89
+ finish({ stdout, stderr, code: 1, killed });
90
+ });
91
+ return Effect.sync(() => {
92
+ if (!completed) {
93
+ killProcess();
94
+ if (timeoutId)
95
+ clearTimeout(timeoutId);
96
+ if (options?.signal)
97
+ options.signal.removeEventListener("abort", abortHandler);
98
+ }
99
+ });
100
+ });
101
+ /**
102
+ * HookRunner executes hooks and manages event emission.
103
+ */
104
+ export class HookRunner {
105
+ hooks;
106
+ cwd;
107
+ configDir;
108
+ sessionManager;
109
+ uiContext;
110
+ sessionContext;
111
+ hasUI;
112
+ errorListeners = new Set();
113
+ sessionIdProvider;
114
+ modelProvider;
115
+ tokenUsage;
116
+ contextLimit;
117
+ sendUserMessageHandler = async () => { };
118
+ steerHandler = async () => { };
119
+ followUpHandler = async () => { };
120
+ isIdleHandler = () => true;
121
+ constructor(hooks, cwd, configDir, sessionManager) {
122
+ this.hooks = hooks;
123
+ this.cwd = cwd;
124
+ this.configDir = configDir;
125
+ this.sessionManager = sessionManager;
126
+ this.uiContext = noOpUIContext;
127
+ this.sessionContext = noOpSessionContext;
128
+ this.hasUI = false;
129
+ this.sessionIdProvider = () => null;
130
+ this.modelProvider = () => null;
131
+ }
132
+ /**
133
+ * Initialize the runner with handlers and context providers.
134
+ * Must be called before emitting events.
135
+ */
136
+ initialize(options) {
137
+ this.sessionIdProvider = options.getSessionId;
138
+ this.modelProvider = options.getModel;
139
+ this.uiContext = options.uiContext ?? noOpUIContext;
140
+ this.sessionContext = options.sessionContext ?? noOpSessionContext;
141
+ this.hasUI = options.hasUI ?? false;
142
+ this.sendUserMessageHandler = options.sendUserMessageHandler;
143
+ this.steerHandler = options.steerHandler;
144
+ this.followUpHandler = options.followUpHandler;
145
+ this.isIdleHandler = options.isIdleHandler;
146
+ for (const hook of this.hooks) {
147
+ hook.setSendHandler(options.sendHandler);
148
+ hook.setSendMessageHandler(options.sendMessageHandler);
149
+ hook.setSendUserMessageHandler(options.sendUserMessageHandler);
150
+ hook.setSteerHandler(options.steerHandler);
151
+ hook.setFollowUpHandler(options.followUpHandler);
152
+ hook.setIsIdleHandler(options.isIdleHandler);
153
+ hook.setAppendEntryHandler(options.appendEntryHandler);
154
+ }
155
+ }
156
+ /** Update token usage for context tracking */
157
+ updateTokenUsage(tokens, contextLimit) {
158
+ this.tokenUsage = tokens;
159
+ this.contextLimit = contextLimit;
160
+ }
161
+ /** Get the paths of all loaded hooks */
162
+ getHookPaths() {
163
+ return this.hooks.map((h) => h.path);
164
+ }
165
+ /**
166
+ * Set the send handler for all hooks' marvin.send().
167
+ * Call this when the app initializes.
168
+ */
169
+ setSendHandler(handler) {
170
+ for (const hook of this.hooks) {
171
+ hook.setSendHandler(handler);
172
+ }
173
+ }
174
+ /** Subscribe to hook errors */
175
+ onError(listener) {
176
+ this.errorListeners.add(listener);
177
+ return () => this.errorListeners.delete(listener);
178
+ }
179
+ emitError(error) {
180
+ for (const listener of this.errorListeners) {
181
+ listener(error);
182
+ }
183
+ }
184
+ async runHandlerEffect(hook, eventType, handler, options) {
185
+ const swallowErrors = options?.swallowErrors ?? true;
186
+ const effect = Effect.tryPromise({
187
+ try: handler,
188
+ catch: (error) => {
189
+ if (error instanceof HookHandlerError)
190
+ return error;
191
+ if (error instanceof Error)
192
+ return new HookHandlerError(error.message);
193
+ return new HookHandlerError(typeof error === "string" ? error : String(error));
194
+ },
195
+ });
196
+ try {
197
+ const value = await Effect.runPromise(effect);
198
+ return { ok: true, value };
199
+ }
200
+ catch (error) {
201
+ const errObj = error instanceof Error ? error : new Error(String(error));
202
+ this.emitError({ hookPath: hook.path, event: eventType, error: errObj.message });
203
+ if (swallowErrors) {
204
+ return { ok: false };
205
+ }
206
+ throw errObj;
207
+ }
208
+ }
209
+ /** Check if any hooks have handlers for the given event type */
210
+ hasHandlers(eventType) {
211
+ for (const hook of this.hooks) {
212
+ const handlers = hook.handlers.get(eventType);
213
+ if (handlers && handlers.length > 0)
214
+ return true;
215
+ }
216
+ return false;
217
+ }
218
+ createContext() {
219
+ return {
220
+ exec: (command, args, options) => Effect.runPromise(execEffect(command, args, this.cwd, options)),
221
+ cwd: this.cwd,
222
+ configDir: this.configDir,
223
+ sessionId: this.sessionIdProvider(),
224
+ sessionManager: this.sessionManager,
225
+ model: this.modelProvider(),
226
+ ui: this.uiContext,
227
+ hasUI: this.hasUI,
228
+ session: {
229
+ ...this.sessionContext,
230
+ getTokenUsage: () => this.tokenUsage,
231
+ getContextLimit: () => this.contextLimit,
232
+ },
233
+ isIdle: () => this.isIdleHandler(),
234
+ steer: (text) => Promise.resolve(this.steerHandler(text)),
235
+ followUp: (text) => Promise.resolve(this.followUpHandler(text)),
236
+ sendUserMessage: (text, options) => Promise.resolve(this.sendUserMessageHandler(text, options)),
237
+ };
238
+ }
239
+ /**
240
+ * Emit a general event to all hooks.
241
+ * Errors are caught and reported, not propagated.
242
+ */
243
+ async emit(event) {
244
+ const ctx = this.createContext();
245
+ for (const hook of this.hooks) {
246
+ const handlers = hook.handlers.get(event.type);
247
+ if (!handlers || handlers.length === 0)
248
+ continue;
249
+ for (const handler of handlers) {
250
+ await this.runHandlerEffect(hook, event.type, () => Promise.resolve(handler(event, ctx)));
251
+ }
252
+ }
253
+ }
254
+ /**
255
+ * Emit tool.execute.before event.
256
+ * If any hook blocks, returns the block result.
257
+ * If any hook errors, throws (fail-safe: block on error).
258
+ */
259
+ async emitToolExecuteBefore(event) {
260
+ const ctx = this.createContext();
261
+ for (const hook of this.hooks) {
262
+ const handlers = hook.handlers.get("tool.execute.before");
263
+ if (!handlers || handlers.length === 0)
264
+ continue;
265
+ for (const handler of handlers) {
266
+ const { value } = await this.runHandlerEffect(hook, "tool.execute.before", () => Promise.resolve(handler(event, ctx)), { swallowErrors: false });
267
+ const result = value;
268
+ if (result?.block) {
269
+ return result;
270
+ }
271
+ }
272
+ }
273
+ return undefined;
274
+ }
275
+ /**
276
+ * Emit tool.execute.after event.
277
+ * Returns the last non-undefined result (for chaining modifications).
278
+ */
279
+ async emitToolExecuteAfter(event) {
280
+ const ctx = this.createContext();
281
+ let result;
282
+ for (const hook of this.hooks) {
283
+ const handlers = hook.handlers.get("tool.execute.after");
284
+ if (!handlers || handlers.length === 0)
285
+ continue;
286
+ for (const handler of handlers) {
287
+ const { value } = await this.runHandlerEffect(hook, "tool.execute.after", () => Promise.resolve(handler(event, ctx)));
288
+ const handlerResult = value;
289
+ if (handlerResult) {
290
+ result = handlerResult;
291
+ if (handlerResult.content)
292
+ event.content = handlerResult.content;
293
+ if (handlerResult.details !== undefined)
294
+ event.details = handlerResult.details;
295
+ if (handlerResult.isError !== undefined)
296
+ event.isError = handlerResult.isError;
297
+ }
298
+ }
299
+ }
300
+ return result;
301
+ }
302
+ /** Get current session ID */
303
+ getSessionId() {
304
+ return this.sessionIdProvider();
305
+ }
306
+ /** Get current hook context */
307
+ getContext() {
308
+ return this.createContext();
309
+ }
310
+ /** Get message renderer for a custom type */
311
+ getMessageRenderer(customType) {
312
+ for (const hook of this.hooks) {
313
+ const renderer = hook.messageRenderers.get(customType);
314
+ if (renderer)
315
+ return renderer;
316
+ }
317
+ return undefined;
318
+ }
319
+ /** Get all registered commands */
320
+ getRegisteredCommands() {
321
+ const commands = [];
322
+ for (const hook of this.hooks) {
323
+ for (const cmd of hook.commands.values())
324
+ commands.push(cmd);
325
+ }
326
+ return commands;
327
+ }
328
+ /** Get a registered command by name */
329
+ getCommand(name) {
330
+ for (const hook of this.hooks) {
331
+ const cmd = hook.commands.get(name);
332
+ if (cmd)
333
+ return cmd;
334
+ }
335
+ return undefined;
336
+ }
337
+ /** Get all registered tools */
338
+ getRegisteredTools() {
339
+ const tools = [];
340
+ for (const hook of this.hooks) {
341
+ for (const tool of hook.tools.values())
342
+ tools.push(tool);
343
+ }
344
+ return tools;
345
+ }
346
+ /** Get a registered tool by name */
347
+ getTool(name) {
348
+ for (const hook of this.hooks) {
349
+ const tool = hook.tools.get(name);
350
+ if (tool)
351
+ return tool;
352
+ }
353
+ return undefined;
354
+ }
355
+ /** Transform messages through chat.messages.transform hooks */
356
+ async emitContext(messages) {
357
+ let current = messages.map((msg) => structuredClone(msg));
358
+ for (const hook of this.hooks) {
359
+ const handlers = hook.handlers.get("chat.messages.transform");
360
+ if (!handlers || handlers.length === 0)
361
+ continue;
362
+ for (const handler of handlers) {
363
+ const event = { type: "chat.messages.transform", messages: current };
364
+ const { ok } = await this.runHandlerEffect(hook, "chat.messages.transform", () => Promise.resolve(handler(event, this.createContext())));
365
+ if (ok) {
366
+ current = event.messages;
367
+ }
368
+ }
369
+ }
370
+ return current;
371
+ }
372
+ /** Emit chat.message event */
373
+ async emitChatMessage(input, output) {
374
+ await this.emit({ type: "chat.message", input, output });
375
+ }
376
+ /** Emit agent.before_start event and return first message result */
377
+ async emitBeforeAgentStart(prompt, images) {
378
+ let result;
379
+ for (const hook of this.hooks) {
380
+ const handlers = hook.handlers.get("agent.before_start");
381
+ if (!handlers || handlers.length === 0)
382
+ continue;
383
+ for (const handler of handlers) {
384
+ const event = images !== undefined ? { type: "agent.before_start", prompt, images } : { type: "agent.before_start", prompt };
385
+ const { value } = await this.runHandlerEffect(hook, "agent.before_start", () => Promise.resolve(handler(event, this.createContext())));
386
+ if (value?.message && !result)
387
+ result = value;
388
+ }
389
+ }
390
+ return result;
391
+ }
392
+ /** Apply run config through chat/auth/model hooks */
393
+ async applyRunConfig(cfg, sessionId) {
394
+ const system = { systemPrompt: cfg.systemPrompt };
395
+ await this.emit({ type: "chat.system.transform", input: { sessionId, systemPrompt: cfg.systemPrompt }, output: system });
396
+ const params = { streamOptions: cfg.streamOptions ?? {} };
397
+ await this.emit({ type: "chat.params", input: { sessionId }, output: params });
398
+ const modelOutput = { model: cfg.model };
399
+ await this.emit({ type: "model.resolve", input: { sessionId, model: cfg.model }, output: modelOutput });
400
+ const auth = {};
401
+ await this.emit({ type: "auth.get", input: { sessionId, provider: modelOutput.model.provider, modelId: modelOutput.model.id }, output: auth });
402
+ const nextConfig = {
403
+ ...cfg,
404
+ systemPrompt: system.systemPrompt,
405
+ streamOptions: params.streamOptions,
406
+ model: modelOutput.model,
407
+ };
408
+ if (auth.apiKey !== undefined) {
409
+ nextConfig.apiKey = auth.apiKey;
410
+ }
411
+ if (auth.headers !== undefined) {
412
+ nextConfig.headers = auth.headers;
413
+ }
414
+ if (auth.baseUrl !== undefined) {
415
+ nextConfig.baseUrl = auth.baseUrl;
416
+ }
417
+ return nextConfig;
418
+ }
419
+ }
420
+ /**
421
+ * Create an empty hook runner (when no hooks are loaded).
422
+ */
423
+ export function createEmptyRunner(cwd, configDir, sessionManager) {
424
+ return new HookRunner([], cwd, configDir, sessionManager);
425
+ }
426
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/hooks/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tool wrapper - wraps tools with hook callbacks for interception.
3
+ */
4
+ import type { AgentTool } from "@yeshwanthyk/ai";
5
+ import type { HookRunner } from "./runner.js";
6
+ /**
7
+ * Wrap a tool with hook callbacks.
8
+ * - Emits tool.execute.before event (can block or modify input)
9
+ * - Emits tool.execute.after event (can modify result, fires on errors too)
10
+ */
11
+ export declare function wrapToolWithHooks<TDetails>(tool: AgentTool<any, TDetails>, hookRunner: HookRunner): AgentTool<any, TDetails>;
12
+ /**
13
+ * Wrap all tools with hook callbacks.
14
+ */
15
+ export declare function wrapToolsWithHooks(tools: AgentTool<any, any>[], hookRunner: HookRunner): AgentTool<any, any>[];
16
+ //# sourceMappingURL=tool-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-wrapper.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-wrapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA2B,MAAM,iBAAiB,CAAA;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;GAIG;AAEH,wBAAgB,iBAAiB,CAAC,QAAQ,EACzC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,EAC9B,UAAU,EAAE,UAAU,GACpB,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAoE1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC5B,UAAU,EAAE,UAAU,GACpB,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAEvB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Tool wrapper - wraps tools with hook callbacks for interception.
3
+ */
4
+ /**
5
+ * Wrap a tool with hook callbacks.
6
+ * - Emits tool.execute.before event (can block or modify input)
7
+ * - Emits tool.execute.after event (can modify result, fires on errors too)
8
+ */
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ export function wrapToolWithHooks(tool, hookRunner) {
11
+ return {
12
+ ...tool,
13
+ execute: async (toolCallId, params, signal, onUpdate) => {
14
+ const sessionId = hookRunner.getSessionId();
15
+ // Emit tool.execute.before - hooks can block or modify input
16
+ const beforeResult = await hookRunner.emitToolExecuteBefore({
17
+ type: "tool.execute.before",
18
+ sessionId,
19
+ toolName: tool.name,
20
+ toolCallId,
21
+ input: params,
22
+ });
23
+ if (beforeResult?.block) {
24
+ const reason = beforeResult.reason ?? "Tool execution was blocked by a hook";
25
+ throw new Error(reason);
26
+ }
27
+ // Use potentially modified input
28
+ const effectiveParams = beforeResult?.input ?? params;
29
+ try {
30
+ // Execute the actual tool
31
+ const result = await tool.execute(toolCallId, effectiveParams, signal, onUpdate);
32
+ // Emit tool.execute.after - hooks can modify the result
33
+ const afterResult = await hookRunner.emitToolExecuteAfter({
34
+ type: "tool.execute.after",
35
+ sessionId,
36
+ toolName: tool.name,
37
+ toolCallId,
38
+ input: effectiveParams,
39
+ content: result.content,
40
+ details: result.details,
41
+ isError: false,
42
+ });
43
+ if (afterResult) {
44
+ return {
45
+ content: afterResult.content ?? result.content,
46
+ details: (afterResult.details ?? result.details),
47
+ };
48
+ }
49
+ return result;
50
+ }
51
+ catch (err) {
52
+ // Emit tool.execute.after on errors too
53
+ await hookRunner.emitToolExecuteAfter({
54
+ type: "tool.execute.after",
55
+ sessionId,
56
+ toolName: tool.name,
57
+ toolCallId,
58
+ input: effectiveParams,
59
+ content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }],
60
+ details: undefined,
61
+ isError: true,
62
+ });
63
+ throw err;
64
+ }
65
+ },
66
+ };
67
+ }
68
+ /**
69
+ * Wrap all tools with hook callbacks.
70
+ */
71
+ export function wrapToolsWithHooks(tools, hookRunner) {
72
+ return tools.map((tool) => wrapToolWithHooks(tool, hookRunner));
73
+ }
74
+ //# sourceMappingURL=tool-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-wrapper.js","sourceRoot":"","sources":["../../src/hooks/tool-wrapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;GAIG;AACH,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB,CAChC,IAA8B,EAC9B,UAAsB;IAEtB,OAAO;QACN,GAAG,IAAI;QACP,OAAO,EAAE,KAAK,EACb,UAAkB,EAClB,MAAe,EACf,MAAoB,EACpB,QAA4C,EAC3C,EAAE;YACH,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAA;YAE3C,6DAA6D;YAC7D,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,qBAAqB,CAAC;gBAC3D,IAAI,EAAE,qBAAqB;gBAC3B,SAAS;gBACT,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU;gBACV,KAAK,EAAE,MAAiC;aACxC,CAAC,CAAA;YAEF,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,sCAAsC,CAAA;gBAC5E,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;YACxB,CAAC;YAED,iCAAiC;YACjC,MAAM,eAAe,GAAG,YAAY,EAAE,KAAK,IAAI,MAAM,CAAA;YAErD,IAAI,CAAC;gBACJ,0BAA0B;gBAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAEhF,wDAAwD;gBACxD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC;oBACzD,IAAI,EAAE,oBAAoB;oBAC1B,SAAS;oBACT,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,UAAU;oBACV,KAAK,EAAE,eAA0C;oBACjD,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,KAAK;iBACd,CAAC,CAAA;gBAEF,IAAI,WAAW,EAAE,CAAC;oBACjB,OAAO;wBACN,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;wBAC9C,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAa;qBAC5D,CAAA;gBACF,CAAC;gBAED,OAAO,MAAM,CAAA;YACd,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,wCAAwC;gBACxC,MAAM,UAAU,CAAC,oBAAoB,CAAC;oBACrC,IAAI,EAAE,oBAAoB;oBAC1B,SAAS;oBACT,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,UAAU;oBACV,KAAK,EAAE,eAA0C;oBACjD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnF,OAAO,EAAE,SAAqB;oBAC9B,OAAO,EAAE,IAAI;iBACb,CAAC,CAAA;gBACF,MAAM,GAAG,CAAA;YACV,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CACjC,KAA4B,EAC5B,UAAsB;IAEtB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;AAChE,CAAC"}