@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.
Files changed (149) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +23 -3
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +16 -0
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +91 -0
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/hooks/HookRegistry.cjs +162 -0
  8. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -0
  9. package/dist/cjs/hooks/executeHooks.cjs +276 -0
  10. package/dist/cjs/hooks/executeHooks.cjs.map +1 -0
  11. package/dist/cjs/hooks/matchers.cjs +256 -0
  12. package/dist/cjs/hooks/matchers.cjs.map +1 -0
  13. package/dist/cjs/hooks/types.cjs +27 -0
  14. package/dist/cjs/hooks/types.cjs.map +1 -0
  15. package/dist/cjs/main.cjs +53 -0
  16. package/dist/cjs/main.cjs.map +1 -1
  17. package/dist/cjs/messages/format.cjs +74 -12
  18. package/dist/cjs/messages/format.cjs.map +1 -1
  19. package/dist/cjs/run.cjs +111 -0
  20. package/dist/cjs/run.cjs.map +1 -1
  21. package/dist/cjs/summarization/node.cjs +44 -0
  22. package/dist/cjs/summarization/node.cjs.map +1 -1
  23. package/dist/cjs/tools/BashExecutor.cjs +175 -0
  24. package/dist/cjs/tools/BashExecutor.cjs.map +1 -0
  25. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +296 -0
  26. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -0
  27. package/dist/cjs/tools/ReadFile.cjs +43 -0
  28. package/dist/cjs/tools/ReadFile.cjs.map +1 -0
  29. package/dist/cjs/tools/SkillTool.cjs +50 -0
  30. package/dist/cjs/tools/SkillTool.cjs.map +1 -0
  31. package/dist/cjs/tools/SubagentTool.cjs +92 -0
  32. package/dist/cjs/tools/SubagentTool.cjs.map +1 -0
  33. package/dist/cjs/tools/ToolNode.cjs +304 -140
  34. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  35. package/dist/cjs/tools/skillCatalog.cjs +84 -0
  36. package/dist/cjs/tools/skillCatalog.cjs.map +1 -0
  37. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +511 -0
  38. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -0
  39. package/dist/esm/agents/AgentContext.mjs +23 -3
  40. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  41. package/dist/esm/common/enum.mjs +15 -1
  42. package/dist/esm/common/enum.mjs.map +1 -1
  43. package/dist/esm/graphs/Graph.mjs +91 -0
  44. package/dist/esm/graphs/Graph.mjs.map +1 -1
  45. package/dist/esm/hooks/HookRegistry.mjs +160 -0
  46. package/dist/esm/hooks/HookRegistry.mjs.map +1 -0
  47. package/dist/esm/hooks/executeHooks.mjs +273 -0
  48. package/dist/esm/hooks/executeHooks.mjs.map +1 -0
  49. package/dist/esm/hooks/matchers.mjs +251 -0
  50. package/dist/esm/hooks/matchers.mjs.map +1 -0
  51. package/dist/esm/hooks/types.mjs +25 -0
  52. package/dist/esm/hooks/types.mjs.map +1 -0
  53. package/dist/esm/main.mjs +12 -1
  54. package/dist/esm/main.mjs.map +1 -1
  55. package/dist/esm/messages/format.mjs +66 -4
  56. package/dist/esm/messages/format.mjs.map +1 -1
  57. package/dist/esm/run.mjs +111 -0
  58. package/dist/esm/run.mjs.map +1 -1
  59. package/dist/esm/summarization/node.mjs +44 -0
  60. package/dist/esm/summarization/node.mjs.map +1 -1
  61. package/dist/esm/tools/BashExecutor.mjs +169 -0
  62. package/dist/esm/tools/BashExecutor.mjs.map +1 -0
  63. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +287 -0
  64. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -0
  65. package/dist/esm/tools/ReadFile.mjs +38 -0
  66. package/dist/esm/tools/ReadFile.mjs.map +1 -0
  67. package/dist/esm/tools/SkillTool.mjs +45 -0
  68. package/dist/esm/tools/SkillTool.mjs.map +1 -0
  69. package/dist/esm/tools/SubagentTool.mjs +85 -0
  70. package/dist/esm/tools/SubagentTool.mjs.map +1 -0
  71. package/dist/esm/tools/ToolNode.mjs +306 -142
  72. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  73. package/dist/esm/tools/skillCatalog.mjs +82 -0
  74. package/dist/esm/tools/skillCatalog.mjs.map +1 -0
  75. package/dist/esm/tools/subagent/SubagentExecutor.mjs +505 -0
  76. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -0
  77. package/dist/types/agents/AgentContext.d.ts +6 -0
  78. package/dist/types/common/enum.d.ts +10 -1
  79. package/dist/types/graphs/Graph.d.ts +2 -0
  80. package/dist/types/hooks/HookRegistry.d.ts +56 -0
  81. package/dist/types/hooks/executeHooks.d.ts +79 -0
  82. package/dist/types/hooks/index.d.ts +6 -0
  83. package/dist/types/hooks/matchers.d.ts +95 -0
  84. package/dist/types/hooks/types.d.ts +320 -0
  85. package/dist/types/index.d.ts +8 -0
  86. package/dist/types/messages/format.d.ts +2 -1
  87. package/dist/types/run.d.ts +1 -0
  88. package/dist/types/summarization/node.d.ts +2 -0
  89. package/dist/types/tools/BashExecutor.d.ts +45 -0
  90. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +72 -0
  91. package/dist/types/tools/ReadFile.d.ts +28 -0
  92. package/dist/types/tools/SkillTool.d.ts +40 -0
  93. package/dist/types/tools/SubagentTool.d.ts +36 -0
  94. package/dist/types/tools/ToolNode.d.ts +24 -2
  95. package/dist/types/tools/skillCatalog.d.ts +19 -0
  96. package/dist/types/tools/subagent/SubagentExecutor.d.ts +137 -0
  97. package/dist/types/tools/subagent/index.d.ts +2 -0
  98. package/dist/types/types/graph.d.ts +61 -2
  99. package/dist/types/types/index.d.ts +1 -0
  100. package/dist/types/types/llm.d.ts +14 -2
  101. package/dist/types/types/run.d.ts +20 -0
  102. package/dist/types/types/skill.d.ts +9 -0
  103. package/dist/types/types/tools.d.ts +38 -1
  104. package/package.json +5 -1
  105. package/src/agents/AgentContext.ts +26 -2
  106. package/src/common/enum.ts +15 -0
  107. package/src/graphs/Graph.ts +113 -0
  108. package/src/hooks/HookRegistry.ts +208 -0
  109. package/src/hooks/__tests__/HookRegistry.test.ts +190 -0
  110. package/src/hooks/__tests__/compactHooks.test.ts +214 -0
  111. package/src/hooks/__tests__/executeHooks.test.ts +1013 -0
  112. package/src/hooks/__tests__/integration.test.ts +337 -0
  113. package/src/hooks/__tests__/matchers.test.ts +238 -0
  114. package/src/hooks/__tests__/toolHooks.test.ts +669 -0
  115. package/src/hooks/executeHooks.ts +375 -0
  116. package/src/hooks/index.ts +57 -0
  117. package/src/hooks/matchers.ts +280 -0
  118. package/src/hooks/types.ts +404 -0
  119. package/src/index.ts +10 -0
  120. package/src/messages/format.ts +74 -4
  121. package/src/messages/formatAgentMessages.skills.test.ts +334 -0
  122. package/src/run.ts +126 -0
  123. package/src/scripts/multi-agent-subagent.ts +246 -0
  124. package/src/scripts/subagent-event-driven-debug.ts +190 -0
  125. package/src/scripts/subagent-tools-debug.ts +160 -0
  126. package/src/specs/subagent.test.ts +305 -0
  127. package/src/summarization/node.ts +53 -0
  128. package/src/tools/BashExecutor.ts +205 -0
  129. package/src/tools/BashProgrammaticToolCalling.ts +397 -0
  130. package/src/tools/ReadFile.ts +39 -0
  131. package/src/tools/SkillTool.ts +46 -0
  132. package/src/tools/SubagentTool.ts +100 -0
  133. package/src/tools/ToolNode.ts +391 -169
  134. package/src/tools/__tests__/ReadFile.test.ts +44 -0
  135. package/src/tools/__tests__/SkillTool.test.ts +442 -0
  136. package/src/tools/__tests__/SubagentExecutor.test.ts +1148 -0
  137. package/src/tools/__tests__/SubagentTool.test.ts +149 -0
  138. package/src/tools/__tests__/ToolNode.session.test.ts +12 -12
  139. package/src/tools/__tests__/skillCatalog.test.ts +161 -0
  140. package/src/tools/__tests__/subagentHooks.test.ts +215 -0
  141. package/src/tools/skillCatalog.ts +126 -0
  142. package/src/tools/subagent/SubagentExecutor.ts +676 -0
  143. package/src/tools/subagent/index.ts +13 -0
  144. package/src/types/graph.ts +80 -1
  145. package/src/types/index.ts +1 -0
  146. package/src/types/llm.ts +16 -2
  147. package/src/types/run.ts +20 -0
  148. package/src/types/skill.ts +11 -0
  149. 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
+ }