Writer Studio (standalone writing editor) (part 5)
Part 5 of the Writer Studio page: the complete writer IPC channel reference and the key-files table that maps each part of the feature to the source that implements it.
What it is
This is part 5 of the Writer Studio (standalone writing editor) page. It is the reference half of the feature: the complete list of writer IPC channels and the key-files table that maps each part of Writer Studio to the source that implements it.
Where to find it
Writer Studio opens from the Writer virtual project in the sidebar, and the parent page covers gating, surfaces and first-run setup. Nothing in this part has a UI of its own: the channels below are what the renderer, the plugin webview and the CLI routes all call, and the key-files table is there for reading the code.
How it behaves
IPC channels (writer:*)
Defined in src/shared/ipc-channels/writer.ts; handlers in
src/main/ipc/writer-handlers.ts (all gated by
isUnreleasedFeatureVisible('ai-writer', ...)); Zod schemas in
src/shared/ipc-schemas.ts (the writer* entries).
| Constant | Channel string | Purpose |
|---|---|---|
WRITER_LIST |
writer:list |
list all non-deleted documents, ordered by updated_at DESC |
WRITER_GET |
writer:get |
fetch one document by id |
WRITER_CREATE |
writer:create |
create a new document; returns it |
WRITER_SAVE_CONTENT |
writer:save-content |
patch a document's body content |
WRITER_UPDATE_META |
writer:update-meta |
patch title / goal / audience / tone / creativity (metadata) |
WRITER_DELETE |
writer:delete |
soft-delete a document |
WRITER_RESTORE |
writer:restore |
undo a soft-delete |
WRITER_SEARCH |
writer:search |
search documents by title and content |
WRITER_FOLDER_LIST |
writer:folder-list |
list all folders |
WRITER_FOLDER_CREATE |
writer:folder-create |
create a new folder |
WRITER_FOLDER_RENAME |
writer:folder-rename |
rename a folder |
WRITER_FOLDER_DELETE |
writer:folder-delete |
delete a folder (moves documents to Unfiled) |
WRITER_DOC_MOVE |
writer:doc-move |
move a document into a folder (or back to Unfiled) |
WRITER_DOC_SET_PINNED |
writer:doc-set-pinned |
pin or unpin a document within its folder |
WRITER_VERSION_LIST |
writer:version-list |
list version snapshots for a document |
WRITER_VERSION_GET |
writer:version-get |
fetch a single version snapshot |
WRITER_VERSION_SNAPSHOT |
writer:version-snapshot |
create a manual version snapshot |
WRITER_VERSION_RESTORE |
writer:version-restore |
restore a document to a previous version |
WRITER_AI_EDIT |
writer:ai-edit |
AI-rewrite a selection; returns rewritten text |
WRITER_AI_OPTIONS |
writer:ai-options |
generate N alternative versions of a selected segment |
WRITER_AI_AUTOCOMPLETE |
writer:ai-autocomplete |
inline ghost-text continuation at end of paragraph (max 40 tokens) |
WRITER_AI_CHAT |
writer:ai-chat |
chat-assistant turn: returns { conversation, edits } from the <conversation>/<suggested_edits> protocol; persists the turn (user + assistant) on success when a documentId is supplied |
WRITER_CHAT_HISTORY_GET |
writer:chat-history-get |
load a document's persisted Assistant chat history (oldest-first) to rehydrate the panel on open |
WRITER_CHAT_HISTORY_CLEAR |
writer:chat-history-clear |
clear a document's persisted chat history |
WRITER_CREATE_FROM_SESSION |
writer:create-from-session |
create a Writer document from a Claude session's content |
WRITER_IMPORT_FILE |
writer:import-file |
import a local file (DOCX, MD, TXT, RTF, ODT, EPUB) as markdown; returns { title, markdown } |
WRITER_TEMPLATE_LIST |
writer:template-list |
list all non-deleted user templates, ordered by updated_at DESC |
WRITER_TEMPLATE_GET |
writer:template-get |
fetch one user template by id |
WRITER_TEMPLATE_CREATE |
writer:template-create |
create a user template from a document's content and guidance; returns it |
WRITER_TEMPLATE_DELETE |
writer:template-delete |
soft-delete a user template |
WRITER_PUBLISH |
writer:publish |
publish document to Shares; returns { url, token } |
WRITER_UNPUBLISH |
writer:unpublish |
revoke the active share and clear share columns |
WRITER_WINDOW_OPEN |
writer:window-open |
open the pop-out Writer window |
WRITER_DOCUMENTS_CHANGED |
writer:documents-changed |
push notification when the document list changes |
WRITER_ACTION_PRESET_LIST |
writer:action-preset-list |
list all non-deleted custom action presets, ordered by sort order |
WRITER_ACTION_PRESET_CREATE |
writer:action-preset-create |
create a custom action preset ({ label, instruction }) |
WRITER_ACTION_PRESET_UPDATE |
writer:action-preset-update |
update a preset's label, instruction, or sort order |
WRITER_ACTION_PRESET_DELETE |
writer:action-preset-delete |
soft-delete a custom action preset |
WRITER_MC_LINK |
writer:mc-link |
link a document to a Mission Control item |
WRITER_MC_UNLINK |
writer:mc-unlink |
unlink a document from a Mission Control item |
WRITER_MC_CREATE_AND_LINK |
writer:mc-create-and-link |
create a Mission Control item and link the document |
WRITER_MC_GET_LINK |
writer:mc-get-link |
get the Mission Control link for a document |
WRITER_CLONE_DOCUMENT |
writer:clone-document |
duplicate a document (content + metadata + tags) with "Copy of" title prefix |
WRITER_TAG_ADD |
writer:tag-add |
add a tag to a document (INSERT OR IGNORE) |
WRITER_TAG_REMOVE |
writer:tag-remove |
remove a tag from a document |
WRITER_TAG_LIST |
writer:tag-list |
list tags for a specific document |
WRITER_TAG_LIST_ALL |
writer:tag-list-all |
list all distinct tags across all documents (sorted) |
WRITER_EXPORT_FILE |
writer:export-file |
save a document to disk as Markdown (.md) or HTML (.html) via a system save dialog |
WRITER_EXPORT_TO_VAULT |
writer:export-to-vault |
export a document to KMS vault |
WRITER_IMPORT_FROM_VAULT |
writer:import-from-vault |
import a document from KMS vault |
WRITER_PULL_FROM_VAULT |
writer:pull-from-vault |
pull latest vault note content into a linked Writer document (creates a pre-import version snapshot) |
WRITER_KMS_SYNC_STATUS |
writer:kms-sync-status |
query sync status between a Writer document and its linked vault note (in-sync / writer-ahead / vault-ahead / conflict / unlinked) |
WRITER_PM_STATUS |
writer:pm-status |
get PM integration status for a document |
WRITER_SEND_TO_PM |
writer:send-to-pm |
send a document to the PM system |
Every channel is registered in tests/integration/ipc-contract.test.ts.
For agents
Key files
| What | Where |
|---|---|
| Migration | src/main/db/migrations/20260603162951-create-writer-documents-table.ts; chat history: …20260618150227-writer-chat-messages-table.ts; tags: …20260903023357-create-writer-document-tags-table.ts; templates: …20260903023722-create-writer-templates-table.ts |
| Query layer | src/main/db/queries-writer.ts; chat history: src/main/db/queries-writer-chat.ts; templates: src/main/db/queries-writer-templates.ts |
| IPC handlers | src/main/ipc/writer-handlers.ts |
| File import service | src/main/services/writer/writer-file-import-service.ts |
| CLI routes | src/main/services/cli/cli-server-writer-routes.ts |
| IPC channels | src/shared/ipc-channels/writer.ts |
| Shared types | src/shared/types/writer.ts |
| Gating registry | src/shared/unreleased-features.ts (ai-writer) |
| Renderer (store + UI) | src/renderer/src/features/writer/ |
| Plugin port (webview) | src/plugins/writer/ — writer-bridge.ts (backend glue), web/src/ (guest app source), ui/ (committed build output) |
For the test-locked invariants and the safe-change checklist, see the contract:
.claude/memory/contracts/writer-contract.md.
Related
The user-facing behaviour these channels implement is split across part 2 (editor, document list and data model), part 3 (the AI capabilities) and part 4 (sharing, exports and integrations); the Writer Studio (standalone writing editor) page is the parent.
Last verified 2026-09-27