v5.44.0

AI Skills, Plan Mode, Media Recording, and Predictive Studio UX

New Features

  • Agent Skills — portable, permission-gated capability bundles (SKILL.md import/export) that agents activate mid-run via /skill-name composer invocation; skills carry bundled Actions, sub-agents, and Instructions with a three-layer permission gate (agent-accepted × user-permitted × status); ships with the first 3 core skills (Web Research, Data Analysis & Queries, Data Visualization)
  • Agent Plan Mode — a human-in-the-loop plan-approval gate for the Loop agent; a run pauses and presents a plan step before executing any Actions or sub-agents, with rejection forcing a re-plan; threaded through the agent client, GraphQL mutations, and the conversations composer UI
  • Agent Media Library — realtime agents can now draw on a curated, governed media kit (MJ: Collections of MJ: Artifacts) bound via AIAgent.DefaultMediaCollectionID; resolved at session start and surfaced to the model via Media_ShowMedia
  • Generic Media Player (@memberjunction/ng-media-player, new package) — a framework-agnostic <mj-media-player> with transport, click/drag scrubber, playback speed, decoded audio waveform, time-synced clickable transcript, and an MJStorage-bound <mj-storage-media-player> that resolves a FileID to an authenticated, range-streamed source
  • Realtime co-agent recording — client-direct sessions record a seekable 16-bit WAV with capture-time waveform peaks; remote agent audio mixed in via WebRTC; transcript cue timing anchors to real audio onset; recorded sessions stream back through the media player
  • LiveKit meeting recording — egress output registered as MJ: Files linked to the Meeting-Room Conversation (RecordingFileID/EgressID), with point-at-sink or copy-to-canonical storage and playback in the Meet UI
  • WorkOS (AuthKit) authentication providertype: 'workos' (server) / AUTH_TYPE: 'workos' (browser) adds WorkOS as a first-class auth provider alongside Auth0, Okta, MSAL, Cognito, and Google; includes server-side JWT validation, browser-side SDK wrapper, and a full integration guide
  • Scoped Prompt Parts — scope-aware, pluggable prompt-construction primitive (ScopedPromptPart) attached to AIPrompt, narrowed by the same polymorphic scope the agent runtime uses for memory; any MJ app can control LLM behavior per scope by editing rows, not code; roles preserved (System/User/Assistant)
  • Predictive Studio — Business UX — a new "Predictions" surface reframing published models as plain-language predictions with trust badges (Poor/unmeasured blocked as "Needs an analyst"); a trust-gated workspace with a ranked at-risk list, plain-language drivers, and four actions; nav consolidated from 8 flat items into 3 doors (Predictions, Studio, Models)
  • Inline alert component (<mj-alert>) — the canonical persistent in-flow message box (info/success/warning/error) as a standalone, design-token-driven component with [actions] slot, ARIA roles, and a CI adoption gate; replaces hand-rolled alert divs across Explorer
  • LLM reasoning pass on duplicate detection — an LLM judges high-probability vector candidates (Merge/NotDuplicate/Uncertain) to shrink the human-review set; adds @memberjunction/record-comparison engine, per-entity gating, per-candidate verdict/audit columns, and an in-place reasoning UI in the duplicates dashboard
  • Batch embeddings architectureBaseEmbeddings.EmbedTexts is now a concrete dispatcher on a new SupportsBatchEmbeddings getter; providers with native batch endpoints declare it; everyone else inherits a safe per-text fallback with bounded concurrency, retry-with-backoff, and a hard count guard
  • Context Crush package (@memberjunction/context-crush) — dependency-light token-optimization primitives: CrushJSON/DescribeCrush (structural JSON compression), PartitionStablePrefix (cache-stable prefix split), and CrushCode (AST-aware SQL/TypeScript reduction); wired into action-result summaries and memory pruning in the agent runtime
  • Permission-constrained engine loadingBaseEngine.Config() pre-checks entity read permissions and skips all entity configs when the user lacks access, preventing endless retry loops and console error flooding for org-scoped SaaS users; engine getters use GetConfigData() which throws a typed PermissionConstrainedError
  • Accordion component upgrade — new MJAccordionModule, lazy [mjAccordionBody] slot, and ~50 disclosure surfaces migrated from bespoke click-headers to <mj-accordion-panel> across 20 Angular packages; genuine accessibility improvement (real <button [attr.aria-expanded]>)
  • Angular DOM unit-testing Phase 2@memberjunction/ng-test-utils gains createFakeProvider, useFakeGlobalProvider, dom-helpers, and new scaffold/report scripts; DOM specs added across ~49 Generic packages and ng-conversations

Improvements

  • Realtime voice widget UX consolidation — surface/Details panel is now an independent right-hand peek gated on available width; any printable keystroke opens and seeds the composer; banner scoped to state + window-chrome only; Captions promoted to first-class control in the compact dock
  • Agent token optimization — action-result summaries structurally compress large inline JSON values; pruneAndCompactExpiredMessages confines pruning to the volatile tail to preserve provider KV-cache prefix; MemoryManagerAgent mines failed runs for corrective Issue/Context notes
  • MJStorage streamingFileStorageBase.GetObjectStream + SupportsStreaming implemented for all seven storage drivers (Box, AWS S3, Azure, GCS, Google Drive, SharePoint, Dropbox)
  • Authenticated media deliveryCreateMediaAccessToken mutation and GET /media/:fileId?token= HTTP-Range streaming route; any stored asset is served to the browser by FileID with real streaming + permissions, no public links
  • Realtime surface-tab overhaul — channel tabs appear only once used; Activity tab gated, restyled, and right-aligned; agent-run artifacts moved out of per-artifact tabs into the Activity tab with a resizable, UserInfoEngine-persisted split viewer
  • LiveKit injectable controllerLiveKitRoomComponent now resolves a LIVEKIT_ROOM_CONTROLLER_FACTORY injection token (additive; runtime unchanged) making it testable and overridable
  • Predictive Studio train/serve skew fixFeatureAssemblyExecutor.assemble() re-reads absent required feature columns from the same entity view used at training time, and hard-fails if still absent; converts silent degenerate output into a clear Failed run
  • Predictive Studio trust translatorderiveTrustVerdict turns raw metrics into a plain-language Poor/Fair/Good/Excellent verdict + canAct action gate shared by the UI and the agent's publish gate; coin-flip / unmeasured models are fail-safe blocked
  • Empty-state standardization — inline empty-state placeholders migrated to <mj-empty-state> across Explorer and Generic Angular packages; reset-filter CTA correctness fixed in three picker dialogs
  • MJCLI startup time — deferred DB-provider import in the postrun hook so light commands no longer eagerly load the sqlserver-dataprovider/metadata-sync/core stack (~2.7 s warm)
  • PostgreSQL schema casing — fixes lowercase-schema entity class names breaking mixed-case OpenApp builds
  • Codegen IS-A relationship — IS-A relationship codegen correctness fix

Bug Fixes

  • IS-A (Table-Per-Type) primary keyBaseEntity.NewRecord now creates the parent chain first (root mints the shared key), then adopts it onto each level; fixes FK violations (e.g. FK_ACP_Company) in IS-A child saves
  • Gemini batch embeddingsGeminiEmbedding2.EmbedTexts was collapsing the whole batch into one blended vector; now issues one call per text with bounded concurrency and a hard count guard; also renamed class to GeminiEmbedding
  • Saved views disappearingMJUserViewEntityExtended.CalculateUserCanView() resolved by ResourceType.Name === 'MJ: User Views' but the seeded name is 'User Views'; fixed to resolve via ViewResourceTypeID; also honors ContextCurrentUser server-side
  • View selector stale cache — the view selector now reacts to UserViewEngine cache changes via ObserveProperty, so created/updated/duplicated/deleted views refresh immediately
  • View configuration not applying — "Visible Columns" edits now reflect in the grid (backed by canonical UserView.GridState); "Manage Columns" toolbar item now opens the config panel
  • Dashboard panels stuck on "Loading…" — dashboard viewer defers Golden Layout initialization until the container has a non-zero size; dashboard browser query-param round-trip moved onto OnQueryParamsChanged contract
  • Conversation swap bleeding — agent-lifecycle events now carry the captured ConversationID; chat-area drops events from backgrounded conversations; pending-message auto-send pinned to target conversation
  • Stale resource query params on tab reuse — resource-owned URL state writes through a tab-scoped, resource-identity-guarded query-param path; prevents stale params like conversationId appearing on reused tabs
  • mj app install corrupting mj.config.cjs — comma now inserted before closing brace when adding new top-level sections; post-write parse guard prevents shipping a broken config (#2975)
  • Remote Browser snapshot after teardownRemoteBrowserSnapshot returns an empty snapshot instead of throwing when the browser adapter has been torn down, eliminating recurring GraphQL errors from the periodic live-view poll
  • ExpressionChangedAfterItHasBeenCheckedError in realtime Details panelResizeObserver seed deferred to a microtask
  • E-signature field placement — fixed field placement across contract, 3 providers, and drag-drop UI
  • AIAgentRunStep FK race — resolved FK_AIAgentRunStep_ParentID race in fire-and-forget step saves
  • Predictive Studio "Models in Production" run history — tab now reloads run history + scoring bindings after Operate dialog runs/schedules/binds a model
  • Model Development Agent first message — fixed chat-area missing conversation lifecycle wiring (isNewConversation + conversationCreated) causing silent no-op on first send
  • Realtime Details panel not opening for new users — on-demand "Details peek" no longer requires the cross-session disclosure ratchet