Communitygithub.com

timerise-ai/booking-kiosk

Agent 技能:构建自助触屏预订一体机——七步引导流程、屏幕键盘、无操作自动重置、服务器定价的预订系统,支持容量交易与库存锁定、到店付款或扫码支付、实时可用性刷新、局域网离线故障转移、查找预订并编辑——基于 Next.js App Router,后端无关。

booking-kiosk 是什么?

此技能指导 AI 代理构建一个完全在服务器端信任的自助预订一体机(Kiosk)。适用于触摸屏场景,如健身房、活动场所或服务站,用户无需登录。核心架构基于纯 Reducer(KioskProvider)管理七步流程(服务→日期→时间→人数→装备→摘要→确认),所有价格、容量和优惠有效性在服务器端计算。关键特性包括:不可信赖的客户端(所有状态存储在内存,120 秒无操作自动重置)、内置屏幕虚拟键盘(避免原生键盘干扰)、通过最后变更时间戳实现实时可用性刷新、扫码支付(不离开一体机)、以及局域网离线故障转移。技能强调“硬规则”,如任何一个 fetch 请求都封装在统一包装器中(携带设备密钥和离线回退 URL),库存锁定有 15 分钟 TTL 并在任何失败路径释放。支持 Next.js App Router,并通过清晰的适配契约(如领域实体映射、支付接口、认证机制)保持后端无关性。参考目录提供了详细的实现文档(状态机、屏幕规范、API 契约、后端接缝、实时/离线方案、运维和演进记录)。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/booking-kiosk

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

自助预订一体机

一体机是一种信任模型反转的预订网站:客户端默认未认证且物理共享,因此所有信任存在于服务器端(价格、容量、幂等性),所有状态都是可丢弃的(内存中、自动重置、从不持久化)。此技能中的所有内容都源自这两个事实。

何时使用

  • 构建基于时段容量的自助预约终端(工位 × 时间窗口),支持可选设备和消耗品附加。
  • 为已有在线预订的应用添加一体机模式。
  • 对照下面硬规则审核现有的一体机;provenance.md 记录了每条规则背后的原因。

何时不使用

  • 现场离线后备服务器——那是姊妹技能 island-mode-server;此技能仅定义一体机的客户端故障转移契约。
  • 数字标牌/展示屏——不同的能力(播放,无输入),不同的技能。
  • 面向员工的 POS 或管理预订工具——员工经过认证且可信;此技能的信任模型不适合他们。
  • 普通预订网站——如果后端接缝有用可以借用,但一体机的机制(键盘、计时器、触摸强化)在那里是冗余的。

架构

 KioskProvider(纯 Reducer:步骤、选择、购物车、sessionId)
   │ props: 字典片段        hooks: pricing · equipment · availability
 屏幕:service→date→time→participants→equipment→summary→confirmation
   │                         └─ 侧流:booking-lookup → booking-edit
   ▼ 一个 fetch 包装器(设备密钥 + 离线 base-URL 故障转移)
 /api/kiosk/booking/{create,lookup,add-items,edit}     ← 所有信任决策
   ▼ KioskBackend 接缝:服务器定价 · 促销 · 库存锁定(TTL 15 分钟)
     事务容量重新检查 · 到店/在线支付 · webhook
 实时:location.lastBookingChangeAt → 静默重新获取 → REFRESH_SLOT

关键事实

  1. 用户点击导航;后台刷新从不导航。 SET_SLOT 与 REFRESH_SLOT 的区别在于实时可用性和在购买中途将客户从摘要页面传送开。
  2. 服务器为所有内容定价。 任何与金钱相关的数据都不超过入站线路;客户端总价仅为预览。
  3. 到店付款是弹性路径——预订确认时状态为 PENDING_COUNTER_PAYMENT,不涉及支付集成;一体机在线支付意味着客户扫描的 QR 码,绝不导航离开一体机。
  4. 每个文本输入都打开屏幕键盘 并设置 inputMode="none"。两者缺一不可,否则屏幕不可用。
  5. 库存锁定是 TTL 预留的(15 分钟)并在每个失败路径上释放——清理任务只是安全网,而非机制。
  6. 客户端 sessionId 是幂等性键。 双击、重试、响应丢失:最多一个预订。

硬规则

绝不持久化一体机会话状态。 下一个客户不应看到上一个客户的姓名。内存中 + 120 秒无操作重置 + 30 秒确认重置,并在硬件上验证。

绝不信任客户端的价格、容量或优惠有效性。 服务器计算每笔金额,并对无效优惠返回 PROMO_INVALID;一体机上的客户无法核对金额。

每个一体机请求使用一个 fetch 包装器。 包装器携带设备头部、错误封装和故障转移 base URL,因此认证、错误和离线故障转移同时适用于每个请求。

如果配置了设备密钥,缺少头部则返回 401。 仅在密钥错误时拒绝等同于无认证。

在获取库存锁后,在每个失败路径上释放它们。 保持预留的 409 错误会在整个 TTL 期间冻结库存。

快速开始

  1. 阅读 state-machine.md;实现 reducer 和 provider,运行其测试套件。
  2. 根据 screens.md 的契约,使用宿主的设计系统构建屏幕——键盘、计时器、触摸强化。
  3. 基于 booking-backend.md 接缝实现 api-contract.md 中的路由。
  4. 按照 realtime-offline.md 连接新鲜度和离线功能。
  5. 根据 operations.md 部署并进行冒烟测试。

适配契约

接缝此技能提供宿主提供
领域实体service/station/equipment/consumable + 重命名表其术语(court, kart, bay…)
租户范围locationId 在一体机 URL 中,服务器验证其位置/场地模型
设备认证x-kiosk-api-key 契约密钥管理;可选的每设备令牌
数据访问KioskBackend 接口;Firestore 参考 + SQL 草稿其 ORM/SDK
支付到店状态 + checkout-session/webhook 契约Stripe 或等价物
实时SubscribeFreshness 接口Firestore/Supabase/SSE/轮询
离线NetworkStatus 契约局域网服务器(island-mode-server)或无
UI 原语结构、状态、交互规则按钮、对话框、旋转器、外观
样式布局意图、触摸目标、一个 --primary 令牌其设计系统
字符串字典键树,所有键必需其 i18n 文件,所有语言
验证无依赖守卫其模式库(如有)

参考目录

场景触发关键词参考文档
状态、步骤、reducer、会话、测试step, reducer, GO_BACK, REFRESH_SLOT, sessionId, resetstate-machine.md
屏幕、键盘、计时器、触摸、i18n 键on-screen keyboard, inactivity, countdown, QR, touch target, dictionaryscreens.md
路由、认证、验证、幂等性、错误x-kiosk-api-key, 401, 409, idempotency, PROMO_INVALID, lookup, PIIapi-contract.md
容量、库存、支付、webhook、定时任务transaction, stock lock, TTL, PENDING_COUNTER_PAYMENT, webhook, refundbooking-backend.md
实时刷新、缓存、离线故障转移lastBookingChangeAt, onSnapshot, s-maxage, offline banner, LAN, health pollrealtime-offline.md
部署、门控、运维界面Edge --kiosk, assigned access, heartbeat, feature gate, smoke testoperations.md
模板为何与早期实现不同audit, ledger, kept deliberately, addedprovenance.md

相关技能