@librechat/agents 3.7.0 → 3.7.2

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 (101) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +11 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/eventActor/EventActorExecutor.cjs +797 -0
  4. package/dist/cjs/eventActor/EventActorExecutor.cjs.map +1 -0
  5. package/dist/cjs/eventActor/index.cjs +1 -0
  6. package/dist/cjs/graphs/Graph.cjs +7 -2
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/llm/invoke.cjs +56 -9
  9. package/dist/cjs/llm/invoke.cjs.map +1 -1
  10. package/dist/cjs/main.cjs +15 -1
  11. package/dist/cjs/messages/content.cjs +8 -5
  12. package/dist/cjs/messages/content.cjs.map +1 -1
  13. package/dist/cjs/messages/format.cjs +15 -5
  14. package/dist/cjs/messages/format.cjs.map +1 -1
  15. package/dist/cjs/messages/index.cjs +2 -1
  16. package/dist/cjs/messages/projectionInvariant.cjs +74 -0
  17. package/dist/cjs/messages/projectionInvariant.cjs.map +1 -0
  18. package/dist/cjs/messages/provenance.cjs +30 -8
  19. package/dist/cjs/messages/provenance.cjs.map +1 -1
  20. package/dist/cjs/messages/recency.cjs +202 -7
  21. package/dist/cjs/messages/recency.cjs.map +1 -1
  22. package/dist/cjs/messages/toolResultTypes.cjs +1 -0
  23. package/dist/cjs/session/AgentSession.cjs +4 -23
  24. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  25. package/dist/cjs/session/deriveMessages.cjs +25 -0
  26. package/dist/cjs/session/deriveMessages.cjs.map +1 -0
  27. package/dist/cjs/session/index.cjs +1 -0
  28. package/dist/cjs/summarization/node.cjs +13 -6
  29. package/dist/cjs/summarization/node.cjs.map +1 -1
  30. package/dist/cjs/tools/subagent/InMemorySubagentTaskStore.cjs +65 -8
  31. package/dist/cjs/tools/subagent/InMemorySubagentTaskStore.cjs.map +1 -1
  32. package/dist/esm/agents/AgentContext.mjs +11 -2
  33. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  34. package/dist/esm/eventActor/EventActorExecutor.mjs +796 -0
  35. package/dist/esm/eventActor/EventActorExecutor.mjs.map +1 -0
  36. package/dist/esm/eventActor/index.mjs +2 -0
  37. package/dist/esm/graphs/Graph.mjs +8 -3
  38. package/dist/esm/graphs/Graph.mjs.map +1 -1
  39. package/dist/esm/llm/invoke.mjs +56 -9
  40. package/dist/esm/llm/invoke.mjs.map +1 -1
  41. package/dist/esm/main.mjs +8 -4
  42. package/dist/esm/messages/content.mjs +8 -6
  43. package/dist/esm/messages/content.mjs.map +1 -1
  44. package/dist/esm/messages/format.mjs +16 -6
  45. package/dist/esm/messages/format.mjs.map +1 -1
  46. package/dist/esm/messages/index.mjs +2 -1
  47. package/dist/esm/messages/projectionInvariant.mjs +72 -0
  48. package/dist/esm/messages/projectionInvariant.mjs.map +1 -0
  49. package/dist/esm/messages/provenance.mjs +30 -9
  50. package/dist/esm/messages/provenance.mjs.map +1 -1
  51. package/dist/esm/messages/recency.mjs +201 -8
  52. package/dist/esm/messages/recency.mjs.map +1 -1
  53. package/dist/esm/messages/toolResultTypes.mjs +1 -1
  54. package/dist/esm/session/AgentSession.mjs +4 -23
  55. package/dist/esm/session/AgentSession.mjs.map +1 -1
  56. package/dist/esm/session/deriveMessages.mjs +25 -0
  57. package/dist/esm/session/deriveMessages.mjs.map +1 -0
  58. package/dist/esm/session/index.mjs +1 -0
  59. package/dist/esm/summarization/node.mjs +14 -7
  60. package/dist/esm/summarization/node.mjs.map +1 -1
  61. package/dist/esm/tools/subagent/InMemorySubagentTaskStore.mjs +65 -8
  62. package/dist/esm/tools/subagent/InMemorySubagentTaskStore.mjs.map +1 -1
  63. package/dist/types/agents/AgentContext.d.ts +6 -1
  64. package/dist/types/eventActor/EventActorExecutor.d.ts +18 -0
  65. package/dist/types/eventActor/index.d.ts +2 -0
  66. package/dist/types/eventActor/types.d.ts +193 -0
  67. package/dist/types/index.d.ts +1 -0
  68. package/dist/types/messages/content.d.ts +4 -1
  69. package/dist/types/messages/format.d.ts +6 -0
  70. package/dist/types/messages/index.d.ts +1 -0
  71. package/dist/types/messages/projectionInvariant.d.ts +25 -0
  72. package/dist/types/messages/provenance.d.ts +10 -0
  73. package/dist/types/messages/recency.d.ts +30 -18
  74. package/dist/types/session/deriveMessages.d.ts +11 -0
  75. package/dist/types/session/index.d.ts +2 -0
  76. package/dist/types/tools/subagent/InMemorySubagentTaskStore.d.ts +13 -1
  77. package/dist/types/types/graph.d.ts +1 -1
  78. package/dist/types/types/subagentTasks.d.ts +22 -0
  79. package/dist/types/types/summarize.d.ts +15 -13
  80. package/package.json +68 -77
  81. package/src/agents/AgentContext.ts +19 -5
  82. package/src/eventActor/EventActorExecutor.ts +1499 -0
  83. package/src/eventActor/index.ts +32 -0
  84. package/src/eventActor/types.ts +250 -0
  85. package/src/graphs/Graph.ts +9 -1
  86. package/src/index.ts +3 -0
  87. package/src/llm/invoke.ts +102 -23
  88. package/src/messages/content.ts +20 -10
  89. package/src/messages/format.ts +29 -5
  90. package/src/messages/index.ts +1 -0
  91. package/src/messages/projectionInvariant.ts +134 -0
  92. package/src/messages/provenance.ts +60 -18
  93. package/src/messages/recency.ts +429 -27
  94. package/src/session/AgentSession.ts +4 -30
  95. package/src/session/deriveMessages.ts +37 -0
  96. package/src/session/index.ts +2 -0
  97. package/src/summarization/node.ts +37 -15
  98. package/src/tools/subagent/InMemorySubagentTaskStore.ts +139 -6
  99. package/src/types/graph.ts +1 -0
  100. package/src/types/subagentTasks.ts +28 -0
  101. package/src/types/summarize.ts +15 -13
@@ -0,0 +1,134 @@
1
+ import type { BaseMessage } from '@langchain/core/messages';
2
+ import { inspectProviderMessageProvenance } from './provenance';
3
+
4
+ export type ProviderMessageProjectionInvariantMode =
5
+ | 'off'
6
+ | 'observe'
7
+ | 'assert';
8
+
9
+ export type ProviderMessageProjectionIssueCode =
10
+ | 'absent_provenance'
11
+ | 'invalid_provenance'
12
+ | 'unsourced_non_synthetic_part';
13
+
14
+ export interface ProviderMessageProjectionInvariantIssue {
15
+ readonly code: ProviderMessageProjectionIssueCode;
16
+ readonly messageIndex: number;
17
+ readonly messageType: string;
18
+ }
19
+
20
+ export interface ProviderMessageProjectionInvariantReport {
21
+ readonly valid: boolean;
22
+ readonly messageCount: number;
23
+ readonly sourceBackedMessageCount: number;
24
+ readonly syntheticMessageCount: number;
25
+ readonly gapMessageCount: number;
26
+ readonly issues: readonly ProviderMessageProjectionInvariantIssue[];
27
+ }
28
+
29
+ const MAX_REPORTED_PROJECTION_ISSUES = 64;
30
+
31
+ function getMessageType(message: BaseMessage): string {
32
+ try {
33
+ return typeof message.type === 'string' ? message.type : 'unknown';
34
+ } catch {
35
+ return 'unknown';
36
+ }
37
+ }
38
+
39
+ function appendIssue(
40
+ issues: ProviderMessageProjectionInvariantIssue[],
41
+ code: ProviderMessageProjectionIssueCode,
42
+ messageIndex: number,
43
+ messageType: string
44
+ ): void {
45
+ if (issues.length >= MAX_REPORTED_PROJECTION_ISSUES) {
46
+ return;
47
+ }
48
+ issues.push(Object.freeze({ code, messageIndex, messageType }));
49
+ }
50
+
51
+ /** Resolves the opt-in provider projection invariant without enabling it for
52
+ * unrecognized values. */
53
+ export function resolveProviderMessageProjectionInvariantMode(
54
+ value = process.env.AGENT_MESSAGE_PROJECTION_INVARIANT
55
+ ): ProviderMessageProjectionInvariantMode {
56
+ if (value === 'observe' || value === 'assert') {
57
+ return value;
58
+ }
59
+ return 'off';
60
+ }
61
+
62
+ /** Inspects provider-bound lineage without reading message content or source ids. */
63
+ export function inspectProviderMessageProjection(
64
+ messages: readonly BaseMessage[]
65
+ ): ProviderMessageProjectionInvariantReport {
66
+ const issues: ProviderMessageProjectionInvariantIssue[] = [];
67
+ let sourceBackedMessageCount = 0;
68
+ let syntheticMessageCount = 0;
69
+ let gapMessageCount = 0;
70
+
71
+ for (let messageIndex = 0; messageIndex < messages.length; messageIndex++) {
72
+ const message = messages[messageIndex];
73
+ const messageType = getMessageType(message);
74
+ const state = inspectProviderMessageProvenance(message);
75
+ if (state.status !== 'valid') {
76
+ gapMessageCount++;
77
+ appendIssue(
78
+ issues,
79
+ state.status === 'absent'
80
+ ? 'absent_provenance'
81
+ : 'invalid_provenance',
82
+ messageIndex,
83
+ messageType
84
+ );
85
+ continue;
86
+ }
87
+
88
+ let hasSourceBackedPart = false;
89
+ let hasGap = false;
90
+ for (const part of state.provenance.parts) {
91
+ if (part.sourceMessageId != null) {
92
+ hasSourceBackedPart = true;
93
+ continue;
94
+ }
95
+ if (part.attribution === 'synthetic') {
96
+ continue;
97
+ }
98
+ hasGap = true;
99
+ appendIssue(
100
+ issues,
101
+ 'unsourced_non_synthetic_part',
102
+ messageIndex,
103
+ messageType
104
+ );
105
+ }
106
+
107
+ if (hasGap) {
108
+ gapMessageCount++;
109
+ } else if (hasSourceBackedPart) {
110
+ sourceBackedMessageCount++;
111
+ } else {
112
+ syntheticMessageCount++;
113
+ }
114
+ }
115
+
116
+ return Object.freeze({
117
+ valid: gapMessageCount === 0,
118
+ messageCount: messages.length,
119
+ sourceBackedMessageCount,
120
+ syntheticMessageCount,
121
+ gapMessageCount,
122
+ issues: Object.freeze(issues),
123
+ });
124
+ }
125
+
126
+ export class ProviderMessageProjectionInvariantError extends Error {
127
+ readonly report: ProviderMessageProjectionInvariantReport;
128
+
129
+ constructor(report: ProviderMessageProjectionInvariantReport) {
130
+ super('Provider message projection invariant failed');
131
+ this.name = 'ProviderMessageProjectionInvariantError';
132
+ this.report = report;
133
+ }
134
+ }
@@ -766,11 +766,14 @@ function publishProviderMessageProvenance(
766
766
  }
767
767
  }
768
768
 
769
- /** Replaces typed provenance and synchronizes its stable plural source ids. */
770
- export function setProviderMessageProvenance(
771
- message: BaseMessage,
769
+ interface ResolvedProvenancePublication {
770
+ provenance: ProviderMessageProvenance;
771
+ sourceMessageIds?: readonly string[];
772
+ }
773
+
774
+ function resolveProvenancePublication(
772
775
  parts: readonly ProviderMessageProvenancePart[]
773
- ): void {
776
+ ): ResolvedProvenancePublication {
774
777
  const normalizedParts = normalizeProvenanceParts(parts);
775
778
  const provenance: ProviderMessageProvenance = Object.freeze({
776
779
  version: PROVIDER_MESSAGE_PROVENANCE_VERSION,
@@ -782,21 +785,60 @@ export function setProviderMessageProvenance(
782
785
  for (const part of normalizedParts) {
783
786
  appendSourceMessageId(sourceMessageIds, seen, part.sourceMessageId);
784
787
  }
785
- if (sourceMessageIds.length > 0) {
786
- const immutableSourceMessageIds = Object.freeze(sourceMessageIds);
787
- immutableProviderSourceMessageIds.add(immutableSourceMessageIds);
788
- immutableProviderMessageSourceIds.set(
789
- provenance,
790
- immutableSourceMessageIds
791
- );
792
- publishProviderMessageProvenance(
793
- message,
794
- provenance,
795
- immutableSourceMessageIds
796
- );
797
- return;
788
+ if (sourceMessageIds.length === 0) {
789
+ return { provenance };
798
790
  }
799
- publishProviderMessageProvenance(message, provenance);
791
+ const immutableSourceMessageIds = Object.freeze(sourceMessageIds);
792
+ immutableProviderSourceMessageIds.add(immutableSourceMessageIds);
793
+ immutableProviderMessageSourceIds.set(provenance, immutableSourceMessageIds);
794
+ return { provenance, sourceMessageIds: immutableSourceMessageIds };
795
+ }
796
+
797
+ /** Replaces typed provenance and synchronizes its stable plural source ids. */
798
+ export function setProviderMessageProvenance(
799
+ message: BaseMessage,
800
+ parts: readonly ProviderMessageProvenancePart[]
801
+ ): void {
802
+ const resolved = resolveProvenancePublication(parts);
803
+ publishProviderMessageProvenance(
804
+ message,
805
+ resolved.provenance,
806
+ resolved.sourceMessageIds
807
+ );
808
+ }
809
+
810
+ /**
811
+ * {@link setProviderMessageProvenance} for a message the caller itself just
812
+ * constructed from locally built plain objects. Such a message cannot carry
813
+ * proxies, accessors, or foreign aliases in `additional_kwargs`/`lc_kwargs`,
814
+ * so the publication skips the hardened descriptor walks while producing the
815
+ * same end state: fresh replacement objects on both slots, with the
816
+ * serialization mirror aliasing the live kwargs. Never call this with a
817
+ * message received across a seam — that is what the hardened variant is for.
818
+ */
819
+ export function setFreshProviderMessageProvenance(
820
+ message: BaseMessage,
821
+ parts: readonly ProviderMessageProvenancePart[]
822
+ ): void {
823
+ const resolved = resolveProvenancePublication(parts);
824
+ const replacement: UntrustedProviderMessageAdditionalKwargs = {
825
+ ...message.additional_kwargs,
826
+ };
827
+ replacement.provenance = resolved.provenance;
828
+ const sourceMessageIds = resolved.sourceMessageIds;
829
+ if (sourceMessageIds != null && sourceMessageIds.length > 0) {
830
+ replacement.sourceMessageIds = sourceMessageIds;
831
+ replacement.sourceMessageId = sourceMessageIds[sourceMessageIds.length - 1];
832
+ } else {
833
+ delete replacement.sourceMessageIds;
834
+ delete replacement.sourceMessageId;
835
+ }
836
+ const serializedReplacement: BaseMessage['lc_kwargs'] = {
837
+ ...message.lc_kwargs,
838
+ };
839
+ serializedReplacement.additional_kwargs = replacement;
840
+ message.additional_kwargs = replacement;
841
+ message.lc_kwargs = serializedReplacement;
800
842
  }
801
843
 
802
844
  /** Publishes the canonical fail-closed marker for malformed provenance. */