Each rendered plant was fetching 12 files (base + 11 masks) at 0.4-1.5s
per request on the free tier - a cold garden load fired ~250 requests.
Build now packs all 542 images into a data-URI atlas emitted as a
hashed immutable asset; the client resolves art from it with in-memory
memoization of images, masks, and in-flight loads. Falls back to
network paths if the atlas is missing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Stop replaying stale agent-event view jumps on load
Yufok1+1: Claude Fable 5
e43bb65
The HUD applied the latest stored agent event's UI intent on every
fresh open, teleporting players to whatever tab the agent last touched
(lately the Smoke Room). First poll is now a silent baseline; only
events arriving during play move the view.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Open Telegram link in a new tab so it works inside the HF iframe
Yufok1+1: Claude Fable 5
b2c833c
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cache sprite art and masks for a week
Yufok1+1: Claude Fable 5
4f3e9e3
The cache-header fix left /assets_px and /assets_masks with no explicit
policy, so webviews refetched 100+ sprite layers per open after cache
flushes. Art is frozen; a week of explicit caching makes gardens load
instantly after first visit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Splash: browser visitors get a pitch line and Open in Telegram button
Yufok1+1: Claude Fable 5
62170e1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Chat v2: player DMs and agent voice in the Smoke Room
Yufok1+1: Claude Fable 5
c1f0c16
DMs: private threads between growers with conversation list, tap-a-name
to DM from the room, same guards as world chat (no links/handles, rate
limit, 280 chars); ghost names 404, the broker declines small talk.
Agent tools smoke_read/smoke_say under a new 'social' scope let an
authorized agent speak as its player - sharing the player's rate
bucket. Private channels deferred until the guild system.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fix overlay prop typing; disable grow buttons while growing
Yufok1+1: Claude Fable 5
dd065e2
Grow buttons now read "Growing" and stay disabled from timer start to
maturity; also fixes exactOptionalPropertyTypes errors that slipped
into the previous commit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Overlay live countdown chips on growing seedling sprites
Yufok1+1: Claude Fable 5
bf36b76
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cache-bust app entry: version-stamped open URLs
Yufok1+1: Claude Fable 5
55fdd27
Bot open buttons carry a per-boot version param and the splash enters
game.html with a fresh stamp, so stale webview caches can never serve
an old build again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Telegram webviews cache aggressively and were showing stale builds
after deploys; HTML now always revalidates while hashed bundles cache
forever.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Smoke Room: world chat tab
Yufok1+1: Claude Fable 5
947cd1b
Public in-game chat open to free players. Text only, 280-char cap,
5-second per-user rate limit, and a hard filter on links/handles so
the room can never become a storefront. Last 200 messages kept in
world state; client polls every 2.5s in a new Smoke Room tab.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Real-time growth: growTime days become wall-clock seconds
Yufok1+1: Claude Fable 5
6212a21
Growing a seed starts a seedling timer (growTime trait, 1 day = 1s,
clamped 10-300s); seedlings mature automatically when it elapses, even
while the player is away. Breeding and cloning now require MATURE
plants, making growth a real time sink and growTime a strategy stat.
Client shows live countdowns on seedlings and auto-refreshes on
maturation; agent tools report grow status and wait times.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Free-to-play model: 25 lifetime free crosses, pass gates features not entry
Yufok1+1: Claude Fable 5
bd2a0cb
Entry is now free. Free players get FREE_BREED_LIMIT lifetime breeds
(default 25), unlimited cross prediction, full leaderboards, and
read-only market access. The Breeder's Pass gates cloning, market
writes, Agent Control sessions, and breeding past the limit. Splash,
bot copy, and README updated; gardens are never deleted.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove temporary admin-grant test route
Yufok1+1: Claude Fable 5
30179e3
Live payment-path finalization complete: grant verified on production
storage ({"granted":true,"verifiedOnDisk":true}).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TEMP: admin-grant route for live payment-path finalization test
Yufok1+1: Claude Fable 5
24a0508
Guarded by ADMIN_TEST_KEY secret; exercises grantPass/hasPass (the exact
functions the payment webhook calls) on production storage. Removed
after the test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add /help bot command reply
Yufok1+1: Claude Fable 5
a9043a4
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Filter broker rows from leaderboard reads to purge legacy entries
Yufok1+1: Claude Fable 5
fa9566a
The write-skip guard alone left pre-guard broker rows in stored data;
filtering on load hides them immediately and the next save sweeps them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Broker reverse transactions: listings, resale of amassed stock, deal judgment
Yufok1+1: Claude Fable 5
407b140
New broker_make_listing tool lets the broker sell: it prefers relisting
rare genetics amassed from player trades (real secondhand market) and
falls back to catalog clones, always with buyout terms. Offers on broker
listings resolve automatically - accepted at >=75% of listing valuation
with full asset transfer, countered with explicit terms below it.
fill_listing handles broker-resolved offers; broker holdings are
excluded from the leaderboard.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add egress probe route and env-configurable Telegram API base
Yufok1+1: Claude Fable 5
f83d6a5
/telegram/probe reports from inside the container whether example.com,
api.telegram.org, and deno.com are reachable, to scope HF's egress
blocking. TELEGRAM_API_BASE/TELEGRAM_RELAY_KEY env vars let Bot API
calls route through an external relay once one exists.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Retry Telegram webhook registration until it succeeds
Yufok1+1: Claude Fable 5
7bcd006
One-shot setup at boot died on a transient connect timeout to
api.telegram.org, leaving the bot deaf. Retry with backoff and log
attempts so persistent failure is visible as an egress problem.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add PASS_FREE_USER_IDS owner bypass for the Breeder's Pass gate
Yufok1+1: Claude Fable 5
6e4f01b
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Port WEED-SIM from Reddit/Devvit to Telegram Mini App on HF Space
Yufok1+1: Claude Fable 5
3f61b9c
Replace Devvit runtime with platform adapter: file-backed KV under a
Storage Bucket mount, Telegram initData HMAC identity with stable
persisted usernames, Breeder's Pass entitlements via Telegram Stars
(invoice + self-configuring payment webhook). Client runs as a Telegram
WebApp; splash gates entry; agent handoff and agent_bootstrap now point
external agents at /external/mcp with the session-token header. Reddit
plumbing (menu, triggers, post, devvit.json) removed. Node 22 Dockerfile
replaces the Python/FastAPI app; README regains HF Space frontmatter.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Checkpoint Devvit v0.0.26
Yufok1+1: Claude Opus 4.8
616ae7b
Rarity schema + granulated rarity depictions, and a new-plant NEW badge
so freshly bred seeds are not lost in the alphabetized seed list.
- Add src/shared/valuation.ts: 9-tier rarity schema (common -> primordial)
with bounded rarityIndex (0-100 collectibility, generation saturates so
top tiers stay scarce) and unbounded rarityScore (market valuation);
exported via shared/index.ts
- Depict tiers per seed card: rarity-* left-border colors + primordial
glow and matching rarity-chip text colors (index.css, game.tsx:1900)
- NEW badge for freshly bred seeds: newSeedIds diffed against
knownSeedIdsRef, keyed by seed id so it survives sorting, cleared by
acknowledgeNew; is-new pulse + new-badge (game.tsx, index.css)
- breeder: de-dupe offspring strain name against existing seeds
- lab/predictCross: summary_only + downsample to shrink payload
- color: add vibrance() helper; api: summary_only request field;
agentLink route adjustments
Co-Authored-By: Claude Opus 4.8 <noreply@anthr…