Commit graph

1096 commits

Author SHA1 Message Date
Satoshi Nakamoto
b7e88a7f82
Update mining pool URLs in spvblock.py 2026-08-13 02:03:47 +02:00
Satoshi Nakamoto
ab0a6a3489
Update mining pool address and port 2026-08-13 02:02:05 +02:00
Satoshi Nakamoto
f0786cf3fa
Update host and port for connection settings 2026-08-13 02:00:02 +02:00
MarcanoFilms
5c019e9a8e fix: address Sourcery review feedback on OracleVision v2.2 PR
- Fix script_type derivation from validateaddress (hex scriptPubKey)
- Add getaddressinfo fallback and safer RPC result guards
- Centralize flagged transaction selection in ui.py helper
- Harden configure_detectors optional import and document witness_bytes
- Remove dead exception handling in tx_service
- Expand unit tests for addresses, tx_flow, and detector registry
- Align README/PR doc wording
2026-06-23 17:22:04 -04:00
MarcanoFilms
c159df167f feat: OracleVision v2.2 — Transaction Inspector and pluggable detectors
Port v2.2 analysis features from upstream oraculovision into PyBLOCK's
Rich terminal UI:

- Add Transaction & Address Inspector (menu D) with flow, fees, BIP-110
  flags, spam signals, UTXO balance, and mempool exposure
- Refactor bip110.py to pluggable detector architecture with flagged_raw
  cache for pruned-node drill-down from Block Detail View
- Extend bitcoin-cli wrapper with getrawtransaction, scantxoutset, etc.
- Add unit tests and PR_ORACLEVISION_V2.2.md documentation
- Renumber Launch Full TUI to menu option E

Upstream: https://github.com/MarcanoFilms/oraculovision v2.2.0a1
2026-06-23 08:17:10 -04:00
MarcanoFilms
cc02310f1c Address Sourcery review: security hardening and config resilience
- Fix detect_token_patterns to scan decoded ASCII instead of hex strings
- Handle malformed oraclevision.conf without crashing the menu
- Add security.py to validate executables, paths, and RPC method names
- Resolve subprocess targets before launch with nosemgrep audit notes
2026-06-21 11:06:41 -04:00
MarcanoFilms
8c9625f67f Add OracleVision integration: BIP-110 spam detection and block template analysis
Integrate lightweight sovereign analysis tools from OracleVision into PyBLOCK's
Bitcoin menu. Adds modular BIP-110 violation scanning, Mempool Glass composition
via getblocktemplate, block detail view, and optional launch of the full
OracleVision TUI. Detection logic is separated from UI for community extension.
2026-06-21 10:02:04 -04:00
GaltRanch
389f6f3497 fix: address 4 security/quality findings from KCode audit
Automated fixes applied by KCode Audit Engine:
- pybitblock/SPV/apisnd.py         | 2 ++
- pybitblock/SPV/nodeconnection.py | 4 ++++
- pybitblock/ppi.py                | 2 ++

Signed-off-by: Astrolexis.space — Kulvex Code
2026-04-06 00:17:24 -03:00
GaltRanch
893aabc85d Security audit round 2: eliminate shell=True, mask secrets, fix race conditions
- Replace all shell=True subprocess calls with Python-native processing
  (nodeconnection.py, SPV/nodeconnection.py, SPV/ppi.py)
- Mask sensitive inputs (private keys, passwords, tokens) with getpass
- Add threading.Lock to block_explorer.py shared state
- Use json.loads() instead of fragile string splitting in apisnd.py
- Add path validation before file open in apisnd.py
- Replace random.randint with secrets.randbelow for mining nonces
- Fix destructive exception handlers in clone.py and feed.py
- Replace bare except clauses with specific exceptions + logging
- Remove unused imports (psutil, xmltodict, block_visualizer, base64, say)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 11:15:59 -03:00
GaltRanch
d79977ce00 Full security and code quality audit fixes across codebase
Security (Critical):
- Eliminate all shell=True command injection vectors (~95 instances in ppi.py, spvblock.py)
- Replace subprocess curl calls with requests library
- Add input validation (fiat code allowlist, IP address validation)
- Replace weak random.randint/choice with secrets module for crypto ops
- Remove token/credential exposure from print statements
- Add path traversal prevention in config.py
- Create .conf.example templates, scrub local credentials

Stability:
- Replace 63 bare except clauses with specific exceptions + logging
- Fix file handle leaks with context managers (lnd.py, apisnd.py)
- Add threading.Lock for race conditions in clock/data.py
- Cap unbounded list growth (MAX_HISTORY_LEN=50)
- Add timeout=10 to ~50 requests calls missing timeouts

Maintainability:
- Extract _load_macaroon() helper (dedup 69 instances in PyBlock.py)
- Extract _load_lnd_config() helper (dedup 33 instances in nodeconnection.py)
- Normalize json import (simplejson with stdlib fallback)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:57:20 -03:00
GaltRanch
3498d59214 Merge origin/master: resolve conflicts keeping ColdCore and dynamic paid status
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:48:20 -03:00
GaltRanch
dcb1a961d4 Address Sourcery review: subprocess audit, dead code, renderer fix
- clock/data.py: add nosemgrep suppression on audited _cli subprocess call
- clock/renderer.py: remove unreachable zen-mode check in heartbeat()
- nodeconnection.py: extract _run_ln helper with nosemgrep suppression
- SPV/spvblock.py: add nosemgrep suppression on audited subprocess calls

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:41:11 -03:00
GaltRanch
68e235f457 Fix dangerous-subprocess-use-audit across codebase
Replace all dynamic .split() patterns in subprocess calls with safe
alternatives: shlex.split(), explicit list args, and _run_btc/_run_ln
helpers in PyBlock.py. Covers PyBlock, block_visualizer, clockscript,
lastblockdetail, mempoolclock, nodeconnection, and ai/context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:35:03 -03:00
GaltRanch
93a87351a3 Fix HIGH severity issues from security audit
#6 Shell injection in SPV/spvblock.py (6 user-input instances):
- OP_RETURN: curl shell command → requests.post()
- BitcoinStrings: validate numeric input + requests.get()
- Ocean hashrate/earnings: requests.get() instead of curl
- Weather v1/v2: requests.get() with HTTPS
- Rate.sx: requests.get() instead of curl shell pipe

#7/#8 File handle leaks in PyBlock.py:
- Replace all json.load(open(...)) with context managers
- 15 instances fixed across config loading functions

#9 IP:PORT input validation:
- Add regex validation for hostname:port format
- Reject malformed input before use in HTTP requests

#10 Invalid escape sequences in SPV/spvblock.py:
- Line 201: ASCII art string → raw string (r prefix)
- Line 811: curl grep pattern → raw string

Also: remove unused imports (Panel, Text) from ai/ui.py

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:38:18 -03:00
GaltRanch
cfe4e5c912 Fix 5 critical security issues from audit
1. Shell injection in readHexBlock/readHexTx (PyBlock.py):
   - Validate user input with hex-only regex before use
   - Replace shell=True pipe chain with subprocess list + piped stdin
   - Same fix for OP_RETURN loop TX decoding

2. Shell injection in weather commands (ppi.py):
   - Replace curl shell commands with requests.get()
   - User input (city, lang, unit) no longer touches shell
   - Upgraded from HTTP to HTTPS

3. Runtime crash in SPV/spvblock.py:
   - os.path.isfile() called with 2 args (TypeError)
   - Fixed to use 'and' for two separate checks

4. Config files added to .gitignore:
   - pybitblock/config/*.conf (RPC creds, API keys, tokens)
   - pybitblock/SPV/config/*.conf
   - *.log files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:28:30 -03:00
GaltRanch
6f7084857d Extract _run_cli helper to satisfy subprocess security audit
Centralize bitcoin-cli subprocess calls into a single _run_cli()
function with nosemgrep annotation. The cli path is already
sanitized via shlex.split() before reaching this function.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:01:38 -03:00
GaltRanch
0425c18124 Improve AI chat visual separation between user and AI
- Add cyan separator lines (────) before and after AI responses
- Change prompt to 'pyblock>' in yellow to distinguish from AI text
- Balance shown below the closing separator in dim
- Add UTF-8 env vars to entrypoint.sh for ttyd/Docker contexts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:59:59 -03:00
GaltRanch
518e3c93ea Fix UTF-8: render Rich to buffer then write bytes to stdout
Rich Console renders to a StringIO buffer, then the result is
encoded as UTF-8 bytes and written directly to sys.stdout.buffer,
bypassing Python's stdout encoding which may not be UTF-8 in all
launch contexts (ttyd, Docker, pipes).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:51:20 -03:00
GaltRanch
b81a425dda Force UTF-8 stdout encoding on module load for AI responses
Reconfigure sys.stdout to UTF-8 when the ai module loads, ensuring
accented characters (á, é, ñ, ¡, ¿) render correctly regardless
of how PyBLOCK was launched.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:48:00 -03:00
GaltRanch
8932197a8f Fix UTF-8 encoding for AI responses (tildes, eñes)
Force Rich Console to use UTF-8 output encoding so Spanish
accented characters render correctly in the terminal.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:42:42 -03:00
GaltRanch
524e4c9799 Fix command injection warning in ai/context.py
Use shlex.split() to safely parse bitcoincli path before passing
to subprocess.run(), same pattern as clock/data.py fix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:40:09 -03:00
GaltRanch
b556909d87 Fix stale balance display after usage command
The status line after 'U' (usage) showed the old balance instead
of refreshing it from the API. Now calls get_balance() before
displaying the status line.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:38:40 -03:00
GaltRanch
8cc5db8d78 Redesign AI chat UI: continuous flow + Rich Markdown rendering
Major UX improvements inspired by KCode's terminal rendering:

- Continuous chat flow — no screen clearing between messages,
  conversation scrolls naturally like a real chat
- Rich Markdown rendering for AI responses — proper tables,
  code blocks with syntax highlighting, headers, bold, bullets
- Remove "Press Enter to continue" interruption from chat loop
- Compact status line showing balance + commands inline
- Ctrl+C returns to main menu cleanly
- Balance updates shown inline after each response
- Context refreshed on each query for up-to-date node data

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:30:24 -03:00
GaltRanch
e88ad984e5 Add local fallback to Astrolexis client for resilience
Client tries the public URL first (api.astrolexis.space), and
falls back to localhost:10400 on 404 or connection errors. This
handles CDN cache issues and provides resilience when the gateway
runs on the same machine as PyBLOCK.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:26:11 -03:00
GaltRanch
e3db68f7a9 Fix client.py: separate streaming from non-streaming chat
A function with yield is always a generator in Python, so
chat() with stream=False was returning a generator instead
of a dict. Split into chat() for non-streaming (returns dict)
and _stream_chat() for streaming (yields SSE chunks).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 11:16:36 -03:00
GaltRanch
fef34e146d Fix Astrolexis URL to astrolexis.space in AI setup screen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 10:51:45 -03:00
GaltRanch
962a1ab746 Add AI Assistant module powered by Astrolexis KCode
New pybitblock/ai/ package integrating with Astrolexis AI Gateway
at https://api.astrolexis.space:

- client.py: API client for auth, top-up (Lightning), chat (SSE
  streaming), and usage tracking
- context.py: Gathers Bitcoin/Lightning node data (via CLI, RPC,
  or mempool.space API) for AI context injection
- ui.py: Terminal chat interface with conversation history,
  Lightning top-up flow with QR codes, usage stats display,
  and first-time token setup

Accessible from Main Menu as "I - AI Assistant". All queries go
through Astrolexis gateway — user pays in sats via Lightning.
Token stored in pyblocksettings.conf.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 10:48:25 -03:00
GaltRanch
09377371af Remove all payment gates — LNBits, LNPay, OpenNode now FREE
Remove 1000-sat Lightning invoice paywalls from LNBits, LNPay, and
OpenNode API integrations. All three now go directly to config setup
(same flow as TippinMe/TallyCoin which were already free).

Changes:
- Replace aaccPPiLNBits/LNPay/OpenNode() payment loops with direct
  config-or-setup logic in both PyBlock.py and SPV/spvblock.py
- Change all menu labels from PAID/PREMIUM/LOCKED to FREE
- Remove LNURL file existence checks (lnbitSN.conf gates)
- Remove ~400 lines of payment invoice generation, QR display,
  and payment polling code

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:48:58 -03:00
GaltRanch
8f7ec5e6ad Remove broken ColdCore integration
ColdCore was non-functional due to literal '$HOME' paths that never
expanded, making all file checks always fail. The upstream project
(jamesob/coldcore) is experimental/alpha and requires Coldcard
hardware, limiting its audience.

Removed: callColdCore() function, menu entry "I" (ColdCore), and
handlers from PyBlock.py, SPV/spvblock.py, and umbrel-app.yml.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:38:15 -03:00
GaltRanch
dcd9d44cde Restore Rich UI menus lost during clock integration
The clock commit (8e27372) inadvertently reverted Rich Columns menus
(Bitcoin submenu, Lightning, API menus) back to plain ANSI format.
Restored from commit 3062a34 and reapplied clock changes on top:
- artist()/design() delegation to clock.run_clock()
- mainmenuControl unified clock launch
- menuSelection()/menuSelectionLN() using cfg singleton
- Settings D option with clockDisplaySettings()
- TUI startup using cfg.intro_mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:23:09 -03:00
GaltRanch
92959c67c9 Fix security and concurrency issues in clock data layer
- Use shlex.split() instead of str.split() for bitcoin-cli commands
  to prevent command injection via crafted config values
- Remove partial threading.Lock usage that only guarded writes but
  not reads, relying on Python's GIL for atomic attribute assignment
- Remove unused threading import (Lock)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:17:26 -03:00
GaltRanch
0e14cec037 Fix generative art centering to use actual terminal width
The hash_art() function was hardcoding pad based on 80 columns.
Now accepts term_width parameter and the renderer passes the
real terminal width for proper centering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:10:53 -03:00
GaltRanch
4488bd7aac Add 5 visual features to block clock: miner pool, weight, histogram, peers, moon
- Miner pool tag: shows who mined the last block (coinbase decode for local/remote, API for lite)
- Block weight meter: colored fullness bar (green/yellow/red)
- Block time histogram: sparkline of last 14 block intervals with color-coded speed + streak detection
- Peer count: network connections indicator with health coloring
- Moon phase: current lunar phase emoji + name

All toggleable via Settings → D (Clock Display Settings).
Also fixes negative countdown timer (clamp to 0) and countdown row tracking bug.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:08:18 -03:00
GaltRanch
8e2737251d Add enhanced block clock with 12 new features for Menu A
New clock/ package replaces the old design() polling loop with a
flicker-free ANSI cursor-positioned renderer. Features include:
countdown timer, epoch/halving progress bar, fee rate indicator,
hashrate sparkline, matrix mining animation, odometer digit transition,
heartbeat pulse, zen mode, UTC time display, fireworks on milestone
blocks, generative hash art, and configurable sound modes.

All features are toggleable via Settings → D (Clock Display Settings).

Also fixes hardcoded config paths in menuSelection(), menuSelectionLN(),
and TUI startup to use the cfg singleton instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 08:35:59 -03:00
Satoshi Nakamoto
8a5a366716
Merge pull request #731 from GaltRanch/umbrel/integration 2026-04-01 21:55:51 +02:00
GaltRanch
7509df10e0 Add environment variable support to config.py for Umbrel/Docker
Config now reads these env vars (with priority over config files):

Bitcoin Core:
  BITCOIN_RPC_HOST, BITCOIN_RPC_PORT, BITCOIN_RPC_USER, BITCOIN_RPC_PASS
  BITCOIN_CLI_PATH

Lightning (LND):
  LND_HOST, LND_GRPC_PORT, LND_TLS_CERT_PATH, LND_MACAROON_PATH
  LND_CLI_PATH

Mode:
  PYBLOCK_MODE (A=Bitcoin+Lightning, B=Bitcoin, C=Lite)

When env vars are set, config files are auto-generated for consistency.
This enables zero-config deployment on Umbrel where credentials are
injected via docker-compose environment.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:30:47 -03:00
GaltRanch
e18c0914cd Convert remaining medium menus (5-8 items) to Rich format
PyBlock.py (10 menus):
- nostrConn: 2 columns (Console/Tools)
- APILnbit + OnchainOnly: 2 columns (Invoices/Manage)
- runTheNumbers (3 variants): Rich print with colored keys
- APILnPay + OnchainOnly: Rich print
- APIOpenNode + OnchainOnly: Rich print

SPV/spvblock.py (10 menus):
- nostrConn: 2 columns (Console/Tools)
- PhoenixConn: 2 columns (Install/Manage)
- APILnbit + OnchainOnly: 2 columns (Invoices/Manage)
- runTheNumbers (2 variants): Rich print
- APILnPay + OnchainOnly: Rich print
- APIOpenNode + OnchainOnly: Rich print

All keybindings preserved. Color menus and 2-3 item menus untouched.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
eb1eab9dd8 Redesign ColdCore integration with Rich UI and proper path handling
Major improvements to callColdCore():
- Fix $HOME path bug: use os.path.expanduser() for all paths
- Rich status panel showing: Bitcoin CLI, ColdCore install, wallet file
- Step-by-step setup guide with Rich panels when public.txt missing
- Auto-create ~/.pyblock directory with confirmation
- Show wallet balances from bitcoin-cli before launching
- Install ColdCore to ~/.pyblock/coldcore with --depth 1
- Proper error handling with show_error()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
3062a344ec Reorganize all large menus into Rich categorized columns
Convert 7 ANSI menus to Rich Columns with colored category headers:

PyBlock.py (4 menus):
- Lightning Local (21 items): Invoices/Channels/Node/Chat
- Lightning Remote (13 items): Invoices/Channels/Node/LNBits
- API Menu (20 items): Lightning APIs/Payment/Data/Tools
- API Menu OnchainOnly (22 items): same + PhoenixD/Luxor

SPV/spvblock.py (3 menus):
- Bitcoin Core (19 items): Blockchain/Monitoring/Tools/Mining
- Lightning (20 items): Payments/Channels/Node/Tools
- API Menu (24 items): Lightning APIs/Payment/Data/Tools

Each category uses distinct colors (orange/cyan/green/yellow/magenta)
for quick visual scanning. All keybindings preserved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
a4b3b231a9 Fix console name collision: rename Rich console import to rich_console
PyBlock.py has a local function console() (bitcoin-cli console).
The Rich Console import was shadowing it. Renamed to rich_console.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
c6e28916bd Reorganize Bitcoin submenu into 4 categorized columns with Rich
Replace the flat 25-item single-column ANSI menu with Rich Columns
organized by category:

- BLOCKCHAIN: Console, Info, Run Numbers, Latest, Moscow Time, Genesis
- MONITORING: Mempool, Unconfirmed, Visualizer, Block/Node/Mempool/Peers
- TOOLS: Decode HEX, QR, Tx Confirm, Search, OP_RETURN, Misc, ColdCore
- STATS & MINING: Stats, Hashrate, CLI/OwnNode Miner, Vanity, Wallet

Each category has its own color (orange, cyan, green, yellow) and
header. Much easier to scan and find features.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
76acfa19dd Improve block visualizer: squarified treemap, vivid colors, half-blocks
Major visual upgrade to the block treemap:
- Squarified treemap algorithm for proper space-filling layout
- Half-block characters (▀) for 2x vertical resolution
- mempool.space-inspired color scale (turquoise→blue→purple→orange→red)
- Dark borders between transactions for visual separation
- Wider treemap (up to 120 cols) and taller (up to 30 rows)
- Improved legend with Low/High labels

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
e1d4276c9e Add interactive Rich block visualizer with treemap and fee analysis
New block_viz.py replacing the old asciimatics-based block_visualizer:

- Colorful transaction treemap (purple→blue→green→yellow→red fee scale)
- Block info panel: height, hash, pool, tx count, size, weight, fees
- Top 8 fee transactions table with color-coded fee rates
- Fee distribution histogram with 8 color-coded buckets
- Works with bitcoin-cli and mempool.space API
- Interactive navigation: prev/next/latest/goto block
- Launch standalone: python3 block_viz.py [height]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
cb89d6fbcf Restore Panel boxes with transparent background (style='on default')
Bring back the Panel borders for sysinfo, status bar, header, and menu
but use style='on default' which inherits the terminal's background
color instead of Rich's default dark gray. border_style='dim' keeps
the borders subtle.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:29:47 -03:00
GaltRanch
db640ac8fc Replace Rich Tables with inline console.print for transparent backgrounds
Tables pad columns with spaces that show a different background color.
Switch sysinfo and menu to console.print() with markup strings instead,
which render with the terminal's native background color.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:28:30 -03:00
GaltRanch
2f60500162 Remove Rich Panel borders from status bar and header
Replace Panel() wrappers with plain text output for status_bar and
header — Panels create a visible background box that clashes with
dark terminal themes. Error/warning panels kept as-is since they
should visually stand out.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:26:29 -03:00
GaltRanch
b86fdcb1ce Fix Rich background colors to match terminal background
- Use transparent backgrounds instead of forced dark grays in panels
- Replace ░ block chars with ─ dashes for progress bar empty space
- Set console highlight=False to prevent unwanted auto-styling
- Remove pyblock.dim style from panels (used default dim instead)

Rich elements now blend seamlessly with the terminal's own background.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:24:28 -03:00
GaltRanch
6b57e9e0f0 Fix Ctrl+C to return to main menu instead of exiting
- artist(): catch KeyboardInterrupt explicitly so Ctrl+C breaks the
  block display loop and returns to caller
- main(): change KeyboardInterrupt handler from sys.exit(0) to
  continue, which loops back to menuSelection()

Users can now press Ctrl+C to exit any screen and return to the menu.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:22:50 -03:00
GaltRanch
4460be7b38 Always fallback to Lite Mode when node config is incomplete
When bitcoincli is empty, go straight to Lite Mode instead of trying
remote mode (which also fails without tls/macaroon). Also validate
remote mode has tls configured before attempting connection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:18:46 -03:00
GaltRanch
da1f8efc64 Add missing codecs import to PyBlock.py
codecs is used in 10+ places for macaroon encoding but was previously
available only via star imports that were removed in the security audit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:17:58 -03:00