Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
842 commits
Select commit Hold shift + click to select a range
b156a44
feat(cli): add check command with threshold exit-code and json output
Power70 Jun 29, 2026
85f634a
feat(action): add testable action runner mapping check result to …
Power70 Jun 29, 2026
0953c4e
l feat(ci): add PR workflow using sorokeep TTL check action
Power70 Jun 29, 2026
9c13d12
chore: register check command in CLI entry point
Power70 Jun 29, 2026
2445cd8
feat(action): add bash entrypoint to build, run check, and set GH out…
Power70 Jun 29, 2026
123e3a4
action.test.ts test(action): add action runner tests covering exit…
Power70 Jun 29, 2026
ca473cc
test(core): add unit tests for checkContractTTL pass/fail and err…
Power70 Jun 29, 2026
8d5f7c5
newest
Olagoke22 Jun 29, 2026
18e5cf5
newest
Olagoke22 Jun 29, 2026
b6670d3
feat(core): implement auto-extension rate limiter and parse resource …
Bokky73 Jun 29, 2026
a4c865a
feat(db): add budget_tracking table to SQLite
Stephan-Thomas Jun 29, 2026
6c04823
feat(core): enforce budget limits before auto-extension
Stephan-Thomas Jun 29, 2026
4efe0b3
Merge branch 'main' into feat/budget-tracking
jacintaaugustine Jun 29, 2026
72d88ab
Merge branch 'main' into feat-poll-interval-overrides
Stephan-Thomas Jun 29, 2026
85074eb
Merge branch 'main' into commands
farouqyakubu6-creator Jun 30, 2026
fc3d916
Merge branch 'main' into limiting
farouqyakubu6-creator Jun 30, 2026
af0c188
Merge branch 'main' into resolve-alert
farouqyakubu6-creator Jun 30, 2026
3913b02
fix: address CodeRabbit review for PR 216
AbdulmalikAlayande Jun 30, 2026
84e5b6d
chore: fix schema.sql encoding
AbdulmalikAlayande Jun 30, 2026
67d0e57
chore: fix schema.sql encoding
AbdulmalikAlayande Jun 30, 2026
0a77b16
Merge main into pr-246
AbdulmalikAlayande Jun 30, 2026
5ba92cb
update
lightnoor890 Jun 30, 2026
8435912
docs: write complete CLI reference manual
lightnoor890 Jun 30, 2026
c037e93
feat(cli): add --dry-run flag to guard command
lightnoor890 Jun 30, 2026
1d9226b
fix: resolve schema corruption and linting bypasses
AbdulmalikAlayande Jun 30, 2026
de2e29b
feat(db): add resource_usage_logs table with repository functions (#246)
funds0033-cmyk Jun 30, 2026
593ba76
feat(db): add resource_usage_logs table with repository functions (#246)
funds0033-cmyk Jun 30, 2026
786d748
Merge branch 'main' into feat/budget-tracking
jacintaaugustine Jun 30, 2026
fec2112
test(cli): add tests for alerts test command (#281)
Tijesunimi004 Jun 30, 2026
c6f8f3c
test(cli): add tests for alerts test command (#281)
Tijesunimi004 Jun 30, 2026
dccb85d
feat(alerts): implement webhook delivery channel (#110) (#289)
daveades Jun 30, 2026
aba812e
feat(alerts): implement webhook delivery channel (#110) (#289)
daveades Jun 30, 2026
e404b50
feat(core): implement ExtendFootprintTTLOp with simulation and fee pa…
daveades Jun 30, 2026
e1c0abe
feat(core): implement ExtendFootprintTTLOp with simulation and fee pa…
daveades Jun 30, 2026
48be30e
feat(cli): implement restore command with fee output (#119) (#287)
daveades Jun 30, 2026
b041ec0
feat(cli): implement restore command with fee output (#119) (#287)
daveades Jun 30, 2026
260f3d2
feat(cli): add database maintenance commands (#294)
OkonkwoEmeka Jun 30, 2026
a26cbbd
feat(cli): add database maintenance commands (#294)
OkonkwoEmeka Jun 30, 2026
6ba24cf
Merge branch 'main' into feat-poll-interval-overrides
Stephan-Thomas Jun 30, 2026
2dd5dc8
fix: restore schema.sql and add poll_interval_seconds
Stephan-Thomas Jun 30, 2026
cecf938
fix(core): add missing assertSimulationSuccess and fix tests
AbdulmalikAlayande Jun 30, 2026
e626b6e
Update e2e-sandbox.md (#306)
judithJn Jun 30, 2026
41ddde6
Update e2e-sandbox.md (#306)
judithJn Jun 30, 2026
3240c4e
Merge branch 'main' into fix/issue-137-simulation-failures
neyij Jun 30, 2026
973d7c8
fix(test): resolve simulation failures
Stephan-Thomas Jun 30, 2026
9ff1fdb
fix(rpc): catch simulation error in simulateExtension
Stephan-Thomas Jun 30, 2026
12ffb9b
fix(rpc): remove unused CostSummary import from client.ts
Stephan-Thomas Jun 30, 2026
077a3ef
fix(core): resolve TS compilation errors and ESLint interface errors
AbdulmalikAlayande Jun 30, 2026
5edd582
feat(core): build ledger entry key decoder (#256)
probablyABug Jun 30, 2026
16192a4
feat(core): build ledger entry key decoder (#256)
probablyABug Jun 30, 2026
2fde0e7
spec: draft get_monitored_keys() contract convention (#255)
Stephan-Thomas Jun 30, 2026
f8d406a
spec: draft get_monitored_keys() contract convention (#255)
Stephan-Thomas Jun 30, 2026
823bee6
fix: correct fee bump and sponsor secret resolution
AbdulmalikAlayande Jun 30, 2026
fe55c53
fix: address CodeRabbit review for rate limiter
AbdulmalikAlayande Jun 30, 2026
806f0d5
fix: address CodeRabbit review for rate limiter
AbdulmalikAlayande Jun 30, 2026
910574e
feat(cli): add inspect command for decoded entry values (#299)
Faizehy Jun 30, 2026
8acedb1
feat(cli): add inspect command for decoded entry values (#299)
Faizehy Jun 30, 2026
e86ad8d
fix: address CodeRabbit rate limiter and resource estimate feedback
AbdulmalikAlayande Jun 30, 2026
5d6af4e
feat: add guard command tests for --auto-extend policy registration (…
JClark011 Jun 30, 2026
4a56ea3
feat: add guard command tests for --auto-extend policy registration (…
JClark011 Jun 30, 2026
1d882d7
fix(core): atomic budget enforcement, fee calculation, and test updates
AbdulmalikAlayande Jun 30, 2026
90e8acd
fix(action): pin checkout, fix stderr propagation, fail closed on mis…
AbdulmalikAlayande Jun 30, 2026
19e2eac
docs: write complete CLI reference manual (#304)
lightnoor890 Jun 30, 2026
6bbe989
docs: write complete CLI reference manual (#304)
lightnoor890 Jun 30, 2026
e8c8245
fix(cli): guard test suite issue with mock bleeding
AbdulmalikAlayande Jun 30, 2026
e9613b6
fix: preserve error cause in schemaFormatter
The-Big-Danny Jul 1, 2026
d0aa8c5
fix(alerts): resolve dispatcher import path
dee-john Jul 1, 2026
5cbc2f0
Fix linting errors
Truphile Jul 1, 2026
f49b539
Merge branch 'main' into limiting
farouqyakubu6-creator Jul 1, 2026
445c18f
feat(core): enforce budget limits before auto-extension
Stephan-Thomas Jun 29, 2026
abb29cd
feat: implement budget persistence schema and repository core modules
The-Big-Danny Jul 1, 2026
474399c
fix(db): correctly export budget functions from repositories
The-Big-Danny Jul 2, 2026
1ce0d04
restore test file
The-Big-Danny Jul 2, 2026
575424f
feat(budget): implement budget persistence and enforcement
The-Big-Danny Jul 2, 2026
08b15fa
fix(tests): remove hardcoded Vault secret literals from vault.test.ts
farouqyakubu6-creator Jul 3, 2026
8dbd0e8
fix(test): remove secrets from tests
The-Big-Danny Jul 2, 2026
997657d
Merge branch 'main' into feat/key-resolution-chain
jacintaaugustine Jul 4, 2026
42b4b9a
Fix tests for rate limiter and budget extensions
AbdulmalikAlayande Jul 4, 2026
60ee4a0
Merge branch 'feat/133-142-rate-limiter'
AbdulmalikAlayande Jul 4, 2026
05265b7
Add script to process PRs sequentially
AbdulmalikAlayande Jul 4, 2026
e8dc112
Merge main into pr-210, resolving conflicts
AbdulmalikAlayande Jul 4, 2026
c6fb1b6
Merge PR #216 with manual conflict resolution for fee bump sponsorshi…
AbdulmalikAlayande Jul 4, 2026
555d4e6
chore: remove temporary diff files
AbdulmalikAlayande Jul 4, 2026
755700a
Merge branch 'main' into pr-246
AbdulmalikAlayande Jul 4, 2026
7167dd3
Merge branch 'main' into pr-247
AbdulmalikAlayande Jul 4, 2026
f07c5af
Merge branch 'main' into pr-248
AbdulmalikAlayande Jul 4, 2026
0bc7845
fix: add missing alertConfigId to resolveAlerts test calls
AbdulmalikAlayande Jul 4, 2026
7fc1263
Merge main into pr-249 and resolve conflicts
AbdulmalikAlayande Jul 4, 2026
b0a8a4e
Merge main into pr-251 and resolve conflicts
AbdulmalikAlayande Jul 4, 2026
13d3a62
Merge main into pr-252 and resolve conflicts
AbdulmalikAlayande Jul 4, 2026
f379e14
Resolve conflicts for pr-253
AbdulmalikAlayande Jul 4, 2026
76d277a
Resolve conflicts in pr-254
AbdulmalikAlayande Jul 4, 2026
48c08c1
Merge branch 'main' into pr-255
AbdulmalikAlayande Jul 4, 2026
f684ae0
Merge branch 'main' into pr-256
AbdulmalikAlayande Jul 4, 2026
e752584
Fix decoder tests
AbdulmalikAlayande Jul 4, 2026
dbedc6f
Resolve merge conflicts
AbdulmalikAlayande Jul 4, 2026
296c264
Resolve merge conflicts
AbdulmalikAlayande Jul 4, 2026
bba6886
Merge branch 'main' into pr-262
AbdulmalikAlayande Jul 4, 2026
e28af5c
Merge branch 'main' into pr-263
AbdulmalikAlayande Jul 4, 2026
6cf1fbc
Fix conflicts and test errors in pr-263
AbdulmalikAlayande Jul 4, 2026
43f762b
Resolve merge conflicts in pr-264
AbdulmalikAlayande Jul 4, 2026
35dd669
Fix schema.sql encoding issue
AbdulmalikAlayande Jul 4, 2026
ff9fb4c
Resolve merge conflicts in pr-265
AbdulmalikAlayande Jul 4, 2026
8d1a05a
Merge branch 'main' into pr-271
AbdulmalikAlayande Jul 4, 2026
e366792
Fix syntax error in discovery.test.ts
AbdulmalikAlayande Jul 4, 2026
8842d53
docs: update README with current project state
AbdulmalikAlayande Jul 4, 2026
2551e78
Resolve merge conflicts in pr-274
AbdulmalikAlayande Jul 4, 2026
319a1a1
Resolve merge conflicts in pr-275
AbdulmalikAlayande Jul 4, 2026
2eb0f91
Fix committed merge conflict in decoder.test.ts
AbdulmalikAlayande Jul 4, 2026
d17c86c
Fixing bugs and merging PRs
AbdulmalikAlayande Jul 4, 2026
aff2bfb
Resolve merge conflicts in pr-276
AbdulmalikAlayande Jul 4, 2026
5075b04
Resolve merge conflicts in pr-282
AbdulmalikAlayande Jul 4, 2026
2ac9b5a
Fix tests to pass feeSponsorSecret to mock functions and remove stand…
AbdulmalikAlayande Jul 4, 2026
c865fb6
Resolve merge conflicts in pr-283
AbdulmalikAlayande Jul 4, 2026
0fafeab
Fix SQLite CHECK constraint to include discord and telegram
AbdulmalikAlayande Jul 4, 2026
e336a03
Fix eslint error in decoder.ts
AbdulmalikAlayande Jul 4, 2026
5c0f713
docs: accurately reflect current project scope, metrics, and architec…
AbdulmalikAlayande Jul 4, 2026
a5cca04
Resolve merge conflicts in pr-297
AbdulmalikAlayande Jul 4, 2026
0ae1fa8
Resolve merge conflicts in pr-298
AbdulmalikAlayande Jul 4, 2026
d8e9eb3
docs: remove personal milestone from README
AbdulmalikAlayande Jul 4, 2026
6e2f0b9
Resolve merge conflicts in pr-300
AbdulmalikAlayande Jul 4, 2026
fb7c4d4
feat(db): add budget_tracking table to SQLite
Stephan-Thomas Jun 29, 2026
519eba0
Merge branch 'main' into pr-300
AbdulmalikAlayande Jul 4, 2026
a2753ac
Fixing bugs and merging PRs
AbdulmalikAlayande Jul 4, 2026
cec4b4c
fix(db): add missing budget_tracking table and fix test sql syntax
AbdulmalikAlayande Jul 4, 2026
db1bf81
Merge branch 'main' of https://github.com/AbdulmalikAlayande/sorokeep
AbdulmalikAlayande Jul 4, 2026
e13f561
Merge branch 'main' into pr-300
AbdulmalikAlayande Jul 4, 2026
bb66d11
fix(budget): properly enforce dynamic billing cycle in tests and fix …
AbdulmalikAlayande Jul 4, 2026
f999b1c
Merge main into pr-301
AbdulmalikAlayande Jul 4, 2026
de9c315
fix(db): add missing closing brace in repositories.ts
AbdulmalikAlayande Jul 4, 2026
4c68e72
fix(db): remove duplicate budget functions from repositories.ts
AbdulmalikAlayande Jul 4, 2026
69eec94
Merge branch 'main' into commands
farouqyakubu6-creator Jul 4, 2026
cbabe26
Merge branch 'main' into feat/key-resolution-chain
jacintaaugustine Jul 4, 2026
9e90018
fix(alerts): address CodeRabbit review comments
AbdulmalikAlayande Jul 4, 2026
cb5ae84
Merge branch 'feat/simulation-traffic-cache'
AbdulmalikAlayande Jul 4, 2026
fef7989
Fix status/costs command syntax and secret-test placeholders
farouqyakubu6-creator Jul 4, 2026
75ecc42
Fix costs command regression tests
farouqyakubu6-creator Jul 4, 2026
049819e
Fix status command test fixture typo
farouqyakubu6-creator Jul 4, 2026
d1d13d3
Merge branch 'main' into pr-303
AbdulmalikAlayande Jul 4, 2026
7fe57b4
Merge branch 'main' into pr-304
AbdulmalikAlayande Jul 4, 2026
f984c1a
Merge branch 'main' into feat-poll-interval-overrides
Stephan-Thomas Jul 4, 2026
9a9f66d
fix(completion/costs): resolve explicit string type guards for compil…
The-Big-Danny Jul 5, 2026
85cece9
fix(cli): preserve original caught error reference for eslint rule
The-Big-Danny Jul 5, 2026
f57d1ab
feat: config fallback, slack webhook, unwatch, pause/resume monitoring
Jul 5, 2026
6f75142
Resolve merge conflicts in dispatcher.ts
AbdulmalikAlayande Jul 5, 2026
cc7a88c
Resolve merge conflicts in dispatcher.ts
AbdulmalikAlayande Jul 5, 2026
fd3cb17
Merge branch 'main' into pr-291
AbdulmalikAlayande Jul 5, 2026
c4d85a1
Merge main into pr-295
AbdulmalikAlayande Jul 5, 2026
c55e954
Merge main into pr-296
AbdulmalikAlayande Jul 5, 2026
e468b79
Fix tests after merge
AbdulmalikAlayande Jul 5, 2026
c3765e3
Resolve merge conflicts in src/index.ts
AbdulmalikAlayande Jul 5, 2026
d79abce
Resolve conflicts in client.test.ts
AbdulmalikAlayande Jul 5, 2026
6cda20d
Resolve conflicts in costs.test.ts
AbdulmalikAlayande Jul 5, 2026
d4865ed
Fix tests
AbdulmalikAlayande Jul 5, 2026
c3e3d08
Remove duplicate submitRestore
AbdulmalikAlayande Jul 5, 2026
17aea2c
Fix tests and duplicate methods
AbdulmalikAlayande Jul 5, 2026
90c9c6e
Merge branch 'main' into pr-261
AbdulmalikAlayande Jul 5, 2026
a80a30d
Fix duplicate column in schema
AbdulmalikAlayande Jul 5, 2026
9ca303a
Resolve merge conflicts
AbdulmalikAlayande Jul 5, 2026
dbe9f52
Remove duplicate assertSimulationSuccess function
AbdulmalikAlayande Jul 5, 2026
9217105
Resolve merge conflict in discovery.test.ts
AbdulmalikAlayande Jul 5, 2026
b68a95c
Merge branch 'main' into pr-285
AbdulmalikAlayande Jul 5, 2026
5902b50
Fix SCVal translator to use nativeToScVal and scValToNative
AbdulmalikAlayande Jul 5, 2026
eff06a3
Merge branch 'main' into pr-286
AbdulmalikAlayande Jul 5, 2026
4512bec
Resolve merge conflict in config.ts
AbdulmalikAlayande Jul 5, 2026
ab63d20
Install handlebars
AbdulmalikAlayande Jul 5, 2026
36c55bd
Resolve merge conflict in index.ts
AbdulmalikAlayande Jul 5, 2026
11be0e9
Fix StdioServerTransport constructor args
AbdulmalikAlayande Jul 5, 2026
777a0da
Fix invalid json test regex
AbdulmalikAlayande Jul 5, 2026
178d50e
Resolve merge conflicts in pr-300
AbdulmalikAlayande Jul 5, 2026
7ace334
Fix multiple export errors
AbdulmalikAlayande Jul 5, 2026
953c785
Fix budget tracking tests and schema
AbdulmalikAlayande Jul 5, 2026
db777d2
Resolve merge conflicts in pr-302
AbdulmalikAlayande Jul 6, 2026
72d7e8b
Resolve merge conflicts in pr-305
AbdulmalikAlayande Jul 6, 2026
8363a78
Resolve merge conflicts in pr-308
AbdulmalikAlayande Jul 6, 2026
94fd470
Merge PR 309: Alerting system overhaul with CodeRabbit fixes
AbdulmalikAlayande Jul 6, 2026
04b648e
Fix SQL injection in LIMIT clauses, add missing channel types, and sc…
AbdulmalikAlayande Jul 7, 2026
ed558f0
Fix stopDaemon re-entrance bug and remove dead introspection call
AbdulmalikAlayande Jul 7, 2026
d6aa987
Standardize webhook alert timeout to 10s matching other channels
AbdulmalikAlayande Jul 7, 2026
f3b8d8d
Add missing indexes and widen resource_alert_configs channel constraint
AbdulmalikAlayande Jul 7, 2026
85097d4
Add npm audit step to CI pipeline
AbdulmalikAlayande Jul 7, 2026
484234a
Change no-explicit-any ESLint rule from off to warn
AbdulmalikAlayande Jul 7, 2026
7fd65a4
Update webhook timeout tests to match new 10s timeout
AbdulmalikAlayande Jul 7, 2026
53af1ed
Fixed git conflicts
AbdulmalikAlayande Jul 7, 2026
e05b481
Fixed git conflicts
AbdulmalikAlayande Jul 7, 2026
3c4b922
Fixed git conflicts
AbdulmalikAlayande Jul 7, 2026
591fc9e
Clean up .gitignore: add database/config entries, remove stale Rust a…
AbdulmalikAlayande Jul 7, 2026
911426c
Use npm ci for deterministic CI builds instead of deleting lockfile
AbdulmalikAlayande Jul 7, 2026
c6eb220
Guard non-null assertions on txHash and ledger in auto-extension
AbdulmalikAlayande Jul 7, 2026
809a26e
Log resolution notification failures instead of silently dropping them
AbdulmalikAlayande Jul 7, 2026
2a5a26c
Remove build tools from production Docker image and unused EXPOSE 3000
AbdulmalikAlayande Jul 7, 2026
5e46533
Move pino-pretty to devDependencies and remove outdated @types/pino
AbdulmalikAlayande Jul 7, 2026
2441f3c
Update Dockerfile tests to verify no unused ports and no leaked build…
AbdulmalikAlayande Jul 7, 2026
7165e27
Add tests for parameterized LIMIT, discord/telegram channels, and cos…
AbdulmalikAlayande Jul 8, 2026
6d5754d
Add test for combined limit and since parameters in getResourceUsageLogs
AbdulmalikAlayande Jul 8, 2026
11a398a
Add tests for daemon re-entrance guard after stopDaemon mid-cycle
AbdulmalikAlayande Jul 8, 2026
c6a1fb1
Add test for extension txHash/ledger null guard in runAutoExtensions
AbdulmalikAlayande Jul 8, 2026
93535ca
Add test for resolution notification failure logging in monitor cycle
AbdulmalikAlayande Jul 8, 2026
2c69b7c
Upgrade @stellar/stellar-sdk to v16 and fix vitest vulnerability
AbdulmalikAlayande Jul 10, 2026
4eb1603
feat: define alert event types and helper functions for notification …
AbdulmalikAlayande Jul 10, 2026
08630ea
Fix useless assignment lint errors in alert template context builder
AbdulmalikAlayande Jul 10, 2026
9e320e4
Fix unnecessary escape lint errors in zsh completion script generation
AbdulmalikAlayande Jul 10, 2026
82bd1e9
Fix TypeScript type narrowing for StateChangeAlertEvent in template c…
AbdulmalikAlayande Jul 10, 2026
0a6e53d
Remove unused CostSummary import and fix sequence type for stellar-sd…
AbdulmalikAlayande Jul 10, 2026
fa568df
Fix envelopeXdr type for stellar-sdk v16 GetTransactionResponse
AbdulmalikAlayande Jul 10, 2026
f498cab
Fix error type narrowing in status command catch block
AbdulmalikAlayande Jul 10, 2026
439316c
Bump version to 1.0.0 and remove unnecessary optional dependency
AbdulmalikAlayande Jul 10, 2026
4df6c32
Add auto-release workflow on version bump
AbdulmalikAlayande Jul 10, 2026
7ce208b
Fix release workflow to use tag-based version detection
AbdulmalikAlayande Jul 10, 2026
6df3ba2
Consolidate publish into release workflow and remove publish.yml
AbdulmalikAlayande Jul 10, 2026
5ebd335
Add security policy for vulnerability disclosure
AbdulmalikAlayande Jul 27, 2026
9e3feaf
Add code of conduct
AbdulmalikAlayande Jul 27, 2026
5f97176
Add bug report and feature request issue templates
AbdulmalikAlayande Jul 27, 2026
fb97e8c
Add pull request template
AbdulmalikAlayande Jul 27, 2026
b76d86a
Add CODEOWNERS with mandatory review on key-handling paths
AbdulmalikAlayande Jul 27, 2026
51169eb
Add architecture doc explaining the daemon cycle data flow
AbdulmalikAlayande Jul 27, 2026
3a43318
Link ARCHITECTURE.md, SECURITY.md, and CODE_OF_CONDUCT.md from CONTRI…
AbdulmalikAlayande Jul 27, 2026
7d5147c
Link new governance docs and expand roadmap in README
AbdulmalikAlayande Jul 27, 2026
569352e
Move dispatcher.test.ts into the active tests/ tree
AbdulmalikAlayande Jul 27, 2026
13f9a44
Add tests for alert channel registry
AbdulmalikAlayande Jul 27, 2026
ef55404
Add alert channel registry
AbdulmalikAlayande Jul 27, 2026
fb947ae
Add tests for built-in alert channel registration
AbdulmalikAlayande Jul 27, 2026
dfbfcf0
Register the five built-in alert channels via the registry
AbdulmalikAlayande Jul 27, 2026
cda333e
Source dispatcher's default channel map from the registry
AbdulmalikAlayande Jul 27, 2026
71e8c83
Add tests for relaxed channel_type CHECK constraints
AbdulmalikAlayande Jul 27, 2026
616b98d
Relax channel_type CHECK constraints for pluggable alert channels
AbdulmalikAlayande Jul 27, 2026
b50e46b
Fix CRLF-unsafe comment-stripping regex and add channel_type live mig…
AbdulmalikAlayande Jul 27, 2026
14cba90
Widen channel_type types from fixed unions to string
AbdulmalikAlayande Jul 27, 2026
4069c5c
Remove dead per-test schema rebuild and add plugin channel_type tests
AbdulmalikAlayande Jul 27, 2026
7c2df98
Add tests for registry-driven CLI channel resolution
AbdulmalikAlayande Jul 27, 2026
68312bc
Make 'alerts add' channel resolution registry-driven
AbdulmalikAlayande Jul 27, 2026
7f3d72e
Add contributor guide for adding a new alert channel
AbdulmalikAlayande Jul 27, 2026
4938e16
Update ARCHITECTURE.md's contribution table for the alert channel reg…
AbdulmalikAlayande Jul 27, 2026
35d9237
Update good-first-issue example to reflect the alert channel registry
AbdulmalikAlayande Jul 27, 2026
fe9703b
feat(alerts): add configurable quiet-hours / maintenance windows (#325)
temi-Dee Jul 28, 2026
3c7c182
fix: resolve npm audit high-severity findings blocking all contributo…
AbdulmalikAlayande Jul 30, 2026
1f85d8f
Update README.md
AbdulmalikAlayande Jul 30, 2026
e4e071c
feat(alerts): implement Opsgenie delivery channel
DevSolex Jul 29, 2026
dbeee6c
fix(alerts/opsgenie): address CodeRabbit review comments
DevSolex Jul 29, 2026
287028d
test(alerts/opsgenie): wrap fake timers in try/finally
DevSolex Jul 29, 2026
837a3d6
fix(alerts/opsgenie): surface clear timeout error message
DevSolex Jul 29, 2026
f579e32
fix(alerts/opsgenie): address CodeRabbit round-4 comments
DevSolex Jul 29, 2026
d3f16f2
fix(alerts/opsgenie): attach cause to timeout error (lint fixup for #…
AbdulmalikAlayande Jul 30, 2026
d261e8b
Merge branch 'pr-528-verify' into verify-528
AbdulmalikAlayande Jul 30, 2026
89ed4b8
fix(db): preserve quiet-hours columns through legacy CHECK-constraint…
AbdulmalikAlayande Jul 30, 2026
88558a0
fix(tests): remove unused ResourceEstimate import in resource_estimat…
samuel22x Jul 30, 2026
ec2125f
test(core): cover shared budget pools for #407
TheWeirdDee Jul 30, 2026
d63d3ff
feat(core): implement shared budget pools for #407
TheWeirdDee Jul 30, 2026
548cef6
Merge upstream/main into feature/shared-budget-pools (#635)
TheWeirdDee Aug 5, 2026
5d33e7e
Merge branch 'main' into feature/shared-budget-pools
TheWeirdDee Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion man/sorokeep.1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.TH SOROKEEP 1 "2026-07-31" "sorokeep" "User Commands"
.TH SOROKEEP 1 "2026-08-05" "sorokeep" "User Commands"
.SH NAME
sorokeep - Sorokeep — The missing operations layer for deployed Soroban smart contracts
.SH SYNOPSIS
Expand Down Expand Up @@ -44,5 +44,9 @@ Backup, restore, and maintain database state
Temporarily pause daemon polling and alerting for a contract
.SH RESUME
Resume daemon polling and alerting for a paused contract
.SH METRICS
Print a metrics snapshot without starting the HTTP server
.SH AUDIT-LOG
Export extension transactions as a machine-parseable JSONL audit trail
.SH SEE ALSO
sorokeep(1)
25 changes: 6 additions & 19 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

221 changes: 221 additions & 0 deletions src/alerts/channels.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import { sendSlackAlert } from "../../src/alerts/slack";
import { sendPagerDutyAlert } from "../../src/alerts/pagerduty";
import { sendDiscordAlert } from "../../src/alerts/discord";
import { sendTelegramAlert } from "../../src/alerts/telegram";
import { sendWebhookAlert } from "../../src/alerts/webhook";
import type { AlertEvent } from "../../src/alerts/types";
import { loadConfig } from "../../src/utils/config";

vi.mock("../../src/utils/config", () => ({
loadConfig: vi.fn(),
}));

const mockLoadConfig = vi.mocked(loadConfig);
const fetchSpy = vi.spyOn(global, "fetch");

describe("Alert Channels", () => {
beforeEach(() => {
vi.clearAllMocks();
process.env = {}; // Clear env for fresh config resolution

// Default successful fetch
fetchSpy.mockResolvedValue({
ok: true,
status: 200,
statusText: "OK",
json: async () => ({ ok: true }),
text: async () => "OK"
} as Response);
});

const mockEvent: AlertEvent = {
type: "threshold_crossed",
network: "testnet",
contractId: "C1234",
contractName: "TestContract",
severity: "critical",
message: "TTL critical",
entry: { type: "ContractData", label: "State" },
threshold: {
currentRemainingLedgers: 10,
configuredLedgers: 20,
approximateTimeRemaining: "1m"
},
};

const mockResourceEvent: AlertEvent = {
type: "resource_alert",
network: "testnet",
contractId: "C1234",
severity: "warning",
message: "CPU high",
resource: {
type: "cpu",
currentUsage: 90,
limit: 100,
usagePercent: 90
}
};

describe("Slack", () => {
it("throws if no slack token provided", async () => {
mockLoadConfig.mockReturnValue({});
await expect(sendSlackAlert("C123", mockEvent)).rejects.toThrow(/Slack token not configured/);
});

it("sends slack message successfully using env var token", async () => {
process.env.SOROKEEP_SLACK_TOKEN = "xoxb-env-token";
await sendSlackAlert("C123", mockEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
const [url, init] = fetchSpy.mock.calls[0];
expect(url).toBe("https://slack.com/api/chat.postMessage");
expect(init?.headers).toMatchObject({
Authorization: "Bearer xoxb-env-token",
"Content-Type": "application/json"
});
});

it("sends slack message successfully using config token", async () => {
mockLoadConfig.mockReturnValue({ slackToken: "xoxb-config-token" });
await sendSlackAlert("C123", mockResourceEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("throws if slack API returns error", async () => {
process.env.SOROKEEP_SLACK_TOKEN = "token";
fetchSpy.mockResolvedValueOnce({
ok: false,
status: 400,
statusText: "Bad Request",
text: async () => "invalid_auth"
} as Response);

await expect(sendSlackAlert("C123", mockEvent)).rejects.toThrow(/Slack API request failed: HTTP 400/);
});

it("throws if slack API returns success but payload has error", async () => {
process.env.SOROKEEP_SLACK_TOKEN = "token";
fetchSpy.mockResolvedValueOnce({
ok: true,
status: 200,
json: async () => ({ ok: false, error: "channel_not_found" })
} as Response);

await expect(sendSlackAlert("C123", mockEvent)).rejects.toThrow(/Slack API error: channel_not_found/);
});
});

describe("PagerDuty", () => {
it("sends pagerduty event successfully", async () => {
await sendPagerDutyAlert("integration-key", mockEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
const [url, init] = fetchSpy.mock.calls[0];
expect(url).toBe("https://events.pagerduty.com/v2/enqueue");
expect(init?.headers).toMatchObject({
"Content-Type": "application/json"
});
});

it("handles resource alerts for pagerduty", async () => {
await sendPagerDutyAlert("integration-key", mockResourceEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("handles resolved alerts for pagerduty", async () => {
await sendPagerDutyAlert("integration-key", {
...mockEvent,
type: "alert_resolved",
severity: "info",
message: "Resolved"
});
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("throws on non-202 status", async () => {
fetchSpy.mockResolvedValueOnce({
ok: false,
status: 400,
statusText: "Bad Request",
text: async () => "invalid"
} as Response);
await expect(sendPagerDutyAlert("key", mockEvent)).rejects.toThrow(/PagerDuty API request failed: HTTP 400/);
});
});

describe("Discord", () => {
it("sends discord webhook successfully", async () => {
await sendDiscordAlert("https://discord.com/api/webhooks/123/abc", mockEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("sends discord webhook for resource alerts", async () => {
await sendDiscordAlert("https://discord.com/api/webhooks/123/abc", mockResourceEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("throws on discord api error", async () => {
fetchSpy.mockResolvedValueOnce({
ok: false,
status: 404,
statusText: "Not Found",
text: async () => "webhook not found"
} as Response);
await expect(sendDiscordAlert("https://discord.com/api/webhooks/123/abc", mockEvent)).rejects.toThrow(/Discord webhook request failed: HTTP 404/);
});
});

describe("Telegram", () => {
it("throws if no telegram bot token provided", async () => {
mockLoadConfig.mockReturnValue({});
await expect(sendTelegramAlert("chat_id", mockEvent)).rejects.toThrow(/Telegram bot token not configured/);
});

it("sends telegram message successfully", async () => {
process.env.SOROKEEP_TELEGRAM_BOT_TOKEN = "bot-token";
await sendTelegramAlert("chat_id", mockEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("sends telegram message for resource alerts", async () => {
process.env.SOROKEEP_TELEGRAM_BOT_TOKEN = "bot-token";
await sendTelegramAlert("chat_id", mockResourceEvent);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("throws on telegram api error", async () => {
process.env.SOROKEEP_TELEGRAM_BOT_TOKEN = "bot-token";
fetchSpy.mockResolvedValueOnce({
ok: false,
status: 401,
statusText: "Unauthorized",
text: async () => "invalid token"
} as Response);
await expect(sendTelegramAlert("chat_id", mockEvent)).rejects.toThrow(/Telegram API request failed: HTTP 401/);
});
});

describe("Webhook", () => {
it("sends simple webhook successfully", async () => {
await sendWebhookAlert("http://custom.webhook", mockEvent, null);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

it("sends signed webhook successfully", async () => {
await sendWebhookAlert("http://custom.webhook", mockEvent, "secret-key");
expect(fetchSpy).toHaveBeenCalledTimes(1);
const [, init] = fetchSpy.mock.calls[0];
expect(init?.headers).toHaveProperty("X-Sorokeep-Signature");
});

it("throws on webhook error", async () => {
fetchSpy.mockResolvedValueOnce({
ok: false,
status: 500,
statusText: "Internal Error",
text: async () => "server error"
} as Response);
await expect(sendWebhookAlert("http://url", mockEvent, null)).rejects.toThrow(/Webhook delivery failed: HTTP 500 from http:\/\/url/);
});
});
});
Loading