* ci: publish @simplex-chat/mcp from build.yml
* ci: publish MCP after PyPI, notice for a version held back
* ci: test the MCP server as a scope of build-linux
* bots, nodejs: document chat, connection, member contact and network commands, typed commands in library
* bots, nodejs: restore apiConnect, wrap domain once, test all connect responses
* nodejs: JSDoc for new methods
* docs: plan for bot API commands and typed Node library methods
* tests: channel prepared with a domain has a verified SimpleX name
* docs: apply review fixes to the plan for bot API commands
* docs: apply second review pass to the plan for bot API commands
* docs: refer the bot API plan to the rewritten test commit
* docs: record decisions in the plan for bot API commands
* docs: plan tests of the generated Python command strings
* python: test the generated strings of the documented commands
* docs: plan for files, /leave and library methods in the MCP server
* docs: wait at stop in the MCP plan
* docs: library methods and /leave mechanics in the MCP plan
* mcp: typed library methods for chat commands
* docs: plan the message information command for bots
* mcp: /leave CHAT owner command to leave a chat at once
* docs: file servers, GIF and video choices decided in the MCP plan
* docs: file mechanics in the MCP plan
* mcp: files of received messages
* bots, nodejs: message information with the file servers for bots
* docs: plan the relay approval option of receiving files in Node
* mcp: download of received files with owner approval
* docs: name the xftp-server test helper in the files plan
* nodejs: receive files without approving unknown relays
* docs: plan the user servers command for bots
* bots, nodejs: user servers and relays by operator for bots
* nodejs: document the message information method
* docs: plan the file upload progress event for bots
* mcp: send files with owner approval, refusing private keys
* bots: file upload progress event for bots
* mcp: /leave template in the agent control chat menu
* docs: sent copies are deleted for contacts too, at sndFileCompleteXFTP
* bots: drop the file upload progress event
* docs: drop the upload progress event plan
* nodejs: document user servers and relay approval of received files
* mcp: download cards name unknown file servers after the upload
* docs: record the wait for the file description in the files plan
* mcp: fixed wait at stop for cancelled cards, without /sql
* docs: record decision C4, a fixed wait at stop, in the files plan
* ci: test the MCP server package on pull requests
* ci: state when the MCP workflow can be dispatched
* ci: run the MCP server tests when its libraries change
* mcp: log the errors of image previews and resizing
* mcp: keep files in transfer in the data folder
* mcp: restrict sent files by the real paths of refused folders
* mcp: validate the file at the send by its inode and change time
* mcp: limit ffmpeg and ffprobe to local files and no input commands
* mcp: ask the owner for unknown file servers; read approvals at creation
* mcp: name downloaded files by their ID; return paths of downloads only
* mcp: end each download with a result for the agent and the card
* mcp: show files above their sender's size limit as failed
* mcp: refuse empty files, as without file and captions too long to send
* mcp: tell the owner about failed uploads and unposted received files
* mcp: delete resized copies left by the last run at start
* mcp: name downloads and leaving in the help and greeting, align docs
* mcp: compute the download path for received files only
* mcp: send a /receive file to the owner under its name
* mcp: keep files received without a download in the chat's folder
* mcp: keep a left chat's files and delete them with /delete CHAT files
* mcp: test that sent images are resized by the core
* mcp: wait 30 minutes for a download's progress before cancelling it
* mcp: end a download as deleted only when its message is not found
* mcp: delete the copy of a /receive file whose post fails
* mcp: count the quoted content in a message's length, as the core sends it
* mcp: name received bytes, unknown-server downloads and left chat files plainly
* mcp: test refused folders, file changes and download approvals
* docs: align MCP server docs with refused folders, leaves and download waits
* mcp: move received files only in full, delete partials only of downloads
* mcp: report a received file missing from its folder as failed
* mcp: move received files of a group's member chats into its folder
* mcp: read a video's preview and duration as an MP4 or QuickTime file
* mcp: 0.2.0 on simplex-chat 7.1.0-beta.10.1
* mcp: file folders by chat type, /delete cancels downloads, files reply
* docs: MCP server specs and plan for 0.2.0
* mcp: /receive gives the agent a file, /forward sends it to the owner
* docs: MCP server specs for /receive and /forward of download cards
* docs: MCP plan records the temp folder command as a library exception
* mcp: /delete cancels resumed downloads; /forward quote fits the limit
* docs: MCP specs and plans for /forward quotes and resumed downloads
* docs: MCP specs name the source commit they are checked against
* docs: MCP PLAN states the /forward quote and move rules
* mcp: a download moves its completed file whatever its size
* mcp: /receive N all covers its card and later files, not pending ones
* docs: MCP files approval scope, reply text and README server wording
* mcp: a download approves relays only for a card naming unknown servers
* mcp: files in member chats of a group are tracked as in the main chat
* docs: MCP relay approval of downloads and files in member chats
* mcp: a rejected file gets a card again under the files approval
* docs: MCP rejected files under the files approval, README scope
* mcp: an offered file without a description gets no card or action
* docs: MCP a file without a description is not downloaded
* mcp: 0.2.0 on simplex-chat 7.1.0-beta.10.2
* ci: test the MCP server as a scope of build-linux
* WIP: Haskell impl of resizeImageToStrSize
* WIP: add FFI export wrapper
* WIP: switch ios resizeImageToStrSizeSync to backend
* WIP: fix resizeImageToStrSizeSync
* WIP: add JNI wrappers
* Add non-base64 resize and cWriteImage
* WIP: add chat_write_image
* fix resizeToStr
* fixes
* fix syntax, raise jpeg quality back
* add chatWriteImage
* Fix cfArgs in tests
* Use jpeg-turbo encoder
* add nix pins
* bump jpeg-turbo
* add CI deps
* add encoding funs to android lib
* bump jpeg-turbo for 20.04 fix
* jpeg-turbo fix for 8.10
* android fixes
* Bump jpeg-turbo
* set static flag for jpeg-turbo
* Fix nix for aarch64/android
* Fix android C api
* Fix resize in android
* Bump hs-libjpeg-turbo
* target correct override
* override android lib from android pkgs
* add macos build tweaks
* bump hs-jpeg-turbo for 8.10 fixes
* more build fixes
* make ios compile
* Always use pkgconfig for libjpeg-turbo
* WIP: debug libjpeg in ubuntu pkg-config CI
* Add pkg-config to dockerfiles
* Add libturbojpeg to dockerfiles
* Use -dev version of libturbojpeg in dockerfiles
* Install pkg-config in windows CI
* Disable flag for custom libturbojpeg linking options
Workarounds relocation error on x86_64-linux with gcc:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/libturbojpeg.a(turbojpeg.c.o): relocation R_X86_64_TPOFF32 against `errStr' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: failed to set dynamic section sizes: bad value
* WIP: debug libjpeg in windows pkg-config CI
* WIP: debug libjpeg package in windows CI
* core: image resize module and buffer FFI
* ci: link libjpeg-turbo statically on all platforms
* ui: resize images in the core
* core: rename image resize functions to chat_resize_image and chat_resize_image_uri
* ci: restore whitespace in build.yml
* ci: build libjpeg-turbo 3.1.4.1 from a submodule
* core: hs-jpeg-turbo from github.com/simplex-chat
* nodejs: resize images
* python: resize images
* core: hs-jpeg-turbo from gitlab.com, the GitHub import lacks LFS objects
* core: generate /img previews
* ci: link libjpeg-turbo on Windows without pkg-config
* ci: build libjpeg-turbo on Windows with the GHC toolchain
* docs: plan for image resizing in the core
* docs: update image resizing plan
* ios: prevent crash when wallpaper image cannot be resized
* android, desktop: raise an error when an image cannot be resized
* docs: update spec references for image resizing
* docker: build the CLI image from a clone without submodules
* docs: apply review fixes to image resizing plan
* docker: build the CLI from a git worktree with the submodule present
* docs: apply second review to image resizing plan
* docs: point image resizing plan at the rewritten commit
* core: choose image format by transparency in chat_resize_image
* nodejs: resize images to the app sizes
* python: resize images to the app sizes
* nodejs, python: describe the core modules as used for image resizing
* docs: add license notices of the image libraries
* ci: describe the avatar method without attributing it to the apps
* ci, ios, nix: remove the libjpeg-turbo build outside cabal
* python: name resize_image in the core module text
* nodejs, python: describe resizing to the app image sizes
* core: refuse images larger than the supported size
* core: resize to JPEG images with a side above 65500 pixels
* docs: record image resizing decisions for the bundled libjpeg-turbo
* core, docs: build libjpeg-turbo and stb from the fork submodules
* docs: record the fork pins in the image resizing plan
* core: resize images to at most 4320 pixels per side, refuse above 16384
* docs: record the image side limits in the image resizing plan
* core: pin the rebased hs-jpeg-turbo fork
* core: pin the hs-jpeg-turbo fork without package.yaml
* docs: plan scaled JPEG decoding and EXIF orientation of images
* docs: copy the JuicyPixels-stbir licence of the pinned fork
* core: pin the hs-jpeg-turbo fork with scaled JPEG decoding
* core: decode JPEG at the display size, up to 65500 pixels per side
* core: rotate JPEG images by their EXIF orientation
* docs: refer the image plan to the JPEG decoding code
* docs: record the approved image processing decisions
* core: limit JPEG decoding memory to 1024 MB outside iOS and Android
* docs: name JPEG decoding in the libjpeg-turbo notice
* docs: plan image resizing from files and the decisions of 26 Oct
* core: scale images in one Catmull-Rom pass with sharpening
* docs: plan image sizes at a fixed quality
* core: resize images at a fixed quality to fill the size limit
* core: resize images from a file path or a file descriptor
* ios, android, desktop: resize picked images from their files
* core: encode resized images with mozjpeg
* tests: check descriptor closing by the file it refers to
* core: raise JPEG quality only for a full-size image below 97% of the limit
* ci: name the mozjpeg submodule in the Windows cleanup comments
* docs: refer the image plan to the current code
* docs: refer the image plan to the code merged with master
* core: export every image resizing function from each library
* core: close the file descriptor when its handle cannot be created
* docs: count the C sources of mozjpeg with the arithmetic decoder
* core: use the reviewed hs-jpeg-turbo and JuicyPixels-stbir forks
* ci: build the armv7a Android core library on request
* core: round image heights half up in the size search
* ios: describe the file image resizing functions in SimpleX.h
* ci: pick, preview and send images in the Claude app tests
* core: decode PNG images with libspng and refuse other formats
* core: encode PNG with libspng, keeping the smaller filter choice
* ci: pick, preview and send images in the scripted app smoke tests
* flake: build the PNG decoder package in nix builds
* ios: remove the copy of a picked image after sending it
* core: refuse image files larger than the decode memory limit
* core: scale a JPEG image to its largest size once per resize
* core: bisect JPEG quality without a step function
* core: reduce the memory used to sharpen and to decode PNG images
* android, desktop: pass the image format to the core as an integer
* android, desktop: fuse the preview conditions of picked media
* android, desktop, ci: check that the core resized the smoke test images
* python: remove the docstrings of the explicit image resizing functions
* docs: add the second review fixes to the image plan
* ci: tap the iOS attachment button by its accessibility label
* core: keep the colour profiles of resized images
* docs: add the colour profiles to the image plan
* ci: wait up to 30 s for the new group screens in the iOS smoke test
* ci: pick the Android smoke test images from their own photo folders
* ci: tap the iOS photo picker by position, as its tree is not shown
* ci: pick the test card and the logo by their iOS picker positions
* core: update JuicyPixels-stbir with the stb_image_resize licence terms
* core: write a fixed Display P3 profile for Display P3 images only
* core: do not keep the input image in memory for its colour profile
* core: read the JPEG segments once for the orientation and the profile
* core: read an image file into one buffer of its size
* docs: add the third review fixes to the image plan
* core: resize images with Display P3 or no profile, not profile bytes
* ci: check the pixel sizes of the images sent in the iOS smoke test
* core: update hs-jpeg-turbo with PNG chunk limits and encoder fixes
* docs: list Compact ICC Profiles, libspng and miniz in the dependencies
* android, desktop: reword the picked media preview comment
* docs: refer the image plan to the code merged with master
* ci: render the iOS snapshots before the images case
* ci: dismiss the snapshot tests' camera alert before the iOS images case
* core: update hs-jpeg-turbo with tests and the JuicyPixels-spng synopsis
* core: pin hs-jpeg-turbo and JuicyPixels-stbir in simplex-chat repositories
* update ios core library
* core, ui: accept only JPEG and PNG image data
* core: update JuicyPixels-stbir
* docs: plan for the iOS copy of picked images
---------
Co-authored-by: IC Rainbow <aenor.realm@gmail.com>
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Alexandre Esteves <alexfmpe@proton.me>
* ci: reduced build on pushes to master and stable in forks
* ci: test retry message only when retrying
* ci: pull request changes against the current base
* ci: deploy the website only from simplex-chat/simplex-chat
* ci: reduced build of changed scopes on drafts and manual runs
* ci: tests only when selected in reduced builds
* ci: test selection and retries in scripts/ci/run-tests.sh