AbstractThe operation's input payload type.
The operation's output payload type.
The operation's input payload type.
The operation's output payload type.
ReadonlyExecutionWhether this operation is a plain Sync request/response or a LongRunning run.
Abstract ReadonlyOperationStable registry key and wire token for this operation (e.g. RecordProcess.RunNow).
Optional ReadonlyRequiredOptional API-key scope string (e.g. recordprocess:execute) enforced for API-key / MCP
callers by the server resolver. undefined means no scope gate; interactive users remain
bounded by their entity permissions. Informational here — the server applies it.
Optional ReadonlyRequiresWhen true, the server only permits the system user to invoke this operation.
ProtectedAuthorizePer-operation authorization hook, composed with (and applied after) the framework gates that the server resolver runs. Returns true by default. Override to enforce operation-specific rules against the input and acting user.
True if the operation may proceed.
The universal entry point — identical on client and server. Routes the operation through the active (or explicitly supplied) provider's IRemoteOperationProvider.RouteOperation.
The typed input payload.
Optional invocation options (mode, progress callback, explicit provider/user).
The result; never throws for logical failures — inspect Success / ErrorMessage.
Server-side execution entry point, invoked in-process by a server provider / resolver after it has resolved this operation by key and applied the framework authorization gates (scope / system-user / entity permissions). It runs the per-operation Authorize hook and then InternalExecute, wrapping the outcome in a RemoteOpResult.
The typed input payload.
The server execution context (provider, acting user, progress emitter).
The wrapped result; logical failures are returned, not thrown.
ProtectedInternalThe operation's server-side work. The default throws — a routable operation must supply a
body (CodeGen-emitted AI/default plumbing, or a hand-authored override). Implementations must
use context.provider / context.user for data access (never new Metadata()), per the
multi-provider rule.
The typed input payload.
The owning provider for data access.
The acting user.
The full server execution context (provider, user, progress emitter, handle).
The typed output payload.
Base class for a typed, provider-routed Remote Operation — the typed peer of
BaseEntity(record CRUD) andRunView(set reads) for arbitrary server capabilities.A concrete operation declares its stable OperationKey and is invoked through the single universal Execute entry point, which routes through the active provider: on the client the call is marshalled over GraphQL, on the server it is dispatched in-process — the developer writes the same call regardless of where their code runs (the unified-developer-surface principle).
The class is never abstract on the work itself: InternalExecute has a throwing default so a CodeGen-emitted base carrying AI-authored or default plumbing is fully executable with no hand-written subclass. Subclassing to override InternalExecute / Authorize is available but never required.
Concrete subclasses are resolved by stable key via the MJ ClassFactory, e.g.
@RegisterClass(BaseRemotableOperation, 'RecordProcess.RunNow'); the last registration (the hand-authored subclass, which imports and extends the generated base) wins by import order.