Add clickable commit links in check_suite formatter output with fallback
URL when html_url is unavailable. Remove check_run from checks template
since formatter only handles check_suite events.
Add a platform-aware route target system so a single route can forward
to several destinations at once (e.g. a Discord channel and a Telegram
group). Route.target becomes Route.targets[] with per-entry platform,
channelId/threadId for Discord and chatId/topicId for Telegram; the
legacy single-target format is normalized on load and accepted by the
admin API.
Implement the Telegram driver with HTML rendering and Bot API
sendMessage (chat_id + message_thread_id for topics, retry on 429/5xx),
plus /gh commands served over POST /telegram/webhook: login, logout,
comment, merge and close. The comment/merge/close commands resolve the
issue or PR from the replied-to notification message. OAuth binding now
stores a D1 telegram_links mapping and replies with a confirmation.
Sync the Telegram webhook from the scheduled trigger via setWebhook.
Introduce a lightweight useI18n composable (zh default, auto-detect via
navigator.language, manual toggle persisted to localStorage) with full
zh/en dictionaries, and wire translation keys through the console UI.
Add GET/PUT /api/groups/:groupId/routes endpoints that filter and merge
routes by group (backend forces groupId from the path param). Rework the
console so the top level lists groups; entering a group shows and manages
only that group's routes. Drop the route-level group selector and the
now-redundant group badge on route cards.
Add a super-admin-only Groups tab to create, edit and delete groups
(name, admin ids, owner scope). Routes now require a group via a select
in the editor, group names are shown on route cards, and the new
useMe/useGroups composables back the UI.
Add an optional owners[] field to groups (super-admin only). When set,
only webhook events whose repository owner or organization login matches
enter that group's routes; empty owners means no restriction, keeping
existing routes backward compatible.
- types: Group.owners?, groups.ts groupAcceptsOwners()
- webhook.ts eventOwners() extracts repo owner + org login
- discord.ts dispatch skips routes whose group rejects the event owner
- admin-routes.ts validateGroups() validates owners list
Tokenize the legal page palette into CSS variables and add a
prefers-color-scheme:dark override so /terms and /privacy follow the
device theme, matching the landing page and admin console.
Point the homepage Documentation card at the hosted docs site
(https://webhooker.docs.worldexecute.me), language-aware: /zh for
Chinese and / for English. Still overridable via DOCS_URL.
Add a prefers-color-scheme dark palette to the Nuxt console so it
follows the device/OS theme automatically. Tokenize the previously
hardcoded dot-grid, sticky header, switch knob and overlay scrim so
they invert correctly, and set color-scheme: dark for native controls.
Cloudflare Workers Build runs "wrangler deploy" on a fresh checkout,
where admin/dist (a gitignored symlink) does not exist, so the deploy
failed with a missing assets.directory.
- add build.command to generate the Nuxt SPA before bundling
- point assets.directory at the real ./admin/.output/public output
instead of the gitignored admin/dist symlink
Serve a public landing page at / with buttons to the docs, GitHub repo,
Terms, Privacy and the admin login. Relocate the Nuxt admin console from
/ to /admin so the root is no longer the private console.
- add home-routes.ts (bilingual landing, auto dark mode, configurable
DOCS_URL / GITHUB_REPO_URL) mounted at /
- move console to admin/pages/admin.vue; redirect / and unknown SPA
routes to /admin
- point admin login/logout redirects at /admin
Introduce optional route groups so non-super admins can be delegated
edit/view access to a subset of routes and their send logs.
- add Group model and Route.groupId
- add groups.ts (load/save groups, resolveScope, permission helpers)
- scope /api/routes and /api/logs by the caller's accessible groups;
add /api/me and /api/groups (group management is super-admin only)
- require a groupId on every route in validateRoutes
- allow group admins (not just super admins) to sign in to the console