MCPcopy Create free account
hub / github.com/UsefulSoftwareCo/executor / createToolBridge

Function createToolBridge

packages/kernel/runtime-quickjs/src/index.ts:240–296  ·  view source on GitHub ↗
(
  context: QuickJSContext,
  toolInvoker: SandboxToolInvoker,
  pendingDeferreds: Set<QuickJSDeferredPromise>,
  runPromise: RunPromise,
)

Source from the content-addressed store, hash-verified

238type RunPromise = <A, E>(effect: Effect.Effect<A, E>) => Promise<A>;
239
240const createToolBridge = (
241 context: QuickJSContext,
242 toolInvoker: SandboxToolInvoker,
243 pendingDeferreds: Set<QuickJSDeferredPromise>,
244 runPromise: RunPromise,
245): QuickJSHandle =>
246 context.newFunction("__executor_invokeTool", (pathHandle, argsHandle) => {
247 const path = context.getString(pathHandle);
248 const args =
249 argsHandle === undefined || context.typeof(argsHandle) === "undefined"
250 ? undefined
251 : context.dump(argsHandle);
252 const deferred = context.newPromise();
253 pendingDeferreds.add(deferred);
254 deferred.settled.finally(() => {
255 pendingDeferreds.delete(deferred);
256 });
257
258 void runPromise(toolInvoker.invoke({ path, args })).then(
259 (value) => {
260 if (!deferred.alive) {
261 return;
262 }
263
264 const serialized = serializeJson(value, `Tool result for ${path}`);
265 if (typeof serialized === "undefined") {
266 deferred.resolve();
267 return;
268 }
269
270 const valueHandle = context.newString(serialized);
271 deferred.resolve(valueHandle);
272 valueHandle.dispose();
273 },
274 (cause) => {
275 if (!deferred.alive) {
276 return;
277 }
278
279 // The reject path is reserved for true infra defects. The
280 // upstream tool-invoker has already replaced the message with
281 // an opaque generic plus a correlation id, but defensively log
282 // the cause here and emit a stable generic if upstream changes.
283 const message = sandboxDefectMessage(cause);
284 try {
285 console.error("[executor:quickjs] tool dispatch defect", { path, cause });
286 } catch {
287 /* ignore logger failures */
288 }
289 const errorHandle = context.newError(message);
290 deferred.reject(errorHandle);
291 errorHandle.dispose();
292 },
293 );
294
295 return deferred.handle;
296 });
297

Callers 1

evaluateInQuickJsFunction · 0.85

Calls 7

serializeJsonFunction · 0.85
sandboxDefectMessageFunction · 0.85
invokeMethod · 0.80
resolveMethod · 0.80
disposeMethod · 0.80
errorMethod · 0.80
deleteMethod · 0.65

Tested by

no test coverage detected