6972 Commits
Author SHA1 Message Date
Evgeny @ SimpleX Chat f44711b20c website: links (#8208)
* website: two publications on the links page

* website: shorter link descriptions

* website: preview images for the two new links

* website: 30 more 2026 links, Freedom.Tech review address

* website: distinct title for the Flux entry, to keep the Whonix anchor
2026-11-15 00:02:47 +00:00
Evgeny @ SimpleX Chat b346b96a7b ui: link sanitizing keeps markdown (#8207) 2026-11-14 23:21:37 +00:00
Evgeny @ SimpleX Chat 49ade2183a ci: iOS and desktop references of v7.1.4 what's new (#8210) 2026-11-14 23:18:34 +00:00
Evgeny @ SimpleX Chat b475ae25ac mcp: free memory and disk in the end line of answers (#8211)
* mcp: free memory and disk in the status line

* mcp: free memory and disk in the end line of answers

* mcp: ❗️ after a low part of the end line, RAM below 5%
2026-11-14 23:17:25 +00:00
Evgeny @ SimpleX Chat ed9e9fe95d mcp, ui: sessions open in the Flat layout, with the avatar on the name line (#8169)
* plan: mcp-flat-sessions

* plan: mcp-flat-sessions, the user's answers

* plan: mcp-flat-sessions, image widths and times per platform

* plan: mcp-flat-sessions, one flat media width and smaller avatars

* plan: mcp-flat-sessions, list breaks

* plan: mcp-flat-sessions, visible avatar gaps and the gap below the sender row

* plan: mcp-flat-sessions, equal gaps around the name

* plan: mcp-flat-sessions, restore the approved gaps

* mcp: open the groups of new sessions in the Flat layout

* ui: avatar on the name line and full-width messages in the flat layout

* ui: record the snapshot references of the flat layout

* ui: flat media beside the go-to button, text below tall name lines

* mcp: source of the session image, Main group check in the e2e test

* plan: mcp-flat-sessions, as implemented

* plans: flat sessions, the tests run on master

* android, desktop: keep the width limit of the media box in intrinsic measurement

* android, desktop: test the intrinsic height of media at an unbounded width

* ui: flat name rows close to their messages, cards at the text edge

* desktop: flat group snapshot references, the media scene

* plans: flat sessions, avatars and flat-layout defects

* desktop: avatar snapshot scenes with photos and placeholders

* ios: flat snapshot references, the deleted items scene

* desktop: avatar snapshot scenes of share, contact and user lists, calls, channel members

* android, desktop: avatars without inner padding, each in its former box

* ios: snapshot scenes of hidden integrity errors in Flat rows and bubbles

* desktop: avatar snapshot references, recorded before the inset removal

* android, desktop: snapshot scenes of hidden integrity errors in Flat rows and bubbles

* ios: hidden integrity errors take no space in the chat

* plans: flat sessions, the user's answers, avatar call sites as implemented, hidden rows

* ios: scenes of the time before deleted items, unread users, appearance

* ios: avatars in Flat rows pass the letters' edge by 2 pt

* ios: 6 pt from the avatar to the message below it in Flat rows

* ios: time on the last line of messages ending with empty lines in Flat

* ios: code cards as wide as the code, the time beside them, in Flat rows

* ios: delivery status only with the time in Flat rows

* ios: time shown on a message before a deleted or hidden item

* ios: no gap below a reactions row between one sender's messages in Flat

* ios: no early wrap of the last word before the time in Flat rows

* ios: name the condition that shows the time before deleted items

* ios: spec links to the moved lines of TerminalItemView

* ios: test of the delivery status without the time in Flat rows

* desktop: snapshot references after the inset removal, hidden integrity error scenes

* android, desktop: blur of blocked members' photos as on iOS

* ios: user picker scene with the chat running, as in the app

* android, desktop: snapshot scenes of the Flat defects and the chat banner

* ios: status without the time only for partial delivery and errors

* ios: snapshot references of the Flat avatar overshoot, gap and defect fixes

* ios: snapshot references without the empty line after a hidden time

* android, desktop: hidden integrity errors take no space; the time before deleted and hidden items

* android, desktop: chat banner 20 dp above its avatar and 10 dp below

* android, desktop: Flat avatars 2 dp past the letters, 6 dp above the text, four layout defects

* android, desktop: share list shows each chat's own avatar

* android, desktop: business, bot and agent placeholders as on iOS

* plans: flat sessions, the decisions as implemented on Android and desktop

* ios: scene of a hidden item between two messages of one sender

* ios: sender name 12 pt after the visible avatar in Flat rows

* ios: rows around hidden items grouped as if the hidden items were absent

* ios: full time in a deleted message bubble

* android, desktop: rows skip hidden items as neighbours; the time before deleted items in Flat rows only

* android, desktop: Flat sender names 12 dp after the avatar

* android, desktop: avatar placeholders from their own assets; unused icons removed

* plans: flat sessions, questions numbered as answered, neighbours of hidden rows, overshoot note

* ios: snapshot references of rows around hidden items and the name start

* android, desktop: hidden rows keep one date separator; marked deleted errors shown; rows rebuilt on the developer setting

* desktop: snapshot references of the Flat decisions, defects, banner and rows around hidden items

* spec, plans: Flat row layout, hidden rows and their neighbours, status with the time; avatar assets as implemented

* android, desktop: new, unread and read statuses only with the time in Flat rows, as on iOS

* desktop: snapshot references of the Flat defects scene with an unread message; plans: partial delivery wording

* mcp: session image with the Flat row geometry: avatar 2 pt past the letters, text 6 pt below it

* mcp: session image with a shorter answer, so the first row shows in full

* ios: user picker snapshot scenes at the height of the sheet

* plans: flat sessions, an avatar column with tighter paddings

* ios: snapshot references of the user picker at the height of the sheet

* plans: flat sessions, the avatar column with only the gap open

* ui: Flat avatar column, the avatar 2 into the padding, text 10 after it

Names, items, later rows of one sender, events and deleted cards sit in the message column; media widths are measured from it. Chats without avatars keep 12 on both sides. The session scene on both platforms; the README image redrawn with the column.

* ui: snapshot references of the Flat avatar column and the session scene

* ui: Flat cards and pills take their corners from the roundness setting

Deleted, marked deleted, moderated, blocked, error and decryption error cards and group invitations: 18 × roundness without a tail, as media, on iOS and Android/desktop. A scene of each platform at roundness 0.3.

* ui: Flat pill text on the text start, sender rows at master's pitch

Deleted, marked deleted, moderated, blocked and error pills start at the message column, so their text lines up with the messages, as on master; in chats without avatars they keep 12 from the screen edge. The name line of a sender row starts at the row gap, as on master; the avatar is centred on it and reaches into the gap above, on both platforms.

* android, desktop: avatars in a box drawn at exactly 5/6 of it, as master's padded placeholders

centeredIn scales its child to 5/6 of the box and centres it with fractional placement, so placeholder edges match master at the pixel at every font scale. Photos and the incognito icon take the same size, up to 1 px larger than master's rounded photo padding. The chat-link thumbnail of the chat list uses the same box, 44 sp.

* android, desktop: avatars in a box at whole pixels, photos fill the drawn box

centeredIn places its child at box/12 rounded down and sizes it to the box less twice that, so placeholders keep master's first and last ink pixel and stay sharp. Photos take their rounded square from the drawn box in pixels.

* ui: photo corners from the nominal size; iOS references of pills, corners and sender rows

The rounded square of a photo keeps its corner radius from the size argument. iOS references for the pill alignment, the corner radius from the roundness setting with a 0.3 scene, and sender rows at master's pitch.

* android, desktop: snapshot references of pills, corners, sender rows and avatars at whole pixels
2026-11-14 22:58:41 +00:00
Evgeny Poberezkin 62ea5dc4af 7.1.4: android 397, desktop 175 v7.1.4 2026-11-14 22:43:42 +00:00
Evgeny Poberezkin 3282dfca4c ios: 7.1.4 build 372 2026-11-14 21:53:26 +00:00
Evgeny Poberezkin 00984bf62c ios: core library 7.1.0.4 2026-11-14 19:10:09 +00:00
Evgeny @ SimpleX Chat de44339cf0 ui: what's new in v7.1.4, security audit by Trail of Bits (#8201)
* ui: what's new in v7.1.4, security audit by Trail of Bits; blog placeholder

* ci: iOS and desktop references of v7.1.4 what's new

* blog: placeholder moved to its own PR

* ui: shorter v7.1.4 what's new texts

* ui: v7.1.4 audit item: ask contacts to upgrade, report soon

* android, desktop: crowdfunding image says you own your identity

* android, desktop: crowdfunding image sizes from the 1200x400 source

* ci: desktop references of v7.1.4 what's new with the new image and texts

* ui: crowdfunding caption as before, page headline Own a part of SimpleX Chat, report on its own line

* android, desktop: phone corner as in the original crowdfunding image
2026-11-14 18:44:18 +00:00
Evgeny @ SimpleX Chat e64c2279af mcp: lines of Claude Code's own prompts in small print (#8205) 2026-11-14 18:04:54 +00:00
Evgeny @ SimpleX Chat 1b64f7a46e blog: Trail of Bits security audit permalink (#8206)
* blog: Trail of Bits security audit permalink

* blog: fixes in previous versions, no section placeholders

* blog: Anthropic OSS Scanner program

* blog: using frontier models

* blog: OSS Scanner program that uses frontier models

* blog: upgrade to v7.1.4+

* blog: fixes in SimpleX Chat apps

* blog: fixes in SimpleX Chat app

* blog: fixes first

* blog: security process line

* blog: OSS Scanner in the security process line only

* blog: links to Trail of Bits and OSS Scanner
2026-11-14 16:55:08 +00:00
Evgeny @ SimpleX Chat 27fd68441c website: gold text stays gold until its end (#8204)
* website: gold text holds its colour to the end

* website: gold text ends in the original colour

* website: stretch the gold gradient instead of extra stops
2026-11-14 16:32:21 +00:00
Evgeny @ SimpleX Chat 73483e5f46 mcp: step lines in small print, with their duration and without the check mark (#8196)
* mcp: step lines end with their duration in small print, without the check mark

* mcp: the whole step line in small print

* mcp: a ! in a step line shows as ǃ, so the whole line stays in small print
2026-11-14 12:58:50 +00:00
Evgeny @ SimpleX Chat 159428a973 mcp: usage of each turn in its end line, model and effort switch lines (#8191)
* plan: mcp-activity

* plan: mcp-activity list format

* plan: mcp-activity answers and live step lines

* mcp: a silent line per step of Claude's work, completed at its end

* plan: mcp-activity as implemented

* mcp: finalize step lines within a day and load only the hook's modules

* plan: mcp-activity review decisions as implemented

* plan: mcp-session-usage

* plan: mcp-live-answers

* plan: mcp-live-answers answers and the end line with the usage

* plan: mcp-session-usage, plan usage by the status line, one end line

* plan: mcp-session-usage, the end line settled with live-answers

* plan: mcp-live-answers end line with the plan usage, shared fast request

* plan: mcp-live-answers keeps tokens in context

* plan: mcp-session-usage, status line through postToService

* mcp: end live step lines by the wall clock

* mcp: exact spec ranges and measured hook load time

* mcp: Claude's answers live as Claude writes them, and one end line per turn

A prompt that starts a turn gets an empty silent live message, which the turn's first text, step or answer fills. The MessageDisplay hook, dist/display.js, passes each batch of Claude's text to the service, and the hub streams each text into a silent live message, updated at most every 3 s and finalized at its end. At Stop the streamed answer is claimed, or the answer is posted silent, and the end line !- ✅ Done in DURATION! follows as the turn's only alert.

* plan: mcp-live-answers as implemented

* mcp: usage of each turn in its end line, model and effort switch lines

* plan: mcp-session-usage as implemented

* mcp: one refusal post for a refused answer, in the turn's opening message

A text that a group preference refuses counts as the answer at Stop, so the answer is not posted again. A refused post that would fill the opening message fills it with its refusal text. A refused text ends at once, also when it outgrows a message, and an update scheduled before its end is skipped. Plan decision 37.

* mcp: live posts survive a lost opening message and end within a day

A failed update of the opening message drops it, and the post is sent as a new message; a text that was never posted no longer stands for the answer. Texts and opening messages end 23 hours after their send by the wall clock, as steps do. When the update with a refusal fails too, the opening message gets ⏹️ Stopped and the end line follows. The opening message is kept before User's post and sent after it.

* docs: the status line step of the plugin README

* mcp: a dropped opening message ends with ⏹️ Stopped

When the update of the opening message fails without a refusal, the hub finalizes it, so after a transient failure it does not stay live.

* mcp: effort level only from the status line once it reports

Hooks report the turn's level, xhigh after ultrathink, while the status line reports the session's level; docs: effort updated at each tool step, data folder writable only by the user.

* mcp: end line without the check mark, small print only

* mcp: one token format, the compaction line's, in the end line

* mcp: append the end line to the last message of the answer

* mcp: keep a finished text live until Stop adds the end line, docs

* mcp: priority 1 in the update that adds the end line, quotes of answers without it

* mcp: an answer without a turn record quotes no prompt pushed before the latest answer
2026-11-14 12:40:13 +00:00
Evgeny Poberezkin f298e84baf core: 7.1.4.0 2026-11-14 12:24:04 +00:00
Evgeny @ SimpleX Chat a9bffc7296 core: delete ignored and replaced contact requests (#8185)
* core: test removal of ignored and replaced contact requests

* core: remove ignored and replaced contact requests from agent

* core: query plans of contact request tests

* core: update simplexmq (delete contact requests without rejection)

* core: fix test build with simplexmq server forward workers

* core: update simplexmq
2026-11-14 11:39:57 +00:00
Evgeny @ SimpleX Chat 8fe7e831ad website: webinar invitation on the home page (#8193)
* website: webinar invitation on the home page

* website: tracking link for the home page webinar line
2026-11-14 11:34:36 +00:00
Evgeny @ SimpleX Chat 36e7dc3f9e core: update simplexmq, show skipped messages, read work items in one snapshot (#8190)
* core: lock delivery and relay request work items on PostgreSQL

* core: retry store transactions aborted by PostgreSQL deadlocks

* core: show skipped messages followed by agent messages

* core: read delivery and relay request work items in one snapshot

* core: use the conflict retry of the store transaction for work item reads

* core: show integrity errors of agent messages from MSG without body

* core: show integrity errors from MSGERR, log MSGERR without an error

* core: update simplexmq, set server forward workers in tests

* core: update simplexmq
2026-11-14 10:28:07 +00:00
Evgeny @ SimpleX Chat 01151021bd mcp: Claude's answers live as Claude writes them, and one end line per turn (#8183)
* plan: mcp-activity

* plan: mcp-activity list format

* plan: mcp-activity answers and live step lines

* mcp: a silent line per step of Claude's work, completed at its end

* plan: mcp-activity as implemented

* mcp: finalize step lines within a day and load only the hook's modules

* plan: mcp-activity review decisions as implemented

* plan: mcp-live-answers

* plan: mcp-live-answers answers and the end line with the usage

* plan: mcp-live-answers end line with the plan usage, shared fast request

* plan: mcp-live-answers keeps tokens in context

* mcp: end live step lines by the wall clock

* mcp: exact spec ranges and measured hook load time

* mcp: Claude's answers live as Claude writes them, and one end line per turn

A prompt that starts a turn gets an empty silent live message, which the turn's first text, step or answer fills. The MessageDisplay hook, dist/display.js, passes each batch of Claude's text to the service, and the hub streams each text into a silent live message, updated at most every 3 s and finalized at its end. At Stop the streamed answer is claimed, or the answer is posted silent, and the end line !- ✅ Done in DURATION! follows as the turn's only alert.

* plan: mcp-live-answers as implemented

* mcp: one refusal post for a refused answer, in the turn's opening message

A text that a group preference refuses counts as the answer at Stop, so the answer is not posted again. A refused post that would fill the opening message fills it with its refusal text. A refused text ends at once, also when it outgrows a message, and an update scheduled before its end is skipped. Plan decision 37.

* mcp: live posts survive a lost opening message and end within a day

A failed update of the opening message drops it, and the post is sent as a new message; a text that was never posted no longer stands for the answer. Texts and opening messages end 23 hours after their send by the wall clock, as steps do. When the update with a refusal fails too, the opening message gets ⏹️ Stopped and the end line follows. The opening message is kept before User's post and sent after it.

* mcp: a dropped opening message ends with ⏹️ Stopped

When the update of the opening message fails without a refusal, the hub finalizes it, so after a transient failure it does not stay live.
2026-11-14 09:35:15 +00:00
Evgeny @ SimpleX Chat 348c42a640 ui, core, mcp: show Claude as an agent and User as a person (#8179)
* plan: mcp-agent-profile

* plan: mcp-agent-profile, answers Q1 (b) and Q2 (b)

* plan: mcp-agent-profile, lists render on GitHub

* mcp: User has the peer type of a person

* ui: show the peer type placeholder of members and contacts

* plan: mcp-agent-profile, answers to the user's notes

* ui: compare link icons with peerTypeIcon in the desktop test

* ui: snapshot references of the peer type placeholders

* android: peer type placeholder of a caller on the lock screen

* ios: agent icon of a link in the compose context at text size

* plan: mcp-agent-profile, review fixes

* ios: snapshot references with the compose context line of a link

* core: send a change of the peer type alone to groups

* mcp: User's peer type reaches existing session groups

* plan: mcp-agent-profile, Q1 (a)

* mcp: mark the agent profile item delivered in the roadmap
2026-11-14 09:12:01 +00:00
Evgeny @ SimpleX Chat 953389322f mcp: a list of every session and its state in the Main group (#8182)
* plan: mcp-activity

* plan: mcp-activity list format

* plan: mcp-activity answers and live step lines

* mcp: a silent line per step of Claude's work, completed at its end

* plan: mcp-activity as implemented

* mcp: finalize step lines within a day and load only the hook's modules

* plan: mcp-activity review decisions as implemented

* plan: mcp-session-list

* plan: mcp-session-list, every session in one message (Q2 B)

* mcp: end live step lines by the wall clock

* mcp: exact spec ranges and measured hook load time

* mcp: a list of every session and its state in the Main group

* plan: mcp-session-list as implemented

* mcp: list of sessions: unknown states count cards, bounded record reads, stop edit before the card wait

* plan: mcp-session-list merged with master

* mcp: ROADMAP marks the items delivered since 0.3.0 with ✅
2026-11-13 23:40:02 +00:00
Evgeny @ SimpleX Chat 743c1e7223 mcp: a line when a session's context is summarised (#8181)
* plan: mcp-context-summary

* plan: mcp-context-summary answers and gear emoji

* mcp: a line when a session's context is summarised

* mcp: take only a compaction boundary created before the hook started
2026-11-13 23:12:52 +00:00
Evgeny @ SimpleX Chat b4b14c8a1a mcp: approve a tool for the rest of a session with one tap (#8180)
* plan: mcp-activity

* plan: mcp-activity list format

* plan: mcp-activity answers and live step lines

* mcp: a silent line per step of Claude's work, completed at its end

* plan: mcp-activity as implemented

* mcp: finalize step lines within a day and load only the hook's modules

* plan: mcp-activity review decisions as implemented

* plan: mcp-allow-tool

* mcp: approve a tool for the rest of a session with one tap

* plan: mcp-allow-tool as implemented

* mcp: docs of the approval of a tool for the rest of a session

* mcp: record the checks of the PreToolUse hook with Claude Code

* plan: mcp-allow-tool citations of the new code

* mcp: keep the approvals of tools while the session's process re-attaches

* plan: mcp-allow-tool review round 1

* mcp: end the approvals of tools when the session's group is lost

* mcp: tool approvals end when the session's group is lost, docs and tests

* mcp: tool approvals follow the process that opened the session last

A process is identified by its ID and its start time, read from /proc/PID/stat on Linux and from ps on macOS. A registration from a process with the same ID and another start time ends the approvals.

/attach has the session server's parent process ID. While two processes have the session attached, only the attachments of the process of the last /session get the approved tools; the others get an empty list.

Tests cover the end of the approvals at a load of a lost group.

* plan: mcp-allow-tool decisions 36 and 37, the group's loss in the rules and the design

* mcp: a process whose start time is unknown counts as another process

A registration of the session's process ends the tool approvals when its start time can't be read, on systems other than Linux and macOS and after a failed read. The start time is read only for a process ID that is a positive integer; on macOS, /bin/ps runs with a 2 s timeout.
2026-11-13 22:50:36 +00:00
Evgeny @ SimpleX Chat 975cc700a0 mcp: specs name functions instead of line numbers (#8176)
* docs: MCP specs link files and name functions, without line numbers

* mcp: spec pointers above the functions, checked by a unit test

* mcp: spec pointers to API sections first, for every declaration described

* mcp: spec test reports malformed pointers and those not above a declaration
2026-11-13 20:15:51 +00:00
Evgeny @ SimpleX Chat fbc18f1555 mcp: Claude gets reactions as emoji replies (#8174)
* plan: mcp-reactions

* plan: mcp-replies

* plan: mcp-replies, one vocabulary with reactions

* plan: mcp-reactions, quote vocabulary of mcp-replies

* plan: mcp-reactions, ReplyTo names of mcp-replies

* plan: mcp-replies, replyTo from callers, file name in quotes

* plan: mcp-replies, itemSender stays private, quoted file names

* plan: mcp-reactions, Claude named by the hub's profile name

* plan: mcp-replies, Q1 decided: serve returns the new reply_to

* plan: mcp-reactions, Q1 decided, Q2 with a receipt reaction

* plan: mcp-replies, quote line before the reply, as the user asked

* plan: mcp-reactions, Q2 decided, reply form with a quote line

* plan: mcp-reactions, quote line cut at 200 characters

* plan: mcp-replies, quote of 200 characters, ellipsis when cut

* plan: mcp-replies, one quote line of 200 characters with media type

* plan: mcp-reactions, quote line with the media type

* plan: mcp-reactions, blank lines before continued decision lists

* plan: mcp-replies, blank lines before the numbered lists

* mcp: tests of the quoted message of a reply

* mcp: Claude gets the message a reply quotes

* docs: line links of protocol types in the MCP architecture

* mcp: quote lines end at every line break and keep emoji whole

* mcp: tests of reactions passed to Claude

* mcp: spec links of the reply change cite the queue and push lines, labels equal their anchors

* plan: mcp-replies, tests of the review fixes, test names as in the code, the closing-tag escape of Claude Code

* mcp: quotes for Claude drop bidi controls

* mcp: Claude gets reactions as emoji replies to the reacted message

* plan: mcp-reactions, decisions on the merged replies code

* mcp: reaction tests use the hub's Main group and the typed unknown reaction

* mcp: reactions reach Claude as the apps show them

* mcp: only known reactions reach Claude, others get a reply

* mcp: one reply per member and message for reactions Claude does not receive
2026-11-13 19:08:12 +00:00
spaced4ndyandspaced4ndy-agents ca20b79545 ui: show "Why SimpleX is built." in About opened from Settings (#8111)
* ui: show "Why SimpleX is built." in About opened from Settings

* docs: "Why SimpleX is built." in About opened from Settings

* android, desktop: keep About and its text clear of the bottom bar

* android, desktop: no blank bar above the text with the bottom bar

* android, desktop: About and why-built references

* ios: About from Settings references

* ui: revert About's iOS spacer and preview, the text's pane and top space

* docs: revert the About link notes in the apps' settings docs

* android, desktop: update the why-built page's preview references

* android, desktop: scroll the why-built page's text under the toolbar

* ios: keep the About link at the bottom of the screen, as in onboarding

---------

Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
2026-11-13 18:25:39 +00:00
spaced4ndyandspaced4ndy-agents 32688964dc android, desktop: show the error when a server test fails (#8054)
* android, desktop: readable error when a server test fails

* android, desktop: network and proxy details in server test errors

* android, desktop: test the text of server test errors

* android, desktop: set the server error test's locale and case name

* android, desktop: narrow the server test error text fix

---------

Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
2026-11-13 18:21:07 +00:00
Evgeny @ SimpleX Chat de604a08de mcp: a live line for each step of Claude's work (#8168)
* plan: mcp-activity

* plan: mcp-activity list format

* plan: mcp-activity answers and live step lines

* mcp: a silent line per step of Claude's work, completed at its end

* plan: mcp-activity as implemented

* mcp: finalize step lines within a day and load only the hook's modules

* plan: mcp-activity review decisions as implemented

* mcp: end live step lines by the wall clock

* mcp: exact spec ranges and measured hook load time

* mcp: cite the hook's skip of tool uses exactly
2026-11-13 18:13:24 +00:00
Evgeny @ SimpleX Chat 6c3e9709a7 core: show the latest item in chat previews (#8159)
* core: show the latest item in chat previews

* core: update query plans

* tests: pass values to badge test queries as parameters

* core: update query plans
2026-11-13 13:13:04 +00:00
Evgeny @ SimpleX Chat 8fda062956 mcp: Claude gets the message a reply quotes (#8162)
* plan: mcp-replies

* plan: mcp-replies, one vocabulary with reactions

* plan: mcp-replies, replyTo from callers, file name in quotes

* plan: mcp-replies, itemSender stays private, quoted file names

* plan: mcp-replies, Q1 decided: serve returns the new reply_to

* plan: mcp-replies, quote line before the reply, as the user asked

* plan: mcp-replies, quote of 200 characters, ellipsis when cut

* plan: mcp-replies, one quote line of 200 characters with media type

* plan: mcp-replies, blank lines before the numbered lists

* mcp: tests of the quoted message of a reply

* mcp: Claude gets the message a reply quotes

* docs: line links of protocol types in the MCP architecture

* mcp: quote lines end at every line break and keep emoji whole

* mcp: spec links of the reply change cite the queue and push lines, labels equal their anchors

* plan: mcp-replies, tests of the review fixes, test names as in the code, the closing-tag escape of Claude Code

* mcp: quotes for Claude drop bidi controls
2026-11-13 12:25:57 +00:00
Evgeny @ SimpleX Chat 127fdcce56 mcp: link after an ended session start, Main group name Claude Control (#8163)
* plan: mcp-fixes

* plan: mcp-fixes reproduction at master

* plan: mcp-fixes list formatting

* mcp: link after an ended session start, Main group name Claude Control

* mcp: test the ready line after a start, the hook's machine error; docs
2026-11-13 10:48:23 +00:00
Evgeny @ SimpleX Chat 97bbbd9ac4 mcp: one-line notes of Claude Code's own prompts (#8157)
* plan: mcp-harness-notes

* mcp: tests for one-line notes of Claude Code's own prompts

* mcp: one-line notes of Claude Code's own prompts in the session group

* mcp: classify a repeated typed prompt by its own entry

* mcp: document the notes of Claude Code's own prompts

* plan: mcp-harness-notes as implemented

* mcp: notes of teammate messages and of prompts in long turns

* mcp: document teammate notes and the record rules of review round 1

* mcp: teammate note emoji, repeated events and idle notifications

* mcp: one-line sender names in notes, and docs that match the code

* mcp: docs state which prompts end tool-use cards and add turn records

* plan: mcp-harness-notes example lines from Claude Code 2.1.281
2026-11-13 07:25:51 +00:00
Evgeny @ SimpleX Chatandshum 9d3241b06c mcp: Claude Code plugin, a SimpleX group per session (0.3.0) (#8116)
* mcp: remove HTTP serve and register modes

* mcp: read plugin options

* mcp: add daemon data root layout

* mcp: keep actions per session

* mcp: serve tools for one session profile

* mcp: add plain QR code text

* mcp: share the Main group across sessions

* mcp: promote only the first joiner to owner

* mcp: add the daemon socket protocol

* mcp: fix socket UTF-8 and late error handling

* mcp: open session agents and the hub

* mcp: order hub control work on one chain

* mcp: add the daemon

* mcp: fix daemon disconnects, stop and idle calls

* mcp: create the socket token atomically

* mcp: add the daemon client

* mcp: handle spawn errors and a stopped daemon

* mcp: add the stdio session server

* mcp: retry session calls after a daemon restart

* mcp: add the SessionStart hook and link commands

* mcp: remove unused shell quoting

* mcp: wire session, daemon and hook commands

* mcp: reject inherited names as commands

* mcp: add the Claude Code plugin

* mcp: add the plugin marketplace

* mcp: test the daemon end to end

* mcp: say Main group in tool descriptions

* mcp: document the plugin and the daemon

* mcp: record session titles from the hook

* mcp: allow long tool calls

* mcp: name the SimpleX daemon in texts

* mcp: quote no-owner texts and cite hook docs

* mcp: drop the project from title requests

* mcp: record Claude Code plugin checks

* mcp: qualify Claude Code check evidence

* mcp: start new profiles without preset contact

* mcp: remove unit test temp folders

* mcp: fix preset contact review findings

* mcp: expire each action with its own timer

* mcp: wait for decisions without a tick

* mcp: expire actions on core events and requests

* mcp: document the delivery poll at stop

* mcp: assert the socket handler error log

* mcp: complete only the session's own connects

* mcp: move closeServer to the test fixtures

* mcp: drop the name from session requests

* mcp: listen before the hub opens

* mcp: keep the approval mode per session

* mcp: pre-approve the skill commands

* mcp: a group per session under one Claude profile, approved by owners

* mcp: prompts, answers and tool-use approval in the session group, 0.3.0

* mcp: reply to prompts of stopped sessions, skip prompts echoed in a tag

* mcp: document the Claude Code plugin of 0.3.0

* mcp: name one-line commands in the plugin reference

* mcp: real-session checks without a channel command

* mcp: specify the Claude Code plugin, and serve as built in 0.3.0

* mcp: run the plugin from its own build and shrinkwrap, without npx

* mcp: start with a torn session file, and on file systems without links

* mcp: start the daemon with only the environment variables it uses

* mcp: one group per Claude Code process, re-attach, late contacts

* mcp: document one session per process, re-attach and the plugin launch

* mcp: hold prompts after a daemon start until the session attaches

* mcp: document prompts held after a daemon start

* mcp: pack production dependencies only, for a faster plugin install

* mcp: keep resumed sessions' groups, quote by hook start, order prompts

* mcp: document resumed sessions, turn records and ordered prompts

* mcp: quote each prompt once, post without refused quotes, answer first

* mcp: wait for a stopping daemon to release the lock

* mcp: double the re-attach delay once per attempt

* mcp: read a token file of another user as serve 0.2 did

* mcp: cut long prompts and answers to fit the daemon's body limit

* mcp: document quotes, refused quotes, the lock wait and long prompts

* mcp: open a titled new session only after its process registers

* mcp: document titles held until the session server registers

* mcp: skip late turn records and tag-only prompts, describe after failures

* mcp: take over the lock atomically, keep held titles across stops

* mcp: document turn records, tag-only prompts, the lock and held titles

* mcp: delete groups of sessions closed 7 days; no group for claude -p

* mcp: keep the approved mode in the session group, the link off /status

* mcp: apply leaving, removal and demotion in the Main group to sessions

* mcp: reply sends a file after an owner's approval when non-owners see it

* mcp: spec of closed groups, -p runs, mode, membership and reply cards

* mcp: resume after a running group deletion, continue past failed ones

* mcp: post terminal prompts in the current group of a resumed session

* mcp: show only the file's name and size on a reply card

* mcp: the hooks of a run Claude Code marks unattended post nothing

* mcp: serve lists its tools with the metadata of 0.2

* mcp: list leaves out the session's tool-use and mode cards

* mcp: one starter takes over a stale lock also without hard links

* mcp: test a resume after deletion, reply cards and demotion end to end

* mcp: document resumes after deletion, unattended runs and reply cards

* mcp: spec of round 5 fixes, with source links at their lines

* mcp: no permission relay in a run without a group or with invalid options

* mcp: spec of the permission relay of a run without a group

* mcp: every session keeps its group, claude -p runs included

* mcp: changes of the Main group's members leave session groups as they are

* mcp: every member who joins from the Main group prompts and approves

* mcp: reply cards match send cards; /approve N all sends later files too

While a session group has a guest, a member added without the Main group, the card of a reply shows its caption, the file's type, path and size, and an image's or a video's preview, as a card of send does. /approve N all approves that file, the other pending reply files and every later one of the group, until /revoke; the approval is kept in the group's custom data and counts while its approver joined from the Main group and stays in the group.

* mcp: the Main group says everyone in it is trusted with all sessions

The short description and the welcome message of the Main group, also of an existing one at the daemon's start, and a message at each member's join say that everyone in the group is trusted with all Claude Code sessions of the hub: they can join each session's group by /join N, prompt Claude and approve its actions.

* mcp: a session group says whether each joiner came from the Main group

When a member joins a session's group, Claude posts there that the member joined from the Main group, and their messages are prompts and they can approve actions, or that the member joined as a guest, whose messages are not prompts and who gets Claude's files only after an approval. The welcome message of a new session group says that members who join from the Main group prompt the session and approve its actions.

* mcp: test Main group members, guests and reply approvals end to end

A member who joins the Main group by an owner's link and a session's group by /join prompts and approves there, also after removal from the Main group; a guest added by a group link gets reply files after an approval, /approve N all sends later files at once, and /revoke ends it. The Main group and the session group post the join statements.

* mcp: document the trust of the Main group, guests and kept session groups

REFERENCE, README and TESTING describe that every member of the Main group prompts and approves in the sessions' groups, that changes in the Main group leave the sessions' groups as they are, the join statements, guests and the reply card with /approve N all and /revoke. The texts about deleted groups of closed sessions, runs without a group and the cascade of Main group changes are removed, as their behaviour was reverted.

* mcp: spec of the trust of the Main group, guests and kept session groups

The spec describes approvers as the members invited through the Main group, the statements of trust and standing, the reply card with /approve N all and /revoke, and Main group changes that leave the session groups as they are. The sections on deleted groups of closed sessions, runs without a group and the cascade are removed, flow 30 among them, and the source links point at the lines of this commit.

* mcp: claude -p and unattended runs get no session and no group again

A run whose CLAUDE_CODE_ENTRYPOINT is sdk-cli, sdk-ts or sdk-py, or whose CLAUDE_CODE_SESSION_ATTENDED is 0, gets no session and no group: its hooks post nothing, and its session server answers every call with the text of a run that is not interactive, without the daemon. Only the deletion of the groups of closed sessions stays removed.

* mcp: no group for the server of a claude -p run under a VS Code session

A claude -p run started by a command of a session of the VS Code extension or the desktop app keeps that session's entrypoint, and its MCP server gets the session's CLAUDE_CODE_SESSION_ATTENDED 1; only its hooks get 0. Its SessionStart hook now sends /title with unattended for its Claude Code process, and the daemon refuses /session from that process with status 403 for 10 seconds, before or after the title; the session server then answers every call with the text of a run that is not interactive and registers no more. The tests take the environments of a recorded run of Claude Code 2.1.319.

* mcp: Claude's channel and reply texts name members from the Main group

The channel instructions and the description of reply say that prompts come from the members who joined the session's group from the Main group, and that one of them approves a file while the group has a guest, in place of the owners.

* mcp: test that the session server stays out of the modern MCP era

Claude Code 2.1.319 registers no channel for a server that negotiates the modern protocol revision 2026-07-28. The test sends Claude Code's server/discover probe and its initialize, and expects Method not found and the revision 2025-11-25, so that an SDK upgrade that turns the modern era on fails the tests.

* mcp: document runs without a group and the refused server of claude -p

REFERENCE describes again the runs that are not interactive, and the refusal of the session server of a claude -p run under a VS Code session; TESTING restores the real-session checks of such runs, adds the one under a VS Code session, and names the recorded environments and the protocol era test.

* mcp: spec of runs without a group, the unattended mark and the MCP era

The spec describes again the runs that are not interactive, in flow 30 and the tables, with the mark of the process of a claude -p run under a VS Code session, the 403 of its session server and the end of its retries; it states the revision 2025-11-25 and the server/discover answer that keep the channel registered, and the channel instructions in their new words. Source links point at the lines of this commit.

* mcp: // passes a / command to Claude, /! an owner's ! command

In a session's group, every one-line message that starts with / is a command of the group. A message that starts with // reaches Claude without its first /, so //model sonnet arrives as /model sonnet. A message that starts with /! from a member whose member in the Main group is an owner reaches Claude as !...; from another member it gets the reply Only owners of the Main group can send ! commands to Claude. A message that starts with ! is not passed, and gets the reply Messages starting with ! reach Claude only from owners, as /!command.

* mcp: an unknown command in a session's group gets Unknown command.

The reply to a one-line / message that is not a command of a session's group no longer lists the commands, which the group's menu and the cards show; its text Unknown command. waits for the user's wording. The agent control chat of serve keeps its commands reply.

* mcp: guests' messages reach Claude as prompts

Every member of a session's group but User prompts the session, a guest added to the group directly too; approvals and tool-use verdicts still count only from members who joined from the Main group. Claude's channel instructions and the description of reply name the members of the group.

* mcp: split answers and terminal prompts at the size of a message

Answers and terminal prompts are posted in parts that each fit one message by the size check of send, fitsMessage, with the quote in the first part of an answer, in place of parts of 12000 encoded bytes: a Latin part holds 14962 characters, a Cyrillic part 7481 and a CJK part 4987. An answer quotes its prompt when the quote fits with an empty text.

* mcp: the option approve_guest_files turns the guests' file cards off

The plugin option approve_guest_files, a boolean on by default, passed to the session server as CLAUDE_PLUGIN_OPTION_APPROVE_GUEST_FILES: on, a file of reply waits for its card while the group has a guest, and /approve N all works as before; off, reply sends the file at once. The daemon applies the option of each /session and /title to all sessions, as the expiry, and refuses a config without it.

* mcp: test end to end that a guest prompts and each join is posted once

The trust test checks that the guest's message reaches the session as a prompt, and that the Main group and the session's group hold one join post for each member: the core raises joinedGroupMember for a member the hub hosts and connectedToGroupMember for one another member hosts, one of the two for each connection, in the same case of its CON handler.

* mcp: document //, /!, Unknown command., guest prompts, parts and the option

REFERENCE describes the commands and prompts of a session's group with // and /!, the reply Unknown command., the guests' prompts, the parts of a message's size, and the option approve_guest_files; README states the guests' prompts; TESTING adds a real-session check of // and /! and the e2e checks of guest prompts and single join posts.

* mcp: a space in the prompt queue of a session

Formatting of the line that queues a prompt.

* mcp: an answer drops the quote that leaves no room for its first character

The quote of an answer is kept when it fits with the answer's first character, so that the first part fits one message.

* mcp: spec of //, /!, guest prompts, parts and approve_guest_files

The spec describes the commands and prompts of a session's group with // and /!, the reply Unknown command., the guests' prompts, the parts that each fit one message with a quote that fits the first character, the option approve_guest_files, and one post for each join.

* mcp: document an answer without the quote that leaves it no room

REFERENCE states that an answer is posted without the quote when the quote leaves no room for its first character.

* mcp: a reply too large with its quote is posted without it

Claude's posts with a quote are sent again without it also when the core refuses them with largeMsg, as replies that quote a message near the size limit are.

* mcp: no command reply to a one-line / part that User posts

The control of a session's group drops the commands of User, the member of the hub's contact marked simplexMcpUser, in the order of the other commands, so a part of a terminal prompt that starts with / gets no reply.

* mcp: a part of a long text is searched within one message size

textParts searches each part among the next 15602 characters, the most a message holds, in place of the whole rest of the text; the parts stay the same.

* mcp: reply refuses a caption too long for a message with its file

reply checks the file's message with its caption as send does, before the post and before the card: text: too long for a message with this TYPE; shorten it.

* mcp: the daemon forgets the unattended marks older than 10 s

Each new mark of an unattended run removes the marks of 10 seconds ago and older, which no longer refuse a session server.

* mcp: test end to end the reply to a prompt as long as a message

The mirroring test sends the longest text the member's core sends to a session without Claude Code and waits for Session 1 is not running. without the quote; before 193f03f6c the core refused the reply with largeMsg and nothing was posted.

* mcp: document large replies, User's / parts, reply size, check 6

REFERENCE states that a reply too large with its quote is posted without it, that User's posts are never commands, and that reply refuses a caption too long for its message; TESTING records check 6 with Claude Code 2.1.319, which runs no command or shell command from a channel prompt, and the e2e reply to a long prompt.

* mcp: spec of large replies, User's commands, reply size, the marks

The spec describes replies sent again without the quote on largeMsg, User's commands dropped, the search of a part within one message size, the reply's message size check and the removal of old unattended marks; the source links follow the new lines.

* mcp: send and reply share the text of a message too long

tooLongText gives the refusal of send and reply: the text too long for the message with its quote, or for a message with the file.

* mcp: spec links of the shared refusal text

The spec names tooLongText and follows the lines of tools.ts after it.

* mcp: a reset of the owners leaves the session groups as they are

A replaced Main group keeps every session group and its invited records, so the members who joined from the old Main group keep prompting and approving there, as rule 4 of the trust model states for every change in the Main group.

* mcp: test end to end that the members stay after a reset of owners

The trust test approves a reset of the owners and checks that Alice and Bob, who joined from the old Main group, stay in the session's group, prompt there and get No pending actions. for /pending.

* mcp: document the reset of the owners and a hand-edited approve

REFERENCE states that a reset of the owners keeps the sessions' groups and the standing of their members, with /! from owners of the new Main group, and that a hand-edited approve outside requests and host is shown only at the session start while the tools run in mode requests; TESTING lists the reset in the trust test.

* mcp: spec of a reset of the owners that keeps the session groups

The spec describes the replacement of the Main group without changes to the session groups and their invited lists, with /! from owners of the new Main group, drops removeOwners and its log context, and follows the new lines of hub.ts and main-group.ts.

* mcp: every member controls a session; Main group owners approve files

Every member of a session group but User and observers prompts the session and approves its actions and tool use, whatever way they joined; each joiner gets the post NAME can send prompts to Claude and approve tool use, with the command that makes them an observer. A file of reply waits for an owner of the Main group in every session group, while the option is on; other members' approvals of files are refused, and a group without such an owner refuses the reply. The hub keeps the contact of User from its start.

* mcp: the option approve_files turns the file cards off

The plugin option approve_guest_files is renamed approve_files, variable CLAUDE_PLUGIN_OPTION_APPROVE_FILES and config field approveFiles, on by default; its title and description name the owner of the Main group who approves Claude's files.

* mcp: the reply to an unknown command names // for Claude's commands

A one-line / text outside the requests of a session group gets Unknown command. To send a command to Claude, start it with //.

* mcp: /observer #G ID makes a member of a session group an observer

The command is accepted from a member whose role lets them change that member's role in SimpleX: admin or owner, and not below the member's role; the member, Claude, the sender, a relay and a pending member are refused, and so is another group. The end-to-end test makes Carol an observer by the command of her join post, and her app then refuses to send.

* mcp: a session without an approver names members who can approve

The refusal of a new action in a session group without an approver says it has no member who can approve actions, a proposed text.

* mcp: document that every member of a session group controls it

REFERENCE and README state that every member but User and observers prompts and approves, the join post with /observer, the files approved by owners of the Main group, the option approve_files and the reply to an unknown command; TESTING lists the trust test as it now runs.

* mcp: spec of session groups that every member controls

The spec describes approvers as every member but User and observers, the join post with /observer and the command, files decided by owners of the Main group, the option approve_files, the reply to an unknown command and the refusal texts, and follows the new lines of the source.

* mcp: Claude's files reach a session group without approval

reply sends its file at once, and the core refuses it when the group's preference for files and media forbids it; the option approve_files, the reply cards, /approve N all and the bare /revoke of a session group are removed.

* mcp: rights in a session group follow the member's role there

Admins and owners of a session group approve actions and tool use and send // and /! commands to Claude; members, moderators and authors send prompts, and their // and /! commands get a reply. /join N invites a member of the Main group as admin, and an owner of the Main group as owner.

* mcp: Claude posts a member's rights at each join and role change

At each join and each change of a member's role in a session group, User excepted, Claude posts the rights of that role: admins and owners send prompts and // and /! commands and approve tool use; members, moderators and authors send prompts; observers can't send. The posts of sending roles end with the /observer command for that member, and the reply to /observer states the observer's rights.

* mcp: session groups keep no record of their invited members

Rights follow the role in the session group, so the invitations through the Main group are no longer recorded in the group's custom data.

* mcp: session groups keep the profile their owners changed

A session group's Control takes the group's profile from each groupUpdated event, so the updates of the model, the effort level and the name keep what owners changed, the preference for files and media included.

* mcp: document rights by role in session groups and files without cards

REFERENCE and README state the rights of each role in a session group, /join N as admin, the rights posts at joins and role changes, the replies to // and /! and to approvals from other roles, files of reply sent at once under the group's preference for files and media, and the removed option approve_files; TESTING lists the trust test as it now runs.

* mcp: spec of rights by role in session groups

The spec describes approvers as admins and owners of the session group, the replies to // and /! from other roles, /join N as admin, the rights posts at joins and role changes and the /observer reply, files of reply sent at once under the group's preference for files and media, the profile kept from groupUpdated, the session group's data without invited members and the options without approve_files, and follows the new lines of the source.

* mcp: spec flow 28 messages without semicolons

Mermaid ends a sequence message at a semicolon, so the join and rights messages of flow 28 use commas and a shortened post.

* mcp: group profile updates start from the group's current profile

Control and the Main group read the group's profile from the chat database before each update, and change only their own fields: the name, the short description, the Main group's description and the commands. The preferences owners set, files and media included, stay. This replaces the profile taken from groupUpdated events, which covered session groups only.

* mcp: / commands in a session group come from admins and owners

A one-line / text, a // text or a /! text from a moderator, member or author gets one reply, Only admins and owners of this group can send / commands., and reaches neither Control nor Claude. The check is Session.refusesCommand in Session.onMessage; without it, the replies of Control and Session.prompt apply as before.

* mcp: document / commands from admins and owners and profile updates

REFERENCE and README state that every message of a member who can send is a prompt except / commands, // and /!, that the / commands of moderators, members and authors get one refusal, and that Claude changes only its own fields of a group's profile, from the profile as it stands; TESTING lists the trust test as it now runs.

* mcp: spec of / commands from admins and owners and profile updates

The spec describes the one refusal of the / commands, // and /! of moderators, members and authors before Control and the prompt, the profile updates of Control and the Main group from the group's current profile, the removal of the groupUpdated handling, and follows the new lines of the source.

* mcp: spec summary of / commands from admins and owners

* mcp: spec diagrams render whole on GitHub

Mermaid ends a sequence message, a note and a block label at a semicolon and treats # as the start of a comment; the diagrams write them as #59; and #35;, which render as ; and #. All 36 diagrams of the spec render with GitHub's Mermaid viewer, each message, note and label in full.

* mcp: /observer ends the observer's standing approvals at once

Control reads the group's members again after /observer sets the role, as after a role change in the app, so the approvals of all messages to a chat and of all files from it that the new observer gave count no more.

* mcp: /observer answers that a member who has not joined is no member

A member invited to a session group who has not joined yet is neither current nor pending, so /observer #G ID answers No member ID in this group. and changes nothing; the member joins with the role of the invitation, and its role can change after the join.

* mcp: a session's rename and model change keep both in the group

Control makes its profile updates of a group one at a time, each from the profile the one before it wrote, so a rename and a change of the model or effort that overlap both stay in the group's profile.

* mcp: test the mode host card after a role change to the first admin

A session that requested mode host while its group had no admin or owner posts the mode card once a member becomes the group's first admin by a role change, after the post of the member's rights.

* mcp: no code comments

The code and tests carry no comments; the facts they stated are in the spec: an expiry timer that fires before the expiry time, the listener before the hub opens, the exit after the /stop reply, the stop timer cleared by a new entry, the socket path limit, the repeated call of an unknown session, and the request without a connection pool.

* mcp: document /observer and the Main group observer

REFERENCE states that a Main group observer can't send /join N, that /observer ends the observer's standing approvals at once, and the reply for a member who has not joined yet; TESTING lists the /observer test.

* mcp: spec of /observer, profile updates one at a time, removed comments

The spec describes the members read again after /observer, the reply for a member who is neither current nor pending, Control's profile updates one at a time, and the facts the removed code comments stated, and follows the new lines of the source.

* mcp: rights posts name / commands, without the observer hint for owners

The rights of admins and owners read can send prompts and / commands to Claude, and approve tool use; those of moderators, members and authors read can send prompts to Claude; / commands and approvals need the role admin or owner. The post for an owner ends without the /observer command, as an admin can't change an owner's role.

* mcp: session group description names prompts, / commands and approvals

A new session group's description reads The Claude Code session N. Members send it prompts; admins and owners also send / commands and approve tool use. Existing groups keep theirs, as Control sets only the name and the commands.

* mcp: Main group welcome and join post state what members can do

* mcp: Main group short description states what members can do

* mcp: Main group replies Unknown command. to an unknown command

* mcp: architecture names the Main group's texts as they now stand

* mcp: reply answers that files and media are off in the session group

* mcp: Main group texts are set at its creation, so owners' edits stay

* mcp: plugin texts name admins and owners where they decide

* mcp: commands of members past the one refusal get no reply

* mcp: overview link labels of the architecture match their lines

* mcp: actions expire within 60 s after a sleep past their expiry time

* mcp: cards of image and video actions are text while media are off

* mcp: /forward answers that files and media are off in the session group

* mcp: docs say an observer's standing approvals count again as admin

* mcp: serve passes the 0.2 tests unchanged

* mcp: serve answers /give with the list of commands, as 0.2

* mcp: maxTimer is private to messages.ts again, as 0.2

* mcp: docs state what text cards and serve's kept expired actions do

* mcp: the e2e test checks the bot receives the image with its file

* mcp: Claude names the group preference that refuses a post

* mcp: spec drops the reply file approvals that decision 87 removed

* mcp: docs say a refused outcome card leaves a performed action done

* mcp: a refused outcome card of a done action says it was performed

* mcp: a refused terminal prompt says the feature is not allowed for User

* mcp: test the cards refused for a preset server's SimpleX link

* mcp: docs name the text that reply returns for a refused file

* mcp: refused cards name the outcome; failure logs end with one period

* mcp: test the notice of a card edit refused after an expiry

* mcp: serve logs a failure with the period of 0.2

* mcp: reset-owners replaces the Main group at once, without an approval

* mcp: the plugin install links the marketplace on master

* mcp: docs state which Main group texts Claude keeps

* mcp: the plugin leaves serve agents named token and lock as they are

* mcp: rename the plugin's daemon to the service

* mcp: remove // and /!; a message starting with ! is a prompt

* mcp: docs say one-line / messages are the group's commands

* mcp: spec drops // and /!, which decision 117 removed

* mcp: remove the plugin's link and reset-owners skills

* mcp: test an admin's multi-line // and /! text reaches Claude as sent

* mcp: docs say the PreToolUse hook runs plugin/allow.js

* mcp: publish the plugin with its production dependencies bundled

* mcp, docs: the package bundles its dependencies; nothing installs them

* mcp: spec of the bundled dependencies and the package without a lockfile

* mcp: test the packed plugin has no link, which Claude Code refuses

* mcp, docs: plugin-only README; serve and shared settings in REFERENCE

* mcp, docs: shared settings name channels and process IDs precisely

* mcp: the description shows the model from the first answer

* mcp, docs: the Stop hook reads the model of its answer

* mcp, docs: README names a roadmap of what comes next

* mcp, docs: README and REFERENCE in short sentences

* mcp, docs: plain sentences in TESTING, spec and plugin texts

* mcp: the marketplace description names its one plugin

* mcp, docs: README shows a session group; serve images move to REFERENCE

* mcp: simplex-chat 7.1.3 and @simplex-chat/types 7.1.3, core 7.1.3.0

* mcp, docs: the package is a 4 MB download

* mcp: an older turn request no longer replaces a newer model or effort

* mcp: a held title's model keeps the start time of its hook

* mcp: User posts only prompts a person typed, not Claude Code's own

* mcp: User posts a typed prompt behind a slow hook or a new transcript

* mcp, docs: shorter Safety section in README

* mcp, docs: README says how to use the plugin without the channel

* plan: decisions 121 and 122 are decided by judgement on 2026-11-12

---------

Co-authored-by: shum <github.shum@liber.li>
2026-11-12 18:52:05 +00:00
Evgeny @ SimpleX Chat 5f2367fd9d docs: plan the Claude Code plugin and SimpleX channel of the MCP server (#8074)
* docs: plan the Claude Code plugin and SimpleX channel of the MCP server

* docs: MCP plan, adopting #7810 from its branch

* docs: MCP plan, one pull request from the branch of #7810

* docs: MCP plan, a group per session

* docs: MCP plan, mirroring the terminal conversation

* docs: MCP plan, Claude and User profiles, model and effort

* docs: MCP plan, sessions inside one group

* docs: MCP plan, sessions as subgroups

* docs: MCP plan, one Claude profile, decisions D8-D10

* docs: MCP plan, implementation goal

* docs: MCP plan, decisions 27-35 on mirroring and tool use

* docs: MCP plan, model and effort change outside the group

* plans: plugin launch from its own build, one session per process

* plans: hold prompts after a daemon start until the session attaches

* plans: publish the plugin with production dependencies only

* plan: resumed sessions, turn records, ordered prompts, lock check

* plan: quote once, refused quotes, lock wait, cut prompts

* plan: hold a new session's title until its server registers

* plan: late turn records, tag-only prompts, lock claims, held titles

* plan: delete groups of sessions closed 7 days; no group for claude -p

* plan: keep the approved mode in the session group, the link off /status

* plan: apply leaving, removal and demotion in the Main group to sessions

* plan: reply sends a file after an owner's approval when non-owners see it

* plan: the line count is an estimate; done is complete and tested

* plan: resumes after deletion, User's group, unattended runs, reply cards

* plan: trust model of the Main group; review-driven changes removed

Adds the Trust model section set by the user, rewrites decision 17, and marks decisions 60, 62, 63 and 64-66 as removed by the user's rule on reviews; the sections on closed sessions, runs without a group, the cascade of Main group changes and User's newest group are removed, and the reply section follows rule 5.

* plan: no group for claude -p kept, the unattended mark, the MCP era test

Decision 60 keeps the runs without a group, by the user's answer R1 B, with the amendment of the unattended mark; only the deletion of closed groups stays removed, with decisions 64 and 65. Decision 66 is restored, decision 69 records the test of the protocol revision, the section on runs that are not interactive returns with its diagrams, and the channel instructions follow the trust model.

* plan: //, /!, guest prompts, parts of a message, approve_guest_files

Decisions 70-73 record the user's answers: // and /! with the approved texts, Unknown command. as a placeholder, guests' prompts with approvals kept, the option approve_guest_files; decisions 17, 33, 41 and 53 are rewritten; the trust model, the mechanics, the diagrams and the pending texts follow.

* plan: large replies, User's commands, part search, reply size, marks

Decision 50 covers a post refused as largeMsg; decisions 74-77 record User's dropped commands, the search of a part within one message size, the reply's message size check and the removal of old unattended marks; the mechanics and diagrams follow.

* plan: a reset of the owners leaves the session groups as they are

Decision 78 records the user's decision by rule 4 of the trust model; the Groups section and its diagram follow.

* plan: the corrected trust model: every session member controls it

The trust model is replaced by the user's corrected one; decisions 79-83 record every member's control, the join post with /observer, the /observer command, files approved by owners of the Main group with approve_files, and the start notice pending; decision 71 takes the user's text; the mechanics, diagrams and the pending texts follow.

* plan: the role model of session groups

Rights in a session group follow the member's role there: admins and owners prompt, approve and send // and /!; moderators, members and authors prompt; /join N invites as admin; Claude posts the member's rights at each join and role change; files of reply are sent at once under the group's preference for files and media; session groups keep no invited records. Decisions 84-89, and proposal 90 for the profile kept from groupUpdated.

* plan: / commands from admins and owners, profile updates from the current profile

Decision 92 records that every message of a member who sends is a prompt except / commands, // and /!. Proposals 90, profile updates from the group's current profile, and 91, one refusal of the / commands of moderators, members and authors, wait for the user.

* plan: diagrams render whole on GitHub

Semicolons and # in sequence messages, notes and state transitions are written as #59; and #35;, and the second colon of a state note as #58;. All 26 diagrams of the plan render with GitHub's Mermaid viewer, each text in full.

* plan: /observer and profile updates after review round 7

Decisions 93-96: /observer reads the members again after the role change; it answers that a member who has not joined yet is no member; profile updates of a session group run one at a time; the code has no comments.

* plan: rights texts of the UX page's recommended branch

Decision 97: the rights texts name / commands, and the owner's post has no /observer command.

* plan: session group description of the UX page's recommended branch

Decision 98: the session group's description, set at its creation.

* plan: Main group welcome and join post, approved as B1 and B2

* plan: Main group short description, T3 of the UX page

* plan: Main group reply to an unknown command, G6 of the UX page

* plan: reply answers the files refusal with its own text

* plan: Main group texts set at its creation, UX-F3 a

* plan: admins and owners in the texts outside the group, rule 3

* plan: no reply to commands of members past the one refusal, U2 a

* plan: expiry timers wait at most 60 s, review round 8 F1

* plan: text cards while media are off, review round 8 question 2 a

* plan: /forward while media are off, review round 8 question 3 a

* plan: decision 93 names when an observer's approvals count again

* plan: serve passes the 0.2 tests unchanged, review round 8 question 1 b

* plan: the UX page's new address

* plan: premises, and open decisions decided by judgement but UX-I1

* plan: decision 31 reads the effort level from every turn hook, as the code

* plan: decisions 107 and 109 state the behaviour exactly, round 9 N2 N3

* plan: one text names a refusing group preference; serve /give as 0.2

* plan: decision 76 without the card reply no longer has

* plan: decision 114, a refused outcome card leaves the action done

* plan: decision 114, a refused outcome card says the action was performed

* plan: decision 114, a refused prompt of User says it is not allowed for User

* plan: decision 114, a card refused after the decision names the outcome

* plan: decision 114, the one-period log line is the plugin's; serve keeps 0.2's

* plan: decision 113 b, the user's answer: reset-owners needs no approval

* plan: decision 116, the service, and root files no agent name can take

* plan: decision 117, the user's answer: // and /! are removed

* plan: decision 118, the user's answer: the plugin's skills are removed

* plan: decision 21 names the PreToolUse hook's plugin/allow.js

* plan: decision 119, the user's answer: bundled dependencies, no lockfile

* plan: decision 120, the user's answer: plugin-only README, shared settings

* plan: decision 31, the Stop hook sends the model of its answer

* docs: the MCP server's PLAN.md moves to plans/2026-10-19-mcp-server.md

* plan: decisions 121 and 122, typed prompts and the newest model
2026-11-12 18:32:13 +00:00
Evgeny @ SimpleX Chat 3e8ca06a9c ios: reset network settings to per-session transport isolation, as on first start (#8154) 2026-11-12 17:52:39 +00:00
sh-agentsandsh-agents 225b3eef60 support bot light: show database errors in dry run (#8149)
Co-authored-by: sh-agents <350651734+sh-agents@users.noreply.github.com>
2026-11-12 14:48:26 +00:00
sh-agentsandsh-agents 158338e5d0 support bot light: dry run with migration checks and rollback (#8147)
* support bot light: check config and database with --dry-run

* ci: test the light support bot

---------

Co-authored-by: sh-agents <350651734+sh-agents@users.noreply.github.com>
2026-11-12 14:16:33 +00:00
spaced4ndyandspaced4ndy-agents a77bfdcec3 android, desktop: show the SimpleX Lock notice reliably at a start (#8052)
* android, desktop: show the SimpleX Lock notice at the next start

* android, desktop: keep the SimpleX Lock notice from covering other alerts

* android, desktop: name the condition of the SimpleX Lock notice

* android, desktop: state the SimpleX Lock notice conditions in the spec

* android, desktop: don't show the SimpleX Lock notice over a dialog

* android, desktop: narrow the SimpleX Lock notice fix

---------

Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
2026-11-12 13:34:28 +00:00
spaced4ndyandspaced4ndy-agents fe999830e9 android, desktop: keep the channel name after Configure relays (#8051)
* android, desktop: keep the channel name after Configure relays

* android, desktop: prevent a second channel after Configure relays

* android, desktop: keep the relays state after Configure relays

* android, desktop: keep only the channel name and the running creation

---------

Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
2026-11-12 13:33:50 +00:00
spaced4ndyandspaced4ndy-agents 4e652b6b87 ios: show verified shield in channel members list at once (#8110)
* ios: show verified shield in channel members list at once

* ios: channel member row at file scope, named as on Kotlin

* ios: remove a blank line in the channel members view

---------

Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
2026-11-12 13:33:00 +00:00
Evgeny b7b05a2618 libs: nodejs and python 7.1.3 (#8139) 2026-11-12 09:48:11 +00:00
Evgeny @ SimpleX Chat 51ba145760 libs: nodejs and python 7.1.3 2026-11-12 09:07:07 +00:00
Evgeny c6e7549b12 support bot: Docker deployment, TOML config, migration checks before start (#8130) 2026-11-12 08:11:41 +00:00
sh-agents b3732dd6d5 support bot: config file sections 2026-11-12 07:07:14 +00:00
sh-agents 8b73d46585 support bot: set the core queue size 2026-11-12 07:02:56 +00:00
sh-agents 1eb8041644 support bot: Grok API key in config 2026-11-12 06:50:14 +00:00
sh-agents 43e8426732 support bot: roll back migrations with --dry-run, connection in config 2026-11-12 06:46:01 +00:00
Evgeny @ SimpleX Chat 9764699e0f core: 7.1.3.0, types: 7.1.3 (#8133)
* core: 7.1.3.0

* types: 7.1.3
2026-11-11 21:00:26 +00:00
Evgeny @ SimpleX Chat d94981224a docs: names conditions of use (#8135)
* docs: names conditions of use

* docs: capitalize SimpleX Network

* docs: state transfer rule after registration ends
2026-11-11 18:38:56 +00:00
spaced4ndyandspaced4ndy-agents 3469bc7514 ui: update list filters when a chat is added (#8107)
* ui: update list filters when a chat is added

* ui: count list filters on the main thread and after chat list reloads

* android, desktop: check and add a known chat on the main thread

* docs: list filter counts in the apps' specs

* docs: correct the list filter gaps in the apps' specs

* ui: revert the recounts, replaceChat change and main-thread moves

* docs: revert the list filter notes in the apps' specs

---------

Co-authored-by: spaced4ndy-agents <342056592+spaced4ndy-agents@users.noreply.github.com>
2026-11-11 16:57:32 +00:00