@memberjunction/core-entities 6.2.0-edge.3 → 6.2.0-edge.4

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.
Files changed (47) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/custom/ConversationForkAccess.d.ts +15 -0
  3. package/dist/custom/ConversationForkAccess.d.ts.map +1 -0
  4. package/dist/custom/ConversationForkAccess.js +28 -0
  5. package/dist/custom/ConversationForkAccess.js.map +1 -0
  6. package/dist/custom/ConversationWriteAccess.d.ts +16 -0
  7. package/dist/custom/ConversationWriteAccess.d.ts.map +1 -0
  8. package/dist/custom/ConversationWriteAccess.js +34 -0
  9. package/dist/custom/ConversationWriteAccess.js.map +1 -0
  10. package/dist/custom/MJConversationBranchEntityExtended.d.ts +30 -0
  11. package/dist/custom/MJConversationBranchEntityExtended.d.ts.map +1 -0
  12. package/dist/custom/MJConversationBranchEntityExtended.js +120 -0
  13. package/dist/custom/MJConversationBranchEntityExtended.js.map +1 -0
  14. package/dist/custom/MJConversationDetailEntityExtended.d.ts.map +1 -1
  15. package/dist/custom/MJConversationDetailEntityExtended.js +15 -25
  16. package/dist/custom/MJConversationDetailEntityExtended.js.map +1 -1
  17. package/dist/custom/MJDashboardEntityExtended.d.ts.map +1 -1
  18. package/dist/custom/MJDashboardEntityExtended.js +3 -0
  19. package/dist/custom/MJDashboardEntityExtended.js.map +1 -1
  20. package/dist/custom/ResourcePermissions/ResourcePermissionEngine.d.ts.map +1 -1
  21. package/dist/custom/ResourcePermissions/ResourcePermissionEngine.js +14 -13
  22. package/dist/custom/ResourcePermissions/ResourcePermissionEngine.js.map +1 -1
  23. package/dist/engines/FileStorageEngine.d.ts +40 -0
  24. package/dist/engines/FileStorageEngine.d.ts.map +1 -1
  25. package/dist/engines/FileStorageEngine.js +49 -0
  26. package/dist/engines/FileStorageEngine.js.map +1 -1
  27. package/dist/engines/UserInfoEngine.d.ts +16 -10
  28. package/dist/engines/UserInfoEngine.d.ts.map +1 -1
  29. package/dist/engines/UserInfoEngine.js +35 -25
  30. package/dist/engines/UserInfoEngine.js.map +1 -1
  31. package/dist/engines/artifacts.d.ts.map +1 -1
  32. package/dist/engines/artifacts.js +1 -0
  33. package/dist/engines/artifacts.js.map +1 -1
  34. package/dist/engines/conversations.d.ts +359 -34
  35. package/dist/engines/conversations.d.ts.map +1 -1
  36. package/dist/engines/conversations.js +611 -57
  37. package/dist/engines/conversations.js.map +1 -1
  38. package/dist/generated/entities/__mj.d.ts +1730 -190
  39. package/dist/generated/entities/__mj.d.ts.map +1 -1
  40. package/dist/generated/entities/__mj.js +696 -0
  41. package/dist/generated/entities/__mj.js.map +1 -1
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -1
  46. package/package.json +5 -5
  47. package/readme.md +1 -1
@@ -14161,6 +14161,82 @@ export const MJConversationArtifactSchema = z.object({
14161
14161
  * * Display Name: Artifact Type
14162
14162
  * * SQL Data Type: nvarchar(100)`),
14163
14163
  });
14164
+ /**
14165
+ * zod schema definition for the entity MJ: Conversation Branches
14166
+ */
14167
+ export const MJConversationBranchSchema = z.object({
14168
+ ID: z.string().describe(`
14169
+ * * Field Name: ID
14170
+ * * Display Name: ID
14171
+ * * SQL Data Type: uniqueidentifier
14172
+ * * Default Value: newsequentialid()`),
14173
+ ConversationID: z.string().describe(`
14174
+ * * Field Name: ConversationID
14175
+ * * Display Name: Conversation
14176
+ * * SQL Data Type: uniqueidentifier
14177
+ * * Related Entity/Foreign Key: MJ: Conversations (vwConversations.ID)
14178
+ * * Description: The conversation this fork belongs to.`),
14179
+ ParentBranchID: z.string().nullable().describe(`
14180
+ * * Field Name: ParentBranchID
14181
+ * * Display Name: Parent Branch
14182
+ * * SQL Data Type: uniqueidentifier
14183
+ * * Related Entity/Foreign Key: MJ: Conversation Branches (vwConversationBranches.ID)
14184
+ * * Description: The fork this one started from. NULL means it started from Main, or before the first message when ForkFromSequence is also NULL.`),
14185
+ ForkFromSequence: z.number().nullable().describe(`
14186
+ * * Field Name: ForkFromSequence
14187
+ * * Display Name: Fork From Sequence
14188
+ * * SQL Data Type: int
14189
+ * * Description: Sequence of the last message shared with the parent path. NULL means the fork starts before the first message, in which case ParentBranchID is also NULL.`),
14190
+ Name: z.string().nullable().describe(`
14191
+ * * Field Name: Name
14192
+ * * Display Name: Name
14193
+ * * SQL Data Type: nvarchar(255)
14194
+ * * Description: Optional name of the fork. With no name, the UI shows a default label from Kind: a Fork is named from its first message.`),
14195
+ Kind: z.union([z.literal('Edit'), z.literal('Fork'), z.literal('Regenerate')]).describe(`
14196
+ * * Field Name: Kind
14197
+ * * Display Name: Kind
14198
+ * * SQL Data Type: nvarchar(20)
14199
+ * * Default Value: Fork
14200
+ * * Value List Type: List
14201
+ * * Possible Values
14202
+ * * Edit
14203
+ * * Fork
14204
+ * * Regenerate
14205
+ * * Description: How the fork started: Fork (Fork from here), Edit (a sent message was edited) or Regenerate (an answer was regenerated).`),
14206
+ SourceDetailID: z.string().nullable().describe(`
14207
+ * * Field Name: SourceDetailID
14208
+ * * Display Name: Source Detail
14209
+ * * SQL Data Type: uniqueidentifier
14210
+ * * Description: The edited message (Kind Edit) or the replaced answer (Kind Regenerate); NULL otherwise. Not a foreign key, to avoid a CodeGen cascade cycle with ConversationDetail.`),
14211
+ UserID: z.string().describe(`
14212
+ * * Field Name: UserID
14213
+ * * Display Name: User
14214
+ * * SQL Data Type: uniqueidentifier
14215
+ * * Related Entity/Foreign Key: MJ: Users (vwUsers.ID)
14216
+ * * Description: The person who started the fork.`),
14217
+ __mj_CreatedAt: z.date().describe(`
14218
+ * * Field Name: __mj_CreatedAt
14219
+ * * Display Name: Created At
14220
+ * * SQL Data Type: datetimeoffset
14221
+ * * Default Value: getutcdate()`),
14222
+ __mj_UpdatedAt: z.date().describe(`
14223
+ * * Field Name: __mj_UpdatedAt
14224
+ * * Display Name: Updated At
14225
+ * * SQL Data Type: datetimeoffset
14226
+ * * Default Value: getutcdate()`),
14227
+ Conversation: z.string().nullable().describe(`
14228
+ * * Field Name: Conversation
14229
+ * * Display Name: Conversation Detail
14230
+ * * SQL Data Type: nvarchar(255)`),
14231
+ ParentBranch: z.string().nullable().describe(`
14232
+ * * Field Name: ParentBranch
14233
+ * * Display Name: Parent Branch Detail
14234
+ * * SQL Data Type: nvarchar(255)`),
14235
+ User: z.string().describe(`
14236
+ * * Field Name: User
14237
+ * * Display Name: User Name
14238
+ * * SQL Data Type: nvarchar(100)`),
14239
+ });
14164
14240
  /**
14165
14241
  * zod schema definition for the entity MJ: Conversation Compaction Runs
14166
14242
  */
@@ -14608,6 +14684,17 @@ export const MJConversationDetailSchema = z.object({
14608
14684
  * * SQL Data Type: int
14609
14685
  * * Default Value: 0
14610
14686
  * * Description: Monotonic, per-conversation ordinal assigned on insert (1-based). Provides a stable symbolic handle used by conversation-history retrieval tools and by the sequence markers embedded in compaction summaries. A summary stored in SummaryOfEarlierConversation on a given row covers all rows with a lower Sequence in the same conversation.`),
14687
+ BranchID: z.string().nullable().describe(`
14688
+ * * Field Name: BranchID
14689
+ * * Display Name: Branch
14690
+ * * SQL Data Type: uniqueidentifier
14691
+ * * Related Entity/Foreign Key: MJ: Conversation Branches (vwConversationBranches.ID)
14692
+ * * Description: The fork this message belongs to. NULL means Main (the trunk). Every writer sets it explicitly.`),
14693
+ ReplacedAt: z.date().nullable().describe(`
14694
+ * * Field Name: ReplacedAt
14695
+ * * Display Name: Replaced At
14696
+ * * SQL Data Type: datetimeoffset
14697
+ * * Description: When a rerun of this message's turn replaced it (Regenerate or Save and resend while forking is off). A replaced row is kept for audit, is hidden from the user and is never sent to an agent. NULL means the row is live.`),
14611
14698
  Conversation: z.string().nullable().describe(`
14612
14699
  * * Field Name: Conversation
14613
14700
  * * Display Name: Conversation
@@ -14636,6 +14723,10 @@ export const MJConversationDetailSchema = z.object({
14636
14723
  * * Field Name: TestRun
14637
14724
  * * Display Name: Test Run
14638
14725
  * * SQL Data Type: nvarchar(255)`),
14726
+ Branch: z.string().nullable().describe(`
14727
+ * * Field Name: Branch
14728
+ * * Display Name: Branch
14729
+ * * SQL Data Type: nvarchar(255)`),
14639
14730
  RootParentID: z.string().nullable().describe(`
14640
14731
  * * Field Name: RootParentID
14641
14732
  * * Display Name: Root Parent
@@ -30613,6 +30704,111 @@ export const MJSchemaInfoSchema = z.object({
30613
30704
  * * SQL Data Type: nvarchar(50)
30614
30705
  * * Description: Case-stable canonical schema name, sourced from the app manifest (mj-app.json schema.name). Used in place of SchemaName when deriving the schema prefix for entity ClassName/CodeName and GraphQL type names, so that PostgreSQL installs — whose physical SchemaName is folded to lowercase — still produce PascalCase prefixes matching the published, hand-cased entity packages. NULL means "no override": the prefix falls back to SchemaName (every existing install, the core __mj schema, and SQL Server, where SchemaName is already canonical).`),
30615
30706
  });
30707
+ /**
30708
+ * zod schema definition for the entity MJ: Scoped Notification Configs
30709
+ */
30710
+ export const MJScopedNotificationConfigSchema = z.object({
30711
+ ID: z.string().describe(`
30712
+ * * Field Name: ID
30713
+ * * Display Name: ID
30714
+ * * SQL Data Type: uniqueidentifier
30715
+ * * Default Value: newsequentialid()`),
30716
+ NotificationTypeID: z.string().describe(`
30717
+ * * Field Name: NotificationTypeID
30718
+ * * Display Name: Notification Type
30719
+ * * SQL Data Type: uniqueidentifier
30720
+ * * Related Entity/Foreign Key: MJ: User Notification Types (vwUserNotificationTypes.ID)
30721
+ * * Description: The notification type this config is for.`),
30722
+ Description: z.string().nullable().describe(`
30723
+ * * Field Name: Description
30724
+ * * Display Name: Description
30725
+ * * SQL Data Type: nvarchar(MAX)
30726
+ * * Description: Why the row exists, for the administrator who finds it.`),
30727
+ PrimaryScopeEntityID: z.string().nullable().describe(`
30728
+ * * Field Name: PrimaryScopeEntityID
30729
+ * * Display Name: Primary Scope Entity ID
30730
+ * * SQL Data Type: uniqueidentifier
30731
+ * * Related Entity/Foreign Key: MJ: Entities (vwEntities.ID)
30732
+ * * Description: The entity of the primary scope record (Applications, Roles, Users, Companies, ...). NULL with PrimaryScopeRecordID NULL = a global row.`),
30733
+ PrimaryScopeRecordID: z.string().nullable().describe(`
30734
+ * * Field Name: PrimaryScopeRecordID
30735
+ * * Display Name: Primary Scope Record ID
30736
+ * * SQL Data Type: nvarchar(100)
30737
+ * * Description: The record ID within the primary scope entity this config is scoped to. NULL = global. In scope when it is the caller's primary scope record, the recipient, or a role the recipient holds.`),
30738
+ SecondaryScopes: z.string().nullable().describe(`
30739
+ * * Field Name: SecondaryScopes
30740
+ * * Display Name: Secondary Scopes
30741
+ * * SQL Data Type: nvarchar(MAX)
30742
+ * * Description: JSON object of additional scope dimensions, e.g. {"origin":"System"}. Every dimension named must match the notice's scope for the row to apply. origin is Person, System (the Owner-type user) or Automation.`),
30743
+ InApp: z.union([z.literal('Allow'), z.literal('Deny')]).nullable().describe(`
30744
+ * * Field Name: InApp
30745
+ * * Display Name: In-App Channel
30746
+ * * SQL Data Type: nvarchar(20)
30747
+ * * Value List Type: List
30748
+ * * Possible Values
30749
+ * * Allow
30750
+ * * Deny
30751
+ * * Description: The in-app channel: Allow, Deny, or NULL to leave it to the next row.`),
30752
+ Email: z.union([z.literal('Allow'), z.literal('Deny')]).nullable().describe(`
30753
+ * * Field Name: Email
30754
+ * * Display Name: Email Channel
30755
+ * * SQL Data Type: nvarchar(20)
30756
+ * * Value List Type: List
30757
+ * * Possible Values
30758
+ * * Allow
30759
+ * * Deny
30760
+ * * Description: The email channel: Allow, Deny, or NULL to leave it to the next row.`),
30761
+ SMS: z.union([z.literal('Allow'), z.literal('Deny')]).nullable().describe(`
30762
+ * * Field Name: SMS
30763
+ * * Display Name: SMS Channel
30764
+ * * SQL Data Type: nvarchar(20)
30765
+ * * Value List Type: List
30766
+ * * Possible Values
30767
+ * * Allow
30768
+ * * Deny
30769
+ * * Description: The SMS channel: Allow, Deny, or NULL to leave it to the next row.`),
30770
+ IsLocked: z.boolean().describe(`
30771
+ * * Field Name: IsLocked
30772
+ * * Display Name: Is Locked
30773
+ * * SQL Data Type: bit
30774
+ * * Default Value: 0
30775
+ * * Description: When set, a Deny on this row is absorbing: no less specific row and no recipient preference may turn the channel on. The way a notification type's AllowUserPreference caps the recipient today.`),
30776
+ Priority: z.number().describe(`
30777
+ * * Field Name: Priority
30778
+ * * Display Name: Priority
30779
+ * * SQL Data Type: int
30780
+ * * Default Value: 0
30781
+ * * Description: Tie-break for resolution. Higher wins when two rows tie on scope specificity and neither denies. Default 0.`),
30782
+ Status: z.union([z.literal('Active'), z.literal('Archived'), z.literal('Provisional')]).describe(`
30783
+ * * Field Name: Status
30784
+ * * Display Name: Status
30785
+ * * SQL Data Type: nvarchar(20)
30786
+ * * Default Value: Active
30787
+ * * Value List Type: List
30788
+ * * Possible Values
30789
+ * * Active
30790
+ * * Archived
30791
+ * * Provisional
30792
+ * * Description: Lifecycle: Active (live), Provisional (staged; eligible), Archived (excluded from resolution).`),
30793
+ __mj_CreatedAt: z.date().describe(`
30794
+ * * Field Name: __mj_CreatedAt
30795
+ * * Display Name: Created At
30796
+ * * SQL Data Type: datetimeoffset
30797
+ * * Default Value: getutcdate()`),
30798
+ __mj_UpdatedAt: z.date().describe(`
30799
+ * * Field Name: __mj_UpdatedAt
30800
+ * * Display Name: Updated At
30801
+ * * SQL Data Type: datetimeoffset
30802
+ * * Default Value: getutcdate()`),
30803
+ NotificationType: z.string().describe(`
30804
+ * * Field Name: NotificationType
30805
+ * * Display Name: Notification Type Name
30806
+ * * SQL Data Type: nvarchar(100)`),
30807
+ PrimaryScopeEntity: z.string().nullable().describe(`
30808
+ * * Field Name: PrimaryScopeEntity
30809
+ * * Display Name: Primary Scope Entity
30810
+ * * SQL Data Type: nvarchar(255)`),
30811
+ });
30616
30812
  /**
30617
30813
  * zod schema definition for the entity MJ: Scoped Prompt Configs
30618
30814
  */
@@ -35613,6 +35809,12 @@ export const MJUserSchema = z.object({
35613
35809
  * * Display Name: User Image Icon Class
35614
35810
  * * SQL Data Type: nvarchar(100)
35615
35811
  * * Description: Font Awesome icon class for user avatar (e.g., "fa-solid fa-user-astronaut"). Used as fallback when UserImageURL is not provided. Example classes: "fa-solid fa-user", "fa-regular fa-circle-user", "fa-solid fa-user-tie".`),
35812
+ IsTemplate: z.boolean().describe(`
35813
+ * * Field Name: IsTemplate
35814
+ * * Display Name: Is Template
35815
+ * * SQL Data Type: bit
35816
+ * * Default Value: 0
35817
+ * * Description: When true, this user is a template: its configuration (pinned apps, views, settings, dashboards, conversations) is copied to new users through the template clone preset or userHandling.newUserTemplate. Template users are for setting things up, not for everyday use; Explorer shows a banner while one is signed in.`),
35616
35818
  FirstLast: z.string().nullable().describe(`
35617
35819
  * * Field Name: FirstLast
35618
35820
  * * Display Name: First Last
@@ -72738,6 +72940,221 @@ MJConversationArtifactEntity = __decorate([
72738
72940
  RegisterClass(BaseEntity, 'MJ: Conversation Artifacts')
72739
72941
  ], MJConversationArtifactEntity);
72740
72942
  export { MJConversationArtifactEntity };
72943
+ /**
72944
+ * MJ: Conversation Branches - strongly typed entity sub-class
72945
+ * * Schema: __mj
72946
+ * * Base Table: ConversationBranch
72947
+ * * Base View: vwConversationBranches
72948
+ * * @description A fork of a conversation: another path that starts at a message. Main (the trunk) is the messages with no branch. A fork's path is its own messages plus each ancestor's messages up to that ancestor's ForkFromSequence.
72949
+ * * Primary Key: ID
72950
+ * @extends {BaseEntity}
72951
+ * @class
72952
+ * @public
72953
+ */
72954
+ let MJConversationBranchEntity = class MJConversationBranchEntity extends BaseEntity {
72955
+ /**
72956
+ * Loads the MJ: Conversation Branches record from the database
72957
+ * @param ID: string - primary key value to load the MJ: Conversation Branches record.
72958
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
72959
+ * @returns {Promise<boolean>} - true if successful, false otherwise
72960
+ * @public
72961
+ * @async
72962
+ * @memberof MJConversationBranchEntity
72963
+ * @method
72964
+ * @override
72965
+ */
72966
+ async Load(ID, EntityRelationshipsToLoad) {
72967
+ const compositeKey = new CompositeKey();
72968
+ compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: ID });
72969
+ return await super.InnerLoad(compositeKey, EntityRelationshipsToLoad);
72970
+ }
72971
+ /**
72972
+ * MJ: Conversation Branches - Delete method override to wrap in transaction since CascadeDeletes is true.
72973
+ * Wrapping in a transaction ensures that all cascade delete operations are handled atomically.
72974
+ * @public
72975
+ * @method
72976
+ * @override
72977
+ * @memberof MJConversationBranchEntity
72978
+ * @returns {Promise<boolean>} - true if successful, false otherwise
72979
+ */
72980
+ async Delete(options) {
72981
+ if (Metadata.Provider.ProviderType === ProviderType.Database) { // global-provider-ok: codegen runs offline against a single provider
72982
+ // For database providers, use the transaction methods directly
72983
+ const provider = Metadata.Provider; // global-provider-ok: codegen runs offline against a single provider
72984
+ try {
72985
+ await provider.BeginTransaction();
72986
+ const result = await super.Delete(options);
72987
+ if (result) {
72988
+ await provider.CommitTransaction();
72989
+ return true;
72990
+ }
72991
+ else {
72992
+ await provider.RollbackTransaction();
72993
+ return false;
72994
+ }
72995
+ }
72996
+ catch (error) {
72997
+ await provider.RollbackTransaction();
72998
+ throw error;
72999
+ }
73000
+ }
73001
+ else {
73002
+ // For network providers, cascading deletes are handled server-side
73003
+ return super.Delete(options);
73004
+ }
73005
+ }
73006
+ /**
73007
+ * * Field Name: ID
73008
+ * * Display Name: ID
73009
+ * * SQL Data Type: uniqueidentifier
73010
+ * * Default Value: newsequentialid()
73011
+ */
73012
+ get ID() {
73013
+ return this.Get('ID');
73014
+ }
73015
+ set ID(value) {
73016
+ this.Set('ID', value);
73017
+ }
73018
+ /**
73019
+ * * Field Name: ConversationID
73020
+ * * Display Name: Conversation
73021
+ * * SQL Data Type: uniqueidentifier
73022
+ * * Related Entity/Foreign Key: MJ: Conversations (vwConversations.ID)
73023
+ * * Description: The conversation this fork belongs to.
73024
+ */
73025
+ get ConversationID() {
73026
+ return this.Get('ConversationID');
73027
+ }
73028
+ set ConversationID(value) {
73029
+ this.Set('ConversationID', value);
73030
+ }
73031
+ /**
73032
+ * * Field Name: ParentBranchID
73033
+ * * Display Name: Parent Branch
73034
+ * * SQL Data Type: uniqueidentifier
73035
+ * * Related Entity/Foreign Key: MJ: Conversation Branches (vwConversationBranches.ID)
73036
+ * * Description: The fork this one started from. NULL means it started from Main, or before the first message when ForkFromSequence is also NULL.
73037
+ */
73038
+ get ParentBranchID() {
73039
+ return this.Get('ParentBranchID');
73040
+ }
73041
+ set ParentBranchID(value) {
73042
+ this.Set('ParentBranchID', value);
73043
+ }
73044
+ /**
73045
+ * * Field Name: ForkFromSequence
73046
+ * * Display Name: Fork From Sequence
73047
+ * * SQL Data Type: int
73048
+ * * Description: Sequence of the last message shared with the parent path. NULL means the fork starts before the first message, in which case ParentBranchID is also NULL.
73049
+ */
73050
+ get ForkFromSequence() {
73051
+ return this.Get('ForkFromSequence');
73052
+ }
73053
+ set ForkFromSequence(value) {
73054
+ this.Set('ForkFromSequence', value);
73055
+ }
73056
+ /**
73057
+ * * Field Name: Name
73058
+ * * Display Name: Name
73059
+ * * SQL Data Type: nvarchar(255)
73060
+ * * Description: Optional name of the fork. With no name, the UI shows a default label from Kind: a Fork is named from its first message.
73061
+ */
73062
+ get Name() {
73063
+ return this.Get('Name');
73064
+ }
73065
+ set Name(value) {
73066
+ this.Set('Name', value);
73067
+ }
73068
+ /**
73069
+ * * Field Name: Kind
73070
+ * * Display Name: Kind
73071
+ * * SQL Data Type: nvarchar(20)
73072
+ * * Default Value: Fork
73073
+ * * Value List Type: List
73074
+ * * Possible Values
73075
+ * * Edit
73076
+ * * Fork
73077
+ * * Regenerate
73078
+ * * Description: How the fork started: Fork (Fork from here), Edit (a sent message was edited) or Regenerate (an answer was regenerated).
73079
+ */
73080
+ get Kind() {
73081
+ return this.Get('Kind');
73082
+ }
73083
+ set Kind(value) {
73084
+ this.Set('Kind', value);
73085
+ }
73086
+ /**
73087
+ * * Field Name: SourceDetailID
73088
+ * * Display Name: Source Detail
73089
+ * * SQL Data Type: uniqueidentifier
73090
+ * * Description: The edited message (Kind Edit) or the replaced answer (Kind Regenerate); NULL otherwise. Not a foreign key, to avoid a CodeGen cascade cycle with ConversationDetail.
73091
+ */
73092
+ get SourceDetailID() {
73093
+ return this.Get('SourceDetailID');
73094
+ }
73095
+ set SourceDetailID(value) {
73096
+ this.Set('SourceDetailID', value);
73097
+ }
73098
+ /**
73099
+ * * Field Name: UserID
73100
+ * * Display Name: User
73101
+ * * SQL Data Type: uniqueidentifier
73102
+ * * Related Entity/Foreign Key: MJ: Users (vwUsers.ID)
73103
+ * * Description: The person who started the fork.
73104
+ */
73105
+ get UserID() {
73106
+ return this.Get('UserID');
73107
+ }
73108
+ set UserID(value) {
73109
+ this.Set('UserID', value);
73110
+ }
73111
+ /**
73112
+ * * Field Name: __mj_CreatedAt
73113
+ * * Display Name: Created At
73114
+ * * SQL Data Type: datetimeoffset
73115
+ * * Default Value: getutcdate()
73116
+ */
73117
+ get __mj_CreatedAt() {
73118
+ return this.Get('__mj_CreatedAt');
73119
+ }
73120
+ /**
73121
+ * * Field Name: __mj_UpdatedAt
73122
+ * * Display Name: Updated At
73123
+ * * SQL Data Type: datetimeoffset
73124
+ * * Default Value: getutcdate()
73125
+ */
73126
+ get __mj_UpdatedAt() {
73127
+ return this.Get('__mj_UpdatedAt');
73128
+ }
73129
+ /**
73130
+ * * Field Name: Conversation
73131
+ * * Display Name: Conversation Detail
73132
+ * * SQL Data Type: nvarchar(255)
73133
+ */
73134
+ get Conversation() {
73135
+ return this.Get('Conversation');
73136
+ }
73137
+ /**
73138
+ * * Field Name: ParentBranch
73139
+ * * Display Name: Parent Branch Detail
73140
+ * * SQL Data Type: nvarchar(255)
73141
+ */
73142
+ get ParentBranch() {
73143
+ return this.Get('ParentBranch');
73144
+ }
73145
+ /**
73146
+ * * Field Name: User
73147
+ * * Display Name: User Name
73148
+ * * SQL Data Type: nvarchar(100)
73149
+ */
73150
+ get User() {
73151
+ return this.Get('User');
73152
+ }
73153
+ };
73154
+ MJConversationBranchEntity = __decorate([
73155
+ RegisterClass(BaseEntity, 'MJ: Conversation Branches')
73156
+ ], MJConversationBranchEntity);
73157
+ export { MJConversationBranchEntity };
72741
73158
  /**
72742
73159
  * MJ: Conversation Compaction Runs - strongly typed entity sub-class
72743
73160
  * * Schema: __mj
@@ -73917,6 +74334,31 @@ let MJConversationDetailEntity = class MJConversationDetailEntity extends BaseEn
73917
74334
  return this.Get('Sequence');
73918
74335
  }
73919
74336
  /**
74337
+ * * Field Name: BranchID
74338
+ * * Display Name: Branch
74339
+ * * SQL Data Type: uniqueidentifier
74340
+ * * Related Entity/Foreign Key: MJ: Conversation Branches (vwConversationBranches.ID)
74341
+ * * Description: The fork this message belongs to. NULL means Main (the trunk). Every writer sets it explicitly.
74342
+ */
74343
+ get BranchID() {
74344
+ return this.Get('BranchID');
74345
+ }
74346
+ set BranchID(value) {
74347
+ this.Set('BranchID', value);
74348
+ }
74349
+ /**
74350
+ * * Field Name: ReplacedAt
74351
+ * * Display Name: Replaced At
74352
+ * * SQL Data Type: datetimeoffset
74353
+ * * Description: When a rerun of this message's turn replaced it (Regenerate or Save and resend while forking is off). A replaced row is kept for audit, is hidden from the user and is never sent to an agent. NULL means the row is live.
74354
+ */
74355
+ get ReplacedAt() {
74356
+ return this.Get('ReplacedAt');
74357
+ }
74358
+ set ReplacedAt(value) {
74359
+ this.Set('ReplacedAt', value);
74360
+ }
74361
+ /**
73920
74362
  * * Field Name: Conversation
73921
74363
  * * Display Name: Conversation
73922
74364
  * * SQL Data Type: nvarchar(255)
@@ -73973,6 +74415,14 @@ let MJConversationDetailEntity = class MJConversationDetailEntity extends BaseEn
73973
74415
  return this.Get('TestRun');
73974
74416
  }
73975
74417
  /**
74418
+ * * Field Name: Branch
74419
+ * * Display Name: Branch
74420
+ * * SQL Data Type: nvarchar(255)
74421
+ */
74422
+ get Branch() {
74423
+ return this.Get('Branch');
74424
+ }
74425
+ /**
73976
74426
  * * Field Name: RootParentID
73977
74427
  * * Display Name: Root Parent
73978
74428
  * * SQL Data Type: uniqueidentifier
@@ -113784,6 +114234,239 @@ MJSchemaInfoEntity = __decorate([
113784
114234
  RegisterClass(BaseEntity, 'MJ: Schema Info')
113785
114235
  ], MJSchemaInfoEntity);
113786
114236
  export { MJSchemaInfoEntity };
114237
+ /**
114238
+ * MJ: Scoped Notification Configs - strongly typed entity sub-class
114239
+ * * Schema: __mj
114240
+ * * Base Table: ScopedNotificationConfig
114241
+ * * Base View: vwScopedNotificationConfigs
114242
+ * * @description A notification config at one scope: the level between a notification type's defaults and a recipient's preference where an application, a role, a user or the notice's origin can allow or deny a channel. Scoped by the same primary record + secondary dimensions as Scoped Prompt Configs. Resolution: most specific in-scope row wins per channel; at equal specificity Deny beats Allow; a locked Deny caps every level below it, the recipient's preference included.
114243
+ * * Primary Key: ID
114244
+ * @extends {BaseEntity}
114245
+ * @class
114246
+ * @public
114247
+ */
114248
+ let MJScopedNotificationConfigEntity = class MJScopedNotificationConfigEntity extends BaseEntity {
114249
+ /**
114250
+ * Loads the MJ: Scoped Notification Configs record from the database
114251
+ * @param ID: string - primary key value to load the MJ: Scoped Notification Configs record.
114252
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
114253
+ * @returns {Promise<boolean>} - true if successful, false otherwise
114254
+ * @public
114255
+ * @async
114256
+ * @memberof MJScopedNotificationConfigEntity
114257
+ * @method
114258
+ * @override
114259
+ */
114260
+ async Load(ID, EntityRelationshipsToLoad) {
114261
+ const compositeKey = new CompositeKey();
114262
+ compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: ID });
114263
+ return await super.InnerLoad(compositeKey, EntityRelationshipsToLoad);
114264
+ }
114265
+ /**
114266
+ * * Field Name: ID
114267
+ * * Display Name: ID
114268
+ * * SQL Data Type: uniqueidentifier
114269
+ * * Default Value: newsequentialid()
114270
+ */
114271
+ get ID() {
114272
+ return this.Get('ID');
114273
+ }
114274
+ set ID(value) {
114275
+ this.Set('ID', value);
114276
+ }
114277
+ /**
114278
+ * * Field Name: NotificationTypeID
114279
+ * * Display Name: Notification Type
114280
+ * * SQL Data Type: uniqueidentifier
114281
+ * * Related Entity/Foreign Key: MJ: User Notification Types (vwUserNotificationTypes.ID)
114282
+ * * Description: The notification type this config is for.
114283
+ */
114284
+ get NotificationTypeID() {
114285
+ return this.Get('NotificationTypeID');
114286
+ }
114287
+ set NotificationTypeID(value) {
114288
+ this.Set('NotificationTypeID', value);
114289
+ }
114290
+ /**
114291
+ * * Field Name: Description
114292
+ * * Display Name: Description
114293
+ * * SQL Data Type: nvarchar(MAX)
114294
+ * * Description: Why the row exists, for the administrator who finds it.
114295
+ */
114296
+ get Description() {
114297
+ return this.Get('Description');
114298
+ }
114299
+ set Description(value) {
114300
+ this.Set('Description', value);
114301
+ }
114302
+ /**
114303
+ * * Field Name: PrimaryScopeEntityID
114304
+ * * Display Name: Primary Scope Entity ID
114305
+ * * SQL Data Type: uniqueidentifier
114306
+ * * Related Entity/Foreign Key: MJ: Entities (vwEntities.ID)
114307
+ * * Description: The entity of the primary scope record (Applications, Roles, Users, Companies, ...). NULL with PrimaryScopeRecordID NULL = a global row.
114308
+ */
114309
+ get PrimaryScopeEntityID() {
114310
+ return this.Get('PrimaryScopeEntityID');
114311
+ }
114312
+ set PrimaryScopeEntityID(value) {
114313
+ this.Set('PrimaryScopeEntityID', value);
114314
+ }
114315
+ /**
114316
+ * * Field Name: PrimaryScopeRecordID
114317
+ * * Display Name: Primary Scope Record ID
114318
+ * * SQL Data Type: nvarchar(100)
114319
+ * * Description: The record ID within the primary scope entity this config is scoped to. NULL = global. In scope when it is the caller's primary scope record, the recipient, or a role the recipient holds.
114320
+ */
114321
+ get PrimaryScopeRecordID() {
114322
+ return this.Get('PrimaryScopeRecordID');
114323
+ }
114324
+ set PrimaryScopeRecordID(value) {
114325
+ this.Set('PrimaryScopeRecordID', value);
114326
+ }
114327
+ /**
114328
+ * * Field Name: SecondaryScopes
114329
+ * * Display Name: Secondary Scopes
114330
+ * * SQL Data Type: nvarchar(MAX)
114331
+ * * Description: JSON object of additional scope dimensions, e.g. {"origin":"System"}. Every dimension named must match the notice's scope for the row to apply. origin is Person, System (the Owner-type user) or Automation.
114332
+ */
114333
+ get SecondaryScopes() {
114334
+ return this.Get('SecondaryScopes');
114335
+ }
114336
+ set SecondaryScopes(value) {
114337
+ this.Set('SecondaryScopes', value);
114338
+ }
114339
+ /**
114340
+ * * Field Name: InApp
114341
+ * * Display Name: In-App Channel
114342
+ * * SQL Data Type: nvarchar(20)
114343
+ * * Value List Type: List
114344
+ * * Possible Values
114345
+ * * Allow
114346
+ * * Deny
114347
+ * * Description: The in-app channel: Allow, Deny, or NULL to leave it to the next row.
114348
+ */
114349
+ get InApp() {
114350
+ return this.Get('InApp');
114351
+ }
114352
+ set InApp(value) {
114353
+ this.Set('InApp', value);
114354
+ }
114355
+ /**
114356
+ * * Field Name: Email
114357
+ * * Display Name: Email Channel
114358
+ * * SQL Data Type: nvarchar(20)
114359
+ * * Value List Type: List
114360
+ * * Possible Values
114361
+ * * Allow
114362
+ * * Deny
114363
+ * * Description: The email channel: Allow, Deny, or NULL to leave it to the next row.
114364
+ */
114365
+ get Email() {
114366
+ return this.Get('Email');
114367
+ }
114368
+ set Email(value) {
114369
+ this.Set('Email', value);
114370
+ }
114371
+ /**
114372
+ * * Field Name: SMS
114373
+ * * Display Name: SMS Channel
114374
+ * * SQL Data Type: nvarchar(20)
114375
+ * * Value List Type: List
114376
+ * * Possible Values
114377
+ * * Allow
114378
+ * * Deny
114379
+ * * Description: The SMS channel: Allow, Deny, or NULL to leave it to the next row.
114380
+ */
114381
+ get SMS() {
114382
+ return this.Get('SMS');
114383
+ }
114384
+ set SMS(value) {
114385
+ this.Set('SMS', value);
114386
+ }
114387
+ /**
114388
+ * * Field Name: IsLocked
114389
+ * * Display Name: Is Locked
114390
+ * * SQL Data Type: bit
114391
+ * * Default Value: 0
114392
+ * * Description: When set, a Deny on this row is absorbing: no less specific row and no recipient preference may turn the channel on. The way a notification type's AllowUserPreference caps the recipient today.
114393
+ */
114394
+ get IsLocked() {
114395
+ return this.Get('IsLocked');
114396
+ }
114397
+ set IsLocked(value) {
114398
+ this.Set('IsLocked', value);
114399
+ }
114400
+ /**
114401
+ * * Field Name: Priority
114402
+ * * Display Name: Priority
114403
+ * * SQL Data Type: int
114404
+ * * Default Value: 0
114405
+ * * Description: Tie-break for resolution. Higher wins when two rows tie on scope specificity and neither denies. Default 0.
114406
+ */
114407
+ get Priority() {
114408
+ return this.Get('Priority');
114409
+ }
114410
+ set Priority(value) {
114411
+ this.Set('Priority', value);
114412
+ }
114413
+ /**
114414
+ * * Field Name: Status
114415
+ * * Display Name: Status
114416
+ * * SQL Data Type: nvarchar(20)
114417
+ * * Default Value: Active
114418
+ * * Value List Type: List
114419
+ * * Possible Values
114420
+ * * Active
114421
+ * * Archived
114422
+ * * Provisional
114423
+ * * Description: Lifecycle: Active (live), Provisional (staged; eligible), Archived (excluded from resolution).
114424
+ */
114425
+ get Status() {
114426
+ return this.Get('Status');
114427
+ }
114428
+ set Status(value) {
114429
+ this.Set('Status', value);
114430
+ }
114431
+ /**
114432
+ * * Field Name: __mj_CreatedAt
114433
+ * * Display Name: Created At
114434
+ * * SQL Data Type: datetimeoffset
114435
+ * * Default Value: getutcdate()
114436
+ */
114437
+ get __mj_CreatedAt() {
114438
+ return this.Get('__mj_CreatedAt');
114439
+ }
114440
+ /**
114441
+ * * Field Name: __mj_UpdatedAt
114442
+ * * Display Name: Updated At
114443
+ * * SQL Data Type: datetimeoffset
114444
+ * * Default Value: getutcdate()
114445
+ */
114446
+ get __mj_UpdatedAt() {
114447
+ return this.Get('__mj_UpdatedAt');
114448
+ }
114449
+ /**
114450
+ * * Field Name: NotificationType
114451
+ * * Display Name: Notification Type Name
114452
+ * * SQL Data Type: nvarchar(100)
114453
+ */
114454
+ get NotificationType() {
114455
+ return this.Get('NotificationType');
114456
+ }
114457
+ /**
114458
+ * * Field Name: PrimaryScopeEntity
114459
+ * * Display Name: Primary Scope Entity
114460
+ * * SQL Data Type: nvarchar(255)
114461
+ */
114462
+ get PrimaryScopeEntity() {
114463
+ return this.Get('PrimaryScopeEntity');
114464
+ }
114465
+ };
114466
+ MJScopedNotificationConfigEntity = __decorate([
114467
+ RegisterClass(BaseEntity, 'MJ: Scoped Notification Configs')
114468
+ ], MJScopedNotificationConfigEntity);
114469
+ export { MJScopedNotificationConfigEntity };
113787
114470
  /**
113788
114471
  * MJ: Scoped Prompt Configs - strongly typed entity sub-class
113789
114472
  * * Schema: __mj
@@ -126271,6 +126954,19 @@ let MJUserEntity = class MJUserEntity extends BaseEntity {
126271
126954
  this.Set('UserImageIconClass', value);
126272
126955
  }
126273
126956
  /**
126957
+ * * Field Name: IsTemplate
126958
+ * * Display Name: Is Template
126959
+ * * SQL Data Type: bit
126960
+ * * Default Value: 0
126961
+ * * Description: When true, this user is a template: its configuration (pinned apps, views, settings, dashboards, conversations) is copied to new users through the template clone preset or userHandling.newUserTemplate. Template users are for setting things up, not for everyday use; Explorer shows a banner while one is signed in.
126962
+ */
126963
+ get IsTemplate() {
126964
+ return this.Get('IsTemplate');
126965
+ }
126966
+ set IsTemplate(value) {
126967
+ this.Set('IsTemplate', value);
126968
+ }
126969
+ /**
126274
126970
  * * Field Name: FirstLast
126275
126971
  * * Display Name: First Last
126276
126972
  * * SQL Data Type: nvarchar(101)