conversationalist 0.0.9 → 0.0.11

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 (71) hide show
  1. package/README.md +148 -30
  2. package/dist/adapters/anthropic/index.d.ts.map +1 -1
  3. package/dist/adapters/anthropic/index.js +255 -2
  4. package/dist/adapters/anthropic/index.js.map +8 -4
  5. package/dist/adapters/gemini/index.d.ts.map +1 -1
  6. package/dist/adapters/gemini/index.js +255 -3
  7. package/dist/adapters/gemini/index.js.map +8 -4
  8. package/dist/adapters/openai/index.d.ts.map +1 -1
  9. package/dist/adapters/openai/index.js +247 -3
  10. package/dist/adapters/openai/index.js.map +8 -4
  11. package/dist/context.d.ts +6 -0
  12. package/dist/context.d.ts.map +1 -1
  13. package/dist/conversation/append.d.ts +5 -0
  14. package/dist/conversation/append.d.ts.map +1 -1
  15. package/dist/conversation/create.d.ts +9 -0
  16. package/dist/conversation/create.d.ts.map +1 -1
  17. package/dist/conversation/index.d.ts +8 -3
  18. package/dist/conversation/index.d.ts.map +1 -1
  19. package/dist/conversation/integrity.d.ts +16 -0
  20. package/dist/conversation/integrity.d.ts.map +1 -0
  21. package/dist/conversation/modify.d.ts +8 -2
  22. package/dist/conversation/modify.d.ts.map +1 -1
  23. package/dist/conversation/serialization.d.ts +0 -17
  24. package/dist/conversation/serialization.d.ts.map +1 -1
  25. package/dist/conversation/system-messages.d.ts.map +1 -1
  26. package/dist/conversation/tool-interactions.d.ts +45 -0
  27. package/dist/conversation/tool-interactions.d.ts.map +1 -0
  28. package/dist/conversation/transform.d.ts.map +1 -1
  29. package/dist/conversation/validation.d.ts +8 -0
  30. package/dist/conversation/validation.d.ts.map +1 -0
  31. package/dist/errors.d.ts +6 -1
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/export/index.js +249 -12
  34. package/dist/export/index.js.map +10 -6
  35. package/dist/guards.d.ts +13 -0
  36. package/dist/guards.d.ts.map +1 -0
  37. package/dist/history.d.ts +21 -8
  38. package/dist/history.d.ts.map +1 -1
  39. package/dist/index.d.ts +4 -3
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +2212 -259
  42. package/dist/index.js.map +26 -13
  43. package/dist/markdown/index.js +2169 -253
  44. package/dist/markdown/index.js.map +23 -12
  45. package/dist/schemas/index.d.ts +1 -1
  46. package/dist/schemas/index.d.ts.map +1 -1
  47. package/dist/schemas/index.js +38 -22
  48. package/dist/schemas/index.js.map +3 -3
  49. package/dist/schemas.d.ts +17 -37
  50. package/dist/schemas.d.ts.map +1 -1
  51. package/dist/streaming.d.ts.map +1 -1
  52. package/dist/types.d.ts +0 -4
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/utilities/index.d.ts +0 -1
  55. package/dist/utilities/index.d.ts.map +1 -1
  56. package/dist/utilities/markdown.d.ts.map +1 -1
  57. package/dist/utilities/tool-calls.d.ts +2 -6
  58. package/dist/utilities/tool-calls.d.ts.map +1 -1
  59. package/dist/utilities/tool-results.d.ts.map +1 -1
  60. package/dist/utilities/transient.d.ts.map +1 -1
  61. package/dist/utilities.d.ts +0 -1
  62. package/dist/utilities.d.ts.map +1 -1
  63. package/dist/versioning/index.d.ts +0 -1
  64. package/dist/versioning/index.d.ts.map +1 -1
  65. package/dist/versioning/index.js +1 -52
  66. package/dist/versioning/index.js.map +4 -5
  67. package/dist/with-conversation.d.ts +4 -1
  68. package/dist/with-conversation.d.ts.map +1 -1
  69. package/package.json +7 -4
  70. package/dist/conversation.d.ts +0 -109
  71. package/dist/conversation.d.ts.map +0 -1
@@ -1,3 +1,247 @@
1
+ // src/errors.ts
2
+ class ConversationalistError extends Error {
3
+ code;
4
+ context;
5
+ cause;
6
+ constructor(code, message, options) {
7
+ super(message);
8
+ this.name = "ConversationalistError";
9
+ this.code = code;
10
+ this.context = options?.context;
11
+ this.cause = options?.cause;
12
+ if (Error.captureStackTrace) {
13
+ Error.captureStackTrace(this, ConversationalistError);
14
+ }
15
+ }
16
+ toDetailedString() {
17
+ const parts = [`[${this.code}] ${this.message}`];
18
+ if (this.context && Object.keys(this.context).length > 0) {
19
+ parts.push(`Context: ${JSON.stringify(this.context, null, 2)}`);
20
+ }
21
+ if (this.cause) {
22
+ parts.push(`Caused by: ${this.cause.message}`);
23
+ }
24
+ return parts.join(`
25
+ `);
26
+ }
27
+ }
28
+ function createValidationError(message, context, cause) {
29
+ return new ConversationalistError("error:validation", message, { context, cause });
30
+ }
31
+ function createIntegrityError(message, context) {
32
+ return new ConversationalistError("error:integrity", message, { context });
33
+ }
34
+
35
+ // src/schemas.ts
36
+ import { z } from "zod";
37
+ var isPlainObject = (value) => {
38
+ if (!value || typeof value !== "object")
39
+ return false;
40
+ const prototype = Reflect.getPrototypeOf(value);
41
+ return prototype === Object.prototype || prototype === null;
42
+ };
43
+ function toMultiModalContent(value) {
44
+ const result = { type: value.type };
45
+ if (value.text !== undefined)
46
+ result.text = value.text;
47
+ if (value.url !== undefined)
48
+ result.url = value.url;
49
+ if (value.mimeType !== undefined)
50
+ result.mimeType = value.mimeType;
51
+ return result;
52
+ }
53
+ var jsonValueSchema = z.lazy(() => {
54
+ const jsonObjectSchema = z.preprocess((value, ctx) => {
55
+ if (!isPlainObject(value)) {
56
+ ctx.addIssue({
57
+ code: z.ZodIssueCode.custom,
58
+ message: "expected a plain object"
59
+ });
60
+ return z.NEVER;
61
+ }
62
+ return value;
63
+ }, z.record(z.string(), jsonValueSchema));
64
+ return z.union([
65
+ z.string(),
66
+ z.number().refine((value) => Number.isFinite(value), {
67
+ message: "expected a finite number"
68
+ }),
69
+ z.boolean(),
70
+ z.null(),
71
+ z.array(jsonValueSchema),
72
+ jsonObjectSchema
73
+ ]);
74
+ });
75
+ var multiModalContentSchema = z.discriminatedUnion("type", [
76
+ z.object({
77
+ type: z.literal("text"),
78
+ text: z.string()
79
+ }),
80
+ z.object({
81
+ type: z.literal("image"),
82
+ url: z.string().url(),
83
+ mimeType: z.string().optional(),
84
+ text: z.string().optional()
85
+ })
86
+ ]).transform(toMultiModalContent);
87
+ var messageRoleSchema = z.enum([
88
+ "user",
89
+ "assistant",
90
+ "system",
91
+ "developer",
92
+ "tool-use",
93
+ "tool-result",
94
+ "snapshot"
95
+ ]);
96
+ var toolCallSchema = z.object({
97
+ id: z.string(),
98
+ name: z.string(),
99
+ arguments: jsonValueSchema
100
+ }).strict();
101
+ var toolResultSchema = z.object({
102
+ callId: z.string(),
103
+ outcome: z.enum(["success", "error"]),
104
+ content: jsonValueSchema
105
+ }).strict();
106
+ var tokenUsageSchema = z.object({
107
+ prompt: z.number().int().min(0),
108
+ completion: z.number().int().min(0),
109
+ total: z.number().int().min(0)
110
+ });
111
+ var messageInputSchema = z.object({
112
+ role: messageRoleSchema,
113
+ content: z.union([z.string(), z.array(multiModalContentSchema)]),
114
+ metadata: z.record(z.string(), jsonValueSchema).optional(),
115
+ hidden: z.boolean().optional(),
116
+ toolCall: toolCallSchema.optional(),
117
+ toolResult: toolResultSchema.optional(),
118
+ tokenUsage: tokenUsageSchema.optional(),
119
+ goalCompleted: z.boolean().optional()
120
+ }).strict();
121
+ var messageSchema = z.object({
122
+ id: z.string(),
123
+ role: messageRoleSchema,
124
+ content: z.union([z.string(), z.array(multiModalContentSchema)]),
125
+ position: z.number().int().min(0),
126
+ createdAt: z.string(),
127
+ metadata: z.record(z.string(), jsonValueSchema),
128
+ hidden: z.boolean(),
129
+ toolCall: toolCallSchema.optional(),
130
+ toolResult: toolResultSchema.optional(),
131
+ tokenUsage: tokenUsageSchema.optional(),
132
+ goalCompleted: z.boolean().optional()
133
+ }).strict();
134
+ var conversationStatusSchema = z.enum([
135
+ "active",
136
+ "archived",
137
+ "deleted"
138
+ ]);
139
+ var conversationShape = {
140
+ schemaVersion: z.number().int().min(1),
141
+ id: z.string(),
142
+ title: z.string().optional(),
143
+ status: conversationStatusSchema,
144
+ metadata: z.record(z.string(), jsonValueSchema),
145
+ ids: z.array(z.string()),
146
+ messages: z.record(z.string(), messageSchema),
147
+ createdAt: z.string(),
148
+ updatedAt: z.string()
149
+ };
150
+ var conversationSchema = z.object(conversationShape).strict();
151
+
152
+ // src/conversation/integrity.ts
153
+ function validateConversationIntegrity(conversation) {
154
+ const issues = [];
155
+ const seenIds = new Set;
156
+ conversation.ids.forEach((id, index) => {
157
+ if (seenIds.has(id)) {
158
+ issues.push({
159
+ code: "integrity:duplicate-message-id",
160
+ message: `duplicate message id in ids: ${id}`,
161
+ data: { id, position: index }
162
+ });
163
+ } else {
164
+ seenIds.add(id);
165
+ }
166
+ if (!conversation.messages[id]) {
167
+ issues.push({
168
+ code: "integrity:missing-message",
169
+ message: `missing message for id ${id}`,
170
+ data: { id, position: index }
171
+ });
172
+ }
173
+ });
174
+ for (const id of Object.keys(conversation.messages)) {
175
+ if (!seenIds.has(id)) {
176
+ issues.push({
177
+ code: "integrity:unlisted-message",
178
+ message: `message ${id} is not listed in ids`,
179
+ data: { id }
180
+ });
181
+ }
182
+ }
183
+ const toolUses = new Map;
184
+ conversation.ids.forEach((id, index) => {
185
+ const message = conversation.messages[id];
186
+ if (!message)
187
+ return;
188
+ if (message.role === "tool-use" && message.toolCall) {
189
+ if (toolUses.has(message.toolCall.id)) {
190
+ issues.push({
191
+ code: "integrity:duplicate-tool-call",
192
+ message: `duplicate toolCall.id ${message.toolCall.id}`,
193
+ data: { toolCallId: message.toolCall.id, messageId: message.id }
194
+ });
195
+ } else {
196
+ toolUses.set(message.toolCall.id, { position: index, messageId: message.id });
197
+ }
198
+ }
199
+ });
200
+ conversation.ids.forEach((id, index) => {
201
+ const message = conversation.messages[id];
202
+ if (!message)
203
+ return;
204
+ if (message.role === "tool-result" && message.toolResult) {
205
+ const toolUse = toolUses.get(message.toolResult.callId);
206
+ if (!toolUse) {
207
+ issues.push({
208
+ code: "integrity:orphan-tool-result",
209
+ message: `tool-result references missing tool-use ${message.toolResult.callId}`,
210
+ data: { callId: message.toolResult.callId, messageId: message.id }
211
+ });
212
+ } else if (toolUse.position >= index) {
213
+ issues.push({
214
+ code: "integrity:tool-result-before-call",
215
+ message: `tool-result ${message.toolResult.callId} occurs before tool-use`,
216
+ data: {
217
+ callId: message.toolResult.callId,
218
+ messageId: message.id,
219
+ toolUseMessageId: toolUse.messageId
220
+ }
221
+ });
222
+ }
223
+ }
224
+ });
225
+ return issues;
226
+ }
227
+ function assertConversationIntegrity(conversation) {
228
+ const issues = validateConversationIntegrity(conversation);
229
+ if (issues.length === 0)
230
+ return;
231
+ throw createIntegrityError("conversation integrity check failed", { issues });
232
+ }
233
+
234
+ // src/conversation/validation.ts
235
+ function assertConversationSafe(conversation) {
236
+ const parsed = conversationSchema.safeParse(conversation);
237
+ if (!parsed.success) {
238
+ throw createValidationError("conversation failed schema validation", {
239
+ issues: parsed.error.issues
240
+ });
241
+ }
242
+ assertConversationIntegrity(conversation);
243
+ }
244
+
1
245
  // src/utilities/message-store.ts
2
246
  function getOrderedMessages(conversation) {
3
247
  const ordered = [];
@@ -89,8 +333,6 @@ function convertMessage(message) {
89
333
  };
90
334
  case "snapshot":
91
335
  return null;
92
- default:
93
- return null;
94
336
  }
95
337
  }
96
338
  function stringifyToolResult(result) {
@@ -100,6 +342,7 @@ function stringifyToolResult(result) {
100
342
  return JSON.stringify(result.content);
101
343
  }
102
344
  function toOpenAIMessages(conversation) {
345
+ assertConversationSafe(conversation);
103
346
  const messages = [];
104
347
  for (const message of getOrderedMessages(conversation)) {
105
348
  const converted = convertMessage(message);
@@ -110,6 +353,7 @@ function toOpenAIMessages(conversation) {
110
353
  return messages;
111
354
  }
112
355
  function toOpenAIMessagesGrouped(conversation) {
356
+ assertConversationSafe(conversation);
113
357
  const messages = [];
114
358
  let pendingToolCalls = [];
115
359
  for (const message of getOrderedMessages(conversation)) {
@@ -146,4 +390,4 @@ export {
146
390
  toOpenAIMessages
147
391
  };
148
392
 
149
- //# debugId=76C027000C92020164756E2164756E21
393
+ //# debugId=C82D4C1485D7420464756E2164756E21
@@ -1,11 +1,15 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/utilities/message-store.ts", "../../../src/adapters/openai/index.ts"],
3
+ "sources": ["../../../src/errors.ts", "../../../src/schemas.ts", "../../../src/conversation/integrity.ts", "../../../src/conversation/validation.ts", "../../../src/utilities/message-store.ts", "../../../src/adapters/openai/index.ts"],
4
4
  "sourcesContent": [
5
+ "/**\n * Error codes for Conversationalist errors (kebab-case with `error:` prefix).\n */\nexport type ConversationalistErrorCode =\n | 'error:locked'\n | 'error:invalid-input'\n | 'error:invalid-position'\n | 'error:invalid-tool-reference'\n | 'error:duplicate-id'\n | 'error:not-found'\n | 'error:serialization'\n | 'error:validation'\n | 'error:integrity';\n\n/**\n * Base error class for all Conversationalist errors.\n *\n * Provides structured error information with error codes, context data,\n * and cause chains for better debugging.\n */\nexport class ConversationalistError extends Error {\n /** Structured error code */\n readonly code: ConversationalistErrorCode;\n\n /** Additional context data */\n readonly context?: Record<string, unknown> | undefined;\n\n /** Underlying cause (if any) */\n override readonly cause?: Error | undefined;\n\n constructor(\n code: ConversationalistErrorCode,\n message: string,\n options?: {\n context?: Record<string, unknown> | undefined;\n cause?: Error | undefined;\n },\n ) {\n super(message);\n this.name = 'ConversationalistError';\n this.code = code;\n this.context = options?.context;\n this.cause = options?.cause;\n\n // Maintain proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ConversationalistError);\n }\n }\n\n /**\n * Formats the error as a detailed string with code and context.\n */\n toDetailedString(): string {\n const parts = [`[${this.code}] ${this.message}`];\n\n if (this.context && Object.keys(this.context).length > 0) {\n parts.push(`Context: ${JSON.stringify(this.context, null, 2)}`);\n }\n\n if (this.cause) {\n parts.push(`Caused by: ${this.cause.message}`);\n }\n\n return parts.join('\\n');\n }\n}\n\n/**\n * Creates a lock error (ERR_LOCKED).\n * Thrown when a conversation is already being modified.\n */\nexport function createLockedError(conversationId: string): ConversationalistError {\n return new ConversationalistError(\n 'error:locked',\n `conversation ${conversationId} is locked (concurrent modification detected)`,\n { context: { conversationId } },\n );\n}\n\n/**\n * Creates an invalid input error (ERR_INVALID_INPUT).\n * Thrown when message input data is invalid.\n */\nexport function createInvalidInputError(\n message: string,\n context?: Record<string, unknown>,\n): ConversationalistError {\n return new ConversationalistError('error:invalid-input', message, { context });\n}\n\n/**\n * Creates an invalid position error (ERR_INVALID_POSITION).\n * Thrown when positions are non-contiguous or invalid.\n */\nexport function createInvalidPositionError(\n expected: number,\n actual: number,\n): ConversationalistError {\n return new ConversationalistError(\n 'error:invalid-position',\n `invalid position: expected ${expected}, got ${actual}`,\n { context: { expected, actual } },\n );\n}\n\n/**\n * Creates an invalid tool reference error (ERR_INVALID_TOOL_REFERENCE).\n * Thrown when a tool result references a non-existent tool-use message.\n */\nexport function createInvalidToolReferenceError(callId: string): ConversationalistError {\n return new ConversationalistError(\n 'error:invalid-tool-reference',\n `tool result references non-existent tool-use: ${callId}`,\n { context: { callId } },\n );\n}\n\n/**\n * Creates a duplicate ID error (ERR_DUPLICATE_ID).\n * Thrown when a conversation with the given ID already exists.\n */\nexport function createDuplicateIdError(id: string): ConversationalistError {\n return new ConversationalistError(\n 'error:duplicate-id',\n `conversation with id ${id} already exists`,\n { context: { id } },\n );\n}\n\n/**\n * Creates a not found error (ERR_NOT_FOUND).\n * Thrown when a conversation cannot be found.\n */\nexport function createNotFoundError(id: string): ConversationalistError {\n return new ConversationalistError(\n 'error:not-found',\n `conversation with id ${id} not found`,\n {\n context: { id },\n },\n );\n}\n\n/**\n * Creates a serialization error (ERR_SERIALIZATION).\n * Thrown when JSON serialization/deserialization fails.\n */\nexport function createSerializationError(\n message: string,\n cause?: Error,\n): ConversationalistError {\n return new ConversationalistError('error:serialization', message, { cause });\n}\n\n/**\n * Creates a validation error (ERR_VALIDATION).\n * Thrown when data validation fails (e.g., Zod schema validation).\n */\nexport function createValidationError(\n message: string,\n context?: Record<string, unknown>,\n cause?: Error,\n): ConversationalistError {\n return new ConversationalistError('error:validation', message, { context, cause });\n}\n\n/**\n * Creates an integrity error (ERR_INTEGRITY).\n * Thrown when conversation invariants are violated.\n */\nexport function createIntegrityError(\n message: string,\n context?: Record<string, unknown>,\n): ConversationalistError {\n return new ConversationalistError('error:integrity', message, { context });\n}\n",
6
+ "import type { MultiModalContent } from '@lasercat/homogenaize';\nimport { z } from 'zod';\n\nimport type {\n Conversation,\n ConversationStatus,\n JSONValue,\n Message,\n MessageInput,\n MessageRole,\n TokenUsage,\n ToolCall,\n ToolResult,\n} from './types';\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (!value || typeof value !== 'object') return false;\n const prototype = Reflect.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\ntype RawMultiModalContent = {\n type: 'text' | 'image';\n text?: string | undefined;\n url?: string | undefined;\n mimeType?: string | undefined;\n};\n\nfunction toMultiModalContent(value: RawMultiModalContent): MultiModalContent {\n const result: MultiModalContent = { type: value.type };\n if (value.text !== undefined) result.text = value.text;\n if (value.url !== undefined) result.url = value.url;\n if (value.mimeType !== undefined) result.mimeType = value.mimeType;\n return result;\n}\n\n/**\n * Zod schema for JSON-serializable values.\n */\nexport const jsonValueSchema: z.ZodType<JSONValue> = z.lazy(() => {\n const jsonObjectSchema = z.preprocess(\n (value, ctx) => {\n if (!isPlainObject(value)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'expected a plain object',\n });\n return z.NEVER;\n }\n return value;\n },\n z.record(z.string(), jsonValueSchema),\n );\n\n return z.union([\n z.string(),\n z.number().refine((value) => Number.isFinite(value), {\n message: 'expected a finite number',\n }),\n z.boolean(),\n z.null(),\n z.array(jsonValueSchema),\n jsonObjectSchema,\n ]);\n}) satisfies z.ZodType<JSONValue>;\n\n/**\n * Zod schema for multi-modal content parts (text or image).\n */\nexport const multiModalContentSchema = z\n .discriminatedUnion('type', [\n z.object({\n type: z.literal('text'),\n text: z.string(),\n }),\n z.object({\n type: z.literal('image'),\n url: z.string().url(),\n mimeType: z.string().optional(),\n text: z.string().optional(),\n }),\n ])\n .transform(toMultiModalContent) satisfies z.ZodType<MultiModalContent>;\n\n/**\n * Zod schema for valid message roles.\n */\nexport const messageRoleSchema = z.enum([\n 'user',\n 'assistant',\n 'system',\n 'developer',\n 'tool-use',\n 'tool-result',\n 'snapshot',\n]) satisfies z.ZodType<MessageRole>;\n\n/**\n * Zod schema for tool call metadata.\n */\nexport const toolCallSchema = z\n .object({\n id: z.string(),\n name: z.string(),\n arguments: jsonValueSchema,\n })\n .strict() satisfies z.ZodType<ToolCall>;\n\n/**\n * Zod schema for tool result metadata.\n */\nexport const toolResultSchema = z\n .object({\n callId: z.string(),\n outcome: z.enum(['success', 'error']),\n content: jsonValueSchema,\n })\n .strict() satisfies z.ZodType<ToolResult>;\n\n/**\n * Zod schema for token usage accounting.\n */\nexport const tokenUsageSchema = z.object({\n prompt: z.number().int().min(0),\n completion: z.number().int().min(0),\n total: z.number().int().min(0),\n}) satisfies z.ZodType<TokenUsage>;\n\n/**\n * Zod schema for message input payloads.\n */\nexport const messageInputSchema = z\n .object({\n role: messageRoleSchema,\n content: z.union([z.string(), z.array(multiModalContentSchema)]),\n metadata: z.record(z.string(), jsonValueSchema).optional(),\n hidden: z.boolean().optional(),\n toolCall: toolCallSchema.optional(),\n toolResult: toolResultSchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n goalCompleted: z.boolean().optional(),\n })\n .strict() satisfies z.ZodType<MessageInput>;\n\n/**\n * Zod schema for messages.\n */\nexport const messageSchema = z\n .object({\n id: z.string(),\n role: messageRoleSchema,\n content: z.union([z.string(), z.array(multiModalContentSchema)]),\n position: z.number().int().min(0),\n createdAt: z.string(),\n metadata: z.record(z.string(), jsonValueSchema),\n hidden: z.boolean(),\n toolCall: toolCallSchema.optional(),\n toolResult: toolResultSchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n goalCompleted: z.boolean().optional(),\n })\n .strict() satisfies z.ZodType<Message>;\n\n/**\n * Zod schema for conversation status values.\n */\nexport const conversationStatusSchema = z.enum([\n 'active',\n 'archived',\n 'deleted',\n]) satisfies z.ZodType<ConversationStatus>;\n\n/**\n * Raw conversation shape for storage systems that need direct access to fields.\n */\nexport const conversationShape = {\n schemaVersion: z.number().int().min(1),\n id: z.string(),\n title: z.string().optional(),\n status: conversationStatusSchema,\n metadata: z.record(z.string(), jsonValueSchema),\n ids: z.array(z.string()),\n messages: z.record(z.string(), messageSchema),\n createdAt: z.string(),\n updatedAt: z.string(),\n} as const;\n\n/**\n * Zod schema for serialized conversations.\n */\nexport const conversationSchema = z\n .object(conversationShape)\n .strict() satisfies z.ZodType<Conversation>;\n",
7
+ "import { createIntegrityError } from '../errors';\nimport type { Conversation } from '../types';\n\nexport type IntegrityIssueCode =\n | 'integrity:missing-message'\n | 'integrity:unlisted-message'\n | 'integrity:duplicate-message-id'\n | 'integrity:orphan-tool-result'\n | 'integrity:tool-result-before-call'\n | 'integrity:duplicate-tool-call';\n\nexport interface IntegrityIssue {\n code: IntegrityIssueCode;\n message: string;\n data?: Record<string, unknown> | undefined;\n}\n\n/**\n * Validates conversation invariants and returns a list of issues.\n */\nexport function validateConversationIntegrity(\n conversation: Conversation,\n): IntegrityIssue[] {\n const issues: IntegrityIssue[] = [];\n const seenIds = new Set<string>();\n\n conversation.ids.forEach((id, index) => {\n if (seenIds.has(id)) {\n issues.push({\n code: 'integrity:duplicate-message-id',\n message: `duplicate message id in ids: ${id}`,\n data: { id, position: index },\n });\n } else {\n seenIds.add(id);\n }\n\n if (!conversation.messages[id]) {\n issues.push({\n code: 'integrity:missing-message',\n message: `missing message for id ${id}`,\n data: { id, position: index },\n });\n }\n });\n\n for (const id of Object.keys(conversation.messages)) {\n if (!seenIds.has(id)) {\n issues.push({\n code: 'integrity:unlisted-message',\n message: `message ${id} is not listed in ids`,\n data: { id },\n });\n }\n }\n\n const toolUses = new Map<string, { position: number; messageId: string }>();\n\n conversation.ids.forEach((id, index) => {\n const message = conversation.messages[id];\n if (!message) return;\n\n if (message.role === 'tool-use' && message.toolCall) {\n if (toolUses.has(message.toolCall.id)) {\n issues.push({\n code: 'integrity:duplicate-tool-call',\n message: `duplicate toolCall.id ${message.toolCall.id}`,\n data: { toolCallId: message.toolCall.id, messageId: message.id },\n });\n } else {\n toolUses.set(message.toolCall.id, { position: index, messageId: message.id });\n }\n }\n });\n\n conversation.ids.forEach((id, index) => {\n const message = conversation.messages[id];\n if (!message) return;\n\n if (message.role === 'tool-result' && message.toolResult) {\n const toolUse = toolUses.get(message.toolResult.callId);\n if (!toolUse) {\n issues.push({\n code: 'integrity:orphan-tool-result',\n message: `tool-result references missing tool-use ${message.toolResult.callId}`,\n data: { callId: message.toolResult.callId, messageId: message.id },\n });\n } else if (toolUse.position >= index) {\n issues.push({\n code: 'integrity:tool-result-before-call',\n message: `tool-result ${message.toolResult.callId} occurs before tool-use`,\n data: {\n callId: message.toolResult.callId,\n messageId: message.id,\n toolUseMessageId: toolUse.messageId,\n },\n });\n }\n }\n });\n\n return issues;\n}\n\n/**\n * Throws an integrity error if the conversation fails validation.\n */\nexport function assertConversationIntegrity(conversation: Conversation): void {\n const issues = validateConversationIntegrity(conversation);\n if (issues.length === 0) return;\n\n throw createIntegrityError('conversation integrity check failed', { issues });\n}\n",
8
+ "import { createValidationError } from '../errors';\nimport { conversationSchema } from '../schemas';\nimport type { Conversation } from '../types';\nimport { assertConversationIntegrity } from './integrity';\n\n/**\n * Ensures a conversation conforms to the schema (JSON-safe) and integrity rules.\n * Internal helper for public API enforcement points.\n */\nexport function assertConversationSafe(conversation: Conversation): void {\n const parsed = conversationSchema.safeParse(conversation);\n if (!parsed.success) {\n throw createValidationError('conversation failed schema validation', {\n issues: parsed.error.issues,\n });\n }\n\n assertConversationIntegrity(conversation);\n}\n\nexport function ensureConversationSafe(conversation: Conversation): Conversation {\n assertConversationSafe(conversation);\n return conversation;\n}\n",
5
9
  "import type { Conversation, Message } from '../types';\n\nexport function getOrderedMessages(conversation: Conversation): Message[] {\n const ordered: Message[] = [];\n for (const id of conversation.ids) {\n const message = conversation.messages[id];\n if (message) {\n ordered.push(message);\n }\n }\n return ordered;\n}\n\nexport function toIdRecord<T extends { id: string }>(\n items: readonly T[],\n): Record<string, T> {\n const record: Record<string, T> = {};\n for (const item of items) {\n record[item.id] = item;\n }\n return record;\n}\n",
6
- "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport type { Conversation, Message, ToolCall, ToolResult } from '../../types';\nimport { getOrderedMessages } from '../../utilities/message-store';\n\n/**\n * OpenAI text content part.\n */\nexport interface OpenAITextContentPart {\n type: 'text';\n text: string;\n}\n\n/**\n * OpenAI image content part.\n */\nexport interface OpenAIImageContentPart {\n type: 'image_url';\n image_url: {\n url: string;\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\n/**\n * OpenAI content part union type.\n */\nexport type OpenAIContentPart = OpenAITextContentPart | OpenAIImageContentPart;\n\n/**\n * OpenAI tool call format.\n */\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * OpenAI system message format for the Chat Completions API.\n */\nexport interface OpenAISystemMessage {\n role: 'system';\n content: string | OpenAITextContentPart[];\n name?: string;\n}\n\n/**\n * OpenAI user message format for the Chat Completions API.\n */\nexport interface OpenAIUserMessage {\n role: 'user';\n content: string | OpenAIContentPart[];\n name?: string;\n}\n\n/**\n * OpenAI assistant message format for the Chat Completions API.\n */\nexport interface OpenAIAssistantMessage {\n role: 'assistant';\n content: string | OpenAITextContentPart[] | null;\n name?: string;\n tool_calls?: OpenAIToolCall[];\n}\n\n/**\n * OpenAI tool message format for the Chat Completions API.\n */\nexport interface OpenAIToolMessage {\n role: 'tool';\n content: string | OpenAITextContentPart[];\n tool_call_id: string;\n}\n\n/**\n * OpenAI message format for the Chat Completions API.\n */\nexport type OpenAIMessage =\n | OpenAISystemMessage\n | OpenAIUserMessage\n | OpenAIAssistantMessage\n | OpenAIToolMessage;\n\n/**\n * Converts internal multi-modal content to OpenAI content parts format.\n */\nfunction toOpenAIContent(\n content: string | ReadonlyArray<MultiModalContent>,\n options: { allowImages: false },\n): string | OpenAITextContentPart[];\nfunction toOpenAIContent(\n content: string | ReadonlyArray<MultiModalContent>,\n options?: { allowImages?: true },\n): string | OpenAIContentPart[];\nfunction toOpenAIContent(\n content: string | ReadonlyArray<MultiModalContent>,\n options: { allowImages?: boolean } = {},\n): string | OpenAIContentPart[] | OpenAITextContentPart[] {\n if (typeof content === 'string') {\n return content;\n }\n\n const allowImages = options.allowImages ?? true;\n const parts: OpenAIContentPart[] = [];\n for (const part of content) {\n if (part.type === 'text') {\n parts.push({ type: 'text', text: part.text ?? '' });\n } else if (part.type === 'image' && allowImages) {\n parts.push({\n type: 'image_url',\n image_url: { url: part.url ?? '' },\n });\n }\n }\n\n if (parts.length === 0) {\n return '';\n }\n\n if (parts.length === 1 && parts[0]?.type === 'text') {\n return parts[0].text;\n }\n\n return allowImages ? parts : (parts as OpenAITextContentPart[]);\n}\n\n/**\n * Converts internal multi-modal content to OpenAI text-only format.\n */\nfunction toOpenAITextContent(\n content: string | ReadonlyArray<MultiModalContent>,\n): string | OpenAITextContentPart[] {\n return toOpenAIContent(content, { allowImages: false });\n}\n\n/**\n * Converts an internal ToolCall to OpenAI format.\n */\nfunction toOpenAIToolCall(toolCall: ToolCall): OpenAIToolCall {\n return {\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments:\n typeof toolCall.arguments === 'string'\n ? toolCall.arguments\n : JSON.stringify(toolCall.arguments),\n },\n };\n}\n\n/**\n * Converts a single message to OpenAI format.\n * Returns null for messages that should be skipped.\n */\nfunction convertMessage(message: Message): OpenAIMessage | null {\n // Skip hidden messages\n if (message.hidden) {\n return null;\n }\n\n switch (message.role) {\n case 'system':\n case 'developer':\n return {\n role: 'system',\n content: toOpenAITextContent(message.content),\n };\n\n case 'user':\n return {\n role: 'user',\n content: toOpenAIContent(message.content),\n };\n\n case 'assistant':\n return {\n role: 'assistant',\n content: toOpenAITextContent(message.content),\n };\n\n case 'tool-use':\n if (!message.toolCall) {\n return null;\n }\n return {\n role: 'assistant',\n content: null,\n tool_calls: [toOpenAIToolCall(message.toolCall)],\n };\n\n case 'tool-result':\n if (!message.toolResult) {\n return null;\n }\n return {\n role: 'tool',\n content: stringifyToolResult(message.toolResult),\n tool_call_id: message.toolResult.callId,\n };\n\n case 'snapshot':\n // Snapshots are internal state, not sent to API\n return null;\n\n default:\n return null;\n }\n}\n\n/**\n * Converts a tool result to a string for OpenAI.\n */\nfunction stringifyToolResult(result: ToolResult): string {\n if (typeof result.content === 'string') {\n return result.content;\n }\n return JSON.stringify(result.content);\n}\n\n/**\n * Converts a conversation to OpenAI Chat Completions API message format.\n * Handles role mapping, tool calls, and multi-modal content.\n *\n * @example\n * ```ts\n * import { toOpenAIMessages } from 'conversationalist/openai';\n *\n * const messages = toOpenAIMessages(conversation);\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4',\n * messages,\n * });\n * ```\n */\nexport function toOpenAIMessages(conversation: Conversation): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n\n for (const message of getOrderedMessages(conversation)) {\n const converted = convertMessage(message);\n if (converted) {\n messages.push(converted);\n }\n }\n\n return messages;\n}\n\n/**\n * Groups consecutive tool-use messages into a single assistant message with multiple tool_calls.\n * This is useful when the model made multiple tool calls in sequence.\n */\nexport function toOpenAIMessagesGrouped(conversation: Conversation): OpenAIMessage[] {\n const messages: OpenAIMessage[] = [];\n let pendingToolCalls: OpenAIToolCall[] = [];\n\n for (const message of getOrderedMessages(conversation)) {\n if (message.hidden) continue;\n\n if (message.role === 'tool-use' && message.toolCall) {\n pendingToolCalls.push(toOpenAIToolCall(message.toolCall));\n continue;\n }\n\n // Flush pending tool calls before adding a new message\n if (pendingToolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: null,\n tool_calls: pendingToolCalls,\n });\n pendingToolCalls = [];\n }\n\n const converted = convertMessage(message);\n if (converted && message.role !== 'tool-use') {\n messages.push(converted);\n }\n }\n\n // Flush any remaining tool calls\n if (pendingToolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: null,\n tool_calls: pendingToolCalls,\n });\n }\n\n return messages;\n}\n"
10
+ "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport { assertConversationSafe } from '../../conversation/validation';\nimport type { Conversation, Message, ToolCall, ToolResult } from '../../types';\nimport { getOrderedMessages } from '../../utilities/message-store';\n\n/**\n * OpenAI text content part.\n */\nexport interface OpenAITextContentPart {\n type: 'text';\n text: string;\n}\n\n/**\n * OpenAI image content part.\n */\nexport interface OpenAIImageContentPart {\n type: 'image_url';\n image_url: {\n url: string;\n detail?: 'auto' | 'low' | 'high';\n };\n}\n\n/**\n * OpenAI content part union type.\n */\nexport type OpenAIContentPart = OpenAITextContentPart | OpenAIImageContentPart;\n\n/**\n * OpenAI tool call format.\n */\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * OpenAI system message format for the Chat Completions API.\n */\nexport interface OpenAISystemMessage {\n role: 'system';\n content: string | OpenAITextContentPart[];\n name?: string;\n}\n\n/**\n * OpenAI user message format for the Chat Completions API.\n */\nexport interface OpenAIUserMessage {\n role: 'user';\n content: string | OpenAIContentPart[];\n name?: string;\n}\n\n/**\n * OpenAI assistant message format for the Chat Completions API.\n */\nexport interface OpenAIAssistantMessage {\n role: 'assistant';\n content: string | OpenAITextContentPart[] | null;\n name?: string;\n tool_calls?: OpenAIToolCall[];\n}\n\n/**\n * OpenAI tool message format for the Chat Completions API.\n */\nexport interface OpenAIToolMessage {\n role: 'tool';\n content: string | OpenAITextContentPart[];\n tool_call_id: string;\n}\n\n/**\n * OpenAI message format for the Chat Completions API.\n */\nexport type OpenAIMessage =\n | OpenAISystemMessage\n | OpenAIUserMessage\n | OpenAIAssistantMessage\n | OpenAIToolMessage;\n\n/**\n * Converts internal multi-modal content to OpenAI content parts format.\n */\nfunction toOpenAIContent(\n content: string | ReadonlyArray<MultiModalContent>,\n options: { allowImages: false },\n): string | OpenAITextContentPart[];\nfunction toOpenAIContent(\n content: string | ReadonlyArray<MultiModalContent>,\n options?: { allowImages?: true },\n): string | OpenAIContentPart[];\nfunction toOpenAIContent(\n content: string | ReadonlyArray<MultiModalContent>,\n options: { allowImages?: boolean } = {},\n): string | OpenAIContentPart[] | OpenAITextContentPart[] {\n if (typeof content === 'string') {\n return content;\n }\n\n const allowImages = options.allowImages ?? true;\n const parts: OpenAIContentPart[] = [];\n for (const part of content) {\n if (part.type === 'text') {\n parts.push({ type: 'text', text: part.text ?? '' });\n } else if (part.type === 'image' && allowImages) {\n parts.push({\n type: 'image_url',\n image_url: { url: part.url ?? '' },\n });\n }\n }\n\n if (parts.length === 0) {\n return '';\n }\n\n if (parts.length === 1 && parts[0]?.type === 'text') {\n return parts[0].text;\n }\n\n return allowImages ? parts : (parts as OpenAITextContentPart[]);\n}\n\n/**\n * Converts internal multi-modal content to OpenAI text-only format.\n */\nfunction toOpenAITextContent(\n content: string | ReadonlyArray<MultiModalContent>,\n): string | OpenAITextContentPart[] {\n return toOpenAIContent(content, { allowImages: false });\n}\n\n/**\n * Converts an internal ToolCall to OpenAI format.\n */\nfunction toOpenAIToolCall(toolCall: ToolCall): OpenAIToolCall {\n return {\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments:\n typeof toolCall.arguments === 'string'\n ? toolCall.arguments\n : JSON.stringify(toolCall.arguments),\n },\n };\n}\n\n/**\n * Converts a single message to OpenAI format.\n * Returns null for messages that should be skipped.\n */\nfunction convertMessage(message: Message): OpenAIMessage | null {\n // Skip hidden messages\n if (message.hidden) {\n return null;\n }\n\n switch (message.role) {\n case 'system':\n case 'developer':\n return {\n role: 'system',\n content: toOpenAITextContent(message.content),\n };\n\n case 'user':\n return {\n role: 'user',\n content: toOpenAIContent(message.content),\n };\n\n case 'assistant':\n return {\n role: 'assistant',\n content: toOpenAITextContent(message.content),\n };\n\n case 'tool-use':\n if (!message.toolCall) {\n return null;\n }\n return {\n role: 'assistant',\n content: null,\n tool_calls: [toOpenAIToolCall(message.toolCall)],\n };\n\n case 'tool-result':\n if (!message.toolResult) {\n return null;\n }\n return {\n role: 'tool',\n content: stringifyToolResult(message.toolResult),\n tool_call_id: message.toolResult.callId,\n };\n\n case 'snapshot':\n // Snapshots are internal state, not sent to API\n return null;\n }\n}\n\n/**\n * Converts a tool result to a string for OpenAI.\n */\nfunction stringifyToolResult(result: ToolResult): string {\n if (typeof result.content === 'string') {\n return result.content;\n }\n return JSON.stringify(result.content);\n}\n\n/**\n * Converts a conversation to OpenAI Chat Completions API message format.\n * Handles role mapping, tool calls, and multi-modal content.\n *\n * @example\n * ```ts\n * import { toOpenAIMessages } from 'conversationalist/openai';\n *\n * const messages = toOpenAIMessages(conversation);\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4',\n * messages,\n * });\n * ```\n */\nexport function toOpenAIMessages(conversation: Conversation): OpenAIMessage[] {\n assertConversationSafe(conversation);\n const messages: OpenAIMessage[] = [];\n\n for (const message of getOrderedMessages(conversation)) {\n const converted = convertMessage(message);\n if (converted) {\n messages.push(converted);\n }\n }\n\n return messages;\n}\n\n/**\n * Groups consecutive tool-use messages into a single assistant message with multiple tool_calls.\n * This is useful when the model made multiple tool calls in sequence.\n */\nexport function toOpenAIMessagesGrouped(conversation: Conversation): OpenAIMessage[] {\n assertConversationSafe(conversation);\n const messages: OpenAIMessage[] = [];\n let pendingToolCalls: OpenAIToolCall[] = [];\n\n for (const message of getOrderedMessages(conversation)) {\n if (message.hidden) continue;\n\n if (message.role === 'tool-use' && message.toolCall) {\n pendingToolCalls.push(toOpenAIToolCall(message.toolCall));\n continue;\n }\n\n // Flush pending tool calls before adding a new message\n if (pendingToolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: null,\n tool_calls: pendingToolCalls,\n });\n pendingToolCalls = [];\n }\n\n const converted = convertMessage(message);\n if (converted && message.role !== 'tool-use') {\n messages.push(converted);\n }\n }\n\n // Flush any remaining tool calls\n if (pendingToolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: null,\n tool_calls: pendingToolCalls,\n });\n }\n\n return messages;\n}\n"
7
11
  ],
8
- "mappings": ";AAEO,SAAS,kBAAkB,CAAC,cAAuC;AAAA,EACxE,MAAM,UAAqB,CAAC;AAAA,EAC5B,WAAW,MAAM,aAAa,KAAK;AAAA,IACjC,MAAM,UAAU,aAAa,SAAS;AAAA,IACtC,IAAI,SAAS;AAAA,MACX,QAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;ACwFT,SAAS,eAAe,CACtB,SACA,UAAqC,CAAC,GACkB;AAAA,EACxD,IAAI,OAAO,YAAY,UAAU;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,QAAQ,eAAe;AAAA,EAC3C,MAAM,QAA6B,CAAC;AAAA,EACpC,WAAW,QAAQ,SAAS;AAAA,IAC1B,IAAI,KAAK,SAAS,QAAQ;AAAA,MACxB,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,QAAQ,GAAG,CAAC;AAAA,IACpD,EAAO,SAAI,KAAK,SAAS,WAAW,aAAa;AAAA,MAC/C,MAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,WAAW,EAAE,KAAK,KAAK,OAAO,GAAG;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,WAAW,KAAK,MAAM,IAAI,SAAS,QAAQ;AAAA,IACnD,OAAO,MAAM,GAAG;AAAA,EAClB;AAAA,EAEA,OAAO,cAAc,QAAS;AAAA;AAMhC,SAAS,mBAAmB,CAC1B,SACkC;AAAA,EAClC,OAAO,gBAAgB,SAAS,EAAE,aAAa,MAAM,CAAC;AAAA;AAMxD,SAAS,gBAAgB,CAAC,UAAoC;AAAA,EAC5D,OAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,SAAS;AAAA,MACf,WACE,OAAO,SAAS,cAAc,WAC1B,SAAS,YACT,KAAK,UAAU,SAAS,SAAS;AAAA,IACzC;AAAA,EACF;AAAA;AAOF,SAAS,cAAc,CAAC,SAAwC;AAAA,EAE9D,IAAI,QAAQ,QAAQ;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAQ;AAAA,SACT;AAAA,SACA;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,oBAAoB,QAAQ,OAAO;AAAA,MAC9C;AAAA,SAEG;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,gBAAgB,QAAQ,OAAO;AAAA,MAC1C;AAAA,SAEG;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,oBAAoB,QAAQ,OAAO;AAAA,MAC9C;AAAA,SAEG;AAAA,MACH,IAAI,CAAC,QAAQ,UAAU;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY,CAAC,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,MACjD;AAAA,SAEG;AAAA,MACH,IAAI,CAAC,QAAQ,YAAY;AAAA,QACvB,OAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,oBAAoB,QAAQ,UAAU;AAAA,QAC/C,cAAc,QAAQ,WAAW;AAAA,MACnC;AAAA,SAEG;AAAA,MAEH,OAAO;AAAA;AAAA,MAGP,OAAO;AAAA;AAAA;AAOb,SAAS,mBAAmB,CAAC,QAA4B;AAAA,EACvD,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,IACtC,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,OAAO,KAAK,UAAU,OAAO,OAAO;AAAA;AAkB/B,SAAS,gBAAgB,CAAC,cAA6C;AAAA,EAC5E,MAAM,WAA4B,CAAC;AAAA,EAEnC,WAAW,WAAW,mBAAmB,YAAY,GAAG;AAAA,IACtD,MAAM,YAAY,eAAe,OAAO;AAAA,IACxC,IAAI,WAAW;AAAA,MACb,SAAS,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAOF,SAAS,uBAAuB,CAAC,cAA6C;AAAA,EACnF,MAAM,WAA4B,CAAC;AAAA,EACnC,IAAI,mBAAqC,CAAC;AAAA,EAE1C,WAAW,WAAW,mBAAmB,YAAY,GAAG;AAAA,IACtD,IAAI,QAAQ;AAAA,MAAQ;AAAA,IAEpB,IAAI,QAAQ,SAAS,cAAc,QAAQ,UAAU;AAAA,MACnD,iBAAiB,KAAK,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,IAGA,IAAI,iBAAiB,SAAS,GAAG;AAAA,MAC/B,SAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,MACD,mBAAmB,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,YAAY,eAAe,OAAO;AAAA,IACxC,IAAI,aAAa,QAAQ,SAAS,YAAY;AAAA,MAC5C,SAAS,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAGA,IAAI,iBAAiB,SAAS,GAAG;AAAA,IAC/B,SAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;",
9
- "debugId": "76C027000C92020164756E2164756E21",
12
+ "mappings": ";AAoBO,MAAM,+BAA+B,MAAM;AAAA,EAEvC;AAAA,EAGA;AAAA,EAGS;AAAA,EAElB,WAAW,CACT,MACA,SACA,SAIA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,KAAK,UAAU,SAAS;AAAA,IACxB,KAAK,QAAQ,SAAS;AAAA,IAGtB,IAAI,MAAM,mBAAmB;AAAA,MAC3B,MAAM,kBAAkB,MAAM,sBAAsB;AAAA,IACtD;AAAA;AAAA,EAMF,gBAAgB,GAAW;AAAA,IACzB,MAAM,QAAQ,CAAC,IAAI,KAAK,SAAS,KAAK,SAAS;AAAA,IAE/C,IAAI,KAAK,WAAW,OAAO,KAAK,KAAK,OAAO,EAAE,SAAS,GAAG;AAAA,MACxD,MAAM,KAAK,YAAY,KAAK,UAAU,KAAK,SAAS,MAAM,CAAC,GAAG;AAAA,IAChE;AAAA,IAEA,IAAI,KAAK,OAAO;AAAA,MACd,MAAM,KAAK,cAAc,KAAK,MAAM,SAAS;AAAA,IAC/C;AAAA,IAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAE1B;AA6FO,SAAS,qBAAqB,CACnC,SACA,SACA,OACwB;AAAA,EACxB,OAAO,IAAI,uBAAuB,oBAAoB,SAAS,EAAE,SAAS,MAAM,CAAC;AAAA;AAO5E,SAAS,oBAAoB,CAClC,SACA,SACwB;AAAA,EACxB,OAAO,IAAI,uBAAuB,mBAAmB,SAAS,EAAE,QAAQ,CAAC;AAAA;;;AC9K3E;AAcA,IAAM,gBAAgB,CAAC,UAAqD;AAAA,EAC1E,IAAI,CAAC,SAAS,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EAChD,MAAM,YAAY,QAAQ,eAAe,KAAK;AAAA,EAC9C,OAAO,cAAc,OAAO,aAAa,cAAc;AAAA;AAUzD,SAAS,mBAAmB,CAAC,OAAgD;AAAA,EAC3E,MAAM,SAA4B,EAAE,MAAM,MAAM,KAAK;AAAA,EACrD,IAAI,MAAM,SAAS;AAAA,IAAW,OAAO,OAAO,MAAM;AAAA,EAClD,IAAI,MAAM,QAAQ;AAAA,IAAW,OAAO,MAAM,MAAM;AAAA,EAChD,IAAI,MAAM,aAAa;AAAA,IAAW,OAAO,WAAW,MAAM;AAAA,EAC1D,OAAO;AAAA;AAMF,IAAM,kBAAwC,EAAE,KAAK,MAAM;AAAA,EAChE,MAAM,mBAAmB,EAAE,WACzB,CAAC,OAAO,QAAQ;AAAA,IACd,IAAI,CAAC,cAAc,KAAK,GAAG;AAAA,MACzB,IAAI,SAAS;AAAA,QACX,MAAM,EAAE,aAAa;AAAA,QACrB,SAAS;AAAA,MACX,CAAC;AAAA,MACD,OAAO,EAAE;AAAA,IACX;AAAA,IACA,OAAO;AAAA,KAET,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe,CACtC;AAAA,EAEA,OAAO,EAAE,MAAM;AAAA,IACb,EAAE,OAAO;AAAA,IACT,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,GAAG;AAAA,MACnD,SAAS;AAAA,IACX,CAAC;AAAA,IACD,EAAE,QAAQ;AAAA,IACV,EAAE,KAAK;AAAA,IACP,EAAE,MAAM,eAAe;AAAA,IACvB;AAAA,EACF,CAAC;AAAA,CACF;AAKM,IAAM,0BAA0B,EACpC,mBAAmB,QAAQ;AAAA,EAC1B,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,MAAM;AAAA,IACtB,MAAM,EAAE,OAAO;AAAA,EACjB,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,OAAO;AAAA,IACvB,KAAK,EAAE,OAAO,EAAE,IAAI;AAAA,IACpB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC;AACH,CAAC,EACA,UAAU,mBAAmB;AAKzB,IAAM,oBAAoB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,iBAAiB,EAC3B,OAAO;AAAA,EACN,IAAI,EAAE,OAAO;AAAA,EACb,MAAM,EAAE,OAAO;AAAA,EACf,WAAW;AACb,CAAC,EACA,OAAO;AAKH,IAAM,mBAAmB,EAC7B,OAAO;AAAA,EACN,QAAQ,EAAE,OAAO;AAAA,EACjB,SAAS,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC;AAAA,EACpC,SAAS;AACX,CAAC,EACA,OAAO;AAKH,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAC/B,CAAC;AAKM,IAAM,qBAAqB,EAC/B,OAAO;AAAA,EACN,MAAM;AAAA,EACN,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,uBAAuB,CAAC,CAAC;AAAA,EAC/D,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,SAAS;AAAA,EACzD,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,UAAU,eAAe,SAAS;AAAA,EAClC,YAAY,iBAAiB,SAAS;AAAA,EACtC,YAAY,iBAAiB,SAAS;AAAA,EACtC,eAAe,EAAE,QAAQ,EAAE,SAAS;AACtC,CAAC,EACA,OAAO;AAKH,IAAM,gBAAgB,EAC1B,OAAO;AAAA,EACN,IAAI,EAAE,OAAO;AAAA,EACb,MAAM;AAAA,EACN,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,MAAM,uBAAuB,CAAC,CAAC;AAAA,EAC/D,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAChC,WAAW,EAAE,OAAO;AAAA,EACpB,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;AAAA,EAC9C,QAAQ,EAAE,QAAQ;AAAA,EAClB,UAAU,eAAe,SAAS;AAAA,EAClC,YAAY,iBAAiB,SAAS;AAAA,EACtC,YAAY,iBAAiB,SAAS;AAAA,EACtC,eAAe,EAAE,QAAQ,EAAE,SAAS;AACtC,CAAC,EACA,OAAO;AAKH,IAAM,2BAA2B,EAAE,KAAK;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,oBAAoB;AAAA,EAC/B,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EACrC,IAAI,EAAE,OAAO;AAAA,EACb,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQ;AAAA,EACR,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;AAAA,EAC9C,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACvB,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa;AAAA,EAC5C,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,EAAE,OAAO;AACtB;AAKO,IAAM,qBAAqB,EAC/B,OAAO,iBAAiB,EACxB,OAAO;;;AC5KH,SAAS,6BAA6B,CAC3C,cACkB;AAAA,EAClB,MAAM,SAA2B,CAAC;AAAA,EAClC,MAAM,UAAU,IAAI;AAAA,EAEpB,aAAa,IAAI,QAAQ,CAAC,IAAI,UAAU;AAAA,IACtC,IAAI,QAAQ,IAAI,EAAE,GAAG;AAAA,MACnB,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,gCAAgC;AAAA,QACzC,MAAM,EAAE,IAAI,UAAU,MAAM;AAAA,MAC9B,CAAC;AAAA,IACH,EAAO;AAAA,MACL,QAAQ,IAAI,EAAE;AAAA;AAAA,IAGhB,IAAI,CAAC,aAAa,SAAS,KAAK;AAAA,MAC9B,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,0BAA0B;AAAA,QACnC,MAAM,EAAE,IAAI,UAAU,MAAM;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,GACD;AAAA,EAED,WAAW,MAAM,OAAO,KAAK,aAAa,QAAQ,GAAG;AAAA,IACnD,IAAI,CAAC,QAAQ,IAAI,EAAE,GAAG;AAAA,MACpB,OAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,WAAW;AAAA,QACpB,MAAM,EAAE,GAAG;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAI;AAAA,EAErB,aAAa,IAAI,QAAQ,CAAC,IAAI,UAAU;AAAA,IACtC,MAAM,UAAU,aAAa,SAAS;AAAA,IACtC,IAAI,CAAC;AAAA,MAAS;AAAA,IAEd,IAAI,QAAQ,SAAS,cAAc,QAAQ,UAAU;AAAA,MACnD,IAAI,SAAS,IAAI,QAAQ,SAAS,EAAE,GAAG;AAAA,QACrC,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,yBAAyB,QAAQ,SAAS;AAAA,UACnD,MAAM,EAAE,YAAY,QAAQ,SAAS,IAAI,WAAW,QAAQ,GAAG;AAAA,QACjE,CAAC;AAAA,MACH,EAAO;AAAA,QACL,SAAS,IAAI,QAAQ,SAAS,IAAI,EAAE,UAAU,OAAO,WAAW,QAAQ,GAAG,CAAC;AAAA;AAAA,IAEhF;AAAA,GACD;AAAA,EAED,aAAa,IAAI,QAAQ,CAAC,IAAI,UAAU;AAAA,IACtC,MAAM,UAAU,aAAa,SAAS;AAAA,IACtC,IAAI,CAAC;AAAA,MAAS;AAAA,IAEd,IAAI,QAAQ,SAAS,iBAAiB,QAAQ,YAAY;AAAA,MACxD,MAAM,UAAU,SAAS,IAAI,QAAQ,WAAW,MAAM;AAAA,MACtD,IAAI,CAAC,SAAS;AAAA,QACZ,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,2CAA2C,QAAQ,WAAW;AAAA,UACvE,MAAM,EAAE,QAAQ,QAAQ,WAAW,QAAQ,WAAW,QAAQ,GAAG;AAAA,QACnE,CAAC;AAAA,MACH,EAAO,SAAI,QAAQ,YAAY,OAAO;AAAA,QACpC,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,eAAe,QAAQ,WAAW;AAAA,UAC3C,MAAM;AAAA,YACJ,QAAQ,QAAQ,WAAW;AAAA,YAC3B,WAAW,QAAQ;AAAA,YACnB,kBAAkB,QAAQ;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,GACD;AAAA,EAED,OAAO;AAAA;AAMF,SAAS,2BAA2B,CAAC,cAAkC;AAAA,EAC5E,MAAM,SAAS,8BAA8B,YAAY;AAAA,EACzD,IAAI,OAAO,WAAW;AAAA,IAAG;AAAA,EAEzB,MAAM,qBAAqB,uCAAuC,EAAE,OAAO,CAAC;AAAA;;;ACtGvE,SAAS,sBAAsB,CAAC,cAAkC;AAAA,EACvE,MAAM,SAAS,mBAAmB,UAAU,YAAY;AAAA,EACxD,IAAI,CAAC,OAAO,SAAS;AAAA,IACnB,MAAM,sBAAsB,yCAAyC;AAAA,MACnE,QAAQ,OAAO,MAAM;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,4BAA4B,YAAY;AAAA;;;ACfnC,SAAS,kBAAkB,CAAC,cAAuC;AAAA,EACxE,MAAM,UAAqB,CAAC;AAAA,EAC5B,WAAW,MAAM,aAAa,KAAK;AAAA,IACjC,MAAM,UAAU,aAAa,SAAS;AAAA,IACtC,IAAI,SAAS;AAAA,MACX,QAAQ,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;ACyFT,SAAS,eAAe,CACtB,SACA,UAAqC,CAAC,GACkB;AAAA,EACxD,IAAI,OAAO,YAAY,UAAU;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,QAAQ,eAAe;AAAA,EAC3C,MAAM,QAA6B,CAAC;AAAA,EACpC,WAAW,QAAQ,SAAS;AAAA,IAC1B,IAAI,KAAK,SAAS,QAAQ;AAAA,MACxB,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,QAAQ,GAAG,CAAC;AAAA,IACpD,EAAO,SAAI,KAAK,SAAS,WAAW,aAAa;AAAA,MAC/C,MAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,WAAW,EAAE,KAAK,KAAK,OAAO,GAAG;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,WAAW,KAAK,MAAM,IAAI,SAAS,QAAQ;AAAA,IACnD,OAAO,MAAM,GAAG;AAAA,EAClB;AAAA,EAEA,OAAO,cAAc,QAAS;AAAA;AAMhC,SAAS,mBAAmB,CAC1B,SACkC;AAAA,EAClC,OAAO,gBAAgB,SAAS,EAAE,aAAa,MAAM,CAAC;AAAA;AAMxD,SAAS,gBAAgB,CAAC,UAAoC;AAAA,EAC5D,OAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,SAAS;AAAA,MACf,WACE,OAAO,SAAS,cAAc,WAC1B,SAAS,YACT,KAAK,UAAU,SAAS,SAAS;AAAA,IACzC;AAAA,EACF;AAAA;AAOF,SAAS,cAAc,CAAC,SAAwC;AAAA,EAE9D,IAAI,QAAQ,QAAQ;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAQ;AAAA,SACT;AAAA,SACA;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,oBAAoB,QAAQ,OAAO;AAAA,MAC9C;AAAA,SAEG;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,gBAAgB,QAAQ,OAAO;AAAA,MAC1C;AAAA,SAEG;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,oBAAoB,QAAQ,OAAO;AAAA,MAC9C;AAAA,SAEG;AAAA,MACH,IAAI,CAAC,QAAQ,UAAU;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY,CAAC,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,MACjD;AAAA,SAEG;AAAA,MACH,IAAI,CAAC,QAAQ,YAAY;AAAA,QACvB,OAAO;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,oBAAoB,QAAQ,UAAU;AAAA,QAC/C,cAAc,QAAQ,WAAW;AAAA,MACnC;AAAA,SAEG;AAAA,MAEH,OAAO;AAAA;AAAA;AAOb,SAAS,mBAAmB,CAAC,QAA4B;AAAA,EACvD,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,IACtC,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,OAAO,KAAK,UAAU,OAAO,OAAO;AAAA;AAkB/B,SAAS,gBAAgB,CAAC,cAA6C;AAAA,EAC5E,uBAAuB,YAAY;AAAA,EACnC,MAAM,WAA4B,CAAC;AAAA,EAEnC,WAAW,WAAW,mBAAmB,YAAY,GAAG;AAAA,IACtD,MAAM,YAAY,eAAe,OAAO;AAAA,IACxC,IAAI,WAAW;AAAA,MACb,SAAS,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAOF,SAAS,uBAAuB,CAAC,cAA6C;AAAA,EACnF,uBAAuB,YAAY;AAAA,EACnC,MAAM,WAA4B,CAAC;AAAA,EACnC,IAAI,mBAAqC,CAAC;AAAA,EAE1C,WAAW,WAAW,mBAAmB,YAAY,GAAG;AAAA,IACtD,IAAI,QAAQ;AAAA,MAAQ;AAAA,IAEpB,IAAI,QAAQ,SAAS,cAAc,QAAQ,UAAU;AAAA,MACnD,iBAAiB,KAAK,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,IAGA,IAAI,iBAAiB,SAAS,GAAG;AAAA,MAC/B,SAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAAA,MACD,mBAAmB,CAAC;AAAA,IACtB;AAAA,IAEA,MAAM,YAAY,eAAe,OAAO;AAAA,IACxC,IAAI,aAAa,QAAQ,SAAS,YAAY;AAAA,MAC5C,SAAS,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAGA,IAAI,iBAAiB,SAAS,GAAG;AAAA,IAC/B,SAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;",
13
+ "debugId": "C82D4C1485D7420464756E2164756E21",
10
14
  "names": []
11
15
  }
package/dist/context.d.ts CHANGED
@@ -13,26 +13,32 @@ export interface TruncateOptions {
13
13
  estimateTokens?: TokenEstimator;
14
14
  preserveSystemMessages?: boolean;
15
15
  preserveLastN?: number;
16
+ preserveToolPairs?: boolean;
16
17
  }
17
18
  /**
18
19
  * Truncates conversation to fit within an estimated token limit.
19
20
  * Removes oldest messages first while preserving system messages and optionally the last N messages.
20
21
  * If no estimator is provided, the environment's default estimator is used.
22
+ * Tool interactions are preserved as atomic blocks by default.
21
23
  */
22
24
  export declare function truncateToTokenLimit(conversation: Conversation, maxTokens: number, optionsOrEstimator?: TruncateOptions | TokenEstimator, environment?: Partial<ConversationEnvironment>): Conversation;
23
25
  /**
24
26
  * Returns the last N messages from the conversation.
25
27
  * By default excludes system messages and hidden messages.
28
+ * Tool interactions are preserved as atomic blocks by default.
26
29
  */
27
30
  export declare function getRecentMessages(conversation: Conversation, count: number, options?: {
28
31
  includeHidden?: boolean;
29
32
  includeSystem?: boolean;
33
+ preserveToolPairs?: boolean;
30
34
  }): ReadonlyArray<Message>;
31
35
  /**
32
36
  * Truncates conversation to keep only messages from the specified position onwards.
33
37
  * Optionally preserves system messages regardless of position.
38
+ * Tool interactions are preserved as atomic blocks by default.
34
39
  */
35
40
  export declare function truncateFromPosition(conversation: Conversation, position: number, options?: {
36
41
  preserveSystemMessages?: boolean;
42
+ preserveToolPairs?: boolean;
37
43
  }, environment?: Partial<ConversationEnvironment>): Conversation;
38
44
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAG5B,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAoB,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIvF,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAgChC;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,YAAY,EAC1B,cAAc,CAAC,EAAE,cAAc,EAC/B,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,MAAM,CAqBR;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,eAAe,GAAG,cAAc,EACrD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAmHd;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,aAAa,CAAC,OAAO,CAAC,CAWxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,EACD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAwBd"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,uBAAuB,EAG5B,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAoB,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIvF,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAuKhC;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,YAAY,EAC1B,cAAc,CAAC,EAAE,cAAc,EAC/B,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,MAAM,CAqBR;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,eAAe,GAAG,cAAc,EACrD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAgHd;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GACA,aAAa,CAAC,OAAO,CAAC,CAmBxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,EACD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CA6Bd"}
@@ -10,6 +10,11 @@ export declare function appendMessages(conversation: Conversation, ...inputsAndE
10
10
  ...MessageInput[],
11
11
  Partial<ConversationEnvironment> | undefined
12
12
  ]): Conversation;
13
+ /**
14
+ * Appends a message without validating conversation integrity or JSON-safety.
15
+ * Use only when you have already validated the conversation yourself.
16
+ */
17
+ export declare function appendUnsafeMessage(conversation: Conversation, input: MessageInput, environment?: Partial<ConversationEnvironment>): Conversation;
13
18
  /**
14
19
  * Appends a user message to the conversation.
15
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../../src/conversation/append.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EAET,YAAY,EACb,MAAM,UAAU,CAAC;AAoClB;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,MAAM,EAAE,YAAY,EAAE,GACxB,YAAY,CAAC;AAChB,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,oBAAoB,EAAE;IACvB,GAAG,YAAY,EAAE;IACjB,OAAO,CAAC,uBAAuB,CAAC,GAAG,SAAS;CAC7C,GACA,YAAY,CAAC;AAwEhB;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAEd;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAMd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAEd"}
1
+ {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../../src/conversation/append.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAEV,YAAY,EACZ,SAAS,EAET,YAAY,EACb,MAAM,UAAU,CAAC;AAqClB;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,MAAM,EAAE,YAAY,EAAE,GACxB,YAAY,CAAC;AAChB,wBAAgB,cAAc,CAC5B,YAAY,EAAE,YAAY,EAC1B,GAAG,oBAAoB,EAAE;IACvB,GAAG,YAAY,EAAE;IACjB,OAAO,CAAC,uBAAuB,CAAC,GAAG,SAAS;CAC7C,GACA,YAAY,CAAC;AAQhB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,YAAY,EACnB,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAEd;AA+FD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAYd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAYd"}
@@ -10,4 +10,13 @@ export declare function createConversation(options?: {
10
10
  status?: ConversationStatus;
11
11
  metadata?: Record<string, JSONValue>;
12
12
  }, environment?: Partial<ConversationEnvironment>): Conversation;
13
+ /**
14
+ * Creates a new empty conversation without validating schema or integrity.
15
+ */
16
+ export declare function createConversationUnsafe(options?: {
17
+ id?: string;
18
+ title?: string;
19
+ status?: ConversationStatus;
20
+ metadata?: Record<string, JSONValue>;
21
+ }, environment?: Partial<ConversationEnvironment>): Conversation;
13
22
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/conversation/create.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI5E;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE;IACR,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACtC,EACD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAed"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/conversation/create.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK5E;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,CAAC,EAAE;IACR,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACtC,EACD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAed;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE;IACR,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACtC,EACD,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAed"}
@@ -1,9 +1,14 @@
1
1
  export type { ConversationEnvironment } from '../environment';
2
- export { createConversation } from './create';
3
- export { appendAssistantMessage, appendMessages, appendSystemMessage, appendUserMessage, } from './append';
2
+ export { createConversation, createConversationUnsafe } from './create';
3
+ export { appendAssistantMessage, appendMessages, appendSystemMessage, appendUnsafeMessage, appendUserMessage, } from './append';
4
4
  export { getMessageAtPosition, getMessageById, getMessageIds, getMessages, getStatistics, searchConversationMessages, } from './query';
5
5
  export { collapseSystemMessages, getFirstSystemMessage, getSystemMessages, hasSystemMessage, prependSystemMessage, replaceSystemMessage, } from './system-messages';
6
+ export type { RedactMessageOptions } from './modify';
6
7
  export { redactMessageAtPosition } from './modify';
7
- export { deserializeConversation, migrateConversation } from './serialization';
8
+ export { deserializeConversation } from './serialization';
9
+ export type { IntegrityIssue, IntegrityIssueCode } from './integrity';
10
+ export { assertConversationIntegrity, validateConversationIntegrity } from './integrity';
8
11
  export { toChatMessages } from './transform';
12
+ export type { AppendToolResultOptions, AppendToolUseOptions, ToolInteraction, ToolResultInput, ToolUseInput, } from './tool-interactions';
13
+ export { appendToolResult, appendToolUse, getPendingToolCalls, getToolInteractions, } from './tool-interactions';
9
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,WAAW,EACX,aAAa,EACb,0BAA0B,GAC3B,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAGxE,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,WAAW,EACX,aAAa,EACb,0BAA0B,GAC3B,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAGnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,YAAY,EACV,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Conversation } from '../types';
2
+ export type IntegrityIssueCode = 'integrity:missing-message' | 'integrity:unlisted-message' | 'integrity:duplicate-message-id' | 'integrity:orphan-tool-result' | 'integrity:tool-result-before-call' | 'integrity:duplicate-tool-call';
3
+ export interface IntegrityIssue {
4
+ code: IntegrityIssueCode;
5
+ message: string;
6
+ data?: Record<string, unknown> | undefined;
7
+ }
8
+ /**
9
+ * Validates conversation invariants and returns a list of issues.
10
+ */
11
+ export declare function validateConversationIntegrity(conversation: Conversation): IntegrityIssue[];
12
+ /**
13
+ * Throws an integrity error if the conversation fails validation.
14
+ */
15
+ export declare function assertConversationIntegrity(conversation: Conversation): void;
16
+ //# sourceMappingURL=integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../../src/conversation/integrity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAC1B,2BAA2B,GAC3B,4BAA4B,GAC5B,gCAAgC,GAChC,8BAA8B,GAC9B,mCAAmC,GACnC,+BAA+B,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,YAAY,GACzB,cAAc,EAAE,CAgFlB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAK5E"}
@@ -1,9 +1,15 @@
1
1
  import { type ConversationEnvironment } from '../environment';
2
2
  import type { Conversation } from '../types';
3
+ export interface RedactMessageOptions {
4
+ placeholder?: string;
5
+ redactToolArguments?: boolean;
6
+ redactToolResults?: boolean;
7
+ clearToolMetadata?: boolean;
8
+ }
3
9
  /**
4
10
  * Replaces the content of a message at the specified position with a placeholder.
5
- * Preserves all other message properties except toolCall, toolResult, and tokenUsage.
11
+ * By default preserves tool identifiers/outcomes while redacting tool payloads.
6
12
  * Throws if the position is out of bounds.
7
13
  */
8
- export declare function redactMessageAtPosition(conversation: Conversation, position: number, placeholder?: string, environment?: Partial<ConversationEnvironment>): Conversation;
14
+ export declare function redactMessageAtPosition(conversation: Conversation, position: number, placeholderOrOptions?: string | RedactMessageOptions | Partial<ConversationEnvironment>, environment?: Partial<ConversationEnvironment>): Conversation;
9
15
  //# sourceMappingURL=modify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modify.d.ts","sourceRoot":"","sources":["../../src/conversation/modify.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,UAAU,CAAC;AAGtD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAqB,EAClC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAgCd"}
1
+ {"version":3,"file":"modify.d.ts","sourceRoot":"","sources":["../../src/conversation/modify.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,UAAU,CAAC;AAKtD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAaD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,oBAAoB,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,CAAC,EACvF,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CA2Ed"}
@@ -1,23 +1,6 @@
1
1
  import type { Conversation } from '../types';
2
- /**
3
- * Migrates a serialized conversation object to the current schema version.
4
- * Handles data from older versions that may not have a schemaVersion field.
5
- *
6
- * @param json - The conversation data to migrate (may be from an older version)
7
- * @returns A Conversation with the current schema version
8
- *
9
- * @example
10
- * ```ts
11
- * // Old data without schemaVersion
12
- * const old = { id: 'conv-1', status: 'active', ... };
13
- * const migrated = migrateConversation(old);
14
- * // migrated.schemaVersion === CURRENT_SCHEMA_VERSION
15
- * ```
16
- */
17
- export declare function migrateConversation(json: unknown): Conversation;
18
2
  /**
19
3
  * Reconstructs a conversation from a JSON object.
20
- * Automatically migrates data from older schema versions.
21
4
  * Validates message positions are contiguous and tool results reference valid calls.
22
5
  * Throws a serialization error if validation fails.
23
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/conversation/serialization.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,UAAU,CAAC;AAMtD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAgE/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAsDnE"}
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/conversation/serialization.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,YAAY,EAAuB,MAAM,UAAU,CAAC;AAwCpF;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAqEnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../src/conversation/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAIjE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAErF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAEpF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAuCd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CA+Bd;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAiFd"}
1
+ {"version":3,"file":"system-messages.d.ts","sourceRoot":"","sources":["../../src/conversation/system-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKjE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAErF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAEpF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CA8Cd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAyCd;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,EAC1B,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAiFd"}
@@ -0,0 +1,45 @@
1
+ import { type ConversationEnvironment } from '../environment';
2
+ import type { Conversation, JSONValue, MessageInput, TokenUsage, ToolCall, ToolResult } from '../types';
3
+ export interface AppendToolUseOptions {
4
+ content?: MessageInput['content'];
5
+ metadata?: Record<string, JSONValue>;
6
+ hidden?: boolean;
7
+ tokenUsage?: TokenUsage;
8
+ }
9
+ export interface AppendToolResultOptions {
10
+ content?: MessageInput['content'];
11
+ metadata?: Record<string, JSONValue>;
12
+ hidden?: boolean;
13
+ tokenUsage?: TokenUsage;
14
+ }
15
+ export interface ToolUseInput {
16
+ toolId: string;
17
+ callId?: string;
18
+ args: JSONValue;
19
+ }
20
+ export interface ToolResultInput {
21
+ callId: string;
22
+ outcome: 'success' | 'error';
23
+ result: JSONValue;
24
+ }
25
+ export interface ToolInteraction {
26
+ call: ToolCall;
27
+ result?: ToolResult | undefined;
28
+ }
29
+ /**
30
+ * Appends a tool-use message with the provided tool call metadata.
31
+ */
32
+ export declare function appendToolUse(conversation: Conversation, toolCall: ToolUseInput, options?: AppendToolUseOptions, environment?: Partial<ConversationEnvironment>): Conversation;
33
+ /**
34
+ * Appends a tool-result message with the provided tool result metadata.
35
+ */
36
+ export declare function appendToolResult(conversation: Conversation, toolResult: ToolResultInput, options?: AppendToolResultOptions, environment?: Partial<ConversationEnvironment>): Conversation;
37
+ /**
38
+ * Returns tool calls that have no corresponding tool result yet.
39
+ */
40
+ export declare function getPendingToolCalls(conversation: Conversation): ToolCall[];
41
+ /**
42
+ * Returns tool calls paired with their optional results in message order.
43
+ */
44
+ export declare function getToolInteractions(conversation: Conversation): ToolInteraction[];
45
+ //# sourceMappingURL=tool-interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-interactions.d.ts","sourceRoot":"","sources":["../../src/conversation/tool-interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,UAAU,EACX,MAAM,UAAU,CAAC;AAKlB,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,oBAAoB,EAC9B,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CA0Bd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,eAAe,EAC3B,OAAO,CAAC,EAAE,uBAAuB,EACjC,WAAW,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC7C,YAAY,CAsBd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,QAAQ,EAAE,CAoB1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,eAAe,EAAE,CAEjF"}