- Fix panel layout not filling height — UXP multi-panel
create(rootNode)provides a container withoutheight: 100%. Set height and overflow on rootNode so panels fill the available space with StatusBar pinned to bottom. - Fix "Replace Content" button not responding — In Replace Existing mode,
handlePublishhad an early return if title was empty, but title is optional for replacements. Guard now only applies to New Entry mode.
- Full i18n support — 246 translation keys across 20 languages (English + cs, da, de, es, fi, fr, it, ja, ko, nb, nl, pl, pt-BR, ru, sv, tr, uk, zh-Hans, zh-Hant).
- Lightweight i18n system — No external dependencies. React context +
useTranslation()hook for components;translate()for vanilla JS commands. - All UI localized — Panels, components, commands, settings dialog, error messages, filter labels, quality picker, and metadata editor.
- Locale detection — Automatically detects Adobe host app UI locale via
require("uxp").host.uiLocale.
- Photoshop support — Added
PhotoshopHostServicewithexecuteAsModal()document open. Unique plugin ID (163a7b84.ps) so both .ccx files install side by side. - Removed After Effects and Audition — No third-party UXP plugin support exists for these apps. Deleted host services, updated all configs and docs.
- Fixed .ccx install conflict — Each host app now gets a unique manifest
idso installing one no longer overwrites the other. - Fixed manifest labels — Premiere Pro v26 rejects
LocalizedStringobjects on entrypoint labels; reverted to plain strings. - Marketplace icons — Added 48×48, 96×96, 192×192 px PNG icons for Adobe Marketplace submission.
- 488 tests across 40 suites — all passing
- Multi-panel + command architecture — Refactored from single tabbed panel to UXP best practices: two independent panels (Media Browser, Publish) and two commands (Settings, Sign Out). Each panel has its own React tree wrapped in
AuthGatefor inline login. - Shared singleton services — Services moved from
App.tsxuseMemoto module-level singletons insrc/services/singleton.ts. All panels and commands share the sameKalturaClient,AuthService, and derived services. - Cross-panel auth sync — Login/logout in one panel automatically syncs to all other panels via DOM events (
kaltura:signin,kaltura:signout). - Settings as command — Settings is now a command that opens a modal dialog via
uxpShowModal()instead of a panel tab. No authentication required. - Sign Out as command — Dedicated command in the Plugins menu. Clears session and dispatches signout event to reset all panel UIs.
- Deleted
App.tsx— No longer the entry point.src/index.tsxregisters entrypoints directly.
- Quality picker overlay — Renders as a proper absolute-positioned overlay with backdrop instead of inline (which caused layout overlap).
- Removed
isImportedmechanism — "Import to Project" always shown (no "Re-import" variant). "Attach to Clip" always available for entries with captions (not gated by import status). - Removed "Back to Browse" button — No longer relevant since Publish is an independent panel.
- In-panel headers — Each panel shows a subtle header ("MEDIA BROWSER" / "PUBLISH") to distinguish docked panels since Premiere Pro uses the plugin name for all tab titles.
- XSS prevention —
escapeHtml()applied to audit trail data rendered via innerHTML in SettingsCommand.
- 493 tests across 40 suites
- New tests: SignOutCommand (event dispatch), singleton services, cross-panel auth sync
- Single unified
.ccx— One.ccxfile now works across Premiere Pro, After Effects, and Audition using a multi-host manifest. No more per-app downloads. - Simplified installation — Download one
.ccx, double-click to install, done. Removed all installer scripts (install-mac.sh,install-win.bat,quick-install.sh,quick-install.ps1). - Simplified release workflow — GitHub Releases now publish a single
.ccxasset.
- eSearch for all browsing — Replaced
media/listentirely with eSearch (elasticsearch_esearch/searchEntry) for both initial browse and search queries. Usesdisplay_in_search=1as default filter withupdated_at descsort for initial load. - Sort By dropdown — Added sort options (Relevance, Recently updated, Recently created, Name A-Z, Most played, Last played) inside the "Filters and sort" panel. Auto-switches to Relevance when searching, back to Recently updated when cleared.
- Visual search highlighting — Search terms are highlighted in orange bold within entry titles in both grid and list views via
HighlightTextcomponent. - Highlight snippets — Search result hints now show the matched text (e.g.,
title/tags: "PathFactory"ortranscript at 1:23: "PathFactory integration...") instead of just "Found in title/tags". - My Content filter — "My content" ownership filter uses structured eSearch OR across
kuser_id,creator_kuser_id,entitled_kusers_edit, andentitled_kusers_publishfields, showing entries the user owns, created, or can edit/publish.
- Fix responsive UI overlap — Login, Settings, and Publish panels now scroll properly when the plugin window is resized small. Uses
panel-scrolllayout pattern consistently. - Fix search box not rendering — Replaced
<sp-search>(unsupported in UXP) with<sp-textfield>for the search input. - Fix eSearch service name — Corrected API service from
"eSearch"to"elasticsearch_esearch"across MediaService and SearchService. - Fix highlight parsing — Reads both top-level
highlight[]anditemsData[]from eSearch response for complete highlight coverage. FixedstripHighlightTagsto handle non-string inputs. - Fix My Content highlight pollution — Ownership filter items use
addHighlight: falseand proper AND/OR query hierarchy so highlights only come from the search term, not user field matches. - Fix eSearch field names — Use valid
KalturaESearchEntryFieldNameenum values (kuser_id,creator_kuser_id,entitled_kusers_edit,entitled_kusers_publish). - Fix search precision — Changed unified search from
PARTIAL(itemType 2) toSTARTS_WITH(itemType 3) for more precise matching.
- Compact toolbar — Sort dropdown moved inside the "Filters and sort" collapsible panel. Result count shown as a compact single line that's always visible.
- eSearch query structure — Properly structured as
AND[ OR[user fields], AND[search/filter fields] ]per Kaltura best practices. - eSearch types — Added nested operator support (
operator,searchItemsfields) toKalturaESearchItemtype for sub-group queries.
- Updated all BrowsePanel tests for eSearch-only browse (removed media.list mocks)
- Updated FilterBar tests for "Filters and sort" rename and sort dropdown
- Updated MediaService tests for query structure, ownership OR operator,
STARTS_WITHitem type, and highlight extraction
- README audit against actual implementation — removed REACH/AI captioning ordering claim (not implemented), fixed service counts (12 instantiated, not 13), removed unused NotificationService/ProxyService from project tree and service tables, removed WebSocket network requirement and UXP constraint (not wired up), clarified governance and offline cache descriptions
- Removed internal strategy/research document (
Kaltura_Adobe_Premiere_Integration_Research.md) from public repository
- README rewritten for public release — added "What is this?" intro for newcomers, prominent download link at top, reordered install instructions (manual download first,
ghCLI second), added download table to release notes - Release notes install section updated — matches new README ordering with clearer steps
- Removed hardcoded test counts from CONTRIBUTING.md (won't go stale)
- Fixed coverage threshold mismatch in README (branches 50%, not 52%)
- Fix SWC assertion crash on tab switch — Switching from the Publish success screen back to Browse caused a UXP Spectrum Web Components
preCreateCallbackassertion (false == true) crash. Root cause: simultaneous SWC element unmount/mount during view transitions. Fixed with a two-phase tab switch that unmounts the current panel first, waits 50ms for SWC teardown, then mounts the new panel.
- Image entry import — Image entries (photos, graphics) can now be downloaded and imported directly into Premiere Pro. Previously showed "No ready renditions available" because images have no flavor assets. Uses
baseEntry/getDownloadUrlAPI for direct source file download. (#82 related) - Transcript attachment to clips — "Attach to Clip" button in the Captions tab connects Kaltura caption/transcript data directly to a video clip's project item using Premiere's native Transcript API. Captions appear in Premiere's Transcript panel for native caption workflow. (Closes #82)
- Jest 29.7 → 30.3 — eliminates deprecated
abab,domexception,rimraf@3 - ESLint 8.57 → 9.39 — migrated from
.eslintrc.jsonto flat config (eslint.config.mjs); eliminates deprecated@humanwhocodes/*packages - copy-webpack-plugin 12 → 14 — fixes high-severity
serialize-javascriptRCE vulnerability (CVE) - GitHub Actions —
checkoutv4→v6,setup-nodev4→v6,upload-artifactv4→v7,download-artifactv4→v8; eliminates Node.js 20 deprecation warnings
- Codebase review: replaced magic numbers with
ProjectItemTypeenum, addedlockedAccess()result checking - Removed 23 unnecessary
eslint-disable-next-linedirectives - 8 new lessons documented in
docs/UXP_LESSONS_LEARNED.mdcovering transcript API patterns - Updated all documentation (README, CONTRIBUTING, CLAUDE.md) with current test counts and coverage thresholds
- Resolved 2 high-severity npm audit vulnerabilities (serialize-javascript RCE)
- npm deprecation warnings reduced from 10 to 4 (remaining are deep Jest/jsdom internals)
- 452 tests across 37 suites (up from 442)
- New tests:
importTranscriptToClip(7),downloadAndImportEntry(4),downloadCaptionAsJson(3),parseKalturaJson(3),getEntryDownloadUrl(1)
- Fix download 404 on entries with
enforce_delivery:static_content— useflavorAsset/getDownloadUrlinstead ofplayManifest - Fix caption format parsing for SRT/VTT/DFXP
- Fix
serveAsJsonAPI parameter name (captionAssetIdnotid)
- Fix download 404 errors on enforce_delivery entries
- Fix caption import parsing errors for various formats
- Documentation overhaul
- Dead code removal and code quality improvements