mirror of
https://github.com/profullstack/agentbbs.git
synced 2026-08-13 14:27:27 +00:00
Fix/pod public html bind mount (#30)
* feat(pods/admin): root admin alias, default-caps cleanup, pod rebuild script - auth: add `root` as an admin-console route alias (alongside admin/sysop); still gated by $AGENTBBS_ADMINS — the name confers nothing on its own. - pods: drop the now-redundant tuneApt apt-sandbox hack. Rootless podman keeps its default capability set, so apt/chown/su work without disabling the download sandbox. - scripts/rebuild-pods.sh: recreate all member pods (keeps home volumes) so they pick up the current container profile on next `ssh pod@`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(arcade,ui): 80s arcade classics + shared menu theme Arcade games (PRD §5.1), generalizing the sandboxed-PTY DOOM path into an external-game registry: Space Invaders (nInvaders), Pac-Man (pacman4console), Tetris (tint/vitetris), Moon Patrol (moon-buggy). Binaries resolve from assets/bin, PATH, then /usr/games, so a distro install or a hand-built binary lights each game up; missing games are skipped with a discovery hint. Installed on the host via `scripts/fetch-assets.sh --arcade` (apt), wired into setup.sh behind FETCH_ARCADE (default on). UI: new shared ui.Theme.MenuItem widget (accent cursor + badge, description shown only for the focused row) adopted by the hub and arcade menus; the hub groups rows under Features/Sessions headers and the arcade under DOOM/ARCADE/BUILT-IN. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
362b47fdde
commit
e0a267e343
15 changed files with 539 additions and 138 deletions
|
|
@ -3,11 +3,14 @@
|
|||
package about
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
|
||||
"github.com/profullstack/agentbbs/internal/auth"
|
||||
"github.com/profullstack/agentbbs/internal/plugin"
|
||||
"github.com/profullstack/agentbbs/internal/ui"
|
||||
)
|
||||
|
||||
type Plugin struct{}
|
||||
|
|
@ -26,22 +29,57 @@ type model struct{ user auth.User }
|
|||
func (m model) Init() tea.Cmd { return nil }
|
||||
|
||||
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
if _, ok := msg.(tea.KeyMsg); ok {
|
||||
return m, plugin.Exit
|
||||
if k, ok := msg.(tea.KeyMsg); ok {
|
||||
switch k.String() {
|
||||
case "esc", "q", "enter", "ctrl+c", " ":
|
||||
return m, plugin.Exit
|
||||
}
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
var (
|
||||
h = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("#4ade80"))
|
||||
d = lipgloss.NewStyle().Foreground(lipgloss.Color("241"))
|
||||
theme = ui.New(ui.Green)
|
||||
taglineStyle = lipgloss.NewStyle().Italic(true).Foreground(lipgloss.Color("245"))
|
||||
cmdStyle = lipgloss.NewStyle().Bold(true).Foreground(ui.Cyan)
|
||||
)
|
||||
|
||||
func (m model) View() string {
|
||||
return lipgloss.NewStyle().Padding(1, 2).Render(
|
||||
h.Render("AgentBBS") + " — a modern BBS over SSH for humans and AI agents.\n\n" +
|
||||
" ssh bbs@profullstack.com this hub (guests welcome)\n" +
|
||||
" ssh join@profullstack.com register your SSH key\n" +
|
||||
" ssh pod@profullstack.com your own Linux pod (members, $1/mo via coinpay)\n\n" +
|
||||
d.Render("Maintained by Profullstack, Inc. · AgentGames spec at logicsrc.com\n\npress any key to return"))
|
||||
// route is one connection entry point shown in the CONNECT card.
|
||||
type route struct {
|
||||
cmd, desc string
|
||||
badgeVar, tag string
|
||||
}
|
||||
|
||||
func (m model) View() string {
|
||||
const cmdW, descW = 28, 22
|
||||
|
||||
routes := []route{
|
||||
{"ssh bbs@profullstack.com", "the public hub", ui.BadgeOK, "guests welcome"},
|
||||
{"ssh join@profullstack.com", "register your SSH key", ui.BadgeInfo, "free"},
|
||||
{"ssh pod@profullstack.com", "your own Linux pod", ui.BadgeGold, "$1/mo · members"},
|
||||
}
|
||||
|
||||
rows := make([]string, 0, len(routes))
|
||||
for _, r := range routes {
|
||||
rows = append(rows, lipgloss.JoinHorizontal(lipgloss.Left,
|
||||
cmdStyle.Width(cmdW).Render(r.cmd),
|
||||
ui.Body.Width(descW).Render(r.desc),
|
||||
ui.Badge(r.badgeVar, r.tag),
|
||||
))
|
||||
}
|
||||
|
||||
footer := ui.Dim.Render("Maintained by Profullstack, Inc.") + "\n" +
|
||||
ui.Dim.Render("AgentGames spec → logicsrc.com")
|
||||
|
||||
body := lipgloss.JoinVertical(lipgloss.Left,
|
||||
theme.Title("AgentBBS"),
|
||||
taglineStyle.Render("a modern BBS over SSH — for humans and AI agents"),
|
||||
"",
|
||||
theme.Card("Connect", strings.Join(rows, "\n")),
|
||||
"",
|
||||
footer,
|
||||
"",
|
||||
ui.KeyBar("esc/q return to menu"),
|
||||
)
|
||||
return ui.Frame.Render(body)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue