conversationalist 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/multi-modal.ts", "../src/schemas.ts", "../src/environment.ts", "../src/errors.ts", "../src/utilities.ts", "../src/conversation.ts", "../src/context.ts", "../src/streaming.ts", "../src/with-conversation.ts"],
3
+ "sources": ["../src/multi-modal.ts", "../src/schemas.ts", "../src/utilities.ts", "../src/environment.ts", "../src/errors.ts", "../src/conversation.ts", "../src/context.ts", "../src/streaming.ts", "../src/with-conversation.ts", "../src/history.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Re-exports multi-modal types from @lasercat/homogenaize\n */\n\nimport type { MultiModalContent } from '@lasercat/homogenaize';\n\nexport type { Message, MultiModalContent } from '@lasercat/homogenaize';\n\n/**\n * TextContent and ImageContent are convenience types for discriminating MultiModalContent.\n */\nexport interface TextContent {\n type: 'text';\n text: string;\n}\n\nexport interface ImageContent {\n type: 'image';\n url: string;\n mimeType?: string;\n text?: string;\n}\n\n/**\n * Creates a shallow copy of a MultiModalContent item.\n */\nexport function copyMultiModalContent(item: MultiModalContent): MultiModalContent {\n if (item.type === 'text') {\n const result: MultiModalContent = { type: 'text' };\n if (item.text !== undefined) result.text = item.text;\n return result;\n }\n const result: MultiModalContent = { type: 'image' };\n if (item.url !== undefined) result.url = item.url;\n if (item.mimeType !== undefined) result.mimeType = item.mimeType;\n if (item.text !== undefined) result.text = item.text;\n return result;\n}\n\n/**\n * Copies content, ensuring a mutable array is returned for multi-modal content.\n */\nexport function copyContent(\n content: string | ReadonlyArray<MultiModalContent>,\n): string | MultiModalContent[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(copyMultiModalContent);\n}\n",
6
6
  "import { z } from 'zod';\n\nimport type {\n ConversationJSON,\n ConversationStatus,\n MessageInput,\n MessageJSON,\n MessageRole,\n TokenUsage,\n ToolCall,\n ToolResult,\n} from './types';\n\nexport const multiModalContentSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('text'), text: z.string() }),\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\nexport const messageRoleSchema = z.enum([\n 'user',\n 'assistant',\n 'system',\n 'developer',\n 'tool-use',\n 'tool-result',\n 'snapshot',\n]) as unknown as z.ZodType<MessageRole>;\n\nexport const toolCallSchema = z.object({\n id: z.string(),\n name: z.string(),\n arguments: z.unknown(),\n}) as unknown as z.ZodType<ToolCall>;\n\nexport const toolResultSchema = z.object({\n callId: z.string(),\n outcome: z.enum(['success', 'error']),\n content: z.unknown(),\n}) as unknown as z.ZodType<ToolResult>;\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}) as unknown as z.ZodType<TokenUsage>;\n\nexport const messageInputSchema = z.object({\n role: messageRoleSchema,\n content: z.union([z.string(), z.array(multiModalContentSchema)]),\n metadata: z.record(z.string(), z.unknown()).optional(),\n hidden: z.boolean().optional(),\n toolCall: toolCallSchema.optional(),\n toolResult: toolResultSchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n goalCompleted: z.boolean().optional(),\n}) as unknown as z.ZodType<MessageInput>;\n\nexport const messageJSONSchema = 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(), z.unknown()),\n hidden: z.boolean(),\n toolCall: toolCallSchema.optional(),\n toolResult: toolResultSchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n goalCompleted: z.boolean().optional(),\n })\n .passthrough() as unknown as z.ZodType<MessageJSON>;\n\nexport const conversationStatusSchema = z.enum([\n 'active',\n 'archived',\n 'deleted',\n]) as unknown as z.ZodType<ConversationStatus>;\n\n// Export the raw shape for direct use with storage systems\nexport const conversationShape = {\n id: z.string(),\n title: z.string().optional(),\n status: conversationStatusSchema,\n metadata: z.record(z.string(), z.unknown()),\n tags: z.array(z.string()),\n messages: z.array(messageJSONSchema),\n createdAt: z.string(),\n updatedAt: z.string(),\n} as const;\n\nexport const conversationSchema = z.object(\n conversationShape,\n) as unknown as z.ZodType<ConversationJSON>;\n",
7
- "/**\n * Environment functions for conversation operations.\n * Allows dependency injection for testing and custom ID generation.\n */\nexport interface ConversationEnvironment {\n now: () => string;\n randomId: () => string;\n}\n\n/**\n * Default environment using Date.toISOString() and crypto.randomUUID().\n */\nexport const defaultConversationEnvironment: ConversationEnvironment = {\n now: () => new Date().toISOString(),\n randomId: () => crypto.randomUUID(),\n};\n\n/**\n * Merges a partial environment with defaults.\n * Returns a complete environment with all required functions.\n */\nexport function resolveConversationEnvironment(\n environment?: Partial<ConversationEnvironment>,\n): ConversationEnvironment {\n return {\n now: environment?.now ?? defaultConversationEnvironment.now,\n randomId: environment?.randomId ?? defaultConversationEnvironment.randomId,\n };\n}\n\n/**\n * Type guard to distinguish environment objects from message inputs.\n * Returns true if the value has environment functions but no role property.\n */\nexport function isConversationEnvironmentParameter(\n value: unknown,\n): value is Partial<ConversationEnvironment> {\n if (!value || typeof value !== 'object') return false;\n if ('role' in (value as Record<string, unknown>)) return false;\n\n const candidate = value as Partial<ConversationEnvironment>;\n return typeof candidate.now === 'function' || typeof candidate.randomId === 'function';\n}\n",
8
- "/**\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\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",
9
7
  "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport { copyContent } from './multi-modal';\nimport type { Message, MessageJSON, ToolCall, ToolResult } from './types';\n\n/**\n * Represents a paired tool call with its optional result.\n */\nexport interface ToolCallPair {\n /** The tool call */\n call: ToolCall;\n /** The corresponding result, if available */\n result?: ToolResult | undefined;\n}\n\n/**\n * Pairs tool calls with their corresponding results from a list of messages.\n *\n * This is useful for UI rendering where tool calls and their results need\n * to be displayed together. The function performs two passes:\n * 1. Collects all tool results into a map by their callId\n * 2. Pairs each tool call with its matching result (if any)\n *\n * @param messages - Array of messages that may contain tool calls and results\n * @returns Array of tool call pairs, preserving the order of tool calls\n *\n * @example\n * ```ts\n * const pairs = pairToolCallsWithResults(conversation.messages);\n * // pairs: [{ call: ToolCall, result?: ToolResult }, ...]\n * ```\n */\nexport function pairToolCallsWithResults(\n messages: readonly MessageJSON[],\n): ToolCallPair[] {\n const pairs: ToolCallPair[] = [];\n const resultsMap = new Map<string, ToolResult>();\n\n // First pass: collect all results\n for (const msg of messages) {\n if (msg.toolResult) {\n resultsMap.set(msg.toolResult.callId, msg.toolResult);\n }\n }\n\n // Second pass: pair calls with results\n for (const msg of messages) {\n if (msg.toolCall) {\n pairs.push({\n call: msg.toolCall,\n result: resultsMap.get(msg.toolCall.id),\n });\n }\n }\n\n return pairs;\n}\n\n/**\n * Type-safe hasOwnProperty check.\n * Narrows the type to include the checked property.\n */\nexport function hasOwnProperty<X extends object, Y extends PropertyKey>(\n obj: X,\n prop: Y,\n): obj is X & Record<Y, unknown> {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/**\n * Casts a value to its readonly variant.\n * Used to enforce immutability at the type level.\n */\nexport function toReadonly<T>(value: T): Readonly<T> {\n return value as Readonly<T>;\n}\n\n/**\n * Creates an immutable Message from a JSON representation.\n * Deep copies nested objects and arrays to ensure immutability.\n */\nexport function createMessage(props: MessageJSON): Message {\n const content = Array.isArray(props.content)\n ? toReadonly([...props.content])\n : props.content;\n\n const message: Message = {\n id: props.id,\n role: props.role,\n content,\n position: props.position,\n createdAt: props.createdAt,\n metadata: toReadonly({ ...props.metadata }),\n hidden: props.hidden,\n toolCall: props.toolCall ? toReadonly({ ...props.toolCall }) : undefined,\n toolResult: props.toolResult ? toReadonly({ ...props.toolResult }) : undefined,\n tokenUsage: props.tokenUsage ? toReadonly({ ...props.tokenUsage }) : undefined,\n goalCompleted: props.goalCompleted,\n };\n\n return toReadonly(message);\n}\n\n/**\n * Converts content to a multi-modal array format.\n * Wraps strings in a text content object, normalizes single items to arrays.\n */\nexport function toMultiModalArray(\n input: string | MultiModalContent | MultiModalContent[],\n): MultiModalContent[] {\n if (typeof input === 'string') return [{ type: 'text', text: input }];\n return Array.isArray(input) ? input : [input];\n}\n\n/**\n * Normalizes content to either a string or multi-modal array.\n * Single MultiModalContent items are wrapped in an array.\n */\nexport function normalizeContent(\n content?: string | MultiModalContent | MultiModalContent[],\n): string | MultiModalContent[] | undefined {\n if (content === undefined) return undefined;\n if (typeof content === 'string') return content;\n return Array.isArray(content) ? content : [content];\n}\n\n/**\n * Converts an immutable Message to a mutable JSON representation.\n * Creates deep copies of all nested objects.\n */\nexport function messageToJSON(message: Message): MessageJSON {\n return {\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: message.position,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n };\n}\n\n/**\n * Extracts the content parts from a message as a multi-modal array.\n * String content is converted to a single text part.\n */\nexport function messageParts(message: Message): ReadonlyArray<MultiModalContent> {\n if (typeof message.content === 'string') {\n return message.content\n ? [{ type: 'text', text: message.content } as MultiModalContent]\n : [];\n }\n return message.content;\n}\n\n/**\n * Extracts all text content from a message, joined by the specified separator.\n * Non-text parts are excluded from the result.\n */\nexport function messageText(message: Message, joiner: string = '\\n\\n'): string {\n if (typeof message.content === 'string') return message.content;\n return messageParts(message)\n .filter((p) => p.type === 'text')\n .map((p: MultiModalContent) => (p.type === 'text' ? p.text : ''))\n .join(joiner);\n}\n\n/**\n * Checks if a message contains any image content.\n */\nexport function messageHasImages(message: Message): boolean {\n return messageParts(message).some((p) => p.type === 'image');\n}\n\n/**\n * Converts a message to a string representation.\n * Images are rendered as markdown image syntax.\n */\nexport function messageToString(message: Message): string {\n if (typeof message.content === 'string') return message.content;\n return messageParts(message)\n .map((part) =>\n part.type === 'text'\n ? part.text\n : `![${part.text ?? ''}](${(part as { url: string }).url})`,\n )\n .join('\\n\\n');\n}\n",
10
- "import type {\n Message as ExternalMessage,\n MultiModalContent,\n} from '@lasercat/homogenaize';\n\nimport {\n type ConversationEnvironment,\n isConversationEnvironmentParameter,\n resolveConversationEnvironment,\n} from './environment';\nimport {\n createInvalidPositionError,\n createInvalidToolReferenceError,\n createSerializationError,\n} from './errors';\nimport { copyContent } from './multi-modal';\nimport type {\n Conversation,\n ConversationJSON,\n ConversationStatus,\n Message,\n MessageInput,\n} from './types';\nimport {\n createMessage,\n messageHasImages,\n normalizeContent,\n toReadonly,\n} from './utilities';\n\nexport type { ConversationEnvironment } from './environment';\n\ntype ToolUseIndex = Map<string, { name: string }>;\n\nconst buildToolUseIndex = (messages: ReadonlyArray<Message>): ToolUseIndex =>\n messages.reduce((index, message) => {\n if (message.role === 'tool-use' && message.toolCall) {\n index.set(message.toolCall.id, { name: message.toolCall.name });\n }\n return index;\n }, new Map<string, { name: string }>());\n\nconst registerToolUse = (\n index: ToolUseIndex,\n toolCall: { id: string; name: string },\n): ToolUseIndex => {\n const next = new Map(index);\n next.set(toolCall.id, { name: toolCall.name });\n return next;\n};\n\nconst assertToolReference = (index: ToolUseIndex, callId: string): void => {\n if (!index.has(callId)) {\n throw createInvalidToolReferenceError(callId);\n }\n};\n\nfunction partitionAppendArgs(\n args: Array<MessageInput | Partial<ConversationEnvironment>>,\n): {\n inputs: MessageInput[];\n environment?: Partial<ConversationEnvironment> | undefined;\n} {\n if (args.length === 0) {\n return { inputs: [] };\n }\n\n const last = args[args.length - 1];\n if (isConversationEnvironmentParameter(last)) {\n return {\n inputs: args.slice(0, -1) as MessageInput[],\n environment: last,\n };\n }\n\n return { inputs: args as MessageInput[] };\n}\n\nexport function createConversation(\n options?: {\n id?: string;\n title?: string;\n status?: ConversationStatus;\n metadata?: Record<string, unknown>;\n tags?: string[];\n },\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const conv: Conversation = {\n id: options?.id ?? resolvedEnvironment.randomId(),\n title: options?.title,\n status: options?.status ?? 'active',\n metadata: { ...(options?.metadata ?? {}) },\n tags: [...(options?.tags ?? [])],\n messages: [],\n createdAt: now,\n updatedAt: now,\n };\n return toReadonly(conv);\n}\n\nexport function appendMessages(\n conversation: Conversation,\n ...inputs: MessageInput[]\n): Conversation;\nexport function appendMessages(\n conversation: Conversation,\n ...inputsAndEnvironment: [...MessageInput[], Partial<ConversationEnvironment>]\n): Conversation;\nexport function appendMessages(\n conversation: Conversation,\n ...args: (MessageInput | Partial<ConversationEnvironment>)[]\n): Conversation {\n const { inputs, environment } = partitionAppendArgs(args);\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const startPosition = conversation.messages.length;\n const initialToolUses = buildToolUseIndex(conversation.messages);\n\n const { messages } = inputs.reduce<{\n toolUses: ToolUseIndex;\n messages: Message[];\n }>(\n (state, input, index) => {\n if (input.role === 'tool-result' && input.toolResult) {\n assertToolReference(state.toolUses, input.toolResult.callId);\n }\n\n const normalizedContent = normalizeContent(input.content) as\n | string\n | MultiModalContent[];\n\n const message = createMessage({\n id: resolvedEnvironment.randomId(),\n role: input.role,\n content: normalizedContent,\n position: startPosition + index,\n createdAt: now,\n metadata: { ...(input.metadata ?? {}) },\n hidden: input.hidden ?? false,\n toolCall: input.toolCall,\n toolResult: input.toolResult,\n tokenUsage: input.tokenUsage,\n goalCompleted: input.goalCompleted,\n });\n\n const toolUses =\n input.role === 'tool-use' && input.toolCall\n ? registerToolUse(state.toolUses, input.toolCall)\n : state.toolUses;\n\n return {\n toolUses,\n messages: [...state.messages, message],\n };\n },\n { toolUses: initialToolUses, messages: [] },\n );\n\n const next: Conversation = {\n ...conversation,\n messages: [...conversation.messages, ...messages],\n updatedAt: now,\n };\n return toReadonly(next);\n}\n\nexport function appendUserMessage(\n conversation: Conversation,\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n return environment\n ? appendMessages(conversation, { role: 'user', content, metadata }, environment)\n : appendMessages(conversation, { role: 'user', content, metadata });\n}\n\nexport function appendAssistantMessage(\n conversation: Conversation,\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n return environment\n ? appendMessages(conversation, { role: 'assistant', content, metadata }, environment)\n : appendMessages(conversation, { role: 'assistant', content, metadata });\n}\n\nexport function appendSystemMessage(\n conversation: Conversation,\n content: string,\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n return environment\n ? appendMessages(conversation, { role: 'system', content, metadata }, environment)\n : appendMessages(conversation, { role: 'system', content, metadata });\n}\n\nexport function getConversationMessages(\n conversation: Conversation,\n options?: { includeHidden?: boolean },\n): ReadonlyArray<Message> {\n const includeHidden = options?.includeHidden ?? false;\n return includeHidden\n ? [...conversation.messages]\n : conversation.messages.filter((m) => !m.hidden);\n}\n\nexport function getMessageAtPosition(\n conversation: Conversation,\n position: number,\n): Message | undefined {\n return conversation.messages[position];\n}\n\nexport function getMessageByIdentifier(\n conversation: Conversation,\n id: string,\n): Message | undefined {\n return conversation.messages.find((m) => m.id === id);\n}\n\nexport function searchConversationMessages(\n conversation: Conversation,\n predicate: (m: Message) => boolean,\n): Message[] {\n return conversation.messages.filter(predicate);\n}\n\nexport function computeConversationStatistics(conversation: Conversation): {\n total: number;\n byRole: Record<string, number>;\n hidden: number;\n withImages: number;\n} {\n const stats = conversation.messages.reduce(\n (acc, message) => {\n const byRole = {\n ...acc.byRole,\n [message.role]: (acc.byRole[message.role] ?? 0) + 1,\n };\n\n return {\n byRole,\n hidden: acc.hidden + (message.hidden ? 1 : 0),\n withImages: acc.withImages + (messageHasImages(message) ? 1 : 0),\n };\n },\n { byRole: {} as Record<string, number>, hidden: 0, withImages: 0 },\n );\n return { total: conversation.messages.length, ...stats };\n}\n\nexport function hasSystemMessage(conversation: Conversation): boolean {\n return conversation.messages.some((m) => m.role === 'system');\n}\n\nexport function getFirstSystemMessage(conversation: Conversation): Message | undefined {\n return conversation.messages.find((m) => m.role === 'system');\n}\n\nexport function getSystemMessages(conversation: Conversation): ReadonlyArray<Message> {\n return conversation.messages.filter((m) => m.role === 'system');\n}\n\nexport function prependSystemMessage(\n conversation: Conversation,\n content: string,\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const newMessage: Message = createMessage({\n id: resolvedEnvironment.randomId(),\n role: 'system',\n content,\n position: 0,\n createdAt: now,\n metadata: { ...(metadata ?? {}) },\n hidden: false,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const renumberedMessages = conversation.messages.map((message) =>\n createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: message.position + 1,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall,\n toolResult: message.toolResult,\n tokenUsage: message.tokenUsage,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: [newMessage, ...renumberedMessages],\n updatedAt: now,\n });\n}\n\nexport function replaceSystemMessage(\n conversation: Conversation,\n content: string,\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const firstSystemIndex = conversation.messages.findIndex((m) => m.role === 'system');\n\n if (firstSystemIndex === -1) {\n return prependSystemMessage(conversation, content, metadata, resolvedEnvironment);\n }\n\n const original = conversation.messages[firstSystemIndex]!;\n const replaced: Message = createMessage({\n id: original.id,\n role: 'system',\n content,\n position: original.position,\n createdAt: original.createdAt,\n metadata: { ...(metadata ?? original.metadata) },\n hidden: original.hidden,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const messages = conversation.messages.map((message, index) =>\n index === firstSystemIndex ? replaced : message,\n );\n\n const next: Conversation = { ...conversation, messages, updatedAt: now };\n return toReadonly(next);\n}\n\nexport function collapseSystemMessages(\n conversation: Conversation,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const systemMessages = conversation.messages.filter((m) => m.role === 'system');\n\n if (systemMessages.length <= 1) {\n return conversation;\n }\n\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const { parts } = systemMessages.reduce(\n (state, message) => {\n const contentStr =\n typeof message.content === 'string'\n ? message.content\n : message.content\n .map((part) => (part.type === 'text' ? part.text : ''))\n .join('');\n\n if (!contentStr || state.seen.has(contentStr)) {\n return state;\n }\n\n const seen = new Set(state.seen);\n seen.add(contentStr);\n\n return { seen, parts: [...state.parts, contentStr] };\n },\n { seen: new Set<string>(), parts: [] as string[] },\n );\n\n const collapsedContent = parts.join('\\n');\n const firstSystemMsg = systemMessages[0]!;\n\n const collapsed: Message = createMessage({\n id: firstSystemMsg.id,\n role: 'system',\n content: collapsedContent,\n position: firstSystemMsg.position,\n createdAt: firstSystemMsg.createdAt,\n metadata: { ...firstSystemMsg.metadata },\n hidden: firstSystemMsg.hidden,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const systemIdsToRemove = systemMessages.slice(1).reduce((ids, message) => {\n const nextIds = new Set(ids);\n nextIds.add(message.id);\n return nextIds;\n }, new Set<string>());\n\n const messages = conversation.messages\n .filter((m) => !systemIdsToRemove.has(m.id))\n .map((m) => (m.id === firstSystemMsg.id ? collapsed : m));\n\n const renumbered = messages.map((message, index) => {\n if (message.position === index) return message;\n return createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall,\n toolResult: message.toolResult,\n tokenUsage: message.tokenUsage,\n });\n });\n\n const next: Conversation = {\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n };\n return toReadonly(next);\n}\n\nexport function redactMessageAtPosition(\n conversation: Conversation,\n position: number,\n placeholder: string = '[REDACTED]',\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n if (position < 0 || position >= conversation.messages.length) {\n throw createInvalidPositionError(conversation.messages.length - 1, position);\n }\n\n const original = conversation.messages[position]!;\n const redacted: Message = createMessage({\n id: original.id,\n role: original.role,\n content: placeholder,\n position: original.position,\n createdAt: original.createdAt,\n metadata: { ...original.metadata },\n hidden: original.hidden,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const messages = conversation.messages.map((message, index) =>\n index === position ? redacted : message,\n );\n\n const next: Conversation = { ...conversation, messages, updatedAt: now };\n return toReadonly(next);\n}\n\nexport function serializeConversation(conversation: Conversation): ConversationJSON {\n return {\n id: conversation.id,\n title: conversation.title,\n status: conversation.status,\n metadata: { ...conversation.metadata },\n tags: [...conversation.tags],\n messages: conversation.messages.map((m) => ({\n id: m.id,\n role: m.role,\n content: copyContent(m.content),\n position: m.position,\n createdAt: m.createdAt,\n metadata: { ...m.metadata },\n hidden: m.hidden,\n toolCall: m.toolCall ? { ...m.toolCall } : undefined,\n toolResult: m.toolResult ? { ...m.toolResult } : undefined,\n tokenUsage: m.tokenUsage ? { ...m.tokenUsage } : undefined,\n goalCompleted: m.goalCompleted,\n })),\n createdAt: conversation.createdAt,\n updatedAt: conversation.updatedAt,\n };\n}\n\nexport function deserializeConversation(json: ConversationJSON): Conversation {\n try {\n json.messages.reduce<{ toolUses: ToolUseIndex }>(\n (state, message, index) => {\n if (message.position !== index) {\n throw createInvalidPositionError(index, message.position);\n }\n\n if (message.role === 'tool-use' && message.toolCall) {\n return {\n toolUses: registerToolUse(state.toolUses, message.toolCall),\n };\n }\n\n if (message.role === 'tool-result' && message.toolResult) {\n assertToolReference(state.toolUses, message.toolResult.callId);\n }\n\n return state;\n },\n { toolUses: new Map<string, { name: string }>() },\n );\n\n const messages: Message[] = json.messages.map((m) => createMessage(m));\n const conv: Conversation = {\n id: json.id,\n title: json.title,\n status: json.status,\n metadata: { ...json.metadata },\n tags: [...json.tags],\n messages,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n };\n return toReadonly(conv);\n } catch (error) {\n throw createSerializationError(\n `failed to deserialize conversation: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error as Error,\n );\n }\n}\n\nexport function toChatMessages(conversation: Conversation): ExternalMessage[] {\n const roleMap: Record<string, 'user' | 'assistant' | 'system'> = {\n user: 'user',\n assistant: 'assistant',\n system: 'system',\n developer: 'system',\n 'tool-use': 'assistant',\n 'tool-result': 'user',\n snapshot: 'system',\n };\n\n const result: ExternalMessage[] = [];\n for (const message of conversation.messages) {\n if (message.hidden) continue;\n const externalRole = roleMap[message.role] as 'user' | 'assistant' | 'system';\n result.push({\n role: externalRole,\n content: message.content as string | MultiModalContent[],\n });\n }\n return result;\n}\n",
11
- "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport {\n type ConversationEnvironment,\n resolveConversationEnvironment,\n} from './environment';\nimport type { Conversation, Message } from './types';\nimport { createMessage, messageText, toReadonly } from './utilities';\n\n/**\n * Returns the last N messages from the conversation.\n * By default excludes system messages and hidden messages.\n */\nexport function getRecentMessages(\n conversation: Conversation,\n count: number,\n options?: {\n includeHidden?: boolean;\n includeSystem?: boolean;\n },\n): ReadonlyArray<Message> {\n const includeHidden = options?.includeHidden ?? false;\n const includeSystem = options?.includeSystem ?? false;\n\n const filtered = conversation.messages.filter((m) => {\n if (!includeHidden && m.hidden) return false;\n if (!includeSystem && m.role === 'system') return false;\n return true;\n });\n\n return filtered.slice(-count);\n}\n\n/**\n * Truncates conversation to keep only messages from the specified position onwards.\n * Optionally preserves system messages regardless of position.\n */\nexport function truncateFromPosition(\n conversation: Conversation,\n position: number,\n options?: {\n preserveSystemMessages?: boolean;\n },\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const preserveSystem = options?.preserveSystemMessages ?? true;\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const systemMessages = preserveSystem\n ? conversation.messages.filter((m) => m.role === 'system' && m.position < position)\n : [];\n\n const keptMessages = conversation.messages.filter((m) => m.position >= position);\n const allMessages = [...systemMessages, ...keptMessages];\n\n // Renumber positions\n const renumbered = allMessages.map((message, index) =>\n createMessage({\n id: message.id,\n role: message.role,\n content:\n typeof message.content === 'string'\n ? message.content\n : [...(message.content as MultiModalContent[])],\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n });\n}\n\n/**\n * Estimates total tokens in a conversation using the provided estimator function.\n */\nexport function estimateConversationTokens(\n conversation: Conversation,\n estimateTokens: (message: Message) => number,\n): number {\n return conversation.messages.reduce(\n (total, message) => total + estimateTokens(message),\n 0,\n );\n}\n\n/**\n * Simple character-based token estimator.\n * Approximates ~4 characters per token (rough average for English text).\n */\nexport function simpleTokenEstimator(message: Message): number {\n const text = messageText(message);\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Truncates conversation to fit within an estimated token limit.\n * Removes oldest messages first while preserving system messages and optionally the last N messages.\n */\nexport function truncateToTokenLimit(\n conversation: Conversation,\n maxTokens: number,\n estimateTokens: (message: Message) => number,\n options?: {\n preserveSystemMessages?: boolean;\n preserveLastN?: number;\n },\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const preserveSystem = options?.preserveSystemMessages ?? true;\n const preserveLastN = options?.preserveLastN ?? 0;\n\n // Calculate current token count\n const currentTokens = estimateConversationTokens(conversation, estimateTokens);\n if (currentTokens <= maxTokens) {\n return conversation;\n }\n\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n // Separate messages into categories\n const systemMessages = preserveSystem\n ? conversation.messages.filter((m) => m.role === 'system')\n : [];\n\n const nonSystemMessages = conversation.messages.filter((m) => m.role !== 'system');\n\n // Preserve the last N non-system messages\n const protectedMessages =\n preserveLastN > 0 ? nonSystemMessages.slice(-preserveLastN) : [];\n\n const removableMessages =\n preserveLastN > 0 ? nonSystemMessages.slice(0, -preserveLastN) : nonSystemMessages;\n\n // Calculate tokens for protected content\n const systemTokens = systemMessages.reduce((sum, m) => sum + estimateTokens(m), 0);\n const protectedTokens = protectedMessages.reduce(\n (sum, m) => sum + estimateTokens(m),\n 0,\n );\n const availableTokens = maxTokens - systemTokens - protectedTokens;\n\n if (availableTokens <= 0) {\n // Can only fit system and protected messages\n const allMessages = [...systemMessages, ...protectedMessages];\n const renumbered = allMessages.map((message, index) =>\n createMessage({\n id: message.id,\n role: message.role,\n content:\n typeof message.content === 'string'\n ? message.content\n : [...(message.content as MultiModalContent[])],\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n });\n }\n\n // Keep as many removable messages as possible, starting from the end (most recent)\n const keptRemovable: Message[] = [];\n let usedTokens = 0;\n\n for (let i = removableMessages.length - 1; i >= 0; i--) {\n const message = removableMessages[i]!;\n const messageTokens = estimateTokens(message);\n if (usedTokens + messageTokens <= availableTokens) {\n keptRemovable.unshift(message);\n usedTokens += messageTokens;\n } else {\n break;\n }\n }\n\n // Combine: system messages + kept removable + protected\n const allMessages = [...systemMessages, ...keptRemovable, ...protectedMessages];\n\n // Sort by original position then renumber\n allMessages.sort((a, b) => a.position - b.position);\n\n const renumbered = allMessages.map((message, index) =>\n createMessage({\n id: message.id,\n role: message.role,\n content:\n typeof message.content === 'string'\n ? message.content\n : [...(message.content as MultiModalContent[])],\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n });\n}\n",
8
+ "import type { Message, MessagePlugin, TokenEstimator } from './types';\nimport { messageText } from './utilities';\n\n/**\n * Environment functions for conversation operations.\n * Allows dependency injection for testing and custom ID generation.\n */\nexport interface ConversationEnvironment {\n now: () => string;\n randomId: () => string;\n estimateTokens: TokenEstimator;\n plugins: MessagePlugin[];\n}\n\n/**\n * Simple character-based token estimator.\n * Approximates ~4 characters per token (rough average for English text).\n */\nexport function simpleTokenEstimator(message: Message): number {\n const text = messageText(message);\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Default environment using Date.toISOString(), crypto.randomUUID(), and simple token estimation.\n */\nexport const defaultConversationEnvironment: ConversationEnvironment = {\n now: () => new Date().toISOString(),\n randomId: () => crypto.randomUUID(),\n estimateTokens: simpleTokenEstimator,\n plugins: [],\n};\n\n/**\n * Merges a partial environment with defaults.\n * Returns a complete environment with all required functions.\n */\nexport function resolveConversationEnvironment(\n environment?: Partial<ConversationEnvironment>,\n): ConversationEnvironment {\n return {\n now: environment?.now ?? defaultConversationEnvironment.now,\n randomId: environment?.randomId ?? defaultConversationEnvironment.randomId,\n estimateTokens:\n environment?.estimateTokens ?? defaultConversationEnvironment.estimateTokens,\n plugins: [...(environment?.plugins ?? defaultConversationEnvironment.plugins)],\n };\n}\n\n/**\n * Type guard to distinguish environment objects from message inputs.\n * Returns true if the value has environment functions but no role property.\n */\nexport function isConversationEnvironmentParameter(\n value: unknown,\n): value is Partial<ConversationEnvironment> {\n if (!value || typeof value !== 'object' || value === null) return false;\n if ('role' in (value as Record<string, unknown>)) return false;\n\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate['now'] === 'function' ||\n typeof candidate['randomId'] === 'function' ||\n typeof candidate['estimateTokens'] === 'function' ||\n (Array.isArray(candidate['plugins']) && candidate['plugins'].length > 0)\n );\n}\n\n/**\n * Binds a partial environment to a function that accepts an environment as its last argument.\n */\nexport function withEnvironment<T extends unknown[], R>(\n environment: Partial<ConversationEnvironment>,\n fn: (...args: [...T, Partial<ConversationEnvironment>?]) => R,\n): (...args: T) => R {\n return (...args: T) => fn(...args, environment);\n}\n",
9
+ "/**\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\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",
10
+ "import type {\n Message as ExternalMessage,\n MultiModalContent,\n} from '@lasercat/homogenaize';\n\nimport {\n type ConversationEnvironment,\n isConversationEnvironmentParameter,\n resolveConversationEnvironment,\n} from './environment';\nimport {\n createInvalidPositionError,\n createInvalidToolReferenceError,\n createSerializationError,\n} from './errors';\nimport { copyContent } from './multi-modal';\nimport type {\n Conversation,\n ConversationJSON,\n ConversationStatus,\n Message,\n MessageInput,\n} from './types';\nimport {\n createMessage,\n messageHasImages,\n normalizeContent,\n toReadonly,\n} from './utilities';\n\nexport type { ConversationEnvironment } from './environment';\n\ntype ToolUseIndex = Map<string, { name: string }>;\n\nconst buildToolUseIndex = (messages: ReadonlyArray<Message>): ToolUseIndex =>\n messages.reduce((index, message) => {\n if (message.role === 'tool-use' && message.toolCall) {\n index.set(message.toolCall.id, { name: message.toolCall.name });\n }\n return index;\n }, new Map<string, { name: string }>());\n\nconst registerToolUse = (\n index: ToolUseIndex,\n toolCall: { id: string; name: string },\n): ToolUseIndex => {\n const next = new Map(index);\n next.set(toolCall.id, { name: toolCall.name });\n return next;\n};\n\nconst assertToolReference = (index: ToolUseIndex, callId: string): void => {\n if (!index.has(callId)) {\n throw createInvalidToolReferenceError(callId);\n }\n};\n\nfunction partitionAppendArgs(\n args: Array<MessageInput | Partial<ConversationEnvironment>>,\n): {\n inputs: MessageInput[];\n environment?: Partial<ConversationEnvironment> | undefined;\n} {\n if (args.length === 0) {\n return { inputs: [] };\n }\n\n const last = args[args.length - 1];\n if (isConversationEnvironmentParameter(last)) {\n return {\n inputs: args.slice(0, -1) as MessageInput[],\n environment: last,\n };\n }\n\n return { inputs: args as MessageInput[] };\n}\n\nexport function createConversation(\n options?: {\n id?: string;\n title?: string;\n status?: ConversationStatus;\n metadata?: Record<string, unknown>;\n tags?: string[];\n },\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const conv: Conversation = {\n id: options?.id ?? resolvedEnvironment.randomId(),\n title: options?.title,\n status: options?.status ?? 'active',\n metadata: { ...(options?.metadata ?? {}) },\n tags: [...(options?.tags ?? [])],\n messages: [],\n createdAt: now,\n updatedAt: now,\n };\n return toReadonly(conv);\n}\n\nexport function appendMessages(\n conversation: Conversation,\n ...inputs: MessageInput[]\n): Conversation;\nexport function appendMessages(\n conversation: Conversation,\n ...inputsAndEnvironment: [...MessageInput[], Partial<ConversationEnvironment>]\n): Conversation;\nexport function appendMessages(\n conversation: Conversation,\n ...args: (MessageInput | Partial<ConversationEnvironment>)[]\n): Conversation {\n const { inputs, environment } = partitionAppendArgs(args);\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const startPosition = conversation.messages.length;\n const initialToolUses = buildToolUseIndex(conversation.messages);\n\n const { messages } = inputs.reduce<{\n toolUses: ToolUseIndex;\n messages: Message[];\n }>(\n (state, input, index) => {\n // Apply plugins to the input\n const processedInput = resolvedEnvironment.plugins.reduce(\n (acc, plugin) => plugin(acc),\n input,\n );\n\n if (processedInput.role === 'tool-result' && processedInput.toolResult) {\n assertToolReference(state.toolUses, processedInput.toolResult.callId);\n }\n\n const normalizedContent = normalizeContent(processedInput.content) as\n | string\n | MultiModalContent[];\n\n const message = createMessage({\n id: resolvedEnvironment.randomId(),\n role: processedInput.role,\n content: normalizedContent,\n position: startPosition + index,\n createdAt: now,\n metadata: { ...(processedInput.metadata ?? {}) },\n hidden: processedInput.hidden ?? false,\n toolCall: processedInput.toolCall,\n toolResult: processedInput.toolResult,\n tokenUsage: processedInput.tokenUsage,\n goalCompleted: processedInput.goalCompleted,\n });\n\n const toolUses =\n processedInput.role === 'tool-use' && processedInput.toolCall\n ? registerToolUse(state.toolUses, processedInput.toolCall)\n : state.toolUses;\n\n return {\n toolUses,\n messages: [...state.messages, message],\n };\n },\n { toolUses: initialToolUses, messages: [] },\n );\n\n const next: Conversation = {\n ...conversation,\n messages: [...conversation.messages, ...messages],\n updatedAt: now,\n };\n return toReadonly(next);\n}\n\nexport function appendUserMessage(\n conversation: Conversation,\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n return environment\n ? appendMessages(conversation, { role: 'user', content, metadata }, environment)\n : appendMessages(conversation, { role: 'user', content, metadata });\n}\n\nexport function appendAssistantMessage(\n conversation: Conversation,\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n return environment\n ? appendMessages(conversation, { role: 'assistant', content, metadata }, environment)\n : appendMessages(conversation, { role: 'assistant', content, metadata });\n}\n\nexport function appendSystemMessage(\n conversation: Conversation,\n content: string,\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n return environment\n ? appendMessages(conversation, { role: 'system', content, metadata }, environment)\n : appendMessages(conversation, { role: 'system', content, metadata });\n}\n\nexport function getConversationMessages(\n conversation: Conversation,\n options?: { includeHidden?: boolean },\n): ReadonlyArray<Message> {\n const includeHidden = options?.includeHidden ?? false;\n return includeHidden\n ? [...conversation.messages]\n : conversation.messages.filter((m) => !m.hidden);\n}\n\nexport function getMessageAtPosition(\n conversation: Conversation,\n position: number,\n): Message | undefined {\n return conversation.messages[position];\n}\n\nexport function getMessageByIdentifier(\n conversation: Conversation,\n id: string,\n): Message | undefined {\n return conversation.messages.find((m) => m.id === id);\n}\n\nexport function searchConversationMessages(\n conversation: Conversation,\n predicate: (m: Message) => boolean,\n): Message[] {\n return conversation.messages.filter(predicate);\n}\n\nexport function computeConversationStatistics(conversation: Conversation): {\n total: number;\n byRole: Record<string, number>;\n hidden: number;\n withImages: number;\n} {\n const stats = conversation.messages.reduce(\n (acc, message) => {\n const byRole = {\n ...acc.byRole,\n [message.role]: (acc.byRole[message.role] ?? 0) + 1,\n };\n\n return {\n byRole,\n hidden: acc.hidden + (message.hidden ? 1 : 0),\n withImages: acc.withImages + (messageHasImages(message) ? 1 : 0),\n };\n },\n { byRole: {} as Record<string, number>, hidden: 0, withImages: 0 },\n );\n return { total: conversation.messages.length, ...stats };\n}\n\nexport function hasSystemMessage(conversation: Conversation): boolean {\n return conversation.messages.some((m) => m.role === 'system');\n}\n\nexport function getFirstSystemMessage(conversation: Conversation): Message | undefined {\n return conversation.messages.find((m) => m.role === 'system');\n}\n\nexport function getSystemMessages(conversation: Conversation): ReadonlyArray<Message> {\n return conversation.messages.filter((m) => m.role === 'system');\n}\n\nexport function prependSystemMessage(\n conversation: Conversation,\n content: string,\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const newMessage: Message = createMessage({\n id: resolvedEnvironment.randomId(),\n role: 'system',\n content,\n position: 0,\n createdAt: now,\n metadata: { ...(metadata ?? {}) },\n hidden: false,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const renumberedMessages = conversation.messages.map((message) =>\n createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: message.position + 1,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall,\n toolResult: message.toolResult,\n tokenUsage: message.tokenUsage,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: [newMessage, ...renumberedMessages],\n updatedAt: now,\n });\n}\n\nexport function replaceSystemMessage(\n conversation: Conversation,\n content: string,\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const firstSystemIndex = conversation.messages.findIndex((m) => m.role === 'system');\n\n if (firstSystemIndex === -1) {\n return prependSystemMessage(conversation, content, metadata, resolvedEnvironment);\n }\n\n const original = conversation.messages[firstSystemIndex]!;\n const replaced: Message = createMessage({\n id: original.id,\n role: 'system',\n content,\n position: original.position,\n createdAt: original.createdAt,\n metadata: { ...(metadata ?? original.metadata) },\n hidden: original.hidden,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const messages = conversation.messages.map((message, index) =>\n index === firstSystemIndex ? replaced : message,\n );\n\n const next: Conversation = { ...conversation, messages, updatedAt: now };\n return toReadonly(next);\n}\n\nexport function collapseSystemMessages(\n conversation: Conversation,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const systemMessages = conversation.messages.filter((m) => m.role === 'system');\n\n if (systemMessages.length <= 1) {\n return conversation;\n }\n\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const { parts } = systemMessages.reduce(\n (state, message) => {\n const contentStr =\n typeof message.content === 'string'\n ? message.content\n : message.content\n .map((part) => (part.type === 'text' ? part.text : ''))\n .join('');\n\n if (!contentStr || state.seen.has(contentStr)) {\n return state;\n }\n\n const seen = new Set(state.seen);\n seen.add(contentStr);\n\n return { seen, parts: [...state.parts, contentStr] };\n },\n { seen: new Set<string>(), parts: [] as string[] },\n );\n\n const collapsedContent = parts.join('\\n');\n const firstSystemMsg = systemMessages[0]!;\n\n const collapsed: Message = createMessage({\n id: firstSystemMsg.id,\n role: 'system',\n content: collapsedContent,\n position: firstSystemMsg.position,\n createdAt: firstSystemMsg.createdAt,\n metadata: { ...firstSystemMsg.metadata },\n hidden: firstSystemMsg.hidden,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const systemIdsToRemove = systemMessages.slice(1).reduce((ids, message) => {\n const nextIds = new Set(ids);\n nextIds.add(message.id);\n return nextIds;\n }, new Set<string>());\n\n const messages = conversation.messages\n .filter((m) => !systemIdsToRemove.has(m.id))\n .map((m) => (m.id === firstSystemMsg.id ? collapsed : m));\n\n const renumbered = messages.map((message, index) => {\n if (message.position === index) return message;\n return createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall,\n toolResult: message.toolResult,\n tokenUsage: message.tokenUsage,\n });\n });\n\n const next: Conversation = {\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n };\n return toReadonly(next);\n}\n\nexport function redactMessageAtPosition(\n conversation: Conversation,\n position: number,\n placeholder: string = '[REDACTED]',\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n if (position < 0 || position >= conversation.messages.length) {\n throw createInvalidPositionError(conversation.messages.length - 1, position);\n }\n\n const original = conversation.messages[position]!;\n const redacted: Message = createMessage({\n id: original.id,\n role: original.role,\n content: placeholder,\n position: original.position,\n createdAt: original.createdAt,\n metadata: { ...original.metadata },\n hidden: original.hidden,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const messages = conversation.messages.map((message, index) =>\n index === position ? redacted : message,\n );\n\n const next: Conversation = { ...conversation, messages, updatedAt: now };\n return toReadonly(next);\n}\n\nexport function serializeConversation(conversation: Conversation): ConversationJSON {\n return {\n id: conversation.id,\n title: conversation.title,\n status: conversation.status,\n metadata: { ...conversation.metadata },\n tags: [...conversation.tags],\n messages: conversation.messages.map((m) => ({\n id: m.id,\n role: m.role,\n content: copyContent(m.content),\n position: m.position,\n createdAt: m.createdAt,\n metadata: { ...m.metadata },\n hidden: m.hidden,\n toolCall: m.toolCall ? { ...m.toolCall } : undefined,\n toolResult: m.toolResult ? { ...m.toolResult } : undefined,\n tokenUsage: m.tokenUsage ? { ...m.tokenUsage } : undefined,\n goalCompleted: m.goalCompleted,\n })),\n createdAt: conversation.createdAt,\n updatedAt: conversation.updatedAt,\n };\n}\n\nexport function deserializeConversation(json: ConversationJSON): Conversation {\n try {\n json.messages.reduce<{ toolUses: ToolUseIndex }>(\n (state, message, index) => {\n if (message.position !== index) {\n throw createInvalidPositionError(index, message.position);\n }\n\n if (message.role === 'tool-use' && message.toolCall) {\n return {\n toolUses: registerToolUse(state.toolUses, message.toolCall),\n };\n }\n\n if (message.role === 'tool-result' && message.toolResult) {\n assertToolReference(state.toolUses, message.toolResult.callId);\n }\n\n return state;\n },\n { toolUses: new Map<string, { name: string }>() },\n );\n\n const messages: Message[] = json.messages.map((m) => createMessage(m));\n const conv: Conversation = {\n id: json.id,\n title: json.title,\n status: json.status,\n metadata: { ...json.metadata },\n tags: [...json.tags],\n messages,\n createdAt: json.createdAt,\n updatedAt: json.updatedAt,\n };\n return toReadonly(conv);\n } catch (error) {\n throw createSerializationError(\n `failed to deserialize conversation: ${\n error instanceof Error ? error.message : String(error)\n }`,\n error as Error,\n );\n }\n}\n\nexport function toChatMessages(conversation: Conversation): ExternalMessage[] {\n const roleMap: Record<string, 'user' | 'assistant' | 'system'> = {\n user: 'user',\n assistant: 'assistant',\n system: 'system',\n developer: 'system',\n 'tool-use': 'assistant',\n 'tool-result': 'user',\n snapshot: 'system',\n };\n\n const result: ExternalMessage[] = [];\n for (const message of conversation.messages) {\n if (message.hidden) continue;\n const externalRole = roleMap[message.role] as 'user' | 'assistant' | 'system';\n result.push({\n role: externalRole,\n content: message.content as string | MultiModalContent[],\n });\n }\n return result;\n}\n",
11
+ "import {\n type ConversationEnvironment,\n isConversationEnvironmentParameter,\n resolveConversationEnvironment,\n simpleTokenEstimator,\n} from './environment';\nimport { copyContent } from './multi-modal';\nimport type { Conversation, Message, TokenEstimator } from './types';\nimport { createMessage, toReadonly } from './utilities';\n\nexport { simpleTokenEstimator };\n\n/**\n * Estimates total tokens in a conversation using the provided estimator function.\n * If no estimator is provided, the environment's default estimator is used.\n */\nexport function estimateConversationTokens(\n conversation: Conversation,\n estimateTokens?: TokenEstimator,\n environment?: Partial<ConversationEnvironment>,\n): number {\n let estimator = estimateTokens;\n let env = environment;\n\n if (\n !environment &&\n estimateTokens &&\n isConversationEnvironmentParameter(estimateTokens)\n ) {\n env = estimateTokens;\n estimator = undefined;\n }\n\n const resolvedEnvironment = resolveConversationEnvironment(env);\n const finalEstimator =\n typeof estimator === 'function' ? estimator : resolvedEnvironment.estimateTokens;\n\n return conversation.messages.reduce(\n (total, message) => total + finalEstimator(message),\n 0,\n );\n}\n\n/**\n * Options for truncateToTokenLimit.\n */\nexport interface TruncateOptions {\n estimateTokens?: TokenEstimator;\n preserveSystemMessages?: boolean;\n preserveLastN?: number;\n}\n\n/**\n * Truncates conversation to fit within an estimated token limit.\n * Removes oldest messages first while preserving system messages and optionally the last N messages.\n * If no estimator is provided, the environment's default estimator is used.\n */\nexport function truncateToTokenLimit(\n conversation: Conversation,\n maxTokens: number,\n optionsOrEstimator?: TruncateOptions | TokenEstimator,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n // Handle overloaded arguments\n let options: TruncateOptions = {};\n let env = environment;\n\n if (typeof optionsOrEstimator === 'function') {\n options = { estimateTokens: optionsOrEstimator };\n } else if (optionsOrEstimator) {\n // If environment was not explicitly passed, check if optionsOrEstimator IS the environment\n if (!environment && isConversationEnvironmentParameter(optionsOrEstimator)) {\n // Disambiguate between TruncateOptions and ConversationEnvironment.\n // Environment fields (now, randomId, non-empty plugins) take priority because they're\n // exclusive to ConversationEnvironment, while estimateTokens exists in both types.\n const candidate = optionsOrEstimator as Record<string, unknown>;\n const hasEnvFields = !!(\n candidate['now'] ||\n candidate['randomId'] ||\n (Array.isArray(candidate['plugins']) && candidate['plugins'].length > 0)\n );\n\n if (hasEnvFields) {\n // Treat as environment, not options\n env = optionsOrEstimator;\n } else {\n // Has estimateTokens but no exclusive environment fields, treat as options\n options = optionsOrEstimator;\n }\n } else {\n options = optionsOrEstimator;\n }\n }\n\n const resolvedEnvironment = resolveConversationEnvironment(env);\n const estimator = options.estimateTokens ?? resolvedEnvironment.estimateTokens;\n const preserveSystem = options.preserveSystemMessages ?? true;\n const preserveLastN = options.preserveLastN ?? 0;\n\n // Calculate current token count\n const currentTokens = estimateConversationTokens(\n conversation,\n estimator,\n resolvedEnvironment,\n );\n if (currentTokens <= maxTokens) {\n return conversation;\n }\n\n const now = resolvedEnvironment.now();\n\n // Separate messages into categories\n const systemMessages = preserveSystem\n ? conversation.messages.filter((m) => m.role === 'system')\n : [];\n\n const nonSystemMessages = conversation.messages.filter((m) => m.role !== 'system');\n\n // Preserve the last N non-system messages\n const protectedMessages =\n preserveLastN > 0 ? nonSystemMessages.slice(-preserveLastN) : [];\n\n const removableMessages =\n preserveLastN > 0 ? nonSystemMessages.slice(0, -preserveLastN) : nonSystemMessages;\n\n // Calculate tokens for protected content\n const systemTokens = systemMessages.reduce((sum, m) => sum + estimator(m), 0);\n const protectedTokens = protectedMessages.reduce((sum, m) => sum + estimator(m), 0);\n const availableTokens = maxTokens - systemTokens - protectedTokens;\n\n if (availableTokens <= 0) {\n // Can only fit system and protected messages\n const allMessages = [...systemMessages, ...protectedMessages];\n const renumbered = allMessages.map((message, index) =>\n createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n });\n }\n\n // Keep as many removable messages as possible, starting from the end (most recent)\n const keptRemovable: Message[] = [];\n let usedTokens = 0;\n\n for (let i = removableMessages.length - 1; i >= 0; i--) {\n const message = removableMessages[i]!;\n const messageTokens = estimator(message);\n if (usedTokens + messageTokens <= availableTokens) {\n keptRemovable.unshift(message);\n usedTokens += messageTokens;\n } else {\n break;\n }\n }\n\n // Combine: system messages + kept removable + protected\n const allMessages = [...systemMessages, ...keptRemovable, ...protectedMessages];\n\n // Sort by original position then renumber\n allMessages.sort((a, b) => a.position - b.position);\n\n const renumbered = allMessages.map((message, index) =>\n createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n });\n}\n\n/**\n * Returns the last N messages from the conversation.\n * By default excludes system messages and hidden messages.\n */\nexport function getRecentMessages(\n conversation: Conversation,\n count: number,\n options?: {\n includeHidden?: boolean;\n includeSystem?: boolean;\n },\n): ReadonlyArray<Message> {\n const includeHidden = options?.includeHidden ?? false;\n const includeSystem = options?.includeSystem ?? false;\n\n const filtered = conversation.messages.filter((m) => {\n if (!includeHidden && m.hidden) return false;\n if (!includeSystem && m.role === 'system') return false;\n return true;\n });\n\n return filtered.slice(-count);\n}\n\n/**\n * Truncates conversation to keep only messages from the specified position onwards.\n * Optionally preserves system messages regardless of position.\n */\nexport function truncateFromPosition(\n conversation: Conversation,\n position: number,\n options?: {\n preserveSystemMessages?: boolean;\n },\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const preserveSystem = options?.preserveSystemMessages ?? true;\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const systemMessages = preserveSystem\n ? conversation.messages.filter((m) => m.role === 'system' && m.position < position)\n : [];\n\n const keptMessages = conversation.messages.filter((m) => m.position >= position);\n const allMessages = [...systemMessages, ...keptMessages];\n\n // Renumber positions\n const renumbered = allMessages.map((message, index) =>\n createMessage({\n id: message.id,\n role: message.role,\n content: copyContent(message.content),\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages: renumbered,\n updatedAt: now,\n });\n}\n",
12
12
  "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport {\n type ConversationEnvironment,\n resolveConversationEnvironment,\n} from './environment';\nimport type { Conversation, Message, TokenUsage } from './types';\nimport { createMessage, toReadonly } from './utilities';\n\nconst STREAMING_KEY = '__streaming';\n\n/**\n * Checks if a message is currently streaming (has the streaming metadata flag).\n */\nexport function isStreamingMessage(message: Message): boolean {\n return message.metadata[STREAMING_KEY] === true;\n}\n\n/**\n * Gets the currently streaming message from a conversation, if any.\n */\nexport function getStreamingMessage(conversation: Conversation): Message | undefined {\n return conversation.messages.find(isStreamingMessage);\n}\n\n/**\n * Creates a pending/streaming message placeholder and appends it to the conversation.\n * Returns both the updated conversation and the ID of the new streaming message.\n */\nexport function appendStreamingMessage(\n conversation: Conversation,\n role: 'assistant' | 'user',\n metadata?: Record<string, unknown>,\n environment?: Partial<ConversationEnvironment>,\n): { conversation: Conversation; messageId: string } {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n const messageId = resolvedEnvironment.randomId();\n\n const newMessage = createMessage({\n id: messageId,\n role,\n content: '',\n position: conversation.messages.length,\n createdAt: now,\n metadata: { ...(metadata ?? {}), [STREAMING_KEY]: true },\n hidden: false,\n toolCall: undefined,\n toolResult: undefined,\n tokenUsage: undefined,\n });\n\n const updatedConversation = toReadonly({\n ...conversation,\n messages: [...conversation.messages, newMessage],\n updatedAt: now,\n });\n\n return { conversation: updatedConversation, messageId };\n}\n\n/**\n * Updates the content of a streaming message.\n * This replaces the existing content (use for accumulating streamed tokens).\n */\nexport function updateStreamingMessage(\n conversation: Conversation,\n messageId: string,\n content: string | MultiModalContent[],\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const messageIndex = conversation.messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n return conversation;\n }\n\n const original = conversation.messages[messageIndex]!;\n const updated = createMessage({\n id: original.id,\n role: original.role,\n content: typeof content === 'string' ? content : [...content],\n position: original.position,\n createdAt: original.createdAt,\n metadata: { ...original.metadata },\n hidden: original.hidden,\n toolCall: original.toolCall ? { ...original.toolCall } : undefined,\n toolResult: original.toolResult ? { ...original.toolResult } : undefined,\n tokenUsage: original.tokenUsage ? { ...original.tokenUsage } : undefined,\n goalCompleted: original.goalCompleted,\n });\n\n const messages = conversation.messages.map((m, i) =>\n i === messageIndex ? updated : m,\n );\n\n return toReadonly({\n ...conversation,\n messages,\n updatedAt: now,\n });\n}\n\n/**\n * Marks a streaming message as complete, removing the streaming flag.\n * Optionally adds token usage and additional metadata.\n */\nexport function finalizeStreamingMessage(\n conversation: Conversation,\n messageId: string,\n options?: {\n tokenUsage?: TokenUsage;\n metadata?: Record<string, unknown>;\n },\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const messageIndex = conversation.messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n return conversation;\n }\n\n const original = conversation.messages[messageIndex]!;\n\n // Remove the streaming flag and merge in any new metadata\n const { [STREAMING_KEY]: _, ...restMetadata } = original.metadata as Record<\n string,\n unknown\n >;\n const finalMetadata = { ...restMetadata, ...(options?.metadata ?? {}) };\n\n const updated = createMessage({\n id: original.id,\n role: original.role,\n content:\n typeof original.content === 'string'\n ? original.content\n : [...(original.content as MultiModalContent[])],\n position: original.position,\n createdAt: original.createdAt,\n metadata: finalMetadata,\n hidden: original.hidden,\n toolCall: original.toolCall ? { ...original.toolCall } : undefined,\n toolResult: original.toolResult ? { ...original.toolResult } : undefined,\n tokenUsage: options?.tokenUsage ? { ...options.tokenUsage } : undefined,\n goalCompleted: original.goalCompleted,\n });\n\n const messages = conversation.messages.map((m, i) =>\n i === messageIndex ? updated : m,\n );\n\n return toReadonly({\n ...conversation,\n messages,\n updatedAt: now,\n });\n}\n\n/**\n * Cancels a streaming message by removing it from the conversation.\n */\nexport function cancelStreamingMessage(\n conversation: Conversation,\n messageId: string,\n environment?: Partial<ConversationEnvironment>,\n): Conversation {\n const resolvedEnvironment = resolveConversationEnvironment(environment);\n const now = resolvedEnvironment.now();\n\n const messageIndex = conversation.messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) {\n return conversation;\n }\n\n const messages = conversation.messages\n .filter((m) => m.id !== messageId)\n .map((message, index) =>\n message.position === index\n ? message\n : createMessage({\n id: message.id,\n role: message.role,\n content:\n typeof message.content === 'string'\n ? message.content\n : [...(message.content as MultiModalContent[])],\n position: index,\n createdAt: message.createdAt,\n metadata: { ...message.metadata },\n hidden: message.hidden,\n toolCall: message.toolCall ? { ...message.toolCall } : undefined,\n toolResult: message.toolResult ? { ...message.toolResult } : undefined,\n tokenUsage: message.tokenUsage ? { ...message.tokenUsage } : undefined,\n goalCompleted: message.goalCompleted,\n }),\n );\n\n return toReadonly({\n ...conversation,\n messages,\n updatedAt: now,\n });\n}\n",
13
- "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport { truncateFromPosition, truncateToTokenLimit } from './context';\nimport {\n appendAssistantMessage,\n appendMessages,\n appendSystemMessage,\n appendUserMessage,\n collapseSystemMessages,\n prependSystemMessage,\n redactMessageAtPosition,\n replaceSystemMessage,\n} from './conversation';\nimport {\n appendStreamingMessage,\n cancelStreamingMessage,\n finalizeStreamingMessage,\n updateStreamingMessage,\n} from './streaming';\nimport type { Conversation, Message, MessageInput, TokenUsage } from './types';\n\n/**\n * A mutable draft wrapper around a conversation.\n * Methods return the draft for chaining and mutate the internal state.\n *\n * @example\n * ```ts\n * const result = withConversation(conversation, (draft) => {\n * draft\n * .appendSystemMessage('You are helpful.')\n * .appendUserMessage('Hello!')\n * .appendAssistantMessage('Hi there!');\n * });\n * ```\n */\nexport interface ConversationDraft {\n /** The current immutable conversation value. */\n readonly value: Conversation;\n\n /**\n * Appends one or more messages to the conversation.\n * @param inputs - Message inputs to append.\n */\n appendMessages: (...inputs: MessageInput[]) => ConversationDraft;\n\n /**\n * Appends a user message to the conversation.\n * @param content - Text or multi-modal content.\n * @param metadata - Optional metadata to attach to the message.\n */\n appendUserMessage: (\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Appends an assistant message to the conversation.\n * @param content - Text or multi-modal content.\n * @param metadata - Optional metadata to attach to the message.\n */\n appendAssistantMessage: (\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Appends a system message to the conversation.\n * @param content - The system message content.\n * @param metadata - Optional metadata to attach to the message.\n */\n appendSystemMessage: (\n content: string,\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Prepends a system message at position 0, renumbering existing messages.\n * @param content - The system message content.\n * @param metadata - Optional metadata to attach to the message.\n */\n prependSystemMessage: (\n content: string,\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Replaces the first system message, or prepends if none exists.\n * @param content - The new system message content.\n * @param metadata - Optional metadata (uses original if not provided).\n */\n replaceSystemMessage: (\n content: string,\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Collapses all system messages into the first one, deduplicating content.\n */\n collapseSystemMessages: () => ConversationDraft;\n\n /**\n * Redacts a message at the given position, replacing its content.\n * @param position - The message position to redact.\n * @param placeholder - Replacement text (default: '[REDACTED]').\n */\n redactMessageAtPosition: (position: number, placeholder?: string) => ConversationDraft;\n\n /**\n * Appends a streaming message placeholder.\n * Returns the draft and the new message ID for subsequent updates.\n * @param role - The role of the streaming message ('assistant' or 'user').\n * @param metadata - Optional metadata to attach to the message.\n */\n appendStreamingMessage: (\n role: 'assistant' | 'user',\n metadata?: Record<string, unknown>,\n ) => { draft: ConversationDraft; messageId: string };\n\n /**\n * Updates the content of a streaming message.\n * @param messageId - The ID of the streaming message to update.\n * @param content - The new content (replaces existing content).\n */\n updateStreamingMessage: (\n messageId: string,\n content: string | MultiModalContent[],\n ) => ConversationDraft;\n\n /**\n * Finalizes a streaming message, removing the streaming flag.\n * @param messageId - The ID of the streaming message to finalize.\n * @param options - Optional token usage and additional metadata.\n */\n finalizeStreamingMessage: (\n messageId: string,\n options?: { tokenUsage?: TokenUsage; metadata?: Record<string, unknown> },\n ) => ConversationDraft;\n\n /**\n * Cancels a streaming message by removing it from the conversation.\n * @param messageId - The ID of the streaming message to cancel.\n */\n cancelStreamingMessage: (messageId: string) => ConversationDraft;\n\n /**\n * Truncates the conversation to keep only messages from position onwards.\n * @param position - The starting position to keep.\n * @param options - Options for preserving system messages.\n */\n truncateFromPosition: (\n position: number,\n options?: { preserveSystemMessages?: boolean },\n ) => ConversationDraft;\n\n /**\n * Truncates the conversation to fit within a token limit.\n * Removes oldest messages first while preserving system messages and optionally the last N messages.\n * @param maxTokens - Maximum token count to target.\n * @param estimateTokens - Function to estimate tokens per message.\n * @param options - Options for preserving system messages and last N messages.\n */\n truncateToTokenLimit: (\n maxTokens: number,\n estimateTokens: (message: Message) => number,\n options?: { preserveSystemMessages?: boolean; preserveLastN?: number },\n ) => ConversationDraft;\n}\n\n/**\n * Creates a mutable draft wrapper around a conversation.\n */\nfunction createDraft(initial: Conversation): ConversationDraft {\n let current = initial;\n\n const draft: ConversationDraft = {\n get value() {\n return current;\n },\n\n // Message appending\n appendMessages: (...inputs: MessageInput[]) => {\n current = appendMessages(current, ...inputs);\n return draft;\n },\n appendUserMessage: (content, metadata) => {\n current = appendUserMessage(current, content, metadata);\n return draft;\n },\n appendAssistantMessage: (content, metadata) => {\n current = appendAssistantMessage(current, content, metadata);\n return draft;\n },\n appendSystemMessage: (content, metadata) => {\n current = appendSystemMessage(current, content, metadata);\n return draft;\n },\n\n // System message management\n prependSystemMessage: (content, metadata) => {\n current = prependSystemMessage(current, content, metadata);\n return draft;\n },\n replaceSystemMessage: (content, metadata) => {\n current = replaceSystemMessage(current, content, metadata);\n return draft;\n },\n collapseSystemMessages: () => {\n current = collapseSystemMessages(current);\n return draft;\n },\n\n // Message modification\n redactMessageAtPosition: (position, placeholder) => {\n current = redactMessageAtPosition(current, position, placeholder);\n return draft;\n },\n\n // Streaming support\n appendStreamingMessage: (role, metadata) => {\n const result = appendStreamingMessage(current, role, metadata);\n current = result.conversation;\n return { draft, messageId: result.messageId };\n },\n updateStreamingMessage: (messageId, content) => {\n current = updateStreamingMessage(current, messageId, content);\n return draft;\n },\n finalizeStreamingMessage: (messageId, options) => {\n current = finalizeStreamingMessage(current, messageId, options);\n return draft;\n },\n cancelStreamingMessage: (messageId) => {\n current = cancelStreamingMessage(current, messageId);\n return draft;\n },\n\n // Context window management\n truncateFromPosition: (position, options) => {\n current = truncateFromPosition(current, position, options);\n return draft;\n },\n truncateToTokenLimit: (maxTokens, estimateTokens, options) => {\n current = truncateToTokenLimit(current, maxTokens, estimateTokens, options);\n return draft;\n },\n };\n\n return draft;\n}\n\n/**\n * Executes a function with a mutable draft and returns the final conversation.\n * Supports both synchronous and asynchronous operations.\n */\nexport function withConversation(\n conversation: Conversation,\n fn: (draft: ConversationDraft) => void | Promise<void>,\n): Conversation | Promise<Conversation> {\n const draft = createDraft(conversation);\n const maybePromise = fn(draft);\n if (\n maybePromise &&\n typeof (maybePromise as unknown) === 'object' &&\n typeof maybePromise.then === 'function'\n ) {\n return maybePromise.then(() => draft.value);\n }\n return draft.value;\n}\n\n/**\n * Applies a series of transformation functions to a conversation.\n * Each function receives the result of the previous one.\n */\nexport function pipeConversation(\n conversation: Conversation,\n ...fns: Array<(conversation: Conversation) => Conversation>\n): Conversation {\n return fns.reduce((current, fn) => fn(current), conversation);\n}\n"
13
+ "import type { MultiModalContent } from '@lasercat/homogenaize';\n\nimport { truncateFromPosition, truncateToTokenLimit } from './context';\nimport {\n appendAssistantMessage,\n appendMessages,\n appendSystemMessage,\n appendUserMessage,\n collapseSystemMessages,\n prependSystemMessage,\n redactMessageAtPosition,\n replaceSystemMessage,\n} from './conversation';\nimport {\n appendStreamingMessage,\n cancelStreamingMessage,\n finalizeStreamingMessage,\n updateStreamingMessage,\n} from './streaming';\nimport type { Conversation, Message, MessageInput, TokenUsage } from './types';\n\n/**\n * A mutable draft wrapper around a conversation.\n * Methods return the draft for chaining and mutate the internal state.\n *\n * @example\n * ```ts\n * const result = withConversation(conversation, (draft) => {\n * draft\n * .appendSystemMessage('You are helpful.')\n * .appendUserMessage('Hello!')\n * .appendAssistantMessage('Hi there!');\n * });\n * ```\n */\nexport interface ConversationDraft {\n /** The current immutable conversation value. */\n readonly value: Conversation;\n\n /**\n * Appends one or more messages to the conversation.\n * @param inputs - Message inputs to append.\n */\n appendMessages: (...inputs: MessageInput[]) => ConversationDraft;\n\n /**\n * Appends a user message to the conversation.\n * @param content - Text or multi-modal content.\n * @param metadata - Optional metadata to attach to the message.\n */\n appendUserMessage: (\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Appends an assistant message to the conversation.\n * @param content - Text or multi-modal content.\n * @param metadata - Optional metadata to attach to the message.\n */\n appendAssistantMessage: (\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Appends a system message to the conversation.\n * @param content - The system message content.\n * @param metadata - Optional metadata to attach to the message.\n */\n appendSystemMessage: (\n content: string,\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Prepends a system message at position 0, renumbering existing messages.\n * @param content - The system message content.\n * @param metadata - Optional metadata to attach to the message.\n */\n prependSystemMessage: (\n content: string,\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Replaces the first system message, or prepends if none exists.\n * @param content - The new system message content.\n * @param metadata - Optional metadata (uses original if not provided).\n */\n replaceSystemMessage: (\n content: string,\n metadata?: Record<string, unknown>,\n ) => ConversationDraft;\n\n /**\n * Collapses all system messages into the first one, deduplicating content.\n */\n collapseSystemMessages: () => ConversationDraft;\n\n /**\n * Redacts a message at the given position, replacing its content.\n * @param position - The message position to redact.\n * @param placeholder - Replacement text (default: '[REDACTED]').\n */\n redactMessageAtPosition: (position: number, placeholder?: string) => ConversationDraft;\n\n /**\n * Appends a streaming message placeholder.\n * Returns the draft and the new message ID for subsequent updates.\n * @param role - The role of the streaming message ('assistant' or 'user').\n * @param metadata - Optional metadata to attach to the message.\n */\n appendStreamingMessage: (\n role: 'assistant' | 'user',\n metadata?: Record<string, unknown>,\n ) => { draft: ConversationDraft; messageId: string };\n\n /**\n * Updates the content of a streaming message.\n * @param messageId - The ID of the streaming message to update.\n * @param content - The new content (replaces existing content).\n */\n updateStreamingMessage: (\n messageId: string,\n content: string | MultiModalContent[],\n ) => ConversationDraft;\n\n /**\n * Finalizes a streaming message, removing the streaming flag.\n * @param messageId - The ID of the streaming message to finalize.\n * @param options - Optional token usage and additional metadata.\n */\n finalizeStreamingMessage: (\n messageId: string,\n options?: { tokenUsage?: TokenUsage; metadata?: Record<string, unknown> },\n ) => ConversationDraft;\n\n /**\n * Cancels a streaming message by removing it from the conversation.\n * @param messageId - The ID of the streaming message to cancel.\n */\n cancelStreamingMessage: (messageId: string) => ConversationDraft;\n\n /**\n * Truncates the conversation to keep only messages from position onwards.\n * @param position - The starting position to keep.\n * @param options - Options for preserving system messages.\n */\n truncateFromPosition: (\n position: number,\n options?: { preserveSystemMessages?: boolean },\n ) => ConversationDraft;\n\n /**\n * Truncates the conversation to fit within a token limit.\n * Removes oldest messages first while preserving system messages and optionally the last N messages.\n * @param maxTokens - Maximum token count to target.\n * @param options - Options for estimation and preservation.\n */\n truncateToTokenLimit: (\n maxTokens: number,\n options?: {\n estimateTokens?: (message: Message) => number;\n preserveSystemMessages?: boolean;\n preserveLastN?: number;\n },\n ) => ConversationDraft;\n}\n\n/**\n * Creates a mutable draft wrapper around a conversation.\n */\nfunction createDraft(initial: Conversation): ConversationDraft {\n let current = initial;\n\n const draft: ConversationDraft = {\n get value() {\n return current;\n },\n\n // Message appending\n appendMessages: (...inputs: MessageInput[]) => {\n current = appendMessages(current, ...inputs);\n return draft;\n },\n appendUserMessage: (content, metadata) => {\n current = appendUserMessage(current, content, metadata);\n return draft;\n },\n appendAssistantMessage: (content, metadata) => {\n current = appendAssistantMessage(current, content, metadata);\n return draft;\n },\n appendSystemMessage: (content, metadata) => {\n current = appendSystemMessage(current, content, metadata);\n return draft;\n },\n\n // System message management\n prependSystemMessage: (content, metadata) => {\n current = prependSystemMessage(current, content, metadata);\n return draft;\n },\n replaceSystemMessage: (content, metadata) => {\n current = replaceSystemMessage(current, content, metadata);\n return draft;\n },\n collapseSystemMessages: () => {\n current = collapseSystemMessages(current);\n return draft;\n },\n\n // Message modification\n redactMessageAtPosition: (position, placeholder) => {\n current = redactMessageAtPosition(current, position, placeholder);\n return draft;\n },\n\n // Streaming support\n appendStreamingMessage: (role, metadata) => {\n const result = appendStreamingMessage(current, role, metadata);\n current = result.conversation;\n return { draft, messageId: result.messageId };\n },\n updateStreamingMessage: (messageId, content) => {\n current = updateStreamingMessage(current, messageId, content);\n return draft;\n },\n finalizeStreamingMessage: (messageId, options) => {\n current = finalizeStreamingMessage(current, messageId, options);\n return draft;\n },\n cancelStreamingMessage: (messageId) => {\n current = cancelStreamingMessage(current, messageId);\n return draft;\n },\n\n // Context window management\n truncateFromPosition: (position, options) => {\n current = truncateFromPosition(current, position, options);\n return draft;\n },\n truncateToTokenLimit: (maxTokens, options) => {\n current = truncateToTokenLimit(current, maxTokens, options);\n return draft;\n },\n };\n\n return draft;\n}\n\n/**\n * Executes a function with a mutable draft and returns the final conversation.\n * Supports both synchronous and asynchronous operations.\n */\nexport function withConversation(\n conversation: Conversation,\n fn: (draft: ConversationDraft) => void | Promise<void>,\n): Conversation | Promise<Conversation> {\n const draft = createDraft(conversation);\n const maybePromise = fn(draft);\n if (\n maybePromise &&\n typeof (maybePromise as unknown) === 'object' &&\n typeof maybePromise.then === 'function'\n ) {\n return maybePromise.then(() => draft.value);\n }\n return draft.value;\n}\n\n/**\n * Applies a series of transformation functions to a conversation.\n * Each function receives the result of the previous one.\n */\nexport function pipeConversation(\n conversation: Conversation,\n ...fns: Array<(conversation: Conversation) => Conversation>\n): Conversation {\n return fns.reduce((current, fn) => fn(current), conversation);\n}\n",
14
+ "import {\n estimateConversationTokens,\n getRecentMessages,\n truncateFromPosition,\n type TruncateOptions,\n truncateToTokenLimit,\n} from './context';\nimport {\n appendAssistantMessage,\n appendMessages,\n appendSystemMessage,\n appendUserMessage,\n collapseSystemMessages,\n computeConversationStatistics,\n deserializeConversation,\n getConversationMessages,\n getFirstSystemMessage,\n getMessageAtPosition,\n getMessageByIdentifier,\n getSystemMessages,\n hasSystemMessage,\n prependSystemMessage,\n redactMessageAtPosition,\n replaceSystemMessage,\n searchConversationMessages,\n serializeConversation,\n toChatMessages,\n} from './conversation';\nimport {\n type ConversationEnvironment,\n resolveConversationEnvironment,\n} from './environment';\nimport {\n appendStreamingMessage,\n cancelStreamingMessage,\n finalizeStreamingMessage,\n getStreamingMessage,\n updateStreamingMessage,\n} from './streaming';\nimport type {\n Conversation,\n ConversationHistoryJSON,\n HistoryNodeJSON,\n Message,\n MessageInput,\n TokenUsage,\n} from './types';\n\n/**\n * Event detail for conversation history changes.\n */\nexport interface ConversationHistoryEventDetail {\n type: string;\n conversation: Conversation;\n}\n\n/**\n * Custom event emitted by ConversationHistory.\n */\nexport class ConversationHistoryEvent extends CustomEvent<ConversationHistoryEventDetail> {\n constructor(type: string, detail: ConversationHistoryEventDetail) {\n super(type, { detail });\n }\n}\n\ninterface HistoryNode {\n conversation: Conversation;\n parent: HistoryNode | null;\n children: HistoryNode[];\n}\n\n/**\n * Manages a stack of conversation versions to support undo, redo, and branching.\n */\nexport class ConversationHistory extends EventTarget {\n private currentNode: HistoryNode;\n private environment: ConversationEnvironment;\n\n constructor(initial: Conversation, environment?: Partial<ConversationEnvironment>) {\n super();\n this.environment = resolveConversationEnvironment(environment);\n this.currentNode = {\n conversation: initial,\n parent: null,\n children: [],\n };\n }\n\n /**\n * Dispatches a change event.\n */\n private notifyChange(type: string): void {\n const detail: ConversationHistoryEventDetail = {\n type,\n conversation: this.current,\n };\n this.dispatchEvent(new ConversationHistoryEvent('change', detail));\n this.dispatchEvent(new ConversationHistoryEvent(type, detail));\n }\n\n /**\n * Overrides addEventListener to optionally return an unsubscribe function.\n * This is a convenience for modern frontend frameworks.\n */\n override addEventListener(\n type: string,\n callback:\n | ((event: ConversationHistoryEvent) => void)\n | EventListenerOrEventListenerObject\n | null,\n options?: boolean | AddEventListenerOptions,\n ): void | (() => void) {\n if (!callback) return;\n super.addEventListener(type, callback as EventListenerOrEventListenerObject, options);\n const unsubscribe = () =>\n this.removeEventListener(\n type,\n callback as EventListenerOrEventListenerObject,\n options,\n );\n return unsubscribe;\n }\n\n /**\n * Subscribes to conversation changes.\n * This follows the Svelte store contract, making ConversationHistory a valid Svelte store.\n * @param run - Callback called with the current conversation whenever it changes.\n * @returns An unsubscribe function.\n */\n subscribe(run: (value: Conversation) => void): () => void {\n // Call immediately with current value (Svelte store contract)\n run(this.current);\n\n const handler = (event: Event) => {\n if (event instanceof ConversationHistoryEvent) {\n run(event.detail.conversation);\n }\n };\n\n const unsubscribe = this.addEventListener(\n 'change',\n handler as (event: ConversationHistoryEvent) => void,\n );\n return (unsubscribe as () => void) || (() => {});\n }\n\n /**\n * Returns the current conversation.\n * Useful for useSyncExternalStore in React.\n */\n getSnapshot(): Conversation {\n return this.current;\n }\n\n /**\n * The current conversation state.\n */\n get current(): Conversation {\n return this.currentNode.conversation;\n }\n\n /**\n * Whether an undo operation is possible.\n */\n get canUndo(): boolean {\n return this.currentNode.parent !== null;\n }\n\n /**\n * Whether a redo operation is possible.\n */\n get canRedo(): boolean {\n return this.currentNode.children.length > 0;\n }\n\n /**\n * Returns the environment associated with this history.\n */\n get env(): ConversationEnvironment {\n return this.environment;\n }\n\n /**\n * Returns the number of branches available at the current level.\n */\n get branchCount(): number {\n return this.currentNode.parent ? this.currentNode.parent.children.length : 1;\n }\n\n /**\n * Returns the index of the current branch at this level.\n */\n get branchIndex(): number {\n if (!this.currentNode.parent) return 0;\n return this.currentNode.parent.children.indexOf(this.currentNode);\n }\n\n /**\n * Returns the number of alternate paths available from the current state.\n */\n get redoCount(): number {\n return this.currentNode.children.length;\n }\n\n /**\n * Pushes a new conversation state onto the history.\n * If the current state is not a leaf, a new branch is created.\n */\n push(next: Conversation): void {\n const newNode: HistoryNode = {\n conversation: next,\n parent: this.currentNode,\n children: [],\n };\n this.currentNode.children.push(newNode);\n this.currentNode = newNode;\n this.notifyChange('push');\n }\n\n /**\n * Reverts to the previous conversation state.\n * @returns The conversation state after undo, or undefined if not possible.\n */\n undo(): Conversation | undefined {\n if (this.currentNode.parent) {\n this.currentNode = this.currentNode.parent;\n this.notifyChange('undo');\n return this.current;\n }\n return undefined;\n }\n\n /**\n * Advances to the next conversation state.\n * @param childIndex - The index of the branch to follow (default: 0).\n * @returns The conversation state after redo, or undefined if not possible.\n */\n redo(childIndex: number = 0): Conversation | undefined {\n const next = this.currentNode.children[childIndex];\n if (next) {\n this.currentNode = next;\n this.notifyChange('redo');\n return this.current;\n }\n return undefined;\n }\n\n /**\n * Switches to a different branch at the current level.\n * @param index - The index of the sibling branch to switch to.\n * @returns The new conversation state, or undefined if not possible.\n */\n switchToBranch(index: number): Conversation | undefined {\n if (this.currentNode.parent) {\n const target = this.currentNode.parent.children[index];\n if (target) {\n this.currentNode = target;\n this.notifyChange('switch');\n return this.current;\n }\n }\n return undefined;\n }\n\n /**\n * Returns the sequence of conversations from root to current.\n */\n getPath(): Conversation[] {\n const path: Conversation[] = [];\n let curr: HistoryNode | null = this.currentNode;\n while (curr) {\n path.unshift(curr.conversation);\n curr = curr.parent;\n }\n return path;\n }\n\n // --- QUERY METHODS ---\n\n getMessages(options?: { includeHidden?: boolean }): ReadonlyArray<Message> {\n return getConversationMessages(this.current, options);\n }\n\n getMessageAtPosition(position: number): Message | undefined {\n return getMessageAtPosition(this.current, position);\n }\n\n getMessageByIdentifier(id: string): Message | undefined {\n return getMessageByIdentifier(this.current, id);\n }\n\n searchMessages(predicate: (m: Message) => boolean): Message[] {\n return searchConversationMessages(this.current, predicate);\n }\n\n getStatistics() {\n return computeConversationStatistics(this.current);\n }\n\n hasSystemMessage(): boolean {\n return hasSystemMessage(this.current);\n }\n\n getFirstSystemMessage(): Message | undefined {\n return getFirstSystemMessage(this.current);\n }\n\n getSystemMessages(): ReadonlyArray<Message> {\n return getSystemMessages(this.current);\n }\n\n serialize() {\n return serializeConversation(this.current);\n }\n\n toChatMessages() {\n return toChatMessages(this.current);\n }\n\n estimateTokens(estimator?: (message: Message) => number): number {\n return estimateConversationTokens(this.current, estimator, this.env);\n }\n\n getRecentMessages(\n count: number,\n options?: { includeHidden?: boolean; includeSystem?: boolean },\n ): ReadonlyArray<Message> {\n return getRecentMessages(this.current, count, options);\n }\n\n getStreamingMessage(): Message | undefined {\n return getStreamingMessage(this.current);\n }\n\n // --- MUTATION METHODS ---\n\n appendMessages(...inputs: MessageInput[]): void {\n this.push(appendMessages(this.current, ...inputs, this.env));\n }\n\n appendUserMessage(\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n ): void {\n this.push(appendUserMessage(this.current, content, metadata, this.env));\n }\n\n appendAssistantMessage(\n content: MessageInput['content'],\n metadata?: Record<string, unknown>,\n ): void {\n this.push(appendAssistantMessage(this.current, content, metadata, this.env));\n }\n\n appendSystemMessage(content: string, metadata?: Record<string, unknown>): void {\n this.push(appendSystemMessage(this.current, content, metadata, this.env));\n }\n\n prependSystemMessage(content: string, metadata?: Record<string, unknown>): void {\n this.push(prependSystemMessage(this.current, content, metadata, this.env));\n }\n\n replaceSystemMessage(content: string, metadata?: Record<string, unknown>): void {\n this.push(replaceSystemMessage(this.current, content, metadata, this.env));\n }\n\n collapseSystemMessages(): void {\n this.push(collapseSystemMessages(this.current, this.env));\n }\n\n redactMessageAtPosition(position: number, placeholder?: string): void {\n this.push(redactMessageAtPosition(this.current, position, placeholder, this.env));\n }\n\n truncateFromPosition(\n position: number,\n options?: { preserveSystemMessages?: boolean },\n ): void {\n this.push(truncateFromPosition(this.current, position, options, this.env));\n }\n\n truncateToTokenLimit(maxTokens: number, options?: TruncateOptions): void {\n this.push(truncateToTokenLimit(this.current, maxTokens, options, this.env));\n }\n\n appendStreamingMessage(\n role: 'assistant' | 'user',\n metadata?: Record<string, unknown>,\n ): string {\n const { conversation, messageId } = appendStreamingMessage(\n this.current,\n role,\n metadata,\n this.env,\n );\n this.push(conversation);\n return messageId;\n }\n\n updateStreamingMessage(messageId: string, content: string): void {\n this.push(updateStreamingMessage(this.current, messageId, content, this.env));\n }\n\n finalizeStreamingMessage(\n messageId: string,\n options?: { tokenUsage?: TokenUsage; metadata?: Record<string, unknown> },\n ): void {\n this.push(finalizeStreamingMessage(this.current, messageId, options, this.env));\n }\n\n cancelStreamingMessage(messageId: string): void {\n this.push(cancelStreamingMessage(this.current, messageId, this.env));\n }\n\n /**\n * Serializes the entire history tree and current state to JSON.\n */\n toJSON(): ConversationHistoryJSON {\n const getPath = (node: HistoryNode): number[] => {\n const path: number[] = [];\n let curr = node;\n while (curr.parent) {\n path.unshift(curr.parent.children.indexOf(curr));\n curr = curr.parent;\n }\n return path;\n };\n\n const serializeNode = (node: HistoryNode): HistoryNodeJSON => ({\n conversation: serializeConversation(node.conversation),\n children: node.children.map(serializeNode),\n });\n\n let root = this.currentNode;\n while (root.parent) {\n root = root.parent;\n }\n\n return {\n root: serializeNode(root),\n currentPath: getPath(this.currentNode),\n };\n }\n\n /**\n * Reconstructs a ConversationHistory instance from JSON.\n */\n static from(\n json: ConversationHistoryJSON,\n environment?: Partial<ConversationEnvironment>,\n ): ConversationHistory {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-call\n const rootConv = (deserializeConversation as any)(\n json.root.conversation,\n ) as Conversation;\n const history = new ConversationHistory(rootConv, environment);\n\n // Recursive function to build the tree\n const buildTree = (\n nodeJSON: HistoryNodeJSON,\n parentNode: HistoryNode,\n ): HistoryNode => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-call\n const nodeConv = (deserializeConversation as any)(\n nodeJSON.conversation,\n ) as Conversation;\n const node: HistoryNode = {\n conversation: nodeConv,\n parent: parentNode,\n children: [],\n };\n node.children = nodeJSON.children.map((child) => buildTree(child, node));\n return node;\n };\n\n const h = history as unknown as { currentNode: HistoryNode };\n const rootNode = h.currentNode;\n rootNode.children = json.root.children.map((child) => buildTree(child, rootNode));\n\n // Traverse to find the current node\n let current: HistoryNode = rootNode;\n for (const index of json.currentPath) {\n const target = current.children[index];\n if (target) {\n current = target;\n }\n }\n h.currentNode = current;\n\n return history;\n }\n\n /**\n * Binds a function to this history instance.\n * The first argument of the function must be a Conversation.\n * If the function returns a new Conversation, it is automatically pushed to the history.\n */\n bind<T extends unknown[], R>(\n fn: (\n conversation: Conversation,\n ...args: [...T, Partial<ConversationEnvironment>?]\n ) => R,\n ): (...args: T) => R {\n return bindToConversationHistory(this, fn);\n }\n\n /**\n * Cleans up all listeners and resources.\n */\n [Symbol.dispose](): void {\n // Clear references to help GC\n let root: HistoryNode | null = this.currentNode;\n while (root?.parent) {\n root = root.parent;\n }\n\n const clearNode = (node: HistoryNode) => {\n for (const child of node.children) {\n clearNode(child);\n }\n node.children = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n const n = node as any;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n n.parent = null;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n n.conversation = null;\n };\n\n if (root) clearNode(root);\n }\n}\n\n/**\n * Binds a function's first argument to a ConversationHistory's current state.\n * If the function returns a Conversation, it is pushed to the history.\n */\nexport function bindToConversationHistory<T extends unknown[], R>(\n history: ConversationHistory,\n fn: (\n conversation: Conversation,\n ...args: [...T, Partial<ConversationEnvironment>?]\n ) => R,\n): (...args: T) => R {\n return (...args: T): R => {\n // We pass the history's environment as the last argument if the function supports it\n const boundFn = fn as (conversation: Conversation, ...args: unknown[]) => R;\n const result = boundFn(history.current, ...args, history.env);\n\n if (isConversation(result)) {\n history.push(result);\n }\n\n return result;\n };\n}\n\n/**\n * Simple type guard to check if a value is a Conversation.\n */\nfunction isConversation(value: unknown): value is Conversation {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as Conversation).id === 'string' &&\n typeof (value as Conversation).status === 'string' &&\n (value as Conversation).metadata !== null &&\n typeof (value as Conversation).metadata === 'object' &&\n Array.isArray((value as Conversation).tags) &&\n Array.isArray((value as Conversation).messages) &&\n typeof (value as Conversation).createdAt === 'string' &&\n typeof (value as Conversation).updatedAt === 'string'\n );\n}\n"
14
15
  ],
15
- "mappings": "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",
16
- "debugId": "A73ACE8C678CC64D64756E2164756E21",
16
+ "mappings": "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",
17
+ "debugId": "A4607F063A1411CC64756E2164756E21",
17
18
  "names": []
18
19
  }
@@ -0,0 +1,2 @@
1
+ export { createPIIRedaction, createPIIRedactionPlugin, piiRedactionPlugin, } from './pii-redaction';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { MessagePlugin } from '../types';
2
+ export declare const DEFAULT_PII_RULES: {
3
+ readonly email: {
4
+ readonly regex: RegExp;
5
+ readonly replace: "[EMAIL_REDACTED]";
6
+ };
7
+ readonly phone: {
8
+ readonly regex: RegExp;
9
+ readonly replace: "[PHONE_REDACTED]";
10
+ };
11
+ readonly apiKey: {
12
+ readonly regex: RegExp;
13
+ readonly replace: (match: string, key: string) => string;
14
+ };
15
+ };
16
+ export interface PIIRedactionRule {
17
+ regex: RegExp;
18
+ replace: string | ((match: string, ...groups: string[]) => string);
19
+ }
20
+ export interface PIIRedactionOptions {
21
+ rules?: Record<string, PIIRedactionRule>;
22
+ excludeRules?: string[];
23
+ }
24
+ /**
25
+ * Creates a PII redaction function with custom rules.
26
+ */
27
+ export declare function createPIIRedaction(options?: PIIRedactionOptions): (text: string) => string;
28
+ /**
29
+ * Creates a PII redaction plugin with custom rules.
30
+ */
31
+ export declare function createPIIRedactionPlugin(options?: PIIRedactionOptions): MessagePlugin;
32
+ /**
33
+ * Default PII redaction plugin instance.
34
+ */
35
+ export declare const piiRedactionPlugin: MessagePlugin;
36
+ //# sourceMappingURL=pii-redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pii-redaction.d.ts","sourceRoot":"","sources":["../../src/plugins/pii-redaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,UAAU,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;;;;;;;;kCAYT,MAAM,OAAO,MAAM;;CAE9B,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,mBAAwB,GAChC,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAe1B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,mBAAwB,GAChC,aAAa,CAwBf;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAA6B,CAAC"}
package/dist/types.d.ts CHANGED
@@ -75,4 +75,26 @@ export interface Conversation {
75
75
  createdAt: string;
76
76
  updatedAt: string;
77
77
  }
78
+ /**
79
+ * A function that estimates the number of tokens in a message.
80
+ */
81
+ export type TokenEstimator = (message: Message) => number;
82
+ /**
83
+ * A plugin that can transform a MessageInput before it is appended.
84
+ */
85
+ export type MessagePlugin = (input: MessageInput) => MessageInput;
86
+ /**
87
+ * Serialized form of a single node in the conversation history tree.
88
+ */
89
+ export interface HistoryNodeJSON {
90
+ conversation: ConversationJSON;
91
+ children: HistoryNodeJSON[];
92
+ }
93
+ /**
94
+ * Serialized form of the entire conversation history.
95
+ */
96
+ export interface ConversationHistoryJSON {
97
+ root: HistoryNodeJSON;
98
+ currentPath: number[];
99
+ }
78
100
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,WAAW,GACX,QAAQ,GACR,WAAW,GACX,UAAU,GACV,aAAa,GACb,UAAU,CAAC;AAEf,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC/C,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACpC,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IAC1C,UAAU,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IAC9C,UAAU,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IAC9C,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -104,10 +104,10 @@ export interface ConversationDraft {
104
104
  * Truncates the conversation to fit within a token limit.
105
105
  * Removes oldest messages first while preserving system messages and optionally the last N messages.
106
106
  * @param maxTokens - Maximum token count to target.
107
- * @param estimateTokens - Function to estimate tokens per message.
108
- * @param options - Options for preserving system messages and last N messages.
107
+ * @param options - Options for estimation and preservation.
109
108
  */
110
- truncateToTokenLimit: (maxTokens: number, estimateTokens: (message: Message) => number, options?: {
109
+ truncateToTokenLimit: (maxTokens: number, options?: {
110
+ estimateTokens?: (message: Message) => number;
111
111
  preserveSystemMessages?: boolean;
112
112
  preserveLastN?: number;
113
113
  }) => ConversationDraft;
@@ -1 +1 @@
1
- {"version":3,"file":"with-conversation.d.ts","sourceRoot":"","sources":["../src/with-conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"with-conversation.d.ts","sourceRoot":"","sources":["../src/with-conversation.ts"],"names":[],"mappings":"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"}