Skip to content

Apps: brand icon, phone features (QR, share, shortcuts, haptics), richer extension, PWA track, Groq - #132

Merged
lain-labs merged 9 commits into
masterfrom
claude/apps-groq-pwa-extension
Nov 3, 2026
Merged

lain-labs merged 9 commits into
masterfrom
claude/apps-groq-pwa-extension

Conversation

@lain-labs

@lain-labs lain-labs commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Что внутри

Иконка. Вместо тонкого контурного куба — фирменный чёрный кубик (бирюзовые рёбра, глаз / гексаграмма / <Ø>), нарисованный вектором (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.
  • Laravel: новые tests/Frontend/MobileShellTest.mjs + LocaleMessagesTest + StoreEditionTest зелёные локально; Pest (ArenaAutomationTest, PHP 8.5) — в CI.
  • Android-сборка: запущен ручной прогон Apps на этой ветке (публикует только артефакты).

После мержа

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

…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
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-03T17:04:02.588442Z a97e2b0 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +42 to +44
const match = /^(?:pay-)?(0x[0-9a-fA-F]{40})(?:@(\d+))?(?:\/.*)?$/.exec(
body,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Comment on lines +33 to +35
if (scheme === null) {
return null;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +235 to +237
// 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) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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
@lain-labs
lain-labs merged commit 14c6397 into master Nov 3, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants