@animalabs/membrane 0.5.46 → 0.5.50

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 (139) hide show
  1. package/dist/membrane.d.ts.map +1 -1
  2. package/dist/membrane.js +104 -11
  3. package/dist/membrane.js.map +1 -1
  4. package/dist/providers/anthropic.d.ts.map +1 -1
  5. package/dist/providers/anthropic.js +11 -1
  6. package/dist/providers/anthropic.js.map +1 -1
  7. package/dist/providers/bedrock.d.ts.map +1 -1
  8. package/dist/providers/bedrock.js +23 -4
  9. package/dist/providers/bedrock.js.map +1 -1
  10. package/dist/types/yielding-stream.d.ts +10 -1
  11. package/dist/types/yielding-stream.d.ts.map +1 -1
  12. package/dist/types/yielding-stream.js.map +1 -1
  13. package/package.json +5 -1
  14. package/src/membrane.ts +127 -13
  15. package/src/providers/anthropic.ts +12 -0
  16. package/src/providers/bedrock.ts +21 -4
  17. package/src/types/yielding-stream.ts +10 -1
  18. package/dist/context/index.d.ts +0 -12
  19. package/dist/context/index.js +0 -11
  20. package/dist/context/index.js.map +0 -1
  21. package/dist/context/process.d.ts +0 -43
  22. package/dist/context/process.js +0 -381
  23. package/dist/context/process.js.map +0 -1
  24. package/dist/context/types.d.ts +0 -164
  25. package/dist/context/types.js +0 -61
  26. package/dist/context/types.js.map +0 -1
  27. package/dist/formatters/anthropic-xml.d.ts +0 -63
  28. package/dist/formatters/anthropic-xml.js +0 -417
  29. package/dist/formatters/anthropic-xml.js.map +0 -1
  30. package/dist/formatters/completions.d.ts +0 -68
  31. package/dist/formatters/completions.js +0 -261
  32. package/dist/formatters/completions.js.map +0 -1
  33. package/dist/formatters/index.d.ts +0 -8
  34. package/dist/formatters/index.js +0 -7
  35. package/dist/formatters/index.js.map +0 -1
  36. package/dist/formatters/native.d.ts +0 -35
  37. package/dist/formatters/native.js +0 -336
  38. package/dist/formatters/native.js.map +0 -1
  39. package/dist/formatters/types.d.ts +0 -167
  40. package/dist/formatters/types.js +0 -7
  41. package/dist/formatters/types.js.map +0 -1
  42. package/dist/index.d.ts +0 -13
  43. package/dist/index.js +0 -20
  44. package/dist/index.js.map +0 -1
  45. package/dist/membrane.d.ts +0 -146
  46. package/dist/providers/anthropic.d.ts +0 -36
  47. package/dist/providers/bedrock.d.ts +0 -43
  48. package/dist/providers/gemini.d.ts +0 -68
  49. package/dist/providers/gemini.js +0 -538
  50. package/dist/providers/gemini.js.map +0 -1
  51. package/dist/providers/index.d.ts +0 -13
  52. package/dist/providers/index.js +0 -13
  53. package/dist/providers/index.js.map +0 -1
  54. package/dist/providers/mock.d.ts +0 -90
  55. package/dist/providers/mock.d.ts.map +0 -1
  56. package/dist/providers/mock.js +0 -210
  57. package/dist/providers/mock.js.map +0 -1
  58. package/dist/providers/openai-compatible.d.ts +0 -82
  59. package/dist/providers/openai-compatible.js +0 -480
  60. package/dist/providers/openai-compatible.js.map +0 -1
  61. package/dist/providers/openai-completions.d.ts +0 -89
  62. package/dist/providers/openai-completions.js +0 -347
  63. package/dist/providers/openai-completions.js.map +0 -1
  64. package/dist/providers/openai-responses.d.ts +0 -77
  65. package/dist/providers/openai-responses.js +0 -333
  66. package/dist/providers/openai-responses.js.map +0 -1
  67. package/dist/providers/openai.d.ts +0 -77
  68. package/dist/providers/openai.js +0 -533
  69. package/dist/providers/openai.js.map +0 -1
  70. package/dist/providers/openrouter.d.ts +0 -82
  71. package/dist/providers/openrouter.js +0 -556
  72. package/dist/providers/openrouter.js.map +0 -1
  73. package/dist/providers/utils.d.ts +0 -44
  74. package/dist/providers/utils.d.ts.map +0 -1
  75. package/dist/providers/utils.js +0 -100
  76. package/dist/providers/utils.js.map +0 -1
  77. package/dist/registry/default-pricing.d.ts +0 -3
  78. package/dist/registry/default-pricing.d.ts.map +0 -1
  79. package/dist/registry/default-pricing.js +0 -75
  80. package/dist/registry/default-pricing.js.map +0 -1
  81. package/dist/transforms/chat.d.ts +0 -52
  82. package/dist/transforms/chat.js +0 -136
  83. package/dist/transforms/chat.js.map +0 -1
  84. package/dist/transforms/index.d.ts +0 -5
  85. package/dist/transforms/index.js +0 -7
  86. package/dist/transforms/index.js.map +0 -1
  87. package/dist/types/config.d.ts +0 -110
  88. package/dist/types/config.js +0 -21
  89. package/dist/types/config.js.map +0 -1
  90. package/dist/types/content.d.ts +0 -87
  91. package/dist/types/content.d.ts.map +0 -1
  92. package/dist/types/content.js +0 -40
  93. package/dist/types/content.js.map +0 -1
  94. package/dist/types/errors.d.ts +0 -50
  95. package/dist/types/errors.d.ts.map +0 -1
  96. package/dist/types/errors.js +0 -253
  97. package/dist/types/errors.js.map +0 -1
  98. package/dist/types/index.d.ts +0 -20
  99. package/dist/types/index.js +0 -10
  100. package/dist/types/index.js.map +0 -1
  101. package/dist/types/message.d.ts +0 -52
  102. package/dist/types/message.d.ts.map +0 -1
  103. package/dist/types/message.js +0 -38
  104. package/dist/types/message.js.map +0 -1
  105. package/dist/types/provider.d.ts +0 -169
  106. package/dist/types/provider.d.ts.map +0 -1
  107. package/dist/types/provider.js +0 -5
  108. package/dist/types/provider.js.map +0 -1
  109. package/dist/types/request.d.ts +0 -116
  110. package/dist/types/request.d.ts.map +0 -1
  111. package/dist/types/request.js +0 -5
  112. package/dist/types/request.js.map +0 -1
  113. package/dist/types/response.d.ts +0 -131
  114. package/dist/types/response.d.ts.map +0 -1
  115. package/dist/types/response.js +0 -7
  116. package/dist/types/response.js.map +0 -1
  117. package/dist/types/streaming.d.ts +0 -194
  118. package/dist/types/streaming.js +0 -5
  119. package/dist/types/streaming.js.map +0 -1
  120. package/dist/types/tools.d.ts +0 -71
  121. package/dist/types/tools.d.ts.map +0 -1
  122. package/dist/types/tools.js +0 -5
  123. package/dist/types/tools.js.map +0 -1
  124. package/dist/utils/cost.d.ts +0 -10
  125. package/dist/utils/cost.d.ts.map +0 -1
  126. package/dist/utils/cost.js +0 -19
  127. package/dist/utils/cost.js.map +0 -1
  128. package/dist/utils/index.d.ts +0 -7
  129. package/dist/utils/index.js +0 -6
  130. package/dist/utils/index.js.map +0 -1
  131. package/dist/utils/stream-parser.d.ts +0 -84
  132. package/dist/utils/stream-parser.js +0 -418
  133. package/dist/utils/stream-parser.js.map +0 -1
  134. package/dist/utils/tool-parser.d.ts +0 -134
  135. package/dist/utils/tool-parser.js +0 -600
  136. package/dist/utils/tool-parser.js.map +0 -1
  137. package/dist/yielding-stream.d.ts +0 -60
  138. package/dist/yielding-stream.js +0 -206
  139. package/dist/yielding-stream.js.map +0 -1
@@ -1,381 +0,0 @@
1
- /**
2
- * Context processing - main entry point
3
- */
4
- import { createInitialState, defaultTokenEstimator, DEFAULT_CONTEXT_CONFIG, } from './types.js';
5
- // ============================================================================
6
- // Main Entry Point
7
- // ============================================================================
8
- /**
9
- * Process context and stream LLM response.
10
- *
11
- * This function handles:
12
- * - Rolling/truncation based on thresholds
13
- * - Cache marker placement for prompt caching
14
- * - Hard limit enforcement
15
- * - State management
16
- *
17
- * @param membrane - Configured Membrane instance
18
- * @param input - Messages, config, and context settings
19
- * @param state - Previous state (null for first call)
20
- * @param options - Stream options
21
- * @returns Response, updated state, and context info
22
- */
23
- export async function processContext(membrane, input, state, options) {
24
- // Merge config with defaults
25
- const contextConfig = mergeConfig(input.context);
26
- const tokenEstimator = contextConfig.tokenEstimator ?? defaultTokenEstimator;
27
- // Initialize or continue state
28
- let currentState = state ?? createInitialState();
29
- // Detect discontinuity (new conversation or branch switch)
30
- const isDiscontinuous = detectDiscontinuity(input.messages, currentState);
31
- if (isDiscontinuous) {
32
- currentState = createInitialState();
33
- }
34
- // Calculate tokens for all messages
35
- const messageTokens = input.messages.map(m => ({
36
- message: m,
37
- tokens: tokenEstimator(m),
38
- id: getMessageId(m),
39
- }));
40
- const totalTokens = messageTokens.reduce((sum, m) => sum + m.tokens, 0);
41
- const totalCharacters = calculateCharacters(input.messages);
42
- // Determine if we should roll
43
- const rollDecision = shouldRoll(currentState, input.messages.length, totalTokens, totalCharacters, contextConfig);
44
- // Apply rolling/truncation if needed
45
- let keptMessages = input.messages;
46
- let messagesDropped = 0;
47
- let didRoll = false;
48
- let hardLimitHit = false;
49
- if (rollDecision.shouldRoll) {
50
- const truncateResult = truncateMessages(messageTokens, rollDecision.targetTokens, rollDecision.targetMessages, contextConfig);
51
- keptMessages = truncateResult.kept.map(m => m.message);
52
- messagesDropped = truncateResult.dropped;
53
- didRoll = true;
54
- hardLimitHit = rollDecision.reason === 'hard_limit';
55
- }
56
- // Recalculate tokens after truncation
57
- const keptTokens = keptMessages.map(m => ({
58
- message: m,
59
- tokens: tokenEstimator(m),
60
- id: getMessageId(m),
61
- }));
62
- const keptTotalTokens = keptTokens.reduce((sum, m) => sum + m.tokens, 0);
63
- // Place cache markers
64
- const cacheMarkers = placeCacheMarkers(keptMessages, keptTokens, currentState, didRoll, contextConfig);
65
- // Apply cache markers to messages
66
- const messagesWithCache = applyCacheMarkers(keptMessages, cacheMarkers);
67
- // Calculate cached/uncached tokens
68
- const lastMarker = cacheMarkers[cacheMarkers.length - 1];
69
- const cachedTokens = lastMarker?.tokenEstimate ?? 0;
70
- const uncachedTokens = keptTotalTokens - cachedTokens;
71
- // Build request
72
- const request = {
73
- messages: messagesWithCache,
74
- system: input.system,
75
- tools: input.tools,
76
- config: input.config,
77
- };
78
- // Stream response - pass through all options
79
- const response = await membrane.stream(request, {
80
- onChunk: options?.onChunk,
81
- signal: options?.signal,
82
- onToolCalls: options?.onToolCalls,
83
- onPreToolContent: options?.onPreToolContent,
84
- onUsage: options?.onUsage,
85
- maxToolDepth: options?.maxToolDepth,
86
- });
87
- // Determine cachedStartMessageId
88
- // - On roll: use first message ID after truncation (anchor for stable fetches)
89
- // - No roll: keep existing (maintains fetch window stability)
90
- const cachedStartMessageId = didRoll
91
- ? (keptMessages.length > 0 ? getMessageId(keptMessages[0]) : undefined)
92
- : currentState.cachedStartMessageId;
93
- // Update state
94
- const newState = {
95
- cacheMarkers,
96
- windowMessageIds: keptMessages.map(m => getMessageId(m)),
97
- messagesSinceRoll: didRoll ? 1 : currentState.messagesSinceRoll + 1,
98
- tokensSinceRoll: didRoll ? keptTotalTokens : currentState.tokensSinceRoll + keptTotalTokens,
99
- inGracePeriod: rollDecision.enteredGrace || (currentState.inGracePeriod && !didRoll),
100
- lastRollTime: didRoll ? new Date().toISOString() : currentState.lastRollTime,
101
- cachedStartMessageId,
102
- };
103
- // Build info
104
- const info = {
105
- didRoll,
106
- messagesDropped,
107
- messagesKept: keptMessages.length,
108
- cacheMarkers,
109
- cachedTokens,
110
- uncachedTokens,
111
- totalTokens: keptTotalTokens,
112
- hardLimitHit,
113
- cachedStartMessageId,
114
- };
115
- return { response, state: newState, info };
116
- }
117
- // ============================================================================
118
- // Helper Functions
119
- // ============================================================================
120
- function mergeConfig(config) {
121
- return {
122
- rolling: {
123
- ...DEFAULT_CONTEXT_CONFIG.rolling,
124
- ...config.rolling,
125
- },
126
- limits: {
127
- ...DEFAULT_CONTEXT_CONFIG.limits,
128
- ...config.limits,
129
- },
130
- cache: {
131
- ...DEFAULT_CONTEXT_CONFIG.cache,
132
- ...config.cache,
133
- },
134
- tokenEstimator: config.tokenEstimator,
135
- };
136
- }
137
- function getMessageId(message) {
138
- return message.metadata?.sourceId ?? `msg-${Math.random().toString(36).slice(2)}`;
139
- }
140
- function detectDiscontinuity(messages, state) {
141
- if (state.windowMessageIds.length === 0) {
142
- return false; // First call, not a discontinuity
143
- }
144
- const currentIds = new Set(messages.map(m => getMessageId(m)));
145
- const overlap = state.windowMessageIds.filter(id => currentIds.has(id));
146
- // If less than 50% overlap, consider it a new conversation
147
- return overlap.length < state.windowMessageIds.length * 0.5;
148
- }
149
- export function calculateCharacters(messages) {
150
- let chars = 0;
151
- for (const msg of messages) {
152
- for (const block of msg.content) {
153
- if (block.type === 'text') {
154
- chars += block.text.length;
155
- }
156
- else if (block.type === 'tool_result') {
157
- const content = typeof block.content === 'string'
158
- ? block.content
159
- : JSON.stringify(block.content);
160
- chars += content.length;
161
- }
162
- // Images not counted for character limits
163
- }
164
- }
165
- return chars;
166
- }
167
- export function shouldRoll(state, messageCount, totalTokens, totalCharacters, config) {
168
- const { rolling, limits } = config;
169
- const unit = rolling.unit ?? 'messages';
170
- const threshold = rolling.threshold;
171
- const grace = rolling.grace ?? 0;
172
- const maxThreshold = threshold + grace;
173
- // Check hard limits first (always enforced)
174
- if (limits?.maxCharacters && totalCharacters > limits.maxCharacters) {
175
- return {
176
- shouldRoll: true,
177
- reason: 'hard_limit',
178
- targetTokens: limits.maxTokens,
179
- targetMessages: limits.maxMessages,
180
- enteredGrace: false,
181
- };
182
- }
183
- if (limits?.maxTokens && totalTokens > limits.maxTokens) {
184
- return {
185
- shouldRoll: true,
186
- reason: 'hard_limit',
187
- targetTokens: limits.maxTokens,
188
- targetMessages: limits.maxMessages,
189
- enteredGrace: false,
190
- };
191
- }
192
- if (limits?.maxMessages && messageCount > limits.maxMessages) {
193
- return {
194
- shouldRoll: true,
195
- reason: 'hard_limit',
196
- targetTokens: limits.maxTokens,
197
- targetMessages: limits.maxMessages,
198
- enteredGrace: false,
199
- };
200
- }
201
- // Check rolling threshold
202
- const current = unit === 'messages' ? state.messagesSinceRoll : state.tokensSinceRoll;
203
- if (current >= maxThreshold) {
204
- // Exceeded grace, must roll
205
- return {
206
- shouldRoll: true,
207
- reason: 'grace_exceeded',
208
- targetTokens: unit === 'tokens' ? threshold : undefined,
209
- targetMessages: unit === 'messages' ? threshold : undefined,
210
- enteredGrace: false,
211
- };
212
- }
213
- if (!state.inGracePeriod && current >= threshold) {
214
- // Just entered grace period
215
- return {
216
- shouldRoll: false,
217
- enteredGrace: true,
218
- };
219
- }
220
- return {
221
- shouldRoll: false,
222
- enteredGrace: false,
223
- };
224
- }
225
- export function truncateMessages(messages, targetTokens, targetMessages, config) {
226
- // Truncate from the beginning, keeping most recent
227
- if (targetMessages && messages.length > targetMessages) {
228
- const startIdx = messages.length - targetMessages;
229
- return {
230
- kept: messages.slice(startIdx),
231
- dropped: startIdx,
232
- };
233
- }
234
- if (targetTokens) {
235
- let tokenSum = 0;
236
- let startIdx = messages.length;
237
- // Count from end backwards
238
- for (let i = messages.length - 1; i >= 0; i--) {
239
- tokenSum += messages[i].tokens;
240
- if (tokenSum > targetTokens) {
241
- startIdx = i + 1;
242
- break;
243
- }
244
- startIdx = i;
245
- }
246
- return {
247
- kept: messages.slice(startIdx),
248
- dropped: startIdx,
249
- };
250
- }
251
- // Default: use buffer from config
252
- const buffer = config?.rolling.buffer ?? 20;
253
- const unit = config?.rolling.unit ?? 'messages';
254
- if (unit === 'messages') {
255
- const targetCount = Math.max(buffer * 2, messages.length - buffer);
256
- if (messages.length > targetCount) {
257
- const startIdx = messages.length - targetCount;
258
- return {
259
- kept: messages.slice(startIdx),
260
- dropped: startIdx,
261
- };
262
- }
263
- }
264
- return { kept: messages, dropped: 0 };
265
- }
266
- export function placeCacheMarkers(messages, messageTokens, state, didRoll, config) {
267
- const cacheConfig = config.cache ?? {};
268
- if (cacheConfig.enabled === false) {
269
- return [];
270
- }
271
- const numPoints = cacheConfig.points ?? 1;
272
- const minTokens = cacheConfig.minTokens ?? 1024;
273
- const preferUser = cacheConfig.preferUserMessages ?? true;
274
- const totalTokens = messageTokens.reduce((sum, m) => sum + m.tokens, 0);
275
- // Not enough tokens for caching
276
- if (totalTokens < minTokens) {
277
- return [];
278
- }
279
- // If we didn't roll, try to keep existing markers stable
280
- if (!didRoll && state.cacheMarkers.length > 0) {
281
- const currentIds = new Set(messages.map(m => getMessageId(m)));
282
- const validMarkers = state.cacheMarkers.filter(m => currentIds.has(m.messageId));
283
- if (validMarkers.length > 0) {
284
- // Recalculate token estimates for valid markers
285
- return validMarkers.map(marker => {
286
- const idx = messages.findIndex(m => getMessageId(m) === marker.messageId);
287
- const tokenEstimate = messageTokens
288
- .slice(0, idx + 1)
289
- .reduce((sum, m) => sum + m.tokens, 0);
290
- return {
291
- messageId: marker.messageId,
292
- messageIndex: idx,
293
- tokenEstimate,
294
- };
295
- });
296
- }
297
- }
298
- // Place new markers using arithmetic positioning
299
- const markers = [];
300
- const buffer = config.rolling.buffer ?? 20;
301
- // For single point: place at (length - buffer)
302
- // For multiple points: distribute evenly in cacheable portion
303
- const cacheableEnd = Math.max(0, messages.length - buffer);
304
- if (cacheableEnd === 0) {
305
- return []; // Nothing to cache
306
- }
307
- // Calculate step size for multiple cache points
308
- const step = Math.floor(cacheableEnd / numPoints);
309
- if (step === 0) {
310
- return []; // Not enough messages for requested cache points
311
- }
312
- let runningTokens = 0;
313
- let currentIdx = 0;
314
- for (let point = 1; point <= numPoints; point++) {
315
- const targetIdx = Math.min(point * step - 1, cacheableEnd - 1);
316
- // Accumulate tokens up to target
317
- while (currentIdx <= targetIdx && currentIdx < messageTokens.length) {
318
- runningTokens += messageTokens[currentIdx].tokens;
319
- currentIdx++;
320
- }
321
- let markerIdx = targetIdx;
322
- let markerTokens = runningTokens;
323
- // Adjust to user message if preferred
324
- if (preferUser) {
325
- const adjusted = findNearestUserMessage(messages, markerIdx, messageTokens);
326
- if (adjusted) {
327
- markerIdx = adjusted.index;
328
- markerTokens = adjusted.tokens;
329
- }
330
- }
331
- // Skip if below minimum
332
- if (markerTokens < minTokens) {
333
- continue;
334
- }
335
- // Skip if duplicate
336
- if (markers.some(m => m.messageIndex === markerIdx)) {
337
- continue;
338
- }
339
- markers.push({
340
- messageId: getMessageId(messages[markerIdx]),
341
- messageIndex: markerIdx,
342
- tokenEstimate: markerTokens,
343
- });
344
- }
345
- return markers;
346
- }
347
- function findNearestUserMessage(messages, startIdx, messageTokens) {
348
- // Search backwards for a user message (non-assistant participant)
349
- const maxSearch = 5;
350
- let tokens = messageTokens.slice(0, startIdx + 1).reduce((sum, m) => sum + m.tokens, 0);
351
- for (let i = startIdx; i >= Math.max(0, startIdx - maxSearch); i--) {
352
- const msg = messages[i];
353
- // Heuristic: if participant isn't a common assistant name, it's probably a user
354
- const participant = msg.participant.toLowerCase();
355
- const isUser = !['claude', 'assistant', 'bot', 'ai'].includes(participant);
356
- if (isUser) {
357
- return { index: i, tokens };
358
- }
359
- tokens -= messageTokens[i].tokens;
360
- }
361
- return null;
362
- }
363
- export function applyCacheMarkers(messages, cacheMarkers) {
364
- if (cacheMarkers.length === 0) {
365
- return messages;
366
- }
367
- const markerIndices = new Set(cacheMarkers.map(m => m.messageIndex));
368
- return messages.map((msg, idx) => {
369
- if (markerIndices.has(idx)) {
370
- return {
371
- ...msg,
372
- metadata: {
373
- ...msg.metadata,
374
- cacheControl: { type: 'ephemeral' },
375
- },
376
- };
377
- }
378
- return msg;
379
- });
380
- }
381
- //# sourceMappingURL=process.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/context/process.ts"],"names":[],"mappings":"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"}
@@ -1,164 +0,0 @@
1
- /**
2
- * Context management types
3
- */
4
- import type { NormalizedMessage, NormalizedResponse, AbortedResponse, GenerationConfig, ToolDefinition } from '../types/index.js';
5
- export interface CacheMarker {
6
- /** Message ID (from metadata.sourceId) */
7
- messageId: string;
8
- /** Index in the message array */
9
- messageIndex: number;
10
- /** Estimated tokens up to this point */
11
- tokenEstimate: number;
12
- }
13
- export interface ContextConfig {
14
- /** Rolling configuration */
15
- rolling: {
16
- /** Threshold before roll triggers */
17
- threshold: number;
18
- /** Buffer to leave uncached after roll */
19
- buffer: number;
20
- /** Grace period before forced roll (optional) */
21
- grace?: number;
22
- /** Unit for threshold/buffer/grace (default: 'messages') */
23
- unit?: 'messages' | 'tokens';
24
- };
25
- /** Hard limits (always enforced) */
26
- limits?: {
27
- /** Maximum characters (default: 500000) */
28
- maxCharacters?: number;
29
- /** Maximum tokens */
30
- maxTokens?: number;
31
- /** Maximum messages */
32
- maxMessages?: number;
33
- };
34
- /** Cache settings */
35
- cache?: {
36
- /** Enable caching (default: true) */
37
- enabled?: boolean;
38
- /** Number of cache points (default: 1, max: 4 for Anthropic) */
39
- points?: 1 | 2 | 3 | 4;
40
- /** Minimum tokens before caching (default: 1024) */
41
- minTokens?: number;
42
- /** Prefer user messages for cache markers (OpenRouter workaround) */
43
- preferUserMessages?: boolean;
44
- };
45
- /** Custom token estimator (default: chars / 4) */
46
- tokenEstimator?: (message: NormalizedMessage) => number;
47
- }
48
- export interface ContextState {
49
- /** Current cache markers */
50
- cacheMarkers: CacheMarker[];
51
- /** Message IDs in current window (for continuity detection) */
52
- windowMessageIds: string[];
53
- /** Messages since last roll */
54
- messagesSinceRoll: number;
55
- /** Tokens since last roll */
56
- tokensSinceRoll: number;
57
- /** Whether we're in grace period */
58
- inGracePeriod: boolean;
59
- /** Last roll timestamp (ISO string) */
60
- lastRollTime?: string;
61
- /**
62
- * First message ID of the cached window.
63
- *
64
- * Use this to anchor your message fetch window - fetch from this message ID
65
- * onwards to ensure cache stability. Only changes when a roll occurs.
66
- *
67
- * This helps callers maintain stable fetch windows:
68
- * - Discord bots can use this as the `after` parameter when fetching messages
69
- * - Other message sources can use it as a pagination cursor
70
- */
71
- cachedStartMessageId?: string;
72
- }
73
- export interface ContextInput {
74
- /** Conversation messages */
75
- messages: NormalizedMessage[];
76
- /** System prompt */
77
- system?: string;
78
- /** Tool definitions */
79
- tools?: ToolDefinition[];
80
- /** Generation config (model, maxTokens, etc.) */
81
- config: GenerationConfig;
82
- /** Context management config */
83
- context: ContextConfig;
84
- }
85
- export interface ContextInfo {
86
- /** Whether a roll occurred */
87
- didRoll: boolean;
88
- /** Number of messages dropped in roll */
89
- messagesDropped: number;
90
- /** Number of messages kept */
91
- messagesKept: number;
92
- /** Current cache markers */
93
- cacheMarkers: CacheMarker[];
94
- /** Estimated cached tokens */
95
- cachedTokens: number;
96
- /** Estimated uncached tokens */
97
- uncachedTokens: number;
98
- /** Total estimated tokens */
99
- totalTokens: number;
100
- /** Whether hard limit was hit */
101
- hardLimitHit: boolean;
102
- /**
103
- * First message ID of the cached window.
104
- * Useful for callers to anchor their message fetch window.
105
- */
106
- cachedStartMessageId?: string;
107
- }
108
- export interface ContextOutput {
109
- /** The LLM response (may be aborted) */
110
- response: NormalizedResponse | AbortedResponse;
111
- /** Updated state (save this for next call) */
112
- state: ContextState;
113
- /** Info about what happened */
114
- info: ContextInfo;
115
- }
116
- import type { ToolCall, ToolResult, ToolContext } from '../types/tools.js';
117
- import type { BasicUsage } from '../types/response.js';
118
- /**
119
- * Callback for tool execution within processContext.
120
- * Return tool results to continue the stream; throw to abort.
121
- */
122
- export type ContextToolCallback = (calls: ToolCall[], context: ToolContext) => Promise<ToolResult[]>;
123
- /**
124
- * Callback for pre-tool content notification.
125
- * Called with content that appeared before tool calls (useful for UI preview).
126
- */
127
- export type ContextPreToolCallback = (content: string) => Promise<void> | void;
128
- export interface ContextStreamOptions {
129
- /** Callback for streaming chunks */
130
- onChunk?: (chunk: string) => void;
131
- /** Abort signal */
132
- signal?: AbortSignal;
133
- /**
134
- * Called when tool calls are detected; return results to continue.
135
- * If not provided, tool calls are not executed (stream stops at tool_use).
136
- */
137
- onToolCalls?: ContextToolCallback;
138
- /**
139
- * Called with content before tool calls (for UI preview / progressive display).
140
- */
141
- onPreToolContent?: ContextPreToolCallback;
142
- /**
143
- * Called with usage updates during streaming.
144
- */
145
- onUsage?: (usage: BasicUsage) => void;
146
- /**
147
- * Maximum tool execution depth (default: 10).
148
- * Prevents infinite tool loops.
149
- */
150
- maxToolDepth?: number;
151
- }
152
- /**
153
- * Create initial empty state
154
- */
155
- export declare function createInitialState(): ContextState;
156
- /**
157
- * Default token estimator (chars / 4)
158
- */
159
- export declare function defaultTokenEstimator(message: NormalizedMessage): number;
160
- /**
161
- * Default context config
162
- */
163
- export declare const DEFAULT_CONTEXT_CONFIG: ContextConfig;
164
- //# sourceMappingURL=types.d.ts.map
@@ -1,61 +0,0 @@
1
- /**
2
- * Context management types
3
- */
4
- // ============================================================================
5
- // Helpers
6
- // ============================================================================
7
- /**
8
- * Create initial empty state
9
- */
10
- export function createInitialState() {
11
- return {
12
- cacheMarkers: [],
13
- windowMessageIds: [],
14
- messagesSinceRoll: 0,
15
- tokensSinceRoll: 0,
16
- inGracePeriod: false,
17
- cachedStartMessageId: undefined,
18
- };
19
- }
20
- /**
21
- * Default token estimator (chars / 4)
22
- */
23
- export function defaultTokenEstimator(message) {
24
- let chars = 0;
25
- for (const block of message.content) {
26
- if (block.type === 'text') {
27
- chars += block.text.length;
28
- }
29
- else if (block.type === 'tool_result') {
30
- const content = typeof block.content === 'string'
31
- ? block.content
32
- : JSON.stringify(block.content);
33
- chars += content.length;
34
- }
35
- else if (block.type === 'image') {
36
- // Images: ~1500 tokens regardless of size (Anthropic)
37
- chars += 6000; // 1500 * 4
38
- }
39
- }
40
- return Math.ceil(chars / 4);
41
- }
42
- /**
43
- * Default context config
44
- */
45
- export const DEFAULT_CONTEXT_CONFIG = {
46
- rolling: {
47
- threshold: 50,
48
- buffer: 20,
49
- unit: 'messages',
50
- },
51
- limits: {
52
- maxCharacters: 500000,
53
- },
54
- cache: {
55
- enabled: true,
56
- points: 1,
57
- minTokens: 1024,
58
- preferUserMessages: true,
59
- },
60
- };
61
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwOH,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,EAAE;QACpB,iBAAiB,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,KAAK;QACpB,oBAAoB,EAAE,SAAS;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBAC/C,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QAC1B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,sDAAsD;YACtD,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,OAAO,EAAE;QACP,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,UAAU;KACjB;IACD,MAAM,EAAE;QACN,aAAa,EAAE,MAAM;KACtB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,IAAI;QACf,kBAAkB,EAAE,IAAI;KACzB;CACF,CAAC"}