repositories
loading repo index
repositories
loading repo index
repository
loading code, commits, and activity
public Clawd ADK gateway launch mirror
stars
latest
clone command
git clone gitlawb://did:key:z6Mkq5mY...iFZ5/my-project-publ...git clone gitlawb://did:key:z6Mkq5mY.../my-project-publ...2fa351d6docs: add automaton and perps launch sources16d ago| #1 | /** |
| #2 | * clawd — Backroom Screen |
| #3 | * |
| #4 | * Launches the existing HERMES x402 full-screen dashboard. |
| #5 | * Press [b] or Escape to return to the main menu. |
| #6 | */ |
| #7 | |
| #8 | import { createInitialState, addLog } from '../state.js'; |
| #9 | import { fetchMarketData } from '../market.js'; |
| #10 | import { initA2AConnections } from '../a2a.js'; |
| #11 | import { renderFrame, enableRawMode, disableRawMode } from '../renderer.js'; |
| #12 | import { loadPackageInfo, readVaultInfo } from '../sdk.js'; |
| #13 | |
| #14 | export async function runBackroom(): Promise<void> { |
| #15 | const state = createInitialState(); |
| #16 | |
| #17 | addLog(state, 'SYSTEM', 'HERMES x402 booting — OpenClawd Stack v1.7.0', 'info'); |
| #18 | addLog(state, 'SYSTEM', 'Confidential mode: ENABLED', 'info'); |
| #19 | addLog(state, 'SYSTEM', 'Dark DeFi: DISARMED (requires CLAWD holder gate)', 'warn'); |
| #20 | addLog(state, 'SYSTEM', 'Initializing x402 / pay.sh / AP2 / A2A protocols…', 'info'); |
| #21 | addLog(state, 'SYSTEM', 'Press [b] or Escape to return to main menu', 'info'); |
| #22 | |
| #23 | enableRawMode(); |
| #24 | renderFrame(state); |
| #25 | |
| #26 | initA2AConnections(state).catch(() => {/* network not required */}); |
| #27 | |
| #28 | Promise.all([loadPackageInfo(), readVaultInfo()]) |
| #29 | .then(([packages, vault]) => { |
| #30 | state.sdkPackages = packages.map(pkg => ({ |
| #31 | name: pkg.name, |
| #32 | version: pkg.version, |
| #33 | status: pkg.status, |
| #34 | hasDist: pkg.hasDist, |
| #35 | })); |
| #36 | state.sdkPackageCount = packages.length; |
| #37 | state.walletVault = { |
| #38 | available: vault.available, |
| #39 | path: vault.path, |
| #40 | walletCount: vault.wallets.length, |
| #41 | activeAddress: vault.wallets[0]?.address ?? null, |
| #42 | error: vault.error ?? null, |
| #43 | }; |
| #44 | if (state.walletVault.activeAddress) { |
| #45 | state.walletPubkey = state.walletVault.activeAddress; |
| #46 | } |
| #47 | addLog(state, 'SDK', `Loaded ${packages.length} packages; vault wallets: ${vault.wallets.length}`, 'info'); |
| #48 | renderFrame(state); |
| #49 | }) |
| #50 | .catch(err => { |
| #51 | addLog(state, 'SDK', `SDK probe failed: ${String(err).slice(0, 70)}`, 'warn'); |
| #52 | }); |
| #53 | |
| #54 | fetchMarketData(state).catch(err => { |
| #55 | state.error = String(err); |
| #56 | addLog(state, 'SYSTEM', `Market fetch failed: ${String(err).slice(0, 80)}`, 'error'); |
| #57 | }); |
| #58 | |
| #59 | const dataTimer = setInterval(() => { |
| #60 | fetchMarketData(state).catch(err => { |
| #61 | addLog(state, 'SYSTEM', `Refresh error: ${String(err).slice(0, 60)}`, 'error'); |
| #62 | }); |
| #63 | }, 30_000); |
| #64 | |
| #65 | const renderTimer = setInterval(() => { |
| #66 | renderFrame(state); |
| #67 | }, 1_000); |
| #68 | |
| #69 | return new Promise<void>(resolve => { |
| #70 | const cleanup = (): void => { |
| #71 | clearInterval(dataTimer); |
| #72 | clearInterval(renderTimer); |
| #73 | disableRawMode(); |
| #74 | process.stdin.off('data', onData); |
| #75 | resolve(); |
| #76 | }; |
| #77 | |
| #78 | const onData = (data: Buffer): void => { |
| #79 | const key = data.toString(); |
| #80 | |
| #81 | if (key === 'b' || key === 'B' || key === '\x1b' || key === '\x03') { |
| #82 | cleanup(); |
| #83 | return; |
| #84 | } |
| #85 | |
| #86 | if (key === 'q' || key === 'Q') { |
| #87 | cleanup(); |
| #88 | process.exit(0); |
| #89 | } |
| #90 | |
| #91 | if (key === 'r' || key === 'R') { |
| #92 | addLog(state, 'SYSTEM', 'Manual refresh triggered', 'info'); |
| #93 | fetchMarketData(state).catch(() => {}); |
| #94 | } |
| #95 | |
| #96 | if (key === 'd' || key === 'D') { |
| #97 | state.darkDefiArmed = !state.darkDefiArmed; |
| #98 | addLog( |
| #99 | state, |
| #100 | 'SYSTEM', |
| #101 | `Dark DeFi ${state.darkDefiArmed ? 'ARMED ⚔' : 'DISARMED'}`, |
| #102 | state.darkDefiArmed ? 'warn' : 'info', |
| #103 | ); |
| #104 | } |
| #105 | |
| #106 | if (key === 'c' || key === 'C') { |
| #107 | state.confidentialMode = !state.confidentialMode; |
| #108 | addLog(state, 'SYSTEM', `Confidential mode: ${state.confidentialMode ? 'ON' : 'OFF'}`, 'info'); |
| #109 | } |
| #110 | |
| #111 | if (key === 'p' || key === 'P') { |
| #112 | const amount = 0.5 + Math.random() * 2; |
| #113 | state.lastPayment = { |
| #114 | amount, |
| #115 | asset: 'USDC', |
| #116 | resource: '/clawd/analyze', |
| #117 | signature: [...Array(44)].map(() => |
| #118 | 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789'[Math.floor(Math.random() * 58)], |
| #119 | ).join(''), |
| #120 | protocol: 'ap2', |
| #121 | timestamp: Date.now(), |
| #122 | confidential: state.confidentialMode, |
| #123 | }; |
| #124 | state.totalSpent += amount; |
| #125 | state.usdcBalance = Math.max(0, state.usdcBalance - amount); |
| #126 | addLog(state, 'PAY', `pay.sh: ${amount.toFixed(4)} USDC → /clawd/analyze`, 'pay'); |
| #127 | } |
| #128 | |
| #129 | renderFrame(state); |
| #130 | }; |
| #131 | |
| #132 | process.stdin.on('data', onData); |
| #133 | }); |
| #134 | } |
| #135 |