Overview
Add the ability to import conversation history from a ChatWise export (.zip file) into OpenConduit.
ChatWise exports a single .zip containing:
chat-{id}.json — one file per conversation, messages inline
assistants.json — personas with system prompts and MCP config
providers.json — custom provider definitions (contains API keys — must not be auto-imported)
prompts.json — prompt templates
config.json — app-wide settings (contains API keys — must not be auto-imported)
Mapping: ChatWise → OpenConduit
Conversations (chat-*.json → Conversation)
| ChatWise field |
OpenConduit field |
Notes |
id |
id |
Prefix with cw_ to avoid collisions |
title |
title |
|
createdAt / updatedAt |
createdAt / updatedAt |
ISO → epoch ms |
systemInstruction |
systemPrompt |
|
model |
providerId + model |
See model mapping below |
Messages (messages[] → Message[])
| ChatWise field |
OpenConduit field |
Notes |
id |
id |
|
role (user/assistant) |
role |
Direct map |
content |
content |
Must strip @message_part::* markers (see below) |
reasoningContent |
thinking |
|
createdAt |
timestamp |
ISO → epoch ms |
model |
model |
|
meta.parts.toolu_* |
toolCalls[] |
Parse tool call parts into ToolCall objects |
files[] |
attachments[] |
Only local paths are exported — no binary data. Mark as unavailable or skip. |
Content cleanup
ChatWise embeds streaming part markers in content strings:
@message_part::reasoning-1_0
@message_part::toolu_01E3ggHqPFYDzXhCFE6AM9Mq
These must be stripped from the displayed text. Tool call data lives in meta.parts.
Model string mapping
ChatWise uses these formats:
- Built-in:
anthropic-claude-4.5-sonnet → { providerId: "anthropic", model: "claude-4.5-sonnet" }
- Built-in:
openai-gpt-4o → { providerId: "openai", model: "gpt-4o" } (etc.)
- Custom:
cus_{id}-{modelId} → look up in providers.json, map to closest built-in provider type or leave as unknown
Scope
MVP (conversations only)
Follow-up (optional)
Explicitly out of scope
- Provider import (API keys in the export — security risk)
- Config/settings import (completely different settings model)
Security note
providers.json and config.json in the export contain plaintext API keys. The import flow must not auto-import these. If provider import is ever added, keys must require explicit user opt-in and be handled through the existing secure IPC → electron-store path.
Overview
Add the ability to import conversation history from a ChatWise export (
.zipfile) into OpenConduit.ChatWise exports a single
.zipcontaining:chat-{id}.json— one file per conversation, messages inlineassistants.json— personas with system prompts and MCP configproviders.json— custom provider definitions (contains API keys — must not be auto-imported)prompts.json— prompt templatesconfig.json— app-wide settings (contains API keys — must not be auto-imported)Mapping: ChatWise → OpenConduit
Conversations (
chat-*.json→Conversation)ididcw_to avoid collisionstitletitlecreatedAt/updatedAtcreatedAt/updatedAtsystemInstructionsystemPromptmodelproviderId+modelMessages (
messages[]→Message[])ididrole(user/assistant)rolecontentcontent@message_part::*markers (see below)reasoningContentthinkingcreatedAttimestampmodelmodelmeta.parts.toolu_*toolCalls[]ToolCallobjectsfiles[]attachments[]Content cleanup
ChatWise embeds streaming part markers in
contentstrings:These must be stripped from the displayed text. Tool call data lives in
meta.parts.Model string mapping
ChatWise uses these formats:
anthropic-claude-4.5-sonnet→{ providerId: "anthropic", model: "claude-4.5-sonnet" }openai-gpt-4o→{ providerId: "openai", model: "gpt-4o" }(etc.)cus_{id}-{modelId}→ look up inproviders.json, map to closest built-in provider type or leave as unknownScope
MVP (conversations only)
jsziporadm-zip) in the Electron main processchat-*.json→Conversation[]with content cleanup, tool call extraction, model mappingimport:chatwise— takes a file path, returns parsed conversations@openconduit/core— file picker → conversation list with checkboxes → confirmFollow-up (optional)
Explicitly out of scope
Security note
providers.jsonandconfig.jsonin the export contain plaintext API keys. The import flow must not auto-import these. If provider import is ever added, keys must require explicit user opt-in and be handled through the existing secure IPC →electron-storepath.