Files
simplex-chat/simplex-chat.cabal
T
1b329f41fb core: wallet for names (#7684)
* core: wallet key for name ownership (CLI only)

A name has to be owned by an address the client can still derive after a
restart or on a new device. This adds that key and nothing else.

/wallet create makes one BIP-39 key per device and one BIP-44 account per
chat profile under it, /wallet shows the address that would own the next
name that profile buys, /wallet import and /wallet export move the key with
its recovery phrase.

A name key sits at m/44'/60'/<profile>'/0/<name>, which is ordinary BIP-44,
so the phrase reaches the same addresses in other wallets. No signing, so
nothing can be bought or edited yet.

Split out of #7390 / #7425.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: pin simplexmq with eth crypto merged into master

ab/eth-crypto forked before Crypto.Entitlement, which Chat.Badges imports,
so the branch had to be merged with simplexmq master before it could be
pinned here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: wallet review fixes, and show the derived addresses

Concurrency: the account index is incremented in SQL and read back in the
same transaction, so two profiles cannot be handed the same key. Importing
a phrase is one transaction and single_seed is UNIQUE, so a phrase cannot
be discarded in favour of a key created meanwhile, and a device cannot end
up with two keys.

Wallet commands are no longer forwarded to a remote host: the recovery
phrase must not leave the device, and the raw command is logged there.

/wallet delete removes the key, confirmed by the last word of the phrase,
so creating a key before importing your own is no longer a dead end.

/wallet now shows every profile on the key with the first two name
addresses each, to check derivation against other wallets. Hidden profiles
are left out, as they are by /users. A bad phrase no longer says which word
was wrong. /wallet export uses the profile's own key.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: make the wallet an API, not a user-facing feature

Names commands will use the wallet; users do not. The commands move to
/_wallet, and the help section, its topic and the changelog entry are
removed. The tests drive the API end to end.

Comments cut to what the code does not say, dead exports removed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: wallet export and delete act on the device key

The key is one per device, so both commands read it directly instead of
going through the active profile's account. A profile without an account
of its own can now export, and the delete error says that the key goes for
every profile on the device. The confirmation word is lowercased, as the
phrase is when imported.

Two known limitations are written down: account indexes restart at 0 after
an import, so profiles are bound in the order they ask for a key, and the
gap left by a hidden profile in the printed indexes shows that it exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: /_wallet delete takes no confirmation word

The wallet is an API, and no other API command takes a typed confirmation:
/_delete user takes the profile password. The word was also no barrier to a
caller, which can read it from /_wallet export. Confirming belongs in the
command that will wrap this one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: name the unique index on wallet_seeds

The one key per device rule is meant to be lifted later. SQLite cannot drop
a column with an inline UNIQUE, or its automatic index, so lifting it would
have meant rebuilding the table. As a named index it is a DROP INDEX and a
DROP COLUMN.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: export the secret of a single name key

/_wallet export gives the seed mnemonic, /_wallet export <account> <name>
gives the secret of one derived key, so a single name can be handed over
without the seed. Both are what a wallet takes on import: the mnemonic as a
recovery phrase, the secret as hex.

The commands are named for what they return, APIWalletExportSeedMnemonic
and APIWalletExportDerivedSecret, as the difference is which secret leaves
the device.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: reject a key index BIP-32 cannot harden

A.decimal wraps into Word32 and hardened leaves anything at or above 2^31
alone, so /_wallet export 4294967296 0 returned account 0's secret under the
path m/44'/60'/0'/0/0. Handing out a different account's key for a mistyped
index is the wrong failure for this command.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: /_wallet bind, and name the other profiles instead of numbering them

Restoring a chat database older than the key loses which account each
profile had, and the keys are still there, so /_wallet bind <account> sets
it by hand. The counter moves past an account bound this way, and an
account another profile holds is refused.

/_wallet now shows the paths of the active profile only, and names the
other profiles on the key. Their account indexes were the gap that showed
a hidden profile exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: say same seed, not same key, for the other profiles

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: create makes the seed, bind claims a path

The two were one command: on a device that already had a seed, /_wallet
create only bound a profile. Now create makes the seed and refuses when one
exists, and binds every profile that exists, as a new seed has no account
that already owns a name.

/_wallet import binds nothing. Which account a profile had is what an
import is recovering, and the seed does not say, so the profile says it
with /_wallet bind <account>. /_wallet bind with no account takes the next
free one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: the known issue is now about bind, not import

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: create binds no profile either

Create and import differed only in whether they bound a profile, which made
the convenient one inconsistent. Neither binds now, so the store keeps one
function for both, and a profile reaches an account only through bind.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: test the restore cases the key has to survive

A database backed up after the key carries the key and the binding, so the
restore is all of it and an import is refused. A database backed up before
the key comes back with the profiles and no binding, so the phrase is
imported and each profile says which account was its. A key imported before
the database is restored is replaced by what the backup held.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: drop the types nothing reads, and say account where it means account

AccountRef and WalletAccount were built and never read: deriveNameKey now
returns the key, and the address comes from addressFromPrivateKey, which
already exists. SeedId is a plain Int64 like every other row id here.

The master key is derived once per command rather than once per name key,
which is where PBKDF2 runs.

A device has a key and a profile has an account, so /_wallet says "no
account for this profile" rather than repeating "no wallet key", which is
what it says when the device has none.

Also: no "wallet: " in front of "bad chat command: ", strEncode for the
address, the repeated seed lookup in one place, comments cut to what the
code does not say, and the export test pins its addresses and secrets,
including one whose first byte is zero.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: store the seed as bytes, and bind one account per profile

On Postgres a bare ByteString binds as a text literal, so entropy with a
backslash or a high bit was rejected and entropy with a zero byte was
truncated: the BIP-39 test vector stored as an empty seed. Blob columns go
through DB.Binary here, as every other one does.

/_wallet bind with no account moved a profile that already had one to a
fresh account, abandoning the old one without saying so. It refuses now;
moving is asked for by number.

The counter could walk past 2^31, where BIP-32 hardening folds every index
back onto a low one, so a profile handed 2147483648 derived account 0's
keys and printed account 0's path. Binding refuses once the counter is
there, and a very long index is now rejected on its digit count rather than
after reading it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: rfc for the keys that own names

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: pin simplexmq for the BIP-44 path, and use it

ethereumPath now takes the address index, so the path a name key sits at is
built once in the library rather than again here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: refuse an account index BIP-32 cannot harden, whichever way it arrives

The counter path checked it, the explicit one did not, and the parser is not
the only caller: processChatCommand takes APIWalletBind from library callers
too. hardened leaves an index at or above 2^31 alone, so account i and
i + 2^31 are the same key while the duplicate check compares the stored
integers, and two profiles could hold one account's names.

The rfc now says what hiding a profile from /_wallet does and does not
protect: the seed is one per device, so whoever unlocks any profile can
derive every account.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: pin simplexmq with the wordlist embedded from the upstream file

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: cut the rfc to what stands on its own

Drops the references to other documents and to what is or is not in a pull
request, so the design reads without them, and the list of tests, which
restated their names and would drift. 164 lines to 134, against a median of
117 for the rfcs here that define schema.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: what the stealth meta address is for

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: the wallet is not only for names

The seed, the accounts and the derivation are a wallet. Owning a name is the
first thing it is used for, not what it is, and the title and the problem it
solves now say so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: the reason for a key per name is that owners are public

One address owning several names links them: whoever knows one name can read
its owner and find the others. That is the reason, not the narrower export.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: give the reason for the counter before what it costs

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: names are the device's, so drop the per-profile account

A name's profile is the record it resolves to, not the key that owns it, so
the account level was carrying a mapping nothing needs. It was also the only
source of the profile to account ambiguity after a restore, of /_wallet
bind, and of the index gap and the refusal that told a visible profile an
account was held by one it cannot see. All of it goes.

Names sit in account 0 from index 1. Index 0 is left unused so neither the
names nor the profile accounts, which start at 1, claim the origin of both
dimensions. users gains no columns at all now, so the migration is one
CREATE TABLE.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: rfc for names counted per device

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: one command for the seed, whichever way it arrives

create and import differed only in where the entropy came from and already
shared one store function, so they are one command with the source named:
/_wallet create new, or /_wallet create seed=<phrase>. Naming it means no
seed is generated by typing a prefix.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: the argument is a mnemonic, so name it one

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: the column holds entropy, so name it entropy

The mnemonic comes back from the entropy exactly, which is what export
returns, and the seed PBKDF2 derives from the mnemonic is computed when a
key is needed and never stored. The column was the one thing called seed
that is not the seed, which is why it needed a comment saying so.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: 24 words is a choice, not a default

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: deleting the seed reports ok, not the empty wallet

Delete re-ran /_wallet, so a successful delete printed "no wallet key",
which is the same words the error uses and reads as a failure. There is
nothing to show after a delete.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* docs: the export argument is an index, not a name

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* core: export says which kind of secret, so other kinds can follow

/_wallet export name <k> rather than an index straight after export. The
bare form stays the seed mnemonic, and a profile's key can be added beside
the name one without the argument having to be guessed from its shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX

* disencourage hidden profiles using names

* let remote use wallet, but filter logs to avoid leaking secrets

* change RFC wallet architecture to BIP-85 per profile and hardened paths for names

* introduce keyring as the thing a profile binds to

* restructure RFC

* shorten

* drop BIP85 and flattenhierarche. no keyrings

* /goal iteration 4 - unconfirmed

* /goal iteration 5 - unconfirmed

* repin

* rename to adapt

* cut comments

* next review round

* minimize diff and align style even more

* missing type mappings

* fix review comments

* self-review iteration 2

* self-review iteration 3

* self-review iteration 5

* iteration 6

* self-review iteration 9

* self-review iteration 10

* repin

* rng preserve

* refactor WalletSeed type, see mq wip

* repin

* infallibel wallet and account derivation

* review iterations

* repin to mq, derivation fallible again

* repin

* use deriveAddress, update simplexmq

* simplexmq

* add down migration for db and drop redundant masterkey field in db

* repin to simplexmq PR

* fable review fixes

* iterations on /goal

* treat hidden profiles same as normal ones. they can hold accounts now

* reduce explicit types

* repin mq

* doc cosmetics

* simplify

* query plans

* query plan

* simplify

* query plans

* simplify more

* fixes for comment ^^

---------

Co-authored-by: Alain Brenzikofer <alain@encointer.org>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-13 18:22:55 +01:00

857 lines
38 KiB
Plaintext

cabal-version: 1.12
-- This file has been generated from package.yaml by hpack version 0.35.0.
--
-- see: https://github.com/sol/hpack
name: simplex-chat
version: 7.1.0.11
category: Web, System, Services, Cryptography
homepage: https://github.com/simplex-chat/simplex-chat#readme
author: simplex.chat
maintainer: chat@simplex.chat
copyright: 2020-22 simplex.chat
license: AGPL-3
license-file: LICENSE
build-type: Simple
extra-source-files:
README.md
PRIVACY.md
cabal.project
flag swift
description: Enable swift JSON format
manual: True
default: False
flag client_library
description: Don't build server- and CLI-related code.
manual: True
default: False
flag client_postgres
description: Build with PostgreSQL instead of SQLite.
manual: True
default: False
library
exposed-modules:
Simplex.Chat
Simplex.Chat.AppSettings
Simplex.Chat.Badges
Simplex.Chat.Badges.CLI
Simplex.Chat.Badges.Code
Simplex.Chat.Badges.Ledger
Simplex.Chat.Badges.Service
Simplex.Chat.Badges.Types
Simplex.Chat.Names
Simplex.Chat.Call
Simplex.Chat.Controller
Simplex.Chat.Delivery
Simplex.Chat.Files
Simplex.Chat.Library.Commands
Simplex.Chat.Library.Internal
Simplex.Chat.Library.Subscriber
Simplex.Chat.Markdown
Simplex.Chat.Messages
Simplex.Chat.Messages.Batch
Simplex.Chat.Messages.CIContent
Simplex.Chat.Messages.CIContent.Events
Simplex.Chat.Mobile
Simplex.Chat.Mobile.Badges
Simplex.Chat.Mobile.File
Simplex.Chat.Mobile.Shared
Simplex.Chat.Mobile.WebRTC
Simplex.Chat.Operators
Simplex.Chat.Operators.Conditions
Simplex.Chat.Operators.Presets
Simplex.Chat.Options
Simplex.Chat.Options.DB
Simplex.Chat.PaymentService
Simplex.Chat.PaymentService.Types
Simplex.Chat.ProfileGenerator
Simplex.Chat.Protocol
Simplex.Chat.Remote
Simplex.Chat.Remote.AppVersion
Simplex.Chat.Remote.Multicast
Simplex.Chat.Remote.Protocol
Simplex.Chat.Remote.RevHTTP
Simplex.Chat.Remote.Transport
Simplex.Chat.Remote.Types
Simplex.Chat.Stats
Simplex.Chat.Store
Simplex.Chat.Store.AppSettings
Simplex.Chat.Store.Badges
Simplex.Chat.Store.Connections
Simplex.Chat.Store.ContactRequest
Simplex.Chat.Store.Delivery
Simplex.Chat.Store.Direct
Simplex.Chat.Store.Files
Simplex.Chat.Store.Groups
Simplex.Chat.Store.Messages
Simplex.Chat.Store.NoteFolders
Simplex.Chat.Store.Profiles
Simplex.Chat.Store.RelayRequests
Simplex.Chat.Store.Remote
Simplex.Chat.Store.Shared
Simplex.Chat.Store.Wallets
Simplex.Chat.Styled
Simplex.Chat.Types
Simplex.Chat.Types.MemberRelations
Simplex.Chat.Types.Preferences
Simplex.Chat.Types.Shared
Simplex.Chat.Types.UITheme
Simplex.Chat.Util
Simplex.Chat.Wallet
Simplex.Chat.Web
if !flag(client_library)
exposed-modules:
Simplex.Chat.Bot
Simplex.Chat.Bot.KnownContacts
Simplex.Chat.Bot.Store
Simplex.Chat.Core
Simplex.Chat.Help
Simplex.Chat.Terminal
Simplex.Chat.Terminal.Input
Simplex.Chat.Terminal.Main
Simplex.Chat.Terminal.Notification
Simplex.Chat.Terminal.Output
Simplex.Chat.View
if flag(client_postgres)
exposed-modules:
Simplex.Chat.Options.Postgres
Simplex.Chat.Store.Postgres.Migrations
Simplex.Chat.Store.Postgres.Migrations.M20241220_initial
Simplex.Chat.Store.Postgres.Migrations.M20250402_short_links
Simplex.Chat.Store.Postgres.Migrations.M20250512_member_admission
Simplex.Chat.Store.Postgres.Migrations.M20250513_group_scope
Simplex.Chat.Store.Postgres.Migrations.M20250526_short_links
Simplex.Chat.Store.Postgres.Migrations.M20250702_contact_requests_remove_cascade_delete
Simplex.Chat.Store.Postgres.Migrations.M20250704_groups_conn_link_prepared_connection
Simplex.Chat.Store.Postgres.Migrations.M20250709_profile_short_descr
Simplex.Chat.Store.Postgres.Migrations.M20250721_indexes
Simplex.Chat.Store.Postgres.Migrations.M20250729_member_contact_requests
Simplex.Chat.Store.Postgres.Migrations.M20250801_via_group_link_uri
Simplex.Chat.Store.Postgres.Migrations.M20250802_chat_peer_type
Simplex.Chat.Store.Postgres.Migrations.M20250813_delivery_tasks
Simplex.Chat.Store.Postgres.Migrations.M20250919_group_summary
Simplex.Chat.Store.Postgres.Migrations.M20250922_remove_unused_connections
Simplex.Chat.Store.Postgres.Migrations.M20251007_connections_sync
Simplex.Chat.Store.Postgres.Migrations.M20251017_chat_tags_cascade
Simplex.Chat.Store.Postgres.Migrations.M20251117_member_relations_vector
Simplex.Chat.Store.Postgres.Migrations.M20251128_migrate_member_relations
Simplex.Chat.Store.Postgres.Migrations.M20251230_strict_tables
Simplex.Chat.Store.Postgres.Migrations.M20260108_chat_indices
Simplex.Chat.Store.Postgres.Migrations.M20260122_has_link
Simplex.Chat.Store.Postgres.Migrations.M20260222_chat_relays
Simplex.Chat.Store.Postgres.Migrations.M20260403_item_viewed
Simplex.Chat.Store.Postgres.Migrations.M20260429_relay_request_retries
Simplex.Chat.Store.Postgres.Migrations.M20260507_relay_inactive_at
Simplex.Chat.Store.Postgres.Migrations.M20260514_relay_request_group_link_index
Simplex.Chat.Store.Postgres.Migrations.M20260515_public_group_access
Simplex.Chat.Store.Postgres.Migrations.M20260516_supporter_badges
Simplex.Chat.Store.Postgres.Migrations.M20260529_delivery_job_senders
Simplex.Chat.Store.Postgres.Migrations.M20260530_client_services
Simplex.Chat.Store.Postgres.Migrations.M20260531_member_removed_at
Simplex.Chat.Store.Postgres.Migrations.M20260601_relay_sent_web_domain
Simplex.Chat.Store.Postgres.Migrations.M20260602_group_roster
Simplex.Chat.Store.Postgres.Migrations.M20260603_simplex_name
Simplex.Chat.Store.Postgres.Migrations.M20260629_roster_catchup
Simplex.Chat.Store.Postgres.Migrations.M20260707_file_digest
Simplex.Chat.Store.Postgres.Migrations.M20260714_member_security_code
Simplex.Chat.Store.Postgres.Migrations.M20260715_profile_description
Simplex.Chat.Store.Postgres.Migrations.M20260716_signed_history
Simplex.Chat.Store.Postgres.Migrations.M20260720_server_roles
Simplex.Chat.Store.Postgres.Migrations.M20260723_contact_request_rejection
Simplex.Chat.Store.Postgres.Migrations.M20260813_auto_accept_group_invitations
Simplex.Chat.Store.Postgres.Migrations.M20260822_forward_link
Simplex.Chat.Store.Postgres.Migrations.M20260828_file_expiry
Simplex.Chat.Store.Postgres.Migrations.M20260904_file_badges
Simplex.Chat.Store.Postgres.Migrations.M20260915_user_badges
Simplex.Chat.Store.Postgres.Migrations.M20260918_badge_issue_errors
Simplex.Chat.Store.Postgres.Migrations.M20260923_preferences_json
Simplex.Chat.Store.Postgres.Migrations.M20260925_badge_bindings
Simplex.Chat.Store.Postgres.Migrations.M20261010_invite_member_via_group
Simplex.Chat.Store.Postgres.Migrations.M20261030_wallet_seeds
else
exposed-modules:
Simplex.Chat.Archive
Simplex.Chat.Options.SQLite
Simplex.Chat.Store.SQLite.Migrations
Simplex.Chat.Store.SQLite.Migrations.M20220101_initial
Simplex.Chat.Store.SQLite.Migrations.M20220122_v1_1
Simplex.Chat.Store.SQLite.Migrations.M20220205_chat_item_status
Simplex.Chat.Store.SQLite.Migrations.M20220210_deduplicate_contact_requests
Simplex.Chat.Store.SQLite.Migrations.M20220224_messages_fks
Simplex.Chat.Store.SQLite.Migrations.M20220301_smp_servers
Simplex.Chat.Store.SQLite.Migrations.M20220302_profile_images
Simplex.Chat.Store.SQLite.Migrations.M20220304_msg_quotes
Simplex.Chat.Store.SQLite.Migrations.M20220321_chat_item_edited
Simplex.Chat.Store.SQLite.Migrations.M20220404_files_status_fields
Simplex.Chat.Store.SQLite.Migrations.M20220514_profiles_user_id
Simplex.Chat.Store.SQLite.Migrations.M20220626_auto_reply
Simplex.Chat.Store.SQLite.Migrations.M20220702_calls
Simplex.Chat.Store.SQLite.Migrations.M20220715_groups_chat_item_id
Simplex.Chat.Store.SQLite.Migrations.M20220811_chat_items_indices
Simplex.Chat.Store.SQLite.Migrations.M20220812_incognito_profiles
Simplex.Chat.Store.SQLite.Migrations.M20220818_chat_notifications
Simplex.Chat.Store.SQLite.Migrations.M20220822_groups_host_conn_custom_user_profile_id
Simplex.Chat.Store.SQLite.Migrations.M20220823_delete_broken_group_event_chat_items
Simplex.Chat.Store.SQLite.Migrations.M20220824_profiles_local_alias
Simplex.Chat.Store.SQLite.Migrations.M20220909_commands
Simplex.Chat.Store.SQLite.Migrations.M20220926_connection_alias
Simplex.Chat.Store.SQLite.Migrations.M20220928_settings
Simplex.Chat.Store.SQLite.Migrations.M20221001_shared_msg_id_indices
Simplex.Chat.Store.SQLite.Migrations.M20221003_delete_broken_integrity_error_chat_items
Simplex.Chat.Store.SQLite.Migrations.M20221004_idx_msg_deliveries_message_id
Simplex.Chat.Store.SQLite.Migrations.M20221011_user_contact_links_group_id
Simplex.Chat.Store.SQLite.Migrations.M20221012_inline_files
Simplex.Chat.Store.SQLite.Migrations.M20221019_unread_chat
Simplex.Chat.Store.SQLite.Migrations.M20221021_auto_accept__group_links
Simplex.Chat.Store.SQLite.Migrations.M20221024_contact_used
Simplex.Chat.Store.SQLite.Migrations.M20221025_chat_settings
Simplex.Chat.Store.SQLite.Migrations.M20221029_group_link_id
Simplex.Chat.Store.SQLite.Migrations.M20221112_server_password
Simplex.Chat.Store.SQLite.Migrations.M20221115_server_cfg
Simplex.Chat.Store.SQLite.Migrations.M20221129_delete_group_feature_items
Simplex.Chat.Store.SQLite.Migrations.M20221130_delete_item_deleted
Simplex.Chat.Store.SQLite.Migrations.M20221209_verified_connection
Simplex.Chat.Store.SQLite.Migrations.M20221210_idxs
Simplex.Chat.Store.SQLite.Migrations.M20221211_group_description
Simplex.Chat.Store.SQLite.Migrations.M20221212_chat_items_timed
Simplex.Chat.Store.SQLite.Migrations.M20221214_live_message
Simplex.Chat.Store.SQLite.Migrations.M20221222_chat_ts
Simplex.Chat.Store.SQLite.Migrations.M20221223_idx_chat_items_item_status
Simplex.Chat.Store.SQLite.Migrations.M20221230_idxs
Simplex.Chat.Store.SQLite.Migrations.M20230107_connections_auth_err_counter
Simplex.Chat.Store.SQLite.Migrations.M20230111_users_agent_user_id
Simplex.Chat.Store.SQLite.Migrations.M20230117_fkey_indexes
Simplex.Chat.Store.SQLite.Migrations.M20230118_recreate_smp_servers
Simplex.Chat.Store.SQLite.Migrations.M20230129_drop_chat_items_group_idx
Simplex.Chat.Store.SQLite.Migrations.M20230206_item_deleted_by_group_member_id
Simplex.Chat.Store.SQLite.Migrations.M20230303_group_link_role
Simplex.Chat.Store.SQLite.Migrations.M20230317_hidden_profiles
Simplex.Chat.Store.SQLite.Migrations.M20230318_file_description
Simplex.Chat.Store.SQLite.Migrations.M20230321_agent_file_deleted
Simplex.Chat.Store.SQLite.Migrations.M20230328_files_protocol
Simplex.Chat.Store.SQLite.Migrations.M20230402_protocol_servers
Simplex.Chat.Store.SQLite.Migrations.M20230411_extra_xftp_file_descriptions
Simplex.Chat.Store.SQLite.Migrations.M20230420_rcv_files_to_receive
Simplex.Chat.Store.SQLite.Migrations.M20230422_profile_contact_links
Simplex.Chat.Store.SQLite.Migrations.M20230504_recreate_msg_delivery_events_cleanup_messages
Simplex.Chat.Store.SQLite.Migrations.M20230505_chat_item_versions
Simplex.Chat.Store.SQLite.Migrations.M20230511_reactions
Simplex.Chat.Store.SQLite.Migrations.M20230519_item_deleted_ts
Simplex.Chat.Store.SQLite.Migrations.M20230526_indexes
Simplex.Chat.Store.SQLite.Migrations.M20230529_indexes
Simplex.Chat.Store.SQLite.Migrations.M20230608_deleted_contacts
Simplex.Chat.Store.SQLite.Migrations.M20230618_favorite_chats
Simplex.Chat.Store.SQLite.Migrations.M20230621_chat_item_moderations
Simplex.Chat.Store.SQLite.Migrations.M20230705_delivery_receipts
Simplex.Chat.Store.SQLite.Migrations.M20230721_group_snd_item_statuses
Simplex.Chat.Store.SQLite.Migrations.M20230814_indexes
Simplex.Chat.Store.SQLite.Migrations.M20230827_file_encryption
Simplex.Chat.Store.SQLite.Migrations.M20230829_connections_chat_vrange
Simplex.Chat.Store.SQLite.Migrations.M20230903_connections_to_subscribe
Simplex.Chat.Store.SQLite.Migrations.M20230913_member_contacts
Simplex.Chat.Store.SQLite.Migrations.M20230914_member_probes
Simplex.Chat.Store.SQLite.Migrations.M20230926_contact_status
Simplex.Chat.Store.SQLite.Migrations.M20231002_conn_initiated
Simplex.Chat.Store.SQLite.Migrations.M20231009_via_group_link_uri_hash
Simplex.Chat.Store.SQLite.Migrations.M20231010_member_settings
Simplex.Chat.Store.SQLite.Migrations.M20231019_indexes
Simplex.Chat.Store.SQLite.Migrations.M20231030_xgrplinkmem_received
Simplex.Chat.Store.SQLite.Migrations.M20231107_indexes
Simplex.Chat.Store.SQLite.Migrations.M20231113_group_forward
Simplex.Chat.Store.SQLite.Migrations.M20231114_remote_control
Simplex.Chat.Store.SQLite.Migrations.M20231126_remote_ctrl_address
Simplex.Chat.Store.SQLite.Migrations.M20231207_chat_list_pagination
Simplex.Chat.Store.SQLite.Migrations.M20231214_item_content_tag
Simplex.Chat.Store.SQLite.Migrations.M20231215_recreate_msg_deliveries
Simplex.Chat.Store.SQLite.Migrations.M20240102_note_folders
Simplex.Chat.Store.SQLite.Migrations.M20240104_members_profile_update
Simplex.Chat.Store.SQLite.Migrations.M20240115_block_member_for_all
Simplex.Chat.Store.SQLite.Migrations.M20240122_indexes
Simplex.Chat.Store.SQLite.Migrations.M20240214_redirect_file_id
Simplex.Chat.Store.SQLite.Migrations.M20240222_app_settings
Simplex.Chat.Store.SQLite.Migrations.M20240226_users_restrict
Simplex.Chat.Store.SQLite.Migrations.M20240228_pq
Simplex.Chat.Store.SQLite.Migrations.M20240313_drop_agent_ack_cmd_id
Simplex.Chat.Store.SQLite.Migrations.M20240324_custom_data
Simplex.Chat.Store.SQLite.Migrations.M20240402_item_forwarded
Simplex.Chat.Store.SQLite.Migrations.M20240430_ui_theme
Simplex.Chat.Store.SQLite.Migrations.M20240501_chat_deleted
Simplex.Chat.Store.SQLite.Migrations.M20240510_chat_items_via_proxy
Simplex.Chat.Store.SQLite.Migrations.M20240515_rcv_files_user_approved_relays
Simplex.Chat.Store.SQLite.Migrations.M20240528_quota_err_counter
Simplex.Chat.Store.SQLite.Migrations.M20240827_calls_uuid
Simplex.Chat.Store.SQLite.Migrations.M20240920_user_order
Simplex.Chat.Store.SQLite.Migrations.M20241008_indexes
Simplex.Chat.Store.SQLite.Migrations.M20241010_contact_requests_contact_id
Simplex.Chat.Store.SQLite.Migrations.M20241023_chat_item_autoincrement_id
Simplex.Chat.Store.SQLite.Migrations.M20241027_server_operators
Simplex.Chat.Store.SQLite.Migrations.M20241125_indexes
Simplex.Chat.Store.SQLite.Migrations.M20241128_business_chats
Simplex.Chat.Store.SQLite.Migrations.M20241205_business_chat_members
Simplex.Chat.Store.SQLite.Migrations.M20241222_operator_conditions
Simplex.Chat.Store.SQLite.Migrations.M20241223_chat_tags
Simplex.Chat.Store.SQLite.Migrations.M20241230_reports
Simplex.Chat.Store.SQLite.Migrations.M20250105_indexes
Simplex.Chat.Store.SQLite.Migrations.M20250115_chat_ttl
Simplex.Chat.Store.SQLite.Migrations.M20250122_chat_items_include_in_history
Simplex.Chat.Store.SQLite.Migrations.M20250126_mentions
Simplex.Chat.Store.SQLite.Migrations.M20250129_delete_unused_contacts
Simplex.Chat.Store.SQLite.Migrations.M20250130_indexes
Simplex.Chat.Store.SQLite.Migrations.M20250402_short_links
Simplex.Chat.Store.SQLite.Migrations.M20250512_member_admission
Simplex.Chat.Store.SQLite.Migrations.M20250513_group_scope
Simplex.Chat.Store.SQLite.Migrations.M20250526_short_links
Simplex.Chat.Store.SQLite.Migrations.M20250702_contact_requests_remove_cascade_delete
Simplex.Chat.Store.SQLite.Migrations.M20250704_groups_conn_link_prepared_connection
Simplex.Chat.Store.SQLite.Migrations.M20250709_profile_short_descr
Simplex.Chat.Store.SQLite.Migrations.M20250721_indexes
Simplex.Chat.Store.SQLite.Migrations.M20250729_member_contact_requests
Simplex.Chat.Store.SQLite.Migrations.M20250801_via_group_link_uri
Simplex.Chat.Store.SQLite.Migrations.M20250802_chat_peer_type
Simplex.Chat.Store.SQLite.Migrations.M20250813_delivery_tasks
Simplex.Chat.Store.SQLite.Migrations.M20250919_group_summary
Simplex.Chat.Store.SQLite.Migrations.M20250922_remove_unused_connections
Simplex.Chat.Store.SQLite.Migrations.M20251007_connections_sync
Simplex.Chat.Store.SQLite.Migrations.M20251017_chat_tags_cascade
Simplex.Chat.Store.SQLite.Migrations.M20251117_member_relations_vector
Simplex.Chat.Store.SQLite.Migrations.M20251128_migrate_member_relations
Simplex.Chat.Store.SQLite.Migrations.M20251230_strict_tables
Simplex.Chat.Store.SQLite.Migrations.M20260108_chat_indices
Simplex.Chat.Store.SQLite.Migrations.M20260122_has_link
Simplex.Chat.Store.SQLite.Migrations.M20260222_chat_relays
Simplex.Chat.Store.SQLite.Migrations.M20260403_item_viewed
Simplex.Chat.Store.SQLite.Migrations.M20260429_relay_request_retries
Simplex.Chat.Store.SQLite.Migrations.M20260507_relay_inactive_at
Simplex.Chat.Store.SQLite.Migrations.M20260514_relay_request_group_link_index
Simplex.Chat.Store.SQLite.Migrations.M20260515_public_group_access
Simplex.Chat.Store.SQLite.Migrations.M20260516_supporter_badges
Simplex.Chat.Store.SQLite.Migrations.M20260529_delivery_job_senders
Simplex.Chat.Store.SQLite.Migrations.M20260530_client_services
Simplex.Chat.Store.SQLite.Migrations.M20260531_member_removed_at
Simplex.Chat.Store.SQLite.Migrations.M20260601_relay_sent_web_domain
Simplex.Chat.Store.SQLite.Migrations.M20260602_group_roster
Simplex.Chat.Store.SQLite.Migrations.M20260603_simplex_name
Simplex.Chat.Store.SQLite.Migrations.M20260629_roster_catchup
Simplex.Chat.Store.SQLite.Migrations.M20260707_file_digest
Simplex.Chat.Store.SQLite.Migrations.M20260714_member_security_code
Simplex.Chat.Store.SQLite.Migrations.M20260715_profile_description
Simplex.Chat.Store.SQLite.Migrations.M20260716_signed_history
Simplex.Chat.Store.SQLite.Migrations.M20260720_server_roles
Simplex.Chat.Store.SQLite.Migrations.M20260723_contact_request_rejection
Simplex.Chat.Store.SQLite.Migrations.M20260813_auto_accept_group_invitations
Simplex.Chat.Store.SQLite.Migrations.M20260822_forward_link
Simplex.Chat.Store.SQLite.Migrations.M20260828_file_expiry
Simplex.Chat.Store.SQLite.Migrations.M20260904_file_badges
Simplex.Chat.Store.SQLite.Migrations.M20260915_user_badges
Simplex.Chat.Store.SQLite.Migrations.M20260918_badge_issue_errors
Simplex.Chat.Store.SQLite.Migrations.M20260923_preferences_json
Simplex.Chat.Store.SQLite.Migrations.M20260925_badge_bindings
Simplex.Chat.Store.SQLite.Migrations.M20261010_invite_member_via_group
Simplex.Chat.Store.SQLite.Migrations.M20261030_wallet_seeds
other-modules:
Paths_simplex_chat
hs-source-dirs:
src
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing
build-depends:
aeson ==2.2.*
, ansi-terminal >=0.10 && <0.12
, async ==2.2.*
, attoparsec ==0.14.*
, base >=4.7 && <5
, base64-bytestring >=1.0 && <1.3
, composition ==1.0.*
, constraints >=0.12 && <0.14
, containers ==0.6.*
, crypton ==0.34.*
, crypton-x509 ==1.7.*
, data-default ==0.7.*
, directory ==1.3.*
, email-validate ==2.3.*
, exceptions ==0.10.*
, file-embed ==0.0.15.*
, filepath ==1.4.*
, http-types ==0.12.*
, http2 >=4.2.2 && <4.3
, memory ==0.18.*
, mtl >=2.3.1 && <3.0
, network >=3.1.2.7 && <3.2
, network-transport ==0.5.6
, optparse-applicative >=0.15 && <0.17
, random >=1.1 && <1.3
, record-hasfield ==1.0.*
, simple-logger ==0.1.*
, simplexmq >=6.3
, socks ==0.6.*
, stm ==2.5.*
, terminal ==0.2.*
, time ==1.12.*
, tls >=1.9.0 && <1.10
, unliftio ==0.2.*
, unliftio-core ==0.2.*
, uri-bytestring >=0.3.3.1 && <0.4
, uuid ==1.3.*
, zip ==2.2.*
, zstd ==0.1.3.*
default-language: Haskell2010
if flag(swift)
cpp-options: -DswiftJSON
if flag(client_postgres)
build-depends:
postgresql-libpq >=0.10.0.0
, postgresql-simple ==0.7.*
, raw-strings-qq ==1.1.*
cpp-options: -DdbPostgres
else
build-depends:
direct-sqlcipher ==2.3.*
, sqlcipher-simple ==0.4.*
if impl(ghc >= 9.6.2)
build-depends:
bytestring ==0.11.*
, process ==1.6.*
, template-haskell ==2.20.*
, text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
bytestring ==0.10.*
, process >=1.6 && <1.6.18
, template-haskell ==2.16.*
, text >=1.2.4.0 && <1.3
executable simplex-badge-service
if flag(client_library)
buildable: False
main-is: Main.hs
hs-source-dirs:
apps/simplex-badge-service
apps/simplex-badge-service/src
default-extensions:
StrictData
other-modules:
BadgeService.Catalog
BadgeService.Codes
BadgeService.Config
BadgeService.Group
BadgeService.Group.Command
BadgeService.Log
BadgeService.Options
BadgeService.Orders
BadgeService.Poller
BadgeService.Providers
BadgeService.Providers.BTCPay
BadgeService.Providers.Stripe
BadgeService.Service
BadgeService.Store
BadgeService.Store.Invoices
BadgeService.Store.Migrate
BadgeService.Waiters
BadgeService.Web.Server
Paths_simplex_chat
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded -rtsopts
build-depends:
aeson ==2.2.*
, attoparsec ==0.14.*
, base >=4.7 && <5
, base64-bytestring >=1.0 && <1.3
, containers ==0.6.*
, crypton ==0.34.*
, directory ==1.3.*
, filepath ==1.4.*
, http-client ==0.7.*
, http-client-tls ==0.3.*
, http-types ==0.12.*
, ini ==0.4.1
, memory ==0.18.*
, mtl >=2.3.1 && <3.0
, network ==3.1.*
, optparse-applicative >=0.15 && <0.17
, scientific ==0.3.*
, simple-logger ==0.1.*
, simplex-chat
, simplexmq >=6.3
, stm ==2.5.*
, time ==1.12.*
, wai ==3.2.*
, warp ==3.3.*
default-language: Haskell2010
if flag(client_postgres)
other-modules:
BadgeService.Store.Postgres.Migrations
build-depends:
postgresql-simple ==0.7.*
, raw-strings-qq ==1.1.*
cpp-options: -DdbPostgres
else
other-modules:
BadgeService.Store.SQLite.Migrations
build-depends:
sqlcipher-simple ==0.4.*
if impl(ghc >= 9.6.2)
build-depends:
bytestring ==0.11.*
, text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
bytestring ==0.10.*
, text >=1.2.4.0 && <1.3
executable simplex-bot
if flag(client_library)
buildable: False
main-is: Main.hs
other-modules:
Paths_simplex_chat
hs-source-dirs:
apps/simplex-bot
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded
build-depends:
base >=4.7 && <5
, directory ==1.3.*
, simplex-chat
default-language: Haskell2010
if flag(client_postgres)
cpp-options: -DdbPostgres
executable simplex-bot-advanced
if flag(client_library)
buildable: False
main-is: Main.hs
other-modules:
Paths_simplex_chat
hs-source-dirs:
apps/simplex-bot-advanced
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded
build-depends:
async ==2.2.*
, base >=4.7 && <5
, directory ==1.3.*
, simplex-chat
, simplexmq >=6.3
, stm ==2.5.*
default-language: Haskell2010
if flag(client_postgres)
cpp-options: -DdbPostgres
if impl(ghc >= 9.6.2)
build-depends:
text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
text >=1.2.4.0 && <1.3
executable simplex-broadcast-bot
if flag(client_library)
buildable: False
main-is: Main.hs
hs-source-dirs:
apps/simplex-broadcast-bot
apps/simplex-broadcast-bot/src
default-extensions:
StrictData
other-modules:
Broadcast.Bot
Broadcast.Options
Paths_simplex_chat
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded -rtsopts
build-depends:
async ==2.2.*
, base >=4.7 && <5
, directory ==1.3.*
, optparse-applicative >=0.15 && <0.17
, simplex-chat
, simplexmq >=6.3
, stm ==2.5.*
default-language: Haskell2010
if flag(client_postgres)
cpp-options: -DdbPostgres
if impl(ghc >= 9.6.2)
build-depends:
text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
text >=1.2.4.0 && <1.3
executable simplex-chat
if flag(client_library)
buildable: False
main-is: Main.hs
other-modules:
Server
Paths_simplex_chat
hs-source-dirs:
apps/simplex-chat
default-extensions:
StrictData
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded -rtsopts
build-depends:
aeson ==2.2.*
, base >=4.7 && <5
, directory ==1.3.*
, mtl >=2.3.1 && <3.0
, network ==3.1.*
, simplex-chat
, simplexmq >=6.3
, stm ==2.5.*
, unliftio ==0.2.*
, websockets ==0.12.*
default-language: Haskell2010
if flag(client_postgres)
cpp-options: -DdbPostgres
if impl(ghc >= 9.6.2)
build-depends:
text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
text >=1.2.4.0 && <1.3
executable simplex-directory-service
if flag(client_library)
buildable: False
main-is: Main.hs
hs-source-dirs:
apps/simplex-directory-service
apps/simplex-directory-service/src
default-extensions:
StrictData
other-modules:
Directory.BlockedWords
Directory.Captcha
Directory.Events
Directory.Listing
Directory.Options
Directory.Search
Directory.Service
Directory.Store
Directory.Store.Migrate
Paths_simplex_chat
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded -rtsopts
build-depends:
aeson ==2.2.*
, async ==2.2.*
, attoparsec ==0.14.*
, base >=4.7 && <5
, base64-bytestring >=1.0 && <1.3
, composition ==1.0.*
, containers ==0.6.*
, crypton ==0.34.*
, directory ==1.3.*
, filepath ==1.4.*
, memory ==0.18.*
, mtl >=2.3.1 && <3.0
, optparse-applicative >=0.15 && <0.17
, process >=1.6 && <1.6.18
, random >=1.1 && <1.3
, simple-logger ==0.1.*
, simplex-chat
, simplexmq >=6.3
, stm ==2.5.*
, time ==1.12.*
, unicode-transforms ==0.4.*
default-language: Haskell2010
if flag(client_postgres)
other-modules:
Directory.Store.Postgres.Migrations
build-depends:
postgresql-simple ==0.7.*
, raw-strings-qq ==1.1.*
cpp-options: -DdbPostgres
else
other-modules:
Directory.Store.SQLite.Migrations
build-depends:
sqlcipher-simple ==0.4.*
if impl(ghc >= 9.6.2)
build-depends:
bytestring ==0.11.*
, text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
bytestring ==0.10.*
, text >=1.2.4.0 && <1.3
test-suite simplex-chat-test
if flag(swift)
cpp-options: -DswiftJSON
if flag(client_library)
buildable: False
type: exitcode-stdio-1.0
main-is: Test.hs
other-modules:
APIDocs
BadgeTests
Bots.BroadcastTests
Bots.DirectoryTests
ChatClient
ChatTests
ChatTests.ChatList
ChatTests.ChatRelays
ChatTests.Direct
ChatTests.DBUtils
ChatTests.Files
ChatTests.Forward
ChatTests.Groups
ChatTests.Local
ChatTests.Names
ChatTests.Profiles
ChatTests.Utils
JSONFixtures
JSONTests
MarkdownTests
MemberRelationsTests
NameResolver
MessageBatching
OperatorTests
ProtocolTests
RandomServers
RemoteTests
ValidNames
ViewTests
WalletTests
API.Docs.Commands
API.Docs.Events
API.Docs.Generate
API.Docs.Generate.Python
API.Docs.Generate.TypeScript
API.Docs.Responses
API.Docs.Syntax
API.Docs.Syntax.Types
API.Docs.Types
API.TypeInfo
BadgeService.Catalog
BadgeService.Codes
BadgeService.Config
BadgeService.Group
BadgeService.Group.Command
BadgeService.Log
BadgeService.Options
BadgeService.Orders
BadgeService.Poller
BadgeService.Providers
BadgeService.Providers.BTCPay
BadgeService.Providers.Stripe
BadgeService.Service
BadgeService.Store
BadgeService.Store.Invoices
BadgeService.Store.Migrate
BadgeService.Waiters
BadgeService.Web.Server
Bots.BadgeService.BTCPayTests
Bots.BadgeService.BotTests
Bots.BadgeService.CatalogTests
Bots.BadgeService.ConfigTests
Bots.BadgeService.FakeBTCPay
Bots.BadgeService.FakeStripe
Bots.BadgeService.GroupIntegrationTests
Bots.BadgeService.GroupTests
Bots.BadgeService.StripeTests
Bots.BadgeService.WaitersTests
Bots.BadgeService.WebTests
Broadcast.Bot
Broadcast.Options
Directory.BlockedWords
Directory.Captcha
Directory.Events
Directory.Listing
Directory.Options
Directory.Search
Directory.Service
Directory.Store
Directory.Store.Migrate
Paths_simplex_chat
if flag(client_postgres)
other-modules:
ChatTests.DBUtils.Postgres
PostgresSchemaDump
else
other-modules:
ChatTests.DBUtils.SQLite
MobileTests
SchemaDump
WebRTCTests
hs-source-dirs:
bots/src
tests
apps/simplex-badge-service/src
apps/simplex-broadcast-bot/src
apps/simplex-directory-service/src
default-extensions:
StrictData
-- add -fhpc to ghc-options below to run tests with coverage
ghc-options: -O2 -Weverything -Wno-missing-exported-signatures -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-local-signatures -Wno-missing-kind-signatures -Wno-missing-deriving-strategies -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unused-packages -Wno-implicit-prelude -Wno-missing-safe-haskell-mode -Wno-missing-export-lists -Wno-partial-fields -Wcompat -Werror=incomplete-record-updates -Werror=incomplete-patterns -Werror=missing-methods -Werror=incomplete-uni-patterns -Werror=tabs -Wredundant-constraints -Wincomplete-record-updates -Wunused-type-patterns -Werror=name-shadowing -threaded -rtsopts "-with-rtsopts=-N"
build-depends:
QuickCheck ==2.14.*
, aeson ==2.2.*
, ansi-terminal >=0.10 && <0.12
, async ==2.2.*
, attoparsec ==0.14.*
, base >=4.7 && <5
, base64-bytestring >=1.0 && <1.3
, composition ==1.0.*
, containers ==0.6.*
, crypton ==0.34.*
, deepseq ==1.4.*
, directory ==1.3.*
, filepath ==1.4.*
, generic-random ==1.5.*
, http-client ==0.7.*
, http-client-tls ==0.3.*
, http-types ==0.12.*
, ini ==0.4.1
, memory ==0.18.*
, mtl >=2.3.1 && <3.0
, network ==3.1.*
, optparse-applicative >=0.15 && <0.17
, random >=1.1 && <1.3
, scientific ==0.3.*
, silently ==1.2.*
, simple-logger ==0.1.*
, simplex-chat
, simplexmq >=6.3
, stm ==2.5.*
, terminal ==0.2.*
, time ==1.12.*
, unicode-transforms ==0.4.*
, unliftio ==0.2.*
, uri-bytestring >=0.3.3.1 && <0.4
, wai ==3.2.*
, warp ==3.3.*
default-language: Haskell2010
if flag(client_postgres)
other-modules:
BadgeService.Store.Postgres.Migrations
Directory.Store.Postgres.Migrations
build-depends:
postgresql-simple ==0.7.*
, raw-strings-qq ==1.1.*
cpp-options: -DdbPostgres
else
other-modules:
BadgeService.Store.SQLite.Migrations
Directory.Store.SQLite.Migrations
build-depends:
sqlcipher-simple ==0.4.*
if impl(ghc >= 9.6.2)
build-depends:
bytestring ==0.11.*
, hspec ==2.11.*
, process ==1.6.*
, text >=2.0.1 && <2.2
if impl(ghc < 9.6.2)
build-depends:
bytestring ==0.10.*
, hspec ==2.7.*
, hspec-core ==2.7.*
, process >=1.6 && <1.6.18
, text >=1.2.4.0 && <1.3