หน้าหลัก All guides
ZYRA พจนานุกรมคำศัพท์ Glossary
Reference · ใช้คำให้ตรงกัน Reference · one word, one meaning

พจนานุกรมคำศัพท์ Zyra

คำเดียวกันต้องหมายถึงสิ่งเดียวกันทั้งทีม — ทั้งใน spec, PR, ClickUp และ UI copy หน้านี้เป็นเวอร์ชันอ่านง่ายของ zyra-doc/guides/glossary.md ซึ่งยังเป็นต้นฉบับอ้างอิงหลัก

Zyra glossary

One word should mean one thing across specs, PRs, ClickUp and UI copy. This is the readable version of zyra-doc/guides/glossary.md, which remains the canonical source.

ไม่พบคำที่ค้นหา — ลองคำสั้นลง หรือดูต้นฉบับที่ zyra-doc/guides/glossary.md No match — try a shorter word, or check the canonical zyra-doc/guides/glossary.md

1ชื่อ product & moduleProduct & modules

คำที่ใช้ห้ามใช้ความหมาย
ZyraZyRA, ZYRA (ยกเว้นใน constant)ชื่อผลิตภัณฑ์
Virtual OfficeVirtual Office Room, VOโมดูลแผนที่ 2D avatar-based ตัวหลัก
Space BuilderWorkspace List, Workspace Pageหน้ารายการ workspace ทั้งหมด (ชื่อตาม Figma)
Space / WorkspaceOffice, Roomใช้แทนกันได้ — Workspace ใช้ใน backend/DB, Space ใช้ใน UI copy
UseNeverMeaning
ZyraZyRA, ZYRA (except in constants)The product name
Virtual OfficeVirtual Office Room, VOThe main 2D avatar-based map module
Space BuilderWorkspace List, Workspace PageThe screen listing every workspace (name comes from Figma)
Space / WorkspaceOffice, RoomInterchangeable — Workspace in backend/DB, Space in UI copy

2Entity หลักCore entities

Entityความหมาย
Workspaceพื้นที่ทำงาน 1 ชุด มี map, member, capacity — เก็บใน tb_workspace
Mapแผนที่ 2D ใน workspace หนึ่ง — เก็บใน tb_map; workspace หนึ่งมีได้หลาย map (หลายชั้น)
Room / Room Zoneพื้นที่ย่อยบน map สูงสุด 20 ห้องต่อ map
Private ZoneRoom แบบปิด ต้อง Knock ก่อนเข้า (knock_required: true)
Zone Sectionsession ของกลุ่มคนที่กำลังใช้ zone นั้น — tb_zone_section + tb_zone_section_member
Avatarตัวละคร pixel-art ที่แทน user บน map (คนละอย่างกับรูปโปรไฟล์)
Spawn Pointจุดเกิดของ avatar เมื่อเข้า workspace ครั้งแรกหรือหลัง re-join
Office Sessionsession ของ user ที่ active บน map — เก็บใน Redis ไม่ใช่ DB
Presenceข้อมูลว่าใคร online บน map ณ ขณะนั้น (จาก WebSocket + Redis)
EntityMeaning
WorkspaceOne working area with a map, members and capacity — stored in tb_workspace
MapA 2D map inside a workspace — tb_map; a workspace can hold several (multiple floors)
Room / room zoneA sub-area of a map, max 20 per map
Private ZoneA closed room you must knock into (knock_required: true)
Zone SectionThe session of people currently using a zone — tb_zone_section + tb_zone_section_member
AvatarThe pixel-art character representing a user on the map (not the profile picture)
Spawn PointWhere an avatar appears on first entry or after re-joining
Office SessionA user's active session on the map — kept in Redis, not the DB
PresenceWho is online on the map right now (from WebSocket + Redis)

3RoleRoles

Roleสี badgeสิทธิ์
Ownerorange / amberสิทธิ์สูงสุด เชิญได้ทุก role — ออกจาก workspace ไม่ได้จนกว่าจะ Transfer Ownership
Admin / Space Adminpurpleจัดการ member ได้ แต่เชิญได้เฉพาะระดับ Member
Memberblueใช้งาน workspace ได้ ออกได้ตลอด
Pendinggrayถูกเชิญแล้วแต่ยังไม่ยืนยัน — แสดงว่า “รอยืนยัน”
role_ ใน DBระดับระบบ: MEMBER · ADMIN · SYSADMIN (คนละชั้นกับ role ใน workspace)
RoleBadge colourRights
Ownerorange / amberFull rights, invites any role — cannot leave until ownership is transferred
Admin / space adminpurpleManages members but can only invite at Member level
MemberblueUses the workspace; may leave at any time
PendinggrayInvited but not yet accepted — shown as "awaiting confirmation"
role_ in the DBPlatform level: MEMBER · ADMIN · SYSADMIN (a different axis from workspace role)

4Map & zoneMap & zones

คำความหมาย
Collision Layerlayer ที่กำหนด tile ที่ avatar เดินผ่านไม่ได้
Block zonezone type ที่ทำให้ tile ทั้งบริเวณเดินไม่ได้ (ไม่ใช่ object)
Barriercollision tile ที่มองไม่เห็นตรงขอบ private zone — กันเดินเข้าโดยไม่ได้รับอนุญาต
Spotlight zonezone ที่เสียงถูก broadcast ไปทั้งชั้น
Meeting zonezone ที่เข้าโหมดประชุม (video grid + chat ของ zone)
zone tileszone ที่ไม่ใช่สี่เหลี่ยม เก็บเป็น JSONB ใน tb_map_zone.tiles — ใช้ helper ใน lib/zone-utils.ts ห้ามคำนวณ AABB ดิบ
walkable_groupตัวชี้ว่า object เป็นพื้นที่เดินได้ — ใช้ตัดสิน render order ชั้นพื้น
wall_mountedobject ที่ติดผนัง — render อยู่หน้าสุดเสมอ
zIndexลำดับ render: floor < objects < avatars < UI overlay
last_positiontile ล่าสุดที่ user อยู่ ใช้เป็น spawn เมื่อกลับเข้ามา
Tiledโปรแกรมออกแบบ map ที่ export เป็น map.json
TermMeaning
Collision layerThe layer marking tiles an avatar cannot walk through
Block zoneA zone type that makes its whole area unwalkable (not an object)
BarrierInvisible collision tiles along a private zone's edge, stopping uninvited entry
Spotlight zoneA zone whose audio is broadcast to the entire floor
Meeting zoneA zone that switches you into meeting mode (video grid + zone chat)
Zone tilesNon-rectangular zones stored as JSONB in tb_map_zone.tiles — use the helpers in lib/zone-utils.ts, never raw AABB maths
walkable_groupMarks an object as walkable surface — decides floor-level render order
wall_mountedA wall-attached object — always rendered front-most
zIndexRender order: floor < objects < avatars < UI overlay
last_positionThe user's last tile, used as the spawn point when they return
TiledThe map editor used for design; exports map.json

5Movement & engineMovement & engine

คำความหมาย
zyra-enginegame engine ของ Virtual Office (PixiJS) — import จาก @/zyra-engine
WASDเดินด้วยคีย์บอร์ด W/A/S/D หรือปุ่มลูกศร
Click-to-moveคลิกบน map แล้วเดินไปตามเส้นทางที่หาให้
Sprintกด Shift ค้างเพื่อวิ่ง — ค่าความเร็วต้องตรงกันทั้ง client และ zyra-ws
Path-based movementโมเดลปัจจุบัน: move_to (ส่ง path) → server คิด duration_msmoving → จบด้วย stop
force_syncserver สั่งให้ client เด้งกลับไปตำแหน่งจริง เมื่อ state ไม่ตรงกัน
Desyncอาการที่หน้าจอเราและ peer เห็นไม่ตรงกัน (วาร์ป, ลื่นไถล, นั่งแล้วหลุด)
AOI (Area of Interest)grid 16×16 tile ที่ใช้จำกัดการ broadcast ตำแหน่งให้เฉพาะ 3×3 cell รอบตัว
Silent Blockเดินชนสิ่งกีดขวางแล้วหยุดเฉย ๆ ไม่มี error
TILE_SIZE / PLAYER_SPEED32 px ต่อ tile · 120 px/s
TermMeaning
zyra-engineThe Virtual Office game engine (PixiJS) — imported from @/zyra-engine
WASDKeyboard walking with W/A/S/D or the arrow keys
Click-to-moveClick the map and the avatar walks the path found for it
SprintHold Shift to run — the speed constant must match on client and zyra-ws
Path-based movementThe current model: move_to (send the path) → server computes duration_msmoving → ends with stop
force_syncThe server snapping a client back to the authoritative position when state diverges
DesyncYour screen and a peer's disagreeing (warps, sliding, sliding off a chair)
AOI (area of interest)A 16×16-tile grid limiting position broadcast to the 3×3 cells around you
Silent blockWalking into an obstacle just stops you — no error is shown
TILE_SIZE / PLAYER_SPEED32 px per tile · 120 px/s

6Social & presenceSocial & presence

คำชื่อใน UIความหมาย
Waveทักทายส่ง gesture ทักทาย ไม่ต้องอยู่ใกล้ — cooldown 10 วินาทีต่อคน
Followติดตามเดินตาม avatar อื่นอัตโนมัติ เก็บใน Redis เท่านั้น
Knockขอเข้าห้องขอเข้า private zone — คนในห้องกด Allow / Deny
Progressive Cooldownถูก Deny ครั้งที่ 1–2 รอ 30 วินาที, ครั้งที่ 3+ รอ 5 นาที
Spotlight broadcastพูดออกไปทั้งชั้นจาก spotlight zone
Proximity chatวงสนทนาที่เกิดจากการเดินเข้าใกล้กัน
Presenter guardกฎว่าหนึ่ง zone แชร์จอพร้อมกันได้สูงสุด 2 คน
HUDUI ที่ลอยอยู่บนแผนที่ (member panel, chat, minimap, status)
Heartbeatสัญญาณต่ออายุ presence ใน Redis (TTL 35 วินาที)
TermUI nameMeaning
WaveWaveA greeting gesture; no proximity needed — 10s cooldown per person
FollowFollowAutomatically walking after another avatar; stored only in Redis
KnockKnockRequesting entry to a private zone — those inside press Allow / Deny
Progressive cooldownAfter a deny: 30s for the 1st–2nd, 5 minutes from the 3rd on
Spotlight broadcastSpeaking to the whole floor from a spotlight zone
Proximity chatThe conversation circle formed by walking close to someone
Presenter guardThe rule capping one zone at two simultaneous screen shares
HUDThe UI floating over the map (member panel, chat, minimap, status)
HeartbeatThe signal refreshing presence TTL in Redis (35s)

7Availability statusAvailability status

Statusชื่อใน UIความหมาย
availableActiveพร้อมคุย
busyBusyไม่ว่าง แต่ยังรับ Wave
awayAwayไม่อยู่หน้าจอชั่วคราว
dndDo not disturbบล็อก Wave notification ทั้งหมด
offlineออกจาก office แล้ว — ระบบตั้งให้อัตโนมัติ
meetingMeetingสถานะที่ client คิดเอง เมื่ออยู่ใน meeting zone ตั้งแต่ 2 คน — ไม่ได้เก็บใน DB
Custom messageข้อความสั้นที่ผู้ใช้พิมพ์ต่อท้ายสถานะ
StatusUI nameMeaning
availableActiveHappy to talk
busyBusyHeads down, but still receives waves
awayAwayTemporarily away from the screen
dndDo not disturbBlocks all wave notifications
offlineLeft the office — set automatically
meetingMeetingDerived client-side when 2+ people share a meeting zone — never stored in the DB
Custom messageThe short text a user appends to their status
สีของ status ต้องอ่านจาก lib/presence-status.ts เท่านั้น — ห้าม hardcode สีซ้ำในหน้าอื่น
Status colours come from lib/presence-status.ts only — never re-hardcode them elsewhere.

8UI & หน้าจอUI & screens

ชื่ออยู่ที่ความหมาย
Space Builder/หน้ารายการ workspace 3 แท็บ (All / My / Shared with me)
Before Enter Spacemodalpopup เลือก avatar + ตั้งชื่อ ก่อน join
Loading Workspace/workspace/[id]/loadingหน้าโหลด: connect → map → members
Virtual Office/workspace/[id]/playหน้าแผนที่หลักพร้อม HUD
Left Sidebarแถบไอคอนด้านซ้าย (Map, People, Chat, Notifications, Help, Settings, Profile)
Bottom ToolbarMic, Cam, Screen share, Emoji, Wave, Lock
Minimapแผนที่ย่อมุมล่างขวา แสดงโซนและสมาชิก
Zone Enter Panelpanel ที่เด้งเมื่อเดินเข้าโซน (video grid + chat ของโซน)
Knock Overlay / Notificationการ์ดขออนุญาตเข้า และ popup แจ้งเจ้าของห้อง (Allow / Deny)
Status Pickerpopover เลือก availability status
Player Context Menuเมนูตอนคลิก avatar คนอื่น (Wave, Follow, Chat, View profile)
Help Centerpanelปุ่ม “?” → บทความช่วยเหลือ + Contact Support
AdminSidebarcomponents/admin/sidebar ที่ทุกหน้า admin ต้องใช้
NameWhereMeaning
Space Builder/The workspace list with three tabs (All / My / Shared with me)
Before Enter SpacemodalThe popup for picking an avatar and name before joining
Loading Workspace/workspace/[id]/loadingThe loading screen: connect → map → members
Virtual Office/workspace/[id]/playThe main map screen with its HUD
Left sidebarThe icon rail (Map, People, Chat, Notifications, Help, Settings, Profile)
Bottom toolbarMic, cam, screen share, emoji, wave, lock
MinimapThe small map bottom-right showing zones and members
Zone enter panelThe panel that appears on entering a zone (video grid + zone chat)
Knock overlay / notificationThe request card, and the owner's popup with Allow / Deny
Status pickerThe popover for choosing an availability status
Player context menuThe menu on clicking another avatar (Wave, Follow, Chat, View profile)
Help CenterpanelThe "?" button → help articles + Contact Support
AdminSidebarcomponents/admin/The sidebar every admin page must use

9Invite & membershipInvite & membership

คำความหมาย
Invitation Tokentoken ในลิงก์เชิญที่ส่งทางอีเมล — หมดอายุ 7 วัน
Join Linkลิงก์ถาวรต่อ workspace (ต่างจาก invitation token) สร้างใหม่ได้เพื่อยกเลิกอันเก่า
Join Requestคำขอเข้าจากคนที่มาทางลิงก์ — Owner/Admin กด Approve / Reject
Pending Inviteคำเชิญที่ส่งแล้วแต่ยังไม่ถูกรับ
Auto-accept Invitetoken ถูกรับอัตโนมัติหลังสมัคร + ยืนยัน OTP หรือหลัง Google OAuth
Transfer OwnershipOwner ส่งสิทธิ์ให้ Admin คนอื่น — owner เดิมกลายเป็น Admin
Leave Confirmationต้องพิมพ์ชื่อ workspace ให้ตรง (case-sensitive) ก่อนออก
Capacityจำนวนคนสูงสุดที่ workspace รับได้ — เต็มแล้ว WS join จะถูกปฏิเสธ
1 batch = 10 emailเชิญได้สูงสุด 10 อีเมลต่อครั้ง
TermMeaning
Invitation tokenThe token in an emailed invite link — expires after 7 days
Join linkA permanent per-workspace link (unlike the invite token); regenerate it to kill the old one
Join requestA request from someone arriving via the link — Owner/Admin approves or rejects
Pending inviteAn invite that was sent but not yet accepted
Auto-accept inviteThe token is accepted automatically after signup + OTP, or after Google OAuth
Transfer ownershipThe owner hands ownership to an Admin — the old owner becomes an Admin
Leave confirmationYou must type the workspace name exactly (case-sensitive) to leave
CapacityThe workspace's people limit — once full, WS joins are refused
1 batch = 10 emailsUp to ten addresses per invite batch

10WebSocket eventWebSocket events

Eventทิศทางความหมาย
welcomeS → Cstate ทั้งหมดตอน connect (me, players[])
joined / leftS → Cมีคน join / disconnect
move_to / stopC → Sเริ่มเดินตาม path / หยุดเดิน
moving / stoppedS → Cpeer เริ่ม/จบการเดิน พร้อม duration_ms
movedS → Cอัปเดตตำแหน่งความถี่สูง — ส่งเป็น binary frame (0x01)
status / status_changedC → S / S → Cเปลี่ยน availability status
wave / wave_receivedC → S / S → Cทักทาย และ notification ถึงปลายทาง
knock / knock_decisionC → Sเคาะประตู และการตัดสิน allow/deny
room_enter / room_exitC → Sเข้า/ออกห้อง (คนละอย่างกับ media room)
section_syncทั้งสองทางsync สถานะ zone section (จำนวนคน, ล็อกหรือไม่)
capacity_reachedS → Cworkspace เต็ม — connection ถูกปิด
server_drainS → Cserver กำลังจะปิด บอกให้ reconnect ใหม่
EventDirectionMeaning
welcomeS → CFull state on connect (me, players[])
joined / leftS → CSomeone joined / disconnected
move_to / stopC → SStart walking a path / stop walking
moving / stoppedS → CA peer started or finished a walk, with duration_ms
movedS → CHigh-frequency position update — sent as a binary frame (0x01)
status / status_changedC → S / S → CAvailability status change
wave / wave_receivedC → S / S → CA wave, and the notification delivered to the target
knock / knock_decisionC → SKnocking, and the allow/deny decision
room_enter / room_exitC → SEntering/leaving a room (not the same as a media room)
section_syncboth waysSyncs zone-section state (member count, locked or not)
capacity_reachedS → CThe workspace is full — the connection is closed
server_drainS → CThe server is shutting down; reconnect after the given delay

11กฎธุรกิจที่พูดถึงบ่อยBusiness rules people quote

คำความหมาย
Office เต็มonline count ≥ capacity → เข้าไม่ได้
Max 20 roomsจำนวน room สูงสุดต่อ map
Solo Workspaceworkspace ที่มี owner คนเดียวเป็นสมาชิก
Private zone claimการจับจองโซนส่วนตัว — claim ได้ทันที และการ claim ใหม่ย้ายความเป็นเจ้าของ
Screen share max 2หนึ่ง zone แชร์จอพร้อมกันได้ 2 คน
OTPรหัส 6 หลักยืนยันการสมัคร มีเวลาหมดอายุและจำกัดจำนวนครั้ง
Login lockผิดครบจำนวนครั้ง → ล็อกชั่วคราว และล็อกนานขึ้นถ้าเกิดซ้ำ
S3 onlyไฟล์/รูปทุกอย่างเก็บบน Cloudflare R2 ไม่เก็บลง filesystem ของ API
Member API separationmember page เรียกได้แค่ /api/user/* ห้าม /api/admin/*
TermMeaning
Office fullonline count ≥ capacity → nobody else can enter
Max 20 roomsThe room limit per map
Solo workspaceA workspace whose only member is its owner
Private zone claimClaiming a private zone — instant, and a new claim transfers ownership
Screen share max 2Two simultaneous presenters per zone
OTPThe 6-digit signup code, with an expiry and an attempt limit
Login lockEnough wrong attempts locks the account temporarily, longer on repeats
S3 onlyEvery file and image lives on Cloudflare R2, never the API's filesystem
Member API separationMember pages may call /api/user/* only, never /api/admin/*

12Scenario / test idScenario / test ids

Prefixโมดูล
SC-VO-*Virtual Office
SC-SB-*Space Builder
SC-PROFILE-*Profile / Settings
SC-UG-*User Guide / Help Center
SC-UM-*User Management
SC-AV-*Avatar Management
SC-ANC-*Announcement
TC-*test case ที่คู่กับ scenario นั้น
ZYR-{n}เลข ticket ของ support ที่ผู้ใช้ส่งเข้ามา
PrefixModule
SC-VO-*Virtual Office
SC-SB-*Space Builder
SC-PROFILE-*Profile / Settings
SC-UG-*User Guide / Help Center
SC-UM-*User Management
SC-AV-*Avatar Management
SC-ANC-*Announcement
TC-*The test case paired with a scenario
ZYR-{n}A user-submitted support ticket number
ต้นฉบับที่ครบที่สุดคือ zyra-doc/guides/glossary.md — ถ้าเพิ่มคำใหม่ ให้เพิ่มที่นั่นก่อนแล้วค่อยอัปเดตหน้านี้ตาม
The fullest source is zyra-doc/guides/glossary.md — add new terms there first, then mirror them here.