v5.43.0

New Features

  • Open Apps: Connector Extraction Modalitymj app install <repo>/<subpath> supports multi-app repos with scoped-tag version resolution per app. New OpenApp.Subpath column persists which in-repo directory an app installed from, enabling correct upgrade/remove. Vendor connectors (Salesforce, NetSuite, GrowthZone, etc.) now ship as installable Open Apps from MemberJunction/Integrations rather than being seeded by MJ core.
  • Remote Operations (RO-2/RO-3/RO-4) — CodeGen emitter generates typed base classes for all declared Remote Operations. Long-running operations emit typed progress events observable both in-process and over the wire. AI-authored operation bodies: Description drives LLM code generation (gated by CodeApprovalStatus). The Bulk Operations UX is now powered by the generic Remote Operations architecture.
  • Bulk Operations Studio — New mj app installable application providing a drag-and-drop Record Process studio with visual FieldRules builder, reactive history, and dry-run preview. Supports Action/Agent/Infer work types.
  • Field Rules Engine — Shared engine (@memberjunction/field-rules-transforms) reused across integration and bulk-update surfaces. Adds prompt and entityDocument sources, plus JSONPath/XPath transform plugins.
  • Generic Fire-and-Forget Save QueueKeyedSerialTaskQueue (global) and BaseEntitySaveQueue (core) eliminate hand-rolled "INSERT then UPDATE" persistence races. Adopted across ActionEngine, AIPromptRunner, GenericProcessRunTracker, and AgentRunStepSaveQueue. Makes "stuck at Running" records structurally impossible.
  • Realtime Multi-Agent Floor Control — Broadcast/diarization mode, optional turn moderator, Gemini meeting mode, session capability surface with first-agent re-gating, and an idle session reaper. Zoom-style split Leave/End-for-everyone control on Google Meet rooms.
  • Angular DOM Unit-Testing Foundation — New @memberjunction/ng-test-utils package with renderComponentFixture and renderTemplate helpers. Vitest + jsdom harness with coverage reporting. Pilot DOM specs across ng-ui-components, ng-pagination, ng-tabstrip, and ng-livekit-room leaf components.
  • Conversations: Query Mentions — Runnable queries now surface under the #-mention trigger alongside entities. Queries are permission-filtered via QueryInfo.UserCanRun and render with display name and configured icon in autocomplete, editor chips, and message badges.
  • CI: UI Design-Token and Button Override Gates — Two new GitHub Actions gates enforce no hardcoded hex colors and no .mj-btn CSS overrides in PRs targeting next.
  • Happy Birthday Madhav!

Improvements

  • Open App Lifecycle Correctness — Installed server packages load at boot from dynamicPackages.server[]; installed client packages recorded in dynamicPackages.client[]. Install status is now correct (npm failure → Disabled, not Active). Remove is now safe (DB-first ordering, co-tenant shared-schema guard, atomic metadata commit). Own Application row is deleted on clean uninstall. mj codegen manifest --open-app-client-bootstrap replaces the hand-written MJExplorer bootstrap script.
  • Integration Framework Hardening — Wide-table in-row size limits now live in SQLDialect (MaxInRowSizeBytes, MaxColumnCount, EstimateInRowBytes). SchemaBuilder defers over-budget columns to __mj_integration_CustomOverflow and emits structured warnings instead of shipping tables that fail every INSERT. Multi-level template-var traversal in BaseRESTIntegrationConnector supports paths with more than one template variable. IntegrationDiscoveryResolver.createEntityAndFieldMaps now O(1) schema lookup instead of O(N²) scan — fixes large-catalog timeout (e.g. Salesforce ~1,695 objects).
  • CodeGen: Multi-Provider Database SymmetrySetupDataSource dispatches via ClassFactory to platform-specific providers; adding a new platform is a single @RegisterClass. PG env-var precedence (PG_HOST/PG_PORT/etc.) now resolves once in DEFAULT_CODEGEN_CONFIG with de-duplicated warnings. New optional codegenPool config block (max, min, idleTimeoutMillis, connectionTimeoutMillis, statementTimeoutMs, ssl).
  • Save-Capture Column Order@ResultTable in the SQL Server save wrapper now reads column order from sys.columns at config time (cached per entity), making it correct for hand-maintained views that diverge from canonical CodeGen column ordering.
  • Installer: Secret Protection — Configure phase now generates a .gitignore covering .env/.env.* so freshly scaffolded projects don't accidentally commit credentials.
  • Telemetry — Cacheability-aware duplicate-RunView suggestion for AllowCaching=false entities. Fixes pagination-fingerprint false-duplicates. Batched janitor channel reads.
  • Connector Metadata Removal — All connector-specific Integration, Integration Object, Integration Object Field, and Credential Type metadata removed from the MJ core repo and database. Migration safely guards against removing live CompanyIntegration connections.

Bug Fixes

  • Flow Agent Loop Resolution — ForEach/While loop-body Action steps now resolve against the standard Action registry (ActionEngineServer.Instance.Actions) instead of the legacy AI Actions collection. Previously, any normal action used in a loop body (e.g. Google Custom Search) failed with "Action not found."
  • Flow Agent Static Collections — ForEach collectionPath now supports static:[...] literal collections for iterating fixed lists/ranges without a prior step to build the array.
  • MJExplorer Login CrashMJNotificationService.Instance was read before DI constructed the singleton during magic-link instant login. The service is now injected into MJExplorerAppComponent so it initializes before handleLogin runs.
  • React Linter False Positives — Form-lifecycle false positives eliminated; no-op saves in the interactive form component are now guarded.
  • CodeGen PG Env-Var Precedence — PG_* precedence was silently lost when dbPlatform was set only in mj.config.cjs (not via DB_PLATFORM env var). Fixed via applyPlatformDependentEnvVars() running post-merge.
  • CodeGen SSL Default — SSL was unintentionally flipped on in NODE_ENV=production for PostgreSQL CodeGen connections. Now defaults to off with an explicit codegenPool.ssl knob.
  • CodeGen statement_timeoutstatement_timeout GUC was not applied to the verify-SELECT-1 connection; fixed by carrying the timeout via the libpq startup option.
  • Restored OAuth2 Schemaoauth2-client-credentials.schema.json was inadvertently deleted alongside connector-specific schemas in a prior PR; restored.
  • UUID Equality in Entity-Action UXUUIDsEqual is now used in the AI-prompt selector instead of ===, fixing UUID comparison failures across SQL Server (uppercase) and PostgreSQL (lowercase).