You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit ddb0377
Browse filesBrowse the repository at this point in the historyBrowse files
feat(qc): message anyone new from the TUI, CLI and MCP (0.17.0, qc 0.13.0) (#344)
Anthony: "qrypt.chat tui has no way to message a new user."
qc could only talk in chats that already existed. Both server routes a new
chat needs were cookie-only, so even a hand-rolled call from qc got 401:
- /api/users/search and POST /api/chat/conversations now authenticate with
authenticateRequest (Bearer or cookie), like the rest of the API.
- A new chat is announced (announceJoined): every member's open devices put
it in their list at once and join its live room.
qc:
- TUI: /msg @name [first message] (also /dm, /query, /new) finds the person,
opens or reuses your direct chat with them and sends the text. `n` in the
chat list types "/msg @" for you; the empty screen says how.
- CLI: qc dm <@user> [text] (qc msg is the same; "-" reads stdin).
- MCP: start_direct_chat { user, text? }.
- QcClient.searchUsers / startDirect; pickUser takes an exact @username,
else the only match, else lists who it could be.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: packages/qryptchat/package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "@profullstack/qryptchat",
3
-
"version": "0.12.0",
3
+
"version": "0.13.0",
4
4
"description": "qc: qrypt.chat in your terminal. A full-screen end-to-end encrypted chat client (ML-KEM-1024), plus a scriptable CLI and an MCP server.",
Copy file name to clipboardExpand all lines: src/cli/mcp.js
+19Lines changed: 19 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -39,6 +39,19 @@ const TOOLS = [
39
39
additionalProperties: false,
40
40
},
41
41
},
42
+
{
43
+
name: 'start_direct_chat',
44
+
description: 'Start (or reopen) an end-to-end encrypted direct chat with anyone on qrypt.chat, by @username or a name only one person has, and optionally send the first message. Returns the chat id for read_chat/send_message.',
45
+
inputSchema: {
46
+
type: 'object',
47
+
properties: {
48
+
user: {type: 'string',description: 'Their @username (or a name that matches only them)'},
49
+
text: {type: 'string',description: 'Optional: the first message'},
50
+
},
51
+
required: ['user'],
52
+
additionalProperties: false,
53
+
},
54
+
},
42
55
{
43
56
name: 'list_mentions',
44
57
description: 'Who an @mention can complete to in a conversation, best match first (like typing @ali then Tab). Without partial: everyone you can mention.',
@@ -156,7 +167,8 @@ function drawTranscript(surface, state) {
156
167
consttheme=surface.theme;
157
168
constmessages=state.messages[state.activeId]||[];
158
169
if(!state.activeId){
159
-
surface.text(1,1,state.loading ? 'Loading your chats…' : 'Pick a chat on the left.',{fg: theme.muted});
170
+
consthint=state.loading ? 'Loading your chats…' : state.conversations.length ? 'Pick a chat on the left, or type /msg @name to start one.' : 'No chats yet. Type /msg @name to message someone.';
171
+
surface.text(1,1,hint,{fg: theme.muted});
160
172
return;
161
173
}
162
174
if(!messages.length){
@@ -256,7 +268,7 @@ export function render({ ui, width, height, theme }, state, on = {}) {
256
268
p.textInput({
257
269
value: state.field.value,
258
270
cursor: state.field.cursor,
259
-
placeholder: active ? `Message ${active.title} (@name Tab, Ctrl+E emoji, :rocket: works too)` : 'Pick a chat first',
271
+
placeholder: active ? `Message ${active.title} (@name Tab, Ctrl+E emoji, /msg @name for a new chat)` : '/msg @name to start a chat',
260
272
focused: state.focus==='compose'&&!state.picker,
261
273
size: 1,
262
274
});
@@ -270,7 +282,7 @@ export function render({ ui, width, height, theme }, state, on = {}) {
0 commit comments