TC

TC синхронизированные коммиты с v3.0.2 на TC/arozos-mirror из зеркала

8 часов назад

TC синхронизированные новые ссылки v3.0.2 к TC/arozos-mirror из зеркала

8 часов назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

8 часов назад

TC синхронизированные и удаленные ссылки v3.0.2 на TC/arozos-mirror из зеркала

8 часов назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • c47f3377ad File manager: pane splitters, upload pause/resume, UI polish Major file explorer overhaul across multiple areas: - Add draggable splitter handles between sidebar, file list, and properties panes (splitter.js) - Implement WebSocket upload pause/resume with server-side pause timeout (2h), idle timeout constants, atomic state tracking, and heartbeat keep-alive during pauses - Redesign popup dialogs as rounded bottom-right cards instead of full-height panels - Fix mobile double-tap to open files; fix breadcrumb path display on mobile - Fix hideSearchBar being called defensively when search was never open (was resetting view mode) - Fix zoom control display mode after rotation (inline style vs media query conflict) - Fix upload button click being swallowed during icon swap on progress ticks - Add cancel button shown only while paused; collapse upload panel when dialogs open - Support ArozOS File Manager drag-and-drop in 3D Viewer - Add forgetUploadTask() to clean up all task state on removal - Localize pause-expired message in 6 languages - Update Code Studio icons, desktop file type icons, and file thumbnail SVG centering

2 дней назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 50efd4f97b Optimized mini game list
  • 3a67d37827 Add Games web app with 5 playable mini games Introduce a new `Games` module under `src/web/Games` with an AGI registration script and a landing page that links to Minesweeper, Tetris, Snake, Memory, and Pong. Each game is implemented as a standalone HTML app with in-page styling, controls, scoring/state handling, and restart/back navigation. Also update `.gitignore` to exclude `/.kilo`.
  • Просмотр сравнение для этих 2 коммитов »

5 дней назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 1ac163cb58 Prioritize LAN MACs in mDNS broadcast data Add `getMaxMacAddrString(maxLength)` to build a capped MAC address list from local interfaces, prioritizing interfaces with private LAN IPv4 ranges (10/8, 172.16/12, 192.168/16) before others. Update `NewMDNS` to use this helper with a 128-character limit when populating the `mac_addr` TXT record, replacing the previous full join of all MACs.

6 дней назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

6 дней назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 825b716948 Update multiple dependencies and add LoongArch64 support (#300) * Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump golang.org/x/image from 0.33.0 to 0.41.0 in /src (#265) Bumps [golang.org/x/image](https://github.com/golang/image) from 0.33.0 to 0.41.0. - [Commits](https://github.com/golang/image/compare/v0.33.0...v0.41.0) --- updated-dependencies: - dependency-name: golang.org/x/image dependency-version: 0.41.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump golang.org/x/net from 0.53.0 to 0.55.0 in /src (#262) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.53.0 to 0.55.0. - [Commits](https://github.com/golang/net/compare/v0.53.0...v0.55.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.55.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump golang.org/x/crypto from 0.50.0 to 0.52.0 in /src (#274) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.50.0 to 0.52.0. - [Commits](https://github.com/golang/crypto/compare/v0.50.0...v0.52.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.52.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Toby Chui <tobychui@users.noreply.github.com> * V3.0.1 (#285) * Add CalDAV server for iOS Calendar bidirectional sync (#256) Add CalDAV server for iOS Calendar bidirectional sync (#256) * Updated CLAUDE.md (#257) * Updated CLAUDE.md * Add Reminders WebApp * Add Reminders WebApp (macOS Reminders-style) A self-contained ArozOS WebApp that mimics the macOS Reminders app. Front-end (web/Reminders/index.html), single-page, no framework: - Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a Completed card — plus custom "My Lists" with colour + SF-style icons and live incomplete counts, an Add List action and a light/dark toggle. - Reminder rows with circle checkboxes, inline title editing, sub-tasks (Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue), flags, priority (!/!!/!!!) and clickable URLs. - Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/ Tonight), Scheduled by date (with an Overdue group), All/Search by list. - A detail editor popover (On a Day / At a Time, priority, list, URL, flag) and a list create/edit modal with colour and icon pickers. - Native macOS look with full light/dark theming; sticky UI prefs via localStorage; responsive off-canvas sidebar on narrow screens. Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user { lists, reminders } store to user:/Document/Reminders/data.json via filelib, following the Calendar app's pattern: init (load + seed default list), saveReminder/deleteReminder, saveList/deleteList and a full saveData for re-ordering and clearing completed items. https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ * Add CalDAV VTODO sync for Reminders and recurring support Expose the Reminders web-app data as a CalDAV VTODO collection at /caldav/{username}/reminders/ so iOS Reminders can sync bidirectionally alongside the existing Calendar (VEVENT) collection. The principal now advertises a calendar-home-set containing both collections. Add RRULE recurrence support: events and reminders pass their recurrence rule through ICS in both directions. The Reminders UI gains a Repeat selector, shows a repeat indicator, and rolls recurring reminders forward to their next occurrence on completion (matching iOS behaviour). --------- Co-authored-by: Claude <noreply@anthropic.com> * Bump internal_version to 3.0.1 Update internal build version from 3.0.0 to 3.0.1 in src/flags.go to reflect a minor release increment. * Add shell mode (virtual FS) to web terminal Introduce an interactive shell mode for the web Terminal. Backend (session.agi): implement shell state, virtual path resolution, many shell commands (pwd, ls, cd, cat, mkdir, touch, rm, cp, mv, echo, whoami, clear, exit, help), tab-completion, prompt building, safe filelib wrappers, and new websocket message types (shellmode, clear, complete, shellPrompt in result). Frontend (index.html): track shellMode/shellPrompt, render shell output differently, handle shell enter/exit and clear messages, send/handle completion requests/responses, adjust input handling (Tab completion and disabling REPL dot-commands while in shell). Add .claude/launch.json to run a local static server for src/web. This enables a secure virtual filesystem shell inside the AGI REPL without host FS access. * TURN update for Arozcast screen share over Internet (#259) * Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add Reminders WebApp (macOS Reminders-style) A self-contained ArozOS WebApp that mimics the macOS Reminders app. Front-end (web/Reminders/index.html), single-page, no framework: - Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a Completed card — plus custom "My Lists" with colour + SF-style icons and live incomplete counts, an Add List action and a light/dark toggle. - Reminder rows with circle checkboxes, inline title editing, sub-tasks (Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue), flags, priority (!/!!/!!!) and clickable URLs. - Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/ Tonight), Scheduled by date (with an Overdue group), All/Search by list. - A detail editor popover (On a Day / At a Time, priority, list, URL, flag) and a list create/edit modal with colour and icon pickers. - Native macOS look with full light/dark theming; sticky UI prefs via localStorage; responsive off-canvas sidebar on narrow screens. Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user { lists, reminders } store to user:/Document/Reminders/data.json via filelib, following the Calendar app's pattern: init (load + seed default list), saveReminder/deleteReminder, saveList/deleteList and a full saveData for re-ordering and clearing completed items. https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ * Add built-in TURN relay so Arozcast screen share works over the Internet Arozcast screen share is a direct WebRTC peer-to-peer connection that only used public STUN servers, so it could not traverse NAT and failed over the Internet. Add a built-in TURN relay (pion/turn, MIT, pure Go) that both peers reach through the same ArozOS host, plus an /api/arozcast/iceservers endpoint that hands the browser STUN + TURN with short-lived HMAC-signed credentials. The relay is optional/configurable, and operators can override the ICE list entirely with system/arozcast/iceservers.json to use an external TURN. - mod/network/turn: pion/turn wrapper + ephemeral credential helpers (tested) - cast.go: start the relay in ArozcastInit; serve /api/arozcast/iceservers - main.go: close the relay on shutdown - flags.go: -arozcast_turn, -arozcast_turn_port, -arozcast_turn_publicip - screenshare.html / index.html: fetch ICE servers (STUN fallback) - Arozcast README: endpoint + Internet/TURN operations docs Media casting (Musicify/Movie/Photo) already worked over the Internet via the existing relay and is unchanged. https://claude.ai/code/session_01P68sFxtXuRXfzDnwtpFrnU * Add TURN-over-TLS and a System Settings toggle for the Arozcast relay Builds on the built-in Arozcast TURN relay with two operator-facing enhancements. TURN-over-TLS (TURNS): - turn.NewServer now optionally starts a TURNS listener (TLSPort + TLSCertFile/TLSKeyFile) alongside the plain UDP/TCP relay, reusing the system TLS certificate. Restrictive firewalls that only permit outbound TLS (commonly 443) can then relay screen share, since the media rides inside a connection indistinguishable from HTTPS. - Listener setup tracks every opened conn so a later failure cleans up; a TURNS failure is non-fatal (logged, plain relay keeps running). - /api/arozcast/iceservers advertises turns:host:port?transport=tcp when the listener is up. New flags: -arozcast_turn_tls (default on, no-op without a usable cert) and -arozcast_turn_tls_port (default 5349; set to 443 for maximum reach). System Settings toggle & status: - The relay is now runtime-managed (mutex-guarded start/stop with a remembered config) and its on/off state is persisted in the system database, overriding the -arozcast_turn flag default across restarts. - New admin-only endpoints /system/arozcast/turn/{status,setEnabled} via the permission router, plus a "Screen Share Relay" page under System Settings -> Network & Connection (SystemAO/arozcast/turn.html) showing running state, port, TURNS and advertised host. Tests cover the TURNS listener (self-signed cert handshake) and the non-fatal missing-cert path. README documents both features. * Drop the SNI-routing proxy caveat from the TURNS 443 docs The TURN-over-TLS note suggested fronting port 443 with a TLS/SNI-routing proxy to share it with the web server. That over-complicated the guidance; replace it with a plain statement that 5349 is the default and 443 is only viable when free on the relay's address. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> * Add single instance support to Movie * Add cross-tab theme sync and file selector fixes Broadcast theme changes to other open tabs and improve file selector callback handling. file_explorer.html now writes ao_system_theme to localStorage when toggling theme in standalone mode so other tabs can react. ao_module.js adds ao_module_onThemeChanged, ao_module_toggleSystemTheme and an internal _ao_theme_broadcast to support both VDI (desktop-driven) and standalone/cross-tab theme propagation. Also fixes and documents file selector behavior: allow callback as a string or named function, auto-register a temporary global for anonymous callbacks in VDI mode, resolve string callbacks in non-VDI polling mode, and clean up localStorage handling. Minor typo/comment and whitespace fixes included. * Add theme listener to desktop * Added more icons for Code Studio * Added wip productivity app * Renewed Text app * Updated Productivity app * Text module style update * Add RWD support to text * Add Markdown source-mark reveal and image sync Show Typora-style markdown source marks and allow inline editing of image references. Adds CSS pseudo-elements to reveal heading, emphasis, code, blockquote and link syntax; a settings selector to control reveal mode (active/always/none); and a default syntax setting. Implements updateActiveBlock(), clearDecorations(), decorateBlock(), editable .md-imgsyn labels, syncImgFromSyn()/commitImgSyn(), and helpers (richPlainText, activeImgSyn, caret/block helpers) to keep serialization and word count unchanged. Updates event handlers and key handling to support image-label editing, heading mark editing, backspace behavior at block start, and selection changes. Ensures getContent strips editable image labels before turndown and wires UI state updates throughout. * Text: add Notion mode with slash commands and document-aware AI (#260) Adds a toolbar toggle that enables a Notion-style "/" command menu in the Markdown editor. Typing "/" at a line start (or after a space) opens a filterable, keyboard-navigable menu to quickly insert blocks (headings, to-do/bullet/numbered lists, quote, code block, table, divider) and to run AI actions. AI actions feed the entire current document in as context and insert the generated Markdown at the caret, with an inline "Ask AI" prompt for free-form instructions plus presets (continue writing, summarize, brainstorm, outline). Generation is relayed through a new Text/ai.agi backend that calls the aimodel library; the AI endpoint/key are configured by an admin in System Settings. A new "Notion & AI" settings section lets users toggle the feature, pick a model (lazy-loaded from the endpoint) and set the temperature; all preferences persist alongside the existing editor settings. Claude-Session: https://claude.ai/code/session_01Xd4TY3ecHMDdG7es1JqbKo Co-authored-by: Claude <noreply@anthropic.com> * Revert "Text: add Notion mode with slash commands and document-aware AI (#260)" This reverts commit be21397ccf060ed4fe403c48fbe3d63d72669965. * Added advanced code block function to Text * Add code-language picker and blank-line handling Introduce a code-block language <select> UI and preserve runs of blank paragraphs through round-trip serialization. Add LANG_LIST and TextHL.languages(), ensure language selectors are appended to <pre> blocks (contenteditable=false and stripped on save), and wire syncLangSelector/ensureLangSelector/clearLangSelectors/onLangSelectChange. Implement renderWithBlankRuns() and expandBlankSentinels() to keep multiple empty paragraphs, switch marked.parse/getContent/renderedHTML to use these, and replace the previous &nbsp; sentinel with a ZWSP sentinel. Fix code-block editing by rewriting newline/delete logic to operate on the code textContent (insertNewlineInCode, deleteInCode) to avoid DOM fragmentation and caret issues; add protection for key handling when the language <select> has focus. Adjust decoration logic to avoid marking PRE as md-active and update syntax display rules. Rename/move backend modules under Text/backend (export.agi, filesaver.agi, imgtool.agi) and update ao_module_agirun calls to use the new paths. Add related CSS for the language picker and other small UI adjustments. * Add link editor and improve code highlighting Introduce an interactive link editor and inline editable link marks, replacing the previous CSS-only closing a::after pseudo-element with a real .md-linksyn element so link URLs are clickable/editable. Add link dialog UI (overlay, inputs, remove/cancel/OK handlers) and associated logic to insert/edit/remove links, preserve/restore selection, and avoid tearing down marks while edited. Enhance code-block highlighting: switch to relightCode/highlightCode with caret/selection preservation (selectionEndOffsetIn, restoreCaretIn), handle live re-highlighting on edits, language changes, and prevent stuck empty code blocks by exiting them (exitEmptyCodeBlock). Also fix caret placement when clicking below trailing code blocks (escapeTrailingCodeBlockClick), update serialization to strip .md-linksyn, and adjust toolbar/labels for the link action. * Add support for token access in webdav server X-Access-Token + X-Aroz-User now can be used to login webdav with autologin token instead of Basic Auth * Add CNN inference API support * Rename aimodel to llm and add LLM server pkg Replace the legacy "aimodel" library with a new "llm" library and introduce a dedicated aiservers/llm package. Key changes: - Rename library identifier from "aimodel" to "llm" across docs and backend scripts (README, AGI scripts, web backend examples). - Remove the old agi.aimodel implementation and add agi.llm (new AGI lib) plus agi.llm_test.go. - Add mod/aiservers/llm package with client, OpenAI/Anthropic adapters and types, and tests (client.go, openai.go, anthropic.go, types.go, and tests). - Update tests and module wiring to use LLMConfig/LLMPricing/llmDBTable and injectLLMFunctions where appropriate. - Minor updates to web demo backend/init scripts and API docs to reflect the new requirelib name. Notes: System Settings UI and routes retaining the original "AI Model" naming; only the requirelib identifier and internal Go types/DB table references were changed. This restructures wire-protocol logic into the new aiservers/llm package for clearer separation of concerns and easier protocol-specific handling. * Fixed #204 * Add text color change inline * Add free resize on select tool * Add Cine Studio, a Premiere-like timeline video editor webapp (#263) A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 Co-authored-by: Claude <noreply@anthropic.com> * Docker support (#264) * Updated Video Editor app to have more functionalities (#266) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * Fix docker package build failure on FreeBSD and other unlisted platforms (#267) The docker package split its PTY console and host-stats helpers into build-tagged files that only covered linux/darwin/windows. FreeBSD (built by the Jenkins release pipeline for amd64 and i386) matched none of them, so startDockerExecPTY, hostStorageUsage and hostLoadAvg were undefined and the cross-platform release build failed. - console_unix.go now builds for freebsd too (creack/pty supports it). - console_windows.go becomes console_other.go, a catch-all (!linux && !darwin && !freebsd) stub covering windows and any other GOOS. - host_darwin.go becomes host_bsd.go (darwin || freebsd); the Statfs-based storage helper works on both. - Add host_other.go, a catch-all fallback so the package builds on any remaining GOOS. Also expand the CI cross-compile smoke test to cover the full release matrix (including freebsd/amd64 and freebsd/386) so a platform-specific break is caught in CI instead of only in the release build. Claude-Session: https://claude.ai/code/session_01L4oR1xiTxpcfwYjRgi4RGh Co-authored-by: Claude <noreply@anthropic.com> * Added playwright e2e tests for cine studio (#268) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Playwright E2E suite for Cine Studio + GitHub Actions job Ports the browser-driven tests used to verify Cine Studio into the codebase under test/e2e/playwright (outside src/ so they never touch the Go module). The tests drive the real app in headless Chromium, generating their own media in-page (canvas -> MediaRecorder WebM, synthesized WAV) and asserting on rendered pixels, so they exercise the full compositor / playback / export pipeline rather than mocking it. Structure: - lib/static-server.js minimal static server for the ArozOS web root - lib/harness.js browser launch + app navigation + ok()/fail(); resolves Playwright's own Chromium (no hardcoded path), overridable via PW_CHROMIUM_PATH - run.js serves src/web, runs each spec in its own process, exits non-zero on any failure - specs/functional.js media probe, playback, edit, round-trip, WebM export - specs/features.js effects, titles, transitions, elements, filters - specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import - specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave 41 assertions across the four specs, all passing locally. CI: .github/workflows/e2e-playwright.yml installs Node + Playwright Chromium and runs `npm test`, scoped to changes under the app or the harness so unrelated commits don't trigger it. Front-end only - runs independently of the Go build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * Claude/arozos playwright tests for arozos (#269) * Add full-stack Playwright E2E suite for ArozOS critical paths Extend the Playwright harness (previously Cine Studio only) with a 'system' suite that drives a real ArozOS server built from src/: - lib/arozos-server.js boots a disposable isolated instance (.instance/: web symlink + private system copy) and bootstraps a deterministic admin account at the zero-user state - lib/system-harness.js shares login (form + API), CSRF, JSON and pass/fail helpers; each spec also runs standalone - specs-system/ covers the critical paths: 010 sign in / sign out (form render, bad credentials, session persistence, gated redirects, logout, retry delay) 020 desktop shell (task bar, start menu, module list, quick access panel identity, UI sign-out) 030 file explorer (File Manager UI render + full file lifecycle: create, rename, copy, move, properties, recycle/restore/clear trash, permanent delete, CSRF enforcement) 040 system settings (settings UI, catalogue groups, admin-only modules, host info, permission group listing) 050 user management + permission control (group CRUD, user CRUD, restricted-user module visibility, admin-only endpoint denial, administrator group protection) - run.js orchestrates both suites; npm run test:static / test:system - CI workflow now builds the Go binary, triggers on src/** changes and uploads the server log on failure Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 1 E2E spec and coverage roadmap - specs-system/060-webapps-core.js: smoke + interaction coverage for the highest-importance WebApps (NotepadA, Text, Photo, Music, Video, PDF Viewer, Zip File Manager) against the real server, including opening a real file in NotepadA via the desktop hash convention - README: document the ranked 44-WebApp inventory and the wave order for upcoming specs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 2 E2E spec (office/productivity) specs-system/070-webapps-office.js: smoke + interaction coverage for Code Studio, MDEditor, Calendar, Notes, Memo, Reminders, OfficeViewer and Dashboard against the real server, including opening a real Markdown file in MDEditor via the desktop hash convention and probing Dashboard's live system-info data source. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 3 E2E spec (media/creative) specs-system/080-webapps-media.js: smoke coverage for Musicify, Movie, Manga, Paint, Pixel Studio, Audio Studio, Camera, Recorder and FFmpeg Factory against the real server, plus a probe of the storage data path the media library apps browse. Cine Studio keeps its own deep static suite and is not repeated here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 4 E2E spec (utilities/dev/network) + close roadmap specs-system/090-webapps-utilities.js: smoke coverage for Calculator (incl. a real 7+8=15 calculation through the UI), Clock, Browser, Speedtest, Web Downloader, Web Builder, SQLite Admin, Terminal, AGIForge, AIChat, OTPAuth, Productivity, OnScreenKeyboard, Arozcast, Management Gateway, UnitTest, CronDemo and Serverless. This completes coverage of all 44 WebApps under src/web across four waves. README updated to reflect the full map; full suite (13 spec files: 4 static + 9 system) passes end to end. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add deep file-transfer critical-path spec (upload/download/search/share) specs-system/035-file-transfer.js extends the file-explorer coverage with the transfer features that move real bytes: - multipart upload of a real file - media download with byte-exact round-trip verification - file search by keyword - share-link lifecycle: create, list, anonymous direct download via /share/download/{uuid}/ (byte-exact) + preview page, then delete and confirm the share is revoked Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add account password-change critical-path spec specs-system/055-account.js exercises the My Account flow on a dedicated throwaway user (keeping the shared admin login intact): account settings UI render, userinfo identity, wrong-old-password refusal, successful change, and that afterwards only the new password signs in. README updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop backend API spec (every /system/desktop endpoint) specs-system/021-desktop-api.js covers the full desktop.go API surface with the exact request shapes desktop.html uses: host/device details; user self-info (quota/groups/admin), another user's public info via ?target, and noicon; theme listing + set/get round-trip; preference set/get/remove; createShortcut + listDesktop metadata; icon location files set/get/del; and renameShortcut incl. off-desktop rejection. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop UI shell spec (clock, panels, start menu, search, icons) specs-system/022-desktop-ui.js drives the real desktop.html: wallpaper frame mounts, the taskbar clock shows a formatted time, the quick access panel carries the user identity, the start menu opens with module entries, its search box narrows the list and reports No Result for gibberish, the notification bar toggles from the clock, and an API-seeded shortcut renders as a desktop launch icon. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop float-window + context-menu spec and update README specs-system/023-desktop-windows.js drives the desktop window manager and right-click surfaces using the app's own globals and real clicks: openModule spawns a float window with a taskbar entry; newFloatWindow creates addressable windows; focus raises z-order; maximize/restore, minimize and close all work; and the wallpaper + icon context menus open with the expected entries. Desktop coverage is now three specs deep (API 021, UI 022, windows 023) on top of the original 020 shell smoke test. README layout updated. Full system suite (14 specs) passes together. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow --------- Co-authored-by: Claude <noreply@anthropic.com> * Video Editor Cline Update (#270) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Playwright E2E suite for Cine Studio + GitHub Actions job Ports the browser-driven tests used to verify Cine Studio into the codebase under test/e2e/playwright (outside src/ so they never touch the Go module). The tests drive the real app in headless Chromium, generating their own media in-page (canvas -> MediaRecorder WebM, synthesized WAV) and asserting on rendered pixels, so they exercise the full compositor / playback / export pipeline rather than mocking it. Structure: - lib/static-server.js minimal static server for the ArozOS web root - lib/harness.js browser launch + app navigation + ok()/fail(); resolves Playwright's own Chromium (no hardcoded path), overridable via PW_CHROMIUM_PATH - run.js serves src/web, runs each spec in its own process, exits non-zero on any failure - specs/functional.js media probe, playback, edit, round-trip, WebM export - specs/features.js effects, titles, transitions, elements, filters - specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import - specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave 41 assertions across the four specs, all passing locally. CI: .github/workflows/e2e-playwright.yml installs Node + Playwright Chromium and runs `npm test`, scoped to changes under the app or the harness so unrelated commits don't trigger it. Front-end only - runs independently of the Go build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * New webapp RAW Editor (#271) * Add Raw Editor webapp with RAW decode, develop controls and LUT grading Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW files client-side and develops them with a Camera-Raw style interface. Decoder (js/rawdecoder.js): - TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2, ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal. - CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy compression, bilinear demosaic with black/white-level normalisation and camera (AsShotNeutral) or gray-world white balance. - Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force SOI/EOI scan) so any RAW still renders when its compression is unsupported. - EXIF metadata (camera, shutter, aperture, ISO, focal length). Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing white balance (temperature/tint), exposure, contrast, highlights, shadows, whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional 3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local contrast. Keeps a valid identity 3D texture bound at all times so drivers that reject incomplete sampler3D bindings still render. LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a WebGL 3D texture. UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local picker and drag & drop) and JPEG export back to storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Hand off developed image to Pixel Studio on Done Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS) and launches Pixel Studio as a float window with that file as its input (matching Pixel Studio's ao_module_loadInputFiles hash format), then closes the Raw Editor window. Falls back to the normal Save dialog when running outside the ArozOS desktop. The bottom-bar button is relabelled "Open in Pixel Studio". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout Rework the develop panel into the 2024 Lightroom-style layout: - Thin centred title bar with open / save / reset / fit icons. - Borderless histogram with shadow/highlight clipping indicators and an EXIF readout (ISO, focal, aperture, shutter). - "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills. - Profile selector row. - Collapsible Light / Color / Effects / LUT groups, each with a chevron to fold and an eye toggle that bypasses that group's adjustments. - Lightroom slider rows: label + right-aligned editable value on one line, thin track below, with coloured gradient tracks for Temperature (blue-> yellow), Tint (green->magenta) and Vibrance / Saturation. - White-balance eyedropper wired to auto white balance. - Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined dimension readout and Cancel / Open in Pixel Studio actions. - Decorative panel-selector strip on the right edge. Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain (post noise) controls to the WebGL develop shader to complete the Effects group, plus per-group bypass handling in the parameter builder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add ArozOS-backed LUT library with a managed folder LUTs can now be managed through the user's ArozOS storage instead of only one-off browser uploads: - On first use the app creates a "user:/RawEditor/LUTs" folder (via the file_system newItem endpoint with a CSRF token). Users can drop .cube files into it with the Files app. - The LUT panel scans that folder (listDir) and lists every .cube in a "Library" dropdown; picking one reads it back through the media endpoint, parses it and applies it live. A refresh button re-scans on demand. - "Import .cube to library" still loads a local file immediately and now also uploads it into the library folder so it persists and reappears in the list next time. - Selecting a LUT re-enables the LUT group (clears any eye bypass); the hint line reports how many LUTs are available. Falls back gracefully to local import when running outside the ArozOS desktop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add scroll-zoom and right-drag pan; remove unused UI - Scroll wheel now zooms the photo, centred on the cursor, and the current zoom level is shown in the status bar. Fit / 100% buttons reset the view. - Right-mouse (or middle) button drag pans the image; the browser context menu is suppressed over the canvas. The view re-fits on window resize. The canvas is now transform-based (translate + scale) instead of the old fit / 1:1 CSS toggle. - Removed the Profile dropdown (no camera profiles in this pipeline) and the decorative right-edge tool strip, so the panel only shows working controls. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Pan with left mouse button and fix LUT dropdown overflow - Change canvas panning from right-drag to left-mouse (and middle) drag, with a grab / grabbing cursor over the image. The context menu is no longer suppressed. - Fix the LUT Library dropdown (and any select) overflowing the panel when an option label is long: give .mini-select min-width:0 so it can shrink inside its flex row instead of stretching to the widest option. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Load EXIF from JPEG APP1 so shooting info shows reliably Some RAW files (and any plain JPEG) did not populate the ISO / focal / aperture / shutter readout under the histogram. The cause: when the RAW's outer TIFF structure fails to parse, the image still loads via the brute-force embedded-JPEG scan, but the metadata comes back empty. Add a JPEG APP1 EXIF reader (the APP1 payload is itself a TIFF block, so it reuses the existing TIFF parser) and use it to: - read EXIF for plain JPEG images, and - fill any missing EXIF fields from the embedded preview for RAW files, which rescues shooting info when the main TIFF could not be parsed. Also harden applyMeta so the EXIF line is written before the window-title call and a title error can no longer suppress it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Match Photoshop LUT rendering: tetrahedral interpolation + true sRGB The same .cube LUT looked cyan/teal-shifted compared to Photoshop. Two causes, both fixed: - Interpolation: the 3D LUT was sampled with GPU trilinear filtering, which introduces a cyan/green cast on film-style LUTs. Switch the LUT textures to NEAREST and do proper tetrahedral interpolation in the shader — the same method Photoshop's Color Lookup and Resolve use. - Transfer function: encode to display with the true sRGB OETF instead of a plain 2.2 gamma. This exactly inverts the sRGB decode applied to 8-bit sources, so the values fed into the LUT match what Photoshop feeds it (previously the mismatch shifted shadow tones the LUT is sensitive to). Also honour the LUT's DOMAIN_MIN / DOMAIN_MAX when sampling. Verified in-browser: an identity LUT now passes through unchanged (exact tetrahedral), a channel-swap LUT swaps correctly, and a constant LUT maps to the constant. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Harden RAW EXIF parsing for real camera files Improve the chance that ISO / focal / aperture / shutter show for real RAWs (e.g. Sony ARW), which kept the readout blank: - Scan every embedded JPEG for APP1 EXIF, not just the largest preview. Sony keeps EXIF in the small thumbnail while the full-size preview has none. - Stop recursing the MakerNote (0x927C) as if its bytes were IFD offsets — that could be pathologically slow / derail a clean parse on real files; EXIF is reached through the standard ExifIFD (0x8769) pointer. - Cap IFD entry counts (>4096) to bail out of parsing stray/garbage offsets. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Fix RAW preview selection: never decode CFA raw as the preview image On real Sony ARW files the develop view hung and EXIF stayed blank. Root cause: the CFA raw plane is a lossless-JPEG-compressed stream that also starts with 0xFFD8, and the embedded-preview finder picked it as the "largest JPEG" (31 MB) and handed it to the browser to decode as an image. The browser cannot decode lossless JPEG, so decoding stalled and the pipeline never reached the metadata display. Fixes: - Ignore CFA / raw IFDs (Photometric 32803) when hunting for a preview JPEG. - Only accept a range that is a real JPEG (SOI at the start AND EOI at the end) via a looksLikeJpeg() check, so a truncated raw stream can't be chosen. - Cap the brute-force SOI/EOI scan span so raw bytes containing 0xFFD8 can't yield a multi-megabyte junk range. With this, ARW files pick the correct full-size preview, the image loads, and ISO / focal / aperture / shutter populate under the histogram. Verified against a real 25MP Sony ILCE-6700 ARW end-to-end in the browser. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 --------- Co-authored-by: Claude <noreply@anthropic.com> * RAW Editor - LUT Preview update (#272) * Add Raw Editor webapp with RAW decode, develop controls and LUT grading Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW files client-side and develops them with a Camera-Raw style interface. Decoder (js/rawdecoder.js): - TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2, ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal. - CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy compression, bilinear demosaic with black/white-level normalisation and camera (AsShotNeutral) or gray-world white balance. - Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force SOI/EOI scan) so any RAW still renders when its compression is unsupported. - EXIF metadata (camera, shutter, aperture, ISO, focal length). Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing white balance (temperature/tint), exposure, contrast, highlights, shadows, whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional 3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local contrast. Keeps a valid identity 3D texture bound at all times so drivers that reject incomplete sampler3D bindings still render. LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a WebGL 3D texture. UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local picker and drag & drop) and JPEG export back to storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Hand off developed image to Pixel Studio on Done Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS) and launches Pixel Studio as a float window with that file as its input (matching Pixel Studio's ao_module_loadInputFiles hash format), then closes the Raw Editor window. Falls back to the normal Save dialog when running outside the ArozOS desktop. The bottom-bar button is relabelled "Open in Pixel Studio". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout Rework the develop panel into the 2024 Lightroom-style layout: - Thin centred title bar with open / save / reset / fit icons. - Borderless histogram with shadow/highlight clipping indicators and an EXIF readout (ISO, focal, aperture, shutter). - "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills. - Profile selector row. - Collapsible Light / Color / Effects / LUT groups, each with a chevron to fold and an eye toggle that bypasses that group's adjustments. - Lightroom slider rows: label + right-aligned editable value on one line, thin track below, with coloured gradient tracks for Temperature (blue-> yellow), Tint (green->magenta) and Vibrance / Saturation. - White-balance eyedropper wired to auto white balance. - Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined dimension readout and Cancel / Open in Pixel Studio actions. - Decorative panel-selector strip on the right edge. Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain (post noise) controls to the WebGL develop shader to complete the Effects group, plus per-group bypass handling in the parameter builder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add ArozOS-backed LUT library with a managed folder LUTs can now be managed through the user's ArozOS storage instead of on… * Add LoongArch64 (linux/loong64) build support (#287) * Update github.com/glebarez/go-sqlite to v1.22.1-0.20260317144347-ca37fea19666 * Use fsdb on LoongArch64 * Add linux/loong64 to the Makefile and GitHub Actions workflow * Update README * Fix CPU frequency and hardware model detection on LoongArch64 (#288) * docs: restore 2 dead link(s) via Wayback (#290) Co-authored-by: mirkosalvato1-ctrl <227404546+mirkosalvato1-ctrl@users.noreply.github.com> * Fix Windows hardware info when wmic.exe is missing (#289) Prefer Get-CimInstance for Win32_* queries and keep classic wmic as fallback so System Info and SMART still work on Windows 11 hosts that no longer ship wmic. Co-authored-by: Cursor <cursoragent@cursor.com> * docs: fix a typo RSICV64 => RISC-V 64-bit (#291) * Bump github.com/pion/dtls/v3 from 3.0.7 to 3.1.4 in /src (#296) Bumps [github.com/pion/dtls/v3](https://github.com/pion/dtls) from 3.0.7 to 3.1.4. - [Release notes](https://github.com/pion/dtls/releases) - [Commits](https://github.com/pion/dtls/compare/v3.0.7...v3.1.4) --- updated-dependencies: - dependency-name: github.com/pion/dtls/v3 dependency-version: 3.1.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump github.com/pion/stun/v3 from 3.0.1 to 3.1.5 in /src (#295) Bumps [github.com/pion/stun/v3](https://github.com/pion/stun) from 3.0.1 to 3.1.5. - [Release notes](https://github.com/pion/stun/releases) - [Commits](https://github.com/pion/stun/compare/v3.0.1...v3.1.5) --- updated-dependencies: - dependency-name: github.com/pion/stun/v3 dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump github.com/go-git/go-git/v5 from 5.19.1 to 5.19.2 in /src (#297) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.19.1 to 5.19.2. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * V3.0.2 (#299) * Add CalDAV server for iOS Calendar bidirectional sync (#256) Add CalDAV server for iOS Calendar bidirectional sync (#256) * Updated CLAUDE.md (#257) * Updated CLAUDE.md * Add Reminders WebApp * Add Reminders WebApp (macOS Reminders-style) A self-contained ArozOS WebApp that mimics the macOS Reminders app. Front-end (web/Reminders/index.html), single-page, no framework: - Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a Completed card — plus custom "My Lists" with colour + SF-style icons and live incomplete counts, an Add List action and a light/dark toggle. - Reminder rows with circle checkboxes, inline title editing, sub-tasks (Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue), flags, priority (!/!!/!!!) and clickable URLs. - Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/ Tonight), Scheduled by date (with an Overdue group), All/Search by list. - A detail editor popover (On a Day / At a Time, priority, list, URL, flag) and a list create/edit modal with colour and icon pickers. - Native macOS look with full light/dark theming; sticky UI prefs via localStorage; responsive off-canvas sidebar on narrow screens. Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user { lists, reminders } store to user:/Document/Reminders/data.json via filelib, following the Calendar app's pattern: init (load + seed default list), saveReminder/deleteReminder, saveList/deleteList and a full saveData for re-ordering and clearing completed items. https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ * Add CalDAV VTODO sync for Reminders and recurring support Expose the Reminders web-app data as a CalDAV VTODO collection at /caldav/{username}/reminders/ so iOS Reminders can sync bidirectionally alongside the existing Calendar (VEVENT) collection. The principal now advertises a calendar-home-set containing both collections. Add RRULE recurrence support: events and reminders pass their recurrence rule through ICS in both directions. The Reminders UI gains a Repeat selector, shows a repeat indicator, and rolls recurring reminders forward to their next occurrence on completion (matching iOS behaviour). --------- Co-authored-by: Claude <noreply@anthropic.com> * Bump internal_version to 3.0.1 Update internal build version from 3.0.0 to 3.0.1 in src/flags.go to reflect a minor release increment. * Add shell mode (virtual FS) to web terminal Introduce an interactive shell mode for the web Terminal. Backend (session.agi): implement shell state, virtual path resolution, many shell commands (pwd, ls, cd, cat, mkdir, touch, rm, cp, mv, echo, whoami, clear, exit, help), tab-completion, prompt building, safe filelib wrappers, and new websocket message types (shellmode, clear, complete, shellPrompt in result). Frontend (index.html): track shellMode/shellPrompt, render shell output differently, handle shell enter/exit and clear messages, send/handle completion requests/responses, adjust input handling (Tab completion and disabling REPL dot-commands while in shell). Add .claude/launch.json to run a local static server for src/web. This enables a secure virtual filesystem shell inside the AGI REPL without host FS access. * TURN update for Arozcast screen share over Internet (#259) * Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add Reminders WebApp (macOS Reminders-style) A self-contained ArozOS WebApp that mimics the macOS Reminders app. Front-end (web/Reminders/index.html), single-page, no framework: - Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a Completed card — plus custom "My Lists" with colour + SF-style icons and live incomplete counts, an Add List action and a light/dark toggle. - Reminder rows with circle checkboxes, inline title editing, sub-tasks (Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue), flags, priority (!/!!/!!!) and clickable URLs. - Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/ Tonight), Scheduled by date (with an Overdue group), All/Search by list. - A detail editor popover (On a Day / At a Time, priority, list, URL, flag) and a list create/edit modal with colour and icon pickers. - Native macOS look with full light/dark theming; sticky UI prefs via localStorage; responsive off-canvas sidebar on narrow screens. Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user { lists, reminders } store to user:/Document/Reminders/data.json via filelib, following the Calendar app's pattern: init (load + seed default list), saveReminder/deleteReminder, saveList/deleteList and a full saveData for re-ordering and clearing completed items. https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ * Add built-in TURN relay so Arozcast screen share works over the Internet Arozcast screen share is a direct WebRTC peer-to-peer connection that only used public STUN servers, so it could not traverse NAT and failed over the Internet. Add a built-in TURN relay (pion/turn, MIT, pure Go) that both peers reach through the same ArozOS host, plus an /api/arozcast/iceservers endpoint that hands the browser STUN + TURN with short-lived HMAC-signed credentials. The relay is optional/configurable, and operators can override the ICE list entirely with system/arozcast/iceservers.json to use an external TURN. - mod/network/turn: pion/turn wrapper + ephemeral credential helpers (tested) - cast.go: start the relay in ArozcastInit; serve /api/arozcast/iceservers - main.go: close the relay on shutdown - flags.go: -arozcast_turn, -arozcast_turn_port, -arozcast_turn_publicip - screenshare.html / index.html: fetch ICE servers (STUN fallback) - Arozcast README: endpoint + Internet/TURN operations docs Media casting (Musicify/Movie/Photo) already worked over the Internet via the existing relay and is unchanged. https://claude.ai/code/session_01P68sFxtXuRXfzDnwtpFrnU * Add TURN-over-TLS and a System Settings toggle for the Arozcast relay Builds on the built-in Arozcast TURN relay with two operator-facing enhancements. TURN-over-TLS (TURNS): - turn.NewServer now optionally starts a TURNS listener (TLSPort + TLSCertFile/TLSKeyFile) alongside the plain UDP/TCP relay, reusing the system TLS certificate. Restrictive firewalls that only permit outbound TLS (commonly 443) can then relay screen share, since the media rides inside a connection indistinguishable from HTTPS. - Listener setup tracks every opened conn so a later failure cleans up; a TURNS failure is non-fatal (logged, plain relay keeps running). - /api/arozcast/iceservers advertises turns:host:port?transport=tcp when the listener is up. New flags: -arozcast_turn_tls (default on, no-op without a usable cert) and -arozcast_turn_tls_port (default 5349; set to 443 for maximum reach). System Settings toggle & status: - The relay is now runtime-managed (mutex-guarded start/stop with a remembered config) and its on/off state is persisted in the system database, overriding the -arozcast_turn flag default across restarts. - New admin-only endpoints /system/arozcast/turn/{status,setEnabled} via the permission router, plus a "Screen Share Relay" page under System Settings -> Network & Connection (SystemAO/arozcast/turn.html) showing running state, port, TURNS and advertised host. Tests cover the TURNS listener (self-signed cert handshake) and the non-fatal missing-cert path. README documents both features. * Drop the SNI-routing proxy caveat from the TURNS 443 docs The TURN-over-TLS note suggested fronting port 443 with a TLS/SNI-routing proxy to share it with the web server. That over-complicated the guidance; replace it with a plain statement that 5349 is the default and 443 is only viable when free on the relay's address. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> * Add single instance support to Movie * Add cross-tab theme sync and file selector fixes Broadcast theme changes to other open tabs and improve file selector callback handling. file_explorer.html now writes ao_system_theme to localStorage when toggling theme in standalone mode so other tabs can react. ao_module.js adds ao_module_onThemeChanged, ao_module_toggleSystemTheme and an internal _ao_theme_broadcast to support both VDI (desktop-driven) and standalone/cross-tab theme propagation. Also fixes and documents file selector behavior: allow callback as a string or named function, auto-register a temporary global for anonymous callbacks in VDI mode, resolve string callbacks in non-VDI polling mode, and clean up localStorage handling. Minor typo/comment and whitespace fixes included. * Add theme listener to desktop * Added more icons for Code Studio * Added wip productivity app * Renewed Text app * Updated Productivity app * Text module style update * Add RWD support to text * Add Markdown source-mark reveal and image sync Show Typora-style markdown source marks and allow inline editing of image references. Adds CSS pseudo-elements to reveal heading, emphasis, code, blockquote and link syntax; a settings selector to control reveal mode (active/always/none); and a default syntax setting. Implements updateActiveBlock(), clearDecorations(), decorateBlock(), editable .md-imgsyn labels, syncImgFromSyn()/commitImgSyn(), and helpers (richPlainText, activeImgSyn, caret/block helpers) to keep serialization and word count unchanged. Updates event handlers and key handling to support image-label editing, heading mark editing, backspace behavior at block start, and selection changes. Ensures getContent strips editable image labels before turndown and wires UI state updates throughout. * Text: add Notion mode with slash commands and document-aware AI (#260) Adds a toolbar toggle that enables a Notion-style "/" command menu in the Markdown editor. Typing "/" at a line start (or after a space) opens a filterable, keyboard-navigable menu to quickly insert blocks (headings, to-do/bullet/numbered lists, quote, code block, table, divider) and to run AI actions. AI actions feed the entire current document in as context and insert the generated Markdown at the caret, with an inline "Ask AI" prompt for free-form instructions plus presets (continue writing, summarize, brainstorm, outline). Generation is relayed through a new Text/ai.agi backend that calls the aimodel library; the AI endpoint/key are configured by an admin in System Settings. A new "Notion & AI" settings section lets users toggle the feature, pick a model (lazy-loaded from the endpoint) and set the temperature; all preferences persist alongside the existing editor settings. Claude-Session: https://claude.ai/code/session_01Xd4TY3ecHMDdG7es1JqbKo Co-authored-by: Claude <noreply@anthropic.com> * Revert "Text: add Notion mode with slash commands and document-aware AI (#260)" This reverts commit be21397ccf060ed4fe403c48fbe3d63d72669965. * Added advanced code block function to Text * Add code-language picker and blank-line handling Introduce a code-block language <select> UI and preserve runs of blank paragraphs through round-trip serialization. Add LANG_LIST and TextHL.languages(), ensure language selectors are appended to <pre> blocks (contenteditable=false and stripped on save), and wire syncLangSelector/ensureLangSelector/clearLangSelectors/onLangSelectChange. Implement renderWithBlankRuns() and expandBlankSentinels() to keep multiple empty paragraphs, switch marked.parse/getContent/renderedHTML to use these, and replace the previous &nbsp; sentinel with a ZWSP sentinel. Fix code-block editing by rewriting newline/delete logic to operate on the code textContent (insertNewlineInCode, deleteInCode) to avoid DOM fragmentation and caret issues; add protection for key handling when the language <select> has focus. Adjust decoration logic to avoid marking PRE as md-active and update syntax display rules. Rename/move backend modules under Text/backend (export.agi, filesaver.agi, imgtool.agi) and update ao_module_agirun calls to use the new paths. Add related CSS for the language picker and other small UI adjustments. * Add link editor and improve code highlighting Introduce an interactive link editor and inline editable link marks, replacing the previous CSS-only closing a::after pseudo-element with a real .md-linksyn element so link URLs are clickable/editable. Add link dialog UI (overlay, inputs, remove/cancel/OK handlers) and associated logic to insert/edit/remove links, preserve/restore selection, and avoid tearing down marks while edited. Enhance code-block highlighting: switch to relightCode/highlightCode with caret/selection preservation (selectionEndOffsetIn, restoreCaretIn), handle live re-highlighting on edits, language changes, and prevent stuck empty code blocks by exiting them (exitEmptyCodeBlock). Also fix caret placement when clicking below trailing code blocks (escapeTrailingCodeBlockClick), update serialization to strip .md-linksyn, and adjust toolbar/labels for the link action. * Add support for token access in webdav server X-Access-Token + X-Aroz-User now can be used to login webdav with autologin token instead of Basic Auth * Add CNN inference API support * Rename aimodel to llm and add LLM server pkg Replace the legacy "aimodel" library with a new "llm" library and introduce a dedicated aiservers/llm package. Key changes: - Rename library identifier from "aimodel" to "llm" across docs and backend scripts (README, AGI scripts, web backend examples). - Remove the old agi.aimodel implementation and add agi.llm (new AGI lib) plus agi.llm_test.go. - Add mod/aiservers/llm package with client, OpenAI/Anthropic adapters and types, and tests (client.go, openai.go, anthropic.go, types.go, and tests). - Update tests and module wiring to use LLMConfig/LLMPricing/llmDBTable and injectLLMFunctions where appropriate. - Minor updates to web demo backend/init scripts and API docs to reflect the new requirelib name. Notes: System Settings UI and routes retaining the original "AI Model" naming; only the requirelib identifier and internal Go types/DB table references were changed. This restructures wire-protocol logic into the new aiservers/llm package for clearer separation of concerns and easier protocol-specific handling. * Fixed #204 * Add text color change inline * Add free resize on select tool * Add Cine Studio, a Premiere-like timeline video editor webapp (#263) A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 Co-authored-by: Claude <noreply@anthropic.com> * Docker support (#264) * Updated Video Editor app to have more functionalities (#266) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * Fix docker package build failure on FreeBSD and other unlisted platforms (#267) The docker package split its PTY console and host-stats helpers into build-tagged files that only covered linux/darwin/windows. FreeBSD (built by the Jenkins release pipeline for amd64 and i386) matched none of them, so startDockerExecPTY, hostStorageUsage and hostLoadAvg were undefined and the cross-platform release build failed. - console_unix.go now builds for freebsd too (creack/pty supports it). - console_windows.go becomes console_other.go, a catch-all (!linux && !darwin && !freebsd) stub covering windows and any other GOOS. - host_darwin.go becomes host_bsd.go (darwin || freebsd); the Statfs-based storage helper works on both. - Add host_other.go, a catch-all fallback so the package builds on any remaining GOOS. Also expand the CI cross-compile smoke test to cover the full release matrix (including freebsd/amd64 and freebsd/386) so a platform-specific break is caught in CI instead of only in the release build. Claude-Session: https://claude.ai/code/session_01L4oR1xiTxpcfwYjRgi4RGh Co-authored-by: Claude <noreply@anthropic.com> * Added playwright e2e tests for cine studio (#268) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Playwright E2E suite for Cine Studio + GitHub Actions job Ports the browser-driven tests used to verify Cine Studio into the codebase under test/e2e/playwright (outside src/ so they never touch the Go module). The tests drive the real app in headless Chromium, generating their own media in-page (canvas -> MediaRecorder WebM, synthesized WAV) and asserting on rendered pixels, so they exercise the full compositor / playback / export pipeline rather than mocking it. Structure: - lib/static-server.js minimal static server for the ArozOS web root - lib/harness.js browser launch + app navigation + ok()/fail(); resolves Playwright's own Chromium (no hardcoded path), overridable via PW_CHROMIUM_PATH - run.js serves src/web, runs each spec in its own process, exits non-zero on any failure - specs/functional.js media probe, playback, edit, round-trip, WebM export - specs/features.js effects, titles, transitions, elements, filters - specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import - specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave 41 assertions across the four specs, all passing locally. CI: .github/workflows/e2e-playwright.yml installs Node + Playwright Chromium and runs `npm test`, scoped to changes under the app or the harness so unrelated commits don't trigger it. Front-end only - runs independently of the Go build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * Claude/arozos playwright tests for arozos (#269) * Add full-stack Playwright E2E suite for ArozOS critical paths Extend the Playwright harness (previously Cine Studio only) with a 'system' suite that drives a real ArozOS server built from src/: - lib/arozos-server.js boots a disposable isolated instance (.instance/: web symlink + private system copy) and bootstraps a deterministic admin account at the zero-user state - lib/system-harness.js shares login (form + API), CSRF, JSON and pass/fail helpers; each spec also runs standalone - specs-system/ covers the critical paths: 010 sign in / sign out (form render, bad credentials, session persistence, gated redirects, logout, retry delay) 020 desktop shell (task bar, start menu, module list, quick access panel identity, UI sign-out) 030 file explorer (File Manager UI render + full file lifecycle: create, rename, copy, move, properties, recycle/restore/clear trash, permanent delete, CSRF enforcement) 040 system settings (settings UI, catalogue groups, admin-only modules, host info, permission group listing) 050 user management + permission control (group CRUD, user CRUD, restricted-user module visibility, admin-only endpoint denial, administrator group protection) - run.js orchestrates both suites; npm run test:static / test:system - CI workflow now builds the Go binary, triggers on src/** changes and uploads the server log on failure Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 1 E2E spec and coverage roadmap - specs-system/060-webapps-core.js: smoke + interaction coverage for the highest-importance WebApps (NotepadA, Text, Photo, Music, Video, PDF Viewer, Zip File Manager) against the real server, including opening a real file in NotepadA via the desktop hash convention - README: document the ranked 44-WebApp inventory and the wave order for upcoming specs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 2 E2E spec (office/productivity) specs-system/070-webapps-office.js: smoke + interaction coverage for Code Studio, MDEditor, Calendar, Notes, Memo, Reminders, OfficeViewer and Dashboard against the real server, including opening a real Markdown file in MDEditor via the desktop hash convention and probing Dashboard's live system-info data source. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 3 E2E spec (media/creative) specs-system/080-webapps-media.js: smoke coverage for Musicify, Movie, Manga, Paint, Pixel Studio, Audio Studio, Camera, Recorder and FFmpeg Factory against the real server, plus a probe of the storage data path the media library apps browse. Cine Studio keeps its own deep static suite and is not repeated here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 4 E2E spec (utilities/dev/network) + close roadmap specs-system/090-webapps-utilities.js: smoke coverage for Calculator (incl. a real 7+8=15 calculation through the UI), Clock, Browser, Speedtest, Web Downloader, Web Builder, SQLite Admin, Terminal, AGIForge, AIChat, OTPAuth, Productivity, OnScreenKeyboard, Arozcast, Management Gateway, UnitTest, CronDemo and Serverless. This completes coverage of all 44 WebApps under src/web across four waves. README updated to reflect the full map; full suite (13 spec files: 4 static + 9 system) passes end to end. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add deep file-transfer critical-path spec (upload/download/search/share) specs-system/035-file-transfer.js extends the file-explorer coverage with the transfer features that move real bytes: - multipart upload of a real file - media download with byte-exact round-trip verification - file search by keyword - share-link lifecycle: create, list, anonymous direct download via /share/download/{uuid}/ (byte-exact) + preview page, then delete and confirm the share is revoked Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add account password-change critical-path spec specs-system/055-account.js exercises the My Account flow on a dedicated throwaway user (keeping the shared admin login intact): account settings UI render, userinfo identity, wrong-old-password refusal, successful change, and that afterwards only the new password signs in. README updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop backend API spec (every /system/desktop endpoint) specs-system/021-desktop-api.js covers the full desktop.go API surface with the exact request shapes desktop.html uses: host/device details; user self-info (quota/groups/admin), another user's public info via ?target, and noicon; theme listing + set/get round-trip; preference set/get/remove; createShortcut + listDesktop metadata; icon location files set/get/del; and renameShortcut incl. off-desktop rejection. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop UI shell spec (clock, panels, start menu, search, icons) specs-system/022-desktop-ui.js drives the real desktop.html: wallpaper frame mounts, the taskbar clock shows a formatted time, the quick access panel carries the user identity, the start menu opens with module entries, its search box narrows the list and reports No Result for gibberish, the notification bar toggles from the clock, and an API-seeded shortcut renders as a desktop launch icon. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop float-window + context-menu spec and update README specs-system/023-desktop-windows.js drives the desktop window manager and right-click surfaces using the app's own globals and real clicks: openModule spawns a float window with a taskbar entry; newFloatWindow creates addressable windows; focus raises z-order; maximize/restore, minimize and close all work; and the wallpaper + icon context menus open with the expected entries. Desktop coverage is now three specs deep (API 021, UI 022, windows 023) on top of the original 020 shell smoke test. README layout updated. Full system suite (14 specs) passes together. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow --------- Co-authored-by: Claude <noreply@anthropic.com> * Video Editor Cline Update (#270) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Playwright E2E suite for Cine Studio + GitHub Actions job Ports the browser-driven tests used to verify Cine Studio into the codebase under test/e2e/playwright (outside src/ so they never touch the Go module). The tests drive the real app in headless Chromium, generating their own media in-page (canvas -> MediaRecorder WebM, synthesized WAV) and asserting on rendered pixels, so they exercise the full compositor / playback / export pipeline rather than mocking it. Structure: - lib/static-server.js minimal static server for the ArozOS web root - lib/harness.js browser launch + app navigation + ok()/fail(); resolves Playwright's own Chromium (no hardcoded path), overridable via PW_CHROMIUM_PATH - run.js serves src/web, runs each spec in its own process, exits non-zero on any failure - specs/functional.js media probe, playback, edit, round-trip, WebM export - specs/features.js effects, titles, transitions, elements, filters - specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import - specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave 41 assertions across the four specs, all passing locally. CI: .github/workflows/e2e-playwright.yml installs Node + Playwright Chromium and runs `npm test`, scoped to changes under the app or the harness so unrelated commits don't trigger it. Front-end only - runs independently of the Go build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * New webapp RAW Editor (#271) * Add Raw Editor webapp with RAW decode, develop controls and LUT grading Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW files client-side and develops them with a Camera-Raw style interface. Decoder (js/rawdecoder.js): - TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2, ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal. - CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy compression, bilinear demosaic with black/white-level normalisation and camera (AsShotNeutral) or gray-world white balance. - Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force SOI/EOI scan) so any RAW still renders when its compression is unsupported. - EXIF metadata (camera, shutter, aperture, ISO, focal length). Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing white balance (temperature/tint), exposure, contrast, highlights, shadows, whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional 3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local contrast. Keeps a valid identity 3D texture bound at all times so drivers that reject incomplete sampler3D bindings still render. LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a WebGL 3D texture. UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local picker and drag & drop) and JPEG export back to storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Hand off developed image to Pixel Studio on Done Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS) and launches Pixel Studio as a float window with that file as its input (matching Pixel Studio's ao_module_loadInputFiles hash format), then closes the Raw Editor window. Falls back to the normal Save dialog when running outside the ArozOS desktop. The bottom-bar button is relabelled "Open in Pixel Studio". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout Rework the develop panel into the 2024 Lightroom-style layout: - Thin centred title bar with open / save / reset / fit icons. - Borderless histogram with shadow/highlight clipping indicators and an EXIF readout (ISO, focal, aperture, shutter). - "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills. - Profile selector row. - Collapsible Light / Color / Effects / LUT groups, each with a chevron to fold and an eye toggle that bypasses that group's adjustments. - Lightroom slider rows: label + right-aligned editable value on one line, thin track below, with coloured gradient tracks for Temperature (blue-> yellow), Tint (green->magenta) and Vibrance / Saturation. - White-balance eyedropper wired to auto white balance. - Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined dimension readout and Cancel / Open in Pixel Studio actions. - Decorative panel-selector strip on the right edge. Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain (post noise) controls to the WebGL develop shader to complete the Effects group, plus per-group bypass handling in the parameter builder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add ArozOS-backed LUT library with a managed folder LUTs can now be managed through the user's ArozOS storage instead of only one-off browser uploads: - On first use the app creates a "user:/RawEditor/LUTs" folder (via the file_system newItem endpoint with a CSRF token). Users can drop .cube files into it with the Files app. - The LUT panel scans that folder (listDir) and lists every .cube in a "Library" dropdown; picking one reads it back through the media endpoint, parses it and applies it live. A refresh button re-scans on demand. - "Import .cube to library" still loads a local file immediately and now also uploads it into the library folder so it persists and reappears in the list next time. - Selecting a LUT re-enables the LUT group (clears any eye bypass); the hint line reports how many LUTs are available. Falls back gracefully to local import when running outside the ArozOS desktop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add scroll-zoom and right-drag pan; remove unused UI - Scroll wheel now zooms the photo, centred on the cursor, and the current zoom level is shown in the status bar. Fit / 100% buttons reset the view. - Right-mouse (or middle) button drag pans the image; the browser context menu is suppressed over the canvas. The view re-fits on window resize. The canvas is now transform-based (translate + scale) instead of the old fit / 1:1 CSS toggle. - Removed the Profile dropdown (no camera profiles in this pipeline) and the decorative right-edge tool strip, so the panel only shows working controls. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Pan with left mouse button and fix LUT dropdown overflow - Change canvas panning from right-drag to left-mouse (and middle) drag, with a grab / grabbing cursor over the image. The context menu is no longer suppressed. - Fix the LUT Library dropdown (and any select) overflowing the panel when an option label is long: give .mini-select min-width:0 so it can shrink inside its flex row instead of stretching to the widest option. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Load EXIF from JPEG APP1 so shooting info shows reliably Some RAW files (and any plain JPEG) did not populate the ISO / focal / aperture / shutter readout under the histogram. The cause: when the RAW's outer TIFF structure fails to parse, the image still loads via the brute-force embedded-JPEG scan, but the metadata comes back empty. Add a JPEG APP1 EXIF reader (the APP1 payload is itself a TIFF block, so it reuses the existing TIFF parser) and use it to: - read EXIF for plain JPEG images, and - fill any missing EXIF fields from the embedded preview for RAW files, which rescues shooting info when the main TIFF could not be parsed. Also harden applyMeta so the EXIF line is written before the window-title call and a title error can no longer suppress it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Match Photoshop LUT rendering: tetrahedral interpolation + true sRGB The same .cube LUT looked cyan/teal-shifted compared to Photoshop. Two causes, both fixed: - Interpolation: the 3D LUT was sampled with GPU trilinear filtering, which introduces a cyan/green cast on film-style LUTs. Switch the LUT textures to NEAREST and do proper tetrahedral interpolation in the shader — the same method Photoshop's Color Lookup and Resolve use. - Transfer function: encode to display with the true sRGB OETF instead of a plain 2.2 gamma. This exactly inverts the sRGB decode applied to 8-bit sources, so the values fed into the LUT match what Photoshop feeds it (previously the mismatch shifted shadow tones the LUT is sensitive to). Also honour the LUT's DOMAIN_MIN / DOMAIN_MAX when sampling. Verified in-browser: an identity LUT now passes through unchanged (exact tetrahedral), a channel-swap LUT swaps correctly, and a constant LUT maps to the constant. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Harden RAW EXIF parsing for real camera files Improve the chance that ISO / focal / aperture / shutter show for real RAWs (e.g. Sony ARW), which kept the readout blank: - Scan every embedded JPEG for APP1 EXIF, not just the largest preview. Sony keeps EXIF in the small thumbnail while the full-size preview has none. - Stop recursing the MakerNote (0x927C) as if its bytes were IFD offsets — that could be pathologically slow / derail a clean parse on real files; EXIF is reached through the standard ExifIFD (0x8769) pointer. - Cap IFD entry counts (>4096) to bail out of parsing stray/garbage offsets. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Fix RAW preview selection: never decode CFA raw as the preview image On real Sony ARW files the develop view hung and EXIF stayed blank. Root cause: the CFA raw plane is a lossless-JPEG-compressed stream that also starts with 0xFFD8, and the embedded-preview finder picked it as the "largest JPEG" (31 MB) and handed it to the browser to decode as an image. The browser cannot decode lossless JPEG, so decoding stalled and the pipeline never reached the metadata display. Fixes: - Ignore CFA / raw IFDs (Photometric 32803) when hunting for a preview JPEG. - Only accept a range that is a real JPEG (SOI at the start AND EOI at the end) via a looksLikeJpeg() check, so a truncated raw stream can't be chosen. - Cap the brute-force SOI/EOI scan span so raw bytes containing 0xFFD8 can't yield a multi-megabyte junk range. With this, ARW files pick the correct full-size preview, the image loads, and ISO / focal / aperture / shutter populate under the histogram. Verified against a real 25MP Sony ILCE-6700 ARW end-to-end in the browser. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 --------- Co-authored-by: Claude <noreply@anthropic.com> * RAW Editor - LUT Preview update (#272) * Add Raw Editor webapp with RAW decode, develop controls and LUT grading Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW files client-side and develops them with a Camera-Raw style interface. Decoder (js/rawdecoder.js): - TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2, ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal. - CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy compression, bilinear demosaic with black/white-level normalisation and camera (AsShotNeutral) or gray-world white balance. - Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force SOI/EOI scan) so any RAW still renders when its compression is unsupported. - EXIF metadata (camera, shutter, aperture, ISO, focal length). Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing white balance (temperature/tint), exposure, contrast, highlights, shadows, whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional 3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local contrast. Keeps a valid identity 3D texture bound at all times so drivers that reject incomplete sampler3D bindings still render. LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a WebGL 3D texture. UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local picker and drag & drop) and JPEG export back to storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Hand off developed image to Pixel Studio on Done Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS) and launches Pixel Studio as a float window with that file as its input (matching Pixel Studio's ao_module_loadInputFiles hash format), then closes the Raw Editor window. Falls back to the normal Save dialog when running outside the ArozOS desktop. The bottom-bar button is relabelled "Open in Pixel Studio". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout Rework the develop panel into the 2024 Lightroom-style layout: - Thin centred title bar with open / save / reset / fit icons. - Borderless histogram with shadow/highlight clipping indicators and an EXIF readout (ISO, focal, aperture, shutter). - "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills. - Profile selector row. - Collapsible Light / Color / Effects / LUT groups, each with a chevron to fold and an eye toggle that bypasses that group's adjustments. - Lightroom slider rows: label + right-aligned editable value on one line, thin track below, with coloured gradient tracks for Temperature (blue-> yellow), Tint (green->magenta) and Vibrance / Saturation. - White-balance eyedropper wired to auto white balance. - Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined dimension readout and Cancel / Open in Pixel Studio actions. - Decorative panel-selector strip on the right edge. Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain (post noise) controls to the WebGL develop shader to complete the Effects group, plus per-group bypass handling in the parameter builder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add ArozOS-backed LUT library with a managed folder LUTs can now be managed through the user's ArozOS storage instead of on… --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alan Yeung <yeungbluecat123@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: calico-cat-3333 <113905958+calico-cat-3333@users.noreply.github.com> Co-authored-by: mirkosalvato1-ctrl <mirkosalvato1@gmail.com> Co-authored-by: mirkosalvato1-ctrl <227404546+mirkosalvato1-ctrl@users.noreply.github.com> Co-authored-by: Po-Han Shih <79733497+stantheman0128@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: 白铭骢 (Mingcong Bai) <jeffbai@aosc.io> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: tobychui <24617523+tobychui@users.noreply.github.com>
  • d23775e273 Add codec-aware playback and fMP4 HLS support Switch HLS output from MPEG-TS to fragmented MP4, enabling direct MediaSource appending without a demuxer. Add a /media/probe/ endpoint that reports actual codecs and whether a file can be direct-played, replacing the unreliable extension-based check that caused HEVC and 10-bit H.264 files to fail with decode errors. Add hlsmse.js, a lightweight MSE player for Firefox/Chrome that makes hls.js optional. Fix 10-bit transcodes producing High 10 streams browsers cannot decode by adding -pix_fmt yuv420p. Rewrite the fMP4 playlist init segment URI onto the segment endpoint (ffmpeg always writes it as a bare filename).
  • Просмотр сравнение для этих 2 коммитов »

6 дней назад

TC синхронизированные коммиты с v3.0.2 на TC/arozos-mirror из зеркала

  • f7abb784be Merge origin/master into v3.0.2 - resolve conflicts Co-authored-by: tobychui <24617523+tobychui@users.noreply.github.com>
  • f3d94b84e0 Bump github.com/go-git/go-git/v5 from 5.19.1 to 5.19.2 in /src (#297) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.19.1 to 5.19.2. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • 5e4dbab17d Bump github.com/pion/stun/v3 from 3.0.1 to 3.1.5 in /src (#295) Bumps [github.com/pion/stun/v3](https://github.com/pion/stun) from 3.0.1 to 3.1.5. - [Release notes](https://github.com/pion/stun/releases) - [Commits](https://github.com/pion/stun/compare/v3.0.1...v3.1.5) --- updated-dependencies: - dependency-name: github.com/pion/stun/v3 dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • 4dd1ae4ff1 Bump github.com/pion/dtls/v3 from 3.0.7 to 3.1.4 in /src (#296) Bumps [github.com/pion/dtls/v3](https://github.com/pion/dtls) from 3.0.7 to 3.1.4. - [Release notes](https://github.com/pion/dtls/releases) - [Commits](https://github.com/pion/dtls/compare/v3.0.7...v3.1.4) --- updated-dependencies: - dependency-name: github.com/pion/dtls/v3 dependency-version: 3.1.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • ea0da40e51 docs: fix a typo RSICV64 => RISC-V 64-bit (#291)
  • Просмотр сравнение для этих 14 коммитов »

6 дней назад

TC синхронизированные коммиты с master на TC/arozos-mirror из зеркала

  • 2ecbb06b4c Merge branch 'v3.0.3' into master
  • f7cc25288a V3.0.2 (#299) * Add CalDAV server for iOS Calendar bidirectional sync (#256) Add CalDAV server for iOS Calendar bidirectional sync (#256) * Updated CLAUDE.md (#257) * Updated CLAUDE.md * Add Reminders WebApp * Add Reminders WebApp (macOS Reminders-style) A self-contained ArozOS WebApp that mimics the macOS Reminders app. Front-end (web/Reminders/index.html), single-page, no framework: - Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a Completed card — plus custom "My Lists" with colour + SF-style icons and live incomplete counts, an Add List action and a light/dark toggle. - Reminder rows with circle checkboxes, inline title editing, sub-tasks (Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue), flags, priority (!/!!/!!!) and clickable URLs. - Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/ Tonight), Scheduled by date (with an Overdue group), All/Search by list. - A detail editor popover (On a Day / At a Time, priority, list, URL, flag) and a list create/edit modal with colour and icon pickers. - Native macOS look with full light/dark theming; sticky UI prefs via localStorage; responsive off-canvas sidebar on narrow screens. Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user { lists, reminders } store to user:/Document/Reminders/data.json via filelib, following the Calendar app's pattern: init (load + seed default list), saveReminder/deleteReminder, saveList/deleteList and a full saveData for re-ordering and clearing completed items. https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ * Add CalDAV VTODO sync for Reminders and recurring support Expose the Reminders web-app data as a CalDAV VTODO collection at /caldav/{username}/reminders/ so iOS Reminders can sync bidirectionally alongside the existing Calendar (VEVENT) collection. The principal now advertises a calendar-home-set containing both collections. Add RRULE recurrence support: events and reminders pass their recurrence rule through ICS in both directions. The Reminders UI gains a Repeat selector, shows a repeat indicator, and rolls recurring reminders forward to their next occurrence on completion (matching iOS behaviour). --------- Co-authored-by: Claude <noreply@anthropic.com> * Bump internal_version to 3.0.1 Update internal build version from 3.0.0 to 3.0.1 in src/flags.go to reflect a minor release increment. * Add shell mode (virtual FS) to web terminal Introduce an interactive shell mode for the web Terminal. Backend (session.agi): implement shell state, virtual path resolution, many shell commands (pwd, ls, cd, cat, mkdir, touch, rm, cp, mv, echo, whoami, clear, exit, help), tab-completion, prompt building, safe filelib wrappers, and new websocket message types (shellmode, clear, complete, shellPrompt in result). Frontend (index.html): track shellMode/shellPrompt, render shell output differently, handle shell enter/exit and clear messages, send/handle completion requests/responses, adjust input handling (Tab completion and disabling REPL dot-commands while in shell). Add .claude/launch.json to run a local static server for src/web. This enables a secure virtual filesystem shell inside the AGI REPL without host FS access. * TURN update for Arozcast screen share over Internet (#259) * Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 in /src (#255) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add Reminders WebApp (macOS Reminders-style) A self-contained ArozOS WebApp that mimics the macOS Reminders app. Front-end (web/Reminders/index.html), single-page, no framework: - Sidebar with the smart-list grid — Today, Scheduled, All, Flagged and a Completed card — plus custom "My Lists" with colour + SF-style icons and live incomplete counts, an Add List action and a light/dark toggle. - Reminder rows with circle checkboxes, inline title editing, sub-tasks (Tab/Shift+Tab to indent), notes, due date/time chips (red when overdue), flags, priority (!/!!/!!!) and clickable URLs. - Smart-view grouping: Today by time-of-day (All-Day/Morning/Afternoon/ Tonight), Scheduled by date (with an Overdue group), All/Search by list. - A detail editor popover (On a Day / At a Time, priority, list, URL, flag) and a list create/edit modal with colour and icon pickers. - Native macOS look with full light/dark theming; sticky UI prefs via localStorage; responsive off-canvas sidebar on narrow screens. Back-end AGI scripts (web/Reminders/backend/*.agi) persist a per-user { lists, reminders } store to user:/Document/Reminders/data.json via filelib, following the Calendar app's pattern: init (load + seed default list), saveReminder/deleteReminder, saveList/deleteList and a full saveData for re-ordering and clearing completed items. https://claude.ai/code/session_018JqHkXkuYjj5hz4kjiS1fQ * Add built-in TURN relay so Arozcast screen share works over the Internet Arozcast screen share is a direct WebRTC peer-to-peer connection that only used public STUN servers, so it could not traverse NAT and failed over the Internet. Add a built-in TURN relay (pion/turn, MIT, pure Go) that both peers reach through the same ArozOS host, plus an /api/arozcast/iceservers endpoint that hands the browser STUN + TURN with short-lived HMAC-signed credentials. The relay is optional/configurable, and operators can override the ICE list entirely with system/arozcast/iceservers.json to use an external TURN. - mod/network/turn: pion/turn wrapper + ephemeral credential helpers (tested) - cast.go: start the relay in ArozcastInit; serve /api/arozcast/iceservers - main.go: close the relay on shutdown - flags.go: -arozcast_turn, -arozcast_turn_port, -arozcast_turn_publicip - screenshare.html / index.html: fetch ICE servers (STUN fallback) - Arozcast README: endpoint + Internet/TURN operations docs Media casting (Musicify/Movie/Photo) already worked over the Internet via the existing relay and is unchanged. https://claude.ai/code/session_01P68sFxtXuRXfzDnwtpFrnU * Add TURN-over-TLS and a System Settings toggle for the Arozcast relay Builds on the built-in Arozcast TURN relay with two operator-facing enhancements. TURN-over-TLS (TURNS): - turn.NewServer now optionally starts a TURNS listener (TLSPort + TLSCertFile/TLSKeyFile) alongside the plain UDP/TCP relay, reusing the system TLS certificate. Restrictive firewalls that only permit outbound TLS (commonly 443) can then relay screen share, since the media rides inside a connection indistinguishable from HTTPS. - Listener setup tracks every opened conn so a later failure cleans up; a TURNS failure is non-fatal (logged, plain relay keeps running). - /api/arozcast/iceservers advertises turns:host:port?transport=tcp when the listener is up. New flags: -arozcast_turn_tls (default on, no-op without a usable cert) and -arozcast_turn_tls_port (default 5349; set to 443 for maximum reach). System Settings toggle & status: - The relay is now runtime-managed (mutex-guarded start/stop with a remembered config) and its on/off state is persisted in the system database, overriding the -arozcast_turn flag default across restarts. - New admin-only endpoints /system/arozcast/turn/{status,setEnabled} via the permission router, plus a "Screen Share Relay" page under System Settings -> Network & Connection (SystemAO/arozcast/turn.html) showing running state, port, TURNS and advertised host. Tests cover the TURNS listener (self-signed cert handshake) and the non-fatal missing-cert path. README documents both features. * Drop the SNI-routing proxy caveat from the TURNS 443 docs The TURN-over-TLS note suggested fronting port 443 with a TLS/SNI-routing proxy to share it with the web server. That over-complicated the guidance; replace it with a plain statement that 5349 is the default and 443 is only viable when free on the relay's address. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> * Add single instance support to Movie * Add cross-tab theme sync and file selector fixes Broadcast theme changes to other open tabs and improve file selector callback handling. file_explorer.html now writes ao_system_theme to localStorage when toggling theme in standalone mode so other tabs can react. ao_module.js adds ao_module_onThemeChanged, ao_module_toggleSystemTheme and an internal _ao_theme_broadcast to support both VDI (desktop-driven) and standalone/cross-tab theme propagation. Also fixes and documents file selector behavior: allow callback as a string or named function, auto-register a temporary global for anonymous callbacks in VDI mode, resolve string callbacks in non-VDI polling mode, and clean up localStorage handling. Minor typo/comment and whitespace fixes included. * Add theme listener to desktop * Added more icons for Code Studio * Added wip productivity app * Renewed Text app * Updated Productivity app * Text module style update * Add RWD support to text * Add Markdown source-mark reveal and image sync Show Typora-style markdown source marks and allow inline editing of image references. Adds CSS pseudo-elements to reveal heading, emphasis, code, blockquote and link syntax; a settings selector to control reveal mode (active/always/none); and a default syntax setting. Implements updateActiveBlock(), clearDecorations(), decorateBlock(), editable .md-imgsyn labels, syncImgFromSyn()/commitImgSyn(), and helpers (richPlainText, activeImgSyn, caret/block helpers) to keep serialization and word count unchanged. Updates event handlers and key handling to support image-label editing, heading mark editing, backspace behavior at block start, and selection changes. Ensures getContent strips editable image labels before turndown and wires UI state updates throughout. * Text: add Notion mode with slash commands and document-aware AI (#260) Adds a toolbar toggle that enables a Notion-style "/" command menu in the Markdown editor. Typing "/" at a line start (or after a space) opens a filterable, keyboard-navigable menu to quickly insert blocks (headings, to-do/bullet/numbered lists, quote, code block, table, divider) and to run AI actions. AI actions feed the entire current document in as context and insert the generated Markdown at the caret, with an inline "Ask AI" prompt for free-form instructions plus presets (continue writing, summarize, brainstorm, outline). Generation is relayed through a new Text/ai.agi backend that calls the aimodel library; the AI endpoint/key are configured by an admin in System Settings. A new "Notion & AI" settings section lets users toggle the feature, pick a model (lazy-loaded from the endpoint) and set the temperature; all preferences persist alongside the existing editor settings. Claude-Session: https://claude.ai/code/session_01Xd4TY3ecHMDdG7es1JqbKo Co-authored-by: Claude <noreply@anthropic.com> * Revert "Text: add Notion mode with slash commands and document-aware AI (#260)" This reverts commit be21397ccf060ed4fe403c48fbe3d63d72669965. * Added advanced code block function to Text * Add code-language picker and blank-line handling Introduce a code-block language <select> UI and preserve runs of blank paragraphs through round-trip serialization. Add LANG_LIST and TextHL.languages(), ensure language selectors are appended to <pre> blocks (contenteditable=false and stripped on save), and wire syncLangSelector/ensureLangSelector/clearLangSelectors/onLangSelectChange. Implement renderWithBlankRuns() and expandBlankSentinels() to keep multiple empty paragraphs, switch marked.parse/getContent/renderedHTML to use these, and replace the previous &nbsp; sentinel with a ZWSP sentinel. Fix code-block editing by rewriting newline/delete logic to operate on the code textContent (insertNewlineInCode, deleteInCode) to avoid DOM fragmentation and caret issues; add protection for key handling when the language <select> has focus. Adjust decoration logic to avoid marking PRE as md-active and update syntax display rules. Rename/move backend modules under Text/backend (export.agi, filesaver.agi, imgtool.agi) and update ao_module_agirun calls to use the new paths. Add related CSS for the language picker and other small UI adjustments. * Add link editor and improve code highlighting Introduce an interactive link editor and inline editable link marks, replacing the previous CSS-only closing a::after pseudo-element with a real .md-linksyn element so link URLs are clickable/editable. Add link dialog UI (overlay, inputs, remove/cancel/OK handlers) and associated logic to insert/edit/remove links, preserve/restore selection, and avoid tearing down marks while edited. Enhance code-block highlighting: switch to relightCode/highlightCode with caret/selection preservation (selectionEndOffsetIn, restoreCaretIn), handle live re-highlighting on edits, language changes, and prevent stuck empty code blocks by exiting them (exitEmptyCodeBlock). Also fix caret placement when clicking below trailing code blocks (escapeTrailingCodeBlockClick), update serialization to strip .md-linksyn, and adjust toolbar/labels for the link action. * Add support for token access in webdav server X-Access-Token + X-Aroz-User now can be used to login webdav with autologin token instead of Basic Auth * Add CNN inference API support * Rename aimodel to llm and add LLM server pkg Replace the legacy "aimodel" library with a new "llm" library and introduce a dedicated aiservers/llm package. Key changes: - Rename library identifier from "aimodel" to "llm" across docs and backend scripts (README, AGI scripts, web backend examples). - Remove the old agi.aimodel implementation and add agi.llm (new AGI lib) plus agi.llm_test.go. - Add mod/aiservers/llm package with client, OpenAI/Anthropic adapters and types, and tests (client.go, openai.go, anthropic.go, types.go, and tests). - Update tests and module wiring to use LLMConfig/LLMPricing/llmDBTable and injectLLMFunctions where appropriate. - Minor updates to web demo backend/init scripts and API docs to reflect the new requirelib name. Notes: System Settings UI and routes retaining the original "AI Model" naming; only the requirelib identifier and internal Go types/DB table references were changed. This restructures wire-protocol logic into the new aiservers/llm package for clearer separation of concerns and easier protocol-specific handling. * Fixed #204 * Add text color change inline * Add free resize on select tool * Add Cine Studio, a Premiere-like timeline video editor webapp (#263) A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 Co-authored-by: Claude <noreply@anthropic.com> * Docker support (#264) * Updated Video Editor app to have more functionalities (#266) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * Fix docker package build failure on FreeBSD and other unlisted platforms (#267) The docker package split its PTY console and host-stats helpers into build-tagged files that only covered linux/darwin/windows. FreeBSD (built by the Jenkins release pipeline for amd64 and i386) matched none of them, so startDockerExecPTY, hostStorageUsage and hostLoadAvg were undefined and the cross-platform release build failed. - console_unix.go now builds for freebsd too (creack/pty supports it). - console_windows.go becomes console_other.go, a catch-all (!linux && !darwin && !freebsd) stub covering windows and any other GOOS. - host_darwin.go becomes host_bsd.go (darwin || freebsd); the Statfs-based storage helper works on both. - Add host_other.go, a catch-all fallback so the package builds on any remaining GOOS. Also expand the CI cross-compile smoke test to cover the full release matrix (including freebsd/amd64 and freebsd/386) so a platform-specific break is caught in CI instead of only in the release build. Claude-Session: https://claude.ai/code/session_01L4oR1xiTxpcfwYjRgi4RGh Co-authored-by: Claude <noreply@anthropic.com> * Added playwright e2e tests for cine studio (#268) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Playwright E2E suite for Cine Studio + GitHub Actions job Ports the browser-driven tests used to verify Cine Studio into the codebase under test/e2e/playwright (outside src/ so they never touch the Go module). The tests drive the real app in headless Chromium, generating their own media in-page (canvas -> MediaRecorder WebM, synthesized WAV) and asserting on rendered pixels, so they exercise the full compositor / playback / export pipeline rather than mocking it. Structure: - lib/static-server.js minimal static server for the ArozOS web root - lib/harness.js browser launch + app navigation + ok()/fail(); resolves Playwright's own Chromium (no hardcoded path), overridable via PW_CHROMIUM_PATH - run.js serves src/web, runs each spec in its own process, exits non-zero on any failure - specs/functional.js media probe, playback, edit, round-trip, WebM export - specs/features.js effects, titles, transitions, elements, filters - specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import - specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave 41 assertions across the four specs, all passing locally. CI: .github/workflows/e2e-playwright.yml installs Node + Playwright Chromium and runs `npm test`, scoped to changes under the app or the harness so unrelated commits don't trigger it. Front-end only - runs independently of the Go build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * Claude/arozos playwright tests for arozos (#269) * Add full-stack Playwright E2E suite for ArozOS critical paths Extend the Playwright harness (previously Cine Studio only) with a 'system' suite that drives a real ArozOS server built from src/: - lib/arozos-server.js boots a disposable isolated instance (.instance/: web symlink + private system copy) and bootstraps a deterministic admin account at the zero-user state - lib/system-harness.js shares login (form + API), CSRF, JSON and pass/fail helpers; each spec also runs standalone - specs-system/ covers the critical paths: 010 sign in / sign out (form render, bad credentials, session persistence, gated redirects, logout, retry delay) 020 desktop shell (task bar, start menu, module list, quick access panel identity, UI sign-out) 030 file explorer (File Manager UI render + full file lifecycle: create, rename, copy, move, properties, recycle/restore/clear trash, permanent delete, CSRF enforcement) 040 system settings (settings UI, catalogue groups, admin-only modules, host info, permission group listing) 050 user management + permission control (group CRUD, user CRUD, restricted-user module visibility, admin-only endpoint denial, administrator group protection) - run.js orchestrates both suites; npm run test:static / test:system - CI workflow now builds the Go binary, triggers on src/** changes and uploads the server log on failure Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 1 E2E spec and coverage roadmap - specs-system/060-webapps-core.js: smoke + interaction coverage for the highest-importance WebApps (NotepadA, Text, Photo, Music, Video, PDF Viewer, Zip File Manager) against the real server, including opening a real file in NotepadA via the desktop hash convention - README: document the ranked 44-WebApp inventory and the wave order for upcoming specs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 2 E2E spec (office/productivity) specs-system/070-webapps-office.js: smoke + interaction coverage for Code Studio, MDEditor, Calendar, Notes, Memo, Reminders, OfficeViewer and Dashboard against the real server, including opening a real Markdown file in MDEditor via the desktop hash convention and probing Dashboard's live system-info data source. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 3 E2E spec (media/creative) specs-system/080-webapps-media.js: smoke coverage for Musicify, Movie, Manga, Paint, Pixel Studio, Audio Studio, Camera, Recorder and FFmpeg Factory against the real server, plus a probe of the storage data path the media library apps browse. Cine Studio keeps its own deep static suite and is not repeated here. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add WebApp wave 4 E2E spec (utilities/dev/network) + close roadmap specs-system/090-webapps-utilities.js: smoke coverage for Calculator (incl. a real 7+8=15 calculation through the UI), Clock, Browser, Speedtest, Web Downloader, Web Builder, SQLite Admin, Terminal, AGIForge, AIChat, OTPAuth, Productivity, OnScreenKeyboard, Arozcast, Management Gateway, UnitTest, CronDemo and Serverless. This completes coverage of all 44 WebApps under src/web across four waves. README updated to reflect the full map; full suite (13 spec files: 4 static + 9 system) passes end to end. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add deep file-transfer critical-path spec (upload/download/search/share) specs-system/035-file-transfer.js extends the file-explorer coverage with the transfer features that move real bytes: - multipart upload of a real file - media download with byte-exact round-trip verification - file search by keyword - share-link lifecycle: create, list, anonymous direct download via /share/download/{uuid}/ (byte-exact) + preview page, then delete and confirm the share is revoked Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add account password-change critical-path spec specs-system/055-account.js exercises the My Account flow on a dedicated throwaway user (keeping the shared admin login intact): account settings UI render, userinfo identity, wrong-old-password refusal, successful change, and that afterwards only the new password signs in. README updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop backend API spec (every /system/desktop endpoint) specs-system/021-desktop-api.js covers the full desktop.go API surface with the exact request shapes desktop.html uses: host/device details; user self-info (quota/groups/admin), another user's public info via ?target, and noicon; theme listing + set/get round-trip; preference set/get/remove; createShortcut + listDesktop metadata; icon location files set/get/del; and renameShortcut incl. off-desktop rejection. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop UI shell spec (clock, panels, start menu, search, icons) specs-system/022-desktop-ui.js drives the real desktop.html: wallpaper frame mounts, the taskbar clock shows a formatted time, the quick access panel carries the user identity, the start menu opens with module entries, its search box narrows the list and reports No Result for gibberish, the notification bar toggles from the clock, and an API-seeded shortcut renders as a desktop launch icon. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow * Add desktop float-window + context-menu spec and update README specs-system/023-desktop-windows.js drives the desktop window manager and right-click surfaces using the app's own globals and real clicks: openModule spawns a float window with a taskbar entry; newFloatWindow creates addressable windows; focus raises z-order; maximize/restore, minimize and close all work; and the wallpaper + icon context menus open with the expected entries. Desktop coverage is now three specs deep (API 021, UI 022, windows 023) on top of the original 020 shell smoke test. README layout updated. Full system suite (14 specs) passes together. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PdeQtHTSvBQgUpWfKWvkow --------- Co-authored-by: Claude <noreply@anthropic.com> * Video Editor Cline Update (#270) * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Cine Studio, a Premiere-like timeline video editor webapp A new dark macOS-style video editor under src/web/Cine Studio with: - Media bin importing from the ArozOS file system (file selector + File Manager drag-drop) and from the local device (uploaded to user:/Cine Studio/Media so projects stay portable), with probed durations, filmstrip thumbnails and decoded waveform peaks - Multi-track timeline (video/audio) with drag-move, edge trimming, blade splitting, snapping, track visibility/mute toggles, zoomable timecode ruler and undo/redo history - Canvas compositing preview player with per-clip transform, crop mode, opacity, color controls (exposure/contrast/saturation/presets) and a WebAudio mix bus for synced audio playback - .cine project format (open/save/save-as via ao_module file selector, registered as a file association with its own icon) - Export pipeline: real-time MediaRecorder render to WebM uploaded to the ArozOS storage, with optional server-side MP4 conversion through the AGI ffmpeg library when the host has ffmpeg installed Backend AGI scripts create the per-user app folders and expose the ffmpeg availability check / conversion / cleanup actions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Remove macOS traffic lights and implement all stubbed Cine Studio features Top bar: drop the decorative macOS traffic-light buttons. Effects (new js/effects.js): per-clip effect stacks (Black & White, Sepia, Invert, Hue Shift, Blur, Pixelate, Mirror, Vignette, Film Grain, Fade In/Out) applied by the compositor so preview and export match. Fades also ramp audio-clip volume. Gallery panel with rendered preview cards plus an inspector Effects tab with amount sliders, add/remove and an fx badge on timeline clips. Titles and Elements (new js/titles.js): generated clips with no backing media - text titles (content, size, color, weight, align, vertical position, plain/lower-third/caption styles) and solid/gradient color boards. They render through a cached offscreen frame so transforms, color controls, effects and transitions all apply. Inserted from the Titles/Elements panels, the T tool or the T key onto a free video track (auto-created when needed). Transitions (new js/transitions.js): Cross Dissolve, Fade and Wipe stored on the incoming clip with adjustable duration; the previous clip's last frame is frozen and blended, with a from-black fallback and a marker on the clip. Applied from the gallery or the inspector Transition tab. Also implemented: Filters panel applying color-preset looks, Libraries panel listing saved .cine projects (new backend/listprojects.js), media bin list view toggle, and crop/audio toolbar buttons that jump to the matching inspector section. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add preview direct manipulation, auto track creation and .pxs/.asproj import Preview (new js/previewctl.js): an overlay canvas on the preview lets the user click a clip to select it, drag it to reposition and pull a corner handle to scale it - rotation aware, works for video, image, title and color clips, with a selection outline and handles drawn over the frame. Timeline drags now listen on the window because Chrome drops element pointer capture when the clip is reparented across lanes. Unlimited tracks: dragging a clip past the outermost lanes creates a new video/audio track on drop, and dropping bin media onto the empty timeline area below the lanes does the same, in addition to the existing add-track button. Pixel Studio import (.pxs): the layered project is flattened in the browser - raster layers honoring visibility, opacity and blend mode, text layers re-rendered from their text data - and used as image media. Audio Studio import (.asproj): prefers an embedded or referenced rendered mixdown; otherwise decodes the project's track/clip references (tolerant field names) and mixes them with an OfflineAudioContext into a WAV. Both importers keep the original virtual path in the project file and re-composite when a saved project is reopened. Both extensions join the import filters, the local-device picker and the module's SupportedExt list. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add the most critical everyday editing features to Cine Studio Safety and workflow: - Auto-save (20s, localStorage) with crash-recovery prompt on launch, cleared once the project is saved to disk (new js/session.js) - Recent projects list in the project menu (dedup, last 8) Editing fundamentals: - Multi-select (shift-click) with group move, group delete, group copy - Copy / paste at playhead / duplicate clips (Ctrl+C / V / D) - Ripple delete closing the gap (Shift+Del, context menu) - Timeline markers: add/remove at playhead (M), flags on the ruler, jump to next (Shift+M), saved in the project, act as snap targets - Snapping on/off toggle (magnet button) - Clip speed 25-400%: timeline length, element sync, trimming and splitting are all speed aware; audio pitch follows rate Compositing and playback: - Blend modes (multiply, screen, overlay, add, soft light, difference) - Flip horizontal / vertical toggles - JKL shuttle (reverse scrub / pause / forward up to 8x) and loop playback toggle; export temporarily disables looping Output and audio: - Export current frame as PNG from the export menu - Detach audio: video clip audio moves to its own audio-track clip - Audio track solo via the track header context menu Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 * Add Playwright E2E suite for Cine Studio + GitHub Actions job Ports the browser-driven tests used to verify Cine Studio into the codebase under test/e2e/playwright (outside src/ so they never touch the Go module). The tests drive the real app in headless Chromium, generating their own media in-page (canvas -> MediaRecorder WebM, synthesized WAV) and asserting on rendered pixels, so they exercise the full compositor / playback / export pipeline rather than mocking it. Structure: - lib/static-server.js minimal static server for the ArozOS web root - lib/harness.js browser launch + app navigation + ok()/fail(); resolves Playwright's own Chromium (no hardcoded path), overridable via PW_CHROMIUM_PATH - run.js serves src/web, runs each spec in its own process, exits non-zero on any failure - specs/functional.js media probe, playback, edit, round-trip, WebM export - specs/features.js effects, titles, transitions, elements, filters - specs/interaction.js preview drag/resize, auto tracks, .pxs/.asproj import - specs/editing.js multi-select, copy/paste, speed, JKL, markers, autosave 41 assertions across the four specs, all passing locally. CI: .github/workflows/e2e-playwright.yml installs Node + Playwright Chromium and runs `npm test`, scoped to changes under the app or the harness so unrelated commits don't trigger it. Front-end only - runs independently of the Go build. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BSxJni7aDMU5MFoWG2SSa4 --------- Co-authored-by: Claude <noreply@anthropic.com> * New webapp RAW Editor (#271) * Add Raw Editor webapp with RAW decode, develop controls and LUT grading Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW files client-side and develops them with a Camera-Raw style interface. Decoder (js/rawdecoder.js): - TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2, ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal. - CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy compression, bilinear demosaic with black/white-level normalisation and camera (AsShotNeutral) or gray-world white balance. - Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force SOI/EOI scan) so any RAW still renders when its compression is unsupported. - EXIF metadata (camera, shutter, aperture, ISO, focal length). Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing white balance (temperature/tint), exposure, contrast, highlights, shadows, whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional 3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local contrast. Keeps a valid identity 3D texture bound at all times so drivers that reject incomplete sampler3D bindings still render. LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a WebGL 3D texture. UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local picker and drag & drop) and JPEG export back to storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Hand off developed image to Pixel Studio on Done Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS) and launches Pixel Studio as a float window with that file as its input (matching Pixel Studio's ao_module_loadInputFiles hash format), then closes the Raw Editor window. Falls back to the normal Save dialog when running outside the ArozOS desktop. The bottom-bar button is relabelled "Open in Pixel Studio". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout Rework the develop panel into the 2024 Lightroom-style layout: - Thin centred title bar with open / save / reset / fit icons. - Borderless histogram with shadow/highlight clipping indicators and an EXIF readout (ISO, focal, aperture, shutter). - "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills. - Profile selector row. - Collapsible Light / Color / Effects / LUT groups, each with a chevron to fold and an eye toggle that bypasses that group's adjustments. - Lightroom slider rows: label + right-aligned editable value on one line, thin track below, with coloured gradient tracks for Temperature (blue-> yellow), Tint (green->magenta) and Vibrance / Saturation. - White-balance eyedropper wired to auto white balance. - Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined dimension readout and Cancel / Open in Pixel Studio actions. - Decorative panel-selector strip on the right edge. Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain (post noise) controls to the WebGL develop shader to complete the Effects group, plus per-group bypass handling in the parameter builder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add ArozOS-backed LUT library with a managed folder LUTs can now be managed through the user's ArozOS storage instead of only one-off browser uploads: - On first use the app creates a "user:/RawEditor/LUTs" folder (via the file_system newItem endpoint with a CSRF token). Users can drop .cube files into it with the Files app. - The LUT panel scans that folder (listDir) and lists every .cube in a "Library" dropdown; picking one reads it back through the media endpoint, parses it and applies it live. A refresh button re-scans on demand. - "Import .cube to library" still loads a local file immediately and now also uploads it into the library folder so it persists and reappears in the list next time. - Selecting a LUT re-enables the LUT group (clears any eye bypass); the hint line reports how many LUTs are available. Falls back gracefully to local import when running outside the ArozOS desktop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add scroll-zoom and right-drag pan; remove unused UI - Scroll wheel now zooms the photo, centred on the cursor, and the current zoom level is shown in the status bar. Fit / 100% buttons reset the view. - Right-mouse (or middle) button drag pans the image; the browser context menu is suppressed over the canvas. The view re-fits on window resize. The canvas is now transform-based (translate + scale) instead of the old fit / 1:1 CSS toggle. - Removed the Profile dropdown (no camera profiles in this pipeline) and the decorative right-edge tool strip, so the panel only shows working controls. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Pan with left mouse button and fix LUT dropdown overflow - Change canvas panning from right-drag to left-mouse (and middle) drag, with a grab / grabbing cursor over the image. The context menu is no longer suppressed. - Fix the LUT Library dropdown (and any select) overflowing the panel when an option label is long: give .mini-select min-width:0 so it can shrink inside its flex row instead of stretching to the widest option. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Load EXIF from JPEG APP1 so shooting info shows reliably Some RAW files (and any plain JPEG) did not populate the ISO / focal / aperture / shutter readout under the histogram. The cause: when the RAW's outer TIFF structure fails to parse, the image still loads via the brute-force embedded-JPEG scan, but the metadata comes back empty. Add a JPEG APP1 EXIF reader (the APP1 payload is itself a TIFF block, so it reuses the existing TIFF parser) and use it to: - read EXIF for plain JPEG images, and - fill any missing EXIF fields from the embedded preview for RAW files, which rescues shooting info when the main TIFF could not be parsed. Also harden applyMeta so the EXIF line is written before the window-title call and a title error can no longer suppress it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Match Photoshop LUT rendering: tetrahedral interpolation + true sRGB The same .cube LUT looked cyan/teal-shifted compared to Photoshop. Two causes, both fixed: - Interpolation: the 3D LUT was sampled with GPU trilinear filtering, which introduces a cyan/green cast on film-style LUTs. Switch the LUT textures to NEAREST and do proper tetrahedral interpolation in the shader — the same method Photoshop's Color Lookup and Resolve use. - Transfer function: encode to display with the true sRGB OETF instead of a plain 2.2 gamma. This exactly inverts the sRGB decode applied to 8-bit sources, so the values fed into the LUT match what Photoshop feeds it (previously the mismatch shifted shadow tones the LUT is sensitive to). Also honour the LUT's DOMAIN_MIN / DOMAIN_MAX when sampling. Verified in-browser: an identity LUT now passes through unchanged (exact tetrahedral), a channel-swap LUT swaps correctly, and a constant LUT maps to the constant. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Harden RAW EXIF parsing for real camera files Improve the chance that ISO / focal / aperture / shutter show for real RAWs (e.g. Sony ARW), which kept the readout blank: - Scan every embedded JPEG for APP1 EXIF, not just the largest preview. Sony keeps EXIF in the small thumbnail while the full-size preview has none. - Stop recursing the MakerNote (0x927C) as if its bytes were IFD offsets — that could be pathologically slow / derail a clean parse on real files; EXIF is reached through the standard ExifIFD (0x8769) pointer. - Cap IFD entry counts (>4096) to bail out of parsing stray/garbage offsets. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Fix RAW preview selection: never decode CFA raw as the preview image On real Sony ARW files the develop view hung and EXIF stayed blank. Root cause: the CFA raw plane is a lossless-JPEG-compressed stream that also starts with 0xFFD8, and the embedded-preview finder picked it as the "largest JPEG" (31 MB) and handed it to the browser to decode as an image. The browser cannot decode lossless JPEG, so decoding stalled and the pipeline never reached the metadata display. Fixes: - Ignore CFA / raw IFDs (Photometric 32803) when hunting for a preview JPEG. - Only accept a range that is a real JPEG (SOI at the start AND EOI at the end) via a looksLikeJpeg() check, so a truncated raw stream can't be chosen. - Cap the brute-force SOI/EOI scan span so raw bytes containing 0xFFD8 can't yield a multi-megabyte junk range. With this, ARW files pick the correct full-size preview, the image loads, and ISO / focal / aperture / shutter populate under the histogram. Verified against a real 25MP Sony ILCE-6700 ARW end-to-end in the browser. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 --------- Co-authored-by: Claude <noreply@anthropic.com> * RAW Editor - LUT Preview update (#272) * Add Raw Editor webapp with RAW decode, develop controls and LUT grading Introduce a new "Raw Editor" WebApp under src/web that decodes camera RAW files client-side and develops them with a Camera-Raw style interface. Decoder (js/rawdecoder.js): - TIFF/IFD parser covering the common RAW containers (ARW, DNG, NEF, CR2, ORF, RW2 ...), little/big endian, with SubIFD/EXIF traversal. - CFA (Bayer) extraction for uncompressed 12/14/16-bit and Sony ARW2 lossy compression, bilinear demosaic with black/white-level normalisation and camera (AsShotNeutral) or gray-world white balance. - Robust embedded full-size JPEG preview fallback (IFD pointers + brute-force SOI/EOI scan) so any RAW still renders when its compression is unsupported. - EXIF metadata (camera, shutter, aperture, ISO, focal length). Develop pipeline (js/glrender.js): WebGL2 real-time renderer implementing white balance (temperature/tint), exposure, contrast, highlights, shadows, whites, blacks, clarity, dehaze, vibrance and saturation, plus an optional 3D LUT grade. A separable Gaussian low-pass drives clarity/dehaze local contrast. Keeps a valid identity 3D texture bound at all times so drivers that reject incomplete sampler3D bindings still render. LUT (js/lut.js): Adobe/IRIDAS .cube parser for 1D and 3D LUTs, uploaded to a WebGL 3D texture. UI (index.html, css/style.css, js/editor.js): dark Camera-Raw inspired layout with RGB histogram, EXIF readout, Basic/LUT tabs, editable sliders, auto white balance / auto tone, treatment (colour / B&W), file open (ArozOS picker, local picker and drag & drop) and JPEG export back to storage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Hand off developed image to Pixel Studio on Done Repurpose the Raw Editor's "Done" action into a hand-off: it now writes the current develop to a temporary JPEG (tmp:/RawEditor, auto-cleared by ArozOS) and launches Pixel Studio as a float window with that file as its input (matching Pixel Studio's ao_module_loadInputFiles hash format), then closes the Raw Editor window. Falls back to the normal Save dialog when running outside the ArozOS desktop. The bottom-bar button is relabelled "Open in Pixel Studio". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Redesign Raw Editor UI to match the newer Lightroom / Camera Raw layout Rework the develop panel into the 2024 Lightroom-style layout: - Thin centred title bar with open / save / reset / fit icons. - Borderless histogram with shadow/highlight clipping indicators and an EXIF readout (ISO, focal, aperture, shutter). - "Edit" header carrying Auto (auto-tone) and B&W (treatment) pills. - Profile selector row. - Collapsible Light / Color / Effects / LUT groups, each with a chevron to fold and an eye toggle that bypasses that group's adjustments. - Lightroom slider rows: label + right-aligned editable value on one line, thin track below, with coloured gradient tracks for Temperature (blue-> yellow), Tint (green->magenta) and Vibrance / Saturation. - White-balance eyedropper wired to auto white balance. - Bottom bar with a live filmstrip thumbnail, Fit / 100% zoom, an underlined dimension readout and Cancel / Open in Pixel Studio actions. - Decorative panel-selector strip on the right edge. Pipeline: add Texture (fine local contrast), Vignette (radial) and Grain (post noise) controls to the WebGL develop shader to complete the Effects group, plus per-group bypass handling in the parameter builder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add ArozOS-backed LUT library with a managed folder LUTs can now be managed through the user's ArozOS storage instead of only one-off browser uploads: - On first use the app creates a "user:/RawEditor/LUTs" folder (via the file_system newItem endpoint with a CSRF token). Users can drop .cube files into it with the Files app. - The LUT panel scans that folder (listDir) and lists every .cube in a "Library" dropdown; picking one reads it back through the media endpoint, parses it and applies it live. A refresh button re-scans on demand. - "Import .cube to library" still loads a local file immediately and now also uploads it into the library folder so it persists and reappears in the list next time. - Selecting a LUT re-enables the LUT group (clears any eye bypass); the hint line reports how many LUTs are available. Falls back gracefully to local import when running outside the ArozOS desktop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add scroll-zoom and right-drag pan; remove unused UI - Scroll wheel now zooms the photo, centred on the cursor, and the current zoom level is shown in the status bar. Fit / 100% buttons reset the view. - Right-mouse (or middle) button drag pans the image; the browser context menu is suppressed over the canvas. The view re-fits on window resize. The canvas is now transform-based (translate + scale) instead of the old fit / 1:1 CSS toggle. - Removed the Profile dropdown (no camera profiles in this pipeline) and the decorative right-edge tool strip, so the panel only shows working controls. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Pan with left mouse button and fix LUT dropdown overflow - Change canvas panning from right-drag to left-mouse (and middle) drag, with a grab / grabbing cursor over the image. The context menu is no longer suppressed. - Fix the LUT Library dropdown (and any select) overflowing the panel when an option label is long: give .mini-select min-width:0 so it can shrink inside its flex row instead of stretching to the widest option. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Load EXIF from JPEG APP1 so shooting info shows reliably Some RAW files (and any plain JPEG) did not populate the ISO / focal / aperture / shutter readout under the histogram. The cause: when the RAW's outer TIFF structure fails to parse, the image still loads via the brute-force embedded-JPEG scan, but the metadata comes back empty. Add a JPEG APP1 EXIF reader (the APP1 payload is itself a TIFF block, so it reuses the existing TIFF parser) and use it to: - read EXIF for plain JPEG images, and - fill any missing EXIF fields from the embedded preview for RAW files, which rescues shooting info when the main TIFF could not be parsed. Also harden applyMeta so the EXIF line is written before the window-title call and a title error can no longer suppress it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Match Photoshop LUT rendering: tetrahedral interpolation + true sRGB The same .cube LUT looked cyan/teal-shifted compared to Photoshop. Two causes, both fixed: - Interpolation: the 3D LUT was sampled with GPU trilinear filtering, which introduces a cyan/green cast on film-style LUTs. Switch the LUT textures to NEAREST and do proper tetrahedral interpolation in the shader — the same method Photoshop's Color Lookup and Resolve use. - Transfer function: encode to display with the true sRGB OETF instead of a plain 2.2 gamma. This exactly inverts the sRGB decode applied to 8-bit sources, so the values fed into the LUT match what Photoshop feeds it (previously the mismatch shifted shadow tones the LUT is sensitive to). Also honour the LUT's DOMAIN_MIN / DOMAIN_MAX when sampling. Verified in-browser: an identity LUT now passes through unchanged (exact tetrahedral), a channel-swap LUT swaps correctly, and a constant LUT maps to the constant. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Harden RAW EXIF parsing for real camera files Improve the chance that ISO / focal / aperture / shutter show for real RAWs (e.g. Sony ARW), which kept the readout blank: - Scan every embedded JPEG for APP1 EXIF, not just the largest preview. Sony keeps EXIF in the small thumbnail while the full-size preview has none. - Stop recursing the MakerNote (0x927C) as if its bytes were IFD offsets — that could be pathologically slow / derail a clean parse on real files; EXIF is reached through the standard ExifIFD (0x8769) pointer. - Cap IFD entry counts (>4096) to bail out of parsing stray/garbage offsets. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Fix RAW preview selection: never decode CFA raw as the preview image On real Sony ARW files the develop view hung and EXIF stayed blank. Root cause: the CFA raw plane is a lossless-JPEG-compressed stream that also starts with 0xFFD8, and the embedded-preview finder picked it as the "largest JPEG" (31 MB) and handed it to the browser to decode as an image. The browser cannot decode lossless JPEG, so decoding stalled and the pipeline never reached the metadata display. Fixes: - Ignore CFA / raw IFDs (Photometric 32803) when hunting for a preview JPEG. - Only accept a range that is a real JPEG (SOI at the start AND EOI at the end) via a looksLikeJpeg() check, so a truncated raw stream can't be chosen. - Cap the brute-force SOI/EOI scan span so raw bytes containing 0xFFD8 can't yield a multi-megabyte junk range. With this, ARW files pick the correct full-size preview, the image loads, and ISO / focal / aperture / shutter populate under the histogram. Verified against a real 25MP Sony ILCE-6700 ARW end-to-end in the browser. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 * Add LUT "Log input" mode for log-to-display conversion LUTs Film-conversion LUTs (F-Log/S-Log/V-Log -> Rec.709, e.g. the Fujifilm FLog_to_ETERNA LUT) are authored for a flat log signal. Applied straight to a normal photo they over-contrast and over-saturate, which is why the result looked much punchier than the same LUT in Photoshop. Add a "Log input" toggle in the LUT panel: before the 3D lookup the image is flattened toward a log signal so the LUT reads it the way it was designed to, giving the intended muted film look instead of a punchy one. - A true camera-log encode can't work from a display-referred base (a JPEG spans ~2.5 stops, F-Log expects ~14 — it fogs shadows or greys highlights), so the flatten is a clean log2 curve that keeps blacks black and whites white while lifting mid-tones. No wash-out. - Auto-enables when the LUT name/title looks like a log conversion (f-log, s-log, v-log, log-c, ...); still user-toggleable, with an Amount slider for fine control. Verified end-to-end on the real Sony ARW + Fujifilm ETERNA LUT: colours stay natural and the grade is muted rather than over-saturated. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151sG7aaGnwCPRt3qvGNxd3 --------- Co-authored-by: Claude <noreply@anthropic.com> * Updated Musicify * Add iOS support for privacy mode * Add module icons and polish UI messaging Adds new desktop/module icon assets (including PSD sources) for Audio Studio, Productivity, and Reminders, and updates Cine Studio’s desktop icon. Also simplifies the PDF editor save toast message in Productivity and removes the fwdragger text-shadow override in ao.css for cleaner styling behavior. * Update Makefile * Add work in progress office suite * Add DOCX support and packed Office files Extend the Office stack end-to-end: add DOCX reader/writer support in mod/office with new tests, expose new AGI office APIs for DOCX and native container pack/unpack, and document the new functions in AGI and Terminal API docs. Native .doca/.xlsa/.ppta now use a zip container with embedded/deduplicated assets and workdir-based media extraction. Update Office web apps to use packed saves/loads and session snapshots, add Docs DOCX import/export plus multi-column/layout tooling and richer editing UX, add Sheets range-drag move with formula rewrite support, and expand Slides with grouping, animations, links, media objects, transitions, and presenter view. Also refresh Office module/file icons and extension mappings. * Office suite: charts, notes, review, pivot tables Backend: - Fix WriteStream to use O_TRUNC so overwriting a shorter file doesn't leave stale bytes (fixes zip-based formats like .pptx) - xlsx: native DrawingML chart round-trip (bar/line/pie) for Sheets - xlsx: cell note (comment) round-trip via xl/commentsN.xml + VML Frontend (shared): - OfficeHotkeys (hotkeys.js): centralized keyboard registry with Ctrl+/ help dialog; all three apps migrated - OfficeColorPicker (colorpicker.js): Google-Docs-style palette + HSV picker + eyedropper replaces <input type="color"> - OfficeTextEditBar: two-row layout, highlight color button, OfficeColorPicker integration Docs: - Review comments: anchor <span class="doc-cmt">, side panel, Ctrl+Alt+M - Track changes / suggest-edits mode: ins.doc-ins / del.doc-del; accept/reject per-suggestion or all - Foreign exports (docx/html/md/txt) use resolvedHtml() with suggestions accepted Sheets: - Cell notes (N field): corner indicator, Shift+F2 / context menu - Formula bar range picking: click/drag on grid inserts cell reference while editing - Chart clipboard: objects round-trip via system clipboard as marker JSON - Pivot table dialog (Data menu) with range picker; refresh on demand Slides: - Fully migrated to OfficeHotkeys; Ctrl+C/X write objects to system clipboard synchronously - Ctrl+Click opens links in text boxes; plain click shows hint - Slide background color uses OfficeColorPicker.swatchInput * V3.0.1 -> V3.0.2 (#278) * Video conferencing tool (#275) * Add MeetRoom video conferencing system New Zoom-style video conferencing for ArozOS, joinable by 9-digit meeting ID with optional password: - mod/meetroom: room manager with password-protected rooms (salted SHA-256, constant-time compare), participant registry for the signaling relay, temp-dir attachment storage addressed by random IDs, idle-room sweeping, and table-driven tests. - src/meetroom.go: prouter-gated endpoints under /system/meetroom/ (create, join, info, end, upload, download, iceservers) plus the WebSocket signaling relay for SDP/ICE, chat, file announcements and mute/camera/screen state. Reuses Arozcast's STUN/TURN ICE config so the built-in relay also carries MeetRoom calls across NAT. - web/MeetRoom: WebApp with lobby (new meeting / join by ID+password) and meeting UI: WebRTC mesh video+audio, screen sharing via replaceTrack (no renegotiation), meeting chat with unread badge, and file attachment sharing with download links. Media is always peer-to-peer; the server only relays signaling and stores files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WRXbPMLvRgPBZ2et8FJPaY * Add auto-reconnect and dead-connection timeouts to MeetRoom Client (web/MeetRoom/app.js): - App-level ping/pong heartbeat (15s cadence) detects half-dead sockets; 40s without a pong force-closes the connection. - When the signaling socket drops mid-meeting, the room UI and local media stay alive and the client reconnects with capped exponential backoff (1s..10s), showing a reconnect banner with the attempt count. Each attempt first probes /info (stop immediately if the meeting ended) and refreshes the short-lived TURN credentials. - Reconnecting rejoins as a fresh peer and rebuilds the WebRTC mesh from the new welcome frame; mute/camera choices are preserved. - Gives up after 60s and returns to the lobby with an explanation. Chat drafts are kept (not silently dropped) while reconnecting. Server (src/meetroom.go): - WebSocket keepalive: protocol ping every 20s, 60s read deadline refreshed by pongs and incoming frames, 10s write deadlines - a silently dead client is removed from the room (with peer-leave broadcast) instead of lingering as a ghost participant. - New "ping" signaling frame answered with {"type":"pong"} to back the client heartbeat. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WRXbPMLvRgPBZ2et8FJPaY --------- Co-authored-by: Claude <noreply@anthropic.com> * Add SharedSpace collaboration areas and MeetRoom integration (#276) * MeetRoom AGI integration: shared spaces, attendance, richer chat Expose MeetRoom room creation to AGI scripts and build the shared-area mechanism it rides on, plus a round of front-end upgrades: - New mod/sharedspace package: in-memory shared areas where multiple users share texts, images and files together (capability-style random IDs, disk-backed blobs, item listeners, owner/uploader permissions). - New AGI "sharedspace" library: create/list/delete spaces, addText, addFile (from user storage), listItems, getText, saveFileTo, removeItem. New AGI "meetroom" library (gated by MeetRoom module permission): createRoom, getRoomInfo, getRoomSpace, listMyRooms, endRoom, getAttendance. AgiVersion bumped to 3.3; README and Terminal api.json updated in sync. - MeetRoom rooms now bind a shared space at creation: chat and uploads mirror into it, and items posted by AGI scripts flow back into the live meeting as chat/file frames, so scripts can read and post into a running meeting. - Attendance log per room (join/leave times) with a new "attendance" WebSocket frame and a Participants side panel in the UI. - Chat upgrades: images render inline by default (inline=1 download disposition, raster whitelist keeps SVG as attachment-only), Ctrl+V pastes a copied image straight into the chat, and a clickable popup toast appears when a new message arrives while the chat is closed. - WebAudio join/leave chimes (no bundled audio assets). - Fix missing API.info entry that broke the reconnect probe in app.js. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * sharedspace: access control, persistence, realtime channels, documents Grow mod/sharedspace from an ephemeral item store into the collaboration backbone core: - access.go: access modes (open capability-ID, public self-join, private invite-only), member roles (owner/admin/member), space metadata with caps, public/member listings and disk usage accounting. - persistence.go: opt-in persistent spaces write through to the system database (spaces, items, documents) with blobs in a durable root; self-healing boot reload, cascading deletion and a stale-space sweeper for retention. - channel.go: per-space realtime hub (numbered subscribers, targeted send, broadcast-with-exclude, presence hooks, leaf-lock discipline) generalizing the MeetRoom relay pattern for WebSocket transports. - doc.go: revision-numbered collaborative documents with compare-and-swap updates, splice-patch diffs and doc events for Google-Docs-style co-editing without an OT/CRDT engine. - SpaceEvent stream (SubscribeEvents) alongside the existing item listeners so transports can fan out item/doc/member mutations live. Persistent chat rooms trim their oldest items at the cap; ephemeral spaces keep the existing fail-at-cap semantics, and every pre-existing API keeps its exact behaviour (all previous tests pass unmodified). Database-backed tests skip under -race: boltdb v1.3.1 trips checkptr. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * meetroom: run meeting signaling on the sharedspace channel layer Replace the room's private participant registry with the bound space's realtime channel, proving conferencing apps can be built directly on the sharedspace backbone: - Participant is now a thin wrapper around a sharedspace.Subscriber (PeerID and Send alias the subscriber's ID and buffer; close-once lives in the subscriber). - Room.Broadcast / Room.SendTo delegate to the channel, so meeting frames also reach generic space subscribers connected through the sharedspace WebSocket - and the attendance roster stays meeting-only. - Rooms without a bound space manager get a standalone channel with identical semantics; CloseRoom tears the hub down for everyone. The whole pre-migration test suite passes unmodified; new tests pin the roster/channel relationship and the cross-subscriber broadcast path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * sharedspace: HTTP/WS endpoint surface and administrator control Expose the collaboration backbone to web clients and administrators: - /system/sharedspace/* user endpoints (login-gated; the space ACL is the authorization layer): space CRUD, public directory, join/leave, member and role management, metadata, items, upload/download with inline raster-image support, and compare-and-swap document endpoints with structured conflict replies. - /system/sharedspace/ws realtime channel: welcome/presence frames, ephemeral signal relay (WebRTC-ready) and broadcast frames, persisted chat via item-added fan-out, live document patches with sender-only conflict frames, meetroom-style liveness (server pings + read deadlines). - Admin surface under System Settings > Shared Spaces (Advance group): enumerate every space with usage figures, delete with system authority, and persist limits (max upload, items per space, persistence toggle, retention days) applied live; hourly retention sweep for idle persistent spaces. - The manager now boots persistence-enabled over the system database with durable blobs under system/sharedspace. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * agi: sharedspace access control, membership and document functions Extend the AGI sharedspace library to the full backbone feature set (all additive; the original ten functions keep their signatures): - createSpaceAdvanced(name, {access, persistent, metadata}), the public directory (listPublicSpaces), joined-space listing, joinSpace / leaveSpace, setAccess, setMeta / getMeta and addMember / removeMember / listMembers. - Collaborative documents: createDoc, listDocs, getDoc and compare-and-swap updateDoc returning {ok, revision} or a structured conflict object, plus deleteDoc. - Existing read paths now honour the space ACL (identical behaviour for all pre-existing open spaces; private spaces read as nonexistent to outsiders), item removal accepts space admins, and deleteSpace broadcasts the shutdown to live channel subscribers first. AgiVersion bumped to 3.4; mod/agi README, the Terminal in-app API reference and the CLAUDE.md library list updated in sync. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj --------- Co-authored-by: Claude <noreply@anthropic.com> * MeetRoom AGI integration: shared spaces, attendance, richer chat * MeetRoom AGI integration: shared spaces, attendance, richer chat Expose MeetRoom room creation to AGI scripts and build the shared-area mechanism it rides on, plus a round of front-end upgrades: - New mod/sharedspace package: in-memory shared areas where multiple users share texts, images and files together (capability-style random IDs, disk-backed blobs, item listeners, owner/uploader permissions). - New AGI "sharedspace" library: create/list/delete spaces, addText, addFile (from user storage), listItems, getText, saveFileTo, removeItem. New AGI "meetroom" library (gated by MeetRoom module permission): createRoom, getRoomInfo, getRoomSpace, listMyRooms, endRoom, getAttendance. AgiVersion bumped to 3.3; README and Terminal api.json updated in sync. - MeetRoom rooms now bind a shared space at creation: chat and uploads mirror into it, and items posted by AGI scripts flow back into the live meeting as chat/file frames, so scripts can read and post into a running meeting. - Attendance log per room (join/leave times) with a new "attendance" WebSocket frame and a Participants side panel in the UI. - Chat upgrades: images render inline by default (inline=1 download disposition, raster whitelist keeps SVG as attachment-only), Ctrl+V pastes a copied image straight into the chat, and a clickable popup toast appears when a new message arrives while the chat is closed. - WebAudio join/leave chimes (no bundled audio assets). - Fix missing API.info entry that broke the reconnect probe in app.js. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * sharedspace: access control, persistence, realtime channels, documents Grow mod/sharedspace from an ephemeral item store into the collaboration backbone core: - access.go: access modes (open capability-ID, public self-join, private invite-only), member roles (owner/admin/member), space metadata with caps, public/member listings and disk usage accounting. - persistence.go: opt-in persistent spaces write through to the system database (spaces, items, documents) with blobs in a durable root; self-healing boot reload, cascading deletion and a stale-space sweeper for retention. - channel.go: per-space realtime hub (numbered subscribers, targeted send, broadcast-with-exclude, presence hooks, leaf-lock discipline) generalizing the MeetRoom relay pattern for WebSocket transports. - doc.go: revision-numbered collaborative documents with compare-and-swap updates, splice-patch diffs and doc events for Google-Docs-style co-editing without an OT/CRDT engine. - SpaceEvent stream (SubscribeEvents) alongside the existing item listeners so transports can fan out item/doc/member mutations live. Persistent chat rooms trim their oldest items at the cap; ephemeral spaces keep the existing fail-at-cap semantics, and every pre-existing API keeps its exact behaviour (all previous tests pass unmodified). Database-backed tests skip under -race: boltdb v1.3.1 trips checkptr. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * meetroom: run meeting signaling on the sharedspace channel layer Replace the room's private participant registry with the bound space's realtime channel, proving conferencing apps can be built directly on the sharedspace backbone: - Participant is now a thin wrapper around a sharedspace.Subscriber (PeerID and Send alias the subscriber's ID and buffer; close-once lives in the subscriber). - Room.Broadcast / Room.SendTo delegate to the channel, so meeting frames also reach generic space subscribers connected through the sharedspace WebSocket - and the attendance roster stays meeting-only. - Rooms without a bound space manager get a standalone channel with identical semantics; CloseRoom tears the hub down for everyone. The whole pre-migration test suite passes unmodified; new tests pin the roster/channel relationship and the cross-subscriber broadcast path. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * sharedspace: HTTP/WS endpoint surface and administrator control Expose the collaboration backbone to web clients and administrators: - /system/sharedspace/* user endpoints (login-gated; the space ACL is the authorization layer): space CRUD, public directory, join/leave, member and role management, metadata, items, upload/download with inline raster-image support, and compare-and-swap document endpoints with structured conflict replies. - /system/sharedspace/ws realtime channel: welcome/presence frames, ephemeral signal relay (WebRTC-ready) and broadcast frames, persisted chat via item-added fan-out, live document patches with sender-only conflict frames, meetroom-style liveness (server pings + read deadlines). - Admin surface under System Settings > Shared Spaces (Advance group): enumerate every space with usage figures, delete with system authority, and persist limits (max upload, items per space, persistence toggle, retention days) applied live; hourly retention sweep for idle persistent spaces. - The manager now boots persistence-enabled over the system database with durable blobs under system/sharedspace. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * agi: sharedspace access control, membership and document functions Extend the AGI sharedspace library to the full backbone feature set (all additive; the original ten functions keep their signatures): - createSpaceAdvanced(name, {access, persistent, metadata}), the public directory (listPublicSpaces), joined-space listing, joinSpace / leaveSpace, setAccess, setMeta / getMeta and addMember / removeMember / listMembers. - Collaborative documents: createDoc, listDocs, getDoc and compare-and-swap updateDoc returning {ok, revision} or a structured conflict object, plus deleteDoc. - Existing read paths now honour the space ACL (identical behaviour for all pre-existing open spaces; private spaces read as nonexistent to outsiders), item removal accepts space admins, and deleteSpace broadcasts the shutdown to live channel subscribers first. AgiVersion bumped to 3.4; mod/agi README, the Terminal in-app API reference and the CLAUDE.md library list updated in sync. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0186iLM3a3oY85KQqPiLHXWj * Chatspace: Slack-style team chat WebApp on the sharedspace backbone A new webapp (src/web/Chatspace) that replicates the Slack desktop client on top of the shared space collaboration layer, with no core (Go) changes: - Channels and DMs are shared spaces: channels are public (browsable, self-join) or private (invite-only) spaces; DMs are private spaces keyed by their sorted participant list so both sides converge on the same conversation. - Messages are space text items carrying a JSON envelope; reactions, edits, pins and threads are envelope items referencing the target item id, reduced client-side from the item stream. Plain text items from other sharedspace clients render as normal messages. - Realtime delivery, presence and typing ride the per-space WebSocket channel (item events, peer-join/leave, ephemeral broadcasts) with per-socket heartbeat and capped-backoff reconnect. - Workspace bootstrap (auto-provisioned #general), channel creation and DM find-or-create run as AGI backend scripts using requirelib("sharedspace"). - Slack features: aubergine rail + sidebar with unread/mention badges, threads panel, reactions, message editing/deleting, pinned messages, saved-for-later, drafts, activity feed (mentions/replies/reactions), channel browser/creator, invites, member management, topic/rename, quick switcher (Ctrl+K), search, file/image uploads with drag-drop and paste, presence dots, typing indicators, day dividers, message grouping and Slack-style markup (*bold*, _italic_, ~strike~, code, quotes, @mentions, :shortcode: icons rendered as Semantic UI glyphs instead of emoji, per repo convention). Verified end-to-end against a live build with two users via headless Chromium: bootstrap, WS chat, reactions, threads, channel creation, DM open, cross-user realtime delivery, quick switcher and search. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 * Chatspace: AI assistant, Slack-style Activity pane, @everyone, motion polish Round-2 improvements to the Chatspace WebApp, plus one storage change: - AI assistant (@ai): a new AGI backend script (backend/aibot.js) built on requirelib("llm") - the built-in AGI AI integration - answers when a member mentions @ai in any channel, thread or DM. It feeds the recent conversation (thread-scoped when asked inside a thread) to the configured model and posts the reply back into the shared space as a bot-flagged envelope, so everyone sees it in realtime. The client shows a "Chatspace AI is typing" indicator while the model thinks and renders bot replies with an assistant avatar and APP badge. When no AI endpoint is configured the bot answers with a pointer to System Settings instead of failing silently. - Activity is now a full main-pane view (like the Slack client), with All / Mentions / Threads / Reactions tabs, actor avatars and click-to-jump rows, opened from the rail or the sidebar; the old sidebar list remains for the other rail views. - @everyone / @channel broadcast mentions: offered by the mention autocomplete, rendered as highlight pills, and counted as a mention for every member (badges, notification sound, activity feed). - Huddle button now opens MeetRoom in an ArozOS floatWindow via ao_module_newfw (which itself falls back to window.open outside the desktop). - Motion polish: entry animations for modals, popovers, panels, toasts, new messages and view switches, plus hover/press transitions, respecting prefers-reduced-motion. - Assistant replies posted in the same second as their trigger now sort after it (bot-rank tiebreak in the item reducer). - Shared space storage now lives with the user data under the -root directory (default ./files/sharedspace) instead of system/; an existing system/sharedspace tree is migrated once at startup, keeping the legacy location if the move fails (e.g. across mounts). Blob disk paths are recomputed from the root at load time, so relocation is safe. Verified against a live build with a stub OpenAI-compatible endpoint: mention picker -> thinking indicator -> bot reply, @everyone pill + cross-user activity row, activity tabs and jump, huddle fallback, and the system->files storage migration. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 * Chatspace: PWA support, Slack-style attachments, details modal, date jump - PWA: manifest.json (standalone display, SVG + generated 192/512 PNG icons, credentialed fetch like the other webapps) plus a service worker that keeps the static app shell available network-first with a cached fallback; the /system/ API surface, uploads and WebSockets are never intercepted so chat data cannot go stale. Apple/mobile web app meta tags added to the shell. - Attachments now follow the Slack presentation: a muted filename bar with a collapse chevron above the preview (toggling folds the preview away per item), rounded inline image previews with hover overlay actions (download, open in new tab), and non-image files keep a compact card with a hover download hint - the redundant download card under images is gone. - Channel details moved from the right panel into a Slack-style centered modal: header with the channel name, Star and Huddle pill buttons, and About / Members / Settings tabs. Members has find-member filtering, an Add people row, presence dots and Channel Manager / Admin role tags with click-through to profiles; Settings gathers rename, public/private visibility switch (new), leave and delete. About gains an editable description alongside the topic. - Day dividers are now clickable "Jump to..." menus (Today, Last week, Last month, or a specific date) that scroll to and highlight the first message from the chosen time. Verified in-browser: manifest 200 + active service worker, hover actions and collapse toggle, tabbed modal with member filter and role tag, and date jumps landing on highlighted messages. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 * Chatspace: in-app image lightbox instead of opening a new tab Clicking an inline image preview now opens a Slack-style lightbox over the app: dark backdrop, top bar with the uploader's avatar, filename and size, and download / open-in-new-tab / close actions. Arrow keys or on-screen chevrons move through every image in the conversation in chronological order (with an "n of m" counter), clicking the image toggles full-size zoom, and Esc or a backdrop click closes it. The hover overlay on the inline preview keeps explicit download and open-in-tab links for when a tab is actually wanted. Verified in-browser: no popup on click, working file label and counter, arrow navigation, zoom toggle and Esc close. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 * Chatspace: responsive mobile / installable-PWA layout On phone-width screens (<=768px) the desktop three-pane layout collapses into the Slack mobile pattern so the installed PWA feels native: - The icon rail becomes a bottom tab bar (Home / DMs / Activity / More / Search) with labels and a red activity dot; the compose button becomes a floating action button that hides while a conversation is open. - The purple sidebar is the "list" screen and the white content card is the conversation / activity screen, which slides over the list; a back chevron in the channel/activity header returns to the list. On launch the app lands on the Home list (the last conversation is preloaded behind it for an instant open) instead of opening a conversation. - The workspace avatar moves into the sidebar header (opens the profile); a Search tab opens the quick switcher since the desktop search bar is hidden. - Thread / details / profile panels and all modals (details, browse, new message, invite, quick switcher) become full-screen sheets; toasts sit above the tab bar; the lightbox clears the notch. - Safe-area insets (viewport-fit=cover + env(safe-area-inset-*)) and 100dvh sizing keep content clear of the status bar, home indicator and dynamic browser chrome. The composer formatting toolbar collapses behind the Aa button on mobile; the Aa toggle now reads the computed state so it works on both layouts. Desktop layout is unchanged (mobile affordances are hidden >768px, and the old 900px squeeze became a gentler 769-1040px tightening). Verified with a 390x844 touch viewport: bottom bar, list<->conversation slide + back, send, DMs/Activity tabs, full-screen profile and quick switcher; plus a desktop regression pass (topbar, toolbar, rail avatar intact, no console errors). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 * Chatspace sidebar redesign + Shared Spaces admin dark mode Sidebar (left channel list): - The active conversation now uses a purple pill highlight (matching the Slack aubergine sidebar) instead of a flat dark overlay; hover is a lighter, subtler tint. - Unread conversations stay bold white; the pink count badge appears only when it is actionable - a channel where I'm @mentioned (mention count, including @everyone / @channel and mentions inside thread replies) or a direct message (unread message count). Unread-but-not- mentioned channels are just bold, no badge, like Slack. - recountUnread now scans every message (not just roots) so thread-reply mentions and messages count toward the badge. Shared Spaces admin page (SystemAO/sharedspace/spaces.html): - Added dark-mode support following the System Settings convention: the page toggles a scoped `.dark` class on #ss-root from the host's `preferredTheme` and the live `detailPageThemeCallback`, with a prefers-color-scheme fallback when opened standalone. Dark overrides cover the cards, text, number inputs, table hover and the access / storage pills, fixing the washed-out low-contrast rendering when the desktop is in dark mode. Verified in-browser: active purple pill (rgb 91,46,92), #general mention badge "1" + bold, bob DM badge "1"; spaces.html dark (bg #1c1c1e, text #ececec) with light mode still unaffected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 * Chatspace: video/audio/text previews, download-or-save chooser, avatar fix Attachment previews now cover more than images: - Video files (mp4, webm, mov, m4v, mkv, ogv) render an inline <video> player; audio files (mp3, wav, ogg, m4a, flac, aac) an <audio> player. - Text / code files (txt, md, json, csv, logs, source, ...) up to 256KB show an inline, scrollable source preview, fetched and inserted with textContent so the file body is never interpreted as HTML; larger files show a truncation note. Media plays and text loads straight from the existing download endpoint - Content-Disposition is ignored for media elements and fetch, so no server change was needed. Download control: - The download button on every attachment now opens a chooser: "Download to this device" (a normal browser download) or "Save to ArozOS files" (copy into the user's own ArozOS storage). The latter uses the desktop folder picker when available, else defaults to user:/Desktop, via a new AGI backend script (backend/saveToArozOS.js) that calls sharedspace.saveFileTo; it creates the destination folder if missing and falls back to the user root. Avatar fix: - Profile-picture images are now constrained to their container (.cs-avatar-img: width/height 100%, object-fit cover) so a large source image (e.g. 280x280) no longer overflows the rail / message / header avatars. Verified in-browser: text preview populated, audio metadata/duration loads (proving inline playback under attachment disposition), video element present, the two-option download menu, save-to-ArozOS writing the file to the user's Desktop, and a 280x280 avatar rendering at its 36px container size. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UVTgmFBben9gaUqh5gToK7 --------- Co-authored-by: Claude <noreply@anthropic.com> * Chat app icon alignment centering (#279) * Fix Chatspace sidebar icon alignment and center plus glyph The Semantic UI icon-font glyphs render high inside their em-box, so the sidebar nav icons (Threads, Drafts, Activity, Later, channels) sat above the vertical center of their labels. Nudge .sb-item icons down 1px so the glyph ink lines up with the text. The add/new-message plus box used width:auto, which shrank the icon to the glyph advance width and exposed the plus glyph's asymmetric side bearings, leaving the + low and left of center. Give the icon the full box with line-height and text-align centering so the + sits in the middle. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NrRRTcYfs6H4ej14kvn9rh * Nudge Chatspace reaction-pill icons up to align with the count The check/heart/thumbs glyphs sat optically low next to the reaction count digit because the icon box centers on the pill while the digit ink rides high in its line box. Shift the pill icon up 1px so it lines up with the number. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NrRRTcYfs6H4ej14kvn9rh * Increase Chatspace reaction-pill icon nudge for bottom-heavy glyphs A 1px lift wasn't enough for the thumbs up/down, rocket and trophy glyphs: they carry their visual mass low, so they still hung below the count digit even though their em-box was centered. Bump the lift to 2px, which balances those glyphs with the number while keeping the symmetric ones (check, heart, star) from riding high. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NrRRTcYfs6H4ej14kvn9rh * Correct Chatspace sidebar icon nudge direction The earlier nudge pushed .sb-item icons down 1px, which was the wrong direction: with a red center-line overlay the hashtag, lock and channel glyphs all hung below their label text. The pixel scan confirms every icon shares the same ink center that sits slightly low, so shift them up 1px instead. Now the channel/DM icons line up with their names. * Adjust Chatspace sidebar icon nudge to -3px Per request, shift .sb-item icons up 3px. --------- Co-authored-by: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> * Add curl-like http.request() with full control over method, headers, and body (#280) * AGI: curl-like http.request + 60min LLM timeout http library: - Add http.request(options) supporting method selection, custom headers, raw/JSON/form/binary(base64) request bodies, HTTP basic auth, per-request timeout, redirect-follow control and text/base64 response bodies. Returns a {ok, status, statusText, headers, body, error} response object. - Add http.put/patch/delete/postForm/postJSON helpers built on http.request. - http.get and http.post now accept optional headers (backward compatible: the classic no-header signatures behave exactly as before). - Add agi.http_test.go covering the body builder, request execution (methods, headers, form/binary bodies, basic auth, redirect handling) and the JS bindings. llm library: - Raise the AI completion request timeout from 120s to 60 minutes so long reasoning/agentic replies are not cut short. Docs: update mod/agi/README.md and Terminal api.json; bump AgiVersion to 3.5. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7iat5zMwn2N5xDVEAvgpN * UnitTest: add http.request example backend script Add src/web/UnitTest/backend/http.request.js demonstrating the new curl-like http.request(options) call (method, custom headers, JSON body, timeout, response object) plus the http.postForm helper, matching the existing http.get/post/head/download unit-test examples. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7iat5zMwn2N5xDVEAvgpN --------- Co-authored-by: Claude <noreply@anthropic.com> * Add cross app copy * Fix repeat-one navigation in Musicify Update track navigation logic so `repeat: 'one'` behaves like looped playback at queue boundaries. `nextTrack()` now wraps to the first item when reaching the end under repeat-one, and `prevTrack()` wraps to the last item (and stops playback when repeat is off at the start). This also removes the previous "restart track if >3s" behavior so previous-track consistently follows queue navigation rules. * Add message context menu, thread editing, and keyboard navigation (#281) * AGI: curl-like http.request + 60min LLM timeout http library: - Add http.request(options) supporting method selection, custom headers, raw/JSON/form/binary(base64) request bodies, HTTP basic auth, per-request timeout, redirect-follow control and text/base64 response bodies. Returns a {ok, status, statusText, headers, body, error} response object. - Add http.put/patch/delete/postForm/postJSON helpers built on http.request. - http.get and http.post now accept optional headers (backward compatible: the classic no-header signatures behave exactly as before). - Add agi.http_test.go covering the body builder, request execution (methods, headers, form/binary bodies, basic auth, redirect handling) and the JS bindings. llm library: - Raise the AI completion request timeout from 120s to 60 minutes so long reasoning/agentic replies are not cut short. Docs: update mod/agi/README.md and Terminal api.json; bump AgiVersion to 3.5. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7iat5zMwn2N5xDVEAvgpN * UnitTest: add http.request example backend script Add src/web/UnitTest/backend/http.request.js demonstrating the new curl-like http.request(options) call (method, custom headers, JSON body, timeout, response object) plus the http.postForm helper, matching the existing http.get/post/head/download unit-test examples. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7iat5zMwn2N5xDVEAvgpN * Chatspace: keyboard-driven composers + PWA Back for threads Full keyboard control across the app: - @mention picker is now arrow-navigable: Up/Down move the highlight (wrapping), Enter/Tab insert, Esc dismisses. Rows confirm on mousedown so the composer keeps focus/selection. - Mentions and the same key affordances now work in the thread composer too, not just the main composer (shared composerKeydown handler). - Up-arrow-to-edit works inside threads (edits your last reply); Esc cancels an in-progress inline edit without closing the panel. - Layered Esc: closes the top-most popover, then an open modal, then the thread/profile panel. PWA: opening a thread/profile panel pushes a history entry so the device or browser Back button closes the panel instead of leaving the installed app. A single sentinel is reused across convo switches to avoid an async popstate race; UI dismissals consume it via history.back(). Bumped the service-worker shell cache to v2 and refreshed the in-app shortcut help. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: stop thread panel overflowing off-screen when narrow The desktop layout grid used `68px 1fr` for the rail/body columns. A bare `1fr` track is floored at its min-content, so once the thread (right) panel is open the sidebar + content + panel minimum widths force the body track wider than the viewport. The body then overflows to the right and the thread panel - along with its close button - is pushed off-screen and unreachable at narrow desktop / resized floatWindow widths (roughly 769-1040px), where the mobile full-screen breakpoint has not yet kicked in. Floor the body track with `minmax(0, 1fr)` and let `#body` shrink (`min-width: 0`) so the flex row collapses to the available width instead of overflowing; `overflow: hidden` on `#app` is a belt-and-suspenders guard (in-app popovers and modals live outside `#app`, so they are not clipped). Verified in Chromium from 760px through 1280px: zero body / document overflow and the panel close button stays on-screen at every width. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: fix channel-header overlap and email-username mentions Two narrow-width / naming bugs in the channel view: 1. Channel header overlap. When the content pane is squeezed (e.g. a thread panel open on a mid-size window), the channel name spilled out of `.ch-left` and rendered on top of the star / members / call buttons, producing the mangled "name + overlapping box + star" seen in the header. `.ch-left` now clips its overflow, the channel name truncates with an ellipsis instead of pushing its siblings out (`#chNameBtn` is a flex row with `min-width:0`, `#chName` ellipsizes), the star keeps its size (`flex-shrink:0`), and the secondary topic yields space first (`flex-shrink:100`). Verified: no element overlaps from 230px through full width, and the name shows in full once there is room. 2. Email-style @mentions. The mention token stopped at an embedded "@", so mentioning a user named "admin@example.com" only highlighted "admin". The mention render + typing-detection character classes now include "@", so the whole "admin@example.com" is captured and matched. Exact-username lookup is unchanged, so plain names, dotted names and @everyone/@ai still resolve and bare emails in prose (bob@example.com, no leading @) are still not treated as mentions. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: sidebar, search empty-state, mention + details fixes - Sidebar: starred channels / DMs stay listed under their own Channels / Direct messages section instead of being removed once starred, and the collapse caret on each section title is aligned to the same column as the row icons (# / lock / +) for a clean left rail. - Search: focusing the (blank) search box now opens a Slack-style empty state - a "Search messages, files and more" hint plus recent conversations as quick jumps - instead of showing nothing. - Mentions: only real-user mentions (which carry data-user) open a profile on click; @everyone / @channel / @ai are not people and no longer pop a blank profile panel. - Details modal: the topic "Edit" link is no longer glued to the value ("Add a topicEdit") - .rp-editlink is now a global class so its left margin applies outside .rp-section too. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: keyboard nav for search + pickers, tidy presence dot Audit pass 1 (search / people pickers): - Search dropdown is now keyboard driven: Down/Up move the highlight (wrapping), Enter opens the highlighted result, Esc closes the panel; hovering syncs the cursor. Previously it was mouse-only. - The New message / Add people pickers gain the same arrow + Enter navigation, with a visible keyboard-cursor highlight (.kbfocus). - Presence dot in picker rows now overlays the avatar's corner (like the sidebar) instead of floating as a separate column between the avatar and the name, which left an empty gap for offline users. Verified in Chromium: search arrow nav cycles 1->2->1->0, Esc hides the dropdown, no page errors. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: browse-modal keyboard nav + document list shortcuts Audit pass 2 (browse + docs): - Browse channels list is now keyboard navigable: Up/Down move a visible cursor (.kbfocus) and Enter triggers the highlighted row's Open / View button; hovering syncs the cursor. This completes arrow-key control across every list surface (search, quick switcher, @mention picker, people pickers, browse). - Documented the search / picker navigation in the About > Shortcuts help. Swept the remaining views (help, details Settings, profile panel, thread panel, Threads/Drafts/Later lists) - all icons and spacing check out, no further misalignments found. Verified browse nav in Chromium: arrows move the cursor and Enter activates the row's button. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: fix thread image overflow + add right-click context menu - Thread panel image overflow: .msg-img was capped at a fixed 360px, wider than the ~330px thread panel, forcing a horizontal scrollbar. Cap with min(360px, 100%) so it keeps the 360px limit in the wide pane but never exceeds a narrow container; same fix for the text-file preview (520px). - Right-click context menu for messages (Slack style): Add reaction, Reply in thread, Copy text, Save for later, Pin/Unpin, Edit (own text), Delete (own or manager), with a separator layout and danger styling. The single-key hints shown on the right (R/T/C/A/P/E, Del) are live while the menu is open; Ctrl/Cmd combos are left to the browser, and a native menu still appears when text is selected inside the message. Edit routes to the thread composer when the message is in the thread panel. Verified in Chromium end to end: a real message right-clicks open the menu with the expected items, the A shortcut runs its action and closes the menu, and the thread-panel image no longer overflows (360px cap preserved in the main pane). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: put the thread-reply bar below an image, not beside it The thread summary bar was display:inline-flex, so after an image (whose .file-preview is display:inline-block) the two shared a line and the "N replies / Last reply ..." pill floated to the right of the image. Make the bar block-level (display:flex) with width:fit-content so it drops onto its own line under the image while keeping its compact pill shape. Verified in Chromium: the bar's top is below the image's bottom and its width stays content-sized (~194px, not full width). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 --------- Co-authored-by: Claude <noreply@anthropic.com> * Add docs page breaks and table tools Teach Docs to preserve explicit page breaks in the editor and DOCX import/export, and align exported headers/footers with the editor's left-aligned layout. The editor UI also gains a Word-style table inserter, contextual table formatting menus, richer context/edit menu clipboard actions, and related pagination/menu contract updates. * Add message context menu, thread editing, and keyboard navigation (#282) * AGI: curl-like http.request + 60min LLM timeout http library: - Add http.request(options) supporting method selection, custom headers, raw/JSON/form/binary(base64) request bodies, HTTP basic auth, per-request timeout, redirect-follow control and text/base64 response bodies. Returns a {ok, status, statusText, headers, body, error} response object. - Add http.put/patch/delete/postForm/postJSON helpers built on http.request. - http.get and http.post now accept optional headers (backward compatible: the classic no-header signatures behave exactly as before). - Add agi.http_test.go covering the body builder, request execution (methods, headers, form/binary bodies, basic auth, redirect handling) and the JS bindings. llm library: - Raise the AI completion request timeout from 120s to 60 minutes so long reasoning/agentic replies are not cut short. Docs: update mod/agi/README.md and Terminal api.json; bump AgiVersion to 3.5. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7iat5zMwn2N5xDVEAvgpN * UnitTest: add http.request example backend script Add src/web/UnitTest/backend/http.request.js demonstrating the new curl-like http.request(options) call (method, custom headers, JSON body, timeout, response object) plus the http.postForm helper, matching the existing http.get/post/head/download unit-test examples. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N7iat5zMwn2N5xDVEAvgpN * Chatspace: keyboard-driven composers + PWA Back for threads Full keyboard control across the app: - @mention picker is now arrow-navigable: Up/Down move the highlight (wrapping), Enter/Tab insert, Esc dismisses. Rows confirm on mousedown so the composer keeps focus/selection. - Mentions and the same key affordances now work in the thread composer too, not just the main composer (shared composerKeydown handler). - Up-arrow-to-edit works inside threads (edits your last reply); Esc cancels an in-progress inline edit without closing the panel. - Layered Esc: closes the top-most popover, then an open modal, then the thread/profile panel. PWA: opening a thread/profile panel pushes a history entry so the device or browser Back button closes the panel instead of leaving the installed app. A single sentinel is reused across convo switches to avoid an async popstate race; UI dismissals consume it via history.back(). Bumped the service-worker shell cache to v2 and refreshed the in-app shortcut help. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: stop thread panel overflowing off-screen when narrow The desktop layout grid used `68px 1fr` for the rail/body columns. A bare `1fr` track is floored at its min-content, so once the thread (right) panel is open the sidebar + content + panel minimum widths force the body track wider than the viewport. The body then overflows to the right and the thread panel - along with its close button - is pushed off-screen and unreachable at narrow desktop / resized floatWindow widths (roughly 769-1040px), where the mobile full-screen breakpoint has not yet kicked in. Floor the body track with `minmax(0, 1fr)` and let `#body` shrink (`min-width: 0`) so the flex row collapses to the available width instead of overflowing; `overflow: hidden` on `#app` is a belt-and-suspenders guard (in-app popovers and modals live outside `#app`, so they are not clipped). Verified in Chromium from 760px through 1280px: zero body / document overflow and the panel close button stays on-screen at every width. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: fix channel-header overlap and email-username mentions Two narrow-width / naming bugs in the channel view: 1. Channel header overlap. When the content pane is squeezed (e.g. a thread panel open on a mid-size window), the channel name spilled out of `.ch-left` and rendered on top of the star / members / call buttons, producing the mangled "name + overlapping box + star" seen in the header. `.ch-left` now clips its overflow, the channel name truncates with an ellipsis instead of pushing its siblings out (`#chNameBtn` is a flex row with `min-width:0`, `#chName` ellipsizes), the star keeps its size (`flex-shrink:0`), and the secondary topic yields space first (`flex-shrink:100`). Verified: no element overlaps from 230px through full width, and the name shows in full once there is room. 2. Email-style @mentions. The mention token stopped at an embedded "@", so mentioning a user named "admin@example.com" only highlighted "admin". The mention render + typing-detection character classes now include "@", so the whole "admin@example.com" is captured and matched. Exact-username lookup is unchanged, so plain names, dotted names and @everyone/@ai still resolve and bare emails in prose (bob@example.com, no leading @) are still not treated as mentions. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: sidebar, search empty-state, mention + details fixes - Sidebar: starred channels / DMs stay listed under their own Channels / Direct messages section instead of being removed once starred, and the collapse caret on each section title is aligned to the same column as the row icons (# / lock / +) for a clean left rail. - Search: focusing the (blank) search box now opens a Slack-style empty state - a "Search messages, files and more" hint plus recent conversations as quick jumps - instead of showing nothing. - Mentions: only real-user mentions (which carry data-user) open a profile on click; @everyone / @channel / @ai are not people and no longer pop a blank profile panel. - Details modal: the topic "Edit" link is no longer glued to the value ("Add a topicEdit") - .rp-editlink is now a global class so its left margin applies outside .rp-section too. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: keyboard nav for search + pickers, tidy presence dot Audit pass 1 (search / people pickers): - Search dropdown is now keyboard driven: Down/Up move the highlight (wrapping), Enter opens the highlighted result, Esc closes the panel; hovering syncs the cursor. Previously it was mouse-only. - The New message / Add people pickers gain the same arrow + Enter navigation, with a visible keyboard-cursor highlight (.kbfocus). - Presence dot in picker rows now overlays the avatar's corner (like the sidebar) instead of floating as a separate column between the avatar and the name, which left an empty gap for offline users. Verified in Chromium: search arrow nav cycles 1->2->1->0, Esc hides the dropdown, no page errors. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: browse-modal keyboard nav + document list shortcuts Audit pass 2 (browse + docs): - Browse channels list is now keyboard navigable: Up/Down move a visible cursor (.kbfocus) and Enter triggers the highlighted row's Open / View button; hovering syncs the cursor. This completes arrow-key control across every list surface (search, quick switcher, @mention picker, people pickers, browse). - Documented the search / picker navigation in the About > Shortcuts help. Swept the remaining views (help, details Settings, profile panel, thread panel, Threads/Drafts/Later lists) - all icons and spacing check out, no further misalignments found. Verified browse nav in Chromium: arrows move the cursor and Enter activates the row's button. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: fix thread image overflow + add right-click context menu - Thread panel image overflow: .msg-img was capped at a fixed 360px, wider than the ~330px thread panel, forcing a horizontal scrollbar. Cap with min(360px, 100%) so it keeps the 360px limit in the wide pane but never exceeds a narrow container; same fix for the text-file preview (520px). - Right-click context menu for messages (Slack style): Add reaction, Reply in thread, Copy text, Save for later, Pin/Unpin, Edit (own text), Delete (own or manager), with a separator layout and danger styling. The single-key hints shown on the right (R/T/C/A/P/E, Del) are live while the menu is open; Ctrl/Cmd combos are left to the browser, and a native menu still appears when text is selected inside the message. Edit routes to the thread composer when the message is in the thread panel. Verified in Chromium end to end: a real message right-clicks open the menu with the expected items, the A shortcut runs its action and closes the menu, and the thread-panel image no longer overflows (360px cap preserved in the main pane). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 * Chatspace: put the thread-reply bar below an image, not beside it The thread summary bar was display:inline-flex, so after an image (whose .file-preview is display:inline-block) the two shared a line and the "N replies / Last reply ..." pill floated to the right of the image. Make the bar block-level (display:flex) with width:fit-content so it drops onto its own line under the image while keeping its compact pill shape. Verified in Chromium: the bar's top is below the image's bottom and its width stays content-sized (~194px, not full width). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CfKyJV4zkj4AyME6XjH5q6 --------- Co-authored-by: Claude <noreply@anthropic.com> * Notification Agent implementation (#283) * Implement notification agent system with AGI, priority and config UI Adds a full multi-channel notification system so ArozOS and AGI scripts can reach users through their preferred channels at a chosen priority. Backend (mod/notification): - Extend NotificationPayload with Priority (low/medium/high), Timestamp and Payload, plus priority helpers and a Sender interface. - New delivery agents: telegram (bot + per-user chat id), desktopn (in-memory per-user buffer polled by the web desktop) and webhookn (custom HTML API to a per-user configurable endpoint/template). - New preference store (mod/notification/preference) persisting per-user enabled channels, minimum priority threshold, Telegram chat id and webhook target; resolves delivery agents by preference and priority. AGI: - New "notification" library (requirelib) with notification.send / sendToUser and PRIORITY_* constants; wired via AgiSysInfo.NotificationSender. - Bump AgiVersion, update api.json and mod/agi/README.md. Core wiring: - Rewrite src/notification.go to register all agents and route through a preference-aware sender; start notificationInit before AGIInit. - src/notification_settings.go: "Notifications" settings tab with user preference endpoints, desktop polling endpoint, test-send, and admin-only Telegram/SMTP config endpoints. Frontend: - SystemAO/notification config menu (channels, priority, Telegram, webhook, admin agent config) with shared notification.js helper logic. - desktop.html polls the desktop agent and renders into #notificationlist, shows the notification bar popup and raises browser (Chrome) push. Tests: - Go table-driven tests for every new package/agent and the preference store and AGI lib. - Webapp unit tests (notification.test.js + tests.html) for the shared frontend logic, runnable in-browser and under Node. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Add desktop notification toast and focus-aware browser push Replace the full-notification-bar popup with a transient toast shown in the bottom-right of the desktop when a new notification arrives while the page is focused. When the page is not focused (hidden tab or unfocused window), raise a browser (Chrome) push notification instead; clicking it focuses the tab. Toast content is set via textContent to avoid markup injection, is theme-aware, colour-coded by priority, auto-dismisses (longer for high priority) and opens the full notification list on click. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Unit-test toast/browser-push behaviour and share it with the desktop Factor the toast-vs-browser-push decision into the unit-tested notification.js helper: - deliveryChannelForFocus(isFocused): "toast" when focused, "push" when not - toastPriorityClass(priority): CSS modifier class per priority - toastDurationMs(priority): auto-dismiss duration (high priority lingers) desktop.html now loads notification.js and uses these helpers (with local fallbacks) so the runtime behaviour is the same logic the tests exercise. Add matching cases to notification.test.js / tests.html (43 tests total). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Add notification AGI library test to the UnitTest webapp Add backend/notification.test.js to the Unit Tester webapp so the notification AGI library (requirelib("notification")) is exercised end-to-end against a live server: object shape, PRIORITY_* constants, send() to the current user at each priority, empty-title rejection, and the admin-gated sendToUser() failing for a non-existent user. Follows the harness convention (thrown assertion -> HTTP 500 -> FAIL; sendResp summary -> HTTP 200 -> PASS) and is auto-listed by list.agi. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Remove SystemAO frontend notification unit tests Drop SystemAO/notification/notification.test.js and tests.html; the notification library is now covered by the AGI test in the UnitTest webapp (backend/notification.test.js). notification.js is retained as it is runtime helper logic used by the settings page and the desktop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Notification prefs: channel x priority matrix + browser permission button Replace the "enabled channels + single minimum priority" model with a per-user delivery matrix: each channel (desktop, email, Telegram, custom webhook) can be independently enabled for low / medium / high priority. For example, desktop for everything but email only for high priority. Backend (mod/notification/preference): - UserPreference.Channels is now agent -> priority label -> bool. - DefaultPreference enables desktop for every priority. - ResolveAgents consults the matrix for the notification's priority. - Get/Set normalise the matrix (drop invalid labels and empty rows). - Update preference tests for the matrix model. - /system/notification/preference POST now takes a "channels" JSON matrix. Frontend (SystemAO/notification): - Render the preferences as a checkbox matrix (channels x priorities) with friendly channel names. - Add a "Browser Notifications" card with an Enable button that requests Notification permission and shows the current granted/denied/default state. - notification.js gains normalizeMatrix + browserPermissionState and builds the channels payload. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Notification settings: simplistic top bar + author credit card - Replace the large bell-icon header with a minimal top bar (title + subtitle over a thin divider). - Add an author/credit card at the bottom in the imuslab business-card style: the ArozOS mascot icon (img/system/favicon.png) on the left, a vertical divider, then author name, tagline, email/web links and a short brand note in a monospace face with highlighted brand words. Responsive (stacks on narrow widths). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Move the redesign into the notification email template The simplistic top bar + system-info card belong in the email that goes out, not the settings page. Revert the settings page footer/header change and restyle system/www/smtpn.html instead: - Simplistic header: "Notification from <host>" on a clean white bar (replaces the blue gradient banner). - Business-card footer with the ArozOS mascot icon (embedded as a base64 data URI so mail clients render it without a remote fetch), a divider, and system-related info: host name, host version and sent time. smtpn.go now injects {{logo}} (base64 brand icon) and {{version}} into the template; notification.go sets the agent's SystemVersion from the build. Adds tests for loadLogoDataURI. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Email: inline CID logo (Gmail-safe) + host-identifying footer Gmail blocks data: image URIs, so the embedded logo did not render. Switch the SMTP message to multipart/related with the ArozOS icon attached inline as a CID resource (cid:arozoslogo), which renders in Gmail and other clients without a remote fetch. Non-ASCII subjects are now RFC 2047 encoded. Replace the footer's version / product-name lines with information that identifies the host and message: host name, System UUID and Notification ID (plus sent time). The SMTP agent takes a SystemUUIDProvider (wired to the host System UUID) instead of a version string. Add tests for wrapBase64 and buildEmailMessage (with/without logo, unicode subject) and the raw logo loader. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Email: pad the timestamp and make the card full-width - Fix the sent-time format (3:04:05 gives a zero-padded 1:03:03 AM instead of the odd 1:3:3). - Let the email card span the full width of the client with minimal (8px) outer padding instead of a fixed 600px centred column. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Email: remove background tint + add priority to the subject - Drop the grey page/footer background colours so the email has no background tint (plain, borders provide the structure). - Prefix the email subject with the notification priority when set, e.g. "[High] Disk failing"; titles for priority-less payloads are unchanged. Adds a buildSubject test. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Notification settings: separate test section, consistent control sizing, icon alignment - Move the "Send a test notification" controls out of the Save row into their own card with a short description. - Give buttons and the priority select a shared 36px height (flex-centred) so they line up instead of rendering at mismatched heights. - Reset the Semantic icon margin/baseline inside #ntf-root so icons in card titles, buttons and the permission pill are vertically centred. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Notification settings: align permission chip with button + tidy spacing - Give the browser-permission status chip the same 36px height as the button beside it (rounded chip) so they line up as a matched pair. - Drop the height override in the icon reset so Semantic icons keep their intrinsic box and centre cleanly. - Add breathing room around the standalone Save preferences row. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt * Desktop toast: remove the coloured priority left bar Drop the border-left accent (and its high/low colour variants) from the desktop notification toast for a cleaner, flat popup. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSwCGEoDvwKtwbF69ytKBt --------- Co-authored-by: Claude <noreply@anthropic.com> * Add notification system and sound preferences to Chatspace (#284) * Chatspace: native desktop notifications + new-message chime Surface incoming messages beyond the in-app toast that was only visible while looking at Chatspace: - Native notifications: DMs and @mentions now raise an OS-level browser Notification (the same mechanism the ArozOS desktop uses) when the Chatspace window is backgrounded, so users are alerted even when the app is behind another window. When Chatspace is embedded in the ArozOS virtual desktop, the alert is also mirrored into the desktop notification centre. Clicking a notification focuses the app and opens the conversation. Permission is requested lazily on the first user gesture. - New-message chime: while the app is open, every incoming message plays a short WebAudio chime - a prominent rising tone for DMs/@mentions and a soft single note for ordinary messages - so there is an audible cue for new activity. Chimes share a throttle so bursts do not machine-gun the speaker. - Preferences: per-user "Play a sound for new messages" and "Desktop notifications" toggles in the profile panel (localStorage-backed), plus a hint showing the browser permission state. Both default on. Everything degrades gracefully: no AudioContext / Notification support or a standalone PWA launch simply falls back to the in-app toast and title badge. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A8EPn9EbFjJkeTMnXfdWzo * Chatspace: route push notifications through the ArozOS notification agent Follow-up to the notification work: instead of raising a browser-only Notification from the recipient's client, Chatspace now routes DMs and @mentions through the ArozOS notification system so recipients are reached even when Chatspace is not open, via each user's own configured agents (desktop, Telegram, email, webhook). Server side (AGI sharedspace library): - Add sharedspace.notifyMembers(spaceid, title, message, [priority], [usernames]) - a membership-scoped capability that a regular user can call (unlike notification.sendToUser, which is admin only). Only a member may notify, only fellow members can be reached, and members currently connected to the space's realtime channel are skipped (they already get the live message), avoiding duplicate alerts. Delivery per recipient runs through the existing NotificationSender, honouring that user's notification preferences. Recipient resolution is factored into a pure, table-tested helper; an Otto-level integration test exercises the full path (membership check, presence skip, explicit target intersection). Chatspace: - New backend/notify.js raises the notification for a message's addressees. - The client calls it when sending a DM or a message that @mentions members (or @channel / @everyone), passing the resolved targets. - Drop the earlier direct browser-Notification path and its per-user "desktop notifications" toggle; delivery is now governed by the user's ArozOS notification settings. The new-message chime and its sound toggle are unchanged. Docs: document notifyMembers in mod/agi/README.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A8EPn9EbFjJkeTMnXfdWzo * Update .gitignore * desktop: always show the in-page notification toast, push only when unfocused Previously an incoming desktop notification was surfaced as *either* an in-page toast (when the desktop was focused) *or* a browser push (when it was not). While unfocused - including when focus was in a floatWindow app or another window - no toast appeared, so a notification would land on the persistent list (showing the red dot on the clock) with no visible toast, and the browser push often did nothing (permission not granted / http origin). Now the in-page toast is shown regardless of focus, so the notification is never silently swallowed, and the browser (OS) push is additionally raised only when the desktop is not focused, to reach the user when they are looking elsewhere. deliveryChannelForFocus (single channel) becomes deliveryChannelsForFocus, returning ["toast"] when focused and ["toast","push"] when not; desktop.html shows each listed channel independently. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A8EPn9EbFjJkeTMnXfdWzo --------- Co-authored-by: Claude <noreply@anthropic.com> * Add ODF/PDF support to Office suite Extend the office conversion library and AGI bindings to import/export ODT, ODS, and ODP files and to generate real-text PDF exports for Docs, Sheets, and Slides. This also improves DOCX/PPTX fidelity with better table/image handling, captures slide media as poster images plus a sidecar zip for PPTX exports, updates the Office webapps and API docs for the new flows, and adds broad converter regression tests. * Add GitApp and AGI git library Introduces full git support across ArozOS: a new `mod/git` manager (status/history/branching/staging/commit/diff/blob/transport), encrypted per-user credential storage, and extensive unit tests. Wires the manager into AGI (`AgiVersion` 3.7), registers a new `git` library, and documents the API in both AGI README and Terminal `api.json`. Adds a new GitApp web module with backend AGI endpoints and a desktop-style frontend for repository management, diffs, history, remotes, and credentials. Also adds `src/system/git/` to `.gitignore` for local key material, plus small UI fixes in Calendar (week-view scrollbar alignment) and Sheets (currency/percent format toggle state). * Add Movie settings tab and playback controls Adds a new Settings view in Movie with index management: auto-index toggle, index stats, manual rescan, and clear-index actions backed by new AGI scripts (`getIndexStats.js`, `clearIndex.js`) and common script constants. Upgrades player UX in both full and embedded views with a gear-based playback popup (repeat-one, speed, volume bar visibility), persisted preferences, center play/pause flash feedback, improved repeat handling for transcoded streams, and keyboard shortcuts (`S`, `R`, refined `Esc`). Also replaces emoji/text glyphs with SVG icons and improves long-title/season tab overflow handling. * Add Git branch/history actions to GitApp Introduces new git manager capabilities for local/remote branch delete/rename and commit-level history actions (checkout, reset, branch/tag creation, revert, cherry-pick, amend), then wires them through AGI bindings and new GitApp backend endpoints. Updates the GitApp UI with branch and commit context menus, tag labels in history, and credential-aware remote branch operations. Also extends git log/branch metadata (commit tags, remote/short branch fields), adds unmerged-branch signaling, refreshes API docs, and adds comprehensive tests plus a .gitignore append regression fix. * Generate desktop icons for web modules Add desktop icon generation for module shortcuts when a web app does not provide its own desktop_icon.png. The new pipeline resolves/sanitizes asset paths, loads raster or SVG icons, rasterizes SVGs with stroke-width scaling fixes, and renders a padded squircle backplate with adaptive black/white contrast before saving the generated icon into the app folder. Also adds comprehensive unit tests for path resolution, squircle math/coverage, backplate color selection, icon scaling/rendering, SVG stroke scaling, and rasterized stroke thickness. * Refactor desktop logic into modular packages Extract desktop responsibilities from `desktop.go` into new `mod/desktop` packages: `icons`, `layout`, `prefs`, and `wallpaper`. The desktop handlers now initialize and use dedicated managers/generators for icon rendering, icon position persistence, user preferences/themes, and wallpaper theme discovery. This removes a large amount of inlined desktop/icon code from `desktop.go`, centralizes desktop constants, and keeps existing behavior while improving separation of concerns and testability. The old monolithic desktop icon tests were replaced with focused package-level tests for each new module. * Add raised hand feature, connection stats, and host kick capability (#292) * MeetRoom: clock, raised hands, kick, invite dialog, ArozOS attachments, stats Add seven participant-facing features to the MeetRoom app: - Header now shows the current wall-clock time and the live meeting duration (backend exposes the room CreatedAt in the descriptor). - Raise-hand control: a hand state rides the existing state broadcast, shows an animated badge on the raiser's tile and in the participant list, and chimes with a system note when a remote hand goes up. - Richer invite dialog replacing the copy-to-clipboard button: meeting title, ID, a shareable link, an optional personal message and one-tap copy buttons. - Attach menu lets users share a file straight from their ArozOS storage (new /system/meetroom/attachfile endpoint streams the file server-side from the user's file system) alongside device upload. - Host can remove participants: a kick control in the participant list, a host-only kick frame, and Room.KickParticipant (with test) that refuses to kick the host. The target gets a dedicated "kicked" frame so it stops auto-reconnecting. - Connection performance panel polls RTCPeerConnection.getStats() for per-peer send/receive bitrate, round-trip time and packet loss. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138Pxpde8t93BUip72hfLq3 * MeetRoom: float the stats window, add a raise-hand queue, fix hand-badge centering Address UI feedback on the MeetRoom features: - The raised-hand badge glyph sat low-right inside its round tile badge; nudge it to optically centre in the circle. - Turn the connection-stats side panel into a compact floating window ("minimized page") that overlays the meeting and can be dragged around by its header (pointer events, so mouse and touch both work). It no longer displaces the video grid or fights the chat / participants panels, and defaults to the top-left clear of them. - Add a raise-hand queue: the participants panel now lists everyone with a hand up in the order they raised it, numbered, above the roster. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138Pxpde8t93BUip72hfLq3 --------- Co-authored-by: Claude <noreply@anthropic.com> * Align Office pagination and header/footer modes Reworked Docs PDF export into a CSS-like block/inline layout pipeline so wrapping, margin collapsing, block pagination, tables/lists/pre blocks, and image sizing match the editor preview more closely. Added `hfMode` (`all`, `except-first`, `none`) end-to-end in Docs state/UI, DOCX/ODT readers/writers, and PDF rendering (including first-page page-number suppression behavior), with expanded regression tests for layout and header/footer round-trips. Also added desktop/icon PNG assets for AGIForge and GitApp, and updated Office docs to document the new behavior. * Integrate Raw Editor into Pixel Studio Moves Raw Editor under `Pixel Studio/raw`, registers it from Pixel Studio’s `init.agi`, and updates asset/API paths accordingly while removing the standalone Raw Editor module registration. Pixel Studio now detects RAW extensions and forwards opens to Raw Editor, including a new File menu entry to launch it directly. Improves editor UX with shared numeric inputs (typing + wheel step + unit labels), synced slider/number controls, and better layer opacity editing/undo behavior. Adds multi-layer panel selection (Ctrl/Shift click), layer context menu actions, merge-selected/delete-selected flows (including Ctrl+E behavior), and updates layer/menu shortcuts/help text. Save behavior is hardened to avoid accidental flattening by steering multi-layer documents to `.pxs` and using a better Save As start directory. * Add ArozOS PDF save option in Text app Adds a new “Save as PDF…” action to the Text app Export menu that renders the PDF and uploads it directly to a user-selected ArozOS path via the file selector, with status/error feedback. Also adds new desktop/app icon assets for AGIForge and GitApp. * Add streaming chat, reasoning/thinking support, and file uploads (#293) * AIChat: collapsible thinking section + media upload from computer Thinking / reasoning: - Capture model chain-of-thought in the llm client. openai.go reads reasoning_content (DeepSeek) / reasoning (OpenRouter); anthropic.go collects "thinking" content blocks (previously dropped). Surfaced via a new Choice.Message.ReasoningContent field on the unified response. - chat.agi forwards it to the frontend as a "reasoning" field. - The AIChat UI shows reasoning in a disclosure that is collapsed by default and only expands when the user presses "Show thinking". Inline <think>/<thinking> tags emitted by local models are parsed out of the reply too, so the answer bubble stays clean. Prior thinking is not fed back to the model on later turns. Media upload: - The attach button now opens a small menu: "ArozOS files" (the existing file selector) or "Upload from computer". Local picks are uploaded to a tmp:/ scratch folder and staged as virtual paths, so they flow through the same llm.fileParts path as drive files. Chips show an uploading spinner / failed state, and send waits for uploads to finish. - Added a self-contained toast (the desktop shell's showToast is not reachable from the app iframe) and replaced the one stale showToast call. Also: table-driven tests for reasoning capture (openai/anthropic clients and chat.agi), updated the llm API docs (README + api.json), and replaced a pre-existing emoji in the model picker per the icon policy. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 * AIChat: stop the app shell overflowing the viewport The desktop grid (.app) set height:100dvh but no grid-template-rows, so its single implicit row was auto-sized to content and grew past the viewport — the sidebar's chat list and the message area couldn't shrink, producing a page scrollbar and pushing the composer toward the edge. Pin the row to minmax(0,1fr) and give the sidebar / chat list min-height:0 so the inner areas scroll instead of the whole app. Verified overflow is 0 from 600px to 900px tall viewports with the composer fully visible. Pre-existing layout issue, surfaced while adding the thinking section and media upload. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 * AIChat: real-time streaming replies and PDF attachment support Streaming (token-by-token, including live thinking): - Add Client.ChatStream to the llm client, with SSE parsing for both wire formats: OpenAI (delta.content plus reasoning_content/reasoning, usage via stream_options.include_usage) and Anthropic (text_delta / thinking_delta, usage split across message_start and message_delta). - Expose it to AGI scripts as llm.streamRequest(messages, options, onDelta). onDelta fires per chunk with {content, reasoning} on the script's own goroutine, so a script can relay straight to websocket.send(). Usage and quota are recorded exactly as for a blocking call; connection resolution is now shared by both paths via llmResolveConnection. - New backend/chat_stream.agi relays the stream over a WebSocket using the frame protocol start/reasoning/delta/done/error. - The UI now streams: the answer grows token by token with a caret, and the thinking section auto-opens while the model reasons ("Thinking…") then collapses to "Show thinking" once the answer starts — unless the user toggled it themselves. Stop closes the socket and keeps partial output. If the socket cannot be opened the app falls back to the one-shot HTTP backend, so nothing regresses. PDF attachments: - PDFs are rasterised to JPEG pages in the browser with the pdf.js already bundled with the PDF Viewer app, then uploaded and attached in the PDF's place, fixing "unsupported file type for file-based chat: *.pdf". Works for both computer uploads and drive picks (read via /media). Capped at 10 pages with a notice; no new dependency and no system tools involved. - Attachment entries now carry a `paths` array, so one chip can expand to several page images; chips show conversion progress and the page count. Tests: SSE streaming for both formats (deltas, assembly, usage, error envelopes and error events), the AGI streaming binding, and chat_stream.agi driven through a stubbed websocket. Docs updated (README + api.json). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 --------- Co-authored-by: Claude <noreply@anthropic.com> * Add streaming chat, reasoning/thinking support, and file uploads (#294) * AIChat: collapsible thinking section + media upload from computer Thinking / reasoning: - Capture model chain-of-thought in the llm client. openai.go reads reasoning_content (DeepSeek) / reasoning (OpenRouter); anthropic.go collects "thinking" content blocks (previously dropped). Surfaced via a new Choice.Message.ReasoningContent field on the unified response. - chat.agi forwards it to the frontend as a "reasoning" field. - The AIChat UI shows reasoning in a disclosure that is collapsed by default and only expands when the user presses "Show thinking". Inline <think>/<thinking> tags emitted by local models are parsed out of the reply too, so the answer bubble stays clean. Prior thinking is not fed back to the model on later turns. Media upload: - The attach button now opens a small menu: "ArozOS files" (the existing file selector) or "Upload from computer". Local picks are uploaded to a tmp:/ scratch folder and staged as virtual paths, so they flow through the same llm.fileParts path as drive files. Chips show an uploading spinner / failed state, and send waits for uploads to finish. - Added a self-contained toast (the desktop shell's showToast is not reachable from the app iframe) and replaced the one stale showToast call. Also: table-driven tests for reasoning capture (openai/anthropic clients and chat.agi), updated the llm API docs (README + api.json), and replaced a pre-existing emoji in the model picker per the icon policy. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 * AIChat: stop the app shell overflowing the viewport The desktop grid (.app) set height:100dvh but no grid-template-rows, so its single implicit row was auto-sized to content and grew past the viewport — the sidebar's chat list and the message area couldn't shrink, producing a page scrollbar and pushing the composer toward the edge. Pin the row to minmax(0,1fr) and give the sidebar / chat list min-height:0 so the inner areas scroll instead of the whole app. Verified overflow is 0 from 600px to 900px tall viewports with the composer fully visible. Pre-existing layout issue, surfaced while adding the thinking section and media upload. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 * AIChat: real-time streaming replies and PDF attachment support Streaming (token-by-token, including live thinking): - Add Client.ChatStream to the llm client, with SSE parsing for both wire formats: OpenAI (delta.content plus reasoning_content/reasoning, usage via stream_options.include_usage) and Anthropic (text_delta / thinking_delta, usage split across message_start and message_delta). - Expose it to AGI scripts as llm.streamRequest(messages, options, onDelta). onDelta fires per chunk with {content, reasoning} on the script's own goroutine, so a script can relay straight to websocket.send(). Usage and quota are recorded exactly as for a blocking call; connection resolution is now shared by both paths via llmResolveConnection. - New backend/chat_stream.agi relays the stream over a WebSocket using the frame protocol start/reasoning/delta/done/error. - The UI now streams: the answer grows token by token with a caret, and the thinking section auto-opens while the model reasons ("Thinking…") then collapses to "Show thinking" once the answer starts — unless the user toggled it themselves. Stop closes the socket and keeps partial output. If the socket cannot be opened the app falls back to the one-shot HTTP backend, so nothing regresses. PDF attachments: - PDFs are rasterised to JPEG pages in the browser with the pdf.js already bundled with the PDF Viewer app, then uploaded and attached in the PDF's place, fixing "unsupported file type for file-based chat: *.pdf". Works for both computer uploads and drive picks (read via /media). Capped at 10 pages with a notice; no new dependency and no system tools involved. - Attachment entries now carry a `paths` array, so one chip can expand to several page images; chips show conversion progress and the page count. Tests: SSE streaming for both formats (deltas, assembly, usage, error envelopes and error events), the AGI streaming binding, and chat_stream.agi driven through a stubbed websocket. Docs updated (README + api.json). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 * AIChat: fix #### headings and --- rules not rendering Two markdown gaps in the chat renderer: - Headings were matched one depth at a time with ^###\s+, ^##\s+, ^#\s+. "#### Title" matched none of them (the third # is followed by another #, not whitespace), so it rendered literally, as did ##### and ######. One rule now covers every depth: # -> h2 through ###### -> h6, with the closed-ATX trailing #'s stripped. - Thematic breaks had no rule at all, so --- rendered as literal text. Add ---, ***, ___ and their spaced variants as <hr>, matched before the emphasis rules so a rule of asterisks is not eaten as bold/italic. Three or more markers are required, so list items are unaffected. Also style h2-h6 and hr explicitly (shared with the thinking panel, which renders the same markdown) so h5/h6 do not collapse to tiny default text, collapse <br> runs around block elements, and normalise CRLF so a trailing \r cannot leak into heading text. Verified against the real renderer: 24 cases covering both bugs, every heading depth, the rule variants, and regressions — lists, bold/italic, inline code, links, escaping, and --- / #### inside fenced code blocks staying literal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 * AIChat: render markdown live while streaming, and support tables Live markdown during generation: - The streaming reply and the thinking panel were written as plain text and only converted to markdown once the reply finished. Both now render markdown as tokens arrive. Paints are coalesced on a 60ms timer so a fast token stream cannot thrash layout, and a queued paint is cancelled when the reply is finalised. - Half-written markup is normal mid-stream; the most visible case is an unclosed ``` fence, which would flash as raw backticks until the model closes it. A copy of the text is closed off for rendering only, leaving the stored text untouched, so code blocks appear as code from the first line. GFM tables: - Tables were not implemented, so a table rendered as rows of literal pipes. Added header/delimiter/body parsing with :--- , ---: and :---: alignment, scoped so it cannot swallow prose: a row must start with "|", and the delimiter row must be all dashes/colons. Runs after the inline rules, so cells keep bold/code/link formatting, and inside a wrapper that scrolls on its own so a wide table never widens the chat column. Verified with 40 renderer cases (16 new for tables, including the reported table, alignment, ragged rows, inline markup in cells, and the negative cases - prose containing a pipe, lists, rules, and tables inside code fences), plus a browser run confirming headings, the table, the rule and the code block are all rendered elements *during* streaming, with no raw "| :---", "##" or "```" ever visible. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0136jXkjkwNzRZDrU9pbsHD1 --------- Co-authored-by: Claude <noreply@anthropic.com> * Add experimental hardware acceleration support * Add storyboard scrub-bar previews to Movie player Generates a cached sprite sheet (one keyframe every N seconds) per video via a new /media/storyboard/ endpoint. The sheet is stored beside the video under .metadata/.storyboard/ so the ffmpeg pass runs only once. Both the full-page player (index.html) and the embedded player (embedded.html) fetch the layout and image on load, then slice the sheet with CSS background-position on timeline hover, showing a thumbnail and timestamp. Includes unit tests for the planning logic and cache-path helpers. * Improve Musicify touch playback behavior Avoid touch-only hover interactions in Musicify by showing playlist, queue, and song-row controls without relying on `:hover`, while keeping desktop hover behavior unchanged. Also prevent tapping the currently loaded track from restarting playback; it now opens the Now Playing panel instead, which fixes the double-tap/restart experience on touch devices. * Extract PDF Tool from Productivity module Creates a new standalone `PDF Tool` web app with its own `init.agi`, UI, and JS modules (`common`, `editor`, `convert`, `chops`) for PDF editing, image conversion, and chop management. Moves related assets and `pdf-lib` into the new module path, including a legacy chop-storage migration from `Productivity` keys. Removes the old `Productivity` app/tool files and updates the Text editor’s PDF export comment to reference PDF Tool. * Add embedded subtitle & font support to Movie player Adds a `/media/subtitles/` endpoint that lists embedded subtitle tracks and font attachments from MKV containers (via ffprobe/ffmpeg), extracts tracks as SubRip or native ASS, and serves font binaries. On the frontend, the Movie player now: - Probes for embedded tracks on file load - Shows muxed subtitle tracks in the subtitle context menu - Renders ASS/SSA tracks with full styling, positioning and simultaneous events via a new in-repo `script/ass.js` parser/renderer - Falls back to plain SubRip rendering for non-ASS tracks - Loads embedded fonts by internal family name and registers them via FontFace API - Exposes embedded fonts in Subtitle Settings for SubRip tracks Also adds `fontname.go` which parses the sfnt name table to resolve a font's internal family name (needed because muxed subsets are often renamed to random strings). * Fix subtitle z-index, collisions and wrap in Movie Remove explicit z-index from #ass-overlay and #srt-overlay so controls and menus always paint above subtitles. Add collision resolution to push overlapping margin-anchored lines apart, matching libass behaviour for stacked dual-language subtitles. Split renderEvent into separate DOM-build and fade-application passes to avoid rebuilding the overlay every frame. Respect WrapStyle 2 (pre) to prevent browser auto-wrapping from inflating block heights. * Fix subtitle seeks in Movie player Prevent the Movie player from showing subtitles that were already in progress when playback seeks, for both plain cues and ASS rendering. The change also keeps the last valid ASS overlay geometry until video dimensions are available again, avoiding subtitle misalignment over letterboxing during seek/transcode reloads. * Add dedicated icon for Language settings Update the Language device setting to use a dedicated `language.png` icon instead of the shared small icon. This also adds the new exported icon asset and its PSD source for future edits. * Harden AGI SQLite lifecycle and concurrency This adds robust SQLite resource management in AGI by introducing per-library VM cleanup hooks and wiring them into all script exit paths, preventing leaked DB handles after errors, exits, timeouts, or force-stops. It also updates SQLite connection setup to use WAL/busy-timeout/immediate-lock pragmas and single-connection pooling for safer concurrent access. A new `db.transaction(fn)` API is added to the JS wrapper for explicit batched writes with commit/rollback semantics and nested-transaction protection. README and Terminal API docs are updated, and tests are expanded to cover DSN behavior, concurrency expectations, cleanup registration, and transaction semantics. * Rollback AI chat to origin non-broken state --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Alan Yeung <yeungbluecat123@gmail.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: tobychui <24617523+tobychui@users.noreply.github.com>
  • d23775e273 Add codec-aware playback and fMP4 HLS support Switch HLS output from MPEG-TS to fragmented MP4, enabling direct MediaSource appending without a demuxer. Add a /media/probe/ endpoint that reports actual codecs and whether a file can be direct-played, replacing the unreliable extension-based check that caused HEVC and 10-bit H.264 files to fail with decode errors. Add hlsmse.js, a lightweight MSE player for Firefox/Chrome that makes hls.js optional. Fix 10-bit transcodes producing High 10 streams browsers cannot decode by adding -pix_fmt yuv420p. Rewrite the fMP4 playlist init segment URI onto the segment endpoint (ffmpeg always writes it as a bare filename).
  • 388aa4b15e Revamp file explorer transfer and toast UI Replaced the old upload progress widget with a full transfer panel (minimize/collapse, per-task actions, summary, clear/cancel-all, active-row follow, and improved progress/state handling for uploads and zip downloads). Added a new bottom toast component with explicit show/hide behavior and error styling, plus new transfer icons and theme tokens. Also removed selection checkmark badges in list/grid rendering, refined thumbnail/card styling, and updated locale strings for new transfer/toast labels across languages.
  • 4850204ef6 Restyle file explorer dark theme palette Replace the neutral-grey dark theme tokens with a cool blue-charcoal palette sampled from the design mockup. Surfaces now step from darkest (content area) through chrome to menus, matching the intended depth order. Updates both the legacy CSS variable set in file_explorer.css and the --fs-* design tokens in fs-theme.css. Also refines the context menu to use rounded cards with flex rows, icon pinning, and shadow matching the rest of the fs-components design language.
  • Просмотр сравнение для этих 85 коммитов »

6 дней назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 388aa4b15e Revamp file explorer transfer and toast UI Replaced the old upload progress widget with a full transfer panel (minimize/collapse, per-task actions, summary, clear/cancel-all, active-row follow, and improved progress/state handling for uploads and zip downloads). Added a new bottom toast component with explicit show/hide behavior and error styling, plus new transfer icons and theme tokens. Also removed selection checkmark badges in list/grid rendering, refined thumbnail/card styling, and updated locale strings for new transfer/toast labels across languages.

1 неделя назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 4850204ef6 Restyle file explorer dark theme palette Replace the neutral-grey dark theme tokens with a cool blue-charcoal palette sampled from the design mockup. Surfaces now step from darkest (content area) through chrome to menus, matching the intended depth order. Updates both the legacy CSS variable set in file_explorer.css and the --fs-* design tokens in fs-theme.css. Also refines the context menu to use rounded cards with flex rows, icon pinning, and shadow matching the rest of the fs-components design language.

1 неделя назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 7326680670 Revamp file explorer toolbar and sorting UI Adds a classic operation toolbar above the nav bar with responsive collapse behavior, a persisted toolbar visibility toggle, and automatic de-duplication of overlapping actions in the overflow menu. Replaces the old sort dropdown with a dedicated sort menu/button, including active-state handling and updated sort interactions. Also improves mobile behavior (multi-select toggle, nav/status layout, zoom visibility), refines selection/checkmark logic, updates grid sizing/default zoom, and includes related icon and localization additions.

1 неделя назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

1 неделя назад

TC синхронизированные коммиты с v3.0.3 на TC/arozos-mirror из зеркала

  • 54eb12cc4a Add cancellable FFmpeg jobs and macOS accel Extend the AGI ffmpeg API with cancellable conversions, including optional image-conversion progress files, a shared job registry, cleanup of partial outputs, and tests for cancellation/probe logic. Update FFmpeg Factory to support multi-file uploads, queued/running/completed jobs, cancellation, and the refreshed conversion UI. Also add a macOS VideoToolbox hardware-encoder profile with probe-size support, document the new ffmpeg APIs, and surface video play() failures in the Movie player instead of leaving unhandled promise rejections.

2 недель назад

TC синхронизированные коммиты с master на TC/arozos-mirror из зеркала

  • f3d94b84e0 Bump github.com/go-git/go-git/v5 from 5.19.1 to 5.19.2 in /src (#297) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.19.1 to 5.19.2. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

2 недель назад

TC синхронизированные и удаленные ссылки dependabot/go_modules/src/github.com/go-git/go-git/v5-5.19.2 на TC/arozos-mirror из зеркала

2 недель назад

TC синхронизированные коммиты с master на TC/arozos-mirror из зеркала

  • 5e4dbab17d Bump github.com/pion/stun/v3 from 3.0.1 to 3.1.5 in /src (#295) Bumps [github.com/pion/stun/v3](https://github.com/pion/stun) from 3.0.1 to 3.1.5. - [Release notes](https://github.com/pion/stun/releases) - [Commits](https://github.com/pion/stun/compare/v3.0.1...v3.1.5) --- updated-dependencies: - dependency-name: github.com/pion/stun/v3 dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • 4dd1ae4ff1 Bump github.com/pion/dtls/v3 from 3.0.7 to 3.1.4 in /src (#296) Bumps [github.com/pion/dtls/v3](https://github.com/pion/dtls) from 3.0.7 to 3.1.4. - [Release notes](https://github.com/pion/dtls/releases) - [Commits](https://github.com/pion/dtls/compare/v3.0.7...v3.1.4) --- updated-dependencies: - dependency-name: github.com/pion/dtls/v3 dependency-version: 3.1.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • Просмотр сравнение для этих 2 коммитов »

2 недель назад

TC синхронизированные коммиты с dependabot/go_modules/src/github.com/go-git/go-git/v5-5.19.2 на TC/arozos-mirror из зеркала

  • 843f90a741 Bump github.com/go-git/go-git/v5 from 5.19.1 to 5.19.2 in /src Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.19.1 to 5.19.2. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
  • 5e4dbab17d Bump github.com/pion/stun/v3 from 3.0.1 to 3.1.5 in /src (#295) Bumps [github.com/pion/stun/v3](https://github.com/pion/stun) from 3.0.1 to 3.1.5. - [Release notes](https://github.com/pion/stun/releases) - [Commits](https://github.com/pion/stun/compare/v3.0.1...v3.1.5) --- updated-dependencies: - dependency-name: github.com/pion/stun/v3 dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • 4dd1ae4ff1 Bump github.com/pion/dtls/v3 from 3.0.7 to 3.1.4 in /src (#296) Bumps [github.com/pion/dtls/v3](https://github.com/pion/dtls) from 3.0.7 to 3.1.4. - [Release notes](https://github.com/pion/dtls/releases) - [Commits](https://github.com/pion/dtls/compare/v3.0.7...v3.1.4) --- updated-dependencies: - dependency-name: github.com/pion/dtls/v3 dependency-version: 3.1.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
  • ea0da40e51 docs: fix a typo RSICV64 => RISC-V 64-bit (#291)
  • 7a41a535fa Fix Windows hardware info when wmic.exe is missing (#289) Prefer Get-CimInstance for Win32_* queries and keep classic wmic as fallback so System Info and SMART still work on Windows 11 hosts that no longer ship wmic. Co-authored-by: Cursor <cursoragent@cursor.com>
  • Просмотр сравнение для этих 10 коммитов »

2 недель назад