v6.2.0-edge.5: Login Studio, Chief of Staff agent, and shared-room agent runs
Login Studio, the Chief of Staff agent with per-user agent policies, agent runs bounded by everyone in a shared conversation, server-assembled realtime recordings, keyed and versioned Feature Pipelines, JSON Schema for action parameters, archive Purge mode, MJAPI under a path prefix, and two new decision models. Plus search, storage and SQL-screen security hardening, and fixes to agent cancellation and record deletes.
Upgrade Notes apply: ten migrations, tighter search, SQL, storage and agent-run checks, Gemini effort levels taking effect, Entity.Configuration replaced on 25 entities, and a changed realtime recorder interface.
Edge builds are prereleases.
MemberJunction 6.x is released under the Business Source License 1.1; 5.x and earlier stay ISC. What the licence grants, and what needs certification, is in the licence section of the v6 upgrade guide.
New Features
Section titled “New Features”- Login Studio (
@memberjunction/theme-engine,@memberjunction/ng-explorer-app,@memberjunction/server,@memberjunction/core-entities): Design Explorer’s sign-in page on the default theme: blocks, layout, background and colors, saved as a draft and published.GET /auth/login-screenserves the published design to anonymous visitors, sanitized on the server and again in the browser; drafts are never served to them. A host’s ownmjLoginSlottemplates still take precedence, andUsePublishedLoginScreen = falsekeeps a host’s own screen. - Chief of Staff agent and per-user agent policies (
@memberjunction/ai-agents,@memberjunction/core-entities,@memberjunction/scheduling-engine,@memberjunction/communication-ms-graph,@memberjunction/communication-gmail): A personal Chief of Staff agent.MJ: AI Agent User Policiesnarrows what an agent may do for one user (CRUD, row and field access, time windows, email/phone/messaging/calendar modes, approval gates) below that user’s own permissions.MJ: User Routinesgains anAgentWakeroutine type withOneShotandAdaptiveschedules, so an agent can schedule its own next wake. User-scoped calendar, email and availability actions run behind an enterprise mailbox gate, and Communication Providers gain enterprise scope settings. - Agent runs bounded by their audience (
@memberjunction/ai-agents,@memberjunction/ai-core-plus,@memberjunction/actions-base,@memberjunction/search-engine): Server code can name everyone besides the caller who will see a run’s output (ExecuteAgentParams.Audience), such as a shared conversation’s other participants. The run then shows only what the caller and every reader may see: search results are intersected across readers, only shared notes and examples are injected, and actions that do not declareSupportsAudienceare refused. Clients cannot set it. - Realtime recordings assembled on the server (
@memberjunction/realtime-runtime,@memberjunction/server,@memberjunction/ai-agents,@memberjunction/ng-conversations): Browser-side call recordings upload a 5-second Opus shard every 5 seconds and a small keepalive signal at the end, instead of one large upload as the tab closes. Unacknowledged shards survive reloads in IndexedDB. MJAPI assemblesrecording.wavwithin seconds of the end; a recording missing shards is assembled asPartialafter a grace period, with the gaps recorded as silence. - Keyed, versioned Feature Pipelines (
@memberjunction/feature-pipelines,@memberjunction/feature-pipelines-engine,@memberjunction/record-set-processor,@memberjunction/ng-core-entity-forms): Feature Values upsert on a key (record, feature, pipeline and prompt version, model, parameters, input), and a value a person entered is not overwritten unless a run asks for it.MJ: Feature Pipeline Versionsregisters each pipeline pin, and a gated pipeline runs only under a version whose golden-set result meets its threshold; a Version Steward evaluates and backfills changed versions. Outputs can be stored as feature values only, and every record form gains a Feature Values panel with history. - JSON Schema for action parameters (
@memberjunction/ai-agents,@memberjunction/ai-prompts,@memberjunction/core-entities):ActionParam.ValueSchemadeclares a parameter’s value shape (type,enum,items,properties,required), used for the native tool declaration and to coerce arguments on every dispatch path. 33 parameters of actions stock agents use are filled in. Native tool calling now honours the setting on an agent’s own prompt, and every LLM in the catalog states whether it supports native tool calls. - Archive Purge mode (
@memberjunction/archiving-engine,@memberjunction/archiving-action,@memberjunction/ng-archive-manager): An archive configuration’sStorageModecan bePurge, which strips fields or hard-deletes without writing a copy, so no storage account is needed. A Purge run refuses to start for any entity that cannot be purged safely (one that tracks record changes, or, for hard deletes, one that uses soft delete or cascades into one that does). - MJAPI under a path prefix (
@memberjunction/server,@memberjunction/core,@memberjunction/ng-explorer-app):MJAPI_BASE_PATHmounts every MJAPI route under a prefix (for example/apibehind a CDN), and Explorer’s newMJAPI_URItells it where MJAPI lives. With both unset nothing changes.ApiRoute()builds mount paths and public URLs for server extensions. - New decision models (
@memberjunction/ai-systemone,@memberjunction/ai-inception,@memberjunction/ai): SubQ Snap (Subquadratic,SubQDecision) and Mercury Decide (Inception Labs,InceptionDecision, also through OpenRouter). Every active decision model now joins the Default Decision’s fallbacks, tried only when a credential is present. - Other new models (
@memberjunction/ai-gemini,@memberjunction/aiengine): Nano Banana 2 and Nano Banana 2 Lite image models, Grok Voice 3.0, Muse Spark Open, and Claude Haiku 5.5 on OpenRouter. OpenAI’s 2026-10-23 retirements (o1,o1-pro,o3-mini,o4-mini,gpt-image-1) are applied to their OpenAI routes. - Task graphs in chat (
@memberjunction/ai-agents,@memberjunction/task-graph,@memberjunction/ng-conversations,@memberjunction/ng-tasks): A single-step delegation completes in the same conversation turn instead of starting a background graph. Workflows show live progress inline, continuation replies link back to the turn that started them, and the Tasks Command Center is redesigned with KPIs, workflow cards, a timeline view and a step inspector. - Google Drive with a service account (
@memberjunction/storage): Drive storage accepts service-account credentials, streams uploads, and supports Shared Drives through adriveIDsetting. - DBAutoDoc for large databases (
@memberjunction/db-auto-doc,@memberjunction/cli):export --erd-mode clustersdraws the schema as subject areas, one diagram per area; sampling can be skipped or resumed; existing indexes are read and shown to the model as evidence for keys.
Improvements
Section titled “Improvements”- Faster SQL Server saves (
@memberjunction/sqlserver-dataprovider,@memberjunction/generic-database-provider): Saves and deletes send values as typed parameters instead of literals, so SQL Server reuses one cached plan per entity and field set. - Agent and prompt runs store less (
@memberjunction/ai-agents,@memberjunction/ai-prompts,@memberjunction/ai-core-plus): Run steps point at an earlier step’s identical payload instead of storing a second copy, prompt runs keep only template data the capture mode asks for (AIPrompt.TemplateDataCapture, defaultNone), and high-volume run telemetry saves return only the ID and timestamps. - Caches that hold large datasets and stay consistent (
@memberjunction/core,@memberjunction/server): The per-entry cache ceiling is derived from the budget (75% by default, was a fixed 25%), so a tenant’s largest metadata dataset is cached instead of declined on every boot. Servers sharing Redis no longer evict each other’s entries in a loop during a rolling deploy, and cached RunQuery results are tied to the query definition that produced them, so an edited query’s old results are not served. - Faster client startup (
@memberjunction/core,@memberjunction/ai-engine-base,@memberjunction/graphql-dataprovider): More engines load in the first startup batch, warm loads skip a redundant metadata re-save and a duplicate IndexedDB read, and a change to saved queries reloads only the query metadata. - Gemini effort levels and sampling (
@memberjunction/ai-gemini,@memberjunction/ai-vertex):effortLevelnow reaches Gemini and Vertex asthinkingLevelorthinkingBudget, thinking tokens are counted as completion tokens, and Gemini 3.6 and later no longer receive thetemperature,topPandtopKfields Google is retiring. - Realtime captions in the expected language (
@memberjunction/ai-gemini,@memberjunction/ai-agents):realtime.session.transcriptionLanguagesgives Gemini Live a caption-language hint, so an English call is no longer captioned in another script. A rejected Gemini Live connection now fails instead of hanging. mj synckeeps@env:references (@memberjunction/metadata-sync): Pull no longer writes resolved secrets into files. NewpushWhenfolder conditions and@env:VAR?optionalvalues, and push no longer prints env-sourced values.- CodeGen on schemas it did not author (
@memberjunction/codegen-lib,@memberjunction/db-auto-doc): Relationships over a non-primary-key join column are recorded and queried correctly, join columns get indexes, organic-key detection stays bounded on large schemas, and conflicting soft foreign keys are reported instead of resolved by file order. - Explorer after a delete (
@memberjunction/ng-explorer-core,@memberjunction/ng-shared): Deleting a record closes its tab and returns to where it was opened from (the view, the parent record or Home), and every other tab showing it closes too. - Dark-theme status colors and dialog stacking (
@memberjunction/ng-shared-generic,@memberjunction/ng-ui-components): Status text in dark theme is visibly its status color, and a dialog opened from a slide panel now opens above it.
Bug Fixes
Section titled “Bug Fixes”- Template parameter descriptions are AI-written again (
@memberjunction/core-entities-server): Since 6.2.0-edge.1, saving a template dropped the AI-written parameter descriptions and replaced existing ones with generic text such as “Template scalar parameter ‘x’”. - Cancelling a model call stops it (
@memberjunction/ai,@memberjunction/ai-prompts,@memberjunction/ai-agents, and every model driver): A cancelled call is no longer failed over to every other model (one live test made 113 driver calls), is recordedCancelledrather thanFailed, and reaches the vendor SDK so the request is torn down. A prompt run that failed over now keeps its failover fields. Bedrock streaming works again. - Agent replies left “In-Progress” (
@memberjunction/ai-agents): A reply could keep its in-progress status and last progress message after the run finished, when a progress save was still committing. complete_taskwith escaped newlines (@memberjunction/ai-agents): A finished answer is no longer discarded because the model wrote part of its payload layout as\nescapes.- Deleting a record that tracks changes and cascades (
@memberjunction/sqlserver-dataprovider): No longer fails with SQL error 213 when another record references it. - Row-level security checks on save (
@memberjunction/generic-database-provider,@memberjunction/core-entities-server): A create filter that references a nullable column no longer fails withInvalid column name, a NULLvarbinary(n)field no longer breaks the check, and role filters that use subqueries can be edited again. - Record Change text outside the code page (
@memberjunction/sqlserver-dataprovider): Emoji, CJK and other non-Latin text in audit rows is no longer stored as?. - Large integration record maps (
@memberjunction/integration-engine): The full-sync orphan sweep no longer fails with “Maximum call stack size exceeded” on maps of 100k+ rows. - Grok Build with an effort level (
@memberjunction/ai-xai): No longer fails.
Upgrade Notes
Section titled “Upgrade Notes”- Ten migrations apply on
mj migrate:AgentRun_PayloadDedupe_PromptRun_TemplateDataCapture,Theme_Login_Screen,AIAgentRunStep_PayloadAtEndSourceStepID,Realtime_Recording_Shard_Ledger,SaveReturnMode_DatestampsOnly_StoredProcedures,AIAgentUserPolicy_And_UserRoutine_Wake,Archive_StorageMode,ActionParam_ValueSchema,Feature_Value_Key_And_VersionsandMetadata_Sync. A development database migrated fromnextbetween two of them may needoutOfOrder: truefor onemj migraterun. - Scoped searches are bounded by their configuration (
@memberjunction/search-engine): A scope with no enabled provider rows, or no lanes of a kind, now returns nothing instead of searching everything. Naming an inactive, expired or missing scope refuses the search. Custom search providers that read entity or storage lanes must overrideConsumesLaneKinds. External-index hits are always verified against the entity they name, and content hits require read onMJ: Content Items(and onMJ: Entity Record Documentsfor hits derived from a record). Arequiredscope dimension that resolves to nothing refuses withScopeDimensionError; a storage laneFolderPaththat renders empty, contains a..segment (path traversal), or, when templated, renders an empty segment refuses the search; and a laneExtraFilternow applies to every provider’s hits, so a scope that configured only an entity lane returns less from the others. To keep a scope’s old reach, add one enabledMJ: Search Scope Providersrow per provider it should run, plus the external-index and storage lanes they read; no migration is needed. Streamed per-provider events carry a count only, through a newResultCountfield, so upgrade MJAPI before clients: an edge.5 client’s search stream fails against an older MJAPI. - Pre-execution RAG checks scope permissions (
@memberjunction/ai-agents): An agent’s assigned scopes are searched only for users with aSearchorManagegrant on the scope (or an agent set toAll); agents withSearchScopeAccess = Noneget no pre-execution retrieval. - Run scope set through
dataneeds a trusted caller (@memberjunction/server,@memberjunction/ai-agents):PrimaryScope*,SecondaryScopesand__agentTypePromptParamsin an agent run’sdataare now dropped unless the caller is the system user or an API key holding the newagent:trustedscope. Inside a run, Scoped Search takes its tenant from the run, not the model. - Gemini prompts with an effort level (
@memberjunction/ai-gemini): Effort settings now reach Google, so such prompts think at that level and may get faster, cheaper or worse; re-evaluate them. - Prompt runs store less (
@memberjunction/ai-prompts):AIPromptRun.Messagesholds nodataortemplateDataby default; setTemplateDataCapturetoReferencedorFullwhere you need them. Agent runs no longer writeAIAgentRun.Result(useFinalPayload), and readers ofAIAgentRunStep.PayloadAtStartandPayloadAtEndmust followPayloadAtStartSourceStepIDandPayloadAtEndSourceStepIDwhen they are set. - GraphQL saves return only what changed (
@memberjunction/graphql-dataprovider,@memberjunction/server): An Update sends and receives the fields it changed plus computed and virtual ones, so a client’s copy no longer picks up another user’s concurrent edits to fields it did not change. Stored values for fields the client did not change are left alone. - Custom realtime recorder hosts (
@memberjunction/realtime-runtime,@memberjunction/ng-conversations):IRealtimeSessionRecorderreturns Opus packets (TakeEncodedPackets(),Stop(): Promise<number>), andBrowserRecordingUnloadGuardis removed from@memberjunction/ng-conversations; hosts that wire their own page-lifecycle events callSendRecordingTerminal. - Legacy
mj-btn-*classes removed (@memberjunction/ng-explorer-app):.mj-btn-primary,-secondary,-ghost,-icon-only,-smand-lgare gone from the Explorer stylesheet, along with the unused.mj-modal-*,.mj-icon-card*,.skip-icon*and.k-*rules and_md3-shared.css; usemjButtonor themj-btn--<variant>classes. - SQL data context items (
@memberjunction/server,@memberjunction/data-context-server,@memberjunction/core-entities-server): A data context’ssqlitems run only for its owner or an Owner-type user, only on the read-only database login, and only when the SQL is a single read over entity base views the caller may read in full. Deployments withoutdbReadOnlyUsername/dbReadOnlyPasswordcan no longer run them; the context’s other items still load. Users who are not Owner-type can no longer edit any field of a SQL item, but can still delete it. - Client SQL fragments are screened everywhere (
@memberjunction/generic-database-provider,@memberjunction/server): RunView filters from batched views, list sources, the REST view routes and a saved view’s storedWhereClauseand sort (on save and on every run) now pass the base-view clause screen. The screen refuses a subquery over an entity the user reads under a row filter or with denied fields, so a saved view with such a subquery stops running for those users. A client-suppliedExtraFilter,OrderByorOverrideExcludeFiltermust also be one balanced expression with no;or comment, and a backslash inside a quoted string or identifier is refused, so a filter such asAccount = 'DOMAIN\user'now fails; stored view clauses are not checked for backslashes. - Dataset reads check permissions (
@memberjunction/generic-database-provider,@memberjunction/server): With a context user, each dataset item requires read permission on its entity and applies the user’s read row filter, and an item whose client filter fails the screen is refused.MJ_Metadatastays loadable by every authenticated user. - Storage routes check account permissions (
@memberjunction/server): The GraphQL storage routes need Read or Write on the storage account, and refuse files the caller cannot read. Accounts with noMJ: File Storage Account Permissionsrows stay open. - Workflow actions inside agent runs (
@memberjunction/core-actions): Loop, Parallel Execute, Conditional and Retry refuse inside any agent run, scoped or not, since the actions they run cannot carry the run’s scope. Agents configured to call them need another path. - Entity
Configurationreplaced on 25 entities (@memberjunction/core-entities): TheMetadata_Syncmigration replaces the wholeEntity.Configurationfield on 10 entities inmetadata/entities/.clone-configurations.json(newClonesettings) and on the 15 entities in the newmetadata/entities/.save-return-datestamps-only-entities.json({"SaveReturnMode":"datestamps_only"}). Before upgrading, note anyConfigurationyou added to those entities and re-apply it afterwards, merged with the new keys. Upgrading from 6.1 also runs edge.2’s replacement on all 63 clone entities. - Conversation messages in transaction groups (
@memberjunction/core-entities,@memberjunction/server): People post messages only as themselves, and a message whoseID, conversation or rating comes from a TransactionGroup variable is refused for everyone, the system user included. Creating a conversation and its first message in one transaction group no longer works; save the conversation first.