Skip to main content

curt-vcon

A bridge converter between two conversation containers: .curt (the open single-file AI-conversation format) and vCon (the IETF Virtualized Conversation container, draft-ietf-vcon-vcon-core-05).

What it is​

A bridge, not a unification. vCon targets real-time conversations between people — call recordings, transcriptions, call-center sessions, signaling metadata. .curt targets AI conversations — user/assistant/system/tool turns with model provenance. The converter maps the overlapping text subset (timestamped text turns attributable to an originator) and is lossy everywhere else; its fidelity matrix states exactly what is preserved, degraded, or dropped. It makes no normative claims about either format.

Install​

npm install curt-vcon # library
npm install -g curt-vcon # CLI

CLI​

curt-vcon to-vcon in.curt > out.vcon.json
curt-vcon to-curt in.vcon.json > out.curt

Exit code 1 with a stderr message on invalid input; exit 2 on usage errors. Output goes to stdout only.

Library​

import { parseCurt, serializeCurt } from 'curt-format';
import { curtToVcon, vconToCurt, type Vcon } from 'curt-vcon';

const curt = parseCurt(curtFileText)!;
const vcon: Vcon = curtToVcon(curt);

const back = vconToCurt(vcon); // CurtConversation | null

Notable mapping behaviors: the .curt conversation id becomes a deterministic UUIDv5 (one-way — vCon core has no free-form top-level metadata field to carry it back); message model and envelope extras are dropped; vCon recording/incomplete/external dialogs are skipped in the vCon→.curt direction. Field names were verified against draft -05; the draft is pre-RFC and evolving, so the mapping tracks it.

Where to go deeper​

The repo README carries the full field-mapping tables in both directions, the fidelity matrix, the documented spec-level mismatches, and open questions for the vCon working group: github.com/JordanNewell/curt-vcon.