Repository navigation
Apps: brand icon, phone features (QR, share, shortcuts, haptics), richer extension, PWA track, Groq - #132
Conversation
…A track, Groq Icon: the brand's black die (cyan edges; eye, hexagram, <Ø>) drawn as vectors by frontend/mobile/scripts/icon.mjs. The Android adaptive icon no longer insets its layers a second time (the cube was tiny and a transparent ring showed), gains a monochrome layer for Android 13+ themed icons, and the same geometry renders the legacy, iOS, Play, PWA, favicon, extension and desktop icons. Phone: launcher shortcuts (Scan QR, Chat, Feed), the camera reading a QR code into the send form (or into a chat in the social-only Play build), the share sheet for an address on Receive, and haptics when hold-to-sign completes — through lib/mobileShell.ts, which uses the app's Capacitor plugins and falls back to web APIs everywhere else. Extension: right-click a selected address, hash, block or .cyber name to open it on Cyberia, the "cy" omnibox keyword, and the wallet docked in Chrome's side panel (Firefox sidebar). PWA: same icon and shortcuts as the app; /download explains that the full wallet is the APK or the web app and the Play build is the social edition; docs/developers/store-distribution.md describes the two tracks and what changes when the D-U-N-S arrives. Groq: the Telegram bot lists Groq's models as groq/<id> next to its main pool; "Talk to Lain" falls back to Groq's free tier; the arena accepts groq/ contestants on the free tier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a97e2b05a7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const match = /^(?:pay-)?(0x[0-9a-fA-F]{40})(?:@(\d+))?(?:\/.*)?$/.exec( | ||
| body, | ||
| ); |
There was a problem hiding this comment.
Reject contract-call payment URIs instead of using their target
For an ERC-20 payment QR such as ethereum:<token-contract>/transfer?address=<recipient>&uint256=10, the address before /transfer is the token contract, not the recipient. This parser silently discards the function and query and returns that contract as the recipient; WalletSend.takeScanned() then inserts it directly into the send form. A user completing the payment can consequently transfer funds to the token contract instead of the intended person. Reject function-bearing URIs if contract calls are intentionally unsupported, rather than interpreting them as ordinary address requests.
Useful? React with 👍 / 👎.
| if (scheme === null) { | ||
| return null; | ||
| } |
There was a problem hiding this comment.
Accept bare receiving addresses for supported non-EVM chains
When scanning a Bitcoin, Litecoin, Solana or Monero address without a scheme, this branch returns null, although the equivalent scheme-prefixed address is supported below. This prevents scanning the wallet's own receiving QR codes for those networks: WalletReceive.vue passes the bare account.address to QrCode. Recognize bare addresses using the relevant chain validators so the new send-form scanner can consume the codes the Receive screen actually produces.
Useful? React with 👍 / 👎.
| // A free-tier key bills nothing per token, so the whole model list behind it is free. | ||
| $freeTier = is_string($model) && preg_match('/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.\/-]{1,120}$/D', $model) && self::directProvider($model) !== null; | ||
| if (! $freeVariant && ! $freeTier) { |
There was a problem hiding this comment.
Update the automation key gates for direct-provider contestants
When both contestants use the newly accepted groq/<id> models and only GROQ_API_KEY is configured, season validation succeeds and the model client can authenticate, but no automatic cycles run. Both ArenaAutomation::tickLocked() and ArenaMultiAutomation::tickLocked() still unconditionally require arena.automation.api_key and return missing_model_key without attempting a decision. Update those gates to check the providers required by the season's models, so a direct-provider-only experiment does not require an unrelated OpenRouter key.
Useful? React with 👍 / 👎.
The digest counted swaps, liquidity, bridges, lending, staking, conversions and pump.fun buys, while the watchers also record NFT mints and sales, domains, zones, prediction markets and bets — none of which ever reached it. They now appear as one Ecosystem block (with the name or question for domains, zones and markets), and a line counts wallets doing anything on chain for the first time in the window: growth, as opposed to the same few people trading more. A window with only newcomers and nothing else stays silent, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
Three breaks, none from the apps themselves: - android-actions/setup-android asks sdkmanager for 'tools' by default, a package cmdline-tools 16 no longer has, so the Android job died before Gradle ran (app-v1.4.2 shipped without an APK). Only platform-tools is installed now; Gradle fetches the platform and build tools. - Windows' PHP has no gmp, which simplito/elliptic-php requires, so composer refused the lock file. gmp and bcmath are enabled. - build-renderer applied the desktop patch unless a reverse check passed; the changes are in master, but edits around them moved the context, so both checks failed. The markers in the staged source decide now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
…ugh Firebase A WebView holds no Web Push subscription, so the app never rang although the site notifies every reachable device of every public action. The app now registers with Firebase Cloud Messaging through the same Notifications button (lib/wallet/push.ts asks lib/mobileShell.ts first), the token is kept against the installation UUID like the Web Push subscription (POST/DELETE /api/analytics/push/fcm, table fcm_tokens), and Broadcaster sends the same notification — titled in the installation's language — over FCM HTTP v1 after the Web Push loop; a token Firebase calls gone is forgotten. A tapped notification opens its url in the app. Off until configured: FCM_CREDENTIALS (the Firebase service account key on the host) for sending, GOOGLE_SERVICES_JSON_BASE64 (repository secret) for the build, which then announces CyberiaPush/1 so the site only offers what the build can do. Small icon: the die's monochrome layer in cyan; POST_NOTIFICATIONS for Android 13+. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
…eatures docs/operations/team-onboarding.md (Russian, for the team): the three projects, which repository holds what, how to work with the AIs through chaos-mcp, the daily and weekly routine, how to release the apps, what never to do. The user guide's apps page now covers the Play social edition versus the full wallet (APK or web app), the shortcuts, QR scanning, sharing, notifications, and the extension's lookup, cy keyword and side panel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
The server addresses channel 'cyberia', which nothing created, so Android filed every notification under Miscellaneous. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
On a phone the recording notice took five lines over the bottom of every page it opened on - on lain-os.com that was the Log in button and the Register link, the first screen of the Lain OS app. Same promise, shorter words, tighter box. The Russian caveat under the wallet total now reads as a sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
…na keys per model A scanned ethereum:<token>/transfer?address=<recipient> code filled the send form with the token contract as the recipient. A code naming a call is now refused. Bare Bitcoin, Litecoin, Solana and Monero addresses - what the wallet's own Receive screen draws - are read; the send form still checks them against its network. Arena automation asked for the OpenRouter key even when every contestant runs on Groq; it now needs the key of each model the season names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
Что внутри
Иконка. Вместо тонкого контурного куба — фирменный чёрный кубик (бирюзовые рёбра, глаз / гексаграмма / <Ø>), нарисованный вектором (
frontend/mobile/scripts/icon.mjs). Почему старая смотрелась плохо: в adaptive icon оба слоя ещё раз сжимались на 16,7 % — куб получался крошечным, по краю была прозрачная кайма. Теперь слои на весь холст, куб внутри безопасной зоны 66 dp, есть монохромный слой для тематических иконок Android 13+. Из той же геометрии — legacy, iOS, Play, PWA, favicon, расширение и десктоп.Телефон. Ярлыки на долгом нажатии (Скан QR, Чат, Лента); камера читает QR в получателя перевода (в соцверсии Play — открывает чат с адресом); системное «Поделиться» для адреса на экране получения; вибрация при подтверждении удержанием. Всё через
lib/mobileShell.ts: в приложении — плагины Capacitor (@capacitor/share,@capacitor/haptics), в браузере — веб-API.Расширение. Правый клик по выделенному адресу/хешу/блоку/имени
.cyber→ открыть в Сайберии; ключевое словоcyв адресной строке; кошелёк в боковой панели Chrome (сайдбар Firefox); Alt+Shift+C. Обоснования разрешений добавлены вcws/listing.md.PWA-трек. Та же иконка и ярлыки;
/downloadобъясняет, что полный кошелёк — APK или веб-приложение, а сборка из Play — социальная. Вdocs/developers/store-distribution.mdописаны два трека и что поменять, когда придёт D-U-N-S.Groq. Telegram-бот показывает модели Groq как
groq/<id>; «Поговорить с Лейн» падает на бесплатный Groq, если OpenRouter не ответил; арена принимает участниковgroq/…на бесплатном ключе.Пуши в приложении (Android/iOS). WebView не держит подписку Web Push, поэтому приложение регистрируется в Firebase и отдаёт токен в
/api/analytics/push/fcm(fcm_tokens). Всё, чтоBroadcasterрассылает браузерам, теперь уходит и через FCM (FcmFanOut). Мёртвые токены удаляются. Перед регистрацией создаётся каналcyberia. Регистрация идёт только в сборке с конфигом Firebase (CyberiaPush/1в user agent).Сводка бота. В ежедневном дайджесте
@cyberia_network_botпоявились блок экосистемы и новички.Документация.
docs/operations/team-onboarding.md— онбординг для нового человека в команде (Орфей);docs/user-guide/apps.md— приложения и расширение для пользователей.Сборка приложений снова работает. Apps workflow:
setup-androidставит толькоplatform-tools, на Windows добавлены gmp/bcmath, патч десктопного рендерера не применяется повторно.UX. Уведомление о записи сессий — три строки вместо пяти: на телефоне оно закрывало нижние кнопки страницы. Подпись под суммой портфеля: «нет цены у 1 из 2 сетей».
Проверка
frontend/extension: 55/55 тестов, сборка обоих движков.frontend/mobile: 14/14,cap syncдля Android и iOS.tests/Frontend/MobileShellTest.mjs+LocaleMessagesTest+StoreEditionTestзелёные локально; Pest (ArenaAutomationTest, PHP 8.5) — в CI.После мержа
php artisan migrate(fcm_tokens),FCM_CREDENTIALSна сервере, секретGOOGLE_SERVICES_JSON_BASE64в репозитории. Задеплоить сайт (магазинная версия решается на сервере), затемgit tag app-v1.5.0 && git push origin app-v1.5.0. Без секретовANDROID_KEYSTORE_*APK будет только debug.https://claude.ai/code/session_01EE7sa63qoP5H9VBsz9PHca
Generated by Claude Code