@librechat/agents 3.3.13 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/graphs/Graph.cjs +121 -27
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +83 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +60 -14
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +2 -0
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +35 -206
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +121 -241
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +19 -12
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +3 -3
- package/dist/cjs/llm/invoke.cjs +2 -2
- package/dist/cjs/llm/mistral/index.cjs +26 -0
- package/dist/cjs/llm/mistral/index.cjs.map +1 -0
- package/dist/cjs/llm/openai/index.cjs +82 -80
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +19 -19
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/stream/chunkAdapters.cjs +198 -0
- package/dist/cjs/llm/stream/chunkAdapters.cjs.map +1 -0
- package/dist/cjs/llm/stream/smoother.cjs +369 -0
- package/dist/cjs/llm/stream/smoother.cjs.map +1 -0
- package/dist/cjs/llm/vertexai/index.cjs +13 -1
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +25 -16
- package/dist/cjs/messages/format.cjs +40 -23
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/run.cjs +82 -15
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +37 -2
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/stream.cjs +1 -1
- package/dist/cjs/summarization/node.cjs +6 -3
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +1 -1
- package/dist/cjs/tools/ToolNode.cjs +316 -94
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +664 -80
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentReplay.cjs +175 -0
- package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -0
- package/dist/cjs/tools/toolOutputReferences.cjs +20 -0
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +2 -2
- package/dist/cjs/utils/tokens.cjs +76 -29
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +121 -27
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +83 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +60 -14
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +2 -1
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +34 -205
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +120 -240
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +19 -12
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +1 -1
- package/dist/esm/llm/invoke.mjs +2 -2
- package/dist/esm/llm/mistral/index.mjs +26 -0
- package/dist/esm/llm/mistral/index.mjs.map +1 -0
- package/dist/esm/llm/openai/index.mjs +82 -80
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +3 -3
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/stream/chunkAdapters.mjs +195 -0
- package/dist/esm/llm/stream/chunkAdapters.mjs.map +1 -0
- package/dist/esm/llm/stream/smoother.mjs +365 -0
- package/dist/esm/llm/stream/smoother.mjs.map +1 -0
- package/dist/esm/llm/vertexai/index.mjs +13 -1
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +13 -11
- package/dist/esm/messages/format.mjs +40 -23
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/run.mjs +83 -16
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +37 -2
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/stream.mjs +1 -1
- package/dist/esm/summarization/node.mjs +6 -3
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +1 -1
- package/dist/esm/tools/ToolNode.mjs +317 -95
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +665 -81
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentReplay.mjs +168 -0
- package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -0
- package/dist/esm/tools/toolOutputReferences.mjs +20 -0
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +2 -2
- package/dist/esm/utils/tokens.mjs +76 -30
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/types/graphs/Graph.d.ts +19 -1
- package/dist/types/hooks/HookRegistry.d.ts +10 -1
- package/dist/types/hooks/executeHooks.d.ts +5 -1
- package/dist/types/hooks/index.d.ts +2 -2
- package/dist/types/hooks/types.d.ts +12 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/llm/google/index.d.ts +2 -0
- package/dist/types/llm/mistral/index.d.ts +11 -0
- package/dist/types/llm/openai/index.d.ts +20 -4
- package/dist/types/llm/openrouter/index.d.ts +4 -1
- package/dist/types/llm/stream/chunkAdapters.d.ts +48 -0
- package/dist/types/llm/stream/smoother.d.ts +95 -0
- package/dist/types/llm/vertexai/index.d.ts +2 -0
- package/dist/types/run.d.ts +4 -1
- package/dist/types/session/AgentSession.d.ts +1 -0
- package/dist/types/tools/ToolNode.d.ts +23 -15
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +49 -7
- package/dist/types/tools/subagent/SubagentReplay.d.ts +81 -0
- package/dist/types/tools/toolOutputReferences.d.ts +12 -0
- package/dist/types/types/graph.d.ts +5 -5
- package/dist/types/types/hitl.d.ts +15 -0
- package/dist/types/types/llm.d.ts +21 -14
- package/dist/types/utils/tokens.d.ts +10 -0
- package/package.json +6 -2
- package/src/graphs/Graph.ts +257 -52
- package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +48 -9
- package/src/graphs/__tests__/Graph.contextOverflow.test.ts +1 -1
- package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +80 -0
- package/src/hooks/HookRegistry.ts +151 -1
- package/src/hooks/__tests__/HookRegistry.test.ts +96 -0
- package/src/hooks/__tests__/executeHooks.test.ts +160 -0
- package/src/hooks/executeHooks.ts +133 -15
- package/src/hooks/index.ts +3 -1
- package/src/hooks/types.ts +16 -0
- package/src/index.ts +8 -0
- package/src/llm/anthropic/index.ts +85 -354
- package/src/llm/bedrock/index.ts +174 -390
- package/src/llm/bedrock/llm.spec.ts +2 -0
- package/src/llm/bedrock/streamSealDispatch.test.ts +76 -0
- package/src/llm/custom-chat-models.smoke.test.ts +16 -1
- package/src/llm/google/index.ts +17 -18
- package/src/llm/google/streamSmoothing.test.ts +121 -0
- package/src/llm/mistral/index.ts +33 -0
- package/src/llm/mistral/streamSmoothing.test.ts +97 -0
- package/src/llm/openai/deepseek.test.ts +56 -0
- package/src/llm/openai/index.ts +119 -126
- package/src/llm/openrouter/index.ts +4 -1
- package/src/llm/providers.ts +3 -3
- package/src/llm/stream/chunkAdapters.test.ts +202 -0
- package/src/llm/stream/chunkAdapters.ts +317 -0
- package/src/llm/stream/reassembly.test.ts +241 -0
- package/src/llm/stream/smoother.bench.test.ts +155 -0
- package/src/llm/stream/smoother.test.ts +519 -0
- package/src/llm/stream/smoother.ts +574 -0
- package/src/llm/vertexai/index.ts +17 -1
- package/src/llm/vertexai/streamSmoothing.test.ts +109 -0
- package/src/messages/format.ts +54 -26
- package/src/messages/formatAgentMessages.reducer.test.ts +162 -0
- package/src/messages/formatAgentMessages.steer.test.ts +16 -11
- package/src/messages/formatAgentMessages.test.ts +7 -2
- package/src/run.ts +164 -18
- package/src/session/AgentSession.ts +52 -2
- package/src/session/__tests__/JsonlSessionStore.test.ts +53 -0
- package/src/specs/subagent.test.ts +44 -0
- package/src/specs/tokens.test.ts +159 -14
- package/src/summarization/__tests__/node.test.ts +32 -14
- package/src/summarization/node.ts +15 -11
- package/src/tools/ToolNode.ts +631 -157
- package/src/tools/__tests__/SubagentExecutor.test.ts +590 -7
- package/src/tools/__tests__/SubagentReplay.test.ts +300 -0
- package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +208 -2
- package/src/tools/__tests__/directToolHITLResumeScope.test.ts +486 -2
- package/src/tools/__tests__/hitl.test.ts +234 -5
- package/src/tools/__tests__/subagentHooks.test.ts +1040 -62
- package/src/tools/__tests__/toolOutputReferences.test.ts +19 -2
- package/src/tools/subagent/SubagentExecutor.ts +1438 -136
- package/src/tools/subagent/SubagentReplay.ts +575 -0
- package/src/tools/toolOutputReferences.ts +40 -1
- package/src/types/graph.ts +5 -5
- package/src/types/hitl.ts +16 -0
- package/src/types/llm.ts +53 -36
- package/src/utils/tokens.ts +115 -30
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
ToolDecision,
|
|
9
9
|
StopDecision,
|
|
10
10
|
HookCallback,
|
|
11
|
+
ToolApprovalReplayKey,
|
|
11
12
|
AggregatedHookResult,
|
|
12
13
|
} from './types';
|
|
13
14
|
import type { HookRegistry } from './HookRegistry';
|
|
@@ -28,6 +29,10 @@ export interface ExecuteHooksOptions {
|
|
|
28
29
|
sessionId?: string;
|
|
29
30
|
/** Query string matched against each matcher's pattern (tool name, etc.). */
|
|
30
31
|
matchQuery?: string;
|
|
32
|
+
/** Stable tool-call key for replaying consumed one-shot contributions. */
|
|
33
|
+
onceReplayKey?: ToolApprovalReplayKey;
|
|
34
|
+
/** Storage scope for replay state when it must outlive or branch from the hook session. */
|
|
35
|
+
onceReplaySessionId?: string;
|
|
31
36
|
/** Parent AbortSignal — combined with per-hook timeout into the hook signal. */
|
|
32
37
|
signal?: AbortSignal;
|
|
33
38
|
/** Default per-hook timeout; overridden by `matcher.timeout` when present. */
|
|
@@ -301,12 +306,79 @@ function applyAllowedDecisions(
|
|
|
301
306
|
agg.allowedDecisions = output.allowedDecisions;
|
|
302
307
|
}
|
|
303
308
|
|
|
304
|
-
function
|
|
305
|
-
|
|
309
|
+
function applyAggregatedResult(
|
|
310
|
+
target: AggregatedHookResult,
|
|
311
|
+
source: AggregatedHookResult
|
|
312
|
+
): void {
|
|
313
|
+
target.additionalContexts.push(...source.additionalContexts);
|
|
314
|
+
target.injectedMessages.push(...source.injectedMessages);
|
|
315
|
+
target.errors.push(...source.errors);
|
|
316
|
+
if (source.decision != null) {
|
|
317
|
+
applyToolDecision(target, source.decision, source.reason);
|
|
318
|
+
}
|
|
319
|
+
if (source.stopDecision != null) {
|
|
320
|
+
applyStopDecision(target, source.stopDecision, source.reason);
|
|
321
|
+
}
|
|
322
|
+
if (source.updatedInput != null) {
|
|
323
|
+
target.updatedInput = source.updatedInput;
|
|
324
|
+
}
|
|
325
|
+
if (source.updatedOutput !== undefined) {
|
|
326
|
+
target.updatedOutput = source.updatedOutput;
|
|
327
|
+
}
|
|
328
|
+
if (source.allowedDecisions != null) {
|
|
329
|
+
target.allowedDecisions = source.allowedDecisions;
|
|
330
|
+
}
|
|
331
|
+
if (source.preventContinuation === true) {
|
|
332
|
+
target.preventContinuation = true;
|
|
333
|
+
target.stopReason ??= source.stopReason;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function combineAggregatedResults(
|
|
338
|
+
first: AggregatedHookResult | undefined,
|
|
339
|
+
second: AggregatedHookResult
|
|
340
|
+
): AggregatedHookResult {
|
|
341
|
+
if (first == null) {
|
|
342
|
+
return second;
|
|
343
|
+
}
|
|
344
|
+
const combined = freshResult();
|
|
345
|
+
applyAggregatedResult(combined, first);
|
|
346
|
+
applyAggregatedResult(combined, second);
|
|
347
|
+
return combined;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function createPendingApprovalReplay(
|
|
351
|
+
approvalResult: AggregatedHookResult,
|
|
352
|
+
pendingApproval: AggregatedHookResult | undefined,
|
|
353
|
+
onceContribution: AggregatedHookResult
|
|
354
|
+
): AggregatedHookResult {
|
|
355
|
+
const replay = freshResult();
|
|
356
|
+
if (pendingApproval != null) {
|
|
357
|
+
applyAggregatedResult(replay, pendingApproval);
|
|
358
|
+
}
|
|
359
|
+
applyAggregatedResult(replay, onceContribution);
|
|
360
|
+
replay.decision = 'ask';
|
|
361
|
+
replay.reason = approvalResult.reason;
|
|
362
|
+
if (approvalResult.allowedDecisions == null) {
|
|
363
|
+
delete replay.allowedDecisions;
|
|
364
|
+
} else {
|
|
365
|
+
replay.allowedDecisions = approvalResult.allowedDecisions;
|
|
366
|
+
}
|
|
367
|
+
return replay;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function fold(outcomes: readonly HookOutcome[]): {
|
|
371
|
+
aggregated: AggregatedHookResult;
|
|
372
|
+
onceReplayContribution?: AggregatedHookResult;
|
|
373
|
+
} {
|
|
374
|
+
const aggregated = freshResult();
|
|
375
|
+
const onceContribution = freshResult();
|
|
376
|
+
let hasOnceContribution = false;
|
|
306
377
|
for (const outcome of outcomes) {
|
|
378
|
+
const isOnceMatcher = outcome.matcher.once === true;
|
|
307
379
|
if (outcome.error !== null) {
|
|
308
380
|
if (outcome.matcher.internal !== true) {
|
|
309
|
-
|
|
381
|
+
aggregated.errors.push(outcome.error);
|
|
310
382
|
}
|
|
311
383
|
continue;
|
|
312
384
|
}
|
|
@@ -323,15 +395,28 @@ function fold(outcomes: readonly HookOutcome[]): AggregatedHookResult {
|
|
|
323
395
|
if (output.async === true) {
|
|
324
396
|
continue;
|
|
325
397
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
398
|
+
const targets = isOnceMatcher
|
|
399
|
+
? [aggregated, onceContribution]
|
|
400
|
+
: [aggregated];
|
|
401
|
+
if (isOnceMatcher) {
|
|
402
|
+
hasOnceContribution = true;
|
|
403
|
+
}
|
|
404
|
+
for (const target of targets) {
|
|
405
|
+
applyContext(target, output);
|
|
406
|
+
applyInjectedMessages(target, output);
|
|
407
|
+
applyStopFlag(target, output);
|
|
408
|
+
applyDecision(target, output);
|
|
409
|
+
applyUpdatedInput(target, output);
|
|
410
|
+
applyUpdatedOutput(target, output);
|
|
411
|
+
applyAllowedDecisions(target, output);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return {
|
|
415
|
+
aggregated,
|
|
416
|
+
...(hasOnceContribution
|
|
417
|
+
? { onceReplayContribution: onceContribution }
|
|
418
|
+
: {}),
|
|
419
|
+
};
|
|
335
420
|
}
|
|
336
421
|
|
|
337
422
|
/**
|
|
@@ -396,14 +481,21 @@ export async function executeHooks(
|
|
|
396
481
|
input,
|
|
397
482
|
sessionId,
|
|
398
483
|
matchQuery,
|
|
484
|
+
onceReplayKey,
|
|
485
|
+
onceReplaySessionId,
|
|
399
486
|
signal,
|
|
400
487
|
timeoutMs = DEFAULT_HOOK_TIMEOUT_MS,
|
|
401
488
|
logger,
|
|
402
489
|
} = opts;
|
|
403
490
|
const event = input.hook_event_name;
|
|
491
|
+
const replaySessionId = onceReplaySessionId ?? sessionId;
|
|
492
|
+
const pendingApproval =
|
|
493
|
+
event === 'PreToolUse' && replaySessionId != null && onceReplayKey != null
|
|
494
|
+
? registry.getPendingToolApproval(replaySessionId, onceReplayKey)
|
|
495
|
+
: undefined;
|
|
404
496
|
const matchers = registry.getMatchers(event, sessionId);
|
|
405
497
|
if (matchers.length === 0) {
|
|
406
|
-
return freshResult();
|
|
498
|
+
return pendingApproval ?? freshResult();
|
|
407
499
|
}
|
|
408
500
|
|
|
409
501
|
// --- SYNC CRITICAL SECTION: once-matcher removal must complete before any await ---
|
|
@@ -424,12 +516,38 @@ export async function executeHooks(
|
|
|
424
516
|
}
|
|
425
517
|
// --- END SYNC CRITICAL SECTION ---
|
|
426
518
|
if (tasks.length === 0) {
|
|
427
|
-
return freshResult();
|
|
519
|
+
return pendingApproval ?? freshResult();
|
|
428
520
|
}
|
|
429
521
|
|
|
430
522
|
const outcomes = (await Promise.all(tasks)).flat();
|
|
431
523
|
reportErrors(outcomes, event, logger);
|
|
432
|
-
const aggregated = fold(outcomes);
|
|
524
|
+
const { aggregated: liveResult, onceReplayContribution } = fold(outcomes);
|
|
525
|
+
const aggregated = combineAggregatedResults(pendingApproval, liveResult);
|
|
526
|
+
if (
|
|
527
|
+
event === 'PreToolUse' &&
|
|
528
|
+
aggregated.decision === 'ask' &&
|
|
529
|
+
onceReplayContribution != null &&
|
|
530
|
+
replaySessionId != null &&
|
|
531
|
+
onceReplayKey != null
|
|
532
|
+
) {
|
|
533
|
+
registry.setPendingToolApproval(
|
|
534
|
+
replaySessionId,
|
|
535
|
+
onceReplayKey,
|
|
536
|
+
createPendingApprovalReplay(
|
|
537
|
+
aggregated,
|
|
538
|
+
pendingApproval,
|
|
539
|
+
onceReplayContribution
|
|
540
|
+
)
|
|
541
|
+
);
|
|
542
|
+
} else if (
|
|
543
|
+
event === 'PreToolUse' &&
|
|
544
|
+
aggregated.decision !== 'ask' &&
|
|
545
|
+
pendingApproval != null &&
|
|
546
|
+
replaySessionId != null &&
|
|
547
|
+
onceReplayKey != null
|
|
548
|
+
) {
|
|
549
|
+
registry.clearPendingToolApproval(replaySessionId, onceReplayKey);
|
|
550
|
+
}
|
|
433
551
|
/**
|
|
434
552
|
* Centralized `preventContinuation` propagation: when any hook (across
|
|
435
553
|
* any callsite — RunStart, PreToolUse, PostToolBatch, SubagentStop,
|
package/src/hooks/index.ts
CHANGED
|
@@ -42,7 +42,7 @@ export type {
|
|
|
42
42
|
WorkspacePolicyConfig,
|
|
43
43
|
PathExtractor,
|
|
44
44
|
} from './createWorkspacePolicyHook';
|
|
45
|
-
export { HOOK_EVENTS } from './types';
|
|
45
|
+
export { HOOK_EVENTS, TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY } from './types';
|
|
46
46
|
export type {
|
|
47
47
|
HookEvent,
|
|
48
48
|
HookInput,
|
|
@@ -56,6 +56,8 @@ export type {
|
|
|
56
56
|
BaseHookOutput,
|
|
57
57
|
ToolDecision,
|
|
58
58
|
StopDecision,
|
|
59
|
+
ToolApprovalReplayKey,
|
|
60
|
+
ToolApprovalReplaySnapshot,
|
|
59
61
|
AggregatedHookResult,
|
|
60
62
|
RunStartHookInput,
|
|
61
63
|
UserPromptSubmitHookInput,
|
package/src/hooks/types.ts
CHANGED
|
@@ -27,6 +27,9 @@ export const HOOK_EVENTS = [
|
|
|
27
27
|
'PostCompact',
|
|
28
28
|
] as const;
|
|
29
29
|
|
|
30
|
+
export const TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY =
|
|
31
|
+
'__librechat_tool_approval_execution_scope';
|
|
32
|
+
|
|
30
33
|
export type HookEvent = (typeof HOOK_EVENTS)[number];
|
|
31
34
|
|
|
32
35
|
/** Tool-gating decision; executeHooks folds with `deny > ask > allow` precedence. */
|
|
@@ -393,6 +396,19 @@ export interface PreToolUseHookOutput extends BaseHookOutput {
|
|
|
393
396
|
allowedDecisions?: ReadonlyArray<'approve' | 'reject' | 'edit' | 'respond'>;
|
|
394
397
|
}
|
|
395
398
|
|
|
399
|
+
/** Stable identity for replaying a consumed one-shot tool approval. */
|
|
400
|
+
export interface ToolApprovalReplayKey {
|
|
401
|
+
executionScope: string;
|
|
402
|
+
agentId: string;
|
|
403
|
+
toolUseId: string;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/** Checkpoint-safe copy of a consumed one-shot approval contribution. */
|
|
407
|
+
export interface ToolApprovalReplaySnapshot {
|
|
408
|
+
key: ToolApprovalReplayKey;
|
|
409
|
+
result: AggregatedHookResult;
|
|
410
|
+
}
|
|
411
|
+
|
|
396
412
|
export interface PostToolUseHookOutput extends BaseHookOutput {
|
|
397
413
|
/**
|
|
398
414
|
* Replacement tool output. Flows through the aggregated result so the
|
package/src/index.ts
CHANGED
|
@@ -77,6 +77,14 @@ export type {
|
|
|
77
77
|
ChatOpenRouterCallOptions,
|
|
78
78
|
} from './llm/openrouter';
|
|
79
79
|
export { getChatModelClass } from './llm/providers';
|
|
80
|
+
export { CustomChatMistralAI } from './llm/mistral';
|
|
81
|
+
export {
|
|
82
|
+
smoothStream,
|
|
83
|
+
resolveStreamDelay,
|
|
84
|
+
DEFAULT_STREAM_DELAY,
|
|
85
|
+
computeAdaptivePieceSize,
|
|
86
|
+
} from './llm/stream/smoother';
|
|
87
|
+
export type { SmoothItem, SmoothPiece } from './llm/stream/smoother';
|
|
80
88
|
export { FakeChatModel, createFakeStreamingLLM } from './llm/fake';
|
|
81
89
|
export { initializeModel } from './llm/init';
|
|
82
90
|
export { attemptInvoke, tryFallbackProviders } from './llm/invoke';
|