Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
408 commits
Select commit Hold shift + click to select a range
bfa246d
POP3 and SMTP: trust a server's own certificate by its thumbprint
samerzughul Oct 11, 2026
263b471
CLI: say once that the certificate isn't checked
samerzughul Oct 11, 2026
8952dd6
FTP and SFTP uploads: name the file after the message
samerzughul Oct 11, 2026
57036cc
Data source providers as packages; staging runs data sources
samerzughul Oct 11, 2026
729c4af
Exchanges: a list built for triage
samerzughul Oct 11, 2026
89935e1
Merge feature/exchanges-redesign: exchanges list redesign
samerzughul Oct 11, 2026
36b8f2d
SFTP waits at most TimeoutSeconds at each step
samerzughul Oct 11, 2026
e6d58a6
apply: no false warning for an adapter already published
samerzughul Oct 11, 2026
ae6df7b
apply: an aggregation with an information type is refused up front
samerzughul Oct 11, 2026
a8a01dc
HTTP handler: a failed delivery names its status code
samerzughul Oct 11, 2026
f597f00
Exchanges: keep the narrowed list informative, and show work in progr…
samerzughul Oct 12, 2026
0460dde
apply: a retry budget without a shared total is refused
samerzughul Oct 12, 2026
85f33dd
Built-in adapters: a call that never returns fails as a timeout
samerzughul Oct 12, 2026
0240213
Aggregations: one replica builds a roll-up, the others step aside
samerzughul Oct 12, 2026
edc97ed
Staging runs two replicas
samerzughul Oct 12, 2026
af969e6
CI: staging deploys from releases/r10.0-develop
samerzughul Oct 12, 2026
f55ab9c
CI: no comments inside helm-set-values
samerzughul Oct 12, 2026
195a61c
ci: split the develop and release pipelines
MusaMisto Oct 12, 2026
6035d45
ci: publish the production chart to GHCR as well as ChartMuseum
MusaMisto Oct 12, 2026
4ae009c
Merge pull request #368 from simplify9/musa/ci/develop-pipeline
MusaMisto Oct 12, 2026
27275f4
Develop: S3 checksums only when required, as an experiment
samerzughul Oct 12, 2026
7594ebb
Sync gateways can say what really happened when a delivery fails
samerzughul Oct 12, 2026
ba616e7
Prove Quartz runs each scheduled fire on one replica
samerzughul Oct 12, 2026
4bd583d
Say what is true about scheduled jobs on several replicas
samerzughul Oct 12, 2026
d0f4c06
Stop calling a destination that keeps failing
samerzughul Oct 12, 2026
c305b1c
Send to a notifier through one helper
samerzughul Oct 12, 2026
9b2f5a8
Let a subscription say how often it expects traffic
samerzughul Oct 12, 2026
4e86aaf
Tell notifiers when a subscription goes quiet, and when it is back
samerzughul Oct 12, 2026
d995ac6
Set expected traffic on the subscription page and show when it is quiet
samerzughul Oct 12, 2026
d229162
Document expected traffic and quiet subscriptions
samerzughul Oct 12, 2026
a0569b7
ci: publish develop from the production chart directory
MusaMisto Oct 12, 2026
2516f36
Merge pull request #370 from simplify9/musa/ci/develop-single-chart
MusaMisto Oct 12, 2026
631f105
fix(build): build SW.Bitween.Web once per solution build
MusaMisto Oct 12, 2026
9e0db43
Work groups: a name already taken is refused
samerzughul Oct 12, 2026
bc58550
ci: deploy develop to bitween-dev and releases to production
MusaMisto Oct 12, 2026
c4b6861
Merge pull request #372 from simplify9/musa/ci/deploy-targets
MusaMisto Oct 12, 2026
34c9faf
Merge pull request #371 from simplify9/musa/fix/web-built-once
MusaMisto Oct 12, 2026
4c4fcfd
Marketplace: browse and install connectors from a Bitween Registry
samerzughul Oct 12, 2026
3258c3b
Marketplace: on by default, with Simplify9's registry and its key
samerzughul Oct 12, 2026
e0fa15d
Known limitations: remove what has been fixed since September
samerzughul Oct 12, 2026
2b2ad9f
Operations: document the metrics and traces Bitween exports over OTLP
samerzughul Oct 12, 2026
ed03148
Deleting a scheduled job or aggregation removes its triggers
samerzughul Oct 12, 2026
b532779
An exchange's one retry is enforced by the database
samerzughul Oct 12, 2026
f93fa15
ci: carry the S3 checksum setting into production
MusaMisto Oct 12, 2026
f80776b
HTTP receiver: follow an API's pages
samerzughul Oct 12, 2026
67042db
ci: serve app.bitween.io from the prod gateway's wildcard listener
MusaMisto Oct 12, 2026
29ec720
Information types: the duplicate window works, reporting before it drops
samerzughul Oct 12, 2026
9c2a4b7
HTTP tests: catch up with the quiet-subscriptions job and retry budgets
samerzughul Oct 12, 2026
09bb100
ci: serve app-dev.bitween.io from the dev gateway's wildcard listener
MusaMisto Oct 12, 2026
4a18550
Database receiving: a row whose marking failed isn't received again
samerzughul Oct 12, 2026
f9e061a
Merge pull request #373 from simplify9/musa/ci/prod-aws-checksum
MusaMisto Oct 12, 2026
0231b39
Merge releases/r10.0 into releases/r10.0-develop
MusaMisto Oct 12, 2026
6c087db
CLI: bitween mapping test checks saved mappings against sample files
samerzughul Oct 12, 2026
4f40e76
Subscriptions keep their versions, to compare and restore
samerzughul Oct 12, 2026
18f1124
Mapping docs: the rules-based mapper reads and writes CSV
samerzughul Oct 12, 2026
736f612
Merge pull request #374 from simplify9/musa/sync-r10.0-into-develop
MusaMisto Oct 12, 2026
f0efbed
Mapper: fixed-width text and Excel workbooks, read and written
samerzughul Oct 12, 2026
36e781b
Duplicates: tag one only when the reference fits; let layout boxes be…
samerzughul Oct 12, 2026
60bba74
Tests and docs for the marketplace installer, the format controls and…
samerzughul Oct 12, 2026
e8b6ede
Data source providers can be installed from the marketplace
samerzughul Oct 12, 2026
60850dd
Rebex adapters retire to the marketplace
samerzughul Oct 12, 2026
fbbb544
Single sign-on with any OpenID Connect provider
samerzughul Oct 12, 2026
efdff46
Connections: OAuth2 tokens Bitween keeps fresh for every adapter
samerzughul Oct 13, 2026
3b51d23
An adapter can say when to try again
samerzughul Oct 13, 2026
8f60406
Receivers can keep a bookmark between runs
samerzughul Oct 13, 2026
03c44ad
Merge branch 'releases/r10.0-develop' of github.com:simplify9/Bitween…
samerzughul Oct 13, 2026
806ce0a
Add notification channels: table, API and encrypted settings
hamzahalq Oct 12, 2026
43a337e
Send subscription notifications through channels
hamzahalq Oct 12, 2026
0786027
Add Email, Teams and Slack channel types and a test button
hamzahalq Oct 12, 2026
04e53cb
Notify for an exchange whose subscription was switched off meanwhile
hamzahalq Oct 12, 2026
df884ce
Send retry, pause and quiet alerts through channels
hamzahalq Oct 12, 2026
7fb0ec7
Drop a kept subscription secret when its adapter changes
hamzahalq Oct 12, 2026
249031e
Add notification channels to the UI
hamzahalq Oct 13, 2026
5f0c93a
Add notification channels to bitween apply
hamzahalq Oct 13, 2026
a150e9b
Show held-back channel sends as held back
hamzahalq Oct 13, 2026
9580ac8
Document notification channels
hamzahalq Oct 13, 2026
c1e05f3
Kits: bitween kit test, install and build
samerzughul Oct 13, 2026
6d6927d
Count notification channels where connections and retiring adapters a…
hamzahalq Oct 13, 2026
bed7540
Step aside from the alert move only when another copy finished it
hamzahalq Oct 13, 2026
ff4d49c
Name notification changes in a subscription's versions
hamzahalq Oct 13, 2026
67bec2e
Give up on a silent mail server after 30 seconds
hamzahalq Oct 13, 2026
18b523b
Show errors without their stack trace in channel messages
hamzahalq Oct 13, 2026
8c250ac
Install kits from the Marketplace tab
samerzughul Oct 13, 2026
f0bc18e
Keep alerts out of a channel's quiet window and bound its lookup
hamzahalq Oct 13, 2026
5619a50
Match secret names ignoring case when hiding and keeping them
hamzahalq Oct 13, 2026
f8a1984
Hold inline retry policies to the alert rules when a subscription is …
hamzahalq Oct 13, 2026
c81420a
Move only alerts that sent, a page of inline policies at a time
hamzahalq Oct 13, 2026
12b3ba1
Leave out empty facts and escape the Slack banner
hamzahalq Oct 13, 2026
31c65d2
Refetch channel usage and sends whenever they are opened
hamzahalq Oct 13, 2026
d423c38
Keep incomplete or repeated notification rows from being saved
hamzahalq Oct 13, 2026
b2b7054
Refuse to save a retry group that was removed meanwhile
hamzahalq Oct 13, 2026
2ac98d2
Report an unexpected customRetryPolicy shape in bitween plan
hamzahalq Oct 13, 2026
4a37153
Open Settings on the notification channels for roles without Settings
hamzahalq Oct 13, 2026
a70331c
Correct what blocks deleting a channel in the API reference
hamzahalq Oct 13, 2026
6ce1de0
Merge pull request #379 from simplify9/hamza/feature/notification-cha…
hamzahalq Oct 13, 2026
0ad3a57
Native mapper: a fixed value that is a list or an object is written a…
samerzughul Oct 13, 2026
c750767
Marketplace: daily check for updates and revocations, and filters
samerzughul Oct 13, 2026
934892c
CLI: bitween registry login, publish, status, whoami, logout
samerzughul Oct 13, 2026
9777241
Kits read nothing but their parameters and their own files
samerzughul Oct 13, 2026
8e329b4
POST /api/kits/plan: plan a kit sent as its zip, changing nothing
samerzughul Oct 13, 2026
c09fde4
Merge releases/r10.0-develop: notification channels
samerzughul Oct 13, 2026
5f16a15
bitween adapter test --json: the report alone, with the checks that c…
samerzughul Oct 13, 2026
375f610
Integration tests: delete a connection as the delete handler takes it…
samerzughul Oct 13, 2026
3e055e4
Staging's own RabbitMQ in bitween-dev, run by the cluster's RabbitMQ …
samerzughul Oct 13, 2026
9db3c0e
bitween adapter test: a package that isn't a whole zip is said, not c…
samerzughul Oct 13, 2026
fafc58b
Docs: what the registry checks before review, and that it runs no pac…
samerzughul Oct 13, 2026
a69d181
Bitween says which release it is, from the version CI stamps on its b…
samerzughul Oct 13, 2026
7bc6994
CI: stamp the version and commit on the image, for the develop and re…
samerzughul Oct 13, 2026
1ec3131
Security hardening: hashes, lockout, masking, TLS, retention, read-on…
samerzughul Oct 13, 2026
972412b
Exchange performance, phase 0: count database commands per exchange a…
samerzughul Oct 14, 2026
b3dd091
Logging: hold per-command, per-HTTP-call and per-request categories t…
samerzughul Oct 14, 2026
aafddd4
Exchange performance, phase 1: fold the per-exchange reads or serve t…
samerzughul Oct 14, 2026
2c64258
Exchange performance, phase 2: delete published outbox rows in batche…
samerzughul Oct 14, 2026
46e125b
Exchange performance, phase 3: result events only when something noti…
samerzughul Oct 14, 2026
bd6908e
Exchange performance, phase 4: promoted properties at creation, optim…
samerzughul Oct 14, 2026
e198efe
Marketplace: registration, licences for paid connectors and usage rep…
samerzughul Oct 14, 2026
b3e6b69
Retention tests set their own promoted properties over the ones read …
samerzughul Oct 14, 2026
fac2099
Exchange performance, phase 0: k6 load harness for the sync gateway path
samerzughul Oct 14, 2026
df20951
Marketplace: install from a bundle, and bitween registry bundle
samerzughul Oct 14, 2026
b2bde01
Update bitween-api-cicd-gateway.yml
MusaMisto Oct 14, 2026
3d3d0f7
CloudFiles 10.0.2: a malformed x-amz-expiration header no longer fail…
samerzughul Oct 14, 2026
c980cd1
Data sources: restart an adapter that has been disconnected for two m…
samerzughul Oct 14, 2026
259c98c
SW.Bus 10.1: RabbitMQ.Client 7
samerzughul Oct 14, 2026
a51c9a5
Load harness: a partner with a fixed delay, and object storage reques…
samerzughul Oct 14, 2026
183a1a6
Exchange files are written beside the work, and every save waits for …
samerzughul Oct 14, 2026
233ed43
A small input travels with its created message; the worker reads stor…
samerzughul Oct 14, 2026
6535a5c
A sync gateway call is answered when its result is saved, with the po…
samerzughul Oct 14, 2026
25ec5f5
The sync answer comes from the result signal, with no database or sto…
samerzughul Oct 14, 2026
f19f712
Work groups: parallel exchanges per lane
samerzughul Oct 14, 2026
d9a6c52
Processing performance: findings, decisions and plan (findings 1, 4 a…
samerzughul Oct 14, 2026
b495064
Processing performance: findings 2 and 3 implemented locally, with me…
samerzughul Oct 14, 2026
11ee0a9
Processing performance: plan rows for findings 2 and 3 done locally, …
samerzughul Oct 14, 2026
a1e20a5
Merge branch 'releases/r10.0-develop' of github.com:simplify9/Bitween…
samerzughul Oct 14, 2026
d3d94d7
Processing performance: findings 1, 2, 3, 4 and 7 collapsed into the …
samerzughul Oct 14, 2026
e3a19ce
Processing performance: findings 9 and 10 and the open questions brou…
samerzughul Oct 14, 2026
a9c4102
CI: the CLI and SDK jobs need the renamed Dev and Prod jobs
samerzughul Oct 14, 2026
d0ca363
Processing performance: the done findings are on dev
samerzughul Oct 14, 2026
4a9c87d
Processing performance: finding 6 broken down
samerzughul Oct 14, 2026
c10c18e
Processing performance: finding 6 validated against the parse setting…
samerzughul Oct 14, 2026
6dd8667
Processing performance: finding 6 decided and planned
samerzughul Oct 14, 2026
d3cff00
Payload parsing: golden corpus of what every consumer makes of a payload
samerzughul Oct 14, 2026
88f37e1
Payload parsing: count parses per exchange, with the baseline per path
samerzughul Oct 14, 2026
93b835c
Mappers: keep compiled Scriban templates and mapping rules by their text
samerzughul Oct 14, 2026
f10e580
Scriban helper: fill a template from the parse that saw the payload i…
samerzughul Oct 14, 2026
d395337
Payload parsing: one cached tree per parse profile, handed from step …
samerzughul Oct 14, 2026
6b346a2
Admin UI: apply the 14 October UX review
samerzughul Oct 14, 2026
790f79d
testing updates
samerzughul Oct 15, 2026
29d6e42
Retry budgets can hold what they can't retry: whenExhausted Hold
samerzughul Oct 15, 2026
935a35a
Leader election: don't try a lease another live node holds
samerzughul Oct 15, 2026
e0028df
Log a warning for every failed exchange, with why it won't be retried
samerzughul Oct 15, 2026
e0c04c6
Load harness README: reference figures instead of the review's phases
samerzughul Oct 15, 2026
9e3a5a1
Remove the processing performance review from the repository
samerzughul Oct 15, 2026
c0f4fc4
Load harness README: say what it measures
samerzughul Oct 15, 2026
72ae534
Sync result wait: never hand Task.Delay a negative wait
samerzughul Oct 15, 2026
a2c4518
ci(dev): bitween-dev resources from measured usage (310m / 1024Mi / 2…
MusaMisto Oct 15, 2026
334d321
Merge pull request #381 from simplify9/chore/dev-resources-measured
MusaMisto Oct 15, 2026
59767a4
Load harness README: reference figures for 100 KB orders with each ma…
samerzughul Oct 15, 2026
1f41bde
Merge branch 'releases/r10.0-develop' of github.com:simplify9/Bitween…
samerzughul Oct 15, 2026
3b4f259
Held retries: released by the retry job once the budget is free, and …
samerzughul Oct 15, 2026
79ab422
Circuit breaker: a circuit per HTTP endpoint (Bitween__CircuitBreaker…
samerzughul Oct 15, 2026
59c40fd
A delivered exchange whose output or response file could not be store…
samerzughul Oct 15, 2026
8a990bc
Comments describe the behaviour, not the review that led to it
samerzughul Oct 15, 2026
7d40722
fixes
samerzughul Oct 15, 2026
8ba8494
Gateway page: show the saved sync failure answer and keep it on save
hamzahalq Oct 15, 2026
e2ee7e0
Member invites, password reset and account notices by email
hamzahalq Oct 15, 2026
5269077
Account emails: review fixes for link races, reset timing and error s…
hamzahalq Oct 15, 2026
1a8ea3b
Emails: branded layout with the Bitween logo and the instance's brand…
hamzahalq Oct 15, 2026
b140905
Merge pull request #382 from simplify9/hamza/fix/develop-gate-fixes
hamzahalq Oct 15, 2026
2c4e514
ci(dev): pass SettingsEncryptionKey to app-dev
hamzahalq Oct 15, 2026
9ad5d70
Merge pull request #383 from simplify9/hamza/chore/dev-settings-encry…
AhmadRAbuhussein Oct 15, 2026
bebff8d
Migrations: drop the promoted values index only if it exists
hamzahalq Oct 18, 2026
d381a55
Bump SW-Serverless to 10.2.4 to log adapter startup failures
hamzahalq Oct 18, 2026
f4aed74
fix: startup migrations get 30 minutes and survive a failed index build
hamzahalq Oct 18, 2026
ea9b6a1
docs: what to set for each install and upgrade
hamzahalq Oct 18, 2026
5c9b884
docs: full names for the Queue health settings
hamzahalq Oct 18, 2026
c7543af
Merge pull request #384 from simplify9/hamza/fix/migration-timeout
hamzahalq Oct 18, 2026
de2a6f4
feat: list every startup problem in one log entry
hamzahalq Oct 19, 2026
c099deb
feat: refuse to start when the encryption key can't read stored crede…
hamzahalq Oct 19, 2026
5da9ba9
feat: refuse to start when the bus environment name changes
hamzahalq Oct 19, 2026
726a7a0
feat: read queues left by versions before work groups without a setting
hamzahalq Oct 19, 2026
a0b2b56
feat: warn when a stored setting overrides configuration
hamzahalq Oct 19, 2026
8da76ab
feat: check storage can be written and read back at startup
hamzahalq Oct 19, 2026
6ce6f00
docs: upgrading no longer needs downtime
hamzahalq Oct 19, 2026
5799705
fix: refuse to start when RabbitMQ can't tell the old environment name
hamzahalq Oct 19, 2026
8f26ec0
fix: check every stored credential at startup, not the newest 100
hamzahalq Oct 19, 2026
3b78c74
chore: reword a placeholder address and a docs sentence
hamzahalq Oct 19, 2026
539dc68
Merge pull request #386 from simplify9/hamza/fix/self-safe-deploy
hamzahalq Oct 19, 2026
5e634f0
fix: pass a payload that is not JSON to a custom mapper unchanged
hamzahalq Oct 20, 2026
9335470
Merge pull request #387 from simplify9/hamza/fix/legacy-mapper-non-js…
hamzahalq Oct 20, 2026
ed81850
feat: retry a selection past 500 in rounds instead of refusing it
hamzahalq Oct 20, 2026
64f4dc5
perf: track bulk retry targets in a set
hamzahalq Oct 20, 2026
e900de8
fix: a bulk retry finishing after its dialog closed leaves a newer on…
hamzahalq Oct 20, 2026
0d439e6
Merge pull request #388 from simplify9/hamza/feat/bulk-retry-in-rounds
hamzahalq Oct 20, 2026
20be359
fix: show which subscriptions use a global value set
hamzahalq Oct 21, 2026
eaef3cf
fix: resolve references in any case in the adapter field hints
hamzahalq Oct 21, 2026
5be9c53
feat: turn exchange filters round, pick several values and several pr…
hamzahalq Oct 21, 2026
7516475
fix: ignore empty property text and unknown filter names in links
hamzahalq Oct 21, 2026
d707071
Merge pull request #389 from simplify9/hamza/feat/references-and-exch…
hamzahalq Oct 21, 2026
11bd299
feat: let the config engine sign in as a member and carry on past fai…
hamzahalq Oct 22, 2026
76021df
feat: let a mirror's copy recreate prod's legacy response links
hamzahalq Oct 22, 2026
e5f5296
feat: prod mirror, a staging that copies prod's setup with every valu…
hamzahalq Oct 22, 2026
d027dda
feat: prod mirror takes samples of prod's exchanges, faked in their o…
hamzahalq Oct 22, 2026
04f3d0e
feat: prod mirror answers the calls staging shouldn't make
hamzahalq Oct 22, 2026
ebd3307
feat: prod mirror rehearses prod's arrivals through their own entry p…
hamzahalq Oct 25, 2026
538d1eb
feat: bring prod's items onto a mirror from the list pages
hamzahalq Oct 25, 2026
d44077c
feat: test a subscription against prod from its page
hamzahalq Oct 25, 2026
c1254ca
feat: say on the lists how each item's test against prod went
hamzahalq Oct 25, 2026
987b330
Generate mapping rules with AI
hamzahalq Oct 25, 2026
3ea431b
AI mapping: input limits, address guard, safer parsing
hamzahalq Oct 26, 2026
61537fb
Docs: AI mapping limits and address rules
hamzahalq Oct 26, 2026
c897e11
Merge pull request #390 from simplify9/hamza/feat/ai-mapping
hamzahalq Oct 26, 2026
87dfb75
refactor: drop the prod mirror's whole-prod endpoints
hamzahalq Oct 26, 2026
cba9d09
refactor: delete the prod mirror's call catcher
hamzahalq Oct 26, 2026
af919cc
feat: bring prod's items without its addresses and secrets, as to-dos
hamzahalq Oct 26, 2026
7645c98
feat: run a mirror test only once it is filled in, and ask about cust…
hamzahalq Oct 26, 2026
d4d3be3
fix: placeholders for addresses Bitween requires; docs for the new flow
hamzahalq Oct 26, 2026
23926a0
feat: shorter bring preview and to-do list, one row per item
hamzahalq Oct 26, 2026
6c7e6a9
Merge releases/r10.0-develop into hamza/feat/prod-mirror
hamzahalq Oct 26, 2026
1fac708
fix: prod mirror review findings
hamzahalq Oct 27, 2026
1284148
Merge pull request #392 from simplify9/hamza/feat/prod-mirror
hamzahalq Oct 27, 2026
52a7325
fix: open the prod picker without starting every adapter
hamzahalq Oct 27, 2026
1e18449
feat: explain failed exchanges with AI, documents masked
hamzahalq Oct 27, 2026
e84091d
fix: bring a subscription whose adapter needs a secret
hamzahalq Oct 27, 2026
6ec34a2
fix: never bring prod's user names to staging
hamzahalq Oct 27, 2026
83f8290
fix: install adapters before placeholders, and keep placeholder updat…
hamzahalq Oct 27, 2026
4adc8a0
Merge pull request #393 from simplify9/hamza/fix/mirror-picker-speed
hamzahalq Oct 27, 2026
6c984bc
feat: ask your exchanges in plain English
hamzahalq Oct 27, 2026
8b18d84
Merge remote-tracking branch 'origin/releases/r10.0-develop' into ham…
hamzahalq Oct 27, 2026
7fb42d4
fix: failure explanation review findings
hamzahalq Oct 28, 2026
ba09f08
fix: record a question before sending it
hamzahalq Oct 28, 2026
b473fda
Merge remote-tracking branch 'origin/hamza/feat/ai-failure-explanatio…
hamzahalq Oct 28, 2026
728c336
fix: read prod once for the picker, bring and tests
hamzahalq Oct 28, 2026
2552336
fix: a paused scheduled job doesn't run on its schedule on a mirror
hamzahalq Oct 28, 2026
77ffb3b
fix: never copy a value that reads as a credential
hamzahalq Oct 28, 2026
325e20c
feat: show what a bring copies as-is from prod
hamzahalq Oct 28, 2026
dddaf6f
fix: prod mirror review findings
hamzahalq Oct 28, 2026
ad5b38c
Merge pull request #396 from simplify9/hamza/fix/mirror-prod-reads
hamzahalq Oct 28, 2026
d4b8c6f
Merge pull request #394 from simplify9/hamza/feat/ai-failure-explanat…
hamzahalq Oct 28, 2026
4e5b058
Merge releases/r10.0-develop into hamza/feat/ai-ask-exchanges
hamzahalq Oct 28, 2026
a3cb3b1
fix: ask exchanges review findings
hamzahalq Oct 28, 2026
7c3182b
Merge pull request #395 from simplify9/hamza/feat/ai-ask-exchanges
hamzahalq Oct 28, 2026
9c41d58
feat: suggest retry policies with AI
hamzahalq Oct 28, 2026
f88c177
Merge releases/r10.0-develop into hamza/feat/ai-retry-suggestions
hamzahalq Oct 28, 2026
3de7721
fix: read adapter kinds side by side when listing
hamzahalq Oct 28, 2026
1c91b72
fix: describe each adapter once a build
hamzahalq Oct 28, 2026
0fccde5
fix: retry suggestion review findings
hamzahalq Oct 29, 2026
024cc21
Merge pull request #398 from simplify9/hamza/fix/adapter-list-speed
hamzahalq Oct 29, 2026
570157b
Merge pull request #397 from simplify9/hamza/feat/ai-retry-suggestions
hamzahalq Oct 29, 2026
5eb33be
Merge releases/r10.0 into develop for the release
hamzahalq Oct 29, 2026
ef53f4b
ci: give production its settings encryption key
hamzahalq Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
**/*.jfm
**/azds.yaml
**/bin
**/charts
charts
**/docker-compose*
**/Dockerfile*
**/node_modules
Expand Down
31 changes: 20 additions & 11 deletions .github/workflows/bitween-api-cicd-gateway.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,11 @@ jobs:
nameOverride=bitween
global.environment=Development
replicaCount=2
resources.requests.cpu=25m
resources.requests.memory=704Mi
resources.limits.memory=1408Mi
resources.requests.cpu=310m
resources.requests.memory=1024Mi
resources.limits.memory=2048Mi
environmentVariables.Bitween__BusProvidersEnabled=true
environmentVariables.Bitween__CircuitBreakerPerEndpoint=true
environmentVariables.AWS_REQUEST_CHECKSUM_CALCULATION=when_required
environmentVariables.AWS_RESPONSE_CHECKSUM_VALIDATION=when_required
secrets:
Expand All @@ -137,7 +138,13 @@ jobs:
# holding it can mint a token for any identity, so the app refuses to start on it.
# Set the TokenKey secret to a long random string unique to this environment
# (openssl rand -base64 48). Changing it signs out everyone holding an older token.
helm-set-secret-values: 'global.token.key=${{ secrets.TokenKey }},db=${{ secrets.dbConnection }},global.bus.rabbitUrl=${{ secrets.rabbitUrl }},global.cloudFiles.secretAccessKey=${{ secrets.SecretAccessKey }},global.cloudFiles.accessKeyId=${{ secrets.AccessKeyId }},global.cloudFiles.serviceUrl=${{ secrets.ServiceUrl }},global.cloudFiles.bucketName=${{ secrets.BucketName }},environmentVariables.Bitween__RabbitMqManagementUrl=${{ secrets.RabbitMqManagementUrl }},environmentVariables.Bitween__RabbitMqManagementPassword=${{ secrets.RabbitMqManagementPassword }},environmentVariables.Bitween__RabbitMqManagementUsername=${{ secrets.RabbitMqManagementUsername }}'
#
# Bitween__SettingsEncryptionKey encrypts stored credentials (partner, adapter and connection
# secrets, the mail server password). Without it they are stored in plain text and secret
# settings can't be saved in the UI. Set the SettingsEncryptionKey secret once
# (openssl rand -base64 32) and never change or lose it: what it encrypted can't be read
# without it.
helm-set-secret-values: 'global.token.key=${{ secrets.TokenKey }},db=${{ secrets.dbConnection }},global.bus.rabbitUrl=${{ secrets.rabbitUrl }},global.cloudFiles.secretAccessKey=${{ secrets.SecretAccessKey }},global.cloudFiles.accessKeyId=${{ secrets.AccessKeyId }},global.cloudFiles.serviceUrl=${{ secrets.ServiceUrl }},global.cloudFiles.bucketName=${{ secrets.BucketName }},environmentVariables.Bitween__RabbitMqManagementUrl=${{ secrets.RabbitMqManagementUrl }},environmentVariables.Bitween__RabbitMqManagementPassword=${{ secrets.RabbitMqManagementPassword }},environmentVariables.Bitween__RabbitMqManagementUsername=${{ secrets.RabbitMqManagementUsername }},secrets.Bitween__SettingsEncryptionKey=${{ secrets.SettingsEncryptionKey }}'

Prod:
# Release: build and publish for clients, deploy production. releases/r10.0 is the
Expand Down Expand Up @@ -223,31 +230,33 @@ jobs:

# Production's own configuration, the same settings as the develop job's above. PROD_TOKENKEY
# is its own random string (openssl rand -base64 48), never the develop key.
helm-set-secret-values: 'global.token.key=${{ secrets.PROD_TOKENKEY }},db=${{ secrets.PROD_DBCONNECTION }},global.bus.rabbitUrl=${{ secrets.PROD_RABBITURL }},global.cloudFiles.secretAccessKey=${{ secrets.PROD_SECRETACCESSKEY }},global.cloudFiles.accessKeyId=${{ secrets.PROD_ACCESSKEYID }},global.cloudFiles.serviceUrl=${{ secrets.PROD_SERVICEURL }},global.cloudFiles.bucketName=${{ secrets.PROD_BUCKETNAME }},environmentVariables.Bitween__RabbitMqManagementUrl=${{ secrets.PROD_RABBITMQMANAGEMENTURL }},environmentVariables.Bitween__RabbitMqManagementPassword=${{ secrets.PROD_RABBITMQMANAGEMENTPASSWORD }},environmentVariables.Bitween__RabbitMqManagementUsername=${{ secrets.PROD_RABBITMQMANAGEMENTUSERNAME }}'
# PROD_SETTINGSENCRYPTIONKEY is production's own too (openssl rand -base64 32), and like develop's
# it must never change or be lost.
helm-set-secret-values: 'global.token.key=${{ secrets.PROD_TOKENKEY }},db=${{ secrets.PROD_DBCONNECTION }},global.bus.rabbitUrl=${{ secrets.PROD_RABBITURL }},global.cloudFiles.secretAccessKey=${{ secrets.PROD_SECRETACCESSKEY }},global.cloudFiles.accessKeyId=${{ secrets.PROD_ACCESSKEYID }},global.cloudFiles.serviceUrl=${{ secrets.PROD_SERVICEURL }},global.cloudFiles.bucketName=${{ secrets.PROD_BUCKETNAME }},environmentVariables.Bitween__RabbitMqManagementUrl=${{ secrets.PROD_RABBITMQMANAGEMENTURL }},environmentVariables.Bitween__RabbitMqManagementPassword=${{ secrets.PROD_RABBITMQMANAGEMENTPASSWORD }},environmentVariables.Bitween__RabbitMqManagementUsername=${{ secrets.PROD_RABBITMQMANAGEMENTUSERNAME }},secrets.Bitween__SettingsEncryptionKey=${{ secrets.PROD_SETTINGSENCRYPTIONKEY }}'

# The bitween CLI and the SDKs carry the version the run above computed, so nothing is tagged by
# hand. A develop build releases the CLI as a pre-release, cli-v<x.y.z>-dev.<run>; the release
# from releases/r10.0 releases it as the latest, cli-v<x.y.z>, and publishes the SDKs. Each runs
# only when the job it needs ran, so the branch is decided above.
cli-develop:
needs: build-publish-deploy
needs: Dev
uses: ./.github/workflows/cli-release.yml
with:
version: ${{ needs.build-publish-deploy.outputs.version }}
version: ${{ needs.Dev.outputs.version }}
prerelease: true
run-number: ${{ github.run_number }}

cli-release:
needs: publish-release
needs: Prod
uses: ./.github/workflows/cli-release.yml
with:
version: ${{ needs.publish-release.outputs.version }}
version: ${{ needs.Prod.outputs.version }}

sdk-release:
needs: publish-release
needs: Prod
permissions:
contents: read
uses: ./.github/workflows/sdk-release.yml
with:
version: ${{ needs.publish-release.outputs.version }}
version: ${{ needs.Prod.outputs.version }}
secrets: inherit
143 changes: 143 additions & 0 deletions .github/workflows/cli-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
name: bitween CLI release

# Publishes the bitween command as self-contained binaries on a GitHub release: nothing needs .NET
# installed to run them. Never run by hand or by a tag: the CI run that publishes this repository
# calls it with the version it computed (determine-semver: the next patch from the git tags), so the
# CLI carries the version of the release it ships with. The computed version is the bare x.y.z on
# develop too, so a develop build says so with prerelease and passes its run number.
# a release, 10.0.61 cli-v10.0.61 the latest release
# a prerelease, 10.0.61 with prerelease and run 121 cli-v10.0.61-dev.121 a pre-release, to try out
# Called by bitween-api-cicd-gateway.yml: after the release from releases/r10.0, and after each develop build.
on:
workflow_call:
inputs:
version:
description: "The version the calling run computed"
type: string
required: true
prerelease:
description: "Release as a pre-release, named after the run"
type: boolean
default: false
run-number:
description: "The calling run's number, for a pre-release"
type: string
default: ""

permissions:
contents: write

jobs:
channel:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.channel.outputs.version }}
prerelease: ${{ steps.channel.outputs.prerelease }}
steps:
- name: Channel
id: channel
env:
VERSION: ${{ inputs.version }}
PRERELEASE: ${{ inputs.prerelease }}
RUN_NUMBER: ${{ inputs.run-number }}
run: |
v="$VERSION"
if [ "$PRERELEASE" = "true" ]; then
# A pre-release names its run: 10.0.61 from run 121 is 10.0.61-dev.121.
v="${v%%-*}-dev.${RUN_NUMBER:-${GITHUB_RUN_NUMBER}}"
echo "prerelease=true" >> "$GITHUB_OUTPUT"
elif [[ "$v" == *-* ]]; then
# A version that already carries its branch and run: 10.0.61-releases-r10-0-develop.121 is 10.0.61-dev.121.
v="${v%%-*}-dev.${v##*.}"
echo "prerelease=true" >> "$GITHUB_OUTPUT"
else
echo "prerelease=false" >> "$GITHUB_OUTPUT"
fi
echo "version=$v" >> "$GITHUB_OUTPUT"

build:
needs: channel
runs-on: ubuntu-latest
strategy:
matrix:
rid: [linux-x64, linux-arm64, linux-musl-x64, linux-musl-arm64, osx-x64, osx-arm64, win-x64]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: "10.0.x"
- name: Publish
run: >
dotnet publish SW.Bitween.Cli -c Release -r ${{ matrix.rid }} --self-contained
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:DebugType=none
-p:Version=${{ needs.channel.outputs.version }} -o out
- name: Package
run: |
mkdir -p dist
cp docs/cli.md out/README.md 2>/dev/null || true
if [[ "${{ matrix.rid }}" == win-* ]]; then
(cd out && zip -q -r ../dist/bitween-${{ matrix.rid }}.zip .)
else
tar -czf dist/bitween-${{ matrix.rid }}.tar.gz -C out .
fi
- uses: actions/upload-artifact@v4
with:
name: bitween-${{ matrix.rid }}
path: dist/*

# The data source providers (RabbitMQ, SQS and the database engines) as adapter packages, with the
# release's version: installed like any adapter, with bitween adapter publish or apply's adapters
# section. Nothing else publishes them, and a Bitween runs no data source without them.
providers:
needs: channel
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: "10.0.x"
- name: Build
env:
VERSION: ${{ needs.channel.outputs.version }}
run: |
dotnet build SW.Bitween.Cli -c Release -o cli
mkdir -p dist
for project in SW.Bitween.Adapters.Bus.RabbitMq SW.Bitween.Adapters.Bus.Sqs SW.Bitween.Adapters.Db.PostgreSql \
SW.Bitween.Adapters.Db.MySql SW.Bitween.Adapters.Db.SqlServer SW.Bitween.Adapters.Db.Oracle; do
jq --arg v "$VERSION" '.version = $v' "$project/adapter.json" > adapter.json.tmp && mv adapter.json.tmp "$project/adapter.json"
dotnet cli/bitween.dll adapter build "$project" -o dist
done
ls -la dist
- uses: actions/upload-artifact@v4
with:
name: bitween-providers
path: dist/*.zip

release:
needs: [channel, build, providers]
runs-on: ubuntu-latest
steps:
# Only the CLI builds' own artifacts. Without a pattern this fetched every artifact in the run,
# including the build record docker/build-push-action uploads in the deploy job, which can't be
# extracted and failed the release (and would have landed in SHA256SUMS if it could).
- uses: actions/download-artifact@v4
with:
pattern: bitween-*
path: dist
merge-multiple: true
- name: Checksums
run: cd dist && sha256sum * > SHA256SUMS && cat SHA256SUMS
- name: Release
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
v="${{ needs.channel.outputs.version }}"
install="curl -fsSL https://raw.githubusercontent.com/${{ github.repository }}/releases/r10.0/scripts/install-cli.sh"
if [ "${{ needs.channel.outputs.prerelease }}" = "true" ]; then
gh release create "cli-v$v" dist/* --title "bitween CLI $v (pre-release)" --target "${{ github.sha }}" --prerelease \
--notes "A pre-release of the bitween command, built from ${{ github.ref_name }}, to try out. Install: $install | BITWEEN_CLI_VERSION=$v sh - or download the archive for your platform and check it against SHA256SUMS."
else
gh release create "cli-v$v" dist/* --title "bitween CLI $v" --target "${{ github.sha }}" --latest \
--notes "The bitween command, self-contained for each platform. Install: $install | sh - or download the archive for your platform and check it against SHA256SUMS."
fi
8 changes: 4 additions & 4 deletions .github/workflows/critical-vuln-check.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
# =============================================================================
# Critical Dependabot Vulnerability Check — Caller template
# Critical Dependabot Vulnerability Check - Caller template
# =============================================================================
# USAGE:
# Copy this file to your repo at .github/workflows/critical-vuln-check.yml.
# No REPLACE values needed — this template requires no customization.
# No REPLACE values needed - this template requires no customization.
#
# WHAT IT DOES:
# Runs on every PR targeting main or develop. Fails if the repository has
# any open CRITICAL-severity Dependabot alert.
#
# Enforcement differs by target branch via each repo's OWN branch
# protection settings (not by anything in this file):
# - On `main`: mark this check REQUIRED in branch protection — merge
# - On `main`: mark this check REQUIRED in branch protection - merge
# is physically blocked while a critical alert is open.
# - On `develop`: leave this check NOT required — it still shows as a
# - On `develop`: leave this check NOT required - it still shows as a
# failing/red check (a visible warning) without blocking
# the merge.
# =============================================================================
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/dependabot-auto-merge.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# =============================================================================
# Dependabot Auto-Merge — Caller template
# Dependabot Auto-Merge - Caller template
# =============================================================================
# USAGE:
# Copy this file to your repo at .github/workflows/dependabot-auto-merge.yml.
Expand All @@ -10,13 +10,13 @@
# - The PR author is dependabot[bot]
# - The update is a semver PATCH bump (never minor/major)
# - The ecosystem is npm, nuget, pub, bundler, or github-actions
# (NEVER docker — base image bumps always need manual review)
# (NEVER docker - base image bumps always need manual review)
# - This repo currently has no open critical Dependabot alert (re-checked
# here explicitly — see workflow-templates/critical-vuln-check.yml's
# here explicitly - see workflow-templates/critical-vuln-check.yml's
# header for why this can't just `needs:` that file's job)
# "Auto-merge" here means GitHub's native auto-merge feature: it still
# waits for the repo's actual required status checks (build/test) to pass
# before merging — this workflow does not bypass those.
# before merging - this workflow does not bypass those.
# =============================================================================
name: Dependabot Auto-Merge

Expand Down Expand Up @@ -64,5 +64,5 @@ jobs:
PR_URL: ${{ github.event.pull_request.html_url }}
run: |
set -euo pipefail
echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} — patch-level ${{ steps.metadata.outputs.package-ecosystem }} bump, vuln gate passed"
echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} - patch-level ${{ steps.metadata.outputs.package-ecosystem }} bump, vuln gate passed"
gh pr merge --auto --squash "$PR_URL"
50 changes: 50 additions & 0 deletions .github/workflows/dotnet-pr-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Builds the solution and runs the .NET unit tests on every pull request into a release branch.
#
# The deploy pipeline runs the .NET tests only after a merge, so a change that broke them was
# found once it had already landed on a release branch. Bitween runs at customer sites that
# upgrade in place, so this check runs before the merge instead. The unit tests need no
# database or broker and take seconds. The integration tests (Testcontainers) still run in the
# deploy pipeline.
name: .NET checks

on:
pull_request:
branches: [releases/**]
paths-ignore:
# Covered by frontend-tests.yml; the .NET build does not compile the SPA.
- 'SW.Bitween.Web/ClientApp/**'
- 'docs/**'
- '**/*.md'

permissions:
contents: read

concurrency:
group: dotnet-pr-checks-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
build-and-unit-test:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
# Pinned to commits, since a tag can be moved.
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
persist-credentials: false
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
with:
dotnet-version: '10.0.x'
- run: dotnet restore SW.Bitween.sln
# SkipClientBuild keeps MSBuild from building the SPA should any target pull in publish.
- run: dotnet build SW.Bitween.sln --no-restore --configuration Release -p:SkipClientBuild=true
- run: >
dotnet test SW.Bitween.UnitTests/SW.Bitween.UnitTests.csproj
--no-build --configuration Release
--logger "trx;LogFileName=unit-tests.trx"
--results-directory TestResults
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: failure()
with:
name: unit-test-results
path: TestResults
4 changes: 2 additions & 2 deletions .github/workflows/frontend-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#
# The deploy pipeline only runs the .NET test projects, and only after a merge, so until
# this existed nothing ever ran the frontend tests outside someone's machine. These need
# no backend or database — the component tests render pages against a mock network — so
# no backend or database - the component tests render pages against a mock network - so
# they take seconds. The Playwright e2e suite is not run here: it needs a running backend
# with seeded data.
name: Frontend tests
Expand Down Expand Up @@ -40,7 +40,7 @@ jobs:
cache: yarn
cache-dependency-path: SW.Bitween.Web/ClientApp/yarn.lock
- run: yarn install --frozen-lockfile
# The same type-check the Docker build runs, which covers the tests too — so a test file
# The same type-check the Docker build runs, which covers the tests too - so a test file
# that breaks it fails here rather than in the deploy after the merge.
- run: npx tsc -b
- run: yarn test
Loading
Loading