1
0
Fork 0
Commit graph

590 commits

Author SHA1 Message Date
0125cd6d4d docs(bot): note the modal channel picker and announce default
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 23:58:08 -04:00
ecdbcbd15b feat(bot): pick the target channel inside the announce modal
- The compose modal gains an optional channel select (text and
  announcement channels), preselected with the configured default
- /announce now posts only to the announce channel by default: the ops
  fallback is gone, so an unconfigured announce channel errors instead
  of silently posting to ops
- Roll call was already ops-only and is unchanged

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 23:58:03 -04:00
cb62a2f1b7 docs(bot): document the announce modal composer
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 21:33:59 -04:00
bfffb5fdd3 feat(bot): compose announcements in a paste-friendly modal
- /announce with no message opens a modal: optional title field plus a
  4000-char paragraph body for multi-line markdown
- Target channel rides in the modal customId; staff is re-checked on
  submit and the post goes out as the same amber Announcement embed
- Inline message flow unchanged; modal submits route under ptf-announce:

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 21:33:55 -04:00
09ed08caf3 fix(dashboard): make stretched cards fill cells and truncate instead of overflowing
- Widget wrappers use flex-1 with a min-w-0 chain so cards stay at their
  grid-cell width instead of shrinking to content or overflowing it
- ItemContent gains min-w-0 so nowrap text ellipsizes inside the card
  (notifications, campaigns, tickets) rather than clipping at the viewport
- Stretched Service Summary and Mission Briefing top-pack their content;
  Mission Briefing header flips between Next Mission and Last Mission
2026-09-10 20:03:39 -04:00
f0af778713 feat(dashboard): customizable dashboard with personal widgets
- Drag-and-drop widget arrangement (main two-column zone + sidebar) with
  per-widget span resize, persisted to Users.preferences.dashboard.layout
  via saveDashboardLayout (migration included)
- New personal widgets: Wallet, Open Negotiations, My Tickets (View all),
  Recent Notifications (per-row mark as read)
- Widgets that are empty or not visible to the viewer are omitted so they
  never render as empty drag targets
- Registers both pending migrations and regenerates payload types/schema
2026-09-10 20:03:27 -04:00
365e8561ec feat(campaigns): extract CampaignsList with hide-completed toggle
The campaigns page now renders a client-side CampaignsList that keeps the
official/community sections and adds a hide-completed switch.
2026-09-10 20:03:16 -04:00
7180b0aa4c feat(missions): make code name optional, add UGC cover images
- Missions.codeName is now optional (still unique when set); migration included
- Campaign and side-op dialogs accept an optional cover image (uploadUgcImage)
- Reminder toasts, evaluation aggregates, calendar, cards and mission headers
  handle a null code name
- Mission read filter no longer hides drafts by status; visibility follows
  ownershipAndStatus.visibility only
2026-09-10 20:02:47 -04:00
f781e53dc1 feat(story): add chapter table of contents with hover reveal to chronicle page 2026-09-10 17:56:35 -04:00
de2ca66cec feat(voiceover): add hold-to-confirm spoiler gate on recording pages
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 16:14:02 -04:00
c48fee4b4d fix(missions): accept plain-text mod lists and keep side op narrative collapsed
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 16:13:59 -04:00
0fa6d9abb5 fix(missions): enforce access control on dashboard and intel mission queries
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 16:13:55 -04:00
486fdca2a0 fix(missions): enforce access control on missions pages
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 16:13:51 -04:00
8654eb40fa fix(missions): enforce visibility rules in collection read access
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-10 16:13:48 -04:00
a7c50c5fd0 feat(campaigns): add one-shot glitch hover effects for official campaign cards 2026-09-09 19:42:50 -04:00
8668a59d06 feat(campaigns): split page into official and community sections with tactical official cards 2026-09-09 19:42:50 -04:00
0dd9673690 fix(eod): unlock custom minefields after clearing two sectors 2026-09-09 18:55:00 -04:00
fdf6da5c5b fix(missions): only accept html mod lists for side op uploads 2026-09-09 18:55:00 -04:00
6fe7dd62bd feat(voiceover): add draft status to voice scripts and hide drafts from users 2026-09-09 18:55:00 -04:00
dcaa8c9bbe fix(voiceover): award xp and notify on admin-panel review approvals via hooks 2026-09-09 18:54:58 -04:00
1b552b3a6d feat(voiceover): add admin audio preview for voice submissions 2026-09-09 18:54:58 -04:00
cbe88c141b feat(opord): track per-tier best times with leaderboard column and par backfill 2026-09-09 11:37:51 -04:00
eb77f45b95 feat(opord): add par-anchored speed bonus to scoring 2026-09-09 11:28:39 -04:00
167ac22990 fix(radio): floor unlock-progress readout so it never overstates the threshold
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-09 00:03:36 -04:00
911fc31354 feat(minigames): hide UGC entry buttons until custom content unlocks
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-09 00:03:29 -04:00
285de3ac14 fix(flappy): stop deriving returnTo from x-invoke-path
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-09 00:03:18 -04:00
25975db23f refactor(minigames): move routes, components, and libs under minigames parents
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-09 00:02:59 -04:00
76fbaba293 refactor(minigames): derive custom-page unlock state from shared lib predicates
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 22:38:38 -04:00
455d705eb9 feat(minigames): add UnlockNotice and wire into EOD and radio arenas
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 22:38:38 -04:00
bf491fc9cd feat(eod): add author exposure toggle and reduced-XP copy to custom play
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 15:57:01 -04:00
6d4b5ad297 feat(eod): restrict custom loss reveal and add question-mark fog to hidden cells
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 15:57:01 -04:00
efda519569 feat(eod): pay reduced XP with creator banking on custom minefield runs
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 15:57:01 -04:00
243bb8ae0d feat(minigames): add creator bank and exposure toggle schema with migrations
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 15:57:01 -04:00
987e78babd feat(minigames): add custom payout math and loss-reveal helpers to shared libs
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 15:57:01 -04:00
4fde0fe91c fix(ui): use h-dvh for sheet side variants so panels fill mobile viewports
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 14:45:29 -04:00
1cf11745fe feat(radio): add custom radio test authoring, play, and leaderboard
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 14:41:18 -04:00
52328da8f9 feat(eod): add custom minefield authoring, play, and leaderboard
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 14:41:18 -04:00
5b4842943e feat(minigames): extract shared custom-minigame validation and unlock libs
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 14:41:18 -04:00
1f99e34c0d feat(minigames): add custom minefield and radio test collections with permissions, events, and migration
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-08 14:41:18 -04:00
251bb0506f docs(opord): rename veteran tier detail to extended order 2026-09-08 13:06:00 -04:00
8439dd7e17 docs(opord): drop the linking-question examples from the protocol card 2026-09-08 13:04:43 -04:00
baa1863c2f docs(opord): reframe protocol card copy around game mechanics 2026-09-08 13:03:43 -04:00
840bc27646 feat(opord): add draining timer bar to the 2s unlock countdown 2026-09-08 13:02:28 -04:00
246a5796f8 feat(opord): lock answering behind a 2s countdown per question 2026-09-08 13:00:43 -04:00
50b9b7e46c feat(opord): add garrison, ROE, intel, and secondary objectives with tier scaling 2026-09-08 12:53:36 -04:00
d8ee14ee8d feat(opord): dynamic abort contingency with six options 2026-09-08 12:39:57 -04:00
53dec0b127 fix(opord): wrap quiz option button text instead of overflowing 2026-09-08 12:35:25 -04:00
0996b9b7c2 feat(opord): scale tiers to 10/15/20 questions with expanded briefings 2026-09-08 12:34:37 -04:00
c8c0267d54 feat(opord): soften fairness copy to a polite ask 2026-09-08 12:18:43 -04:00
e52a637f96 feat(minigames): Esc/R reset keybind with hint text for OPORD Recall 2026-09-08 12:13:45 -04:00
5bde9707a3 feat(minigames): fairness note between briefing banner and OPORD canvas 2026-09-08 12:09:11 -04:00
4594912325 feat(minigames): format OPORD Recall grids Arma style as 034-672 2026-09-08 12:04:51 -04:00
3fefb8b4a3 feat(minigames): tier-scaled briefings with relational questions for OPORD Recall 2026-09-08 11:58:15 -04:00
95663924ea feat(minigames): anti-cheat pass for OPORD Recall
- briefing is now self-paced (player clicks Begin recall; no memo countdown)
- recall quiz has a hard server-validated time band per tier (45/60/75s limits, minimum plausible human time, 2.5s grace); scripted instant or over-limit submissions are rejected
- briefing is rendered on canvas: no selectable text in the DOM, copy/cut/context-menu/ctrl-a-c-x-s-p blocked; screenshots remain possible but burn quiz time
- ?seed=<n> URL param pins a deterministic scenario (no server meaning; used by the e2e spec to know the grid)
- e2e spec updated for the new flow and asserts no grid text leaks into the DOM
2026-09-08 11:46:53 -04:00
eaa0325b6d feat(minigames): add OPORD Recall briefing-recall minigame
- seeded OPORD generator (grid, azimuth, H-HOUR, phase lines, codewords, callsign, frequency) in pure lib src/lib/opord-recall.ts with per-tier memo windows (25/18/12s) and quiz sizes (4/6/8)
- server action submitOpordRecallResult validates input, recomputes score server-side, persists to Profiles progression.minigames.opordRecall, broadcasts XP, emits minigame:opord-recall event
- UI at /opord: briefing countdown, one-at-a-time quiz, debrief metres, tier radio group, SSE presence, REST leaderboard per tier
- profiles migration 20260908_152021 (7 additive columns) + XP hook wiring
- nav entries in command palette and NavUser Exercises submenu
- e2e spec plays a full round and asserts debrief + leaderboard row
2026-09-08 11:26:18 -04:00
caca11a60b feat(story): add Chronicle story beats system with reader states and reactions 2026-09-08 01:32:59 -04:00
b64f4b26f4 fix(intelligence): contain friday ops rows on mobile and credit side op hosts 2026-09-08 01:31:01 -04:00
de3db4bd09 fix(missions): stack hero content in flow on mobile and move attendance above details on small screens 2026-09-08 01:31:00 -04:00
949459647d style(roster): use hyphen in the A-Z roster tab label 2026-09-07 05:19:53 -04:00
9f80361d14 style(projects): replace dash separator in sprint date ranges 2026-09-07 05:19:53 -04:00
eb3dc0231c style(locker): replace dash placeholder for grid footprint 2026-09-07 05:19:53 -04:00
5f5072399b style(helpdesk): replace dash placeholder for missing ticket dates 2026-09-07 05:19:53 -04:00
d485a82fa6 style(minigames): replace dashes in leaderboard and radio UI 2026-09-07 05:19:53 -04:00
12b19b3d6a style(banking): replace dash placeholders in activity feed and timestamps 2026-09-07 05:19:53 -04:00
a8d1a8870e style(collections): replace dashes in admin field descriptions 2026-09-07 05:19:50 -04:00
8ee02faa59 style(bot): replace dashes in embed and reminder fallback text 2026-09-07 05:19:50 -04:00
a399f3feab style(profile): replace dash placeholders in profile stats table 2026-09-07 05:19:50 -04:00
da9ea23271 style(logistics): replace dash placeholder on vehicle grid dimensions 2026-09-07 05:19:50 -04:00
a4ea3ea387 style(intelligence): replace dashes with ASCII in mission and campaign views 2026-09-07 05:19:48 -04:00
47d338c868 style(events): replace dashes with ASCII in event log UI 2026-09-07 05:19:48 -04:00
dcb4893b10 feat(storage): split storage permissions and rework manage-storage UI
Deposits/withdrawals of stock (economy-mutating) are now superuser-only, while moving items around (transfer/place/collect) stays open to logistics-qualified users; seed roles updated to match. ManageStorageDialog reworked alongside its toolbar/button/view wrappers, and the structure page wires up the new permission split.
2026-09-07 05:07:53 -04:00
91dc48ad2c refactor(sidebar): group logistics nav into Assets/Operations/Personnel sections
Logistics entries are collapsed into collapsible groups, Personnel moves from its own sidebar section into Logistics, and an Event Log entry is added to Intelligence.
2026-09-07 05:07:51 -04:00
29f7e2b57a feat(events): add global event log page
New /events page rendering the full game event ledger (system + narrative events) with type/target/source/date filtering, backed by a shared shadcn table component.
2026-09-07 05:07:51 -04:00
227885daf7 feat(missions): let side op creators mark their op as Ready
Adds a 'Mark as Ready' control on the mission detail page (owner or missions:update gated) plus the markSideOpReady server action. Status-gated to Concept/Planning/Scheduled; emits a mission:ready event. Stops the daily ready-reminders and lets missionEmbeds post the roll-call.
2026-09-07 05:07:48 -04:00
d757c58c5d feat(missions): daily ready-check reminders for unfinished side ops
Five days before a player-created side op starts, if it is not yet Ready, the creator gets one in-app notification per day (via mission-tick) plus one Discord DM per day (new bot service). Per-server-local-day dedupe via hidden readyReminderWebSentAt/readyReminderDmSentAt markers. The ready-reminder type is excluded from the notification bridge to avoid double-DMing. Markers are nulled on clone.
2026-09-07 05:07:46 -04:00
ffb2c2c5d9 feat(missions): show op host on side op cards and mission pages
Side ops now credit their creator: mission cards get a 'Hosted by X' meta entry and the mission detail page gets a Host chip. Display name preferred over username; only shown for side ops with a populated createdBy.
2026-09-07 05:07:43 -04:00
6bcd38aff6 feat(palette): add account and display quick actions
Add provisioning a personal bank account, toggling background texture and callsign display, and copying the page link; the layout now passes user preferences and personal-account state so the palette can hide or handle them.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 04:37:14 -04:00
c4a24483f6 feat(palette): add missing navigation entries
Cover transfers, projects, Friday Ops calendar, wiki, NPC personnel, awards, voiceover, and the training minigames.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 04:37:12 -04:00
962607b90e feat(voiceover): transcode submissions to mp3 via ffmpeg
Normalize every submission to mono 96 kbps MP3 so takes play everywhere regardless of the recording codec; falls back to storing the original file when ffmpeg is unavailable or fails.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 04:37:10 -04:00
1b422ba1c2 feat(voiceover): collect take descriptions and surface reviewer feedback
Submitters can attach an optional 300-char note to each take, and their own takes list now shows the description plus the reviewer feedback that was previously admin-only.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 04:37:08 -04:00
ea386b9a33 feat(voiceover): limit takes to five per script
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 04:37:01 -04:00
a0fa8889fc feat(voiceover): add take description field to voice submissions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 04:36:52 -04:00
a2a5f7877b style: remove em-dashes from user-visible prose (wave 1) 2026-09-07 01:34:28 -04:00
a96b5de52b fix(voiceover): remove upload mime allowlist and pin upload config in test 2026-09-07 01:34:28 -04:00
d9d0f8f7ae feat(voiceover): add reading guidance panel to the teleprompter 2026-09-07 00:52:26 -04:00
0674371536 fix(voiceover): strip codec parameters from uploaded recording mimetype 2026-09-07 00:52:26 -04:00
399f7f0bcf feat(bot): announce mission modlists in the ops channel 2026-09-07 00:52:24 -04:00
8d6405247e feat(missions): add discord modlist hash marker field 2026-09-07 00:52:24 -04:00
cc60561c52 style(voiceover): format upload mime types list
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 00:34:37 -04:00
db73170da1 feat(missions): schedule Friday side ops in the unit timezone
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 00:34:35 -04:00
11ed89fd10 feat(voiceover): surface script context and spoiler warnings on script pages
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 00:34:34 -04:00
92117374b7 feat(voiceover): add description and spoiler fields to voice scripts
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-07 00:34:32 -04:00
892587c3ba feat(nav): add Friday Ops calendar entry and truncate level label in mini mode
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:55 -04:00
5577976c96 feat(missions): wire side-op controls into the mission detail page
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:54 -04:00
03f699d852 feat(missions): add Friday Ops calendar page and side-op dialog UI
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:54 -04:00
7664aad4ef feat(missions): add Friday side-op scheduling server actions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:52 -04:00
dd15e4f3e0 feat(events): add mission schedule, update, cancel, and move event types
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:50 -04:00
0db0e5a786 feat(intelligence): add lexical briefing text helpers
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:50 -04:00
4f4e2b136f feat(missions): make campaign optional and track side-op creators
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:48 -04:00
6fce7c4f86 fix(xp): floor fractional xp before resolving level
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:46 -04:00
03c76154da fix(wiki): remove callout icon top margin and first-child spacing
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 23:29:46 -04:00
420bd1f411 fix(qualification): reset lane on restart and show whole-second countdown
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:46:44 -04:00
9f35dc7ddd fix(nav): remove duplicated qualification course menu item 2026-09-06 17:24:50 -04:00
dbe8a210fb chore(cms): regenerate payload types for market state and voiceover
Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:23:03 -04:00
db5745d458 fix(version): compose version+commit label when git describe is unavailable
Coolify builds have no git metadata, so fall back to <semver>+<commit sha> in both the version overlay and version-info generator instead of showing a bare version.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:23:03 -04:00
3bc689d572 refactor(nav): flatten sidebar sections into direct links
Replace nested section submenus in Intelligence, Infrastructure, and Personnel with flat per-page links carrying icons; drop the defensive item copying in AppSidebar.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:23:03 -04:00
28250550ab feat(wiki): add rendered template preview to template dialog
Template dialog gains a rendered preview (markdown pipeline + scoped template CSS + HTML templates) alongside the existing source preview, with Rendered/Markdown toggle; editor threads the template maps through.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:23:03 -04:00
44b78ba7d9 feat(voiceover): add submission pages, recorder UI, and server actions
Add /voiceover script list and take detail pages, teleprompter reader, voice capture/recorder components, submission server actions with a 9 MB audio cap, and a Contribute > Voiceover entry in the user menu.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:23:03 -04:00
f83301a923 feat(voiceover): add voice script and submission collections with profile XP
Add VoiceScripts and VoiceSubmissions collections, voiceover event types and event-log targets, the voice-submissions migration, and a voiceover XP group on Profiles counted toward total XP.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:22:50 -04:00
13f2132e25 feat(market): add economy reference prices and per-listing reset tool
Add getReferencePrices (modifier-applied NPC vendor price tip in CreateListingDialog) and resetEconomyState server action with a permission-gated 'Reset economy' button on listing cards for managers.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:22:34 -04:00
d4c8d81e2f feat(economy): ingest purchase demand and price vendor listings from the ledger
Market-tick prices new NPC listings from the economy ledger (base x priceModifier, vendor modifier applied) instead of the old autoPrice +/-15% randomness, and scales restock quantity down under shortage. buyListing records real demand from completed purchases of NPC/vendor stock.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:22:32 -04:00
447df220f5 feat(economy): add economy tick with demand simulation and price modifiers
Add the src/lib/economy service (GM baselines, deterministic per-period demand drift, price modifier computation, event emission) and the economy-tick bin. Gated by GameRules economy.enabled; period-idempotent with a cold-start observation gate.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:22:30 -04:00
ded5d4b341 feat(economy): add market-state collection with supply/demand baselines
Introduce the market-state ledger (one doc per tradeable resource/asset), GM baseline fields on Assets/Resources, global economy knobs on Game Rules, market-state RBAC permissions, and the market-state event target option.

Ultraworked with [Sisyphus](https://github.com/code-yeongju/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 17:22:17 -04:00
56b8b9d320 feat(profile): add code, mark, and horizontal rule nodes to dossier editors
Register CodeNode/CodeHighlightNode, MarkNode, and HorizontalRuleNode in
the DossierExcerptEditors Lexical config so excerpts can use code blocks
with highlighting, inline marks, and divider rules.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 05:36:55 -04:00
db02be7ce9 fix(profile): handle blank dossier excerpt updates
Accept null content in updatePersonalExcerpt/updateIntelExcerpt and store
null when the submitted excerpt is empty instead of an empty Lexical state,
skipping the max-length check for blank submissions.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 05:36:54 -04:00
33174572cc docs: refresh AGENTS.md guides
Update root and per-directory AGENTS.md files to reflect the current
state of the codebase: collection inventory, RBAC registry, base
management, personnel pages, training minigames, Discord bot transfer
and evaluation-reminder flows, banking currency config, migration
wrapper, and Playwright/Vivaldi e2e details.
2026-09-06 05:32:53 -04:00
55a03e8094 feat(wiki): add editor undo/redo, template dialog, highlighting, and formatting
- useEditorHistory: undo/redo stack over the textarea body
- WikiTemplateDialog: insert {{Template}} transclusions from the
  toolbar, with per-template {{param}} placeholder prompts
- WikiEditorHighlightLayer: mirrored overlay highlighting headings,
  directives, and template placeholders over the textarea
- editorHighlight.ts: tokenizer driving the overlay
- formatMarkdown.ts + createFormatUpdate: auto-format the document
- editorFormatting.ts: Tab/Shift+Tab indent/outdent, list
  continuation on Enter, inline bold/italic/code formatting, infobox
  snippet
- WikiEditor: editor and live preview side by side, preview renders
  template CSS/HTML via WikiPreparedBody
2026-09-06 05:32:51 -04:00
51f7c803e0 feat(wiki): add scoped template CSS and developer HTML templates
WikiTemplates gains two fields: an optional css code field injected on
pages that use the template (selectors auto-scoped to a hash-based
.ptf-tpl-* class so templates never collide with each other or the app
shell), and a developer-only html field rendered verbatim (sanitized)
in place of the markdown body when transcluded.

- templateCss.ts scopes/sanitizes CSS, incl. nested at-rules; pages
  and the editor live preview inject scoped styles and drop the Card
  chrome in favor of a full-width article
- templateHtml.ts sanitizes HTML and splits prepared markdown around
  expansion sentinels so raw HTML renders without rehype-raw
- templates.ts adds extractTemplateNames/extractPlaceholders/
  extractDirectiveNames; prepareMarkdown threads an htmlTemplates map
- markdown pipeline gains rehype-highlight for fenced code blocks
- styles.css adds wiki prose typography + infobox demo styling
- docs: demo article and Infobox template authoring guide
2026-09-06 05:32:48 -04:00
60da363a93 feat(profile): add rich-text dossier excerpt editors
Convert the dossier personal excerpt from a plain textarea to Lexical
rich text (matching the intel excerpt) with a 1000-character plain-text
limit, and replace the static read-only cards on the profile page with
inline DossierExcerptEditors: owners edit their personal excerpt,
profiles:intel_excerpt:update holders edit the intelligence record.
Changes are validated server-side (lexicalPlaintextLength) and emit
dossier:personal-excerpt-update / dossier:intel-excerpt-update events.
2026-09-06 05:32:23 -04:00
c37a848d66 refactor(nav): group minigame links into Exercises submenu
Collapse the four training minigame entries (Flight Simulator,
Minefield Clearance, Radio Traffic, Qualification Course) into a
single DropdownMenuSub under the user menu.
2026-09-06 05:32:04 -04:00
fb83250ff5 fix(sidebar): ignore toggle shortcut while typing in inputs
Skip the Cmd/Ctrl+B sidebar toggle when the event originates from a
TEXTAREA, INPUT, or contentEditable element so editor shortcuts work.
2026-09-06 05:32:04 -04:00
bcd6d97ff4 refactor(market): pass currency config through negotiation panel
Renders negotiation amounts from the full CurrencyConfig, matching the other market components.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:21 -04:00
e3c4eada09 feat(bot): add post-mission evaluation reminder DMs
Sends one-shot DMs once a mission is evaluable asking members to rate their leadership (and leaders to rate subordinates), gated by a new evaluationRemindersSentAt marker on Missions with its migration. Adds the /remind-evaluations staff command (manual trigger/sweep) and DISCORD_EVALUATION_POLL_MS config; updates bot and root docs.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:17 -04:00
0f7d3a57e3 feat(personnel): add npc contacts directory and statistics pages
Adds a Personnel nav group with Contacts (searchable NPC directory with profile pages showing listings and employment) and Statistics pages; moves Wiki under Intelligence and checks off the corresponding TODO item.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:14 -04:00
9e44b69714 feat(base): add structure staffing and upgrade management UI
Adds hire/terminate staff actions and an upgradeStructure server action plus baseManagement components (employment card, hire dialog, staff roster, upgrade card) wired into the structure detail page.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:14 -04:00
06dbf5b796 feat(admin): add collapsible group field
Wraps Payload's group field in a Collapsible so long groups (e.g. profile minigames) can start collapsed in the admin panel; refreshes the import map.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:11 -04:00
4e9c539682 feat(base): add base tick bin for salaries, maintenance, and upkeep
Registers the base-tick bin: pays staff salaries from the treasury, charges structure maintenance, tracks upkeep shortages from storage, and notifies clients via the game-tick SSE path.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:11 -04:00
c33d0ceb27 feat(base): add staffing service library
Adds the lib/base service layer: hire/fire staff, set labor headcount, storage consumption helpers, and structure upgrade handling, all with event logging and permission checks.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:08 -04:00
b2718b3633 feat(base): add npc staffing and labor classification collections
Adds the npc-staffing and labor-classifications collections, a shared staffing field factory applied to both structure blueprints (Staffing Defaults group) and game structure instances, blueprint-derived staffing defaults on game structure create, staff-hiring toggles on Game Rules, and their database migrations.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:08 -04:00
854c525b07 feat(events): add staffing, upkeep, and upgrade event types
Adds staff:hired/terminated/headcount-set, staff:salary-paid/unpaid, structure:upgraded/maintenance-paid/maintenance-unpaid/upkeep-short event types and registers npc-staffing as an event target collection.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:24:02 -04:00
86464b528a refactor(market): reuse banking treasury account helper
Drops market's local treasury account lookup in favor of getTreasuryAccountId from the banking lib, re-exported for compatibility.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:23:57 -04:00
80ec3a0386 refactor(market): pass currency config through market UI
Market listings, offer dialogs, negotiation panels, and history now render prices from the full CurrencyConfig (symbol + singular/plural) instead of a nullable currency label string.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:23:57 -04:00
52ecc4f3b6 refactor(banking): pass currency config through banking UI
Banking overview, cards, detail, and activity feed now render amounts from the full CurrencyConfig (symbol + singular/plural) fetched from Game Rules instead of a plain currency label.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:23:57 -04:00
8205c33768 feat(banking): add configurable currency display names
Adds a Universal Currency group to Game Rules (name, symbol, singular, plural, denomination) with a CurrencyConfig reader in the banking lib that pluralizes labels and prefixes symbols; registers the game_rules migration.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:23:53 -04:00
f904522683 chore(cms): regenerate payload types for currency, staffing, and evaluation fields
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-06 01:23:53 -04:00
5430c02fbc fix(wiki): update placeholder text and improve clarity in wiki editor and standards dialog 2026-09-05 02:07:35 -04:00
28ced660c0 feat(wiki): add wiki navigation and styles
Extract the static sidebar nav data into sidebarData.ts and add a Wiki
entry (BookOpen) to the main nav. Adds scoped markdown styles
(columns, footnotes, note/warning callouts) under .wiki-markdown.
2026-09-05 00:02:20 -04:00
f38962c589 feat(wiki): add wiki pages
Index with search/tag/category tabs, new-page form, slug detail page with
create-CTA for missing pages, edit page redirecting to /wiki/new for
missing pages, and revision history page.
2026-09-05 00:02:18 -04:00
1dac6a0f9a feat(wiki): add wiki UI components
Frontend components for the wiki: content renderer (WikiContent),
editor with live preview and formatting toolbar (WikiEditor,
WikiEditorBody, WikiEditorToolbar, WikiLinkDialog, MarkdownGuide),
index/browse (WikiIndex, WikiStandardsDialog), page toolbar with
lock/delete/history (WikiToolbar, LockdownBanner), and revision history
(RevisionList).
2026-09-05 00:02:09 -04:00
3c6a9c8a42 feat(wiki): add wiki server actions and event logging
Server actions for page create/update, revision restore, lockdown, and
delete (moderator-gated via intelligence qualification) plus wiki image
uploads. Adds wiki event types (wiki:page-create/edit/restore/lock/
unlock/delete) and registers wiki-pages/revisions/templates as valid event
log targets.
2026-09-05 00:02:04 -04:00
3ec364a8b9 feat(wiki): add wiki service library and markdown pipeline
Service layer (createPage/updatePage/restoreRevision/setPageLockdown/
deletePage, slugification, template expansion, wikilink preprocessing,
category constants) plus the client-safe markdown rendering pipeline
(react-markdown + remark-gfm + remark-directive) shared by the server
component and the editor's live preview. Adds the three markdown
dependencies to package.json and bun.lock.
2026-09-05 00:02:01 -04:00
01b1a73158 feat(wiki): add wiki collections and database migration
Add WikiPages, WikiRevisions, and WikiTemplates collections (admin group
Wiki), register them in the Payload config, and add migration batch 28
creating the wiki_pages/_texts, wiki_revisions, and wiki_templates tables
plus the three wiki values on the game_event_logs target_collection enum.
Includes the regenerated payload-types for the new collections.
2026-09-05 00:01:58 -04:00
72715c42a4 fix(leaderboards): match active players by user id
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphus.ai>
2026-09-04 12:04:44 -04:00
dd2c868c89 fix(qualification): expose updated aim trainer leaderboard data
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphus.ai>
2026-09-04 12:04:44 -04:00
15e5fa7d01 feat(qualification): update aim trainer instructions
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphus.ai>
2026-09-04 12:04:44 -04:00
b905fe2b5e feat(qualification): handle civilian gameplay feedback
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-04 12:04:44 -04:00
6c7a9fb5e2 feat(qualification): render civilian targets
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-04 12:04:44 -04:00
dc9d2f4605 feat(qualification): validate civilian hit results
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-04 12:04:44 -04:00
7d6a4bd671 feat(qualification): add civilian target scoring rules
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-09-04 12:04:44 -04:00
cfa29a64ea feat(qualification): add aim trainer restart keybind 2026-09-04 01:40:46 -04:00