merge development into main #18

Closed
salmaelsoly wants to merge 46 commits from development into main
Member
No description provided.
Introduces a workspace Makefile with standard build/install/test targets and three new crates:
- hero_slides_sdk: SDK library crate
- hero_slides_server: server with RPC, PDF generation, config, and discovery modules
- hero_slides_ui: UI binary crate with assets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move monolithic src/ to hero_slides crate
- Add hero_slides_examples for usage examples
- Consolidate SDK, Server, and UI into dedicated crates
- Add UI static assets (Bootstrap, CSS, JS)
- Add UI documentation and templates
- Add example slide decks with generated outputs
- Update workspace Cargo.toml and Makefile
- Generate OpenRPC client bindings

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Add log modal component to base template for viewing generation progress
- Implement modal styling with section headers, status indicators, and stats
- Add SSE endpoint structure for future real-time log streaming
- Update generation functions to show detailed progress:
  * Display preparation, generation, and completion phases
  * Show slide-by-slide progress with success/skip/fail indicators
  * Display PDF generation steps (scanning, validating, creating, optimizing)
- Add log helper functions for styled output (info, success, warn, error, section)
- Update all generation workflows to open log modal and display progress
- Add futures dependency for async stream support

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Slide Editing & Content Management:
- Add slide.getContent RPC method to read slide markdown
- Add slide.saveContent RPC method to persist edits
- Add slide.listVersions RPC method to show version history
- Add slide.restoreVersion RPC method to revert to previous versions
- Implement version archiving when slides are generated
- Add marked.min.js for markdown preview rendering

Presentation Mode:
- Add present.html template for fullscreen slide presentation
- Add /present endpoint with deck navigation parameters
- Support deck path query parameter for presentation mode

Generator Enhancements:
- Add archive_version function to store generated slide versions
- Track slide generation history for rollback capability

Log Modal & Progress Display (from previous commit):
- Log modal shows generation phases and completion status
- Display step-by-step PDF generation process
- Color-coded logs (info, success, warn, error, section)
- Real-time stats footer with generation metrics

UI Improvements:
- Markdown editor support in dashboard
- Version history panel for slide snapshots
- Context menu system for editor actions
- Full-screen presentation mode

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Add browser-based voice recorder to slide editor toolbar
- Transcribe audio via Whisper Large V3 Turbo (Groq)
- Clean transcription with Mercury2 (preserving meaning/structure)
- Add "Convert to Instructions" button using Gemini 3.1 Flash Lite Preview
- New RPC methods: voice.transcribe and slide.toInstructions
- All AI calls use herolib_ai with spawn_blocking for async safety

#2

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Clicking a deck row now calls viewDeck() to switch to Slides tab instead of openPresentation()
- Version history panel now shows a horizontal scrollable slide strip above the vertical history list
- Added renderVersionSlideStrip(), selectVersionSlide(), and loadVersionHistory() functions
- Added CSS for .version-slide-strip, .version-slide-thumb, and .version-selected-label

#3

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Save scan path to localStorage on scan, restore on page load
- Fix deck row click to call viewDeck() instead of openPresentation()

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Before converting, the original editor content is saved in memory.
On success, a Restore button appears next to To Instructions.
Clicking it puts the original text back and hides the button.
The saved content is cleared when the editor is opened or closed.

#5

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements slide structural operations that rename all affected files
atomically — source .md, output PNG, .versions dir, and metadata.toml
keys — preserving full version history after every operation.

- New `slide_ops` module with parse_slides, insert_slide, delete_slide,
  move_slide using collision-free rename ordering
- Three new JSON-RPC methods: slide.insert, slide.delete, slide.move
- UI context menu actions wired into slide cards (right-click)
- 5 new unit tests covering boundary positions; all 17 tests pass

#7

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Implement URL hash routing: #decks, #slides/{deck}, #slide/{deck}/{name},
  #slide/{deck}/{name}/history, #presentation/{deck}, #stats, #admin, #docs
- navigateTo() updates history.pushState and applies route state
- applyCurrentRoute() restores full UI state from URL on load/popstate
- Tab clicks, deck select, editor open/close, version panel all update URL
- Browser back/forward navigates through all state transitions
- Fix deck dropdown onchange to call navigateTo instead of loadSlidesForDeck
- Makefile: make run now uses debug build (installdev) for fast iteration
- Makefile: restart uses hero_proc stop+start if already registered
- Makefile: stop kills socat by port via lsof instead of fragile pkill pattern
- Add _stop_socat/_start_socat helper targets for reuse across run/stop

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix move_slide to use positional indices instead of file number prefixes,
  preventing incorrect moves when file numbers have gaps
- Exclude tmp_moving_slide.md from slide parsing during move operations
- Expand slide_to_instructions AI system prompt to support dual mode:
  raw/spoken input vs already-structured slide instructions
- Add new lhumina example slides: 01_weather, 05_team, 09_thank_you
- Renumber lhumina deck (02–08) to accommodate new slides
- Add examples/sample_deck/03_weather.md example
- Extend RPC, generator, parser, PDF, discovery, and dashboard UI with
  related supporting changes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Closes #8

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements issue #9: sort jobs newest-first, add checkbox-based multi-select
with bulk delete via new jobs.delete RPC, open job log in a new browser tab
via hash routing, and fix the non-functional X close button to use window.close().

#9

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mirrors the existing fix/rewrite feature from the instructions editor
to the per-slide markdown editor overlay.

- agent.rs: FIX_SLIDE_SYSTEM_PROMPT, REWRITE_SLIDE_SYSTEM_PROMPT, handle_fix_slide_content(), handle_rewrite_slide_content()
- rpc.rs: dispatch arms for slide.fixContent and slide.rewriteContent
- openrpc.json: method schemas for both new RPC methods
- index.html: Fix (bi-bandaid) and Rewrite (bi-stars) buttons in #editor-overlay toolbar
- dashboard.js: fixSlideContent() and rewriteSlideContent() functions

#8

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All AI prompt strings are now loaded from .md files in a prompts/ directory
at the deck root. On deck.scan or deck.create the directory is auto-seeded
with embedded defaults, letting users customise every prompt without
recompiling. Variable substitution uses {{variable_name}} syntax.

Closes #11

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- slide_save_content now snapshots the .md to output/.versions/<name>/vNNN.md
  before overwriting, so every edit is reversible
- slide_restore_version works for content-only versions (no PNG required);
  also clears the hash so the slide is queued for regeneration after restore
- slide_list_versions returns all versions with either a .png or .md file
- next_version_number helper scans both .png and .md so numbering stays in
  one unified sequence across image and content versions
- RPC slide.listVersions now includes has_image and has_content per entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Book-style context files explaining what each slide is about, what it
argues, and the background reasoning behind it — not instructions, but
narrative reference for the Lhumina deck.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- hashing.rs: SlideMetaEntry gets hidden: bool with #[serde(default)]
- types.rs: SlideFile gets hidden: bool field
- deck.rs: slide_list() populates hidden from metadata; new slide_set_hidden()
- pdf.rs: hidden slides are skipped during PDF generation
- rpc.rs: slide.setHidden handler; hidden field in slide.list response
- openrpc.json: slide.setHidden schema
- dashboard.js: toggleSlideHidden() + eye/eye-slash button on slide cards
- dashboard.css: hidden cards get opacity 0.45 + grayscale + Hidden badge
- Remove slide.toInstructions feature entirely (backend, Rhai, prompts)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements structured background content discovery, selection, and prompt
injection so users can organize reusable context (company info, market data,
style guides) in content/background/ subdirectories and include them in
slide generation prompts.

#12

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove deprecated slide examples (code_has_no_value, weather, hugo)
- Reorganize geomind slides with new structure (06_team through 18_myimage)
- Update lhumina presentation slides with new content
- Add new example directories (ourworld, ourworld_light, tiers-datacenters)
- Update meeting_notes, miami, and sample_deck examples with new versions
- Add system prompts and instructions documentation
- Update core: deck rendering, dashboard UI, and templates

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Update dashboard CSS with styling improvements
- Enhance dashboard JavaScript interactivity
- Update index template markup

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Left-side panel in Slides tab for browsing, uploading, and managing
background/context files (.md and .pdf) per deck. Includes folder CRUD,
drag-and-drop upload, file move between folders, and PDF text extraction
for AI context.

#13

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Admin tab shows AI prompt templates with customized/default status.
New Templates tab provides a split-pane markdown editor for editing
prompt templates with live preview, save, and reset-to-default.

#14

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Axum default 2MB body limit was blocking PDF uploads via base64 JSON-RPC.
Raised to 50MB on both server and UI proxy. Added CSS for multi-select
highlighting in the background panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a PDF is uploaded to a background folder, automatically extract
its text content using pdf-extract and save it as a .md file alongside
the PDF. This makes the content visible/editable in the panel and
directly usable as AI context. Skips if a .md with the same name
already exists to avoid overwriting user edits.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New bg.extractPdf RPC method and context menu option to force-extract
text from PDF files into a companion .md file. Works with multi-select
— right-click multiple PDFs to extract them all.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix template editor textarea styling (missing CSS selector)
- Fix template tab height to fill viewport properly
- Include background features, PDF extraction, and other updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two of three voice transcription call sites used a non-existent
/api/voice-transcribe REST endpoint. Converted to use the working
voice.transcribe RPC method with base64 encoding.

Also includes template editor CSS fix and other pending changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix conflicts
All checks were successful
Test / test (pull_request) Successful in 2m18s
Test / test (push) Successful in 3m5s
463319f04f
Merge pull request 'feat: add test and release workflows' (#17) from development_workflows into development
All checks were successful
Test / test (push) Successful in 2m28s
Test / test (pull_request) Successful in 1m59s
Build Linux / build-linux (linux-amd64-musl, false, x86_64-unknown-linux-musl) (push) Successful in 2m30s
1f656c4f46
Reviewed-on: #17
salmaelsoly closed this pull request 2026-04-05 10:14:35 +00:00
All checks were successful
Test / test (push) Successful in 2m28s
Test / test (pull_request) Successful in 1m59s
Build Linux / build-linux (linux-amd64-musl, false, x86_64-unknown-linux-musl) (push) Successful in 2m30s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/hero_slides!18
No description provided.