conversationalist 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -218,6 +218,108 @@ const boundTruncate = history.bind(truncateToTokenLimit);
218
218
  boundTruncate(4000); // Uses tiktokenEstimator automatically
219
219
  ```
220
220
 
221
+ ### Markdown Conversion
222
+
223
+ Convert conversations to human-readable Markdown format, or parse Markdown back into a conversation object.
224
+
225
+ #### Basic Usage (Clean Markdown)
226
+
227
+ By default, `toMarkdown` produces clean, readable Markdown without metadata:
228
+
229
+ ```ts
230
+ import {
231
+ toMarkdown,
232
+ fromMarkdown,
233
+ createConversation,
234
+ appendMessages,
235
+ } from 'conversationalist';
236
+
237
+ let conversation = createConversation({ id: 'conv-1' });
238
+ conversation = appendMessages(
239
+ conversation,
240
+ { role: 'user', content: 'What is 2 + 2?' },
241
+ { role: 'assistant', content: 'The answer is 4.' },
242
+ );
243
+
244
+ const markdown = toMarkdown(conversation);
245
+ // Output:
246
+ // ### User
247
+ //
248
+ // What is 2 + 2?
249
+ //
250
+ // ### Assistant
251
+ //
252
+ // The answer is 4.
253
+ ```
254
+
255
+ When parsing simple Markdown without metadata, `fromMarkdown` generates new IDs and uses sensible defaults:
256
+
257
+ ```ts
258
+ const parsed = fromMarkdown(markdown);
259
+ // parsed.id is a new generated ID
260
+ // parsed.status is 'active'
261
+ // Message IDs are generated, positions are assigned sequentially
262
+ ```
263
+
264
+ #### Lossless Round-Trip (with Metadata)
265
+
266
+ For archiving or backup scenarios where you need to preserve all data, use `{ includeMetadata: true }`:
267
+
268
+ ```ts
269
+ const markdown = toMarkdown(conversation, { includeMetadata: true });
270
+ // Output includes YAML frontmatter with all metadata keyed by message ID:
271
+ // ---
272
+ // id: conv-1
273
+ // status: active
274
+ // metadata: {}
275
+ // tags: []
276
+ // createdAt: '2024-01-15T10:00:00.000Z'
277
+ // updatedAt: '2024-01-15T10:01:00.000Z'
278
+ // messages:
279
+ // msg-1:
280
+ // position: 0
281
+ // createdAt: '2024-01-15T10:00:00.000Z'
282
+ // metadata: {}
283
+ // hidden: false
284
+ // msg-2:
285
+ // position: 1
286
+ // createdAt: '2024-01-15T10:01:00.000Z'
287
+ // metadata: {}
288
+ // hidden: false
289
+ // ---
290
+ // ### User (msg-1)
291
+ //
292
+ // What is 2 + 2?
293
+ //
294
+ // ### Assistant (msg-2)
295
+ //
296
+ // The answer is 4.
297
+
298
+ // Parse back with all metadata preserved
299
+ const restored = fromMarkdown(markdown);
300
+ // restored.id === 'conv-1'
301
+ // restored.messages[0].id === 'msg-1'
302
+ ```
303
+
304
+ #### Multi-Modal Content
305
+
306
+ Both functions handle multi-modal content. Images render as Markdown images, and with metadata enabled, additional properties like `mimeType` are preserved in the YAML frontmatter:
307
+
308
+ ```ts
309
+ conversation = appendMessages(conversation, {
310
+ role: 'user',
311
+ content: [
312
+ { type: 'text', text: 'Describe this:' },
313
+ { type: 'image', url: 'https://example.com/photo.png', mimeType: 'image/png' },
314
+ ],
315
+ });
316
+
317
+ const md = toMarkdown(conversation);
318
+ // Describe this:
319
+ //
320
+ // ![image](https://example.com/photo.png)
321
+ ```
322
+
221
323
  ## Plugins
222
324
 
223
325
  **Conversationalist** supports a plugin system that allows you to transform messages as they are appended to a conversation. Plugins are functions that take a `MessageInput` and return a modified `MessageInput`.
@@ -688,6 +790,7 @@ Svelte 5's runes pair perfectly with **Conversationalist**. You can use the `Con
688
790
  | **Modification** | `redactMessageAtPosition`, `replaceSystemMessage`, `collapseSystemMessages` |
689
791
  | **Context** | `truncateToTokenLimit`, `getRecentMessages`, `estimateConversationTokens` |
690
792
  | **Querying** | `getConversationMessages`, `getMessageByIdentifier`, `computeConversationStatistics` |
793
+ | **Conversion** | `toMarkdown`, `fromMarkdown`, `toChatMessages`, `pairToolCallsWithResults` |
691
794
  | **History** | `ConversationHistory`, `bindToConversationHistory` |
692
795
 
693
796
  ## Deterministic Environments (Testing)
package/dist/index.d.ts CHANGED
@@ -9,8 +9,8 @@ export { withEnvironment } from './environment';
9
9
  export { createMessage } from './utilities';
10
10
  export type { ConversationalistErrorCode } from './errors';
11
11
  export { ConversationalistError, createDuplicateIdError, createInvalidInputError, createInvalidPositionError, createInvalidToolReferenceError, createLockedError, createNotFoundError, createSerializationError, createValidationError, } from './errors';
12
- export type { ToolCallPair } from './utilities';
13
- export { normalizeContent, pairToolCallsWithResults, toMultiModalArray, } from './utilities';
12
+ export type { ToMarkdownOptions, ToolCallPair } from './utilities';
13
+ export { fromMarkdown, MarkdownParseError, normalizeContent, pairToolCallsWithResults, toMarkdown, toMultiModalArray, } from './utilities';
14
14
  export type { ConversationDraft } from './with-conversation';
15
15
  export { pipeConversation, withConversation } from './with-conversation';
16
16
  export { bindToConversationHistory, ConversationHistory } from './history';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EACV,OAAO,IAAI,eAAe,EAC1B,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,UAAU,EACV,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3E,YAAY,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}