Commit Graph
60 Commits
Author SHA1 Message Date
gitprovandClaude Opus 4.8 9c496bfe19 Seed phone + merit nodes (and NPC contacts) via the graph seeder
authorGraph now seeds merit nodes' awards_flag and phone-node terminals
bound to an NPC (npc key -> npc_id, the callee dialed); authorMystery seeds
cast phone_number/email. Importer types updated so mystery.json can carry
these, matching how Glass Harbour is seeded — the Barricelli graph can now
be authored as data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 17:49:09 +02:00
gitprov 13a270911f Merge branch 'main' of ssh://ramanujan.glitch.university:2222/glitch-university/gupi-osint-board 2026-08-22 17:38:51 +02:00
gitprov 4ec9d98325 Adding scene7 todo 2026-08-22 17:36:20 +02:00
gitprovandClaude Opus 4.8 b029c9bc47 Reusable inventory: 3D tool rack (notebook + phone)
A tool-driven inventory overlay — a three.js rack you cycle with ◀ ▶ and
open with USE. Registry-based (not tied to a level type) so new tools just
add a model + component. Reuses the phone's 3D model; notebook is a blocky
placeholder tool. Dev route /?inventory=1; drop <Inventory/> into the navbar
after the merges.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 17:34:56 +02:00
gitprov af0ffe055e Merge main into Scene 7 evidence workflow 2026-08-22 17:23:47 +02:00
gitprovandClaude Opus 4.8 bbf34bab09 Phone/merit authoring UI: NPC contacts + phone node + terminal NPC picker
Admin NPC editor gains phone number and email fields. The mystery graph
editor gets Phone and Merit in the node palette; a phone node's terminals
each get an NPC picker (bind the callee you reach by dialing their number),
and merit nodes get an "awards achievement" field. Node summaries + type
colors for both.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 17:16:48 +02:00
gitprov 9895b531f2 Recognize National Library patent evidence 2026-08-22 17:16:10 +02:00
gitprov cea0d56cb9 Add Scene 7 claim report workflow 2026-08-22 17:02:30 +02:00
gitprovandClaude Opus 4.8 a925d61b7e Phone directory foundation: NPC contacts + phone node + terminal→NPC
NPCs gain phone_number and email (the phone book). A new 'phone' node type
holds a directory whose terminals each bind to an NPC via npc_id (the callee
reached by dialing that number) and wire to the dialogue that plays on
connect. Migration 029 adds the columns/type; repositories and admin API
thread contacts and the per-terminal NPC binding. Authoring foundation only
— the dial runtime and tools sidebar come next.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 16:55:45 +02:00
gitprovandClaude Opus 4.8 778c6d972f Add merit node type (Scene 8 ceremony + achievement award)
A merit node awards a configured achievement (awards_flag) to the player
the moment the playthrough arrives on it, with node provenance, then
presents a ceremony. Migration 028 extends node_type + the component_key
CHECK and adds awards_flag; the runtime grants the flag in advance/goto/
new-game write paths; MeritHost renders the ceremony (a component_key can
supply a bespoke one, e.g. a 3D model). Verified: teleport to a merit node
auto-grants its achievement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 16:11:53 +02:00
gitprov a7f99a2a39 Implement Scene 7 evidence goal flow 2026-08-22 16:02:42 +02:00
gitprovandClaude Opus 4.8 5c514562a2 Splash case picker + playable-mystery list
GET /api/mysteries returns only mysteries with an entrypoint (empties are
filtered out), and the splash now lists them as case files with a per-case
BEGIN / RESUME action instead of a single hardcoded New Game.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 15:51:32 +02:00
gitprovandClaude Opus 4.8 cd4b8bf4fa Env-driven dev ports + splash as the front door
vite.config.ts now reads WEB_PORT (Vite) and PORT (API) from .env via
loadEnv, with the /api proxy following PORT and strictPort on — so two
branch checkouts can each run `npm run dev` on their own ports.

Play now always lands on the splash at the bare root instead of silently
resuming an active playthrough; a Resume action continues one when present.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 15:43:08 +02:00
gitprovandClaude Opus 4.8 34aa23237e Add docs/routes.md: dev route map + testing recipes
Documents the URL routing (/, /node/:id teleport, /level/:id, /admin,
?phone=1), the demo game-state model (playthrough current_node_id +
achievements), and quick test recipes for the campaign, node teleport,
and the phone achievement seam.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 15:24:08 +02:00
gitprov 70c7506f1d Adding better routing 2026-08-22 15:12:56 +02:00
gitprov 94ccbfd1b9 Adding migrations and lot of work. Starting work on the demo scope 2026-08-22 14:53:23 +02:00
gitprovandClaude Opus 4.8 1893bf23af Add 3D clamshell phone dialer spike + persistent-board design
A diegetic 90s handset rendered as a small three.js scene in a fixed 1:2
portrait stage (visual spike at /?phone=1, three.js lazy-loaded so the
board bundle is unchanged). Blocky flat-shaded clamshell with glowing
keys, a flip-open animation with an intro camera orbit that settles
head-on before the DOM screen appears, a hinge barrel on the pivot axis,
and a chubby antenna. Pressable 3D keypad (raycast + keyboard) with DTMF
tones drives a dialer: connect / voicemail / SIT "unobtainable", against
a stub number->node directory with flag-gated node enablement.

The screen UI is real DOM positioned in percent of the stage, kept
pixel-exact by the head-on ortho camera.

Also documents the persistent-board flow model (docs/persistent-boards.md):
board_key reuse across level nodes, present-but-hidden flag-gated exhibits
with live arrival reveals, reset/new-game semantics, and A/B/M citation codes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:14:11 +02:00
gitprovandClaude Opus 4.8 1b3ff1e78c Add per-node scene music volume control
Author a music track and volume (0-100%) per story node; the runtime
scales it to 0-1 and applies it without restarting the track when only
the level changes. Adds migration 024, threads music_volume through the
repository/runtime, and gives the node inspector a volume slider.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 21:02:16 +02:00
gitprovandClaude Opus 4.8 80e5f548ac Add typewriter clatter during text reveal
A dry synthesized key-clack (filtered noise burst with pitch jitter) plays as
each line types out — every other non-space character — for a detective-terminal
feel. Skipped in the editor preview and when reduced-motion is set.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 20:24:06 +02:00
gitprovandClaude Opus 4.8 6d4026476e Fix SFX: unlock AudioContext from the click, louder/clearer blips
sfx() bailed whenever the context wasn't already 'running', so the autoplay-unlock
race dropped the blips. It's invoked from a click, so resume the context there and
always schedule the tone; bump the envelope and use a triangle wave (with a small
up-chirp on choices) for a more audible cue.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 20:13:51 +02:00
gitprovandClaude Opus 4.8 dafc70b047 Sound: per-node scene music + synthesized SFX (zero-dep)
- migration 023: story_nodes.music_asset_id (references the asset store).
- src/audio.ts: a tiny audio manager — one looping scene-music track (fade,
  dedup, gesture-primed autoplay) and synthesized one-shot SFX; global mute.
- Runtime: RuntimeNode.musicUrl; music follows the current node (null inherits,
  a finished playthrough stops). SFX blips on dialogue advance/choice (not in the
  editor preview). Floating mute toggle during play.
- Graph inspector: a "Scene music" picker sourced from uploaded audio assets.

No external library (we did not adopt react-winamp — it is a React 16 CRA app,
not an installable package). Bundle grew ~2 KB.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:51:44 +02:00
gitprovandClaude Opus 4.8 0b1e5e7fc7 Live dialogue preview in the editors (reuses the real DialoguePlayer)
- DialoguePlayer gains an `inline` mode (fills its container, no window key
  capture) and a `startId` to jump the walk to a given utterance.
- New DialoguePreview: a scaled-down mini player that fetches the resolved tree
  from GET /api/admin/story-nodes/:id/dialogue (same resolver as playback).
- Mystery graph: preview appears next to a selected dialogue node.
- Utterance editor: docked preview that jumps to the clicked/selected utterance
  and refreshes after each edit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:24:03 +02:00
gitprovandClaude Opus 4.8 f10d7584d2 Importer: set asset mime type from file extension
Uploaded manifest assets previously became application/octet-stream because the
Blob carried no type, so images/audio/pdf didn't display or thumbnail correctly.
Derive the mime from the extension. (Existing deduplicated assets keep their old
mime; only fresh uploads are affected.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:12:53 +02:00
gitprovandClaude Opus 4.8 7fe8fadd8a Admin: create/delete mysteries, asset library, cutscene component picker
- Mysteries tab: "+ New" (slug + title) and per-row delete; opens the graph editor.
- Assets tab: upload images/audio/PDFs to the shared osint.assets store, grid with
  thumbnails/icons, copy id/url, delete (blocked with 409 when the asset is in use).
- Cutscene component_key is now a datalist of registered keys with a
  "not registered" warning, instead of free text.

Backend: DELETE /api/admin/mysteries/:id and POST/GET/DELETE /api/admin/assets
(reusing the deduplicated, MinIO-backed asset store).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 19:05:29 +02:00
gitprovandClaude Opus 4.8 3b72f38d00 Make the dialogue/utterance editor vertical, matching the mystery graph
Input on top, output on the bottom, exit sinks in a row below; wires flow
downward. Cards auto-expand, so their heights are measured (offsetHeight) to
place the bottom output port. Seed and Tab-created utterances now stack downward.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 17:59:17 +02:00
gitprovandClaude Opus 4.8 aa789bbadb Cleanup: drop vestigial utterance columns, sync story-graph doc
- migration 022 drops utterances.advances_to_utterance_id and .effect, which the
  parent-only/child-count dialogue model never used; purge their references.
- rewrite docs/story-graph.md to match what was built (parent-child utterances,
  vertical mystery graph, graph runtime, gate stubs).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 16:28:11 +02:00
gitprovandClaude Opus 4.8 ddb3a386f0 Add story-graph narrative system (campaigns, editors, runtime)
Introduce the narrative layer as a directed story-flow graph: an authored
campaign a player walks node by node, replacing the interim slot/chapter model.

Schema (migrations 015-021):
- mysteries, global NPC templates + named poses, per-user playthroughs
- story_nodes, terminals, utterances (the flow graph and dialogue trees)
- clean cutover: retire slot cutscenes/chapters/seen_dialogue

Runtime:
- New Game creates a playthrough bound to the JWT identity (dev test-user fallback)
- advance() walks the graph cutscene -> dialogue -> level -> ..., auto-skipping gates
- branching dialogue: player choices route out through node terminals

Admin authoring:
- NPC editor: upload named poses to the gupi MinIO bucket
- mystery graph editor: vertical node canvas, wiring, entrypoint, delete-by-click
- dialogue crafter: utterance tree, Tab to add child, 1/2 speaker, undo

Content authored via the manifest importer / admin panel and seeded for Glass
Harbour. MinIO added to the dev stack; dev container runs in development mode.

Also includes a folder-widget simplification (removes open/close) and a
resolveUserId auth helper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-18 15:37:46 +02:00
gitprov 0237da74cf Adding working board 2026-08-17 09:24:53 +02:00
gitprov 35685f765a Add document locator beam 2026-08-15 09:34:53 +02:00
gitprov 8f1f5a8743 Gate admin menu and authoring with shared JWT 2026-08-15 09:29:08 +02:00
gitprov eeaa4138fa Improve timeline date legibility 2026-08-15 09:13:30 +02:00
gitprov d99deb3c06 Allow undated reconstructed events 2026-08-14 19:57:22 +02:00
gitprov 703b9652c9 Add drag-to-trash exhibit disposal 2026-08-14 19:37:43 +02:00
gitprov 18705fe55f Render temporal links above timeline 2026-08-14 18:59:50 +02:00
gitprov d722ecae9d fix: stack board tools in portrait 2026-08-14 18:35:54 +02:00
gitprov 21a74e243c fix: add visible brief window controls 2026-08-14 18:33:04 +02:00
gitprov ffa81284df feat: add handwritten cues to text exhibits 2026-08-14 18:30:31 +02:00
gitprov b39d2efa75 feat: drag relation tags along threads 2026-08-14 18:26:20 +02:00
gitprov 5d59af1dd9 feat: create parties outside brief concepts 2026-08-14 18:17:31 +02:00
gitprov 57c8c91f21 fix: connect source documents with red thread 2026-08-14 18:11:51 +02:00
gitprov 38f50848d0 fix: pan board from empty space 2026-08-14 17:59:03 +02:00
gitprov a15b463589 feat: add document content search 2026-08-14 17:57:00 +02:00
gitprov 6f183daca8 feat: support compact and luggage relation tags 2026-08-14 17:07:30 +02:00
gitprov ccef0955d4 refactor: reuse luggage tags for thread labels 2026-08-14 17:02:17 +02:00
gitprov a4b22a574b fix: anchor board zoom to pointer 2026-08-14 16:44:43 +02:00
gitprov f97dceb4fe feat: add tagged red thread connections 2026-08-14 16:37:50 +02:00
gitprov 46bb2ba5ec feat: improve case brief classification flow 2026-08-14 16:18:13 +02:00
gitprov a51b508118 fix: separate desktop wheel and mobile pinch zoom 2026-08-14 15:45:03 +02:00
gitprov 45c7c6a292 feat: add configurable timeline range 2026-08-14 15:40:54 +02:00
gitprov b284275e98 feat: author first playable mystery 2026-08-14 15:02:00 +02:00
gitprov d46a425401 feat: add brief concept party classification 2026-08-14 14:44:58 +02:00
gitprov e333d3b634 feat: add event narrative and evidence workflow 2026-08-14 14:31:52 +02:00
gitprov edfa4c866c refactor: add typed frontend exhibit registry 2026-08-14 14:20:41 +02:00
gitprov c8a870549d feat: add immutable level template lifecycle 2026-08-14 14:17:54 +02:00
gitprov 5599d330d8 refactor: cut over to normalized exhibit schema 2026-08-14 14:09:24 +02:00
gitprov 9702b9c3d9 refactor: isolate level persistence from HTTP routes 2026-08-14 13:57:51 +02:00
gitprov 545eb013bd test: complete persistence and browser safety net 2026-08-14 13:43:37 +02:00
gitprov 9a4da41b49 test: add board and postgres safety net 2026-08-14 12:57:06 +02:00
gitprov ff5e5dc63e chore: establish pre-exhibit project baseline 2026-08-14 12:45:17 +02:00
gitprov fa78640227 Initial commit 2026-08-14 12:43:11 +02:00