Commit Graph
757 Commits
Author SHA1 Message Date
spacedandy-agents-simplex f61bbbf49b ci: check "Show more" while its page loads in the smoke test
With the test directory stopped, the next "ci avatar" page waits 10 s before it fails. The smoke test taps "Show more" then, takes a screenshot that shows its colour, and requires it to be disabled. The smoke step gets BACKEND_DIR, so the ui helper can stop and start the directory. One layout only: the row's colour and state are the same in both.
2026-10-15 16:41:03 +00:00
spacedandy-agents-simplex 495a102824 ci: check the results' avatars and the chat list's cards in the smoke test, in both layouts
The directory results must show no placeholder icon in both layouts. Then the smoke test joins ci_cards, and in both layouts: typing "ci seed" keeps the connect cards, the one-hand UI card and the banner (where shown); "Search in Directory" hides them, with the Directory header above the results; clearing the search brings the same cards back. The Claude sessions are told the profile now has that one chat.
2026-10-15 16:37:47 +00:00
spacedandy-agents-simplex ba194afa98 ci: small avatars for the smoke test's directory entries, and a channel for it to join
ci_group and ci_channel get 64 px avatars from avatar.swift (a new side argument), small enough that both still arrive in one directory response; the backend's search probe fails if they do not, and the page sizes go to seed.md. The new channel ci_cards ("ci cards", also with a small avatar) is for the smoke test to join, so that the chat list shows its cards; no Claude case uses it.
2026-10-15 16:37:26 +00:00
spacedandy-agents-simplex 600d76fa72 ci: run the name cases in full with the one-hand UI, and with the top bar only those the layouts draw differently [claude-test]
The top-bar session runs N1, N4 and the full search on the chat list, where the two layouts place the "Connect to …" row and the Names and Directory parts differently. The other name cases, W4 with names, W7, W8 and G1 run once, with the one-hand UI. Run 3 covered the rest of the plan in both layouts.

claude-scope gets a cases line per layout. The prompt now describes joining as the app does it: "Open channel" / "Open group" opens the chat, and its bar joins. A run 3 session took that alert for a known entry. The prompt also points the session at the plan's rows in prompt.md.
2026-10-15 16:36:26 +00:00
spacedandy-agents-simplex db15ab45ab ci: run the name cases and the full search with Claude in both layouts [claude-test]
The prompt now covers SimpleX names: setting the app up once (operators' names role off, the test names server added for names only, saved), what each seeded name is for, and the full search: type cinews, press Search, and record the parts the plan specifies (the chats already loaded, Names, Directory) with their headers and order, also in New chat. claude-scope assigns the names and contacts per layout and allows 900 turns; the session gets the names server's address.
2026-10-15 15:16:57 +00:00
spacedandy-agents-simplex 15367a1d8f ci: a names server on the runner, with channels and contacts that claim names
names-resolver.py answers the smp-server's GET /v2/resolve/<[keccak-256 of the label].tld> from names.json (Keccak-256 written out, as hashlib has only SHA3; checked against known vectors), and "available" for other names. backend.sh starts it and an smp-server initialised with [NAMES] enable: on pointing at it, then seeds: cinews (listed channel), ciboth (a contact address and a channel), and contacts cialice and Robert (cibobby) that stay online with auto-accept, so the app can connect. Claims run with -s <names server>, which gives that one CLI process the local server with every role, names included, leaving the peers' preset servers as they are; a channel claims its name before it is listed. cinews_digest and cinews_weekly let one search show local chats, Names and Directory. A CLI /_connect plan checks every name before the app is built. seed.md lists the names and the server address.
2026-10-15 15:16:54 +00:00
spacedandy-agents-simplex 4cd2b66495 ci: build the SMP server with the test backend, for SimpleX names
The name cases need an SMP server with a [NAMES] resolver on the runner. smp-server comes from the simplexmq source-repository-package (simplexmq:exe:smp-server, buildable without client_library) and goes into the backend zip with the CLI and the directory service. This changes the backend artifact's name, so the next run rebuilds it once.
2026-10-15 15:16:49 +00:00
spacedandy-agents-simplex b5656c56c7 ci: run the whole plan again with a todo checklist, per-layout entries and run 2's lessons [claude-test]
Run 38734049940 covered the plan in both layouts but left D11 unrecorded and W3 unrun after a compaction, and its D6/W6 taps met entries an earlier case had joined, so they showed the open alert instead of the join flow. Now report.md starts as a checklist of every case marked todo, the session re-reads it after a compaction, claude-scope names per layout the entries the joining cases use, and the session gets the link to paste. The prompt also says how to hold a search open (stop the directory), tap ambiguous labels by position, clear the field (focus, then Cancel), and that the keyboard capitalizes and autocorrects.
2026-10-15 14:37:14 +00:00
spacedandy-agents-simplex 10304e1fa3 ci: search a session's files for the token before printing any of them
The step printed report.md and the guard log before the token search, so a leaked token would have reached the log first (GitHub masks the exact value there, but nothing from the session should be printed before the check). A dry run with a stub claude that writes the token into its report now prints nothing from it and deletes the files.
2026-10-15 14:36:51 +00:00
spacedandy-agents-simplex bd448facc2 ci: drop the keyboard preferences, which did not take effect
Written with simctl spawn defaults write, with and without a simulator restart, they changed nothing in runs 38729704027 and 38734049940: typing still capitalized, autocorrected ("Citester" became the profile name "Forester") and predicted. Removing them saves the restart; the Claude prompt says to check typed text in the tree.
2026-10-15 14:34:04 +00:00
spacedandy-agents-simplex b3dd8b7bf8 ci: let Claude's Bash run only the ui helper, and keep the token out of the upload
Claude Code runs read-only commands (echo, cat, env) without asking in every permission mode, and Bash inherits CLAUDE_CODE_OAUTH_TOKEN, so allow rules alone could not stop a session from printing it (found on the desktop lane). claude-guard.py, a PreToolUse hook passed with --settings, lets through only one ui command with plain arguments and logs every decision to <layout>-guard.log, outside the session's directory. After each session, the session's files and the guard log are searched for the token (given to grep through a pipe); if it is there they are deleted before the upload and the step fails. Run 38729704027's session ran only ui commands and its files contain no token.
2026-10-15 13:27:16 +00:00
spacedandy-agents-simplex dec7599590 ci: run the whole device test plan in both layouts with Claude [claude-test]
One Haiku 5.5 session per layout, one-hand UI first, each bounded by 700 turns, $10 and an auto-compact window of 200k tokens, so a long session does not re-read an ever larger context every turn. The validation session (run 38729704027) drove C2, D2 and D7 correctly in 55 turns for $0.03.
2026-10-15 12:21:26 +00:00
spacedandy-agents-simplex 6a551bfa80 ci: Claude prompt: clearing the field, channel counts, one-hand order, re-reading the prompt
From the first session (run 38729704027): clear the search field with Cancel and check it before typing; the keyboard may still change words; a channel row shows the published subscriber count, not the listings' member records; with the one-hand UI later pages stack above earlier ones; disabled elements are marked; prompt.md is there to re-read after a compaction.
2026-10-15 12:20:59 +00:00
spacedandy-agents-simplex dad764fb0f ci: mark disabled elements in the ui tree
The plan checks that "Show more" is disabled while a page loads (D7); AXe reports it, the compact tree did not show it.
2026-10-15 12:20:32 +00:00
spacedandy-agents-simplex 9e19868b7b ci: restart the simulator after setting the keyboard preferences
Run 38729704027 still capitalized and autocorrected typed text ("citester" became "Citester", "Neci" became "Neck"): the keyboard daemon reads these settings when it starts, so the simulator is restarted once after writing them.
2026-10-15 12:20:12 +00:00
spacedandy-agents-simplex 79a1f5f87d ci: run the device test plan with Claude on the runner [claude-test]
After the smoke test, claude-test.sh runs one Claude Code session (pinned 2.1.300) per layout named in claude-scope, with the plan's cases, model, turns and budget from there. A session gets only Bash for the ui helper and Read/Write/Edit in its own directory (--restricted, dontAsk, no MCP), drives the app through ui, and writes report.md with screenshots; its transcript is stream-json. The app job declares the app-sim-claude environment; only the Claude step gets CLAUDE_CODE_OAUTH_TOKEN, and it runs only on workflow_dispatch or a head commit with [claude-test]. claude-usage.sh writes each session's turns, tokens and cost (estimated at API prices) to the job summary and claude-usage.json, even when the session fails. The plan is copied from the iOS directory search run. This run: C2, D2, D7 in the one-hand UI with Haiku 5.5, to validate the harness.
2026-10-15 11:46:04 +00:00
spacedandy-agents-simplex 368e8e1d65 ci: type in the simulator without capitals, corrections or predictions
Set in com.apple.Preferences right after boot, before the app first shows the keyboard, so typed links (C4) and nonsense words (D10) reach the app as typed. The smoke test still compares typed text ignoring case.
2026-10-15 11:45:41 +00:00
spacedandy-agents-simplex 8e600e5c98 ci: check in the smoke test that the Directory header is above its results in both layouts
After the M3 search in the one-hand UI, the header's y must be smaller than both results'. The search is then repeated with the top bar (ui layout top) and checked the same way, and the app is left in the one-hand UI for later steps. A layout the helper cannot set is reported as a warning, not a failure: that is the harness, not the app.
2026-10-15 11:45:31 +00:00
spacedandy-agents-simplex 611ca05536 ci: ui helper commands for a Claude session on the runner
Adds tap-xy, swipe, clipboard, key, find, layout (sets the one-hand UI preference in the app group's defaults and relaunches), relaunch, text-size, directory stop/start, listings and requests (directory searches the app sent, from its log). Elements below the screen, such as keyboard keys, are counted instead of listed; shot also saves a smaller JPEG to look at and only takes plain names. The helper unsets CLAUDE_CODE_OAUTH_TOKEN, so nothing it runs inherits the token.
2026-10-15 11:45:21 +00:00
spacedandy-agents-simplex 09c9936e11 ci: seed the test directory with avatar groups and channels, page through a search near the size limit
avatar.swift makes avatars the way the app makes profile images (JPEG 0.85 at scale 1, shrunk to at most 12500 characters). Three groups and three channels with such avatars match "ci avatar"; a CLI peer follows the search cursor to the end and records each page's entries, JSON and zstd sizes against the 10737-byte limit in seed.md. Also seeded: a long-named group and one with markdown in its description. Every entry is created with the profile JSON the app sends, and each approval is matched by the entry's name. backend.sh can also stop and start the directory and print its listings.
2026-10-15 11:45:17 +00:00
spacedandy-agents-simplex 84e69ab9c3 ci: restart the test directory with the admin's actual contact ID as super user
The admin was contact 3 of the directory, not 2 (run 38713931270), and a super user is matched by contact ID and name. The service now starts with a placeholder super user, the admin connects, and the service restarts with the ID read from its database. This run tests the group and channel registration, the CLI search, the app build and the smoke-test search.
2026-10-15 10:10:38 +00:00
spacedandy-agents-simplex 36c9a065d9 ci: reuse the core library and the backend from earlier runs
Every run waited for macOS runners three times (core, backend, app), even
when core and backend only restored a cache, and those caches are evicted
within hours here. A plan job on ubuntu names both artifacts after the hash
of their sources and finds them in earlier runs of this branch in this
repository (actions: read); core and backend build only when none exists, and
the app job downloads from the run that built them. Artifacts are kept 30
days; the zip caches are dropped.

This run tests: the plan job, building and uploading both artifacts under
their new names (none exist yet), and the app job downloading them; then the
directory start with -y, the seeding, and the search in the app.
2026-10-15 07:25:10 +00:00
spacedandy-agents-simplex 72e5a51294 ci: keep cabal's store in ~/.cabal so the store cache has it
setup-haskell reports ~/.cabal/store, but without ~/.cabal cabal 3.10 keeps its store in XDG directories, so the saved cache held only dist-newstyle (run 38563035327: 401 MB). CABAL_DIR is set before Setup Haskell, so its cabal update, the build and the cache path agree. build-backend.sh prints the store size before building, as build-core.sh does.
2026-10-15 07:24:53 +00:00
spacedandy-agents-simplex d041eebe6b ci: confirm the directory's schema migration when the test directory starts
The database is created by the CLI, so the service's own migration (20250924_directory_schema) asked for confirmation on stdin and the service exited. This run tests that the directory starts and the group and channel get listed.
2026-10-14 16:52:17 +00:00
spacedandy-agents-simplex 2ebad19b21 ci: search the test directory from the chat list in the smoke test
The app is built with DIRECTORY_SERVICE_LINK set to the test directory's
short address (sed in the workflow). The smoke test types "ci seed", taps
"Search in Directory", accepts the first-search consent alert with "Search",
and expects the Directory results with #ci_group (Join group) and
#ci_channel (Join channel), retrying once if the search fails.

The steps now use scripts/ci/ios-sim/ui, which wraps AXe (tap by label or
value, type, wait, screenshot, compact accessibility tree) for scripts and
for an agent on the runner. Later steps get SIM_UDID and UI_OUT.

This run tests: the onboarding and typing steps on the new helper, the
consent alert, and the directory results in the app.
2026-10-14 12:20:10 +00:00
spacedandy-agents-simplex fe992744c7 ci: run a test directory with a group and a channel on the app runner
A new backend job builds simplex-chat and simplex-directory-service with the
server-capable configuration. The app job starts a chat relay and a directory
on the preset servers, registers and approves a group and a channel from a CLI
peer, and checks that a service request for "ci seed" finds both, before the
app is built. The app still uses the production directory link; the smoke
test is unchanged.

The cabal store cache now uses setup-haskell's store path, with a key prefix
per job, so rebuilds after Haskell changes reuse built dependencies.

This run tests: backend build, relay and directory start, registration and
approval over the preset servers, the service request, and that M2 still
passes.
2026-10-14 11:06:28 +00:00
spacedandy-agents-simplex 53cf2fe64e ci: find text fields by placeholder value, compare typed text ignoring case
Run 38448094338 reached the chat list and typed into the search field, which showed "Ci smoke" and the Search in Directory row, but the check looked for "ci smoke": the keyboard capitalizes the first letter. SwiftUI text fields expose no accessibility label, only the placeholder as the value of an empty field, so the fields are now tapped by value.

This run tests the smoke test end to end, with the core library restored from cache.
2026-10-13 20:19:45 +00:00
spacedandy-agents-simplex bcef840e99 ci: build the core library and the app for the iOS simulator, run a UI smoke test
Adds the ios-sim workflow, triggered only by pushes to f/ci-ios-sim and by workflow_dispatch.

The core job builds lib:simplex-chat with cabal using the flake's iOS settings (swift JSON, client library, static roll-up archive, threaded RTS, CommonCrypto), packages it as the Hydra zip, and patches it for the simulator with scripts/ios/prepare.sh and mac2ios. The app job builds "SimpleX (iOS)" for the arm64 simulator against it and drives onboarding, the chat list and the search field with AXe, saving screenshots and accessibility trees.

This first run tests the whole pipeline, mainly whether the core library builds and links.
2026-10-13 18:36:06 +00:00
Evgeny Poberezkin 9711dcfc9c core: 7.1.0.11 (simplexmq 7.1.0.11) 2026-10-11 23:01:35 +01:00
EvgenyandEvgeny @ SimpleX Chat 64aa2825d5 core: release core library to simplex-chat-libs every time cabal version changes (#7687)
* core: release core library to simplex-chat-libs every time cabal version changes

* implement

* test build

* update libs release

* test library release

* create release commit, so the date is correct

* rework to create release in advance in maybe-release job

* remove test build

* move postgresql job back

* test build

* remove test build

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-11 22:01:22 +01:00
EvgenyandEvgeny @ SimpleX Chat 1053e9fb5c core: use simpler agent api (#7685)
* core: use simpler agent api

* simplexmq

* simplexmq, plan

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-10 23:30:31 +01:00
EvgenyandEvgeny @ SimpleX Chat 2e56d32b52 core: badge presentations in profiles (#7573)
* badge presentation in groups

* fix tests

* badge presentations in profiles

* update simplexmq

* change types

* badge profile presentations

* improvements

* remove proof from cards, send owner public key for channel to relay

* add test

* merge migrations

* update

* prevent fallback to PHTest

* fixes

* many fixes

* fixes

* fixes

* cleanup

* improve

* query plans

* fix test

* diff

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-10 17:48:45 +01:00
EvgenyandEvgeny @ SimpleX Chat 96970373b0 core: add status when switching queue (#7664)
* core: add status when switching queue

* fix

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-08 16:31:29 +01:00
EvgenyandEvgeny @ SimpleX Chat df95de8a2c tests, fix: execute in parallel, send connected events after creating chat items, fix race when merging multiple members to one contact (#7500)
* tests: execute in parallel

* remove race in terminal

* fix some tests

* stop chat controller on exit

* fix more tests

* fix tests

* query plans

* update simplexmq

* update direct-sqlcipher

* fix tests

* query plans

* ios: update core

* fix tests

* update simplexmq and direct-sqlcipher, fixes

* simplexmq

* update simplexmq

* parallel channel tests

* update tests

* fix tests

* fix tests

* query plans

* fix test

* more tests in CI

* use ram drive in CI

* fix tests, fix directory deleting voice file before it is uploaded

* fix query

* fix query to use index

* link contact and channel owner profile when connecting via a signed link

* update simplexmq, fix ghc 8.10.7

* fix tests

* avoid double stop

* query plans

* fix more test races

* more test fixes

* fix queries

* fixes

* more fixes

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-07 08:12:02 +01:00
Evgeny Poberezkin 680790695e core: update simplexmq 2026-10-05 11:45:16 +01:00
Evgeny Poberezkin 6b596c0c35 Merge branch 'stable' 2026-10-03 08:05:19 +01:00
Evgeny Poberezkin 93910b80e9 core: 7.1.0.9 (simplexmq 7.1.0.10) 2026-09-30 14:09:11 +01:00
sh 4d0ffbd3e9 calculator bot: add docker setup (#7606) 2026-09-30 08:50:29 +01:00
sh b1dc25dc3e badges: service group with multi-use codes (#7578)
* core: cancel the chat callback on interrupt

* badges: add multi-use codes

* badges: add the managed group

* badges: document multi-use codes and the group

* core: sign test badges with whole-second expiry

* badges: rework tracker and reply texts
2026-09-30 08:48:57 +01:00
SimpleX Chat b3907c9de7 7.0.3: android 381, desktop 164, ios 359 2026-09-26 14:28:35 +00:00
Evgeny Poberezkin 800f76cd6c core: 7.1.0.8 (simplexmq: 7.1.0.9) 2026-09-26 13:48:22 +01:00
Evgeny Poberezkin 3ed4511e80 core: update simplexmq 2026-09-26 12:53:17 +01:00
EvgenyandEvgeny @ SimpleX Chat 0ef0db8ad7 core: fix races when sending and receiving files (in tests, or when server is very fast) (#7584)
* core: fix races when sending and receiving files (in tests, or when server is very fast)

* update simplexmq

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-25 15:12:31 +01:00
19e70faeec badges: webapp feature branch (#7548)
* badges: webapp (#7433)

* badges: service migrations, store and catalog

* badges: BTCPay provider and settlement poller

* badges: web listener and /api endpoints

* web: checkout single-page app

* badges: tests and BTCPay fixtures

* badges: README and ini reference

* badges: fix hex16 build on GHC 8.10.7

* badges: Stripe card lane

* badges: fix Stripe card checkout, add theming

* badges: add a discount row to the order summary

* badges: site navbar, embedding, theme, Forget move

* badges: use SB code prefix in web checkout

* badges: rename sxb app namespace to sb

* badges: embed checkout nav via site; keep original app navbar

* badges: post iframe height, apply site background when embedded

* badges: embed dark surfaces, steadier iframe height

* badges: hide app footer when embedded

* badges: size embedded body to content, not viewport

* badges: declare color-scheme to stop reload flash

* badges: fade shell in on load, no reload blank

* badges: prerender app shell into index.html

* badges: pre-paint theme, hide shell on deep reload

* badges: logo returns to landing client-side

* badges: embedded wizard back, buy-a-code, resume

* badges: signal app-managed screens, resume across reload

* badges: rebuild wizard history on deep load so Back walks it

* badges: carry welcome-page height as the iframe floor

* badges: keep selection on Buy a code; rename to Your codes

* badges: read web shell as UTF-8, not locale

* badges: resume the exact paid order after Stripe card redirect

* badges: move docker deploy under scripts

* badges: add serve_webapp toggle and webapp export

* badges: wire split webapp deploy in docker config

* badges: quiet agent logs by default

* badges: resume card redirect in the embedded frame

* badges: migrate Stripe adapter to PaymentIntents

* badges: correct Stripe restricted key scopes in ini example

* badges: card via Payment Element and PaymentIntents

* badges: fix stale Checkout Session wording in Stripe adapter

* badges: fix stale CheckoutActions reference in card comment

* badges: order shell stylesheet before bootstrap script

* badges: remove development card stand-in

* badges: theme the Stripe card form with the site palette

* badges: exclude web from the Haskell build stage

* badges: unify invoice cancel and mark canceled

* badges: default log level to info

* badges: unify closed-invoice buy-again button

* badges: mute agent connection logs at info level

* badges: show purchase time in local timezone in Your codes

* badges: log service events on own channel, quiet agent

* badges: fold service migrations into one baseline

* badges: run compose on postgres over host network

* badges: use high-res hero art

* badges: add web CI to catch stale builds

* badges: rebuild web shell from committed source

* badges: normalize invoice-code link and columns

* badges: drop unused columns, rename index

* badges: note deferred receipt_hash in migrations

* badges: apply code-review fixes

* badges: reduce comments across service and web

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>

* badges: improve web page (#7546)

* badges: improve web page

* improve layout

* improve layout

* fix

* small changes

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>

* badges: read one issuer key from the ini

* badges: move and group the service tests

* badges: service fixes (#7567)

* badges: match the redeem error wording in tests

* badges: drop unused imports in the bot tests

* badges: cancel Stripe orders when they expire

* badges: correct the Stripe config and docs

* badges: refuse to revoke a redeemed code

* badges: make the fake Stripe cancel like Stripe

* badges: limit replayed webhook deliveries

---------

Co-authored-by: sh <37271604+shumvgolove@users.noreply.github.com>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
Co-authored-by: shum <github.shum@liber.li>
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
2026-09-25 09:01:51 +00:00
EvgenyandEvgeny @ SimpleX Chat 23136f1cd5 core: update agent API for connections (#7574)
* core: update agent API for connections

* update simplexmq

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-09-23 21:29:41 +01:00
Simplex Operations faedb0328e core: 7.1.0.7 (simplexmq 7.1.0.8) 2026-09-19 11:39:26 +00:00
Evgeny Poberezkin 25c5b3cdfd Merge branch 'stable' 2026-09-19 12:21:53 +01:00
sh 683fd67555 scripts: re-init submodules in reproduce builds (#7508) 2026-09-19 12:19:45 +01:00
brenzi 9af6fb00e6 minimal adjustment to make client compile against SMP-v22 PR (#7520)
* minimal adjustment to make client compile against SMP-v22 PR

* repin after upstream merge
2026-09-16 10:07:18 +01:00
Evgeny Poberezkin ebabcc4053 core: 7.1.0.5 (simplexmq 7.1.0.6) 2026-09-15 10:13:10 +01:00