@memberjunction/core 6.2.0-edge.5 → 6.2.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generic/BaseEntitySaveQueue.d.ts +15 -0
- package/dist/generic/BaseEntitySaveQueue.d.ts.map +1 -1
- package/dist/generic/BaseEntitySaveQueue.js +21 -0
- package/dist/generic/BaseEntitySaveQueue.js.map +1 -1
- package/dist/generic/EntityFieldRules.d.ts.map +1 -1
- package/dist/generic/EntityFieldRules.js +1 -0
- package/dist/generic/EntityFieldRules.js.map +1 -1
- package/dist/generic/alternateBaseViews.d.ts +119 -0
- package/dist/generic/alternateBaseViews.d.ts.map +1 -0
- package/dist/generic/alternateBaseViews.js +223 -0
- package/dist/generic/alternateBaseViews.js.map +1 -0
- package/dist/generic/baseEngine.d.ts +171 -17
- package/dist/generic/baseEngine.d.ts.map +1 -1
- package/dist/generic/baseEngine.js +722 -117
- package/dist/generic/baseEngine.js.map +1 -1
- package/dist/generic/baseEngineRegistry.d.ts.map +1 -1
- package/dist/generic/baseEngineRegistry.js +2 -1
- package/dist/generic/baseEngineRegistry.js.map +1 -1
- package/dist/generic/baseEntity.d.ts +216 -21
- package/dist/generic/baseEntity.d.ts.map +1 -1
- package/dist/generic/baseEntity.js +969 -100
- package/dist/generic/baseEntity.js.map +1 -1
- package/dist/generic/baseRemotableOperation.d.ts +95 -6
- package/dist/generic/baseRemotableOperation.d.ts.map +1 -1
- package/dist/generic/baseRemotableOperation.js +112 -8
- package/dist/generic/baseRemotableOperation.js.map +1 -1
- package/dist/generic/contextTokens.d.ts +136 -0
- package/dist/generic/contextTokens.d.ts.map +1 -0
- package/dist/generic/contextTokens.js +319 -0
- package/dist/generic/contextTokens.js.map +1 -0
- package/dist/generic/databaseProviderBase.d.ts +103 -5
- package/dist/generic/databaseProviderBase.d.ts.map +1 -1
- package/dist/generic/databaseProviderBase.js +381 -52
- package/dist/generic/databaseProviderBase.js.map +1 -1
- package/dist/generic/embeddedRecord.d.ts +6 -0
- package/dist/generic/embeddedRecord.d.ts.map +1 -1
- package/dist/generic/embeddedRecord.js +15 -1
- package/dist/generic/embeddedRecord.js.map +1 -1
- package/dist/generic/entityCompanion.d.ts +7 -0
- package/dist/generic/entityCompanion.d.ts.map +1 -1
- package/dist/generic/entityCompanion.js +8 -0
- package/dist/generic/entityCompanion.js.map +1 -1
- package/dist/generic/entityInfo.d.ts +234 -9
- package/dist/generic/entityInfo.d.ts.map +1 -1
- package/dist/generic/entityInfo.js +592 -77
- package/dist/generic/entityInfo.js.map +1 -1
- package/dist/generic/entityValueFieldSecurity.d.ts +139 -0
- package/dist/generic/entityValueFieldSecurity.d.ts.map +1 -0
- package/dist/generic/entityValueFieldSecurity.js +250 -0
- package/dist/generic/entityValueFieldSecurity.js.map +1 -0
- package/dist/generic/externalDataSourceReadRouter.d.ts +10 -0
- package/dist/generic/externalDataSourceReadRouter.d.ts.map +1 -1
- package/dist/generic/externalDataSourceReadRouter.js +12 -0
- package/dist/generic/externalDataSourceReadRouter.js.map +1 -1
- package/dist/generic/fieldSecuritySQLGate.d.ts +359 -0
- package/dist/generic/fieldSecuritySQLGate.d.ts.map +1 -0
- package/dist/generic/fieldSecuritySQLGate.js +902 -0
- package/dist/generic/fieldSecuritySQLGate.js.map +1 -0
- package/dist/generic/indexRestrictedFields.d.ts +47 -0
- package/dist/generic/indexRestrictedFields.d.ts.map +1 -0
- package/dist/generic/indexRestrictedFields.js +129 -0
- package/dist/generic/indexRestrictedFields.js.map +1 -0
- package/dist/generic/interfaces.d.ts +64 -2
- package/dist/generic/interfaces.d.ts.map +1 -1
- package/dist/generic/interfaces.js.map +1 -1
- package/dist/generic/listMembershipFilter.d.ts +5 -0
- package/dist/generic/listMembershipFilter.d.ts.map +1 -0
- package/dist/generic/listMembershipFilter.js +23 -0
- package/dist/generic/listMembershipFilter.js.map +1 -0
- package/dist/generic/localCacheManager.d.ts +126 -14
- package/dist/generic/localCacheManager.d.ts.map +1 -1
- package/dist/generic/localCacheManager.js +348 -48
- package/dist/generic/localCacheManager.js.map +1 -1
- package/dist/generic/logging.d.ts.map +1 -1
- package/dist/generic/logging.js +7 -1
- package/dist/generic/logging.js.map +1 -1
- package/dist/generic/metadata.d.ts +3 -2
- package/dist/generic/metadata.d.ts.map +1 -1
- package/dist/generic/metadata.js +5 -2
- package/dist/generic/metadata.js.map +1 -1
- package/dist/generic/platformSQL.d.ts +54 -0
- package/dist/generic/platformSQL.d.ts.map +1 -1
- package/dist/generic/platformSQL.js +55 -0
- package/dist/generic/platformSQL.js.map +1 -1
- package/dist/generic/providerBase.d.ts +408 -57
- package/dist/generic/providerBase.d.ts.map +1 -1
- package/dist/generic/providerBase.js +1051 -310
- package/dist/generic/providerBase.js.map +1 -1
- package/dist/generic/queryInfo.d.ts +13 -0
- package/dist/generic/queryInfo.d.ts.map +1 -1
- package/dist/generic/queryInfo.js +13 -0
- package/dist/generic/queryInfo.js.map +1 -1
- package/dist/generic/queryInfoInterfaces.d.ts +8 -0
- package/dist/generic/queryInfoInterfaces.d.ts.map +1 -1
- package/dist/generic/queryTemplateContext.d.ts +49 -0
- package/dist/generic/queryTemplateContext.d.ts.map +1 -0
- package/dist/generic/queryTemplateContext.js +113 -0
- package/dist/generic/queryTemplateContext.js.map +1 -0
- package/dist/generic/recordChangeFieldSecurity.d.ts.map +1 -1
- package/dist/generic/recordChangeFieldSecurity.js +13 -2
- package/dist/generic/recordChangeFieldSecurity.js.map +1 -1
- package/dist/generic/relatedRecordCollection.d.ts +18 -0
- package/dist/generic/relatedRecordCollection.d.ts.map +1 -1
- package/dist/generic/relatedRecordCollection.js +55 -7
- package/dist/generic/relatedRecordCollection.js.map +1 -1
- package/dist/generic/remoteOperationDispatch.d.ts.map +1 -1
- package/dist/generic/remoteOperationDispatch.js +14 -2
- package/dist/generic/remoteOperationDispatch.js.map +1 -1
- package/dist/generic/runQuery.d.ts +42 -0
- package/dist/generic/runQuery.d.ts.map +1 -1
- package/dist/generic/runQuery.js +14 -0
- package/dist/generic/runQuery.js.map +1 -1
- package/dist/generic/runQuerySQLFilterImplementations.d.ts +33 -6
- package/dist/generic/runQuerySQLFilterImplementations.d.ts.map +1 -1
- package/dist/generic/runQuerySQLFilterImplementations.js +119 -29
- package/dist/generic/runQuerySQLFilterImplementations.js.map +1 -1
- package/dist/generic/saveEntityGraphOperation.d.ts.map +1 -1
- package/dist/generic/saveEntityGraphOperation.js +3 -0
- package/dist/generic/saveEntityGraphOperation.js.map +1 -1
- package/dist/generic/securityInfo.d.ts +11 -0
- package/dist/generic/securityInfo.d.ts.map +1 -1
- package/dist/generic/securityInfo.js +15 -0
- package/dist/generic/securityInfo.js.map +1 -1
- package/dist/generic/telemetryManager.d.ts +9 -0
- package/dist/generic/telemetryManager.d.ts.map +1 -1
- package/dist/generic/telemetryManager.js +5 -1
- package/dist/generic/telemetryManager.js.map +1 -1
- package/dist/generic/transportError.d.ts +41 -0
- package/dist/generic/transportError.d.ts.map +1 -0
- package/dist/generic/transportError.js +167 -0
- package/dist/generic/transportError.js.map +1 -0
- package/dist/generic/util.d.ts +12 -0
- package/dist/generic/util.d.ts.map +1 -1
- package/dist/generic/util.js +52 -3
- package/dist/generic/util.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/views/runView.d.ts +102 -0
- package/dist/views/runView.d.ts.map +1 -1
- package/dist/views/runView.js +40 -0
- package/dist/views/runView.js.map +1 -1
- package/dist/views/viewProperties.d.ts +55 -0
- package/dist/views/viewProperties.d.ts.map +1 -0
- package/dist/views/viewProperties.js +258 -0
- package/dist/views/viewProperties.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,9 +1,60 @@
|
|
|
1
1
|
import { UserInfo } from "./securityInfo.js";
|
|
2
2
|
import { IMetadataProvider, RemoteOpExecMode, RemoteOpInvokeOptions, RemoteOpProgress, RemoteOpResult } from "./interfaces.js";
|
|
3
|
+
/**
|
|
4
|
+
* Structured logical failure that a {@link BaseRemotableOperation.InternalExecute} or
|
|
5
|
+
* {@link BaseRemotableOperation.Authorize} implementation can throw to return a specific
|
|
6
|
+
* machine-readable {@link ResultCode} (instead of the generic `'EXECUTION_ERROR'`) without
|
|
7
|
+
* changing `InternalExecute`'s typed `TOutput` return signature.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RemoteOperationError extends Error {
|
|
10
|
+
/** Machine-readable outcome code surfaced on {@link RemoteOpResult.ResultCode}. */
|
|
11
|
+
readonly ResultCode: string;
|
|
12
|
+
constructor(resultCode: string, message: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Structural input/output contract fields used to compute a deterministic wire fingerprint for a
|
|
16
|
+
* Remote Operation (both at CodeGen emit time and at server runtime via `RemoteOperationEngineBase`).
|
|
17
|
+
*/
|
|
18
|
+
export interface RemoteOperationContractSpec {
|
|
19
|
+
OperationKey: string;
|
|
20
|
+
ExecutionMode?: RemoteOpExecMode | string | null;
|
|
21
|
+
InputTypeName?: string | null;
|
|
22
|
+
InputTypeDefinition?: string | null;
|
|
23
|
+
InputTypeIsArray?: boolean | null;
|
|
24
|
+
OutputTypeName?: string | null;
|
|
25
|
+
OutputTypeDefinition?: string | null;
|
|
26
|
+
OutputTypeIsArray?: boolean | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Computes a deterministic, browser-safe 64-bit FNV-1a contract fingerprint (`ro_fp_<16-hex>`)
|
|
30
|
+
* from an operation's structural contract metadata. Whitespace runs inside type definitions are
|
|
31
|
+
* collapsed so CRLF vs LF formatting differences never trigger false mismatches.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ComputeRemoteOperationContractFingerprint(spec: RemoteOperationContractSpec): string;
|
|
34
|
+
/**
|
|
35
|
+
* JSON-Schema-compatible primitive/nested value type for opt-in Agent / MCP tool input schemas.
|
|
36
|
+
*/
|
|
37
|
+
export type RemoteOpToolSchemaValue = string | number | boolean | null | RemoteOpToolSchemaValue[] | {
|
|
38
|
+
[key: string]: RemoteOpToolSchemaValue;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Descriptor returned by {@link BaseRemotableOperation.GetExposedToolOperations} for operations
|
|
42
|
+
* that opt into automatic AI Agent tool or MCP tool discovery.
|
|
43
|
+
*/
|
|
44
|
+
export interface ExposedRemoteOperationToolDescriptor {
|
|
45
|
+
OperationKey: string;
|
|
46
|
+
ExposeAsAgentTool: boolean;
|
|
47
|
+
ExposeAsMCPTool: boolean;
|
|
48
|
+
Description?: string;
|
|
49
|
+
InputSchema?: Record<string, RemoteOpToolSchemaValue>;
|
|
50
|
+
RequiredScope?: string;
|
|
51
|
+
RequiresSystemUser?: boolean;
|
|
52
|
+
ExecutionMode: RemoteOpExecMode;
|
|
53
|
+
}
|
|
3
54
|
/**
|
|
4
55
|
* Server-side execution context handed to {@link BaseRemotableOperation.ExecuteServer} (and through
|
|
5
|
-
* it to `InternalExecute`) when a Remote Operation runs in-process on the server.
|
|
6
|
-
* everything a server implementation needs without coupling the operation to any transport.
|
|
56
|
+
* it to `Authorize` and `InternalExecute`) when a Remote Operation runs in-process on the server.
|
|
57
|
+
* It carries everything a server implementation needs without coupling the operation to any transport.
|
|
7
58
|
*/
|
|
8
59
|
export interface RemoteOpServerContext {
|
|
9
60
|
/** The provider that owns this execution (use this for data access — never `new Metadata()`). */
|
|
@@ -14,6 +65,21 @@ export interface RemoteOpServerContext {
|
|
|
14
65
|
emitProgress: (progress: RemoteOpProgress) => void;
|
|
15
66
|
/** Opaque handle for the backing run (e.g. a `ProcessRunID`), when one has been created. */
|
|
16
67
|
handle?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Normalized HTTP `Origin` header (`scheme://host[:port]`, lowercased, no trailing slash)
|
|
70
|
+
* when the operation arrived over HTTP/GraphQL. Undefined for in-process calls or requests
|
|
71
|
+
* lacking an `Origin` header — origin allowlist checks must fail closed on `undefined`.
|
|
72
|
+
*/
|
|
73
|
+
requestOrigin?: string;
|
|
74
|
+
/**
|
|
75
|
+
* Caller's network IP address (`req.ip`) when invoked over HTTP/GraphQL. Suitable for abuse
|
|
76
|
+
* rate-limiting and forensic audit logging; never use as an identity check.
|
|
77
|
+
*/
|
|
78
|
+
clientIp?: string;
|
|
79
|
+
/** Caller's authenticated session ID when available from the server transport. */
|
|
80
|
+
sessionId?: string;
|
|
81
|
+
/** SHA-256 hash of the caller's MJ API key when invoked via `mj_sk_*` API key / MCP. */
|
|
82
|
+
apiKeyHash?: string;
|
|
17
83
|
}
|
|
18
84
|
/**
|
|
19
85
|
* Base class for a **typed, provider-routed Remote Operation** — the typed peer of `BaseEntity`
|
|
@@ -49,6 +115,28 @@ export declare abstract class BaseRemotableOperation<TInput = unknown, TOutput =
|
|
|
49
115
|
readonly RequiresSystemUser?: boolean;
|
|
50
116
|
/** Whether this operation is a plain `Sync` request/response or a `LongRunning` run. */
|
|
51
117
|
readonly ExecutionMode: RemoteOpExecMode;
|
|
118
|
+
/**
|
|
119
|
+
* Optional structural contract fingerprint emitted by CodeGen (or set by a hand-authored
|
|
120
|
+
* operation). Automatically forwarded on {@link Execute} when the caller didn't override
|
|
121
|
+
* `options.contractFingerprint`, allowing the server resolver to detect stale client bundles.
|
|
122
|
+
*/
|
|
123
|
+
readonly ContractFingerprint?: string;
|
|
124
|
+
/** When true, exposes this operation for automatic discovery by MJ AI Agent tool adapters. */
|
|
125
|
+
readonly ExposeAsAgentTool?: boolean;
|
|
126
|
+
/** When true, exposes this operation for automatic discovery by MJ MCP server tool adapters. */
|
|
127
|
+
readonly ExposeAsMCPTool?: boolean;
|
|
128
|
+
/** Human/LLM-readable description when exposed as an Agent or MCP tool. */
|
|
129
|
+
readonly ToolDescription?: string;
|
|
130
|
+
/** Optional JSON-Schema object describing `TInput` when exposed as an Agent or MCP tool. */
|
|
131
|
+
readonly ToolInputSchema?: Record<string, RemoteOpToolSchemaValue>;
|
|
132
|
+
/**
|
|
133
|
+
* Discovers all ClassFactory-registered {@link BaseRemotableOperation} subclasses that opt into
|
|
134
|
+
* AI Agent (`ExposeAsAgentTool`) and/or MCP (`ExposeAsMCPTool`) tool exposure.
|
|
135
|
+
*/
|
|
136
|
+
static GetExposedToolOperations(filter?: {
|
|
137
|
+
agentOnly?: boolean;
|
|
138
|
+
mcpOnly?: boolean;
|
|
139
|
+
}): ExposedRemoteOperationToolDescriptor[];
|
|
52
140
|
/**
|
|
53
141
|
* The universal entry point — identical on client and server. Routes the operation through the
|
|
54
142
|
* active (or explicitly supplied) provider's {@link IRemoteOperationProvider.RouteOperation}.
|
|
@@ -65,7 +153,7 @@ export declare abstract class BaseRemotableOperation<TInput = unknown, TOutput =
|
|
|
65
153
|
* and then {@link InternalExecute}, wrapping the outcome in a {@link RemoteOpResult}.
|
|
66
154
|
*
|
|
67
155
|
* @param input - The typed input payload.
|
|
68
|
-
* @param context - The server execution context (provider, acting user, progress emitter).
|
|
156
|
+
* @param context - The server execution context (provider, acting user, progress emitter, HTTP metadata).
|
|
69
157
|
* @returns The wrapped result; logical failures are returned, not thrown.
|
|
70
158
|
*/
|
|
71
159
|
ExecuteServer(input: TInput, context: RemoteOpServerContext): Promise<RemoteOpResult<TOutput>>;
|
|
@@ -78,19 +166,20 @@ export declare abstract class BaseRemotableOperation<TInput = unknown, TOutput =
|
|
|
78
166
|
* @param _input - The typed input payload.
|
|
79
167
|
* @param _provider - The owning provider for data access.
|
|
80
168
|
* @param _user - The acting user.
|
|
81
|
-
* @param _context - The full server execution context (provider, user, progress emitter, handle).
|
|
169
|
+
* @param _context - The full server execution context (provider, user, progress emitter, handle, origin, IP).
|
|
82
170
|
* @returns The typed output payload.
|
|
83
171
|
*/
|
|
84
172
|
protected InternalExecute(_input: TInput, _provider: IMetadataProvider, _user: UserInfo, _context: RemoteOpServerContext): Promise<TOutput>;
|
|
85
173
|
/**
|
|
86
174
|
* Per-operation authorization hook, composed with (and applied after) the framework gates that
|
|
87
175
|
* the server resolver runs. Returns true by default. Override to enforce operation-specific
|
|
88
|
-
* rules against the input and
|
|
176
|
+
* rules against the input, acting user, and server transport context (e.g. `context.requestOrigin`).
|
|
89
177
|
*
|
|
90
178
|
* @param _input - The typed input payload.
|
|
91
179
|
* @param _user - The acting user.
|
|
180
|
+
* @param _context - Optional server execution context (always supplied by {@link ExecuteServer}).
|
|
92
181
|
* @returns True if the operation may proceed.
|
|
93
182
|
*/
|
|
94
|
-
protected Authorize(_input: TInput, _user: UserInfo): Promise<boolean>;
|
|
183
|
+
protected Authorize(_input: TInput, _user: UserInfo, _context?: RemoteOpServerContext): Promise<boolean>;
|
|
95
184
|
}
|
|
96
185
|
//# sourceMappingURL=baseRemotableOperation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseRemotableOperation.d.ts","sourceRoot":"","sources":["../../src/generic/baseRemotableOperation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"baseRemotableOperation.d.ts","sourceRoot":"","sources":["../../src/generic/baseRemotableOperation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,49 @@
|
|
|
1
|
+
import { MJGlobal } from "@memberjunction/global";
|
|
1
2
|
import { Metadata } from "./metadata.js";
|
|
3
|
+
/**
|
|
4
|
+
* Structured logical failure that a {@link BaseRemotableOperation.InternalExecute} or
|
|
5
|
+
* {@link BaseRemotableOperation.Authorize} implementation can throw to return a specific
|
|
6
|
+
* machine-readable {@link ResultCode} (instead of the generic `'EXECUTION_ERROR'`) without
|
|
7
|
+
* changing `InternalExecute`'s typed `TOutput` return signature.
|
|
8
|
+
*/
|
|
9
|
+
export class RemoteOperationError extends Error {
|
|
10
|
+
constructor(resultCode, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'RemoteOperationError';
|
|
13
|
+
this.ResultCode = resultCode;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Computes a deterministic, browser-safe 64-bit FNV-1a contract fingerprint (`ro_fp_<16-hex>`)
|
|
18
|
+
* from an operation's structural contract metadata. Whitespace runs inside type definitions are
|
|
19
|
+
* collapsed so CRLF vs LF formatting differences never trigger false mismatches.
|
|
20
|
+
*/
|
|
21
|
+
export function ComputeRemoteOperationContractFingerprint(spec) {
|
|
22
|
+
const collapseWs = (s) => (s ?? '').trim().replace(/\s+/g, ' ');
|
|
23
|
+
const canonical = [
|
|
24
|
+
(spec.OperationKey ?? '').trim(),
|
|
25
|
+
(spec.ExecutionMode ?? 'Sync').trim(),
|
|
26
|
+
(spec.InputTypeName ?? '').trim(),
|
|
27
|
+
spec.InputTypeIsArray ? '1' : '0',
|
|
28
|
+
collapseWs(spec.InputTypeDefinition),
|
|
29
|
+
(spec.OutputTypeName ?? '').trim(),
|
|
30
|
+
spec.OutputTypeIsArray ? '1' : '0',
|
|
31
|
+
collapseWs(spec.OutputTypeDefinition),
|
|
32
|
+
].join('|');
|
|
33
|
+
// Dual 32-bit FNV-1a lanes combined into 16 hex digits (browser-safe, zero BigInt/crypto overhead).
|
|
34
|
+
let h1 = 0x811c9dc5;
|
|
35
|
+
let h2 = 0x01000193;
|
|
36
|
+
for (let i = 0; i < canonical.length; i++) {
|
|
37
|
+
const c = canonical.charCodeAt(i);
|
|
38
|
+
h1 ^= c;
|
|
39
|
+
h1 = Math.imul(h1, 0x01000193);
|
|
40
|
+
h2 ^= c ^ (i & 0xff);
|
|
41
|
+
h2 = Math.imul(h2, 0x811c9dc5);
|
|
42
|
+
}
|
|
43
|
+
const hex1 = (h1 >>> 0).toString(16).padStart(8, '0');
|
|
44
|
+
const hex2 = (h2 >>> 0).toString(16).padStart(8, '0');
|
|
45
|
+
return `ro_fp_${hex1}${hex2}`;
|
|
46
|
+
}
|
|
2
47
|
/**
|
|
3
48
|
* Base class for a **typed, provider-routed Remote Operation** — the typed peer of `BaseEntity`
|
|
4
49
|
* (record CRUD) and `RunView` (set reads) for arbitrary server capabilities.
|
|
@@ -25,6 +70,50 @@ export class BaseRemotableOperation {
|
|
|
25
70
|
/** Whether this operation is a plain `Sync` request/response or a `LongRunning` run. */
|
|
26
71
|
this.ExecutionMode = 'Sync';
|
|
27
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Discovers all ClassFactory-registered {@link BaseRemotableOperation} subclasses that opt into
|
|
75
|
+
* AI Agent (`ExposeAsAgentTool`) and/or MCP (`ExposeAsMCPTool`) tool exposure.
|
|
76
|
+
*/
|
|
77
|
+
static GetExposedToolOperations(filter) {
|
|
78
|
+
const registrations = MJGlobal.Instance.ClassFactory.GetAllRegistrations(BaseRemotableOperation);
|
|
79
|
+
const seenKeys = new Set();
|
|
80
|
+
const descriptors = [];
|
|
81
|
+
// Walk in reverse registration order so the highest-priority / latest subclass override wins per key.
|
|
82
|
+
for (let i = registrations.length - 1; i >= 0; i--) {
|
|
83
|
+
const reg = registrations[i];
|
|
84
|
+
const key = reg.Key;
|
|
85
|
+
if (!key || seenKeys.has(key)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
seenKeys.add(key);
|
|
89
|
+
const instance = MJGlobal.Instance.ClassFactory.CreateInstance(BaseRemotableOperation, key);
|
|
90
|
+
if (!instance) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const asAgent = instance.ExposeAsAgentTool === true;
|
|
94
|
+
const asMcp = instance.ExposeAsMCPTool === true;
|
|
95
|
+
if (!asAgent && !asMcp) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (filter?.agentOnly && !asAgent) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (filter?.mcpOnly && !asMcp) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
descriptors.push({
|
|
105
|
+
OperationKey: instance.OperationKey,
|
|
106
|
+
ExposeAsAgentTool: asAgent,
|
|
107
|
+
ExposeAsMCPTool: asMcp,
|
|
108
|
+
Description: instance.ToolDescription,
|
|
109
|
+
InputSchema: instance.ToolInputSchema,
|
|
110
|
+
RequiredScope: instance.RequiredScope,
|
|
111
|
+
RequiresSystemUser: instance.RequiresSystemUser,
|
|
112
|
+
ExecutionMode: instance.ExecutionMode,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return descriptors.sort((a, b) => (a.OperationKey < b.OperationKey ? -1 : a.OperationKey > b.OperationKey ? 1 : 0));
|
|
116
|
+
}
|
|
28
117
|
/**
|
|
29
118
|
* The universal entry point — identical on client and server. Routes the operation through the
|
|
30
119
|
* active (or explicitly supplied) provider's {@link IRemoteOperationProvider.RouteOperation}.
|
|
@@ -35,12 +124,16 @@ export class BaseRemotableOperation {
|
|
|
35
124
|
*/
|
|
36
125
|
async Execute(input, options = {}) {
|
|
37
126
|
let provider;
|
|
127
|
+
let candidateProvider;
|
|
38
128
|
try {
|
|
39
|
-
|
|
129
|
+
candidateProvider = options.provider ?? Metadata.Provider;
|
|
40
130
|
}
|
|
41
131
|
catch {
|
|
42
132
|
// Metadata.Provider throws when no global provider has been configured — treat as "no provider".
|
|
43
|
-
|
|
133
|
+
candidateProvider = undefined;
|
|
134
|
+
}
|
|
135
|
+
if (candidateProvider && 'RouteOperation' in candidateProvider) {
|
|
136
|
+
provider = candidateProvider;
|
|
44
137
|
}
|
|
45
138
|
if (!provider || typeof provider.RouteOperation !== 'function') {
|
|
46
139
|
return {
|
|
@@ -49,7 +142,10 @@ export class BaseRemotableOperation {
|
|
|
49
142
|
ErrorMessage: 'No remote-operation-capable provider is available to route this operation',
|
|
50
143
|
};
|
|
51
144
|
}
|
|
52
|
-
|
|
145
|
+
const effectiveOptions = this.ContractFingerprint && options.contractFingerprint === undefined
|
|
146
|
+
? { ...options, contractFingerprint: this.ContractFingerprint }
|
|
147
|
+
: options;
|
|
148
|
+
return provider.RouteOperation(this.OperationKey, input, effectiveOptions);
|
|
53
149
|
}
|
|
54
150
|
/**
|
|
55
151
|
* Server-side execution entry point, invoked **in-process** by a server provider / resolver
|
|
@@ -58,12 +154,12 @@ export class BaseRemotableOperation {
|
|
|
58
154
|
* and then {@link InternalExecute}, wrapping the outcome in a {@link RemoteOpResult}.
|
|
59
155
|
*
|
|
60
156
|
* @param input - The typed input payload.
|
|
61
|
-
* @param context - The server execution context (provider, acting user, progress emitter).
|
|
157
|
+
* @param context - The server execution context (provider, acting user, progress emitter, HTTP metadata).
|
|
62
158
|
* @returns The wrapped result; logical failures are returned, not thrown.
|
|
63
159
|
*/
|
|
64
160
|
async ExecuteServer(input, context) {
|
|
65
161
|
try {
|
|
66
|
-
const authorized = await this.Authorize(input, context.user);
|
|
162
|
+
const authorized = await this.Authorize(input, context.user, context);
|
|
67
163
|
if (!authorized) {
|
|
68
164
|
return {
|
|
69
165
|
Success: false,
|
|
@@ -75,6 +171,13 @@ export class BaseRemotableOperation {
|
|
|
75
171
|
return { Success: true, ResultCode: 'SUCCESS', Output: output };
|
|
76
172
|
}
|
|
77
173
|
catch (e) {
|
|
174
|
+
if (e instanceof RemoteOperationError) {
|
|
175
|
+
return {
|
|
176
|
+
Success: false,
|
|
177
|
+
ResultCode: e.ResultCode,
|
|
178
|
+
ErrorMessage: e.message,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
78
181
|
return {
|
|
79
182
|
Success: false,
|
|
80
183
|
ResultCode: 'EXECUTION_ERROR',
|
|
@@ -91,7 +194,7 @@ export class BaseRemotableOperation {
|
|
|
91
194
|
* @param _input - The typed input payload.
|
|
92
195
|
* @param _provider - The owning provider for data access.
|
|
93
196
|
* @param _user - The acting user.
|
|
94
|
-
* @param _context - The full server execution context (provider, user, progress emitter, handle).
|
|
197
|
+
* @param _context - The full server execution context (provider, user, progress emitter, handle, origin, IP).
|
|
95
198
|
* @returns The typed output payload.
|
|
96
199
|
*/
|
|
97
200
|
InternalExecute(_input, _provider, _user, _context) {
|
|
@@ -101,13 +204,14 @@ export class BaseRemotableOperation {
|
|
|
101
204
|
/**
|
|
102
205
|
* Per-operation authorization hook, composed with (and applied after) the framework gates that
|
|
103
206
|
* the server resolver runs. Returns true by default. Override to enforce operation-specific
|
|
104
|
-
* rules against the input and
|
|
207
|
+
* rules against the input, acting user, and server transport context (e.g. `context.requestOrigin`).
|
|
105
208
|
*
|
|
106
209
|
* @param _input - The typed input payload.
|
|
107
210
|
* @param _user - The acting user.
|
|
211
|
+
* @param _context - Optional server execution context (always supplied by {@link ExecuteServer}).
|
|
108
212
|
* @returns True if the operation may proceed.
|
|
109
213
|
*/
|
|
110
|
-
async Authorize(_input, _user) {
|
|
214
|
+
async Authorize(_input, _user, _context) {
|
|
111
215
|
return true;
|
|
112
216
|
}
|
|
113
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseRemotableOperation.js","sourceRoot":"","sources":["../../src/generic/baseRemotableOperation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"baseRemotableOperation.js","sourceRoot":"","sources":["../../src/generic/baseRemotableOperation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context tokens and property defaults.
|
|
3
|
+
*
|
|
4
|
+
* A property (a User View property, a dashboard property, a query's server-set variable) can
|
|
5
|
+
* default to a fixed value or to a context token: a name from a closed list, worked out from the
|
|
6
|
+
* context user and the clock alone. The same resolver runs in the browser and on the server, so
|
|
7
|
+
* the two can differ only in the time zone they are given.
|
|
8
|
+
*
|
|
9
|
+
* - User tokens (`Context.UserID`, `Context.UserEmail`, `Context.UserName`) need a context user;
|
|
10
|
+
* without one they throw rather than resolve to a blank.
|
|
11
|
+
* - **WARNING — SQL template escaping (`| sqlString`):** `Context.UserEmail` and `Context.UserName`
|
|
12
|
+
* resolve to raw, unescaped strings (for example `O'Brien`) and reach Nunjucks query templates with
|
|
13
|
+
* `autoescape: false`. Query templates **must** pipe them through `| sqlString`
|
|
14
|
+
* (e.g. `WHERE Email = {{ Context.UserEmail | sqlString }}` or
|
|
15
|
+
* `WHERE Name = {{ Context.UserName | sqlString }}`). Rendering `{{ Context.UserEmail }}` or
|
|
16
|
+
* `{{ Context.UserName }}` bare produces broken SQL on apostrophes and opens SQL injection.
|
|
17
|
+
* (User View properties are escaped automatically by `UserViewPropertyWhereClause`.)
|
|
18
|
+
* - Date tokens give a `YYYY-MM-DD` date in the given zone (`Context.Today`, `Context.StartOf*`),
|
|
19
|
+
* or an ISO 8601 instant (`Context.Now`). Only date tokens take an offset.
|
|
20
|
+
* - The zone is an IANA name, `'UTC'` when none is given. Weeks start on Monday (ISO 8601) unless
|
|
21
|
+
* the context says Sunday.
|
|
22
|
+
*/
|
|
23
|
+
/** Every context token. The list is closed: an app's own context is a property value, never a token. */
|
|
24
|
+
export declare const CONTEXT_TOKENS: readonly ["Context.UserID", "Context.UserEmail", "Context.UserName", "Context.Now", "Context.Today", "Context.StartOfWeek", "Context.StartOfMonth", "Context.StartOfQuarter", "Context.StartOfYear"];
|
|
25
|
+
/** A context token: one of {@link CONTEXT_TOKENS}. */
|
|
26
|
+
export type ContextToken = typeof CONTEXT_TOKENS[number];
|
|
27
|
+
/**
|
|
28
|
+
* The version of what {@link CONTEXT_TOKENS} means. Approval fingerprints include it, so an approval
|
|
29
|
+
* given under one meaning is stale under another. Bump it whenever a token is added, removed or
|
|
30
|
+
* worked out differently (a new week start, a different date format, a different user field).
|
|
31
|
+
*/
|
|
32
|
+
export declare const CONTEXT_TOKEN_CONTRACT_VERSION = 1;
|
|
33
|
+
/** The value types a property can declare. */
|
|
34
|
+
export declare const PROPERTY_VALUE_TYPES: readonly ["string", "number", "boolean", "date", "uuid"];
|
|
35
|
+
/** A property's value type: one of {@link PROPERTY_VALUE_TYPES}. */
|
|
36
|
+
export type PropertyValueType = typeof PROPERTY_VALUE_TYPES[number];
|
|
37
|
+
/** The units an offset can move a date token by. */
|
|
38
|
+
export declare const PROPERTY_OFFSET_UNITS: readonly ["day", "week", "month", "quarter", "year"];
|
|
39
|
+
/** An offset unit: one of {@link PROPERTY_OFFSET_UNITS}. */
|
|
40
|
+
export type PropertyOffsetUnit = typeof PROPERTY_OFFSET_UNITS[number];
|
|
41
|
+
/** Moves a date token: `{ Amount: -30, Unit: 'day' }` is thirty days earlier. */
|
|
42
|
+
export interface PropertyDefaultOffset {
|
|
43
|
+
/** A whole number; negative moves back. */
|
|
44
|
+
Amount: number;
|
|
45
|
+
Unit: PropertyOffsetUnit;
|
|
46
|
+
}
|
|
47
|
+
/** A property value, fixed or resolved. */
|
|
48
|
+
export type PropertyValue = string | number | boolean | null;
|
|
49
|
+
/**
|
|
50
|
+
* A property's default: a fixed value, or a token worked out when the value is used. Set exactly
|
|
51
|
+
* one of `Value` and `Token`. This is the shape the `MJ: User Views.Properties` JSON stores.
|
|
52
|
+
*/
|
|
53
|
+
export interface PropertyDefault {
|
|
54
|
+
/** A fixed value. Set this or Token, not both. */
|
|
55
|
+
Value?: PropertyValue;
|
|
56
|
+
/** A context token. Set this or Value, not both. */
|
|
57
|
+
Token?: ContextToken;
|
|
58
|
+
/** Moves a date token; refused on a user token and on a fixed value. */
|
|
59
|
+
Offset?: PropertyDefaultOffset;
|
|
60
|
+
}
|
|
61
|
+
/** The comparison a User View property's value drives. */
|
|
62
|
+
export type UserViewPropertyOperator = '=' | '<>' | 'IN' | '>' | '>=' | '<' | '<=';
|
|
63
|
+
/** The field a User View property filters, and how. */
|
|
64
|
+
export interface UserViewPropertyTarget {
|
|
65
|
+
/** A field of the view's entity. */
|
|
66
|
+
Field: string;
|
|
67
|
+
Operator: UserViewPropertyOperator;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* One declared property of a User View: a named, typed input that adds one predicate on its
|
|
71
|
+
* target field when a run gives it a value or it has a default. Stored as a JSON array in the
|
|
72
|
+
* `Properties` column of `MJ: User Views`.
|
|
73
|
+
*/
|
|
74
|
+
export interface UserViewProperty {
|
|
75
|
+
/** Unique within the view. */
|
|
76
|
+
Name: string;
|
|
77
|
+
/** The value's type. A value of another type is refused. */
|
|
78
|
+
Type: PropertyValueType;
|
|
79
|
+
/** Shown to whoever sets the property. */
|
|
80
|
+
Description?: string;
|
|
81
|
+
/** Used when a run gives no value: a fixed value or a context token. */
|
|
82
|
+
Default?: PropertyDefault;
|
|
83
|
+
/** True: a run with no value and no default is refused. */
|
|
84
|
+
IsRequired?: boolean;
|
|
85
|
+
/** False: only server code may set it, and a client value is refused. Default true. */
|
|
86
|
+
AllowOverride?: boolean;
|
|
87
|
+
/** The predicate the value drives. */
|
|
88
|
+
Target: UserViewPropertyTarget;
|
|
89
|
+
}
|
|
90
|
+
/** What a token is worked out from. */
|
|
91
|
+
export interface PropertyResolutionContext {
|
|
92
|
+
/** The context user. Required by the user tokens. `UserInfo` fits. */
|
|
93
|
+
User?: {
|
|
94
|
+
ID: string;
|
|
95
|
+
Email?: string;
|
|
96
|
+
Name?: string;
|
|
97
|
+
};
|
|
98
|
+
/** The clock. Defaults to the current time. */
|
|
99
|
+
Now?: Date;
|
|
100
|
+
/** IANA time zone the date tokens are worked out in. Defaults to `'UTC'`. */
|
|
101
|
+
TimeZone?: string;
|
|
102
|
+
/** First day of the week for `Context.StartOfWeek`: 1 = Monday (default, ISO 8601), 0 = Sunday. */
|
|
103
|
+
WeekStartsOn?: 0 | 1;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The request header that carries the caller's IANA time zone. `GraphQLDataProvider` sends it;
|
|
107
|
+
* MJServer reads it into `UserPayload.TimeZone`.
|
|
108
|
+
*/
|
|
109
|
+
export declare const TIME_ZONE_HEADER = "x-mj-timezone";
|
|
110
|
+
/** True when `name` is a time zone this runtime's `Intl` accepts (an IANA name such as `'Europe/Paris'`). */
|
|
111
|
+
export declare function IsValidTimeZone(name: string | null | undefined): boolean;
|
|
112
|
+
/** This runtime's own IANA time zone, or undefined where `Intl` gives none. */
|
|
113
|
+
export declare function GetLocalTimeZone(): string | undefined;
|
|
114
|
+
/** True when `token` is one of {@link CONTEXT_TOKENS}. */
|
|
115
|
+
export declare function IsContextToken(token: string | null | undefined): token is ContextToken;
|
|
116
|
+
/**
|
|
117
|
+
* Works out a property default: the fixed value, or the token resolved by {@link ResolveContextToken}.
|
|
118
|
+
* @throws when the default is malformed (see {@link ValidatePropertyDefault}) or the token cannot be resolved
|
|
119
|
+
*/
|
|
120
|
+
export declare function ResolvePropertyDefault(def: PropertyDefault, ctx: PropertyResolutionContext): PropertyValue;
|
|
121
|
+
/**
|
|
122
|
+
* Works out one context token.
|
|
123
|
+
* @returns the user's ID, email or name; a `YYYY-MM-DD` date in the context's zone; or, for
|
|
124
|
+
* `Context.Now`, an ISO 8601 instant
|
|
125
|
+
* @throws on an unknown token, a bad offset, an offset on a user token, a user token with no
|
|
126
|
+
* context user, or an invalid time zone
|
|
127
|
+
*/
|
|
128
|
+
export declare function ResolveContextToken(token: ContextToken, offset: PropertyDefaultOffset | undefined, ctx: PropertyResolutionContext): string;
|
|
129
|
+
/**
|
|
130
|
+
* Checks a property default against the property's type, as when the definition is saved.
|
|
131
|
+
* @returns the problems found; empty when the default is valid
|
|
132
|
+
*/
|
|
133
|
+
export declare function ValidatePropertyDefault(def: PropertyDefault, type: PropertyValueType): string[];
|
|
134
|
+
/** True when a value fits the property type: a finite number, a boolean, a valid UUID or ISO date, or a string. Null fits every type. */
|
|
135
|
+
export declare function IsPropertyValueOfType(value: PropertyValue, type: PropertyValueType): boolean;
|
|
136
|
+
//# sourceMappingURL=contextTokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextTokens.d.ts","sourceRoot":"","sources":["../../src/generic/contextTokens.ts"],"names":[],"mappings":"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"}
|