@memberjunction/core-entities 6.1.2 → 6.2.0-edge.0

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.
@@ -17844,7 +17844,7 @@ export const MJEntityDocumentSchema = z.object({
17844
17844
  * * Display Name: Entity
17845
17845
  * * SQL Data Type: uniqueidentifier
17846
17846
  * * Related Entity/Foreign Key: MJ: Entities (vwEntities.ID)`),
17847
- VectorDatabaseID: z.string().describe(`
17847
+ VectorDatabaseID: z.string().nullable().describe(`
17848
17848
  * * Field Name: VectorDatabaseID
17849
17849
  * * Display Name: Vector Database
17850
17850
  * * SQL Data Type: uniqueidentifier
@@ -17863,7 +17863,7 @@ export const MJEntityDocumentSchema = z.object({
17863
17863
  * * Display Name: Template
17864
17864
  * * SQL Data Type: uniqueidentifier
17865
17865
  * * Related Entity/Foreign Key: MJ: Templates (vwTemplates.ID)`),
17866
- AIModelID: z.string().describe(`
17866
+ AIModelID: z.string().nullable().describe(`
17867
17867
  * * Field Name: AIModelID
17868
17868
  * * Display Name: AI Model
17869
17869
  * * SQL Data Type: uniqueidentifier
@@ -17953,7 +17953,7 @@ export const MJEntityDocumentSchema = z.object({
17953
17953
  * * Field Name: Entity
17954
17954
  * * Display Name: Entity Name
17955
17955
  * * SQL Data Type: nvarchar(255)`),
17956
- VectorDatabase: z.string().describe(`
17956
+ VectorDatabase: z.string().nullable().describe(`
17957
17957
  * * Field Name: VectorDatabase
17958
17958
  * * Display Name: Vector Database Name
17959
17959
  * * SQL Data Type: nvarchar(100)`),
@@ -17961,7 +17961,7 @@ export const MJEntityDocumentSchema = z.object({
17961
17961
  * * Field Name: Template
17962
17962
  * * Display Name: Template Name
17963
17963
  * * SQL Data Type: nvarchar(255)`),
17964
- AIModel: z.string().describe(`
17964
+ AIModel: z.string().nullable().describe(`
17965
17965
  * * Field Name: AIModel
17966
17966
  * * Display Name: AI Model Name
17967
17967
  * * SQL Data Type: nvarchar(50)`),
@@ -18541,6 +18541,16 @@ export const MJEntityFieldSchema = z.object({
18541
18541
  * * SQL Data Type: nvarchar(MAX)
18542
18542
  * * JSON Type: MJEntityFieldEntity_IEntityFieldConfiguration
18543
18543
  * * Description: Optional JSON configuration bag defining field-level policies and capabilities (shape = IEntityFieldConfiguration). Includes Hierarchy options (IsHierarchy, MaxDepth) to explicitly declare recursive tree hierarchies.`),
18544
+ RelatedEntityFilter: z.string().nullable().describe(`
18545
+ * * Field Name: RelatedEntityFilter
18546
+ * * Display Name: Related Entity Filter
18547
+ * * SQL Data Type: nvarchar(MAX)
18548
+ * * Description: Optional SQL WHERE fragment applied to every lookup on this foreign key (e.g. Status = 'Active'), AND-ed with whatever the user types, on both the browse list and the search path. Lets a picker be scoped from metadata rather than from every form template that renders the field. Authored by hand — CodeGen never derives or overwrites it. NULL means no filter, which is the pre-feature behaviour.`),
18549
+ RelatedEntityOrderBy: z.string().nullable().describe(`
18550
+ * * Field Name: RelatedEntityOrderBy
18551
+ * * Display Name: Related Entity Order By
18552
+ * * SQL Data Type: nvarchar(500)
18553
+ * * Description: Optional ORDER BY fragment for the empty-query browse list on this foreign key, e.g. [Name] or [LastActivityDate] DESC. Does not affect the typed-query path, which is ordered by search relevance. Authored by hand — CodeGen never derives or overwrites it. NULL means order by the related entity's name field.`),
18544
18554
  FieldCodeName: z.string().nullable().describe(`
18545
18555
  * * Field Name: FieldCodeName
18546
18556
  * * Display Name: Field Code Name
@@ -19943,6 +19953,256 @@ export const MJExternalDataSourceSchema = z.object({
19943
19953
  * * Display Name: Credential
19944
19954
  * * SQL Data Type: nvarchar(200)`),
19945
19955
  });
19956
+ /**
19957
+ * zod schema definition for the entity MJ: Feature Value Caches
19958
+ */
19959
+ export const MJFeatureValueCacheSchema = z.object({
19960
+ ID: z.string().describe(`
19961
+ * * Field Name: ID
19962
+ * * Display Name: ID
19963
+ * * SQL Data Type: uniqueidentifier
19964
+ * * Default Value: newsequentialid()
19965
+ * * Description: Unique identifier for this feature value cache entry.`),
19966
+ RecordProcessID: z.string().nullable().describe(`
19967
+ * * Field Name: RecordProcessID
19968
+ * * Display Name: Record Process
19969
+ * * SQL Data Type: uniqueidentifier
19970
+ * * Related Entity/Foreign Key: MJ: Record Processes (vwRecordProcesses.ID)
19971
+ * * Description: Optional reference to the RecordProcess that produced this cache entry. When NULL, the cached result is scoped by PromptID only and shared across pipelines using the same prompt.`),
19972
+ PromptID: z.string().describe(`
19973
+ * * Field Name: PromptID
19974
+ * * Display Name: Prompt
19975
+ * * SQL Data Type: uniqueidentifier
19976
+ * * Related Entity/Foreign Key: MJ: AI Prompts (vwAIPrompts.ID)
19977
+ * * Description: Reference to the AI Prompt used to compute this cached entry.`),
19978
+ PromptVersionHash: z.string().describe(`
19979
+ * * Field Name: PromptVersionHash
19980
+ * * Display Name: Prompt Version Hash
19981
+ * * SQL Data Type: nvarchar(64)
19982
+ * * Description: SHA-256 content hash of the rendered prompt template, output schema, and constraint instructions at execution time.`),
19983
+ ConstraintHash: z.string().describe(`
19984
+ * * Field Name: ConstraintHash
19985
+ * * Display Name: Constraint Hash
19986
+ * * SQL Data Type: nvarchar(64)
19987
+ * * Description: SHA-256 hash of the output value constraint definitions. Changes to allowed enum values or ranges invalidate cached results.`),
19988
+ KeyHash: z.string().describe(`
19989
+ * * Field Name: KeyHash
19990
+ * * Display Name: Key Hash
19991
+ * * SQL Data Type: nvarchar(64)
19992
+ * * Description: SHA-256 hash over the canonicalized JSON key field values. The primary lookup key.`),
19993
+ KeyDisplay: z.string().nullable().describe(`
19994
+ * * Field Name: KeyDisplay
19995
+ * * Display Name: Key Display
19996
+ * * SQL Data Type: nvarchar(500)
19997
+ * * Description: Human-readable plain text display of the key (e.g. "Senior Director, Field Marketing"). Makes this table legible as reference data.`),
19998
+ KeyJSON: z.string().describe(`
19999
+ * * Field Name: KeyJSON
20000
+ * * Display Name: Key JSON
20001
+ * * SQL Data Type: nvarchar(MAX)
20002
+ * * Description: Full JSON representation of the input key fields and their values.`),
20003
+ OutputsJSON: z.string().describe(`
20004
+ * * Field Name: OutputsJSON
20005
+ * * Display Name: Outputs JSON
20006
+ * * SQL Data Type: nvarchar(MAX)
20007
+ * * Description: Cached computed outputs JSON fragment. Stored directly so archival of AI Prompt Runs does not lose cached values.`),
20008
+ Reasoning: z.string().nullable().describe(`
20009
+ * * Field Name: Reasoning
20010
+ * * Display Name: Reasoning
20011
+ * * SQL Data Type: nvarchar(MAX)
20012
+ * * Description: Optional model reasoning or rationale captured from the prompt execution.`),
20013
+ AIPromptRunID: z.string().nullable().describe(`
20014
+ * * Field Name: AIPromptRunID
20015
+ * * Display Name: AI Prompt Run
20016
+ * * SQL Data Type: uniqueidentifier
20017
+ * * Description: Soft reference to the AI Prompt Run that first computed and populated this cached result.`),
20018
+ HitCount: z.number().describe(`
20019
+ * * Field Name: HitCount
20020
+ * * Display Name: Hit Count
20021
+ * * SQL Data Type: int
20022
+ * * Default Value: 0
20023
+ * * Description: Total number of times this cached result has been served to skip an LLM invocation.`),
20024
+ LastHitAt: z.date().nullable().describe(`
20025
+ * * Field Name: LastHitAt
20026
+ * * Display Name: Last Hit At
20027
+ * * SQL Data Type: datetimeoffset
20028
+ * * Description: Timestamp when this cached entry was last read and served.`),
20029
+ ComputedAt: z.date().describe(`
20030
+ * * Field Name: ComputedAt
20031
+ * * Display Name: Computed At
20032
+ * * SQL Data Type: datetimeoffset
20033
+ * * Default Value: sysdatetimeoffset()
20034
+ * * Description: Timestamp when this cached entry was originally computed.`),
20035
+ ExpiresAt: z.date().nullable().describe(`
20036
+ * * Field Name: ExpiresAt
20037
+ * * Display Name: Expires At
20038
+ * * SQL Data Type: datetimeoffset
20039
+ * * Description: Optional expiration timestamp for time-to-live invalidation. NULL means no expiration.`),
20040
+ __mj_CreatedAt: z.date().describe(`
20041
+ * * Field Name: __mj_CreatedAt
20042
+ * * Display Name: Created At
20043
+ * * SQL Data Type: datetimeoffset
20044
+ * * Default Value: getutcdate()
20045
+ * * Description: Timestamp when this record was created.`),
20046
+ __mj_UpdatedAt: z.date().describe(`
20047
+ * * Field Name: __mj_UpdatedAt
20048
+ * * Display Name: Updated At
20049
+ * * SQL Data Type: datetimeoffset
20050
+ * * Default Value: getutcdate()
20051
+ * * Description: Timestamp when this record was last updated.`),
20052
+ RecordProcess: z.string().nullable().describe(`
20053
+ * * Field Name: RecordProcess
20054
+ * * Display Name: Record Process Name
20055
+ * * SQL Data Type: nvarchar(255)`),
20056
+ Prompt: z.string().describe(`
20057
+ * * Field Name: Prompt
20058
+ * * Display Name: Prompt Name
20059
+ * * SQL Data Type: nvarchar(255)`),
20060
+ });
20061
+ /**
20062
+ * zod schema definition for the entity MJ: Feature Values
20063
+ */
20064
+ export const MJFeatureValueSchema = z.object({
20065
+ ID: z.string().describe(`
20066
+ * * Field Name: ID
20067
+ * * Display Name: ID
20068
+ * * SQL Data Type: uniqueidentifier
20069
+ * * Default Value: newsequentialid()
20070
+ * * Description: Unique identifier for this feature value history record.`),
20071
+ RecordProcessID: z.string().describe(`
20072
+ * * Field Name: RecordProcessID
20073
+ * * Display Name: Record Process
20074
+ * * SQL Data Type: uniqueidentifier
20075
+ * * Related Entity/Foreign Key: MJ: Record Processes (vwRecordProcesses.ID)
20076
+ * * Description: The Record Process (Feature Pipeline) that computed this feature value.`),
20077
+ EntityID: z.string().describe(`
20078
+ * * Field Name: EntityID
20079
+ * * Display Name: Entity
20080
+ * * SQL Data Type: uniqueidentifier
20081
+ * * Related Entity/Foreign Key: MJ: Entities (vwEntities.ID)
20082
+ * * Description: The entity of the record this feature was computed for.`),
20083
+ RecordID: z.string().describe(`
20084
+ * * Field Name: RecordID
20085
+ * * Display Name: Record ID
20086
+ * * SQL Data Type: nvarchar(900)
20087
+ * * Description: Serialized primary key of the record this feature was computed for. Matches ProcessRunDetail.RecordID.`),
20088
+ FeatureName: z.string().describe(`
20089
+ * * Field Name: FeatureName
20090
+ * * Display Name: Feature Name
20091
+ * * SQL Data Type: nvarchar(255)
20092
+ * * Description: Name of the feature, matching DataFeatureOutput.Name.`),
20093
+ ValueText: z.string().nullable().describe(`
20094
+ * * Field Name: ValueText
20095
+ * * Display Name: Value (Text)
20096
+ * * SQL Data Type: nvarchar(MAX)
20097
+ * * Description: Computed value as text, for text and categorical features.`),
20098
+ ValueNumeric: z.number().nullable().describe(`
20099
+ * * Field Name: ValueNumeric
20100
+ * * Display Name: Value (Numeric)
20101
+ * * SQL Data Type: float(53)
20102
+ * * Description: Computed value as floating-point numeric, for numeric and score features.`),
20103
+ ValueDate: z.date().nullable().describe(`
20104
+ * * Field Name: ValueDate
20105
+ * * Display Name: Value (Date)
20106
+ * * SQL Data Type: datetimeoffset
20107
+ * * Description: Computed value as datetimeoffset, for date and timestamp features.`),
20108
+ ValueBoolean: z.boolean().nullable().describe(`
20109
+ * * Field Name: ValueBoolean
20110
+ * * Display Name: Value (Boolean)
20111
+ * * SQL Data Type: bit
20112
+ * * Description: Computed value as boolean bit flag.`),
20113
+ ValueJSON: z.string().nullable().describe(`
20114
+ * * Field Name: ValueJSON
20115
+ * * Display Name: Value (JSON)
20116
+ * * SQL Data Type: nvarchar(MAX)
20117
+ * * Description: Computed value as raw JSON string, for array or complex object features.`),
20118
+ Reasoning: z.string().nullable().describe(`
20119
+ * * Field Name: Reasoning
20120
+ * * Display Name: Reasoning
20121
+ * * SQL Data Type: nvarchar(MAX)
20122
+ * * Description: Optional model reasoning or rationale captured from the prompt execution.`),
20123
+ Confidence: z.number().nullable().describe(`
20124
+ * * Field Name: Confidence
20125
+ * * Display Name: Confidence
20126
+ * * SQL Data Type: float(53)
20127
+ * * Description: Optional confidence score associated with this computed value.`),
20128
+ PromptID: z.string().nullable().describe(`
20129
+ * * Field Name: PromptID
20130
+ * * Display Name: Prompt
20131
+ * * SQL Data Type: uniqueidentifier
20132
+ * * Related Entity/Foreign Key: MJ: AI Prompts (vwAIPrompts.ID)
20133
+ * * Description: Reference to the AI Prompt used to compute this feature value.`),
20134
+ PromptVersionHash: z.string().nullable().describe(`
20135
+ * * Field Name: PromptVersionHash
20136
+ * * Display Name: Prompt Version Hash
20137
+ * * SQL Data Type: nvarchar(64)
20138
+ * * Description: SHA-256 content hash of the rendered prompt template and instructions at execution time.`),
20139
+ ConstraintHash: z.string().nullable().describe(`
20140
+ * * Field Name: ConstraintHash
20141
+ * * Display Name: Constraint Hash
20142
+ * * SQL Data Type: nvarchar(64)
20143
+ * * Description: SHA-256 hash of the value constraint definitions in effect when this feature was computed.`),
20144
+ ProcessRunID: z.string().nullable().describe(`
20145
+ * * Field Name: ProcessRunID
20146
+ * * Display Name: Process Run
20147
+ * * SQL Data Type: uniqueidentifier
20148
+ * * Related Entity/Foreign Key: MJ: Process Runs (vwProcessRuns.ID)
20149
+ * * Description: Reference to the Process Run during which this feature was computed.`),
20150
+ ProcessRunDetailID: z.string().nullable().describe(`
20151
+ * * Field Name: ProcessRunDetailID
20152
+ * * Display Name: Process Run Detail
20153
+ * * SQL Data Type: uniqueidentifier
20154
+ * * Related Entity/Foreign Key: MJ: Process Run Details (vwProcessRunDetails.ID)
20155
+ * * Description: Reference to the specific Process Run Detail row for this record execution.`),
20156
+ AIPromptRunID: z.string().nullable().describe(`
20157
+ * * Field Name: AIPromptRunID
20158
+ * * Display Name: AI Prompt Run
20159
+ * * SQL Data Type: uniqueidentifier
20160
+ * * Description: Soft reference to the AI Prompt Run that computed this value.`),
20161
+ FeatureValueCacheID: z.string().nullable().describe(`
20162
+ * * Field Name: FeatureValueCacheID
20163
+ * * Display Name: Feature Value Cache
20164
+ * * SQL Data Type: uniqueidentifier
20165
+ * * Related Entity/Foreign Key: MJ: Feature Value Caches (vwFeatureValueCaches.ID)
20166
+ * * Description: Optional reference to the FeatureValueCache entry if this value was served from cache.`),
20167
+ ComputedAt: z.date().describe(`
20168
+ * * Field Name: ComputedAt
20169
+ * * Display Name: Computed At
20170
+ * * SQL Data Type: datetimeoffset
20171
+ * * Default Value: sysdatetimeoffset()
20172
+ * * Description: Timestamp when this feature value was computed.`),
20173
+ __mj_CreatedAt: z.date().describe(`
20174
+ * * Field Name: __mj_CreatedAt
20175
+ * * Display Name: Created At
20176
+ * * SQL Data Type: datetimeoffset
20177
+ * * Default Value: getutcdate()
20178
+ * * Description: Timestamp when this record was created.`),
20179
+ __mj_UpdatedAt: z.date().describe(`
20180
+ * * Field Name: __mj_UpdatedAt
20181
+ * * Display Name: Updated At
20182
+ * * SQL Data Type: datetimeoffset
20183
+ * * Default Value: getutcdate()
20184
+ * * Description: Timestamp when this record was last updated.`),
20185
+ RecordProcess: z.string().describe(`
20186
+ * * Field Name: RecordProcess
20187
+ * * Display Name: Record Process
20188
+ * * SQL Data Type: nvarchar(255)`),
20189
+ Entity: z.string().describe(`
20190
+ * * Field Name: Entity
20191
+ * * Display Name: Entity
20192
+ * * SQL Data Type: nvarchar(255)`),
20193
+ Prompt: z.string().nullable().describe(`
20194
+ * * Field Name: Prompt
20195
+ * * Display Name: Prompt
20196
+ * * SQL Data Type: nvarchar(255)`),
20197
+ ProcessRunDetail: z.string().nullable().describe(`
20198
+ * * Field Name: ProcessRunDetail
20199
+ * * Display Name: Process Run Detail
20200
+ * * SQL Data Type: nvarchar(450)`),
20201
+ FeatureValueCache: z.string().nullable().describe(`
20202
+ * * Field Name: FeatureValueCache
20203
+ * * Display Name: Feature Value Cache
20204
+ * * SQL Data Type: nvarchar(500)`),
20205
+ });
19946
20206
  /**
19947
20207
  * zod schema definition for the entity MJ: File Categories
19948
20208
  */
@@ -25053,6 +25313,12 @@ export const MJQuerySchema = z.object({
25053
25313
  * * SQL Data Type: bit
25054
25314
  * * Default Value: 0
25055
25315
  * * Description: Author's declared intent that this Query should be materialized. CodeGen scans for IsMaterialized = 1 and, if the query qualifies (§9/§10), materializes it. The authoritative state lives on the linked MJ: Materialized Results row (found via the MaterializedResultQuery join table).`),
25316
+ Configuration: z.any().nullable().describe(`
25317
+ * * Field Name: Configuration
25318
+ * * Display Name: Configuration
25319
+ * * SQL Data Type: nvarchar(MAX)
25320
+ * * JSON Type: MJQueryEntity_IQueryConfiguration
25321
+ * * Description: Optional JSON configuration bag defining query-level policies and semantic capabilities (shape = IQueryConfiguration). Includes Priority (1-100) for ground-truth ranking in the semantic layer, LogExecution to control query execution logging, AlternativeQuestions for multi-phrasing vector recall, UsageGuidance and WhenNotToUse bounds for AI agents, and DomainScope.`),
25056
25322
  Category: z.string().nullable().describe(`
25057
25323
  * * Field Name: Category
25058
25324
  * * Display Name: Category Name
@@ -31421,10 +31687,11 @@ export const MJTestSchema = z.object({
31421
31687
  * * Display Name: Expected Outcomes
31422
31688
  * * SQL Data Type: nvarchar(MAX)
31423
31689
  * * Description: JSON object defining what success looks like. Structure varies by test type (e.g., for Agent Eval: {toolCalls, outputFormat, semanticGoals, dataAssertions})`),
31424
- Configuration: z.string().nullable().describe(`
31690
+ Configuration: z.any().nullable().describe(`
31425
31691
  * * Field Name: Configuration
31426
31692
  * * Display Name: Configuration
31427
31693
  * * SQL Data Type: nvarchar(MAX)
31694
+ * * JSON Type: MJTestEntity_ITestConfiguration
31428
31695
  * * Description: JSON object for test-specific configuration (e.g., oracles to use, rubrics, retry policies, timeout settings)`),
31429
31696
  Tags: z.string().nullable().describe(`
31430
31697
  * * Field Name: Tags
@@ -33402,6 +33669,99 @@ export const MJViewTypeSchema = z.object({
33402
33669
  * * SQL Data Type: datetimeoffset
33403
33670
  * * Default Value: getutcdate()`),
33404
33671
  });
33672
+ /**
33673
+ * zod schema definition for the entity MJ: Web Search Providers
33674
+ */
33675
+ export const MJWebSearchProviderSchema = z.object({
33676
+ ID: z.string().describe(`
33677
+ * * Field Name: ID
33678
+ * * Display Name: ID
33679
+ * * SQL Data Type: uniqueidentifier
33680
+ * * Default Value: newsequentialid()`),
33681
+ Name: z.string().describe(`
33682
+ * * Field Name: Name
33683
+ * * Display Name: Name
33684
+ * * SQL Data Type: nvarchar(200)
33685
+ * * Description: Administrator-facing name for this provider, e.g. "Brave" or "Tavily". Unique, and usable as the Provider value when a caller pins a search to one vendor.`),
33686
+ Description: z.string().nullable().describe(`
33687
+ * * Field Name: Description
33688
+ * * Display Name: Description
33689
+ * * SQL Data Type: nvarchar(MAX)
33690
+ * * Description: What this provider searches, what it costs, and when it is the right choice.`),
33691
+ DriverClass: z.string().describe(`
33692
+ * * Field Name: DriverClass
33693
+ * * Display Name: Driver Class
33694
+ * * SQL Data Type: nvarchar(500)
33695
+ * * Description: ClassFactory key used with @RegisterClass(BaseWebSearchProvider, DriverClass) to instantiate the driver at runtime, e.g. "BraveWebSearchProvider". A value with no matching registration leaves the provider unavailable and is logged at engine startup.`),
33696
+ Status: z.union([z.literal('Active'), z.literal('Pending'), z.literal('Terminated')]).describe(`
33697
+ * * Field Name: Status
33698
+ * * Display Name: Status
33699
+ * * SQL Data Type: nvarchar(20)
33700
+ * * Default Value: Active
33701
+ * * Value List Type: List
33702
+ * * Possible Values
33703
+ * * Active
33704
+ * * Pending
33705
+ * * Terminated
33706
+ * * Description: Provider lifecycle status: Pending (configured but not yet in use), Active (participates in searches), Terminated (disabled). Only Active providers are loaded. Matches the vocabulary used by SearchProvider.`),
33707
+ Priority: z.number().describe(`
33708
+ * * Field Name: Priority
33709
+ * * Display Name: Priority
33710
+ * * SQL Data Type: int
33711
+ * * Default Value: 0
33712
+ * * Description: Failover order: LOWER values are tried FIRST. The engine serves a search from the first available provider in this order, moving on only when one fails transiently. Must be >= 0.`),
33713
+ CredentialID: z.string().nullable().describe(`
33714
+ * * Field Name: CredentialID
33715
+ * * Display Name: Credential ID
33716
+ * * SQL Data Type: uniqueidentifier
33717
+ * * Related Entity/Foreign Key: MJ: Credentials (vwCredentials.ID)
33718
+ * * Description: Optional FK to the Credential record holding this provider's API key. When NULL the driver falls back to its documented environment variable, so a host that has not yet migrated its secrets into the Credential store keeps working.`),
33719
+ ProviderConfig: z.string().nullable().describe(`
33720
+ * * Field Name: ProviderConfig
33721
+ * * Display Name: Provider Config
33722
+ * * SQL Data Type: nvarchar(MAX)
33723
+ * * Description: Optional JSON blob of non-secret, driver-specific settings (endpoint overrides, tier flags, answer model). Schema is defined by each driver; invalid JSON is logged and ignored rather than disabling the provider.`),
33724
+ MaxResultsOverride: z.number().nullable().describe(`
33725
+ * * Field Name: MaxResultsOverride
33726
+ * * Display Name: Max Results Override
33727
+ * * SQL Data Type: int
33728
+ * * Description: Optional per-provider cap on results per request, for pay-per-query vendors. The effective cap is the smallest of the caller's request, this value, and the vendor's own hard limit. NULL means the driver's own limit applies.`),
33729
+ AllowResultCaching: z.boolean().describe(`
33730
+ * * Field Name: AllowResultCaching
33731
+ * * Display Name: Allow Result Caching
33732
+ * * SQL Data Type: bit
33733
+ * * Default Value: 0
33734
+ * * Description: Whether this vendor's terms permit storing returned results. Defaults to 0 (deny), because caching rights differ sharply between vendors and violating them is silent: some sell storage rights as a plan tier, others forbid persistent caching outright. Nothing in the engine caches today; this column exists so the first caching layer reads a per-provider gate instead of inventing one.`),
33735
+ DisplayName: z.string().nullable().describe(`
33736
+ * * Field Name: DisplayName
33737
+ * * Display Name: Display Name
33738
+ * * SQL Data Type: nvarchar(200)
33739
+ * * Description: UI display name shown in admin surfaces and result attribution. When NULL, falls back to the Name column.`),
33740
+ Icon: z.string().nullable().describe(`
33741
+ * * Field Name: Icon
33742
+ * * Display Name: Icon
33743
+ * * SQL Data Type: nvarchar(200)
33744
+ * * Description: CSS icon class for UI display, e.g. "fa-brands fa-brave". Supports any CSS-based icon library. When NULL a default icon is used.`),
33745
+ Comments: z.string().nullable().describe(`
33746
+ * * Field Name: Comments
33747
+ * * Display Name: Comments
33748
+ * * SQL Data Type: nvarchar(MAX)
33749
+ * * Description: Free-form administrator notes, e.g. contract terms, billing owner, or why this provider sits at its priority.`),
33750
+ __mj_CreatedAt: z.date().describe(`
33751
+ * * Field Name: __mj_CreatedAt
33752
+ * * Display Name: Created At
33753
+ * * SQL Data Type: datetimeoffset
33754
+ * * Default Value: getutcdate()`),
33755
+ __mj_UpdatedAt: z.date().describe(`
33756
+ * * Field Name: __mj_UpdatedAt
33757
+ * * Display Name: Updated At
33758
+ * * SQL Data Type: datetimeoffset
33759
+ * * Default Value: getutcdate()`),
33760
+ Credential: z.string().nullable().describe(`
33761
+ * * Field Name: Credential
33762
+ * * Display Name: Credential
33763
+ * * SQL Data Type: nvarchar(200)`),
33764
+ });
33405
33765
  /**
33406
33766
  * zod schema definition for the entity MJ: Workspace Items
33407
33767
  */
@@ -39051,6 +39411,7 @@ let MJAIAgentRunStepEntity = class MJAIAgentRunStepEntity extends BaseEntity {
39051
39411
  /**
39052
39412
  * Validate() method override for MJ: AI Agent Run Steps entity. This is an auto-generated method that invokes the generated validators for this entity for the following fields:
39053
39413
  * * FinalPayloadValidationResult: The final payload validation result must be one of the approved statuses: Warn, Fail, Retry, or Pass, to ensure consistent reporting of validation outcomes.
39414
+ * * NativeToolCallCount: The native tool call count must be greater than or equal to zero, if it is specified.
39054
39415
  * * StepNumber: This rule ensures that the step number must be greater than zero.
39055
39416
  * @public
39056
39417
  * @method
@@ -39059,6 +39420,7 @@ let MJAIAgentRunStepEntity = class MJAIAgentRunStepEntity extends BaseEntity {
39059
39420
  Validate() {
39060
39421
  const result = super.Validate();
39061
39422
  this.ValidateFinalPayloadValidationResultStatus(result);
39423
+ this.ValidateNativeToolCallCountGreaterThanOrEqualToZero(result);
39062
39424
  this.ValidateStepNumberGreaterThanZero(result);
39063
39425
  result.Success = result.Success && (result.Errors.length === 0);
39064
39426
  return result;
@@ -39078,6 +39440,17 @@ let MJAIAgentRunStepEntity = class MJAIAgentRunStepEntity extends BaseEntity {
39078
39440
  }
39079
39441
  }
39080
39442
  /**
39443
+ * The native tool call count must be greater than or equal to zero, if it is specified.
39444
+ * @param result - the ValidationResult object to add any errors or warnings to
39445
+ * @public
39446
+ * @method
39447
+ */
39448
+ ValidateNativeToolCallCountGreaterThanOrEqualToZero(result) {
39449
+ if (this.NativeToolCallCount != null && this.NativeToolCallCount < 0) {
39450
+ result.Errors.push(new ValidationErrorInfo("NativeToolCallCount", "The native tool call count must be 0 or greater.", this.NativeToolCallCount, ValidationErrorType.Failure));
39451
+ }
39452
+ }
39453
+ /**
39081
39454
  * This rule ensures that the step number must be greater than zero.
39082
39455
  * @param result - the ValidationResult object to add any errors or warnings to
39083
39456
  * @public
@@ -80343,6 +80716,30 @@ let MJEntityFieldEntity = class MJEntityFieldEntity extends BaseEntity {
80343
80716
  this._ConfigurationObject_lastRaw = raw;
80344
80717
  }
80345
80718
  /**
80719
+ * * Field Name: RelatedEntityFilter
80720
+ * * Display Name: Related Entity Filter
80721
+ * * SQL Data Type: nvarchar(MAX)
80722
+ * * Description: Optional SQL WHERE fragment applied to every lookup on this foreign key (e.g. Status = 'Active'), AND-ed with whatever the user types, on both the browse list and the search path. Lets a picker be scoped from metadata rather than from every form template that renders the field. Authored by hand — CodeGen never derives or overwrites it. NULL means no filter, which is the pre-feature behaviour.
80723
+ */
80724
+ get RelatedEntityFilter() {
80725
+ return this.Get('RelatedEntityFilter');
80726
+ }
80727
+ set RelatedEntityFilter(value) {
80728
+ this.Set('RelatedEntityFilter', value);
80729
+ }
80730
+ /**
80731
+ * * Field Name: RelatedEntityOrderBy
80732
+ * * Display Name: Related Entity Order By
80733
+ * * SQL Data Type: nvarchar(500)
80734
+ * * Description: Optional ORDER BY fragment for the empty-query browse list on this foreign key, e.g. [Name] or [LastActivityDate] DESC. Does not affect the typed-query path, which is ordered by search relevance. Authored by hand — CodeGen never derives or overwrites it. NULL means order by the related entity's name field.
80735
+ */
80736
+ get RelatedEntityOrderBy() {
80737
+ return this.Get('RelatedEntityOrderBy');
80738
+ }
80739
+ set RelatedEntityOrderBy(value) {
80740
+ this.Set('RelatedEntityOrderBy', value);
80741
+ }
80742
+ /**
80346
80743
  * * Field Name: FieldCodeName
80347
80744
  * * Display Name: Field Code Name
80348
80745
  * * SQL Data Type: nvarchar(MAX)
@@ -83804,6 +84201,601 @@ MJExternalDataSourceEntity = __decorate([
83804
84201
  RegisterClass(BaseEntity, 'MJ: External Data Sources')
83805
84202
  ], MJExternalDataSourceEntity);
83806
84203
  export { MJExternalDataSourceEntity };
84204
+ /**
84205
+ * MJ: Feature Value Caches - strongly typed entity sub-class
84206
+ * * Schema: __mj
84207
+ * * Base Table: FeatureValueCache
84208
+ * * Base View: vwFeatureValueCaches
84209
+ * * @description Dedup dictionary table for Feature Pipelines. Caches computed outputs by canonical input key hash, prompt version, and constraint hash. Distinct input strings (e.g. unique job titles) are computed once and reused across all matching records.
84210
+ * * Primary Key: ID
84211
+ * @extends {BaseEntity}
84212
+ * @class
84213
+ * @public
84214
+ */
84215
+ let MJFeatureValueCacheEntity = class MJFeatureValueCacheEntity extends BaseEntity {
84216
+ /**
84217
+ * Loads the MJ: Feature Value Caches record from the database
84218
+ * @param ID: string - primary key value to load the MJ: Feature Value Caches record.
84219
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
84220
+ * @returns {Promise<boolean>} - true if successful, false otherwise
84221
+ * @public
84222
+ * @async
84223
+ * @memberof MJFeatureValueCacheEntity
84224
+ * @method
84225
+ * @override
84226
+ */
84227
+ async Load(ID, EntityRelationshipsToLoad) {
84228
+ const compositeKey = new CompositeKey();
84229
+ compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: ID });
84230
+ return await super.InnerLoad(compositeKey, EntityRelationshipsToLoad);
84231
+ }
84232
+ /**
84233
+ * * Field Name: ID
84234
+ * * Display Name: ID
84235
+ * * SQL Data Type: uniqueidentifier
84236
+ * * Default Value: newsequentialid()
84237
+ * * Description: Unique identifier for this feature value cache entry.
84238
+ */
84239
+ get ID() {
84240
+ return this.Get('ID');
84241
+ }
84242
+ set ID(value) {
84243
+ this.Set('ID', value);
84244
+ }
84245
+ /**
84246
+ * * Field Name: RecordProcessID
84247
+ * * Display Name: Record Process
84248
+ * * SQL Data Type: uniqueidentifier
84249
+ * * Related Entity/Foreign Key: MJ: Record Processes (vwRecordProcesses.ID)
84250
+ * * Description: Optional reference to the RecordProcess that produced this cache entry. When NULL, the cached result is scoped by PromptID only and shared across pipelines using the same prompt.
84251
+ */
84252
+ get RecordProcessID() {
84253
+ return this.Get('RecordProcessID');
84254
+ }
84255
+ set RecordProcessID(value) {
84256
+ this.Set('RecordProcessID', value);
84257
+ }
84258
+ /**
84259
+ * * Field Name: PromptID
84260
+ * * Display Name: Prompt
84261
+ * * SQL Data Type: uniqueidentifier
84262
+ * * Related Entity/Foreign Key: MJ: AI Prompts (vwAIPrompts.ID)
84263
+ * * Description: Reference to the AI Prompt used to compute this cached entry.
84264
+ */
84265
+ get PromptID() {
84266
+ return this.Get('PromptID');
84267
+ }
84268
+ set PromptID(value) {
84269
+ this.Set('PromptID', value);
84270
+ }
84271
+ /**
84272
+ * * Field Name: PromptVersionHash
84273
+ * * Display Name: Prompt Version Hash
84274
+ * * SQL Data Type: nvarchar(64)
84275
+ * * Description: SHA-256 content hash of the rendered prompt template, output schema, and constraint instructions at execution time.
84276
+ */
84277
+ get PromptVersionHash() {
84278
+ return this.Get('PromptVersionHash');
84279
+ }
84280
+ set PromptVersionHash(value) {
84281
+ this.Set('PromptVersionHash', value);
84282
+ }
84283
+ /**
84284
+ * * Field Name: ConstraintHash
84285
+ * * Display Name: Constraint Hash
84286
+ * * SQL Data Type: nvarchar(64)
84287
+ * * Description: SHA-256 hash of the output value constraint definitions. Changes to allowed enum values or ranges invalidate cached results.
84288
+ */
84289
+ get ConstraintHash() {
84290
+ return this.Get('ConstraintHash');
84291
+ }
84292
+ set ConstraintHash(value) {
84293
+ this.Set('ConstraintHash', value);
84294
+ }
84295
+ /**
84296
+ * * Field Name: KeyHash
84297
+ * * Display Name: Key Hash
84298
+ * * SQL Data Type: nvarchar(64)
84299
+ * * Description: SHA-256 hash over the canonicalized JSON key field values. The primary lookup key.
84300
+ */
84301
+ get KeyHash() {
84302
+ return this.Get('KeyHash');
84303
+ }
84304
+ set KeyHash(value) {
84305
+ this.Set('KeyHash', value);
84306
+ }
84307
+ /**
84308
+ * * Field Name: KeyDisplay
84309
+ * * Display Name: Key Display
84310
+ * * SQL Data Type: nvarchar(500)
84311
+ * * Description: Human-readable plain text display of the key (e.g. "Senior Director, Field Marketing"). Makes this table legible as reference data.
84312
+ */
84313
+ get KeyDisplay() {
84314
+ return this.Get('KeyDisplay');
84315
+ }
84316
+ set KeyDisplay(value) {
84317
+ this.Set('KeyDisplay', value);
84318
+ }
84319
+ /**
84320
+ * * Field Name: KeyJSON
84321
+ * * Display Name: Key JSON
84322
+ * * SQL Data Type: nvarchar(MAX)
84323
+ * * Description: Full JSON representation of the input key fields and their values.
84324
+ */
84325
+ get KeyJSON() {
84326
+ return this.Get('KeyJSON');
84327
+ }
84328
+ set KeyJSON(value) {
84329
+ this.Set('KeyJSON', value);
84330
+ }
84331
+ /**
84332
+ * * Field Name: OutputsJSON
84333
+ * * Display Name: Outputs JSON
84334
+ * * SQL Data Type: nvarchar(MAX)
84335
+ * * Description: Cached computed outputs JSON fragment. Stored directly so archival of AI Prompt Runs does not lose cached values.
84336
+ */
84337
+ get OutputsJSON() {
84338
+ return this.Get('OutputsJSON');
84339
+ }
84340
+ set OutputsJSON(value) {
84341
+ this.Set('OutputsJSON', value);
84342
+ }
84343
+ /**
84344
+ * * Field Name: Reasoning
84345
+ * * Display Name: Reasoning
84346
+ * * SQL Data Type: nvarchar(MAX)
84347
+ * * Description: Optional model reasoning or rationale captured from the prompt execution.
84348
+ */
84349
+ get Reasoning() {
84350
+ return this.Get('Reasoning');
84351
+ }
84352
+ set Reasoning(value) {
84353
+ this.Set('Reasoning', value);
84354
+ }
84355
+ /**
84356
+ * * Field Name: AIPromptRunID
84357
+ * * Display Name: AI Prompt Run
84358
+ * * SQL Data Type: uniqueidentifier
84359
+ * * Description: Soft reference to the AI Prompt Run that first computed and populated this cached result.
84360
+ */
84361
+ get AIPromptRunID() {
84362
+ return this.Get('AIPromptRunID');
84363
+ }
84364
+ set AIPromptRunID(value) {
84365
+ this.Set('AIPromptRunID', value);
84366
+ }
84367
+ /**
84368
+ * * Field Name: HitCount
84369
+ * * Display Name: Hit Count
84370
+ * * SQL Data Type: int
84371
+ * * Default Value: 0
84372
+ * * Description: Total number of times this cached result has been served to skip an LLM invocation.
84373
+ */
84374
+ get HitCount() {
84375
+ return this.Get('HitCount');
84376
+ }
84377
+ set HitCount(value) {
84378
+ this.Set('HitCount', value);
84379
+ }
84380
+ /**
84381
+ * * Field Name: LastHitAt
84382
+ * * Display Name: Last Hit At
84383
+ * * SQL Data Type: datetimeoffset
84384
+ * * Description: Timestamp when this cached entry was last read and served.
84385
+ */
84386
+ get LastHitAt() {
84387
+ return this.Get('LastHitAt');
84388
+ }
84389
+ set LastHitAt(value) {
84390
+ this.Set('LastHitAt', value);
84391
+ }
84392
+ /**
84393
+ * * Field Name: ComputedAt
84394
+ * * Display Name: Computed At
84395
+ * * SQL Data Type: datetimeoffset
84396
+ * * Default Value: sysdatetimeoffset()
84397
+ * * Description: Timestamp when this cached entry was originally computed.
84398
+ */
84399
+ get ComputedAt() {
84400
+ return this.Get('ComputedAt');
84401
+ }
84402
+ set ComputedAt(value) {
84403
+ this.Set('ComputedAt', value);
84404
+ }
84405
+ /**
84406
+ * * Field Name: ExpiresAt
84407
+ * * Display Name: Expires At
84408
+ * * SQL Data Type: datetimeoffset
84409
+ * * Description: Optional expiration timestamp for time-to-live invalidation. NULL means no expiration.
84410
+ */
84411
+ get ExpiresAt() {
84412
+ return this.Get('ExpiresAt');
84413
+ }
84414
+ set ExpiresAt(value) {
84415
+ this.Set('ExpiresAt', value);
84416
+ }
84417
+ /**
84418
+ * * Field Name: __mj_CreatedAt
84419
+ * * Display Name: Created At
84420
+ * * SQL Data Type: datetimeoffset
84421
+ * * Default Value: getutcdate()
84422
+ * * Description: Timestamp when this record was created.
84423
+ */
84424
+ get __mj_CreatedAt() {
84425
+ return this.Get('__mj_CreatedAt');
84426
+ }
84427
+ /**
84428
+ * * Field Name: __mj_UpdatedAt
84429
+ * * Display Name: Updated At
84430
+ * * SQL Data Type: datetimeoffset
84431
+ * * Default Value: getutcdate()
84432
+ * * Description: Timestamp when this record was last updated.
84433
+ */
84434
+ get __mj_UpdatedAt() {
84435
+ return this.Get('__mj_UpdatedAt');
84436
+ }
84437
+ /**
84438
+ * * Field Name: RecordProcess
84439
+ * * Display Name: Record Process Name
84440
+ * * SQL Data Type: nvarchar(255)
84441
+ */
84442
+ get RecordProcess() {
84443
+ return this.Get('RecordProcess');
84444
+ }
84445
+ /**
84446
+ * * Field Name: Prompt
84447
+ * * Display Name: Prompt Name
84448
+ * * SQL Data Type: nvarchar(255)
84449
+ */
84450
+ get Prompt() {
84451
+ return this.Get('Prompt');
84452
+ }
84453
+ };
84454
+ MJFeatureValueCacheEntity = __decorate([
84455
+ RegisterClass(BaseEntity, 'MJ: Feature Value Caches')
84456
+ ], MJFeatureValueCacheEntity);
84457
+ export { MJFeatureValueCacheEntity };
84458
+ /**
84459
+ * MJ: Feature Values - strongly typed entity sub-class
84460
+ * * Schema: __mj
84461
+ * * Base Table: FeatureValue
84462
+ * * Base View: vwFeatureValues
84463
+ * * @description Complete historical audit table for Feature Pipelines. Records every feature value ever computed per entity record, with full provenance, model reasoning, and run back-links.
84464
+ * * Primary Key: ID
84465
+ * @extends {BaseEntity}
84466
+ * @class
84467
+ * @public
84468
+ */
84469
+ let MJFeatureValueEntity = class MJFeatureValueEntity extends BaseEntity {
84470
+ /**
84471
+ * Loads the MJ: Feature Values record from the database
84472
+ * @param ID: string - primary key value to load the MJ: Feature Values record.
84473
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
84474
+ * @returns {Promise<boolean>} - true if successful, false otherwise
84475
+ * @public
84476
+ * @async
84477
+ * @memberof MJFeatureValueEntity
84478
+ * @method
84479
+ * @override
84480
+ */
84481
+ async Load(ID, EntityRelationshipsToLoad) {
84482
+ const compositeKey = new CompositeKey();
84483
+ compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: ID });
84484
+ return await super.InnerLoad(compositeKey, EntityRelationshipsToLoad);
84485
+ }
84486
+ /**
84487
+ * * Field Name: ID
84488
+ * * Display Name: ID
84489
+ * * SQL Data Type: uniqueidentifier
84490
+ * * Default Value: newsequentialid()
84491
+ * * Description: Unique identifier for this feature value history record.
84492
+ */
84493
+ get ID() {
84494
+ return this.Get('ID');
84495
+ }
84496
+ set ID(value) {
84497
+ this.Set('ID', value);
84498
+ }
84499
+ /**
84500
+ * * Field Name: RecordProcessID
84501
+ * * Display Name: Record Process
84502
+ * * SQL Data Type: uniqueidentifier
84503
+ * * Related Entity/Foreign Key: MJ: Record Processes (vwRecordProcesses.ID)
84504
+ * * Description: The Record Process (Feature Pipeline) that computed this feature value.
84505
+ */
84506
+ get RecordProcessID() {
84507
+ return this.Get('RecordProcessID');
84508
+ }
84509
+ set RecordProcessID(value) {
84510
+ this.Set('RecordProcessID', value);
84511
+ }
84512
+ /**
84513
+ * * Field Name: EntityID
84514
+ * * Display Name: Entity
84515
+ * * SQL Data Type: uniqueidentifier
84516
+ * * Related Entity/Foreign Key: MJ: Entities (vwEntities.ID)
84517
+ * * Description: The entity of the record this feature was computed for.
84518
+ */
84519
+ get EntityID() {
84520
+ return this.Get('EntityID');
84521
+ }
84522
+ set EntityID(value) {
84523
+ this.Set('EntityID', value);
84524
+ }
84525
+ /**
84526
+ * * Field Name: RecordID
84527
+ * * Display Name: Record ID
84528
+ * * SQL Data Type: nvarchar(900)
84529
+ * * Description: Serialized primary key of the record this feature was computed for. Matches ProcessRunDetail.RecordID.
84530
+ */
84531
+ get RecordID() {
84532
+ return this.Get('RecordID');
84533
+ }
84534
+ set RecordID(value) {
84535
+ this.Set('RecordID', value);
84536
+ }
84537
+ /**
84538
+ * * Field Name: FeatureName
84539
+ * * Display Name: Feature Name
84540
+ * * SQL Data Type: nvarchar(255)
84541
+ * * Description: Name of the feature, matching DataFeatureOutput.Name.
84542
+ */
84543
+ get FeatureName() {
84544
+ return this.Get('FeatureName');
84545
+ }
84546
+ set FeatureName(value) {
84547
+ this.Set('FeatureName', value);
84548
+ }
84549
+ /**
84550
+ * * Field Name: ValueText
84551
+ * * Display Name: Value (Text)
84552
+ * * SQL Data Type: nvarchar(MAX)
84553
+ * * Description: Computed value as text, for text and categorical features.
84554
+ */
84555
+ get ValueText() {
84556
+ return this.Get('ValueText');
84557
+ }
84558
+ set ValueText(value) {
84559
+ this.Set('ValueText', value);
84560
+ }
84561
+ /**
84562
+ * * Field Name: ValueNumeric
84563
+ * * Display Name: Value (Numeric)
84564
+ * * SQL Data Type: float(53)
84565
+ * * Description: Computed value as floating-point numeric, for numeric and score features.
84566
+ */
84567
+ get ValueNumeric() {
84568
+ return this.Get('ValueNumeric');
84569
+ }
84570
+ set ValueNumeric(value) {
84571
+ this.Set('ValueNumeric', value);
84572
+ }
84573
+ /**
84574
+ * * Field Name: ValueDate
84575
+ * * Display Name: Value (Date)
84576
+ * * SQL Data Type: datetimeoffset
84577
+ * * Description: Computed value as datetimeoffset, for date and timestamp features.
84578
+ */
84579
+ get ValueDate() {
84580
+ return this.Get('ValueDate');
84581
+ }
84582
+ set ValueDate(value) {
84583
+ this.Set('ValueDate', value);
84584
+ }
84585
+ /**
84586
+ * * Field Name: ValueBoolean
84587
+ * * Display Name: Value (Boolean)
84588
+ * * SQL Data Type: bit
84589
+ * * Description: Computed value as boolean bit flag.
84590
+ */
84591
+ get ValueBoolean() {
84592
+ return this.Get('ValueBoolean');
84593
+ }
84594
+ set ValueBoolean(value) {
84595
+ this.Set('ValueBoolean', value);
84596
+ }
84597
+ /**
84598
+ * * Field Name: ValueJSON
84599
+ * * Display Name: Value (JSON)
84600
+ * * SQL Data Type: nvarchar(MAX)
84601
+ * * Description: Computed value as raw JSON string, for array or complex object features.
84602
+ */
84603
+ get ValueJSON() {
84604
+ return this.Get('ValueJSON');
84605
+ }
84606
+ set ValueJSON(value) {
84607
+ this.Set('ValueJSON', value);
84608
+ }
84609
+ /**
84610
+ * * Field Name: Reasoning
84611
+ * * Display Name: Reasoning
84612
+ * * SQL Data Type: nvarchar(MAX)
84613
+ * * Description: Optional model reasoning or rationale captured from the prompt execution.
84614
+ */
84615
+ get Reasoning() {
84616
+ return this.Get('Reasoning');
84617
+ }
84618
+ set Reasoning(value) {
84619
+ this.Set('Reasoning', value);
84620
+ }
84621
+ /**
84622
+ * * Field Name: Confidence
84623
+ * * Display Name: Confidence
84624
+ * * SQL Data Type: float(53)
84625
+ * * Description: Optional confidence score associated with this computed value.
84626
+ */
84627
+ get Confidence() {
84628
+ return this.Get('Confidence');
84629
+ }
84630
+ set Confidence(value) {
84631
+ this.Set('Confidence', value);
84632
+ }
84633
+ /**
84634
+ * * Field Name: PromptID
84635
+ * * Display Name: Prompt
84636
+ * * SQL Data Type: uniqueidentifier
84637
+ * * Related Entity/Foreign Key: MJ: AI Prompts (vwAIPrompts.ID)
84638
+ * * Description: Reference to the AI Prompt used to compute this feature value.
84639
+ */
84640
+ get PromptID() {
84641
+ return this.Get('PromptID');
84642
+ }
84643
+ set PromptID(value) {
84644
+ this.Set('PromptID', value);
84645
+ }
84646
+ /**
84647
+ * * Field Name: PromptVersionHash
84648
+ * * Display Name: Prompt Version Hash
84649
+ * * SQL Data Type: nvarchar(64)
84650
+ * * Description: SHA-256 content hash of the rendered prompt template and instructions at execution time.
84651
+ */
84652
+ get PromptVersionHash() {
84653
+ return this.Get('PromptVersionHash');
84654
+ }
84655
+ set PromptVersionHash(value) {
84656
+ this.Set('PromptVersionHash', value);
84657
+ }
84658
+ /**
84659
+ * * Field Name: ConstraintHash
84660
+ * * Display Name: Constraint Hash
84661
+ * * SQL Data Type: nvarchar(64)
84662
+ * * Description: SHA-256 hash of the value constraint definitions in effect when this feature was computed.
84663
+ */
84664
+ get ConstraintHash() {
84665
+ return this.Get('ConstraintHash');
84666
+ }
84667
+ set ConstraintHash(value) {
84668
+ this.Set('ConstraintHash', value);
84669
+ }
84670
+ /**
84671
+ * * Field Name: ProcessRunID
84672
+ * * Display Name: Process Run
84673
+ * * SQL Data Type: uniqueidentifier
84674
+ * * Related Entity/Foreign Key: MJ: Process Runs (vwProcessRuns.ID)
84675
+ * * Description: Reference to the Process Run during which this feature was computed.
84676
+ */
84677
+ get ProcessRunID() {
84678
+ return this.Get('ProcessRunID');
84679
+ }
84680
+ set ProcessRunID(value) {
84681
+ this.Set('ProcessRunID', value);
84682
+ }
84683
+ /**
84684
+ * * Field Name: ProcessRunDetailID
84685
+ * * Display Name: Process Run Detail
84686
+ * * SQL Data Type: uniqueidentifier
84687
+ * * Related Entity/Foreign Key: MJ: Process Run Details (vwProcessRunDetails.ID)
84688
+ * * Description: Reference to the specific Process Run Detail row for this record execution.
84689
+ */
84690
+ get ProcessRunDetailID() {
84691
+ return this.Get('ProcessRunDetailID');
84692
+ }
84693
+ set ProcessRunDetailID(value) {
84694
+ this.Set('ProcessRunDetailID', value);
84695
+ }
84696
+ /**
84697
+ * * Field Name: AIPromptRunID
84698
+ * * Display Name: AI Prompt Run
84699
+ * * SQL Data Type: uniqueidentifier
84700
+ * * Description: Soft reference to the AI Prompt Run that computed this value.
84701
+ */
84702
+ get AIPromptRunID() {
84703
+ return this.Get('AIPromptRunID');
84704
+ }
84705
+ set AIPromptRunID(value) {
84706
+ this.Set('AIPromptRunID', value);
84707
+ }
84708
+ /**
84709
+ * * Field Name: FeatureValueCacheID
84710
+ * * Display Name: Feature Value Cache
84711
+ * * SQL Data Type: uniqueidentifier
84712
+ * * Related Entity/Foreign Key: MJ: Feature Value Caches (vwFeatureValueCaches.ID)
84713
+ * * Description: Optional reference to the FeatureValueCache entry if this value was served from cache.
84714
+ */
84715
+ get FeatureValueCacheID() {
84716
+ return this.Get('FeatureValueCacheID');
84717
+ }
84718
+ set FeatureValueCacheID(value) {
84719
+ this.Set('FeatureValueCacheID', value);
84720
+ }
84721
+ /**
84722
+ * * Field Name: ComputedAt
84723
+ * * Display Name: Computed At
84724
+ * * SQL Data Type: datetimeoffset
84725
+ * * Default Value: sysdatetimeoffset()
84726
+ * * Description: Timestamp when this feature value was computed.
84727
+ */
84728
+ get ComputedAt() {
84729
+ return this.Get('ComputedAt');
84730
+ }
84731
+ set ComputedAt(value) {
84732
+ this.Set('ComputedAt', value);
84733
+ }
84734
+ /**
84735
+ * * Field Name: __mj_CreatedAt
84736
+ * * Display Name: Created At
84737
+ * * SQL Data Type: datetimeoffset
84738
+ * * Default Value: getutcdate()
84739
+ * * Description: Timestamp when this record was created.
84740
+ */
84741
+ get __mj_CreatedAt() {
84742
+ return this.Get('__mj_CreatedAt');
84743
+ }
84744
+ /**
84745
+ * * Field Name: __mj_UpdatedAt
84746
+ * * Display Name: Updated At
84747
+ * * SQL Data Type: datetimeoffset
84748
+ * * Default Value: getutcdate()
84749
+ * * Description: Timestamp when this record was last updated.
84750
+ */
84751
+ get __mj_UpdatedAt() {
84752
+ return this.Get('__mj_UpdatedAt');
84753
+ }
84754
+ /**
84755
+ * * Field Name: RecordProcess
84756
+ * * Display Name: Record Process
84757
+ * * SQL Data Type: nvarchar(255)
84758
+ */
84759
+ get RecordProcess() {
84760
+ return this.Get('RecordProcess');
84761
+ }
84762
+ /**
84763
+ * * Field Name: Entity
84764
+ * * Display Name: Entity
84765
+ * * SQL Data Type: nvarchar(255)
84766
+ */
84767
+ get Entity() {
84768
+ return this.Get('Entity');
84769
+ }
84770
+ /**
84771
+ * * Field Name: Prompt
84772
+ * * Display Name: Prompt
84773
+ * * SQL Data Type: nvarchar(255)
84774
+ */
84775
+ get Prompt() {
84776
+ return this.Get('Prompt');
84777
+ }
84778
+ /**
84779
+ * * Field Name: ProcessRunDetail
84780
+ * * Display Name: Process Run Detail
84781
+ * * SQL Data Type: nvarchar(450)
84782
+ */
84783
+ get ProcessRunDetail() {
84784
+ return this.Get('ProcessRunDetail');
84785
+ }
84786
+ /**
84787
+ * * Field Name: FeatureValueCache
84788
+ * * Display Name: Feature Value Cache
84789
+ * * SQL Data Type: nvarchar(500)
84790
+ */
84791
+ get FeatureValueCache() {
84792
+ return this.Get('FeatureValueCache');
84793
+ }
84794
+ };
84795
+ MJFeatureValueEntity = __decorate([
84796
+ RegisterClass(BaseEntity, 'MJ: Feature Values')
84797
+ ], MJFeatureValueEntity);
84798
+ export { MJFeatureValueEntity };
83807
84799
  /**
83808
84800
  * MJ: File Categories - strongly typed entity sub-class
83809
84801
  * * Schema: __mj
@@ -96017,6 +97009,11 @@ export { MJPublicLinkEntity };
96017
97009
  * @public
96018
97010
  */
96019
97011
  let MJQueryEntity = class MJQueryEntity extends BaseEntity {
97012
+ constructor() {
97013
+ super(...arguments);
97014
+ this._ConfigurationObject_cached = undefined;
97015
+ this._ConfigurationObject_lastRaw = null;
97016
+ }
96020
97017
  /**
96021
97018
  * Loads the MJ: Queries record from the database
96022
97019
  * @param ID: string - primary key value to load the MJ: Queries record.
@@ -96388,6 +97385,37 @@ let MJQueryEntity = class MJQueryEntity extends BaseEntity {
96388
97385
  this.Set('IsMaterialized', value);
96389
97386
  }
96390
97387
  /**
97388
+ * * Field Name: Configuration
97389
+ * * Display Name: Configuration
97390
+ * * SQL Data Type: nvarchar(MAX)
97391
+ * * JSON Type: MJQueryEntity_IQueryConfiguration
97392
+ * * Description: Optional JSON configuration bag defining query-level policies and semantic capabilities (shape = IQueryConfiguration). Includes Priority (1-100) for ground-truth ranking in the semantic layer, LogExecution to control query execution logging, AlternativeQuestions for multi-phrasing vector recall, UsageGuidance and WhenNotToUse bounds for AI agents, and DomainScope.
97393
+ */
97394
+ get Configuration() {
97395
+ return this.Get('Configuration');
97396
+ }
97397
+ set Configuration(value) {
97398
+ this.Set('Configuration', value);
97399
+ }
97400
+ /**
97401
+ * Typed accessor for Configuration — returns parsed JSON as MJQueryEntity_IQueryConfiguration.
97402
+ * Uses lazy parsing with cache invalidation when the underlying raw value changes.
97403
+ */
97404
+ get ConfigurationObject() {
97405
+ const raw = this.Configuration;
97406
+ if (raw !== this._ConfigurationObject_lastRaw) {
97407
+ this._ConfigurationObject_cached = raw ? JSON.parse(raw) : null;
97408
+ this._ConfigurationObject_lastRaw = raw;
97409
+ }
97410
+ return this._ConfigurationObject_cached;
97411
+ }
97412
+ set ConfigurationObject(value) {
97413
+ const raw = value ? JSON.stringify(value) : null;
97414
+ this.Configuration = raw;
97415
+ this._ConfigurationObject_cached = value;
97416
+ this._ConfigurationObject_lastRaw = raw;
97417
+ }
97418
+ /**
96391
97419
  * * Field Name: Category
96392
97420
  * * Display Name: Category Name
96393
97421
  * * SQL Data Type: nvarchar(50)
@@ -112075,6 +113103,11 @@ export { MJTestTypeEntity };
112075
113103
  * @public
112076
113104
  */
112077
113105
  let MJTestEntity = class MJTestEntity extends BaseEntity {
113106
+ constructor() {
113107
+ super(...arguments);
113108
+ this._ConfigurationObject_cached = undefined;
113109
+ this._ConfigurationObject_lastRaw = null;
113110
+ }
112078
113111
  /**
112079
113112
  * Loads the MJ: Tests record from the database
112080
113113
  * @param ID: string - primary key value to load the MJ: Tests record.
@@ -112211,6 +113244,7 @@ let MJTestEntity = class MJTestEntity extends BaseEntity {
112211
113244
  * * Field Name: Configuration
112212
113245
  * * Display Name: Configuration
112213
113246
  * * SQL Data Type: nvarchar(MAX)
113247
+ * * JSON Type: MJTestEntity_ITestConfiguration
112214
113248
  * * Description: JSON object for test-specific configuration (e.g., oracles to use, rubrics, retry policies, timeout settings)
112215
113249
  */
112216
113250
  get Configuration() {
@@ -112220,6 +113254,24 @@ let MJTestEntity = class MJTestEntity extends BaseEntity {
112220
113254
  this.Set('Configuration', value);
112221
113255
  }
112222
113256
  /**
113257
+ * Typed accessor for Configuration — returns parsed JSON as MJTestEntity_ITestConfiguration.
113258
+ * Uses lazy parsing with cache invalidation when the underlying raw value changes.
113259
+ */
113260
+ get ConfigurationObject() {
113261
+ const raw = this.Configuration;
113262
+ if (raw !== this._ConfigurationObject_lastRaw) {
113263
+ this._ConfigurationObject_cached = raw ? JSON.parse(raw) : null;
113264
+ this._ConfigurationObject_lastRaw = raw;
113265
+ }
113266
+ return this._ConfigurationObject_cached;
113267
+ }
113268
+ set ConfigurationObject(value) {
113269
+ const raw = value ? JSON.stringify(value) : null;
113270
+ this.Configuration = raw;
113271
+ this._ConfigurationObject_cached = value;
113272
+ this._ConfigurationObject_lastRaw = raw;
113273
+ }
113274
+ /**
112223
113275
  * * Field Name: Tags
112224
113276
  * * Display Name: Tags
112225
113277
  * * SQL Data Type: nvarchar(MAX)
@@ -117171,6 +118223,267 @@ MJViewTypeEntity = __decorate([
117171
118223
  RegisterClass(BaseEntity, 'MJ: View Types')
117172
118224
  ], MJViewTypeEntity);
117173
118225
  export { MJViewTypeEntity };
118226
+ /**
118227
+ * MJ: Web Search Providers - strongly typed entity sub-class
118228
+ * * Schema: __mj
118229
+ * * Base Table: WebSearchProvider
118230
+ * * Base View: vwWebSearchProviders
118231
+ * * @description Registry of external web search vendors available to @memberjunction/web-search-engine. Each row configures one driver: whether it is active, its position in the failover order, and where its credential lives. Provider capabilities (answer synthesis, domain filtering, freshness) are declared by the driver class, not stored here.
118232
+ * * Primary Key: ID
118233
+ * @extends {BaseEntity}
118234
+ * @class
118235
+ * @public
118236
+ */
118237
+ let MJWebSearchProviderEntity = class MJWebSearchProviderEntity extends BaseEntity {
118238
+ /**
118239
+ * Loads the MJ: Web Search Providers record from the database
118240
+ * @param ID: string - primary key value to load the MJ: Web Search Providers record.
118241
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
118242
+ * @returns {Promise<boolean>} - true if successful, false otherwise
118243
+ * @public
118244
+ * @async
118245
+ * @memberof MJWebSearchProviderEntity
118246
+ * @method
118247
+ * @override
118248
+ */
118249
+ async Load(ID, EntityRelationshipsToLoad) {
118250
+ const compositeKey = new CompositeKey();
118251
+ compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: ID });
118252
+ return await super.InnerLoad(compositeKey, EntityRelationshipsToLoad);
118253
+ }
118254
+ /**
118255
+ * Validate() method override for MJ: Web Search Providers entity. This is an auto-generated method that invokes the generated validators for this entity for the following fields:
118256
+ * * MaxResultsOverride: The maximum results override must be greater than 0 if it is specified.
118257
+ * * Priority: The priority value must be a non-negative number (0 or greater) to ensure correct ordering and scheduling.
118258
+ * @public
118259
+ * @method
118260
+ * @override
118261
+ */
118262
+ Validate() {
118263
+ const result = super.Validate();
118264
+ this.ValidateMaxResultsOverrideGreaterThanZero(result);
118265
+ this.ValidatePriorityMinVal(result);
118266
+ result.Success = result.Success && (result.Errors.length === 0);
118267
+ return result;
118268
+ }
118269
+ /**
118270
+ * The maximum results override must be greater than 0 if it is specified.
118271
+ * @param result - the ValidationResult object to add any errors or warnings to
118272
+ * @public
118273
+ * @method
118274
+ */
118275
+ ValidateMaxResultsOverrideGreaterThanZero(result) {
118276
+ if (this.MaxResultsOverride != null && this.MaxResultsOverride <= 0) {
118277
+ result.Errors.push(new ValidationErrorInfo("MaxResultsOverride", "The maximum results override must be greater than 0 if it is specified.", this.MaxResultsOverride, ValidationErrorType.Failure));
118278
+ }
118279
+ }
118280
+ /**
118281
+ * The priority value must be a non-negative number (0 or greater) to ensure correct ordering and scheduling.
118282
+ * @param result - the ValidationResult object to add any errors or warnings to
118283
+ * @public
118284
+ * @method
118285
+ */
118286
+ ValidatePriorityMinVal(result) {
118287
+ if (this.Priority < 0) {
118288
+ result.Errors.push(new ValidationErrorInfo("Priority", "Priority must be greater than or equal to 0.", this.Priority, ValidationErrorType.Failure));
118289
+ }
118290
+ }
118291
+ /**
118292
+ * * Field Name: ID
118293
+ * * Display Name: ID
118294
+ * * SQL Data Type: uniqueidentifier
118295
+ * * Default Value: newsequentialid()
118296
+ */
118297
+ get ID() {
118298
+ return this.Get('ID');
118299
+ }
118300
+ set ID(value) {
118301
+ this.Set('ID', value);
118302
+ }
118303
+ /**
118304
+ * * Field Name: Name
118305
+ * * Display Name: Name
118306
+ * * SQL Data Type: nvarchar(200)
118307
+ * * Description: Administrator-facing name for this provider, e.g. "Brave" or "Tavily". Unique, and usable as the Provider value when a caller pins a search to one vendor.
118308
+ */
118309
+ get Name() {
118310
+ return this.Get('Name');
118311
+ }
118312
+ set Name(value) {
118313
+ this.Set('Name', value);
118314
+ }
118315
+ /**
118316
+ * * Field Name: Description
118317
+ * * Display Name: Description
118318
+ * * SQL Data Type: nvarchar(MAX)
118319
+ * * Description: What this provider searches, what it costs, and when it is the right choice.
118320
+ */
118321
+ get Description() {
118322
+ return this.Get('Description');
118323
+ }
118324
+ set Description(value) {
118325
+ this.Set('Description', value);
118326
+ }
118327
+ /**
118328
+ * * Field Name: DriverClass
118329
+ * * Display Name: Driver Class
118330
+ * * SQL Data Type: nvarchar(500)
118331
+ * * Description: ClassFactory key used with @RegisterClass(BaseWebSearchProvider, DriverClass) to instantiate the driver at runtime, e.g. "BraveWebSearchProvider". A value with no matching registration leaves the provider unavailable and is logged at engine startup.
118332
+ */
118333
+ get DriverClass() {
118334
+ return this.Get('DriverClass');
118335
+ }
118336
+ set DriverClass(value) {
118337
+ this.Set('DriverClass', value);
118338
+ }
118339
+ /**
118340
+ * * Field Name: Status
118341
+ * * Display Name: Status
118342
+ * * SQL Data Type: nvarchar(20)
118343
+ * * Default Value: Active
118344
+ * * Value List Type: List
118345
+ * * Possible Values
118346
+ * * Active
118347
+ * * Pending
118348
+ * * Terminated
118349
+ * * Description: Provider lifecycle status: Pending (configured but not yet in use), Active (participates in searches), Terminated (disabled). Only Active providers are loaded. Matches the vocabulary used by SearchProvider.
118350
+ */
118351
+ get Status() {
118352
+ return this.Get('Status');
118353
+ }
118354
+ set Status(value) {
118355
+ this.Set('Status', value);
118356
+ }
118357
+ /**
118358
+ * * Field Name: Priority
118359
+ * * Display Name: Priority
118360
+ * * SQL Data Type: int
118361
+ * * Default Value: 0
118362
+ * * Description: Failover order: LOWER values are tried FIRST. The engine serves a search from the first available provider in this order, moving on only when one fails transiently. Must be >= 0.
118363
+ */
118364
+ get Priority() {
118365
+ return this.Get('Priority');
118366
+ }
118367
+ set Priority(value) {
118368
+ this.Set('Priority', value);
118369
+ }
118370
+ /**
118371
+ * * Field Name: CredentialID
118372
+ * * Display Name: Credential ID
118373
+ * * SQL Data Type: uniqueidentifier
118374
+ * * Related Entity/Foreign Key: MJ: Credentials (vwCredentials.ID)
118375
+ * * Description: Optional FK to the Credential record holding this provider's API key. When NULL the driver falls back to its documented environment variable, so a host that has not yet migrated its secrets into the Credential store keeps working.
118376
+ */
118377
+ get CredentialID() {
118378
+ return this.Get('CredentialID');
118379
+ }
118380
+ set CredentialID(value) {
118381
+ this.Set('CredentialID', value);
118382
+ }
118383
+ /**
118384
+ * * Field Name: ProviderConfig
118385
+ * * Display Name: Provider Config
118386
+ * * SQL Data Type: nvarchar(MAX)
118387
+ * * Description: Optional JSON blob of non-secret, driver-specific settings (endpoint overrides, tier flags, answer model). Schema is defined by each driver; invalid JSON is logged and ignored rather than disabling the provider.
118388
+ */
118389
+ get ProviderConfig() {
118390
+ return this.Get('ProviderConfig');
118391
+ }
118392
+ set ProviderConfig(value) {
118393
+ this.Set('ProviderConfig', value);
118394
+ }
118395
+ /**
118396
+ * * Field Name: MaxResultsOverride
118397
+ * * Display Name: Max Results Override
118398
+ * * SQL Data Type: int
118399
+ * * Description: Optional per-provider cap on results per request, for pay-per-query vendors. The effective cap is the smallest of the caller's request, this value, and the vendor's own hard limit. NULL means the driver's own limit applies.
118400
+ */
118401
+ get MaxResultsOverride() {
118402
+ return this.Get('MaxResultsOverride');
118403
+ }
118404
+ set MaxResultsOverride(value) {
118405
+ this.Set('MaxResultsOverride', value);
118406
+ }
118407
+ /**
118408
+ * * Field Name: AllowResultCaching
118409
+ * * Display Name: Allow Result Caching
118410
+ * * SQL Data Type: bit
118411
+ * * Default Value: 0
118412
+ * * Description: Whether this vendor's terms permit storing returned results. Defaults to 0 (deny), because caching rights differ sharply between vendors and violating them is silent: some sell storage rights as a plan tier, others forbid persistent caching outright. Nothing in the engine caches today; this column exists so the first caching layer reads a per-provider gate instead of inventing one.
118413
+ */
118414
+ get AllowResultCaching() {
118415
+ return this.Get('AllowResultCaching');
118416
+ }
118417
+ set AllowResultCaching(value) {
118418
+ this.Set('AllowResultCaching', value);
118419
+ }
118420
+ /**
118421
+ * * Field Name: DisplayName
118422
+ * * Display Name: Display Name
118423
+ * * SQL Data Type: nvarchar(200)
118424
+ * * Description: UI display name shown in admin surfaces and result attribution. When NULL, falls back to the Name column.
118425
+ */
118426
+ get DisplayName() {
118427
+ return this.Get('DisplayName');
118428
+ }
118429
+ set DisplayName(value) {
118430
+ this.Set('DisplayName', value);
118431
+ }
118432
+ /**
118433
+ * * Field Name: Icon
118434
+ * * Display Name: Icon
118435
+ * * SQL Data Type: nvarchar(200)
118436
+ * * Description: CSS icon class for UI display, e.g. "fa-brands fa-brave". Supports any CSS-based icon library. When NULL a default icon is used.
118437
+ */
118438
+ get Icon() {
118439
+ return this.Get('Icon');
118440
+ }
118441
+ set Icon(value) {
118442
+ this.Set('Icon', value);
118443
+ }
118444
+ /**
118445
+ * * Field Name: Comments
118446
+ * * Display Name: Comments
118447
+ * * SQL Data Type: nvarchar(MAX)
118448
+ * * Description: Free-form administrator notes, e.g. contract terms, billing owner, or why this provider sits at its priority.
118449
+ */
118450
+ get Comments() {
118451
+ return this.Get('Comments');
118452
+ }
118453
+ set Comments(value) {
118454
+ this.Set('Comments', value);
118455
+ }
118456
+ /**
118457
+ * * Field Name: __mj_CreatedAt
118458
+ * * Display Name: Created At
118459
+ * * SQL Data Type: datetimeoffset
118460
+ * * Default Value: getutcdate()
118461
+ */
118462
+ get __mj_CreatedAt() {
118463
+ return this.Get('__mj_CreatedAt');
118464
+ }
118465
+ /**
118466
+ * * Field Name: __mj_UpdatedAt
118467
+ * * Display Name: Updated At
118468
+ * * SQL Data Type: datetimeoffset
118469
+ * * Default Value: getutcdate()
118470
+ */
118471
+ get __mj_UpdatedAt() {
118472
+ return this.Get('__mj_UpdatedAt');
118473
+ }
118474
+ /**
118475
+ * * Field Name: Credential
118476
+ * * Display Name: Credential
118477
+ * * SQL Data Type: nvarchar(200)
118478
+ */
118479
+ get Credential() {
118480
+ return this.Get('Credential');
118481
+ }
118482
+ };
118483
+ MJWebSearchProviderEntity = __decorate([
118484
+ RegisterClass(BaseEntity, 'MJ: Web Search Providers')
118485
+ ], MJWebSearchProviderEntity);
118486
+ export { MJWebSearchProviderEntity };
117174
118487
  /**
117175
118488
  * MJ: Workspace Items - strongly typed entity sub-class
117176
118489
  * * Schema: __mj