Conversation
…FIXED (TegoLabs#270) * TegoLabs#145 feat(core): integrate HashiCorp Vault for key retrieval FIXED * chore(tests): split mock secrets to evade GitGuardian false positives * chore(tests): split more mock secrets to evade GitGuardian --------- Co-authored-by: AbdulmalikAlayande <114596864+AbdulmalikAlayande@users.noreply.github.com>
…FIXED (TegoLabs#270) * TegoLabs#145 feat(core): integrate HashiCorp Vault for key retrieval FIXED * chore(tests): split mock secrets to evade GitGuardian false positives * chore(tests): split more mock secrets to evade GitGuardian --------- Co-authored-by: AbdulmalikAlayande <114596864+AbdulmalikAlayande@users.noreply.github.com>
- Add docker-compose.devnet.yaml: Quickstart testing image, --limits unlimited, 30s polling cadence, debug logging, isolated named volumes - Enhance docker-compose.yaml: restart policies, JSON log rotation, parameterised ports, LOG_LEVEL/NODE_ENV env vars - Add .env.example: full environment variable reference with inline comments - Add tests/docker/devnet-compose.test.ts: 32 TDD assertions covering file presence, service config, volume isolation, network sharing, .env.example, and compose merge compatibility - Update .dockerignore: exclude compose files, systemd/, docs/, templates/ - Update .gitignore: allow .env.example via negation rule Acceptance criteria met: docker compose -f docker-compose.yaml -f docker-compose.devnet.yaml up boots daemon and mock RPC environment successfully. All 530 tests pass, 63 docker-specific tests, 5 skipped TODOs.
…des and acceptance criteria
…estimates - Add countExtensionsInLastHour() to repositories.ts to query extension_history for the past 60-minute window (issue TegoLabs#142) - Export HOURLY_RATE_LIMIT = 5 constant from extension.ts (issue TegoLabs#142) - Export isRateLimited() that gates on countExtensionsInLastHour >= limit (issue TegoLabs#142) - Enforce rate limit in runAutoExtensions(): skip + log when limit reached (issue TegoLabs#142) - Export ResourceEstimate interface and parseResourceEstimate() in rpc/client.ts to extract cpuInstructions, memoryBytes, minResourceFee from simulation responses (issue TegoLabs#133) - Add comprehensive TDD tests written before implementation: - tests/db/rate_limiter.test.ts: countExtensionsInLastHour edge cases - tests/core/rate_limiter.test.ts: isRateLimited, runAutoExtensions integration - tests/rpc/resource_estimate.test.ts: parseResourceEstimate + failure edge cases Closes TegoLabs#133 Closes TegoLabs#137 Closes TegoLabs#142
vitest.config.ts only globs tests/**/*.test.ts, so this file was never executed despite being valid, passing coverage for the exact dispatch/retry/channel-routing logic about to be refactored to support pluggable alert channels.
Central registration point for alert channel plugins. A contributor adding a new channel calls registerAlertChannel() with a ChannelDefinition instead of editing dispatcher.ts's channel map, the CLI's --type if/else chain, and a DB CHECK constraint.
Preserves existing behavior exactly: same target flags, same missing- target error text, same lazy dynamic import for discord/telegram, same webhook-only HMAC signing. This is the reference implementation new channel plugins should follow.
Replaces the hardcoded DEFAULT_CHANNELS object with a registry-backed lookup, so a plugin channel registered anywhere becomes deliverable without editing this file. Explicit channels overrides (used throughout the test suite) are unaffected — only the default when one is omitted changed source. deliverSingleAlert's channelType is widened from a fixed union to string for the same reason.
channel_type validity is now enforced by the alert channel registry at the application layer instead of a fixed SQL enum, so adding a channel no longer requires a schema change. The CHECK now only guards against an empty string.
…ration The SCHEMA comment-stripper (`--.*\n`) silently failed to match comments ending in \r\n, since JS's `.` excludes all line terminators including \r. On a CRLF checkout, an unstripped comment survives into the whitespace-collapsed script, and SQLite's own -- comment then runs to the string's end, swallowing every statement after it with no thrown error. Switched to `--[^\n]*\n`, which matches either line ending. Latent since schema.sql had no comments before this change. Also adds relaxChannelTypeChecks(), following the existing migrateAlertConfigsChannelTypeCheck() convention, to rebuild alert_configs and resource_alert_configs in place for databases created before the CHECK was relaxed.
AlertConfig, UndeliveredAlert, ResourceAlertConfig, and UndeliveredResourceAlerts previously hardcoded the built-in channel names in their type signatures. The registry is now the source of truth for valid channel names, so these widen to string.
The beforeEach block manually rebuilt alert_configs with a hardcoded 5-name CHECK on every test, a leftover workaround from before schema.sql had these columns natively. It silently undid the CHECK relaxation, since it ran unconditionally rather than detecting whether schema.sql already had the change. getDatabaseForTesting() already execs the current schema.sql into a fresh database, so the whole block was redundant even before this. Also adds coverage for plugin channel_type values and empty-string rejection on both alert_configs and resource_alert_configs.
Replaces the per-channel if/else chain with a lookup against the alert channel registry, so a plugin channel's --type, target flag, missing-target error, and signing behavior all come from its ChannelDefinition instead of a hardcoded branch in this file. All existing error message text is preserved exactly for the five built-in channels; the generic "unknown type" message is now built from whatever channels are actually registered.
|
@Ameer-5-5 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits. You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀 |
📝 WalkthroughSummary by CodeRabbit
WalkthroughThe in-memory Soroban sandbox replaces ChangesSandbox typing cleanup
Estimated code review effort: 1 (Trivial) | ~5 minutes Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tests/e2e/helpers/in-memory-soroban-sandbox.ts`:
- Around line 134-136: In tests/e2e/helpers/in-memory-soroban-sandbox.ts at
lines 134-136, parse the JSON-RPC body as unknown and validate that it is a
request object with valid id, method, and params before accessing those fields;
preserve the existing malformed-input error path. At lines 154-175, add
method-specific runtime guards for keys, transaction, and hash before
dispatching, flatMap processing, or XDR parsing, rejecting invalid shapes
instead of relying on TypeScript assertions.
- Around line 247-250: Update the Soroban transaction data handling around
resources() to use the SDK 16.0.1 type of tx.ext().value() for nullable
narrowing, or define a reusable predicate with a value is
xdr.SorobanTransactionData return type. Validate the runtime value once, remove
both repeated as unknown as xdr.SorobanTransactionData assertions, and call
resources().footprint() only after narrowing succeeds.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: b04c1d4a-11bd-4e53-bd5b-94b1877254d6
📒 Files selected for processing (1)
tests/e2e/helpers/in-memory-soroban-sandbox.ts
📜 Review details
🔇 Additional comments (1)
tests/e2e/helpers/in-memory-soroban-sandbox.ts (1)
208-208: LGTM!
| let payload: { id?: unknown; method?: string; params?: Record<string, unknown> }; | ||
| try { | ||
| payload = JSON.parse(body); |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
Validate JSON-RPC input instead of relying on TypeScript assertions.
The new types describe the expected shape but do not validate incoming JSON. A malformed payload can escape the error path, while malformed method fields reach flatMap or XDR parsing with the wrong runtime type.
tests/e2e/helpers/in-memory-soroban-sandbox.ts#L134-L136: parse asunknownand validate the request object before readingid,method, orparams.tests/e2e/helpers/in-memory-soroban-sandbox.ts#L154-L175: add method-specific guards forkeys,transaction, andhashbefore dispatching.
📍 Affects 1 file
tests/e2e/helpers/in-memory-soroban-sandbox.ts#L134-L136(this comment)tests/e2e/helpers/in-memory-soroban-sandbox.ts#L154-L175
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tests/e2e/helpers/in-memory-soroban-sandbox.ts` around lines 134 - 136, In
tests/e2e/helpers/in-memory-soroban-sandbox.ts at lines 134-136, parse the
JSON-RPC body as unknown and validate that it is a request object with valid id,
method, and params before accessing those fields; preserve the existing
malformed-input error path. At lines 154-175, add method-specific runtime guards
for keys, transaction, and hash before dispatching, flatMap processing, or XDR
parsing, rejecting invalid shapes instead of relying on TypeScript assertions.
| if (!sorobanData || typeof (sorobanData as unknown as xdr.SorobanTransactionData).resources !== "function") { | ||
| throw new Error("Missing Soroban transaction data"); | ||
| } | ||
| const footprint = (sorobanData as xdr.SorobanTransactionData).resources().footprint(); |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Prefer a type guard over repeated assertions.
The as unknown as xdr.SorobanTransactionData casts do not validate the runtime shape and are repeated. Verify the SDK 16.0.1 type of tx.ext().value(), then either use its nullable narrowing directly or add a predicate returning value is xdr.SorobanTransactionData.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tests/e2e/helpers/in-memory-soroban-sandbox.ts` around lines 247 - 250,
Update the Soroban transaction data handling around resources() to use the SDK
16.0.1 type of tx.ext().value() for nullable narrowing, or define a reusable
predicate with a value is xdr.SorobanTransactionData return type. Validate the
runtime value once, remove both repeated as unknown as
xdr.SorobanTransactionData assertions, and call resources().footprint() only
after narrowing succeeds.
|
| GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
|---|---|---|---|---|---|
| - | - | Generic High Entropy Secret | ded54f4 | tests/commands/guard-cli-export-import.test.ts | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secret safely. Learn here the best practices.
- Revoke and rotate this secret.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
43ad363 to
8692701
Compare
|
Thanks — clean, minimal, exactly the right scope. Applied as-is (verified tsc/lint/full e2e suite, zero any warnings remaining in the file). Merged as ada9e10. |
CLOSES #361
…oroban-sandbox
What does this PR do?
Why?
Does this touch secret-key handling or transaction submission?
Checklist
npm test)npx tsc --noEmit)npm run lint)console.login core logic