294 Commits

Author SHA1 Message Date
973fba0607
feat(phase-3): real-time hypermedia slices and client scripts migration (#58)
* feat(phase-3): migrate events and sessions hypermedia slices and client scripts

* docs(audit): add phase 3 post-implementation audit
2026-08-27 20:35:57 -07:00
06cad3d8fe feat(arch): enforce 400-line ceiling and subdivide vertical slices
- Update AGENTS.md with 400-line hard ceiling and sub-feature slicing rules
- Update scripts/lint_arch.ts to enforce 400 lines max with anti-formatting heuristics
- Subdivide src/shared/ui/ into layout, navbar, and admin layout fragments
- Subdivide src/features/auth/ into modular login, register, and recovery routes/fragments
- Subdivide src/features/admin/ into users, user details, apps, and audit fragments
- Maintain backwards compatibility via fragment index re-exports
2026-08-27 19:55:01 -07:00
8b30b17dbe
feat(arch): implement Phase 2 base vertical slices and shared UI (#57)
- Scaffold shared UI fragments and styles in src/shared/ui/
- Implement full Auth vertical slice in src/features/auth/ with WebAuthn ceremonies and recovery endpoints
- Implement full Admin vertical slice in src/features/admin/ with responsive tables and mobile decks
- Add public client-side JS utilities and pure JS BIP-39 module
- Mount routes in src/main.ts and keep legacy server/ and ui/ quarantined
- Add pure JSX and API tests for Auth and Admin slices
2026-08-27 19:29:08 -07:00
34e9c4a76d chore(audit): fix formatting, lint types, and add Phase 1 audit report 2026-08-27 18:22:13 -07:00
8062283955 chore(plan): move hypermedia plan to in-progress for phase 2 2026-08-27 18:21:55 -07:00
a1909381d5
Merge pull request #56 from mrteye/phase1-arch-setup-14562406403991920726
feat: phase 1 vertical slicing & hypermedia foundation
2026-08-27 18:20:18 -07:00
google-labs-jules[bot]
a613ed2b68 feat: execute Phase 1 architectural hypermedia framework
- Bootstraps `src/core/` foundation (`db.ts`, `valkey.ts`, `spire_ffi.ts`, `main.ts`).
- Adds `auth_guards.ts` for payload capping, CSRF check, and rate limiting.
- Adds `content_negotiation.ts` and `sse_adapter.ts` for Datastar transport helpers.
- Adds `error_fragments.tsx` for standardized Datastar error morphs.
- Introduces `scripts/lint_arch.ts` to block imperative DOM usage.
- Updates `deno.json` with src workspace configs and lint commands.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-28 01:20:01 +00:00
f5c44f8ac5 docs(plan): refine hypermedia migration plan to 5-phase structure with shift-left tooling and AGENTS.md legacy quarantine 2026-08-27 17:52:43 -07:00
9fdb97f3f4
Merge pull request #55 from mrteye/plan-hypermedia-architecture-5555508364227023504
docs(plan): add hypermedia architecture migration plan

migration from the legacy `server/` and `ui/` directories to a domain-oriented vertical slice architecture under `src/features/`. The plan spans four phases: Core Foundation, Base Slices, Real-Time Slices, and Architectural Testing.
2026-08-27 17:17:16 -07:00
google-labs-jules[bot]
ff024cb23b docs(plan): add hypermedia architecture migration plan
Adds a comprehensive, 4-phase execution plan in `tasks/new/` outlining the architectural transition to a Datastar-driven Hypermedia paradigm and Vertical Feature Slicing, adhering to the project's task guidelines and blueprint.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-28 00:16:33 +00:00
f764f28abc minor plan de-dupication update 2026-08-27 17:10:27 -07:00
081cd9c765 feat(arch): adopt hypermedia & vertical slicing paradigm (Datastar + Deno SSR)
- Establish server-driven hypermedia architecture with Datastar to eliminate brittle imperative client DOM manipulation
- Codify vertical feature slicing (routes, queries, fragments co-located by domain)
- Formalize right-sized dual transport: standard text/html for user mutations, targeted SSE for Valkey pub/sub broadcasts
- Define zero-trust guardrails: untrusted client signals, 16KB payload bounds, rate limiting, and data-ignore subtree protection
- Establish hypermedia error protocol (4xx/5xx return JSX error fragments) and mid-stream SSE resilience
- Add active task checklist with granular 1-to-1 items and shared component suggestions
- Update AGENTS.md with AI-optimized engineering principles (SRP, bounded files, flat call chains, distinctive naming)
2026-08-27 16:51:16 -07:00
70542c2dc2 docs(arch): update hypermedia architecture blueprint and AGENTS.md with SSE adapter, mid-stream resilience, and AI-optimized coding principles 2026-08-27 16:44:18 -07:00
f6b5dd3992 fix(sessions): resolve attendees drawer TypeError and PostgreSQL interval syntax error 2026-08-27 13:30:03 -07:00
0a3c147880 fix(events): patch db backfill for legacy users and sync frontend domain drift on rotation 2026-08-27 00:21:34 -07:00
3dcd823e23
Merge pull request #54 from mrteye/jules-3797922055245838917-9136c1df
feat: UI and Event Polish Phase

Completed Phase 6 Final Polish according to the task specification `2026-0826.06.gem.feat.ui.sessions-and-events-final-polish-2305.ph6.md`. Fixes backend rotation vulnerabilities and extension math bugs while implementing high-polish UI elements including bounded 2-row cards, WAI-ARIA compliant delegation tabs, and natural telemetry formatters. Checked against all standard quality gates.
2026-08-26 23:39:02 -07:00
google-labs-jules[bot]
61789f1d45 feat: phase 6 final polish for sessions and events
- implemented universal ingress credential rotation (slug + pin)
- fixed event extension logic (`GREATEST(expires_at, NOW())`)
- added UI formatter logic for natural dates (`formatNaturalExpiry`, `formatNaturalJoinTime`)
- updated event cards to bounded 2-row compact cards
- consolidated CLI expanding snippets
- overhauled WAI-ARIA support for delegation drawers
- removed legacy "Dismiss" mock buttons for cleanly styled "OK" buttons
- updated tests and ensured pure zero-dependency SSR JSX compatibility

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-27 06:38:21 +00:00
5209534d7a new tasks 2026-08-26 23:06:23 -07:00
1e1c0b9244
Merge pull request #53 from mrteye/sessions-ui-overhaul-11815422362335558787
Sessions UI Overhaul Phase 5

Implemented Phase 5 Task Plan for Sessions UI Overhaul: fixed the backend attendee session revocation permission checks to allow event creators to delete sessions; upgraded the EventGuestsDrawer into a fixed slide-over panel on Desktop and bottom sheet on Mobile; added standardized dynamic countdown pills using SSR and client-side real-time ticking; added a multi-event compact density toggle with localStorage memory; optimized the mobile session deck view; fixed unit tests to mock SQL correctly due to SQL query changes.
2026-08-26 21:06:57 -07:00
google-labs-jules[bot]
d86642ce31 feat: Sessions UI overhaul and backend revocation fix
- Update `DELETE /api/sessions/:id` in `server/routes/sessions.ts` to allow event creators to delete guests' sessions.
- Update page hierarchy and top headings in `ui/components/SessionsPage.tsx`.
- Refactor `EventAttendeesDrawer.tsx` to `EventGuestsDrawer.tsx` as a fixed slide-over overlay.
- Add multi-event compact view toggle with `localStorage` persistence in `EventCockpitDeck.tsx`.
- Standardize dynamic countdown pills across `EventCockpitDeck.tsx`, `EventGuestsDrawer.tsx`, `SessionDeck.tsx`, and `SessionTable.tsx`.
- Optimize mobile session deck in `SessionDeck.tsx`.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-27 04:06:19 +00:00
a194844309 docs(tasks): add Phase 5 Sessions UI overhaul, slide-over guest drawer, and revoke fix task 2026-08-26 20:22:39 -07:00
0c4f7ac5d2 fix(ui): relocate Rotate PIN to card operational action grid with full a11y support 2026-08-26 19:41:51 -07:00
86896fa8c3 fix(ui): ensure CLI row is always visible on event cards and expands full command into textarea 2026-08-26 19:40:30 -07:00
8777ae33c8 style(ui): clean Delegate Session button text (remove + and key emoji) 2026-08-26 19:39:04 -07:00
debe95c89b style(ui): polish event deck section title to Event Passes and button to End Event 2026-08-26 19:05:14 -07:00
a53e69d9fb
Merge pull request #52 from mrteye/feat-event-attendee-controls-13863970798268504771
feat: implement live attendee management drawer and session pause

Implemented Phase 4 of the Event & Session Overhaul:

- **Database:** Added `is_paused` flag to `sessions` and `event_passes` tables safely via soft-fail migrations.
- **API (Sessions):** Added `POST /api/sessions/:id/pause` endpoint; updated `session_resolver` to serialize `is_paused` into Valkey caches and the edge middleware (`auth_forward.ts`) to return 403 when paused.
- **API (Events):** Added endpoints to fetch `attendees` (resolving via `guest_<slug>_<seat>` deterministic lookup), `rotate-pin`, and `expand` seats. Secured all event modification endpoints to enforce `created_by` or global admin scope.
- **UI & Scripts:** Built `EventAttendeesDrawer` to visualize live connections, injected the `<EventAttendeesDrawer />` container in `SessionsPage`, added quick controls to the `EventCockpitDeck`, and backed the DOM manipulation seamlessly with vanilla JS in `SessionsScript.tsx`.
2026-08-26 18:55:49 -07:00
google-labs-jules[bot]
0a4f6a8344 feat(event-controls): implement live attendee management drawer and session pause
This commit finalizes Phase 4 of the Event & Session Overhaul:
1. Implements session pause logic across PostgreSQL schema, Valkey cache, and `auth_forward.ts` edge check (`is_paused`).
2. Implements non-destructive operational endpoints (`/api/events/:id/rotate-pin`, `/api/events/:id/expand`, `/api/events/:id/attendees`) with Zero-Trust Ownership verification.
3. Upgrades existing `end` and `extend` endpoints in `events.ts` to utilize robust Zero-Trust Ownership queries (created_by OR isGlobalAdmin).
4. Creates `EventAttendeesDrawer.tsx` to handle live participant inspection and individual session controls (Pause, Revoke).
5. Updates `EventCockpitDeck.tsx` and `SessionsScript.tsx` to mount and drive the new controls via vanilla JavaScript, respecting zero-framework guidelines.
6. Ensures `deno fmt`, `deno task lint`, `deno task check` and `deno test` execute successfully against the new schema and API guards.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-27 01:53:52 +00:00
f6b5f4704c docs(tasks): add and format phase 4 task specification for live event controls 2026-08-26 17:53:26 -07:00
efbf5b9f9a
Merge pull request #51 from mrteye/feat-phase-4-event-controls-plan-6385071723789224813
feat: add Phase 4 event controls task plan
2026-08-26 17:49:12 -07:00
google-labs-jules[bot]
a942a18e82 docs: add Phase 4 event attendee drawer and live controls task plan
Created a detailed Markdown task specification in `tasks/new/` for Phase 4 of the event system overhaul, outlining the database updates for session pausing, API endpoints for live controls, and UI enhancements for the attendee slide-out drawer based on provided architectural guidance.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-27 00:45:21 +00:00
57f5fc7700
Merge pull request #50 from mrteye/feat-sessions-drawer-machine-11417224878052948069
feat(ui): implement 2-state workshop drawer machine and refine session page hierarchy

Reorganized the Sessions page hierarchy to place the Event Cockpit below the main header. Refactored the Workshop Drawer to utilize a strict 2-state container machine for clean transitions between the creation form and the success handoff modal. Implemented UI accessibility enhancements and fixed mobile text wrapping constraints.
2026-08-26 17:14:32 -07:00
google-labs-jules[bot]
d057e080d3 feat(ui): implement 2-state workshop drawer machine and refine session page hierarchy
- Moved `EventCockpitDeck` below main header in `SessionsPage.tsx`
- Refactored `WorkshopDrawer.tsx` to strictly use a 2-state display toggle (`#eventCreateState` and `#eventHandoffState`)
- Added `aria-label`s to copy buttons for accessibility
- Configured `#status-banner` with `role="status"` and `aria-live="polite"`
- Fixed mobile title text wrapping on `#createdEventTitle`
- Fixed script emoji injection logic to prevent double emojis
- Added JS reset logic in `closeDelegateDrawer` to restore drawer states and clear form data

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-27 00:12:50 +00:00
49c071945d test(events): stub isRateLimited at top level for quiet hermetic test execution 2026-08-26 17:00:07 -07:00
f0c10a313d
Merge pull request #49 from mrteye/feat-events-join-reentry-limits-8447618209468736166
feat(events): implement bifurcated join inputs and NAT-safe idempotency

Discovery Links: Added Join with PIN links next to registration options on the login and register pages.
Bifurcated Input Normalization: Updated the Join endpoints to normalize event slugs to LOWER(slug) and PINs by stripping whitespace/hyphens via regex before checking the SQL layer. This allows event slugs to correctly keep hyphens while letting users type in 6-digit PINs without client-side format anxiety.
NAT-Safe Idempotent Cookies: Reworked POST /api/join to use a SELECT operation first to test input matching. If a match is found, the endpoint will check if the user is already authenticated as a valid guest for this specific event (username.startsWith("guest_" + slug)). If so, it successfully redirects with a renewed session TTL instead of claiming an additional seat or duplicating a user account.
Rate Limiting: Added a non-mutating isRateLimited function back to server/ratelimit.ts. The join API checks this limit upfront (5 attempts / 60 seconds). Only failed lookup branches trigger checkRateLimit which increments the counter. Successful attempts bypass the rate limiter, mitigating DoS via brute-forcing while remaining performant.
Testing: Updated events.test.ts to assert normalization paths, rate limit threshold locking, and NAT-safe reusable behaviors, achieving 100% test passing and preserving coverage.
2026-08-26 16:57:50 -07:00
google-labs-jules[bot]
edbceae0fb feat(events): implement bifurcated join inputs and NAT-safe idempotency
- Adds UI links for joining with PIN in Login and Register pages.
- Normalizes event slugs to lowercase (preserving hyphens) and event PINs to strip all hyphens/spaces to handle raw inputs.
- Implements a pre-check rate limit pattern (`isRateLimited`) to safely enforce a max of 5 failed attempts per IP window (60s) without rate-limiting successful authentications.
- Achieves NAT-safe idempotency in `POST /api/join` by extracting and reusing active event guest sessions instead of blindly incrementing claimed seats on every request.
- Integrates complete test suite coverage for these new constraints.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-26 23:57:13 +00:00
455d130f74
Merge pull request #48 from mrteye/jules-phase-1-events-12547370246717086401
feat: Phase 1 Event & Session Overhaul (Guest Ingress & Audits)

Allowed guest accounts to be evaluated in forward-auth
Validated guest account's customScopes and rejected ungranted access
Added Array parameterization and UNION query in getDashboardApps
Mapped customScopes to getDashboardApps in the UI route /dashboard
Wired web and CLI joins in events.ts to auditWrapper.auditLog using correct schema (event.id, {slug, method})
Added auditWrapper.auditLog unit test validations in events.test.ts
Added guest session scope unit tests in forward_auth.test.ts
Moved Markdown tasks logic from tasks/new/ to tasks/complete/
2026-08-26 16:34:23 -07:00
google-labs-jules[bot]
eed5c8a0fd feat: Implement Phase 1 Event & Session Overhaul (Guest Ingress & Audits)
- Allowed guest accounts to be evaluated in `forward-auth`
- Validated `guest` account's `customScopes` and rejected ungranted access
- Added Array parameterization and `UNION` query in `getDashboardApps`
- Mapped `customScopes` to `getDashboardApps` in the UI route `/dashboard`
- Wired web and CLI joins in `events.ts` to `auditWrapper.auditLog` using correct schema (`event.id`, `{slug, method}`)
- Added `auditWrapper.auditLog` unit test validations in `events.test.ts`
- Added guest session scope unit tests in `forward_auth.test.ts`
- Moved Markdown tasks logic from `tasks/new/` to `tasks/complete/`

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-26 23:34:00 +00:00
e88512edad docs(tasks): update phase 1, 2, and 3 tasks with forensic audit-1 hardening 2026-08-26 15:14:48 -07:00
1ef1125b4a docs(tasks): add and format phase 1, 2, and 3 task specifications from jules 2026-08-26 15:06:57 -07:00
cc38815867
Merge pull request #46 from mrteye/feat-event-join-planning-11918200632794003938
story(events): add phase 2 event overhaul planning document
2026-08-26 15:04:38 -07:00
e357a26abb
Merge pull request #45 from mrteye/feature-guest-ingress-task-plan-17304586254181847688
docs: add task plan for phase 1 of events guest ingress
2026-08-26 15:04:30 -07:00
b2ad719252
Merge pull request #47 from mrteye/feat-ui-sessions-layout-drawer-machine-plan-6316789782106551879
feat(ui): generate task plan for sessions layout and drawer machine
2026-08-26 15:04:05 -07:00
google-labs-jules[bot]
5c1be5657e feat(ui): generate task plan for sessions layout and drawer machine
Generates a planning task file in `tasks/new/` detailing the architecture, requirements, and steps for Phase 3 of the Event & Session Overhaul, specifically addressing the page hierarchy, the 2-state drawer machine, and layout bugs.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-26 22:01:09 +00:00
google-labs-jules[bot]
25451ff172 story(events): add phase 2 event overhaul planning document
Adds a new task specification in `tasks/new/` documenting the plan for Phase 2 Event Overhaul,
including PIN discovery, input normalization, rate limiting, and NAT-safe idempotent re-entry
for event joins.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-26 22:01:03 +00:00
google-labs-jules[bot]
4ec15fe35f docs: add task plan for phase 1 of events guest ingress
Adds the task definition markdown file `2026-0826.01.jul.story.events.phase-1-guest-ingress-1400.md` detailing the architectural scope and plan for enabling Traefik ForwardAuth guest ingress, bridging custom scopes to the Launchpad UI via UNION query, and wiring event claim audit logs using event.id.

Co-authored-by: mrteye <1945243+mrteye@users.noreply.github.com>
2026-08-26 22:00:56 +00:00
e9060eee5a fix(test): mock auditWrapper across tests and add assertions for session events 2026-08-26 12:31:38 -07:00
695d44e16e chore(tasks): close out ui decomposition roadmap
- All three phases (Layout, Admin Drawers, WebAuthn deduplication) are now completed
2026-08-26 12:07:15 -07:00
09c2b5d7a7 docs(protocol): strip redundant pre-review summary gate from agent instructions 2026-08-26 12:04:49 -07:00
58d8e54ae5 fix(ui): wire AdminRolesScript and clean unused imports
- Replace inline script in AdminRolesPage with extracted AdminRolesScript component
- Remove unused JSX import aliases and format AdminUserDetailsPage
2026-08-26 11:43:52 -07:00
fa2778d4fe
Merge pull request #44 from mrteye/ui-admin-decomposition-10975413065274099261
feat(ui): decompose Admin UI with separate Drawers and Scripts

Completes the phase 2 of the UI decomposition roadmap for the Admin pages by extracting the drawer components and client-side SSR JSX scripts into modular files.

- Extracted forms (`AppDrawer`, `InviteDrawer`, `RoleEditorDrawer`, `GrantDrawer`) to `ui/components/admin/drawers/`.
- Extracted scripts (`AdminAppsScript`, `AdminInvitesScript`, `AdminRolesScript`, `AdminUserDetailsScript`) to `ui/components/admin/`.
- Updated `AdminAppsPage.tsx`, `AdminInvitesPage.tsx`, `AdminRolesPage.tsx`, and `AdminUserDetailsPage.tsx` to use the components.
2026-08-26 11:38:00 -07:00