@librechat/agents 3.1.66 → 3.1.67-dev.4
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/agents/AgentContext.cjs +23 -3
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +16 -0
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +91 -0
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/hooks/HookRegistry.cjs +162 -0
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
- package/dist/cjs/hooks/executeHooks.cjs +276 -0
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
- package/dist/cjs/hooks/matchers.cjs +256 -0
- package/dist/cjs/hooks/matchers.cjs.map +1 -0
- package/dist/cjs/hooks/types.cjs +27 -0
- package/dist/cjs/hooks/types.cjs.map +1 -0
- package/dist/cjs/main.cjs +53 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +74 -12
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/run.cjs +111 -0
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +44 -0
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +175 -0
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +296 -0
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
- package/dist/cjs/tools/ReadFile.cjs +43 -0
- package/dist/cjs/tools/ReadFile.cjs.map +1 -0
- package/dist/cjs/tools/SkillTool.cjs +50 -0
- package/dist/cjs/tools/SkillTool.cjs.map +1 -0
- package/dist/cjs/tools/SubagentTool.cjs +92 -0
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
- package/dist/cjs/tools/ToolNode.cjs +304 -140
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/skillCatalog.cjs +84 -0
- package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +511 -0
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +23 -3
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +15 -1
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +91 -0
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/hooks/HookRegistry.mjs +160 -0
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
- package/dist/esm/hooks/executeHooks.mjs +273 -0
- package/dist/esm/hooks/executeHooks.mjs.map +1 -0
- package/dist/esm/hooks/matchers.mjs +251 -0
- package/dist/esm/hooks/matchers.mjs.map +1 -0
- package/dist/esm/hooks/types.mjs +25 -0
- package/dist/esm/hooks/types.mjs.map +1 -0
- package/dist/esm/main.mjs +12 -1
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +66 -4
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/run.mjs +111 -0
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +44 -0
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +169 -0
- package/dist/esm/tools/BashExecutor.mjs.map +1 -0
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +287 -0
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
- package/dist/esm/tools/ReadFile.mjs +38 -0
- package/dist/esm/tools/ReadFile.mjs.map +1 -0
- package/dist/esm/tools/SkillTool.mjs +45 -0
- package/dist/esm/tools/SkillTool.mjs.map +1 -0
- package/dist/esm/tools/SubagentTool.mjs +85 -0
- package/dist/esm/tools/SubagentTool.mjs.map +1 -0
- package/dist/esm/tools/ToolNode.mjs +306 -142
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/skillCatalog.mjs +82 -0
- package/dist/esm/tools/skillCatalog.mjs.map +1 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +505 -0
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +6 -0
- package/dist/types/common/enum.d.ts +10 -1
- package/dist/types/graphs/Graph.d.ts +2 -0
- package/dist/types/hooks/HookRegistry.d.ts +56 -0
- package/dist/types/hooks/executeHooks.d.ts +79 -0
- package/dist/types/hooks/index.d.ts +6 -0
- package/dist/types/hooks/matchers.d.ts +95 -0
- package/dist/types/hooks/types.d.ts +320 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/messages/format.d.ts +2 -1
- package/dist/types/run.d.ts +1 -0
- package/dist/types/summarization/node.d.ts +2 -0
- package/dist/types/tools/BashExecutor.d.ts +45 -0
- package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
- package/dist/types/tools/ReadFile.d.ts +28 -0
- package/dist/types/tools/SkillTool.d.ts +40 -0
- package/dist/types/tools/SubagentTool.d.ts +36 -0
- package/dist/types/tools/ToolNode.d.ts +24 -2
- package/dist/types/tools/skillCatalog.d.ts +19 -0
- package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
- package/dist/types/tools/subagent/index.d.ts +2 -0
- package/dist/types/types/graph.d.ts +61 -2
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/llm.d.ts +14 -2
- package/dist/types/types/run.d.ts +20 -0
- package/dist/types/types/skill.d.ts +9 -0
- package/dist/types/types/tools.d.ts +38 -1
- package/package.json +5 -1
- package/src/agents/AgentContext.ts +26 -2
- package/src/common/enum.ts +15 -0
- package/src/graphs/Graph.ts +113 -0
- package/src/hooks/HookRegistry.ts +208 -0
- package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
- package/src/hooks/__tests__/compactHooks.test.ts +214 -0
- package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
- package/src/hooks/__tests__/integration.test.ts +337 -0
- package/src/hooks/__tests__/matchers.test.ts +238 -0
- package/src/hooks/__tests__/toolHooks.test.ts +669 -0
- package/src/hooks/executeHooks.ts +375 -0
- package/src/hooks/index.ts +57 -0
- package/src/hooks/matchers.ts +280 -0
- package/src/hooks/types.ts +404 -0
- package/src/index.ts +10 -0
- package/src/messages/format.ts +74 -4
- package/src/messages/formatAgentMessages.skills.test.ts +334 -0
- package/src/run.ts +126 -0
- package/src/scripts/multi-agent-subagent.ts +246 -0
- package/src/scripts/subagent-event-driven-debug.ts +190 -0
- package/src/scripts/subagent-tools-debug.ts +160 -0
- package/src/specs/subagent.test.ts +305 -0
- package/src/summarization/node.ts +53 -0
- package/src/tools/BashExecutor.ts +205 -0
- package/src/tools/BashProgrammaticToolCalling.ts +397 -0
- package/src/tools/ReadFile.ts +39 -0
- package/src/tools/SkillTool.ts +46 -0
- package/src/tools/SubagentTool.ts +100 -0
- package/src/tools/ToolNode.ts +391 -169
- package/src/tools/__tests__/ReadFile.test.ts +44 -0
- package/src/tools/__tests__/SkillTool.test.ts +442 -0
- package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
- package/src/tools/__tests__/SubagentTool.test.ts +149 -0
- package/src/tools/__tests__/ToolNode.session.test.ts +12 -12
- package/src/tools/__tests__/skillCatalog.test.ts +161 -0
- package/src/tools/__tests__/subagentHooks.test.ts +215 -0
- package/src/tools/skillCatalog.ts +126 -0
- package/src/tools/subagent/SubagentExecutor.ts +676 -0
- package/src/tools/subagent/index.ts +13 -0
- package/src/types/graph.ts +80 -1
- package/src/types/index.ts +1 -0
- package/src/types/llm.ts +16 -2
- package/src/types/run.ts +20 -0
- package/src/types/skill.ts +11 -0
- package/src/types/tools.ts +41 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/tools/skillCatalog.ts
|
|
2
|
+
import type { SkillCatalogEntry } from '@/types';
|
|
3
|
+
|
|
4
|
+
const HEADER = '## Available Skills';
|
|
5
|
+
const DEFAULT_CONTEXT_WINDOW_TOKENS = 200_000;
|
|
6
|
+
const DEFAULT_BUDGET_PERCENT = 0.01;
|
|
7
|
+
const DEFAULT_MAX_ENTRY_CHARS = 250;
|
|
8
|
+
const DEFAULT_MIN_DESC_LENGTH = 20;
|
|
9
|
+
const DEFAULT_CHARS_PER_TOKEN = 4;
|
|
10
|
+
|
|
11
|
+
export type SkillCatalogOptions = {
|
|
12
|
+
/** Total context window in tokens. Default: 200_000 */
|
|
13
|
+
contextWindowTokens?: number;
|
|
14
|
+
/** Fraction of context budget for catalog. Default: 0.01 (1%) */
|
|
15
|
+
budgetPercent?: number;
|
|
16
|
+
/** Max chars per entry description. Default: 250 */
|
|
17
|
+
maxEntryChars?: number;
|
|
18
|
+
/** Descriptions below this length trigger names-only fallback. Default: 20 */
|
|
19
|
+
minDescLength?: number;
|
|
20
|
+
/** Approximate chars per token for budget calculation. Default: 4 */
|
|
21
|
+
charsPerToken?: number;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Formats a skill catalog for injection into agent context.
|
|
26
|
+
* Uses a truncation ladder: full descriptions, proportional truncation, names-only.
|
|
27
|
+
* Returns empty string for empty input.
|
|
28
|
+
*/
|
|
29
|
+
export function formatSkillCatalog(
|
|
30
|
+
skills: SkillCatalogEntry[],
|
|
31
|
+
opts?: SkillCatalogOptions
|
|
32
|
+
): string {
|
|
33
|
+
if (skills.length === 0) return '';
|
|
34
|
+
|
|
35
|
+
const contextWindowTokens =
|
|
36
|
+
opts?.contextWindowTokens ?? DEFAULT_CONTEXT_WINDOW_TOKENS;
|
|
37
|
+
const budgetPercent = opts?.budgetPercent ?? DEFAULT_BUDGET_PERCENT;
|
|
38
|
+
const maxEntryChars = Math.max(
|
|
39
|
+
1,
|
|
40
|
+
opts?.maxEntryChars ?? DEFAULT_MAX_ENTRY_CHARS
|
|
41
|
+
);
|
|
42
|
+
const minDescLength = opts?.minDescLength ?? DEFAULT_MIN_DESC_LENGTH;
|
|
43
|
+
const charsPerToken = opts?.charsPerToken ?? DEFAULT_CHARS_PER_TOKEN;
|
|
44
|
+
|
|
45
|
+
const budgetChars = Math.floor(
|
|
46
|
+
contextWindowTokens * budgetPercent * charsPerToken
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const capped = skills.map((s) => ({
|
|
50
|
+
name: s.name,
|
|
51
|
+
description:
|
|
52
|
+
s.description.length > maxEntryChars
|
|
53
|
+
? s.description.slice(0, maxEntryChars - 1) + '\u2026'
|
|
54
|
+
: s.description,
|
|
55
|
+
}));
|
|
56
|
+
|
|
57
|
+
const fullOutput = formatEntries(capped);
|
|
58
|
+
if (fullOutput.length <= budgetChars) return fullOutput;
|
|
59
|
+
|
|
60
|
+
const headerLen = HEADER.length + 2;
|
|
61
|
+
const newlineChars = capped.length > 1 ? capped.length - 1 : 0;
|
|
62
|
+
const availableChars = budgetChars - headerLen - newlineChars;
|
|
63
|
+
const perEntryOverhead = 4;
|
|
64
|
+
const nameCharsTotal = capped.reduce(
|
|
65
|
+
(sum, s) => sum + s.name.length + perEntryOverhead,
|
|
66
|
+
0
|
|
67
|
+
);
|
|
68
|
+
const availableForDescs = availableChars - nameCharsTotal;
|
|
69
|
+
|
|
70
|
+
if (availableForDescs <= 0) {
|
|
71
|
+
return fitNamesOnly(capped, budgetChars);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const maxDescPerEntry = Math.floor(availableForDescs / capped.length);
|
|
75
|
+
|
|
76
|
+
if (maxDescPerEntry < minDescLength) {
|
|
77
|
+
return fitNamesOnly(capped, budgetChars);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const truncated = capped.map((s) => ({
|
|
81
|
+
name: s.name,
|
|
82
|
+
description:
|
|
83
|
+
s.description.length > maxDescPerEntry
|
|
84
|
+
? s.description.slice(0, maxDescPerEntry - 1) + '\u2026'
|
|
85
|
+
: s.description,
|
|
86
|
+
}));
|
|
87
|
+
|
|
88
|
+
const result = formatEntries(truncated);
|
|
89
|
+
if (result.length <= budgetChars) return result;
|
|
90
|
+
return fitNamesOnly(capped, budgetChars);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function formatEntries(
|
|
94
|
+
entries: { name: string; description: string }[]
|
|
95
|
+
): string {
|
|
96
|
+
const lines = entries.map((e) =>
|
|
97
|
+
e.description ? `- ${e.name}: ${e.description}` : `- ${e.name}`
|
|
98
|
+
);
|
|
99
|
+
return `${HEADER}\n\n${lines.join('\n')}`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Names-only fallback that drops trailing entries if the list still exceeds budget. */
|
|
103
|
+
function fitNamesOnly(
|
|
104
|
+
entries: { name: string }[],
|
|
105
|
+
budgetChars: number
|
|
106
|
+
): string {
|
|
107
|
+
// Format: "HEADER\n\n- name1\n- name2\n..."
|
|
108
|
+
// Running sum avoids O(n²) repeated string construction.
|
|
109
|
+
const prefix = HEADER.length + 2; // "HEADER\n\n"
|
|
110
|
+
const entryOverhead = 2; // "- "
|
|
111
|
+
let total = prefix;
|
|
112
|
+
let fitCount = 0;
|
|
113
|
+
|
|
114
|
+
for (let i = 0; i < entries.length; i++) {
|
|
115
|
+
const added = (i > 0 ? 1 : 0) + entryOverhead + entries[i].name.length;
|
|
116
|
+
if (total + added > budgetChars) break;
|
|
117
|
+
total += added;
|
|
118
|
+
fitCount = i + 1;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (fitCount === 0) return '';
|
|
122
|
+
const namesOnly = entries
|
|
123
|
+
.slice(0, fitCount)
|
|
124
|
+
.map((s) => ({ name: s.name, description: '' }));
|
|
125
|
+
return formatEntries(namesOnly);
|
|
126
|
+
}
|