v5.44.0
13 days ago by Pranav Rao
AI Skills, Plan Mode, Media Recording, and Predictive Studio UX
New Features
- Agent Skills — portable, permission-gated capability bundles (
SKILL.mdimport/export) that agents activate mid-run via/skill-namecomposer 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: CollectionsofMJ: Artifacts) bound viaAIAgent.DefaultMediaCollectionID; resolved at session start and surfaced to the model viaMedia_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 aFileIDto 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: Fileslinked to the Meeting-RoomConversation(RecordingFileID/EgressID), with point-at-sink or copy-to-canonical storage and playback in the Meet UI - WorkOS (AuthKit) authentication provider —
type: '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 toAIPrompt, 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-comparisonengine, per-entity gating, per-candidate verdict/audit columns, and an in-place reasoning UI in the duplicates dashboard - Batch embeddings architecture —
BaseEmbeddings.EmbedTextsis now a concrete dispatcher on a newSupportsBatchEmbeddingsgetter; 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), andCrushCode(AST-aware SQL/TypeScript reduction); wired into action-result summaries and memory pruning in the agent runtime - Permission-constrained engine loading —
BaseEngine.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 useGetConfigData()which throws a typedPermissionConstrainedError - 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-utilsgainscreateFakeProvider,useFakeGlobalProvider, dom-helpers, and new scaffold/report scripts; DOM specs added across ~49 Generic packages andng-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;
pruneAndCompactExpiredMessagesconfines pruning to the volatile tail to preserve provider KV-cache prefix;MemoryManagerAgentmines failed runs for correctiveIssue/Contextnotes - MJStorage streaming —
FileStorageBase.GetObjectStream+SupportsStreamingimplemented for all seven storage drivers (Box, AWS S3, Azure, GCS, Google Drive, SharePoint, Dropbox) - Authenticated media delivery —
CreateMediaAccessTokenmutation andGET /media/:fileId?token=HTTP-Range streaming route; any stored asset is served to the browser byFileIDwith 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 controller —
LiveKitRoomComponentnow resolves aLIVEKIT_ROOM_CONTROLLER_FACTORYinjection token (additive; runtime unchanged) making it testable and overridable - Predictive Studio train/serve skew fix —
FeatureAssemblyExecutor.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 clearFailedrun - Predictive Studio trust translator —
deriveTrustVerdictturns raw metrics into a plain-language Poor/Fair/Good/Excellent verdict +canActaction 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
postrunhook 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 key —
BaseEntity.NewRecordnow 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 embeddings —
GeminiEmbedding2.EmbedTextswas 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 toGeminiEmbedding - Saved views disappearing —
MJUserViewEntityExtended.CalculateUserCanView()resolved byResourceType.Name === 'MJ: User Views'but the seeded name is'User Views'; fixed to resolve viaViewResourceTypeID; also honorsContextCurrentUserserver-side - View selector stale cache — the view selector now reacts to
UserViewEnginecache changes viaObserveProperty, 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
OnQueryParamsChangedcontract - 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
conversationIdappearing on reused tabs mj app installcorruptingmj.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 teardown —
RemoteBrowserSnapshotreturns an empty snapshot instead of throwing when the browser adapter has been torn down, eliminating recurring GraphQL errors from the periodic live-view poll ExpressionChangedAfterItHasBeenCheckedErrorin realtime Details panel —ResizeObserverseed deferred to a microtask- E-signature field placement — fixed field placement across contract, 3 providers, and drag-drop UI
AIAgentRunStepFK race — resolvedFK_AIAgentRunStep_ParentIDrace 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