No documents yet
Folders
Folder management coming soon
Tags
No tags yet. Tags will appear as you create documents.
Templates
Pick a starting structure. Your content stays yours β templates only provide scaffolding.
Writing Statistics
Settings
Theme
Font
AI Assistance
When enabled, AI completions and companion suggestions will not be shown.
After you pause, the AI offers next-sentence ideas. Companion automatically pauses while you use Critique, Reflect, and the other analysis tools, or while searching.
As you write, the AI catches spelling, capitalization, and punctuation mistakes.
Auto applies fixes silently. Suggest shows each fix as a highlight you click to accept or dismiss.
As you write, the AI flags wordy, redundant, or weak phrasing and proposes tighter rephrasings as amber highlights. Click a highlight to accept or ignore it. These are suggestions only and are never applied automatically.
Timing Controls
Wait after typing stops.
Wait after typing stops.
Wait before offering next-sentence ideas.
Voice Profile
Your writing style profile for personalized AI completions.
Privacy
Agent API
REST API for programmatic document management. All endpoints are scoped by workspace.
https://ss-writer.ocuss.app
Authorization: Bearer <jwt> or a multica_auth cookie, plus the workspace query param. Internal routes require HMAC headers.
/api/agent/health
Public health probe. Response: {status, service, version}. Auth: none.
/health
Container health endpoint. Response: {status, service}. Auth: none.
/api/agent/documents
List visible documents. Query: workspace required; optional folder_id, tag, status, type, q, limit, offset. Response: {documents[], total, limit, offset}. Auth: Bearer JWT or multica_auth cookie.
/api/agent/documents
Create a document. Query: workspace required. Body schema: {title, doc_type?, folder_id?, content_prosemirror?, content_markdown?, tags?}. Current behavior: tags is accepted by validation but not persisted by the route. Response: full document object with id, title, doc_type, status, workspace_id, folder_id, owner_id, content_prosemirror, content_markdown, content_plain, word_count, tags, created_at, updated_at. Auth: Bearer JWT or cookie.
/api/agent/documents/{doc_id}
Read one document. Query: workspace required. Response: full document object plus resolved tags[]. Auth: document read access.
/api/agent/documents/{doc_id}
Update a document. Query: workspace required. Body schema accepted by the route: {title?, status?, folder_id?, content_prosemirror?, content_markdown?, content_plain?, word_count?, ai_enabled?, create_version?, version_label?}. Current behavior: title, status, folder_id, content_prosemirror, content_markdown, and ai_enabled are persisted; word_count is recomputed from markdown and content_plain is ignored. Response: {id, title, status, word_count, updated_at, version_created}. Auth: document edit access.
/api/agent/documents/{doc_id}
Soft-delete a document. Query: workspace required. Response: {id, deleted: true}. Auth: document edit access.
/api/agent/documents/{doc_id}/markdown
Return markdown form. Query: workspace. Response: {id, title, content_markdown, updated_at}. Auth: document read access.
/api/agent/documents/{doc_id}/outline
Return outline derived from ProseMirror headings. Query: workspace. Response: {id, title, outline[], total_word_count, section_count}. Auth: document read access.
/api/agent/documents/{doc_id}/excerpt
Extract one heading section. Query: workspace and required heading. Response: {id, title, heading, content_markdown, word_count, heading_level, sibling_headings[]}. Auth: document read access.
/api/agent/documents/{doc_id}/stats
Return stats and last 30 daily rows. Query: workspace. Response: {id, title, status, word_count, version_count, comment_count, created_at, updated_at, daily_stats[]}. Auth: document read access.
/api/agent/documents/{doc_id}/versions
List captured versions. Query: workspace. Response: {document_id, versions[], total}. Auth: document read access.
/api/agent/documents/{doc_id}/versions/{version_id}
Read one captured version. Query: workspace. Response: {id, document_id, version_number, label, content_prosemirror, content_markdown, word_count, created_at, created_by}. Auth: document read access.
/api/agent/documents/{doc_id}/suggest
Create a suggestion comment. Query: workspace. Body: {text, anchor_path?}. Response: {id, document_id, text, anchor_path, created_by, status, created_at}. Auth: document comment access.
/api/agent/documents/{doc_id}/comment
Create a comment. Query: workspace. Body: {content, anchor_path?, selection_range?, parent_comment_id?}. Response: {id, document_id, body, anchor_path, parent_id, created_by, resolved, created_at}. Auth: document comment access.
/api/agent/documents/{doc_id}/synthesize
Run structured synthesis. Query: workspace. Body: none. Response: {document_id, title, summary, key_points[], outline[], suggested_tags[], tone_analysis}. Auth: document read access.
/api/agent/documents/{doc_id}/share
Upsert share grants. Query: workspace. Body schema currently enforced as {grants:[{document_id, shared_with_type, shared_with_id?, permission}]}. Current behavior: the path doc_id is authoritative and each grant object's document_id is ignored. Response: {document_id, grants[]}. Auth: document edit access.
/api/agent/search
Search across visible documents. Query: workspace and required q; optional type, status, tag, limit, offset. Response: {results[], total, limit, offset}. Auth: Bearer JWT or cookie.
/api/agent/folders
List workspace folders. Query: workspace. Response: {folders:[{id, name, parent_id, document_count, created_at}]}. Auth: Bearer JWT or cookie.
/api/agent/folders
Create a folder. Query: workspace. Body: {name, parent_folder_id?, path?}. Response: {id, name, parent_id, document_count, created_at}. Auth: Bearer JWT or cookie.
/api/agent/tags
List tags with usage counts. Query: workspace. Response: {tags:[{id, name, color, document_count}]}. Auth: Bearer JWT or cookie.
/api/agent/ai/complete
Agent AI completion stream. Query: workspace required when using cookie auth. Body schema: {mode, doc_id?, doc_context?, voice_profile?, selection_range?, max_tokens?, friction_mode?, explicit_invoke?}. Response: SSE events token, done, or error. Auth: Bearer JWT or cookie.
/api/agent/ai/feedback
Record accept/reject feedback. Query: workspace required for cookie auth. Body: {document_id, suggestion_id, action, surface, workspace_id?, user_id?}. When the optional IDs are omitted, the route derives them from the authenticated caller. Response: {status: "ok"}. Auth: Bearer JWT or cookie.
/api/agent/voice-profile/refresh
Force voice-profile extraction from the caller's workspace corpus. Query: workspace required for cookie auth. Body: none. Response: {status, extraction_version}. Auth: Bearer JWT or cookie.
/api/agent/voice-profile
Read the stored profile JSON. Query: workspace required for cookie auth. Response: {workspace_id, user_id, profile_json, corpus_doc_count, extraction_version, extracted_at}. Auth: Bearer JWT or cookie.
/api/internal/ai/complete
Service-to-service AI completion stream. Body schema is the same as /api/agent/ai/complete. Response: SSE events. Auth: X-Multica-Timestamp + X-Multica-Signature.
/api/internal/synthesize/{doc_id}
Service-to-service synthesis trigger. Body: none. Response: {document_id, title, summary, key_points[], outline[], suggested_tags[], tone_analysis}. Auth: HMAC headers.
/api/internal/voice-profile/{user_id}
Legacy profile upsert path retained for service callers. Body: {workspace_id, tfidf_vector?, tone_profile?, rhythm_profile?, punctuation_profile?, sample_count?}. Response: {status, user_id}. Auth: HMAC headers.
MCP Tools
Use the REST endpoints above directly for the current Writer adapter surface.
This adapter does not publish a separate adapter-local MCP contract in the codebase. When Writer routes are exposed through the platform MCP server, treat those wrappers as thin delegates to the documented REST routes above.
Quick Reference
curl -H "Authorization: Bearer $JWT" "https://ss-writer.ocuss.app/api/agent/documents?workspace=$MULTICA_WORKSPACE_ID"
curl -X POST "https://ss-writer.ocuss.app/api/agent/documents?workspace=$MULTICA_WORKSPACE_ID" \
-H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{"title":"Phase 6.5 draft","doc_type":"article","content_markdown":"Hello world"}'
curl -H "Authorization: Bearer $JWT" "https://ss-writer.ocuss.app/api/agent/documents/$DOC_ID?workspace=$MULTICA_WORKSPACE_ID"
curl -H "Authorization: Bearer $JWT" "https://ss-writer.ocuss.app/api/agent/search?workspace=$MULTICA_WORKSPACE_ID&q=phase"
curl -X POST "https://ss-writer.ocuss.app/api/agent/voice-profile/refresh?workspace=$MULTICA_WORKSPACE_ID" \ -H "Authorization: Bearer $JWT"