@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
@@ -8588,6 +8588,53 @@ export declare const MJConversationArtifactSchema: z.ZodObject<{
8588
8588
  SharingScope?: "None" | "Everyone" | "Public" | "SpecificUsers";
8589
8589
  }>;
8590
8590
  export type MJConversationArtifactEntityType = z.infer<typeof MJConversationArtifactSchema>;
8591
+ /**
8592
+ * zod schema definition for the entity MJ: Conversation Branches
8593
+ */
8594
+ export declare const MJConversationBranchSchema: z.ZodObject<{
8595
+ ID: z.ZodString;
8596
+ ConversationID: z.ZodString;
8597
+ ParentBranchID: z.ZodNullable<z.ZodString>;
8598
+ ForkFromSequence: z.ZodNullable<z.ZodNumber>;
8599
+ Name: z.ZodNullable<z.ZodString>;
8600
+ Kind: z.ZodUnion<[z.ZodLiteral<"Edit">, z.ZodLiteral<"Fork">, z.ZodLiteral<"Regenerate">]>;
8601
+ SourceDetailID: z.ZodNullable<z.ZodString>;
8602
+ UserID: z.ZodString;
8603
+ __mj_CreatedAt: z.ZodDate;
8604
+ __mj_UpdatedAt: z.ZodDate;
8605
+ Conversation: z.ZodNullable<z.ZodString>;
8606
+ ParentBranch: z.ZodNullable<z.ZodString>;
8607
+ User: z.ZodString;
8608
+ }, "strip", z.ZodTypeAny, {
8609
+ ID?: string;
8610
+ Name?: string;
8611
+ __mj_CreatedAt?: Date;
8612
+ __mj_UpdatedAt?: Date;
8613
+ UserID?: string;
8614
+ User?: string;
8615
+ Conversation?: string;
8616
+ ConversationID?: string;
8617
+ ParentBranchID?: string;
8618
+ ForkFromSequence?: number;
8619
+ Kind?: "Edit" | "Fork" | "Regenerate";
8620
+ SourceDetailID?: string;
8621
+ ParentBranch?: string;
8622
+ }, {
8623
+ ID?: string;
8624
+ Name?: string;
8625
+ __mj_CreatedAt?: Date;
8626
+ __mj_UpdatedAt?: Date;
8627
+ UserID?: string;
8628
+ User?: string;
8629
+ Conversation?: string;
8630
+ ConversationID?: string;
8631
+ ParentBranchID?: string;
8632
+ ForkFromSequence?: number;
8633
+ Kind?: "Edit" | "Fork" | "Regenerate";
8634
+ SourceDetailID?: string;
8635
+ ParentBranch?: string;
8636
+ }>;
8637
+ export type MJConversationBranchEntityType = z.infer<typeof MJConversationBranchSchema>;
8591
8638
  /**
8592
8639
  * zod schema definition for the entity MJ: Conversation Compaction Runs
8593
8640
  */
@@ -8792,6 +8839,8 @@ export declare const MJConversationDetailSchema: z.ZodObject<{
8792
8839
  UtteranceEndMs: z.ZodNullable<z.ZodNumber>;
8793
8840
  MediaType: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<"Audio">, z.ZodLiteral<"Text">, z.ZodLiteral<"Video">]>>;
8794
8841
  Sequence: z.ZodNumber;
8842
+ BranchID: z.ZodNullable<z.ZodString>;
8843
+ ReplacedAt: z.ZodNullable<z.ZodDate>;
8795
8844
  Conversation: z.ZodNullable<z.ZodString>;
8796
8845
  User: z.ZodNullable<z.ZodString>;
8797
8846
  Artifact: z.ZodNullable<z.ZodString>;
@@ -8799,6 +8848,7 @@ export declare const MJConversationDetailSchema: z.ZodObject<{
8799
8848
  Parent: z.ZodNullable<z.ZodString>;
8800
8849
  Agent: z.ZodNullable<z.ZodString>;
8801
8850
  TestRun: z.ZodNullable<z.ZodString>;
8851
+ Branch: z.ZodNullable<z.ZodString>;
8802
8852
  RootParentID: z.ZodNullable<z.ZodString>;
8803
8853
  ParentIDDepth: z.ZodNullable<z.ZodNumber>;
8804
8854
  ParentIDPath: z.ZodNullable<z.ZodString>;
@@ -8850,6 +8900,9 @@ export declare const MJConversationDetailSchema: z.ZodObject<{
8850
8900
  UtteranceStartMs?: number;
8851
8901
  UtteranceEndMs?: number;
8852
8902
  MediaType?: "Audio" | "Text" | "Video";
8903
+ BranchID?: string;
8904
+ ReplacedAt?: Date;
8905
+ Branch?: string;
8853
8906
  }, {
8854
8907
  ID?: string;
8855
8908
  __mj_CreatedAt?: Date;
@@ -8896,6 +8949,9 @@ export declare const MJConversationDetailSchema: z.ZodObject<{
8896
8949
  UtteranceStartMs?: number;
8897
8950
  UtteranceEndMs?: number;
8898
8951
  MediaType?: "Audio" | "Text" | "Video";
8952
+ BranchID?: string;
8953
+ ReplacedAt?: Date;
8954
+ Branch?: string;
8899
8955
  }>;
8900
8956
  export type MJConversationDetailEntityType = z.infer<typeof MJConversationDetailSchema>;
8901
8957
  /**
@@ -14813,12 +14869,12 @@ export declare const MJMagicLinkInviteSchema: z.ZodObject<{
14813
14869
  ApplicationID?: string;
14814
14870
  Application?: string;
14815
14871
  ResourceType?: string;
14872
+ Kind?: "anonymous-embed" | "app-session" | "resource-share";
14816
14873
  TokenHash?: string;
14817
14874
  ConsumedAt?: Date;
14818
14875
  MaxUses?: number;
14819
14876
  UseCount?: number;
14820
14877
  IdentityMode?: "anonymous" | "email";
14821
- Kind?: "anonymous-embed" | "app-session" | "resource-share";
14822
14878
  ResourceTypeID?: string;
14823
14879
  ResourceID?: string;
14824
14880
  }, {
@@ -14835,12 +14891,12 @@ export declare const MJMagicLinkInviteSchema: z.ZodObject<{
14835
14891
  ApplicationID?: string;
14836
14892
  Application?: string;
14837
14893
  ResourceType?: string;
14894
+ Kind?: "anonymous-embed" | "app-session" | "resource-share";
14838
14895
  TokenHash?: string;
14839
14896
  ConsumedAt?: Date;
14840
14897
  MaxUses?: number;
14841
14898
  UseCount?: number;
14842
14899
  IdentityMode?: "anonymous" | "email";
14843
- Kind?: "anonymous-embed" | "app-session" | "resource-share";
14844
14900
  ResourceTypeID?: string;
14845
14901
  ResourceID?: string;
14846
14902
  }>;
@@ -18684,6 +18740,62 @@ export declare const MJSchemaInfoSchema: z.ZodObject<{
18684
18740
  EntityNameSuffix?: string;
18685
18741
  }>;
18686
18742
  export type MJSchemaInfoEntityType = z.infer<typeof MJSchemaInfoSchema>;
18743
+ /**
18744
+ * zod schema definition for the entity MJ: Scoped Notification Configs
18745
+ */
18746
+ export declare const MJScopedNotificationConfigSchema: z.ZodObject<{
18747
+ ID: z.ZodString;
18748
+ NotificationTypeID: z.ZodString;
18749
+ Description: z.ZodNullable<z.ZodString>;
18750
+ PrimaryScopeEntityID: z.ZodNullable<z.ZodString>;
18751
+ PrimaryScopeRecordID: z.ZodNullable<z.ZodString>;
18752
+ SecondaryScopes: z.ZodNullable<z.ZodString>;
18753
+ InApp: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<"Allow">, z.ZodLiteral<"Deny">]>>;
18754
+ Email: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<"Allow">, z.ZodLiteral<"Deny">]>>;
18755
+ SMS: z.ZodNullable<z.ZodUnion<[z.ZodLiteral<"Allow">, z.ZodLiteral<"Deny">]>>;
18756
+ IsLocked: z.ZodBoolean;
18757
+ Priority: z.ZodNumber;
18758
+ Status: z.ZodUnion<[z.ZodLiteral<"Active">, z.ZodLiteral<"Archived">, z.ZodLiteral<"Provisional">]>;
18759
+ __mj_CreatedAt: z.ZodDate;
18760
+ __mj_UpdatedAt: z.ZodDate;
18761
+ NotificationType: z.ZodString;
18762
+ PrimaryScopeEntity: z.ZodNullable<z.ZodString>;
18763
+ }, "strip", z.ZodTypeAny, {
18764
+ ID?: string;
18765
+ Description?: string;
18766
+ __mj_CreatedAt?: Date;
18767
+ __mj_UpdatedAt?: Date;
18768
+ Status?: "Active" | "Archived" | "Provisional";
18769
+ Priority?: number;
18770
+ PrimaryScopeEntityID?: string;
18771
+ PrimaryScopeRecordID?: string;
18772
+ SecondaryScopes?: string;
18773
+ PrimaryScopeEntity?: string;
18774
+ Email?: "Allow" | "Deny";
18775
+ IsLocked?: boolean;
18776
+ SMS?: "Allow" | "Deny";
18777
+ NotificationTypeID?: string;
18778
+ InApp?: "Allow" | "Deny";
18779
+ NotificationType?: string;
18780
+ }, {
18781
+ ID?: string;
18782
+ Description?: string;
18783
+ __mj_CreatedAt?: Date;
18784
+ __mj_UpdatedAt?: Date;
18785
+ Status?: "Active" | "Archived" | "Provisional";
18786
+ Priority?: number;
18787
+ PrimaryScopeEntityID?: string;
18788
+ PrimaryScopeRecordID?: string;
18789
+ SecondaryScopes?: string;
18790
+ PrimaryScopeEntity?: string;
18791
+ Email?: "Allow" | "Deny";
18792
+ IsLocked?: boolean;
18793
+ SMS?: "Allow" | "Deny";
18794
+ NotificationTypeID?: string;
18795
+ InApp?: "Allow" | "Deny";
18796
+ NotificationType?: string;
18797
+ }>;
18798
+ export type MJScopedNotificationConfigEntityType = z.infer<typeof MJScopedNotificationConfigSchema>;
18687
18799
  /**
18688
18800
  * zod schema definition for the entity MJ: Scoped Prompt Configs
18689
18801
  */
@@ -21153,24 +21265,24 @@ export declare const MJUserNotificationPreferenceSchema: z.ZodObject<{
21153
21265
  __mj_UpdatedAt?: Date;
21154
21266
  UserID?: string;
21155
21267
  User?: string;
21156
- Enabled?: boolean;
21157
21268
  NotificationTypeID?: string;
21269
+ NotificationType?: string;
21270
+ Enabled?: boolean;
21158
21271
  InAppEnabled?: boolean;
21159
21272
  EmailEnabled?: boolean;
21160
21273
  SMSEnabled?: boolean;
21161
- NotificationType?: string;
21162
21274
  }, {
21163
21275
  ID?: string;
21164
21276
  __mj_CreatedAt?: Date;
21165
21277
  __mj_UpdatedAt?: Date;
21166
21278
  UserID?: string;
21167
21279
  User?: string;
21168
- Enabled?: boolean;
21169
21280
  NotificationTypeID?: string;
21281
+ NotificationType?: string;
21282
+ Enabled?: boolean;
21170
21283
  InAppEnabled?: boolean;
21171
21284
  EmailEnabled?: boolean;
21172
21285
  SMSEnabled?: boolean;
21173
- NotificationType?: string;
21174
21286
  }>;
21175
21287
  export type MJUserNotificationPreferenceEntityType = z.infer<typeof MJUserNotificationPreferenceSchema>;
21176
21288
  /**
@@ -21835,6 +21947,7 @@ export declare const MJUserSchema: z.ZodObject<{
21835
21947
  __mj_UpdatedAt: z.ZodDate;
21836
21948
  UserImageURL: z.ZodNullable<z.ZodString>;
21837
21949
  UserImageIconClass: z.ZodNullable<z.ZodString>;
21950
+ IsTemplate: z.ZodBoolean;
21838
21951
  FirstLast: z.ZodNullable<z.ZodString>;
21839
21952
  EmployeeFirstLast: z.ZodNullable<z.ZodString>;
21840
21953
  EmployeeEmail: z.ZodNullable<z.ZodString>;
@@ -21859,6 +21972,7 @@ export declare const MJUserSchema: z.ZodObject<{
21859
21972
  LinkedEntityRecordID?: string;
21860
21973
  UserImageURL?: string;
21861
21974
  UserImageIconClass?: string;
21975
+ IsTemplate?: boolean;
21862
21976
  EmployeeFirstLast?: string;
21863
21977
  EmployeeEmail?: string;
21864
21978
  EmployeeTitle?: string;
@@ -21882,6 +21996,7 @@ export declare const MJUserSchema: z.ZodObject<{
21882
21996
  LinkedEntityRecordID?: string;
21883
21997
  UserImageURL?: string;
21884
21998
  UserImageIconClass?: string;
21999
+ IsTemplate?: boolean;
21885
22000
  EmployeeFirstLast?: string;
21886
22001
  EmployeeEmail?: string;
21887
22002
  EmployeeTitle?: string;
@@ -23271,8 +23386,8 @@ export declare class MJAIAgentCategoryEntity extends BaseEntity<MJAIAgentCategor
23271
23386
  *
23272
23387
  * Distinct from the channel's `ConfigSchema` column, which validates the *per-session*
23273
23388
  * `AIAgentSessionChannel.Config` state-of-record. This bag is the channel-definition's
23274
- * own UI chrome, read in-memory by the host when rendering channel tabs. Extensible with
23275
- * no DB change — add future chrome fields here.
23389
+ * own UI chrome, read in-memory by the host when rendering channel tabs and placing the
23390
+ * channel's surface. Extensible with no DB change — add future chrome fields here.
23276
23391
  */
23277
23392
  export interface MJAIAgentChannelEntity_IChannelUIConfig {
23278
23393
  /** Human label for the tab/chrome. Null → fall back to the channel's Name. */
@@ -23285,6 +23400,17 @@ export interface MJAIAgentChannelEntity_IChannelUIConfig {
23285
23400
  Icon?: string | null;
23286
23401
  /** Display order within a group/list. */
23287
23402
  SortOrder?: number | null;
23403
+ /**
23404
+ * Where the channel's surface shows when a call starts: "stage" fills the call, "pip" floats in a
23405
+ * picture-in-picture box over it, "tab" sits on its tab in the side panel, "hidden" shows nowhere until
23406
+ * the user moves it. Null → "tab". The user's own move wins over this, when AllowedPlacements allows it.
23407
+ */
23408
+ Placement?: 'stage' | 'pip' | 'tab' | 'hidden' | null;
23409
+ /**
23410
+ * Where the user may move the channel's surface. Null or empty → anywhere. A Placement missing from
23411
+ * this list is replaced by the first placement listed here.
23412
+ */
23413
+ AllowedPlacements?: Array<'stage' | 'pip' | 'tab' | 'hidden'> | null;
23288
23414
  }
23289
23415
  /**
23290
23416
  * MJ: AI Agent Channels - strongly typed entity sub-class
@@ -25715,6 +25841,16 @@ export interface MJAIAgentPersonaEntity_IAIAgentPersonaStyleOverride {
25715
25841
  Tone?: string;
25716
25842
  /** Optional override for the persona's SpeakingStyle. */
25717
25843
  SpeakingStyle?: string;
25844
+ /**
25845
+ * Optional override for the persona's Visual: how the agent's video shows in the call. A member set here wins over
25846
+ * the persona's.
25847
+ */
25848
+ Visual?: {
25849
+ /** How much of the avatar the tile frames. */
25850
+ Framing?: 'head' | 'shoulders' | 'waist';
25851
+ /** The accent of the ring that frames the tile while the agent speaks: a design-token name, never a color value. */
25852
+ AccentToken?: string;
25853
+ };
25718
25854
  /** Open extension point for additional descriptor overrides. */
25719
25855
  [key: string]: unknown;
25720
25856
  }
@@ -32991,7 +33127,8 @@ export declare class MJAIModelPriceUnitTypeEntity extends BaseEntity<MJAIModelPr
32991
33127
  * Two kinds of type live here, and the distinction is the whole point of the file:
32992
33128
  *
32993
33129
  * 1. **Shared modality sections** (`MJAIModelTypeEntity_LLMConfigurationSettings`, `MJAIModelTypeEntity_RealtimeConfigurationSettings`,
32994
- * `MJAIModelTypeEntity_VisionConfigurationSettings`, `MJAIModelTypeEntity_AudioConfigurationSettings`, `MJAIModelTypeEntity_DecisionConfigurationSettings`) —
33130
+ * `MJAIModelTypeEntity_VisionConfigurationSettings`, `MJAIModelTypeEntity_AudioConfigurationSettings`, `MJAIModelTypeEntity_DecisionConfigurationSettings`,
33131
+ * `MJAIModelTypeEntity_PrivacyConfigurationSettings`) —
32995
33132
  * what "the LLM configuration"
32996
33133
  * MEANS, defined once and reused by every layer that carries a configuration bag.
32997
33134
  * 2. **Per-table outer types** (`MJAIModelTypeEntity_IAIModelConfiguration`, `MJAIModelTypeEntity_IAIPromptConfiguration`,
@@ -33017,12 +33154,13 @@ export declare class MJAIModelPriceUnitTypeEntity extends BaseEntity<MJAIModelPr
33017
33154
  * therefore has to be self-contained — a definition cannot `import` a sibling, and `@file:`
33018
33155
  * substitutes a whole file rather than splicing one into another. Keeping every AI configuration
33019
33156
  * type in ONE file is what makes a shared section possible at all; the cost is that each of the
33020
- * five entities emits the full (prefixed) set, including outer types it does not use.
33157
+ * six entities emits the full (prefixed) set, including outer types it does not use.
33021
33158
  *
33022
33159
  * **Lockstep contract**: this file is the JSONType SOURCE; its package-side mirror is
33023
33160
  * `packages/AI/Core/src/generic/modelConfiguration.ts` in `@memberjunction/ai`, which runtime code
33024
- * compiles against. Keep the two in step when adding a section or property — the same pact
33025
- * `IAgentSettings` follows with `@memberjunction/ai-core-plus`.
33161
+ * compiles against (the track types mirror its `realtimeTracks.ts`). Keep the two in step when
33162
+ * adding a section or property — the same pact `IAgentSettings` follows with
33163
+ * `@memberjunction/ai-core-plus`. Core's `modelConfiguration.test.ts` fails when they differ.
33026
33164
  *
33027
33165
  * **Boundary rule**: anything the engine filters, sorts, or joins on stays a COLUMN (`PowerRank`,
33028
33166
  * `IsActive`, `Priority`, `Status` — SQL cannot cheaply predicate into this bag); anything a driver
@@ -33099,6 +33237,21 @@ export interface MJAIModelTypeEntity_LLMConfigurationSettings {
33099
33237
  */
33100
33238
  PrefixPromptCache?: boolean | null;
33101
33239
  }
33240
+ /**
33241
+ * MJ-normalized turn-detection mode, provider-neutral so a shared catalog is safe on every provider:
33242
+ * - `'default'` — let the provider profile decide (today's behavior).
33243
+ * - `'serverVad'` — classic silence-based server VAD.
33244
+ * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
33245
+ * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
33246
+ * to; the forward slot for full-duplex reasoning voice models.
33247
+ */
33248
+ export type MJAIModelTypeEntity_RealtimeTurnDetectionMode = 'default' | 'serverVad' | 'semanticVad' | 'native';
33249
+ /**
33250
+ * What a turn's input may include (distinct from detection, which decides when a turn ends):
33251
+ * - `'audioActivityOnly'` — audio activity only; video frames are sent deliberately.
33252
+ * - `'audioActivityAndAllVideo'` — audio activity plus every video frame (Gemini 3.8 Live's default).
33253
+ */
33254
+ export type MJAIModelTypeEntity_RealtimeTurnCoverage = 'audioActivityOnly' | 'audioActivityAndAllVideo';
33102
33255
  /**
33103
33256
  * MJ-normalized turn-detection settings for realtime (speech-to-speech) models. Every field is
33104
33257
  * optional; absent fields contribute nothing. Provider profiles translate this vocabulary to their
@@ -33106,39 +33259,139 @@ export interface MJAIModelTypeEntity_LLMConfigurationSettings {
33106
33259
  * default — a wrong inherited value degrades safely, it never rejects a session.
33107
33260
  */
33108
33261
  export interface MJAIModelTypeEntity_RealtimeTurnDetectionSettings {
33109
- /**
33110
- * - `'default'` — let the provider profile decide (today's behavior).
33111
- * - `'serverVad'` — classic silence-based server VAD.
33112
- * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
33113
- * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
33114
- * to; the forward slot for full-duplex reasoning voice models.
33115
- */
33116
- Mode?: 'default' | 'serverVad' | 'semanticVad' | 'native' | null;
33262
+ /** The normalized mode; absent = `'default'`. */
33263
+ Mode?: MJAIModelTypeEntity_RealtimeTurnDetectionMode;
33117
33264
  /** Semantic-VAD aggressiveness (OpenAI `eagerness`); ignored without a mapping. */
33118
- Eagerness?: 'low' | 'auto' | 'high' | null;
33265
+ Eagerness?: 'low' | 'auto' | 'high';
33119
33266
  /** Server-VAD activation threshold (0–1); ignored without a mapping. */
33120
- Threshold?: number | null;
33267
+ Threshold?: number;
33121
33268
  /** Server-VAD trailing-silence duration in ms; ignored without a mapping. */
33122
- SilenceDurationMs?: number | null;
33269
+ SilenceDurationMs?: number;
33270
+ /**
33271
+ * What a turn's input may include. Declaring it keeps Gemini 3.8 Live's every-frame default (billed,
33272
+ * and consuming context) a decision rather than an inherited cost. Ignored without a mapping.
33273
+ */
33274
+ Coverage?: MJAIModelTypeEntity_RealtimeTurnCoverage;
33275
+ }
33276
+ /** Which plane handles reasoning: `'local'` (the application/agent loop, the default) or `'remote'`. */
33277
+ export type MJAIModelTypeEntity_RealtimeReasoningPlane = 'local' | 'remote';
33278
+ /** A reasoning effort in MJ's neutral vocabulary; each provider profile maps the values its model accepts. */
33279
+ export type MJAIModelTypeEntity_RealtimeReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
33280
+ /** The remote reasoning target, used when `Plane` is `'remote'`. */
33281
+ export interface MJAIModelTypeEntity_RealtimeRemoteReasoning {
33282
+ /** What the reference denotes: `'model'` (Live, Inworld) or `'hostedAgent'` (ElevenLabs). */
33283
+ Kind?: 'model' | 'hostedAgent';
33284
+ /** The target, e.g. `'gpt-5.6-terra'`, `'anthropic/claude-sonnet-4-6'`, `'MJ Realtime Co-Agent'`. */
33285
+ Ref?: string;
33286
+ /** The target's reasoning effort, for models that support one. */
33287
+ Effort?: MJAIModelTypeEntity_RealtimeReasoningEffort;
33288
+ /** The most output tokens for the remote reasoning pass. */
33289
+ MaxOutputTokens?: number;
33290
+ }
33291
+ /** Reasoning-plane settings for realtime models — dual delegation configuration. */
33292
+ export interface MJAIModelTypeEntity_RealtimeReasoningSettings {
33293
+ /** Absent = `'local'`. Fixed when the session is created. */
33294
+ Plane?: MJAIModelTypeEntity_RealtimeReasoningPlane;
33295
+ /** The remote target when `Plane` is `'remote'`. */
33296
+ Remote?: MJAIModelTypeEntity_RealtimeRemoteReasoning;
33297
+ /**
33298
+ * How hard the model itself reasons (Gemini `thinkingConfig.thinkingLevel`). A profile that cannot
33299
+ * honour the value logs a warning and uses its own default.
33300
+ */
33301
+ Level?: MJAIModelTypeEntity_RealtimeReasoningEffort;
33302
+ /**
33303
+ * Ask the model for human-readable summaries of its own reasoning (Gemini `includeThoughts`). They
33304
+ * are progress narration, not assistant speech. Absent = off.
33305
+ */
33306
+ IncludeThoughtSummaries?: boolean;
33307
+ }
33308
+ /** Which way samples flow on a track, relative to the model. */
33309
+ export type MJAIModelTypeEntity_RealtimeTrackDirection = 'inbound' | 'outbound';
33310
+ /** The modalities MJ itself reasons about (cost, consent, transcripts). */
33311
+ export type MJAIModelTypeEntity_RealtimeWellKnownModality = 'audio' | 'video' | 'image' | 'text';
33312
+ /** A modality key: one of the well-known values, or any registered string. */
33313
+ export type MJAIModelTypeEntity_RealtimeModalityKey = MJAIModelTypeEntity_RealtimeWellKnownModality | (string & {});
33314
+ /** How a track's usage is metered. */
33315
+ export type MJAIModelTypeEntity_RealtimeTrackUsageBasis = 'tokens' | 'seconds' | 'frames' | 'bytes';
33316
+ /**
33317
+ * One directional stream of one modality, as {@link MJAIModelTypeEntity_RealtimeConfigurationSettings.RequestedTracks}
33318
+ * requests it. Mirrors the track descriptor in `@memberjunction/ai` (`realtimeTracks.ts`).
33319
+ */
33320
+ export interface MJAIModelTypeEntity_RealtimeTrackDescriptor {
33321
+ /** The modality this track carries. */
33322
+ Modality: MJAIModelTypeEntity_RealtimeModalityKey;
33323
+ /** Which way samples flow, relative to the model. */
33324
+ Direction: MJAIModelTypeEntity_RealtimeTrackDirection;
33325
+ /** Wire encoding, e.g. `'audio/pcm;rate=16000'` or `'image/jpeg'`; absent = the profile's default. */
33326
+ Encoding?: string;
33327
+ /** Sample or frame cadence: fps for video, Hz for audio. */
33328
+ Rate?: number;
33329
+ /** How this track is metered; absent = the session's own basis. */
33330
+ UsageBasis?: readonly MJAIModelTypeEntity_RealtimeTrackUsageBasis[];
33331
+ /** Whether establishing this track needs an explicit human grant (camera, screen, microphone). */
33332
+ RequiresConsent?: boolean;
33333
+ /** Whether the session needs this track (`true`) or treats it as best-effort (`false`). */
33334
+ Required?: boolean;
33335
+ /** Which source feeds this track, when several streams of one modality and direction can exist. */
33336
+ SourceID?: string;
33337
+ /** A human-readable name for that source ("Whiteboard", "Camera"). */
33338
+ Label?: string;
33123
33339
  }
33124
33340
  /**
33125
- * Reasoning-plane settings for realtime models — dual delegation configuration. Absent defaults to
33126
- * `'local'`.
33341
+ * Which server signal means "the session has gone idle and deferred work may be flushed":
33342
+ * `'turnComplete'` (the default) or `'interactionStatus'`, for models with asynchronous reasoning
33343
+ * whose `turnComplete` arrives while they still reason and call tools.
33127
33344
  */
33128
- export interface MJAIModelTypeEntity_RealtimeReasoningSettings {
33345
+ export type MJAIModelTypeEntity_RealtimeIdleSignal = 'turnComplete' | 'interactionStatus';
33346
+ /** Tool-execution semantics a model permits. Capability declarations, not requests. */
33347
+ export interface MJAIModelTypeEntity_RealtimeToolingSettings {
33129
33348
  /**
33130
- * Which plane handles reasoning:
33131
- * - `'local'` — application/agent loop (default).
33132
- * - `'remote'` — delegated to remote model or hosted agent.
33349
+ * Whether synchronous blocking tool execution is legal. Absent = permitted. `false` on models that
33350
+ * reject blocking mode outright (Gemini 3.8 Live Extended Thinking).
33133
33351
  */
33134
- Plane?: 'local' | 'remote' | null;
33135
- /** Remote reasoning target configuration. */
33136
- Remote?: {
33137
- Kind?: 'model' | 'hostedAgent' | null;
33138
- Ref?: string | null;
33139
- Effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
33140
- MaxOutputTokens?: number | null;
33141
- } | null;
33352
+ SupportsBlockingExecution?: boolean;
33353
+ /**
33354
+ * Whether per-function scheduling hints are legal (Gemini `SILENT` / `WHEN_IDLE` / `INTERRUPTED`).
33355
+ * Absent = not supported.
33356
+ */
33357
+ SupportsScheduling?: boolean;
33358
+ /** Preferred function-calling behavior. */
33359
+ Behavior?: 'BLOCKING' | 'NON_BLOCKING';
33360
+ }
33361
+ /**
33362
+ * One price for a quantity a realtime session produces, in one currency. It applies only when all
33363
+ * three fields are set; a partial price, or a unit or currency the reader does not handle, counts
33364
+ * as no price.
33365
+ */
33366
+ export interface MJAIModelTypeEntity_RealtimeUnitPrice {
33367
+ /** The amount charged per {@link MJAIModelTypeEntity_RealtimeUnitPrice.Unit}. Never negative. */
33368
+ Price?: number | null;
33369
+ /**
33370
+ * The billing unit, named as in `MJ: AI Model Price Unit Types`. `'Per Minute'`: one minute.
33371
+ * `'Per 1M Tokens'`: one million tokens.
33372
+ */
33373
+ Unit?: 'Per Minute' | 'Per 1M Tokens' | null;
33374
+ /** ISO 4217 currency code, uppercase (e.g. `USD`), as on `MJ: AI Model Costs`. */
33375
+ Currency?: string | null;
33376
+ }
33377
+ /**
33378
+ * Prices for realtime output that the model's cost rows (`MJ: AI Model Costs`) do not price on
33379
+ * their own; the cost rows stay the authority for token prices. A price belongs to the host that
33380
+ * charges it, so set this on the model-vendor row: a price on the model or the model type would
33381
+ * reach every vendor that serves the model.
33382
+ */
33383
+ export interface MJAIModelTypeEntity_RealtimePricingSettings {
33384
+ /**
33385
+ * The price of avatar video output, charged on top of the session's token cost. `'Per Minute'`
33386
+ * prices the seconds of avatar video the model generates; `'Per 1M Tokens'` prices the output
33387
+ * tokens the provider counts as video. Set the price and its unit together: the cascade merges
33388
+ * per key, so a layer that sets only one of them keeps the other from the layer below.
33389
+ *
33390
+ * Unverified until checked against Google's bill (#5312): Gemini 3.8 Live on Vertex AI is
33391
+ * seeded at $0.37152 per minute, derived from Google's $1.00 per 1M avatar video output tokens
33392
+ * at 6,192 tokens per second.
33393
+ */
33394
+ AvatarVideoOutput?: MJAIModelTypeEntity_RealtimeUnitPrice | null;
33142
33395
  }
33143
33396
  /** Realtime (speech-to-speech) knobs. */
33144
33397
  export interface MJAIModelTypeEntity_RealtimeConfigurationSettings {
@@ -33152,7 +33405,31 @@ export interface MJAIModelTypeEntity_RealtimeConfigurationSettings {
33152
33405
  /**
33153
33406
  * Reasoning plane settings — dual delegation configuration. Absent defaults to `'local'`.
33154
33407
  */
33155
- Reasoning?: MJAIModelTypeEntity_RealtimeReasoningSettings | null;
33408
+ Reasoning?: MJAIModelTypeEntity_RealtimeReasoningSettings;
33409
+ /**
33410
+ * Whether this realtime model natively supports full-duplex conversational audio
33411
+ * (simultaneous speaking and listening with natural interruptions).
33412
+ *
33413
+ * When true, full-duplex models do not receive turn-taking tools or an energy-VAD floor gate,
33414
+ * allowing the provider's native full-duplex model to handle natural turn transitions.
33415
+ * Cascades AIModelType -> Vendor ModelDefaults -> AIModel -> AIModelVendor.
33416
+ */
33417
+ FullDuplex?: boolean | null;
33418
+ /** Tool-execution semantics this model permits. Absent = the profile's own defaults. */
33419
+ Tooling?: MJAIModelTypeEntity_RealtimeToolingSettings;
33420
+ /**
33421
+ * Media tracks a session asks the model to establish beyond audio. Absent or empty establishes
33422
+ * audio only, so a video track exists only because something asked for it and never arrives as an
33423
+ * inherited cost. Requests are intersected with what the model supports.
33424
+ */
33425
+ RequestedTracks?: readonly MJAIModelTypeEntity_RealtimeTrackDescriptor[];
33426
+ /** Which server signal means the session has gone idle. Absent = `'turnComplete'`. */
33427
+ IdleSignal?: MJAIModelTypeEntity_RealtimeIdleSignal;
33428
+ /**
33429
+ * Prices for output the token cost rows do not cover, such as avatar video. Set it on the
33430
+ * model-vendor row.
33431
+ */
33432
+ Pricing?: MJAIModelTypeEntity_RealtimePricingSettings | null;
33156
33433
  }
33157
33434
  /** Vision knobs. Reserved — no consumers yet. */
33158
33435
  export interface MJAIModelTypeEntity_VisionConfigurationSettings {
@@ -33162,6 +33439,22 @@ export interface MJAIModelTypeEntity_VisionConfigurationSettings {
33162
33439
  export interface MJAIModelTypeEntity_AudioConfigurationSettings {
33163
33440
  [key: string]: unknown;
33164
33441
  }
33442
+ /**
33443
+ * Privacy posture of the model deployment this configuration describes. Set it on the catalog layers
33444
+ * (`MJ: AI Models`, `MJ: AI Model Vendors`, a vendor's `ModelDefaults`): data retention is a property of
33445
+ * how a model is SERVED, so the vendor row is usually where it is true.
33446
+ */
33447
+ export interface MJAIModelTypeEntity_PrivacyConfigurationSettings {
33448
+ /**
33449
+ * Whether this model is served under a zero-data-retention agreement: the provider does not store
33450
+ * prompts, audio, images or outputs beyond serving the request. `true` is a positive claim that
33451
+ * somebody verified; absent, `null` and `false` all mean "not declared", never "retained", because
33452
+ * an undeclared model is not known to be bad. It is read by realtime channel exposure policy:
33453
+ * an agent that requires zero data retention for a channel's `'state'` or `'pixels'` exposure has
33454
+ * that exposure lowered on any model that does not declare `true` here.
33455
+ */
33456
+ ZeroDataRetention?: boolean | null;
33457
+ }
33165
33458
  /**
33166
33459
  * Typed-decision knobs, consumed at call time by the decision runner. They declare what a decision
33167
33460
  * model accepts, so an oversized request can be refused with a clear message before the call,
@@ -33196,6 +33489,8 @@ export interface MJAIModelTypeEntity_IAIModelConfiguration {
33196
33489
  Audio?: MJAIModelTypeEntity_AudioConfigurationSettings | null;
33197
33490
  /** Typed-decision limits. Honored at the catalog layers. */
33198
33491
  Decision?: MJAIModelTypeEntity_DecisionConfigurationSettings | null;
33492
+ /** Privacy posture of the model deployment. Honored at the catalog layers. */
33493
+ Privacy?: MJAIModelTypeEntity_PrivacyConfigurationSettings | null;
33199
33494
  }
33200
33495
  /**
33201
33496
  * The `PromptConfiguration` column on `MJ: AI Prompts` — per-prompt call-time knobs, layered ON TOP of the
@@ -33215,6 +33510,8 @@ export interface MJAIModelTypeEntity_IAIPromptConfiguration {
33215
33510
  Audio?: MJAIModelTypeEntity_AudioConfigurationSettings | null;
33216
33511
  /** Typed-decision limits. Reserved at this layer. */
33217
33512
  Decision?: MJAIModelTypeEntity_DecisionConfigurationSettings | null;
33513
+ /** Privacy posture. Reserved at this layer. */
33514
+ Privacy?: MJAIModelTypeEntity_PrivacyConfigurationSettings | null;
33218
33515
  }
33219
33516
  /**
33220
33517
  * The `PromptConfiguration` column on `MJ: AI Prompt Models` — the most specific layer, overriding both
@@ -33231,6 +33528,8 @@ export interface MJAIModelTypeEntity_IAIPromptModelConfiguration {
33231
33528
  Audio?: MJAIModelTypeEntity_AudioConfigurationSettings | null;
33232
33529
  /** Typed-decision limits. Reserved at this layer. */
33233
33530
  Decision?: MJAIModelTypeEntity_DecisionConfigurationSettings | null;
33531
+ /** Privacy posture. Reserved at this layer. */
33532
+ Privacy?: MJAIModelTypeEntity_PrivacyConfigurationSettings | null;
33234
33533
  }
33235
33534
  /**
33236
33535
  * `MJ: AI Vendors . Configuration` — the vendor's own configuration bag. General-purpose: a vendor
@@ -33382,7 +33681,8 @@ export declare class MJAIModelTypeEntity extends BaseEntity<MJAIModelTypeEntityT
33382
33681
  * Two kinds of type live here, and the distinction is the whole point of the file:
33383
33682
  *
33384
33683
  * 1. **Shared modality sections** (`MJAIModelVendorEntity_LLMConfigurationSettings`, `MJAIModelVendorEntity_RealtimeConfigurationSettings`,
33385
- * `MJAIModelVendorEntity_VisionConfigurationSettings`, `MJAIModelVendorEntity_AudioConfigurationSettings`, `MJAIModelVendorEntity_DecisionConfigurationSettings`) —
33684
+ * `MJAIModelVendorEntity_VisionConfigurationSettings`, `MJAIModelVendorEntity_AudioConfigurationSettings`, `MJAIModelVendorEntity_DecisionConfigurationSettings`,
33685
+ * `MJAIModelVendorEntity_PrivacyConfigurationSettings`) —
33386
33686
  * what "the LLM configuration"
33387
33687
  * MEANS, defined once and reused by every layer that carries a configuration bag.
33388
33688
  * 2. **Per-table outer types** (`MJAIModelVendorEntity_IAIModelConfiguration`, `MJAIModelVendorEntity_IAIPromptConfiguration`,
@@ -33408,12 +33708,13 @@ export declare class MJAIModelTypeEntity extends BaseEntity<MJAIModelTypeEntityT
33408
33708
  * therefore has to be self-contained — a definition cannot `import` a sibling, and `@file:`
33409
33709
  * substitutes a whole file rather than splicing one into another. Keeping every AI configuration
33410
33710
  * type in ONE file is what makes a shared section possible at all; the cost is that each of the
33411
- * five entities emits the full (prefixed) set, including outer types it does not use.
33711
+ * six entities emits the full (prefixed) set, including outer types it does not use.
33412
33712
  *
33413
33713
  * **Lockstep contract**: this file is the JSONType SOURCE; its package-side mirror is
33414
33714
  * `packages/AI/Core/src/generic/modelConfiguration.ts` in `@memberjunction/ai`, which runtime code
33415
- * compiles against. Keep the two in step when adding a section or property — the same pact
33416
- * `IAgentSettings` follows with `@memberjunction/ai-core-plus`.
33715
+ * compiles against (the track types mirror its `realtimeTracks.ts`). Keep the two in step when
33716
+ * adding a section or property — the same pact `IAgentSettings` follows with
33717
+ * `@memberjunction/ai-core-plus`. Core's `modelConfiguration.test.ts` fails when they differ.
33417
33718
  *
33418
33719
  * **Boundary rule**: anything the engine filters, sorts, or joins on stays a COLUMN (`PowerRank`,
33419
33720
  * `IsActive`, `Priority`, `Status` — SQL cannot cheaply predicate into this bag); anything a driver
@@ -33490,6 +33791,21 @@ export interface MJAIModelVendorEntity_LLMConfigurationSettings {
33490
33791
  */
33491
33792
  PrefixPromptCache?: boolean | null;
33492
33793
  }
33794
+ /**
33795
+ * MJ-normalized turn-detection mode, provider-neutral so a shared catalog is safe on every provider:
33796
+ * - `'default'` — let the provider profile decide (today's behavior).
33797
+ * - `'serverVad'` — classic silence-based server VAD.
33798
+ * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
33799
+ * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
33800
+ * to; the forward slot for full-duplex reasoning voice models.
33801
+ */
33802
+ export type MJAIModelVendorEntity_RealtimeTurnDetectionMode = 'default' | 'serverVad' | 'semanticVad' | 'native';
33803
+ /**
33804
+ * What a turn's input may include (distinct from detection, which decides when a turn ends):
33805
+ * - `'audioActivityOnly'` — audio activity only; video frames are sent deliberately.
33806
+ * - `'audioActivityAndAllVideo'` — audio activity plus every video frame (Gemini 3.8 Live's default).
33807
+ */
33808
+ export type MJAIModelVendorEntity_RealtimeTurnCoverage = 'audioActivityOnly' | 'audioActivityAndAllVideo';
33493
33809
  /**
33494
33810
  * MJ-normalized turn-detection settings for realtime (speech-to-speech) models. Every field is
33495
33811
  * optional; absent fields contribute nothing. Provider profiles translate this vocabulary to their
@@ -33497,39 +33813,139 @@ export interface MJAIModelVendorEntity_LLMConfigurationSettings {
33497
33813
  * default — a wrong inherited value degrades safely, it never rejects a session.
33498
33814
  */
33499
33815
  export interface MJAIModelVendorEntity_RealtimeTurnDetectionSettings {
33500
- /**
33501
- * - `'default'` — let the provider profile decide (today's behavior).
33502
- * - `'serverVad'` — classic silence-based server VAD.
33503
- * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
33504
- * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
33505
- * to; the forward slot for full-duplex reasoning voice models.
33506
- */
33507
- Mode?: 'default' | 'serverVad' | 'semanticVad' | 'native' | null;
33816
+ /** The normalized mode; absent = `'default'`. */
33817
+ Mode?: MJAIModelVendorEntity_RealtimeTurnDetectionMode;
33508
33818
  /** Semantic-VAD aggressiveness (OpenAI `eagerness`); ignored without a mapping. */
33509
- Eagerness?: 'low' | 'auto' | 'high' | null;
33819
+ Eagerness?: 'low' | 'auto' | 'high';
33510
33820
  /** Server-VAD activation threshold (0–1); ignored without a mapping. */
33511
- Threshold?: number | null;
33821
+ Threshold?: number;
33512
33822
  /** Server-VAD trailing-silence duration in ms; ignored without a mapping. */
33513
- SilenceDurationMs?: number | null;
33823
+ SilenceDurationMs?: number;
33824
+ /**
33825
+ * What a turn's input may include. Declaring it keeps Gemini 3.8 Live's every-frame default (billed,
33826
+ * and consuming context) a decision rather than an inherited cost. Ignored without a mapping.
33827
+ */
33828
+ Coverage?: MJAIModelVendorEntity_RealtimeTurnCoverage;
33829
+ }
33830
+ /** Which plane handles reasoning: `'local'` (the application/agent loop, the default) or `'remote'`. */
33831
+ export type MJAIModelVendorEntity_RealtimeReasoningPlane = 'local' | 'remote';
33832
+ /** A reasoning effort in MJ's neutral vocabulary; each provider profile maps the values its model accepts. */
33833
+ export type MJAIModelVendorEntity_RealtimeReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
33834
+ /** The remote reasoning target, used when `Plane` is `'remote'`. */
33835
+ export interface MJAIModelVendorEntity_RealtimeRemoteReasoning {
33836
+ /** What the reference denotes: `'model'` (Live, Inworld) or `'hostedAgent'` (ElevenLabs). */
33837
+ Kind?: 'model' | 'hostedAgent';
33838
+ /** The target, e.g. `'gpt-5.6-terra'`, `'anthropic/claude-sonnet-4-6'`, `'MJ Realtime Co-Agent'`. */
33839
+ Ref?: string;
33840
+ /** The target's reasoning effort, for models that support one. */
33841
+ Effort?: MJAIModelVendorEntity_RealtimeReasoningEffort;
33842
+ /** The most output tokens for the remote reasoning pass. */
33843
+ MaxOutputTokens?: number;
33844
+ }
33845
+ /** Reasoning-plane settings for realtime models — dual delegation configuration. */
33846
+ export interface MJAIModelVendorEntity_RealtimeReasoningSettings {
33847
+ /** Absent = `'local'`. Fixed when the session is created. */
33848
+ Plane?: MJAIModelVendorEntity_RealtimeReasoningPlane;
33849
+ /** The remote target when `Plane` is `'remote'`. */
33850
+ Remote?: MJAIModelVendorEntity_RealtimeRemoteReasoning;
33851
+ /**
33852
+ * How hard the model itself reasons (Gemini `thinkingConfig.thinkingLevel`). A profile that cannot
33853
+ * honour the value logs a warning and uses its own default.
33854
+ */
33855
+ Level?: MJAIModelVendorEntity_RealtimeReasoningEffort;
33856
+ /**
33857
+ * Ask the model for human-readable summaries of its own reasoning (Gemini `includeThoughts`). They
33858
+ * are progress narration, not assistant speech. Absent = off.
33859
+ */
33860
+ IncludeThoughtSummaries?: boolean;
33861
+ }
33862
+ /** Which way samples flow on a track, relative to the model. */
33863
+ export type MJAIModelVendorEntity_RealtimeTrackDirection = 'inbound' | 'outbound';
33864
+ /** The modalities MJ itself reasons about (cost, consent, transcripts). */
33865
+ export type MJAIModelVendorEntity_RealtimeWellKnownModality = 'audio' | 'video' | 'image' | 'text';
33866
+ /** A modality key: one of the well-known values, or any registered string. */
33867
+ export type MJAIModelVendorEntity_RealtimeModalityKey = MJAIModelVendorEntity_RealtimeWellKnownModality | (string & {});
33868
+ /** How a track's usage is metered. */
33869
+ export type MJAIModelVendorEntity_RealtimeTrackUsageBasis = 'tokens' | 'seconds' | 'frames' | 'bytes';
33870
+ /**
33871
+ * One directional stream of one modality, as {@link MJAIModelVendorEntity_RealtimeConfigurationSettings.RequestedTracks}
33872
+ * requests it. Mirrors the track descriptor in `@memberjunction/ai` (`realtimeTracks.ts`).
33873
+ */
33874
+ export interface MJAIModelVendorEntity_RealtimeTrackDescriptor {
33875
+ /** The modality this track carries. */
33876
+ Modality: MJAIModelVendorEntity_RealtimeModalityKey;
33877
+ /** Which way samples flow, relative to the model. */
33878
+ Direction: MJAIModelVendorEntity_RealtimeTrackDirection;
33879
+ /** Wire encoding, e.g. `'audio/pcm;rate=16000'` or `'image/jpeg'`; absent = the profile's default. */
33880
+ Encoding?: string;
33881
+ /** Sample or frame cadence: fps for video, Hz for audio. */
33882
+ Rate?: number;
33883
+ /** How this track is metered; absent = the session's own basis. */
33884
+ UsageBasis?: readonly MJAIModelVendorEntity_RealtimeTrackUsageBasis[];
33885
+ /** Whether establishing this track needs an explicit human grant (camera, screen, microphone). */
33886
+ RequiresConsent?: boolean;
33887
+ /** Whether the session needs this track (`true`) or treats it as best-effort (`false`). */
33888
+ Required?: boolean;
33889
+ /** Which source feeds this track, when several streams of one modality and direction can exist. */
33890
+ SourceID?: string;
33891
+ /** A human-readable name for that source ("Whiteboard", "Camera"). */
33892
+ Label?: string;
33514
33893
  }
33515
33894
  /**
33516
- * Reasoning-plane settings for realtime models — dual delegation configuration. Absent defaults to
33517
- * `'local'`.
33895
+ * Which server signal means "the session has gone idle and deferred work may be flushed":
33896
+ * `'turnComplete'` (the default) or `'interactionStatus'`, for models with asynchronous reasoning
33897
+ * whose `turnComplete` arrives while they still reason and call tools.
33518
33898
  */
33519
- export interface MJAIModelVendorEntity_RealtimeReasoningSettings {
33899
+ export type MJAIModelVendorEntity_RealtimeIdleSignal = 'turnComplete' | 'interactionStatus';
33900
+ /** Tool-execution semantics a model permits. Capability declarations, not requests. */
33901
+ export interface MJAIModelVendorEntity_RealtimeToolingSettings {
33520
33902
  /**
33521
- * Which plane handles reasoning:
33522
- * - `'local'` — application/agent loop (default).
33523
- * - `'remote'` — delegated to remote model or hosted agent.
33903
+ * Whether synchronous blocking tool execution is legal. Absent = permitted. `false` on models that
33904
+ * reject blocking mode outright (Gemini 3.8 Live Extended Thinking).
33524
33905
  */
33525
- Plane?: 'local' | 'remote' | null;
33526
- /** Remote reasoning target configuration. */
33527
- Remote?: {
33528
- Kind?: 'model' | 'hostedAgent' | null;
33529
- Ref?: string | null;
33530
- Effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
33531
- MaxOutputTokens?: number | null;
33532
- } | null;
33906
+ SupportsBlockingExecution?: boolean;
33907
+ /**
33908
+ * Whether per-function scheduling hints are legal (Gemini `SILENT` / `WHEN_IDLE` / `INTERRUPTED`).
33909
+ * Absent = not supported.
33910
+ */
33911
+ SupportsScheduling?: boolean;
33912
+ /** Preferred function-calling behavior. */
33913
+ Behavior?: 'BLOCKING' | 'NON_BLOCKING';
33914
+ }
33915
+ /**
33916
+ * One price for a quantity a realtime session produces, in one currency. It applies only when all
33917
+ * three fields are set; a partial price, or a unit or currency the reader does not handle, counts
33918
+ * as no price.
33919
+ */
33920
+ export interface MJAIModelVendorEntity_RealtimeUnitPrice {
33921
+ /** The amount charged per {@link MJAIModelVendorEntity_RealtimeUnitPrice.Unit}. Never negative. */
33922
+ Price?: number | null;
33923
+ /**
33924
+ * The billing unit, named as in `MJ: AI Model Price Unit Types`. `'Per Minute'`: one minute.
33925
+ * `'Per 1M Tokens'`: one million tokens.
33926
+ */
33927
+ Unit?: 'Per Minute' | 'Per 1M Tokens' | null;
33928
+ /** ISO 4217 currency code, uppercase (e.g. `USD`), as on `MJ: AI Model Costs`. */
33929
+ Currency?: string | null;
33930
+ }
33931
+ /**
33932
+ * Prices for realtime output that the model's cost rows (`MJ: AI Model Costs`) do not price on
33933
+ * their own; the cost rows stay the authority for token prices. A price belongs to the host that
33934
+ * charges it, so set this on the model-vendor row: a price on the model or the model type would
33935
+ * reach every vendor that serves the model.
33936
+ */
33937
+ export interface MJAIModelVendorEntity_RealtimePricingSettings {
33938
+ /**
33939
+ * The price of avatar video output, charged on top of the session's token cost. `'Per Minute'`
33940
+ * prices the seconds of avatar video the model generates; `'Per 1M Tokens'` prices the output
33941
+ * tokens the provider counts as video. Set the price and its unit together: the cascade merges
33942
+ * per key, so a layer that sets only one of them keeps the other from the layer below.
33943
+ *
33944
+ * Unverified until checked against Google's bill (#5312): Gemini 3.8 Live on Vertex AI is
33945
+ * seeded at $0.37152 per minute, derived from Google's $1.00 per 1M avatar video output tokens
33946
+ * at 6,192 tokens per second.
33947
+ */
33948
+ AvatarVideoOutput?: MJAIModelVendorEntity_RealtimeUnitPrice | null;
33533
33949
  }
33534
33950
  /** Realtime (speech-to-speech) knobs. */
33535
33951
  export interface MJAIModelVendorEntity_RealtimeConfigurationSettings {
@@ -33543,7 +33959,31 @@ export interface MJAIModelVendorEntity_RealtimeConfigurationSettings {
33543
33959
  /**
33544
33960
  * Reasoning plane settings — dual delegation configuration. Absent defaults to `'local'`.
33545
33961
  */
33546
- Reasoning?: MJAIModelVendorEntity_RealtimeReasoningSettings | null;
33962
+ Reasoning?: MJAIModelVendorEntity_RealtimeReasoningSettings;
33963
+ /**
33964
+ * Whether this realtime model natively supports full-duplex conversational audio
33965
+ * (simultaneous speaking and listening with natural interruptions).
33966
+ *
33967
+ * When true, full-duplex models do not receive turn-taking tools or an energy-VAD floor gate,
33968
+ * allowing the provider's native full-duplex model to handle natural turn transitions.
33969
+ * Cascades AIModelType -> Vendor ModelDefaults -> AIModel -> AIModelVendor.
33970
+ */
33971
+ FullDuplex?: boolean | null;
33972
+ /** Tool-execution semantics this model permits. Absent = the profile's own defaults. */
33973
+ Tooling?: MJAIModelVendorEntity_RealtimeToolingSettings;
33974
+ /**
33975
+ * Media tracks a session asks the model to establish beyond audio. Absent or empty establishes
33976
+ * audio only, so a video track exists only because something asked for it and never arrives as an
33977
+ * inherited cost. Requests are intersected with what the model supports.
33978
+ */
33979
+ RequestedTracks?: readonly MJAIModelVendorEntity_RealtimeTrackDescriptor[];
33980
+ /** Which server signal means the session has gone idle. Absent = `'turnComplete'`. */
33981
+ IdleSignal?: MJAIModelVendorEntity_RealtimeIdleSignal;
33982
+ /**
33983
+ * Prices for output the token cost rows do not cover, such as avatar video. Set it on the
33984
+ * model-vendor row.
33985
+ */
33986
+ Pricing?: MJAIModelVendorEntity_RealtimePricingSettings | null;
33547
33987
  }
33548
33988
  /** Vision knobs. Reserved — no consumers yet. */
33549
33989
  export interface MJAIModelVendorEntity_VisionConfigurationSettings {
@@ -33553,6 +33993,22 @@ export interface MJAIModelVendorEntity_VisionConfigurationSettings {
33553
33993
  export interface MJAIModelVendorEntity_AudioConfigurationSettings {
33554
33994
  [key: string]: unknown;
33555
33995
  }
33996
+ /**
33997
+ * Privacy posture of the model deployment this configuration describes. Set it on the catalog layers
33998
+ * (`MJ: AI Models`, `MJ: AI Model Vendors`, a vendor's `ModelDefaults`): data retention is a property of
33999
+ * how a model is SERVED, so the vendor row is usually where it is true.
34000
+ */
34001
+ export interface MJAIModelVendorEntity_PrivacyConfigurationSettings {
34002
+ /**
34003
+ * Whether this model is served under a zero-data-retention agreement: the provider does not store
34004
+ * prompts, audio, images or outputs beyond serving the request. `true` is a positive claim that
34005
+ * somebody verified; absent, `null` and `false` all mean "not declared", never "retained", because
34006
+ * an undeclared model is not known to be bad. It is read by realtime channel exposure policy:
34007
+ * an agent that requires zero data retention for a channel's `'state'` or `'pixels'` exposure has
34008
+ * that exposure lowered on any model that does not declare `true` here.
34009
+ */
34010
+ ZeroDataRetention?: boolean | null;
34011
+ }
33556
34012
  /**
33557
34013
  * Typed-decision knobs, consumed at call time by the decision runner. They declare what a decision
33558
34014
  * model accepts, so an oversized request can be refused with a clear message before the call,
@@ -33587,6 +34043,8 @@ export interface MJAIModelVendorEntity_IAIModelConfiguration {
33587
34043
  Audio?: MJAIModelVendorEntity_AudioConfigurationSettings | null;
33588
34044
  /** Typed-decision limits. Honored at the catalog layers. */
33589
34045
  Decision?: MJAIModelVendorEntity_DecisionConfigurationSettings | null;
34046
+ /** Privacy posture of the model deployment. Honored at the catalog layers. */
34047
+ Privacy?: MJAIModelVendorEntity_PrivacyConfigurationSettings | null;
33590
34048
  }
33591
34049
  /**
33592
34050
  * The `PromptConfiguration` column on `MJ: AI Prompts` — per-prompt call-time knobs, layered ON TOP of the
@@ -33606,6 +34064,8 @@ export interface MJAIModelVendorEntity_IAIPromptConfiguration {
33606
34064
  Audio?: MJAIModelVendorEntity_AudioConfigurationSettings | null;
33607
34065
  /** Typed-decision limits. Reserved at this layer. */
33608
34066
  Decision?: MJAIModelVendorEntity_DecisionConfigurationSettings | null;
34067
+ /** Privacy posture. Reserved at this layer. */
34068
+ Privacy?: MJAIModelVendorEntity_PrivacyConfigurationSettings | null;
33609
34069
  }
33610
34070
  /**
33611
34071
  * The `PromptConfiguration` column on `MJ: AI Prompt Models` — the most specific layer, overriding both
@@ -33622,6 +34082,8 @@ export interface MJAIModelVendorEntity_IAIPromptModelConfiguration {
33622
34082
  Audio?: MJAIModelVendorEntity_AudioConfigurationSettings | null;
33623
34083
  /** Typed-decision limits. Reserved at this layer. */
33624
34084
  Decision?: MJAIModelVendorEntity_DecisionConfigurationSettings | null;
34085
+ /** Privacy posture. Reserved at this layer. */
34086
+ Privacy?: MJAIModelVendorEntity_PrivacyConfigurationSettings | null;
33625
34087
  }
33626
34088
  /**
33627
34089
  * `MJ: AI Vendors . Configuration` — the vendor's own configuration bag. General-purpose: a vendor
@@ -33893,7 +34355,8 @@ export declare class MJAIModelVendorEntity extends BaseEntity<MJAIModelVendorEnt
33893
34355
  * Two kinds of type live here, and the distinction is the whole point of the file:
33894
34356
  *
33895
34357
  * 1. **Shared modality sections** (`MJAIModelEntity_LLMConfigurationSettings`, `MJAIModelEntity_RealtimeConfigurationSettings`,
33896
- * `MJAIModelEntity_VisionConfigurationSettings`, `MJAIModelEntity_AudioConfigurationSettings`, `MJAIModelEntity_DecisionConfigurationSettings`) —
34358
+ * `MJAIModelEntity_VisionConfigurationSettings`, `MJAIModelEntity_AudioConfigurationSettings`, `MJAIModelEntity_DecisionConfigurationSettings`,
34359
+ * `MJAIModelEntity_PrivacyConfigurationSettings`) —
33897
34360
  * what "the LLM configuration"
33898
34361
  * MEANS, defined once and reused by every layer that carries a configuration bag.
33899
34362
  * 2. **Per-table outer types** (`MJAIModelEntity_IAIModelConfiguration`, `MJAIModelEntity_IAIPromptConfiguration`,
@@ -33919,12 +34382,13 @@ export declare class MJAIModelVendorEntity extends BaseEntity<MJAIModelVendorEnt
33919
34382
  * therefore has to be self-contained — a definition cannot `import` a sibling, and `@file:`
33920
34383
  * substitutes a whole file rather than splicing one into another. Keeping every AI configuration
33921
34384
  * type in ONE file is what makes a shared section possible at all; the cost is that each of the
33922
- * five entities emits the full (prefixed) set, including outer types it does not use.
34385
+ * six entities emits the full (prefixed) set, including outer types it does not use.
33923
34386
  *
33924
34387
  * **Lockstep contract**: this file is the JSONType SOURCE; its package-side mirror is
33925
34388
  * `packages/AI/Core/src/generic/modelConfiguration.ts` in `@memberjunction/ai`, which runtime code
33926
- * compiles against. Keep the two in step when adding a section or property — the same pact
33927
- * `IAgentSettings` follows with `@memberjunction/ai-core-plus`.
34389
+ * compiles against (the track types mirror its `realtimeTracks.ts`). Keep the two in step when
34390
+ * adding a section or property — the same pact `IAgentSettings` follows with
34391
+ * `@memberjunction/ai-core-plus`. Core's `modelConfiguration.test.ts` fails when they differ.
33928
34392
  *
33929
34393
  * **Boundary rule**: anything the engine filters, sorts, or joins on stays a COLUMN (`PowerRank`,
33930
34394
  * `IsActive`, `Priority`, `Status` — SQL cannot cheaply predicate into this bag); anything a driver
@@ -34001,6 +34465,21 @@ export interface MJAIModelEntity_LLMConfigurationSettings {
34001
34465
  */
34002
34466
  PrefixPromptCache?: boolean | null;
34003
34467
  }
34468
+ /**
34469
+ * MJ-normalized turn-detection mode, provider-neutral so a shared catalog is safe on every provider:
34470
+ * - `'default'` — let the provider profile decide (today's behavior).
34471
+ * - `'serverVad'` — classic silence-based server VAD.
34472
+ * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
34473
+ * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
34474
+ * to; the forward slot for full-duplex reasoning voice models.
34475
+ */
34476
+ export type MJAIModelEntity_RealtimeTurnDetectionMode = 'default' | 'serverVad' | 'semanticVad' | 'native';
34477
+ /**
34478
+ * What a turn's input may include (distinct from detection, which decides when a turn ends):
34479
+ * - `'audioActivityOnly'` — audio activity only; video frames are sent deliberately.
34480
+ * - `'audioActivityAndAllVideo'` — audio activity plus every video frame (Gemini 3.8 Live's default).
34481
+ */
34482
+ export type MJAIModelEntity_RealtimeTurnCoverage = 'audioActivityOnly' | 'audioActivityAndAllVideo';
34004
34483
  /**
34005
34484
  * MJ-normalized turn-detection settings for realtime (speech-to-speech) models. Every field is
34006
34485
  * optional; absent fields contribute nothing. Provider profiles translate this vocabulary to their
@@ -34008,39 +34487,139 @@ export interface MJAIModelEntity_LLMConfigurationSettings {
34008
34487
  * default — a wrong inherited value degrades safely, it never rejects a session.
34009
34488
  */
34010
34489
  export interface MJAIModelEntity_RealtimeTurnDetectionSettings {
34011
- /**
34012
- * - `'default'` — let the provider profile decide (today's behavior).
34013
- * - `'serverVad'` — classic silence-based server VAD.
34014
- * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
34015
- * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
34016
- * to; the forward slot for full-duplex reasoning voice models.
34017
- */
34018
- Mode?: 'default' | 'serverVad' | 'semanticVad' | 'native' | null;
34490
+ /** The normalized mode; absent = `'default'`. */
34491
+ Mode?: MJAIModelEntity_RealtimeTurnDetectionMode;
34019
34492
  /** Semantic-VAD aggressiveness (OpenAI `eagerness`); ignored without a mapping. */
34020
- Eagerness?: 'low' | 'auto' | 'high' | null;
34493
+ Eagerness?: 'low' | 'auto' | 'high';
34021
34494
  /** Server-VAD activation threshold (0–1); ignored without a mapping. */
34022
- Threshold?: number | null;
34495
+ Threshold?: number;
34023
34496
  /** Server-VAD trailing-silence duration in ms; ignored without a mapping. */
34024
- SilenceDurationMs?: number | null;
34497
+ SilenceDurationMs?: number;
34498
+ /**
34499
+ * What a turn's input may include. Declaring it keeps Gemini 3.8 Live's every-frame default (billed,
34500
+ * and consuming context) a decision rather than an inherited cost. Ignored without a mapping.
34501
+ */
34502
+ Coverage?: MJAIModelEntity_RealtimeTurnCoverage;
34503
+ }
34504
+ /** Which plane handles reasoning: `'local'` (the application/agent loop, the default) or `'remote'`. */
34505
+ export type MJAIModelEntity_RealtimeReasoningPlane = 'local' | 'remote';
34506
+ /** A reasoning effort in MJ's neutral vocabulary; each provider profile maps the values its model accepts. */
34507
+ export type MJAIModelEntity_RealtimeReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
34508
+ /** The remote reasoning target, used when `Plane` is `'remote'`. */
34509
+ export interface MJAIModelEntity_RealtimeRemoteReasoning {
34510
+ /** What the reference denotes: `'model'` (Live, Inworld) or `'hostedAgent'` (ElevenLabs). */
34511
+ Kind?: 'model' | 'hostedAgent';
34512
+ /** The target, e.g. `'gpt-5.6-terra'`, `'anthropic/claude-sonnet-4-6'`, `'MJ Realtime Co-Agent'`. */
34513
+ Ref?: string;
34514
+ /** The target's reasoning effort, for models that support one. */
34515
+ Effort?: MJAIModelEntity_RealtimeReasoningEffort;
34516
+ /** The most output tokens for the remote reasoning pass. */
34517
+ MaxOutputTokens?: number;
34518
+ }
34519
+ /** Reasoning-plane settings for realtime models — dual delegation configuration. */
34520
+ export interface MJAIModelEntity_RealtimeReasoningSettings {
34521
+ /** Absent = `'local'`. Fixed when the session is created. */
34522
+ Plane?: MJAIModelEntity_RealtimeReasoningPlane;
34523
+ /** The remote target when `Plane` is `'remote'`. */
34524
+ Remote?: MJAIModelEntity_RealtimeRemoteReasoning;
34525
+ /**
34526
+ * How hard the model itself reasons (Gemini `thinkingConfig.thinkingLevel`). A profile that cannot
34527
+ * honour the value logs a warning and uses its own default.
34528
+ */
34529
+ Level?: MJAIModelEntity_RealtimeReasoningEffort;
34530
+ /**
34531
+ * Ask the model for human-readable summaries of its own reasoning (Gemini `includeThoughts`). They
34532
+ * are progress narration, not assistant speech. Absent = off.
34533
+ */
34534
+ IncludeThoughtSummaries?: boolean;
34535
+ }
34536
+ /** Which way samples flow on a track, relative to the model. */
34537
+ export type MJAIModelEntity_RealtimeTrackDirection = 'inbound' | 'outbound';
34538
+ /** The modalities MJ itself reasons about (cost, consent, transcripts). */
34539
+ export type MJAIModelEntity_RealtimeWellKnownModality = 'audio' | 'video' | 'image' | 'text';
34540
+ /** A modality key: one of the well-known values, or any registered string. */
34541
+ export type MJAIModelEntity_RealtimeModalityKey = MJAIModelEntity_RealtimeWellKnownModality | (string & {});
34542
+ /** How a track's usage is metered. */
34543
+ export type MJAIModelEntity_RealtimeTrackUsageBasis = 'tokens' | 'seconds' | 'frames' | 'bytes';
34544
+ /**
34545
+ * One directional stream of one modality, as {@link MJAIModelEntity_RealtimeConfigurationSettings.RequestedTracks}
34546
+ * requests it. Mirrors the track descriptor in `@memberjunction/ai` (`realtimeTracks.ts`).
34547
+ */
34548
+ export interface MJAIModelEntity_RealtimeTrackDescriptor {
34549
+ /** The modality this track carries. */
34550
+ Modality: MJAIModelEntity_RealtimeModalityKey;
34551
+ /** Which way samples flow, relative to the model. */
34552
+ Direction: MJAIModelEntity_RealtimeTrackDirection;
34553
+ /** Wire encoding, e.g. `'audio/pcm;rate=16000'` or `'image/jpeg'`; absent = the profile's default. */
34554
+ Encoding?: string;
34555
+ /** Sample or frame cadence: fps for video, Hz for audio. */
34556
+ Rate?: number;
34557
+ /** How this track is metered; absent = the session's own basis. */
34558
+ UsageBasis?: readonly MJAIModelEntity_RealtimeTrackUsageBasis[];
34559
+ /** Whether establishing this track needs an explicit human grant (camera, screen, microphone). */
34560
+ RequiresConsent?: boolean;
34561
+ /** Whether the session needs this track (`true`) or treats it as best-effort (`false`). */
34562
+ Required?: boolean;
34563
+ /** Which source feeds this track, when several streams of one modality and direction can exist. */
34564
+ SourceID?: string;
34565
+ /** A human-readable name for that source ("Whiteboard", "Camera"). */
34566
+ Label?: string;
34025
34567
  }
34026
34568
  /**
34027
- * Reasoning-plane settings for realtime models — dual delegation configuration. Absent defaults to
34028
- * `'local'`.
34569
+ * Which server signal means "the session has gone idle and deferred work may be flushed":
34570
+ * `'turnComplete'` (the default) or `'interactionStatus'`, for models with asynchronous reasoning
34571
+ * whose `turnComplete` arrives while they still reason and call tools.
34029
34572
  */
34030
- export interface MJAIModelEntity_RealtimeReasoningSettings {
34573
+ export type MJAIModelEntity_RealtimeIdleSignal = 'turnComplete' | 'interactionStatus';
34574
+ /** Tool-execution semantics a model permits. Capability declarations, not requests. */
34575
+ export interface MJAIModelEntity_RealtimeToolingSettings {
34031
34576
  /**
34032
- * Which plane handles reasoning:
34033
- * - `'local'` — application/agent loop (default).
34034
- * - `'remote'` — delegated to remote model or hosted agent.
34577
+ * Whether synchronous blocking tool execution is legal. Absent = permitted. `false` on models that
34578
+ * reject blocking mode outright (Gemini 3.8 Live Extended Thinking).
34035
34579
  */
34036
- Plane?: 'local' | 'remote' | null;
34037
- /** Remote reasoning target configuration. */
34038
- Remote?: {
34039
- Kind?: 'model' | 'hostedAgent' | null;
34040
- Ref?: string | null;
34041
- Effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
34042
- MaxOutputTokens?: number | null;
34043
- } | null;
34580
+ SupportsBlockingExecution?: boolean;
34581
+ /**
34582
+ * Whether per-function scheduling hints are legal (Gemini `SILENT` / `WHEN_IDLE` / `INTERRUPTED`).
34583
+ * Absent = not supported.
34584
+ */
34585
+ SupportsScheduling?: boolean;
34586
+ /** Preferred function-calling behavior. */
34587
+ Behavior?: 'BLOCKING' | 'NON_BLOCKING';
34588
+ }
34589
+ /**
34590
+ * One price for a quantity a realtime session produces, in one currency. It applies only when all
34591
+ * three fields are set; a partial price, or a unit or currency the reader does not handle, counts
34592
+ * as no price.
34593
+ */
34594
+ export interface MJAIModelEntity_RealtimeUnitPrice {
34595
+ /** The amount charged per {@link MJAIModelEntity_RealtimeUnitPrice.Unit}. Never negative. */
34596
+ Price?: number | null;
34597
+ /**
34598
+ * The billing unit, named as in `MJ: AI Model Price Unit Types`. `'Per Minute'`: one minute.
34599
+ * `'Per 1M Tokens'`: one million tokens.
34600
+ */
34601
+ Unit?: 'Per Minute' | 'Per 1M Tokens' | null;
34602
+ /** ISO 4217 currency code, uppercase (e.g. `USD`), as on `MJ: AI Model Costs`. */
34603
+ Currency?: string | null;
34604
+ }
34605
+ /**
34606
+ * Prices for realtime output that the model's cost rows (`MJ: AI Model Costs`) do not price on
34607
+ * their own; the cost rows stay the authority for token prices. A price belongs to the host that
34608
+ * charges it, so set this on the model-vendor row: a price on the model or the model type would
34609
+ * reach every vendor that serves the model.
34610
+ */
34611
+ export interface MJAIModelEntity_RealtimePricingSettings {
34612
+ /**
34613
+ * The price of avatar video output, charged on top of the session's token cost. `'Per Minute'`
34614
+ * prices the seconds of avatar video the model generates; `'Per 1M Tokens'` prices the output
34615
+ * tokens the provider counts as video. Set the price and its unit together: the cascade merges
34616
+ * per key, so a layer that sets only one of them keeps the other from the layer below.
34617
+ *
34618
+ * Unverified until checked against Google's bill (#5312): Gemini 3.8 Live on Vertex AI is
34619
+ * seeded at $0.37152 per minute, derived from Google's $1.00 per 1M avatar video output tokens
34620
+ * at 6,192 tokens per second.
34621
+ */
34622
+ AvatarVideoOutput?: MJAIModelEntity_RealtimeUnitPrice | null;
34044
34623
  }
34045
34624
  /** Realtime (speech-to-speech) knobs. */
34046
34625
  export interface MJAIModelEntity_RealtimeConfigurationSettings {
@@ -34054,7 +34633,31 @@ export interface MJAIModelEntity_RealtimeConfigurationSettings {
34054
34633
  /**
34055
34634
  * Reasoning plane settings — dual delegation configuration. Absent defaults to `'local'`.
34056
34635
  */
34057
- Reasoning?: MJAIModelEntity_RealtimeReasoningSettings | null;
34636
+ Reasoning?: MJAIModelEntity_RealtimeReasoningSettings;
34637
+ /**
34638
+ * Whether this realtime model natively supports full-duplex conversational audio
34639
+ * (simultaneous speaking and listening with natural interruptions).
34640
+ *
34641
+ * When true, full-duplex models do not receive turn-taking tools or an energy-VAD floor gate,
34642
+ * allowing the provider's native full-duplex model to handle natural turn transitions.
34643
+ * Cascades AIModelType -> Vendor ModelDefaults -> AIModel -> AIModelVendor.
34644
+ */
34645
+ FullDuplex?: boolean | null;
34646
+ /** Tool-execution semantics this model permits. Absent = the profile's own defaults. */
34647
+ Tooling?: MJAIModelEntity_RealtimeToolingSettings;
34648
+ /**
34649
+ * Media tracks a session asks the model to establish beyond audio. Absent or empty establishes
34650
+ * audio only, so a video track exists only because something asked for it and never arrives as an
34651
+ * inherited cost. Requests are intersected with what the model supports.
34652
+ */
34653
+ RequestedTracks?: readonly MJAIModelEntity_RealtimeTrackDescriptor[];
34654
+ /** Which server signal means the session has gone idle. Absent = `'turnComplete'`. */
34655
+ IdleSignal?: MJAIModelEntity_RealtimeIdleSignal;
34656
+ /**
34657
+ * Prices for output the token cost rows do not cover, such as avatar video. Set it on the
34658
+ * model-vendor row.
34659
+ */
34660
+ Pricing?: MJAIModelEntity_RealtimePricingSettings | null;
34058
34661
  }
34059
34662
  /** Vision knobs. Reserved — no consumers yet. */
34060
34663
  export interface MJAIModelEntity_VisionConfigurationSettings {
@@ -34064,6 +34667,22 @@ export interface MJAIModelEntity_VisionConfigurationSettings {
34064
34667
  export interface MJAIModelEntity_AudioConfigurationSettings {
34065
34668
  [key: string]: unknown;
34066
34669
  }
34670
+ /**
34671
+ * Privacy posture of the model deployment this configuration describes. Set it on the catalog layers
34672
+ * (`MJ: AI Models`, `MJ: AI Model Vendors`, a vendor's `ModelDefaults`): data retention is a property of
34673
+ * how a model is SERVED, so the vendor row is usually where it is true.
34674
+ */
34675
+ export interface MJAIModelEntity_PrivacyConfigurationSettings {
34676
+ /**
34677
+ * Whether this model is served under a zero-data-retention agreement: the provider does not store
34678
+ * prompts, audio, images or outputs beyond serving the request. `true` is a positive claim that
34679
+ * somebody verified; absent, `null` and `false` all mean "not declared", never "retained", because
34680
+ * an undeclared model is not known to be bad. It is read by realtime channel exposure policy:
34681
+ * an agent that requires zero data retention for a channel's `'state'` or `'pixels'` exposure has
34682
+ * that exposure lowered on any model that does not declare `true` here.
34683
+ */
34684
+ ZeroDataRetention?: boolean | null;
34685
+ }
34067
34686
  /**
34068
34687
  * Typed-decision knobs, consumed at call time by the decision runner. They declare what a decision
34069
34688
  * model accepts, so an oversized request can be refused with a clear message before the call,
@@ -34098,6 +34717,8 @@ export interface MJAIModelEntity_IAIModelConfiguration {
34098
34717
  Audio?: MJAIModelEntity_AudioConfigurationSettings | null;
34099
34718
  /** Typed-decision limits. Honored at the catalog layers. */
34100
34719
  Decision?: MJAIModelEntity_DecisionConfigurationSettings | null;
34720
+ /** Privacy posture of the model deployment. Honored at the catalog layers. */
34721
+ Privacy?: MJAIModelEntity_PrivacyConfigurationSettings | null;
34101
34722
  }
34102
34723
  /**
34103
34724
  * The `PromptConfiguration` column on `MJ: AI Prompts` — per-prompt call-time knobs, layered ON TOP of the
@@ -34117,6 +34738,8 @@ export interface MJAIModelEntity_IAIPromptConfiguration {
34117
34738
  Audio?: MJAIModelEntity_AudioConfigurationSettings | null;
34118
34739
  /** Typed-decision limits. Reserved at this layer. */
34119
34740
  Decision?: MJAIModelEntity_DecisionConfigurationSettings | null;
34741
+ /** Privacy posture. Reserved at this layer. */
34742
+ Privacy?: MJAIModelEntity_PrivacyConfigurationSettings | null;
34120
34743
  }
34121
34744
  /**
34122
34745
  * The `PromptConfiguration` column on `MJ: AI Prompt Models` — the most specific layer, overriding both
@@ -34133,6 +34756,8 @@ export interface MJAIModelEntity_IAIPromptModelConfiguration {
34133
34756
  Audio?: MJAIModelEntity_AudioConfigurationSettings | null;
34134
34757
  /** Typed-decision limits. Reserved at this layer. */
34135
34758
  Decision?: MJAIModelEntity_DecisionConfigurationSettings | null;
34759
+ /** Privacy posture. Reserved at this layer. */
34760
+ Privacy?: MJAIModelEntity_PrivacyConfigurationSettings | null;
34136
34761
  }
34137
34762
  /**
34138
34763
  * `MJ: AI Vendors . Configuration` — the vendor's own configuration bag. General-purpose: a vendor
@@ -34411,6 +35036,9 @@ export declare class MJAIModelEntity extends BaseEntity<MJAIModelEntityType> {
34411
35036
  *
34412
35037
  * Contains vendor-native voice/avatar tuning parameters (e.g., ElevenLabs voice settings)
34413
35038
  * moved out of generic base classes into their concrete vendor binding.
35039
+ *
35040
+ * A binding whose Modality is Video is the persona's avatar on that vendor: its `APIName` is the vendor's avatar id,
35041
+ * and {@link MJAIPersonaVendorEntity_IAIPersonaVendorSettings.Avatar} tunes it.
34414
35042
  */
34415
35043
  export interface MJAIPersonaVendorEntity_IAIPersonaVendorSettings {
34416
35044
  /** Vendor-native tuning, keyed by the vendor on AIPersonaVendor.VendorID.
@@ -34420,6 +35048,26 @@ export interface MJAIPersonaVendorEntity_IAIPersonaVendorSettings {
34420
35048
  style?: number;
34421
35049
  useSpeakerBoost?: boolean;
34422
35050
  speed?: number;
35051
+ /**
35052
+ * The avatar's settings, on a binding whose Modality is Video. Vendor-neutral names: each realtime driver maps what
35053
+ * its vendor supports and ignores the rest.
35054
+ */
35055
+ Avatar?: {
35056
+ /**
35057
+ * 'preset': the binding's APIName is an avatar from the vendor's catalog. 'custom': an avatar made from a
35058
+ * reference image, which some vendors allow only to approved accounts. Custom likenesses stay behind a feature
35059
+ * flag until who may create one, and with what consent, is decided.
35060
+ */
35061
+ Kind?: 'preset' | 'custom';
35062
+ /** The MJ Storage file id of the reference image, when Kind is 'custom'. */
35063
+ ReferenceImageFileID?: string;
35064
+ /** The preferred video resolution; a driver uses the nearest its vendor offers. */
35065
+ Resolution?: 'low' | 'standard' | 'high';
35066
+ /** What shows behind the avatar, when the vendor can change it: a named treatment, or an image from MJ Storage. */
35067
+ Background?: 'default' | 'transparent' | 'blur' | {
35068
+ ImageFileID: string;
35069
+ };
35070
+ };
34423
35071
  [key: string]: unknown;
34424
35072
  }
34425
35073
  /**
@@ -34576,6 +35224,16 @@ export interface MJAIPersonaEntity_IAIPersonaStyleDescriptors {
34576
35224
  interruptionPolicy?: string;
34577
35225
  /** Prose for GPT-Live's `Backchannel policy:` prompt block. */
34578
35226
  backchannelPolicy?: string;
35227
+ /**
35228
+ * How the agent's video shows in the call, whatever the vendor. The agent's own persona override wins over the
35229
+ * persona's.
35230
+ */
35231
+ Visual?: {
35232
+ /** How much of the avatar the tile frames. */
35233
+ Framing?: 'head' | 'shoulders' | 'waist';
35234
+ /** The accent of the ring that frames the tile while the agent speaks: a design-token name, never a color value. */
35235
+ AccentToken?: string;
35236
+ };
34579
35237
  /** Open extension point for additional fine-grained style descriptors. */
34580
35238
  [key: string]: unknown;
34581
35239
  }
@@ -34868,7 +35526,8 @@ export declare class MJAIPromptCategoryEntity extends BaseEntity<MJAIPromptCateg
34868
35526
  * Two kinds of type live here, and the distinction is the whole point of the file:
34869
35527
  *
34870
35528
  * 1. **Shared modality sections** (`MJAIPromptModelEntity_LLMConfigurationSettings`, `MJAIPromptModelEntity_RealtimeConfigurationSettings`,
34871
- * `MJAIPromptModelEntity_VisionConfigurationSettings`, `MJAIPromptModelEntity_AudioConfigurationSettings`, `MJAIPromptModelEntity_DecisionConfigurationSettings`) —
35529
+ * `MJAIPromptModelEntity_VisionConfigurationSettings`, `MJAIPromptModelEntity_AudioConfigurationSettings`, `MJAIPromptModelEntity_DecisionConfigurationSettings`,
35530
+ * `MJAIPromptModelEntity_PrivacyConfigurationSettings`) —
34872
35531
  * what "the LLM configuration"
34873
35532
  * MEANS, defined once and reused by every layer that carries a configuration bag.
34874
35533
  * 2. **Per-table outer types** (`MJAIPromptModelEntity_IAIModelConfiguration`, `MJAIPromptModelEntity_IAIPromptConfiguration`,
@@ -34894,12 +35553,13 @@ export declare class MJAIPromptCategoryEntity extends BaseEntity<MJAIPromptCateg
34894
35553
  * therefore has to be self-contained — a definition cannot `import` a sibling, and `@file:`
34895
35554
  * substitutes a whole file rather than splicing one into another. Keeping every AI configuration
34896
35555
  * type in ONE file is what makes a shared section possible at all; the cost is that each of the
34897
- * five entities emits the full (prefixed) set, including outer types it does not use.
35556
+ * six entities emits the full (prefixed) set, including outer types it does not use.
34898
35557
  *
34899
35558
  * **Lockstep contract**: this file is the JSONType SOURCE; its package-side mirror is
34900
35559
  * `packages/AI/Core/src/generic/modelConfiguration.ts` in `@memberjunction/ai`, which runtime code
34901
- * compiles against. Keep the two in step when adding a section or property — the same pact
34902
- * `IAgentSettings` follows with `@memberjunction/ai-core-plus`.
35560
+ * compiles against (the track types mirror its `realtimeTracks.ts`). Keep the two in step when
35561
+ * adding a section or property — the same pact `IAgentSettings` follows with
35562
+ * `@memberjunction/ai-core-plus`. Core's `modelConfiguration.test.ts` fails when they differ.
34903
35563
  *
34904
35564
  * **Boundary rule**: anything the engine filters, sorts, or joins on stays a COLUMN (`PowerRank`,
34905
35565
  * `IsActive`, `Priority`, `Status` — SQL cannot cheaply predicate into this bag); anything a driver
@@ -34976,6 +35636,21 @@ export interface MJAIPromptModelEntity_LLMConfigurationSettings {
34976
35636
  */
34977
35637
  PrefixPromptCache?: boolean | null;
34978
35638
  }
35639
+ /**
35640
+ * MJ-normalized turn-detection mode, provider-neutral so a shared catalog is safe on every provider:
35641
+ * - `'default'` — let the provider profile decide (today's behavior).
35642
+ * - `'serverVad'` — classic silence-based server VAD.
35643
+ * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
35644
+ * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
35645
+ * to; the forward slot for full-duplex reasoning voice models.
35646
+ */
35647
+ export type MJAIPromptModelEntity_RealtimeTurnDetectionMode = 'default' | 'serverVad' | 'semanticVad' | 'native';
35648
+ /**
35649
+ * What a turn's input may include (distinct from detection, which decides when a turn ends):
35650
+ * - `'audioActivityOnly'` — audio activity only; video frames are sent deliberately.
35651
+ * - `'audioActivityAndAllVideo'` — audio activity plus every video frame (Gemini 3.8 Live's default).
35652
+ */
35653
+ export type MJAIPromptModelEntity_RealtimeTurnCoverage = 'audioActivityOnly' | 'audioActivityAndAllVideo';
34979
35654
  /**
34980
35655
  * MJ-normalized turn-detection settings for realtime (speech-to-speech) models. Every field is
34981
35656
  * optional; absent fields contribute nothing. Provider profiles translate this vocabulary to their
@@ -34983,39 +35658,139 @@ export interface MJAIPromptModelEntity_LLMConfigurationSettings {
34983
35658
  * default — a wrong inherited value degrades safely, it never rejects a session.
34984
35659
  */
34985
35660
  export interface MJAIPromptModelEntity_RealtimeTurnDetectionSettings {
34986
- /**
34987
- * - `'default'` — let the provider profile decide (today's behavior).
34988
- * - `'serverVad'` — classic silence-based server VAD.
34989
- * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
34990
- * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
34991
- * to; the forward slot for full-duplex reasoning voice models.
34992
- */
34993
- Mode?: 'default' | 'serverVad' | 'semanticVad' | 'native' | null;
35661
+ /** The normalized mode; absent = `'default'`. */
35662
+ Mode?: MJAIPromptModelEntity_RealtimeTurnDetectionMode;
34994
35663
  /** Semantic-VAD aggressiveness (OpenAI `eagerness`); ignored without a mapping. */
34995
- Eagerness?: 'low' | 'auto' | 'high' | null;
35664
+ Eagerness?: 'low' | 'auto' | 'high';
34996
35665
  /** Server-VAD activation threshold (0–1); ignored without a mapping. */
34997
- Threshold?: number | null;
35666
+ Threshold?: number;
34998
35667
  /** Server-VAD trailing-silence duration in ms; ignored without a mapping. */
34999
- SilenceDurationMs?: number | null;
35668
+ SilenceDurationMs?: number;
35669
+ /**
35670
+ * What a turn's input may include. Declaring it keeps Gemini 3.8 Live's every-frame default (billed,
35671
+ * and consuming context) a decision rather than an inherited cost. Ignored without a mapping.
35672
+ */
35673
+ Coverage?: MJAIPromptModelEntity_RealtimeTurnCoverage;
35674
+ }
35675
+ /** Which plane handles reasoning: `'local'` (the application/agent loop, the default) or `'remote'`. */
35676
+ export type MJAIPromptModelEntity_RealtimeReasoningPlane = 'local' | 'remote';
35677
+ /** A reasoning effort in MJ's neutral vocabulary; each provider profile maps the values its model accepts. */
35678
+ export type MJAIPromptModelEntity_RealtimeReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
35679
+ /** The remote reasoning target, used when `Plane` is `'remote'`. */
35680
+ export interface MJAIPromptModelEntity_RealtimeRemoteReasoning {
35681
+ /** What the reference denotes: `'model'` (Live, Inworld) or `'hostedAgent'` (ElevenLabs). */
35682
+ Kind?: 'model' | 'hostedAgent';
35683
+ /** The target, e.g. `'gpt-5.6-terra'`, `'anthropic/claude-sonnet-4-6'`, `'MJ Realtime Co-Agent'`. */
35684
+ Ref?: string;
35685
+ /** The target's reasoning effort, for models that support one. */
35686
+ Effort?: MJAIPromptModelEntity_RealtimeReasoningEffort;
35687
+ /** The most output tokens for the remote reasoning pass. */
35688
+ MaxOutputTokens?: number;
35689
+ }
35690
+ /** Reasoning-plane settings for realtime models — dual delegation configuration. */
35691
+ export interface MJAIPromptModelEntity_RealtimeReasoningSettings {
35692
+ /** Absent = `'local'`. Fixed when the session is created. */
35693
+ Plane?: MJAIPromptModelEntity_RealtimeReasoningPlane;
35694
+ /** The remote target when `Plane` is `'remote'`. */
35695
+ Remote?: MJAIPromptModelEntity_RealtimeRemoteReasoning;
35696
+ /**
35697
+ * How hard the model itself reasons (Gemini `thinkingConfig.thinkingLevel`). A profile that cannot
35698
+ * honour the value logs a warning and uses its own default.
35699
+ */
35700
+ Level?: MJAIPromptModelEntity_RealtimeReasoningEffort;
35701
+ /**
35702
+ * Ask the model for human-readable summaries of its own reasoning (Gemini `includeThoughts`). They
35703
+ * are progress narration, not assistant speech. Absent = off.
35704
+ */
35705
+ IncludeThoughtSummaries?: boolean;
35706
+ }
35707
+ /** Which way samples flow on a track, relative to the model. */
35708
+ export type MJAIPromptModelEntity_RealtimeTrackDirection = 'inbound' | 'outbound';
35709
+ /** The modalities MJ itself reasons about (cost, consent, transcripts). */
35710
+ export type MJAIPromptModelEntity_RealtimeWellKnownModality = 'audio' | 'video' | 'image' | 'text';
35711
+ /** A modality key: one of the well-known values, or any registered string. */
35712
+ export type MJAIPromptModelEntity_RealtimeModalityKey = MJAIPromptModelEntity_RealtimeWellKnownModality | (string & {});
35713
+ /** How a track's usage is metered. */
35714
+ export type MJAIPromptModelEntity_RealtimeTrackUsageBasis = 'tokens' | 'seconds' | 'frames' | 'bytes';
35715
+ /**
35716
+ * One directional stream of one modality, as {@link MJAIPromptModelEntity_RealtimeConfigurationSettings.RequestedTracks}
35717
+ * requests it. Mirrors the track descriptor in `@memberjunction/ai` (`realtimeTracks.ts`).
35718
+ */
35719
+ export interface MJAIPromptModelEntity_RealtimeTrackDescriptor {
35720
+ /** The modality this track carries. */
35721
+ Modality: MJAIPromptModelEntity_RealtimeModalityKey;
35722
+ /** Which way samples flow, relative to the model. */
35723
+ Direction: MJAIPromptModelEntity_RealtimeTrackDirection;
35724
+ /** Wire encoding, e.g. `'audio/pcm;rate=16000'` or `'image/jpeg'`; absent = the profile's default. */
35725
+ Encoding?: string;
35726
+ /** Sample or frame cadence: fps for video, Hz for audio. */
35727
+ Rate?: number;
35728
+ /** How this track is metered; absent = the session's own basis. */
35729
+ UsageBasis?: readonly MJAIPromptModelEntity_RealtimeTrackUsageBasis[];
35730
+ /** Whether establishing this track needs an explicit human grant (camera, screen, microphone). */
35731
+ RequiresConsent?: boolean;
35732
+ /** Whether the session needs this track (`true`) or treats it as best-effort (`false`). */
35733
+ Required?: boolean;
35734
+ /** Which source feeds this track, when several streams of one modality and direction can exist. */
35735
+ SourceID?: string;
35736
+ /** A human-readable name for that source ("Whiteboard", "Camera"). */
35737
+ Label?: string;
35000
35738
  }
35001
35739
  /**
35002
- * Reasoning-plane settings for realtime models — dual delegation configuration. Absent defaults to
35003
- * `'local'`.
35740
+ * Which server signal means "the session has gone idle and deferred work may be flushed":
35741
+ * `'turnComplete'` (the default) or `'interactionStatus'`, for models with asynchronous reasoning
35742
+ * whose `turnComplete` arrives while they still reason and call tools.
35004
35743
  */
35005
- export interface MJAIPromptModelEntity_RealtimeReasoningSettings {
35744
+ export type MJAIPromptModelEntity_RealtimeIdleSignal = 'turnComplete' | 'interactionStatus';
35745
+ /** Tool-execution semantics a model permits. Capability declarations, not requests. */
35746
+ export interface MJAIPromptModelEntity_RealtimeToolingSettings {
35006
35747
  /**
35007
- * Which plane handles reasoning:
35008
- * - `'local'` — application/agent loop (default).
35009
- * - `'remote'` — delegated to remote model or hosted agent.
35748
+ * Whether synchronous blocking tool execution is legal. Absent = permitted. `false` on models that
35749
+ * reject blocking mode outright (Gemini 3.8 Live Extended Thinking).
35010
35750
  */
35011
- Plane?: 'local' | 'remote' | null;
35012
- /** Remote reasoning target configuration. */
35013
- Remote?: {
35014
- Kind?: 'model' | 'hostedAgent' | null;
35015
- Ref?: string | null;
35016
- Effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
35017
- MaxOutputTokens?: number | null;
35018
- } | null;
35751
+ SupportsBlockingExecution?: boolean;
35752
+ /**
35753
+ * Whether per-function scheduling hints are legal (Gemini `SILENT` / `WHEN_IDLE` / `INTERRUPTED`).
35754
+ * Absent = not supported.
35755
+ */
35756
+ SupportsScheduling?: boolean;
35757
+ /** Preferred function-calling behavior. */
35758
+ Behavior?: 'BLOCKING' | 'NON_BLOCKING';
35759
+ }
35760
+ /**
35761
+ * One price for a quantity a realtime session produces, in one currency. It applies only when all
35762
+ * three fields are set; a partial price, or a unit or currency the reader does not handle, counts
35763
+ * as no price.
35764
+ */
35765
+ export interface MJAIPromptModelEntity_RealtimeUnitPrice {
35766
+ /** The amount charged per {@link MJAIPromptModelEntity_RealtimeUnitPrice.Unit}. Never negative. */
35767
+ Price?: number | null;
35768
+ /**
35769
+ * The billing unit, named as in `MJ: AI Model Price Unit Types`. `'Per Minute'`: one minute.
35770
+ * `'Per 1M Tokens'`: one million tokens.
35771
+ */
35772
+ Unit?: 'Per Minute' | 'Per 1M Tokens' | null;
35773
+ /** ISO 4217 currency code, uppercase (e.g. `USD`), as on `MJ: AI Model Costs`. */
35774
+ Currency?: string | null;
35775
+ }
35776
+ /**
35777
+ * Prices for realtime output that the model's cost rows (`MJ: AI Model Costs`) do not price on
35778
+ * their own; the cost rows stay the authority for token prices. A price belongs to the host that
35779
+ * charges it, so set this on the model-vendor row: a price on the model or the model type would
35780
+ * reach every vendor that serves the model.
35781
+ */
35782
+ export interface MJAIPromptModelEntity_RealtimePricingSettings {
35783
+ /**
35784
+ * The price of avatar video output, charged on top of the session's token cost. `'Per Minute'`
35785
+ * prices the seconds of avatar video the model generates; `'Per 1M Tokens'` prices the output
35786
+ * tokens the provider counts as video. Set the price and its unit together: the cascade merges
35787
+ * per key, so a layer that sets only one of them keeps the other from the layer below.
35788
+ *
35789
+ * Unverified until checked against Google's bill (#5312): Gemini 3.8 Live on Vertex AI is
35790
+ * seeded at $0.37152 per minute, derived from Google's $1.00 per 1M avatar video output tokens
35791
+ * at 6,192 tokens per second.
35792
+ */
35793
+ AvatarVideoOutput?: MJAIPromptModelEntity_RealtimeUnitPrice | null;
35019
35794
  }
35020
35795
  /** Realtime (speech-to-speech) knobs. */
35021
35796
  export interface MJAIPromptModelEntity_RealtimeConfigurationSettings {
@@ -35029,7 +35804,31 @@ export interface MJAIPromptModelEntity_RealtimeConfigurationSettings {
35029
35804
  /**
35030
35805
  * Reasoning plane settings — dual delegation configuration. Absent defaults to `'local'`.
35031
35806
  */
35032
- Reasoning?: MJAIPromptModelEntity_RealtimeReasoningSettings | null;
35807
+ Reasoning?: MJAIPromptModelEntity_RealtimeReasoningSettings;
35808
+ /**
35809
+ * Whether this realtime model natively supports full-duplex conversational audio
35810
+ * (simultaneous speaking and listening with natural interruptions).
35811
+ *
35812
+ * When true, full-duplex models do not receive turn-taking tools or an energy-VAD floor gate,
35813
+ * allowing the provider's native full-duplex model to handle natural turn transitions.
35814
+ * Cascades AIModelType -> Vendor ModelDefaults -> AIModel -> AIModelVendor.
35815
+ */
35816
+ FullDuplex?: boolean | null;
35817
+ /** Tool-execution semantics this model permits. Absent = the profile's own defaults. */
35818
+ Tooling?: MJAIPromptModelEntity_RealtimeToolingSettings;
35819
+ /**
35820
+ * Media tracks a session asks the model to establish beyond audio. Absent or empty establishes
35821
+ * audio only, so a video track exists only because something asked for it and never arrives as an
35822
+ * inherited cost. Requests are intersected with what the model supports.
35823
+ */
35824
+ RequestedTracks?: readonly MJAIPromptModelEntity_RealtimeTrackDescriptor[];
35825
+ /** Which server signal means the session has gone idle. Absent = `'turnComplete'`. */
35826
+ IdleSignal?: MJAIPromptModelEntity_RealtimeIdleSignal;
35827
+ /**
35828
+ * Prices for output the token cost rows do not cover, such as avatar video. Set it on the
35829
+ * model-vendor row.
35830
+ */
35831
+ Pricing?: MJAIPromptModelEntity_RealtimePricingSettings | null;
35033
35832
  }
35034
35833
  /** Vision knobs. Reserved — no consumers yet. */
35035
35834
  export interface MJAIPromptModelEntity_VisionConfigurationSettings {
@@ -35039,6 +35838,22 @@ export interface MJAIPromptModelEntity_VisionConfigurationSettings {
35039
35838
  export interface MJAIPromptModelEntity_AudioConfigurationSettings {
35040
35839
  [key: string]: unknown;
35041
35840
  }
35841
+ /**
35842
+ * Privacy posture of the model deployment this configuration describes. Set it on the catalog layers
35843
+ * (`MJ: AI Models`, `MJ: AI Model Vendors`, a vendor's `ModelDefaults`): data retention is a property of
35844
+ * how a model is SERVED, so the vendor row is usually where it is true.
35845
+ */
35846
+ export interface MJAIPromptModelEntity_PrivacyConfigurationSettings {
35847
+ /**
35848
+ * Whether this model is served under a zero-data-retention agreement: the provider does not store
35849
+ * prompts, audio, images or outputs beyond serving the request. `true` is a positive claim that
35850
+ * somebody verified; absent, `null` and `false` all mean "not declared", never "retained", because
35851
+ * an undeclared model is not known to be bad. It is read by realtime channel exposure policy:
35852
+ * an agent that requires zero data retention for a channel's `'state'` or `'pixels'` exposure has
35853
+ * that exposure lowered on any model that does not declare `true` here.
35854
+ */
35855
+ ZeroDataRetention?: boolean | null;
35856
+ }
35042
35857
  /**
35043
35858
  * Typed-decision knobs, consumed at call time by the decision runner. They declare what a decision
35044
35859
  * model accepts, so an oversized request can be refused with a clear message before the call,
@@ -35073,6 +35888,8 @@ export interface MJAIPromptModelEntity_IAIModelConfiguration {
35073
35888
  Audio?: MJAIPromptModelEntity_AudioConfigurationSettings | null;
35074
35889
  /** Typed-decision limits. Honored at the catalog layers. */
35075
35890
  Decision?: MJAIPromptModelEntity_DecisionConfigurationSettings | null;
35891
+ /** Privacy posture of the model deployment. Honored at the catalog layers. */
35892
+ Privacy?: MJAIPromptModelEntity_PrivacyConfigurationSettings | null;
35076
35893
  }
35077
35894
  /**
35078
35895
  * The `PromptConfiguration` column on `MJ: AI Prompts` — per-prompt call-time knobs, layered ON TOP of the
@@ -35092,6 +35909,8 @@ export interface MJAIPromptModelEntity_IAIPromptConfiguration {
35092
35909
  Audio?: MJAIPromptModelEntity_AudioConfigurationSettings | null;
35093
35910
  /** Typed-decision limits. Reserved at this layer. */
35094
35911
  Decision?: MJAIPromptModelEntity_DecisionConfigurationSettings | null;
35912
+ /** Privacy posture. Reserved at this layer. */
35913
+ Privacy?: MJAIPromptModelEntity_PrivacyConfigurationSettings | null;
35095
35914
  }
35096
35915
  /**
35097
35916
  * The `PromptConfiguration` column on `MJ: AI Prompt Models` — the most specific layer, overriding both
@@ -35108,6 +35927,8 @@ export interface MJAIPromptModelEntity_IAIPromptModelConfiguration {
35108
35927
  Audio?: MJAIPromptModelEntity_AudioConfigurationSettings | null;
35109
35928
  /** Typed-decision limits. Reserved at this layer. */
35110
35929
  Decision?: MJAIPromptModelEntity_DecisionConfigurationSettings | null;
35930
+ /** Privacy posture. Reserved at this layer. */
35931
+ Privacy?: MJAIPromptModelEntity_PrivacyConfigurationSettings | null;
35111
35932
  }
35112
35933
  /**
35113
35934
  * `MJ: AI Vendors . Configuration` — the vendor's own configuration bag. General-purpose: a vendor
@@ -36591,7 +37412,8 @@ export declare class MJAIPromptTypeEntity extends BaseEntity<MJAIPromptTypeEntit
36591
37412
  * Two kinds of type live here, and the distinction is the whole point of the file:
36592
37413
  *
36593
37414
  * 1. **Shared modality sections** (`MJAIPromptEntity_LLMConfigurationSettings`, `MJAIPromptEntity_RealtimeConfigurationSettings`,
36594
- * `MJAIPromptEntity_VisionConfigurationSettings`, `MJAIPromptEntity_AudioConfigurationSettings`, `MJAIPromptEntity_DecisionConfigurationSettings`) —
37415
+ * `MJAIPromptEntity_VisionConfigurationSettings`, `MJAIPromptEntity_AudioConfigurationSettings`, `MJAIPromptEntity_DecisionConfigurationSettings`,
37416
+ * `MJAIPromptEntity_PrivacyConfigurationSettings`) —
36595
37417
  * what "the LLM configuration"
36596
37418
  * MEANS, defined once and reused by every layer that carries a configuration bag.
36597
37419
  * 2. **Per-table outer types** (`MJAIPromptEntity_IAIModelConfiguration`, `MJAIPromptEntity_IAIPromptConfiguration`,
@@ -36617,12 +37439,13 @@ export declare class MJAIPromptTypeEntity extends BaseEntity<MJAIPromptTypeEntit
36617
37439
  * therefore has to be self-contained — a definition cannot `import` a sibling, and `@file:`
36618
37440
  * substitutes a whole file rather than splicing one into another. Keeping every AI configuration
36619
37441
  * type in ONE file is what makes a shared section possible at all; the cost is that each of the
36620
- * five entities emits the full (prefixed) set, including outer types it does not use.
37442
+ * six entities emits the full (prefixed) set, including outer types it does not use.
36621
37443
  *
36622
37444
  * **Lockstep contract**: this file is the JSONType SOURCE; its package-side mirror is
36623
37445
  * `packages/AI/Core/src/generic/modelConfiguration.ts` in `@memberjunction/ai`, which runtime code
36624
- * compiles against. Keep the two in step when adding a section or property — the same pact
36625
- * `IAgentSettings` follows with `@memberjunction/ai-core-plus`.
37446
+ * compiles against (the track types mirror its `realtimeTracks.ts`). Keep the two in step when
37447
+ * adding a section or property — the same pact `IAgentSettings` follows with
37448
+ * `@memberjunction/ai-core-plus`. Core's `modelConfiguration.test.ts` fails when they differ.
36626
37449
  *
36627
37450
  * **Boundary rule**: anything the engine filters, sorts, or joins on stays a COLUMN (`PowerRank`,
36628
37451
  * `IsActive`, `Priority`, `Status` — SQL cannot cheaply predicate into this bag); anything a driver
@@ -36699,6 +37522,21 @@ export interface MJAIPromptEntity_LLMConfigurationSettings {
36699
37522
  */
36700
37523
  PrefixPromptCache?: boolean | null;
36701
37524
  }
37525
+ /**
37526
+ * MJ-normalized turn-detection mode, provider-neutral so a shared catalog is safe on every provider:
37527
+ * - `'default'` — let the provider profile decide (today's behavior).
37528
+ * - `'serverVad'` — classic silence-based server VAD.
37529
+ * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
37530
+ * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
37531
+ * to; the forward slot for full-duplex reasoning voice models.
37532
+ */
37533
+ export type MJAIPromptEntity_RealtimeTurnDetectionMode = 'default' | 'serverVad' | 'semanticVad' | 'native';
37534
+ /**
37535
+ * What a turn's input may include (distinct from detection, which decides when a turn ends):
37536
+ * - `'audioActivityOnly'` — audio activity only; video frames are sent deliberately.
37537
+ * - `'audioActivityAndAllVideo'` — audio activity plus every video frame (Gemini 3.8 Live's default).
37538
+ */
37539
+ export type MJAIPromptEntity_RealtimeTurnCoverage = 'audioActivityOnly' | 'audioActivityAndAllVideo';
36702
37540
  /**
36703
37541
  * MJ-normalized turn-detection settings for realtime (speech-to-speech) models. Every field is
36704
37542
  * optional; absent fields contribute nothing. Provider profiles translate this vocabulary to their
@@ -36706,39 +37544,139 @@ export interface MJAIPromptEntity_LLMConfigurationSettings {
36706
37544
  * default — a wrong inherited value degrades safely, it never rejects a session.
36707
37545
  */
36708
37546
  export interface MJAIPromptEntity_RealtimeTurnDetectionSettings {
36709
- /**
36710
- * - `'default'` — let the provider profile decide (today's behavior).
36711
- * - `'serverVad'` — classic silence-based server VAD.
36712
- * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
36713
- * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
36714
- * to; the forward slot for full-duplex reasoning voice models.
36715
- */
36716
- Mode?: 'default' | 'serverVad' | 'semanticVad' | 'native' | null;
37547
+ /** The normalized mode; absent = `'default'`. */
37548
+ Mode?: MJAIPromptEntity_RealtimeTurnDetectionMode;
36717
37549
  /** Semantic-VAD aggressiveness (OpenAI `eagerness`); ignored without a mapping. */
36718
- Eagerness?: 'low' | 'auto' | 'high' | null;
37550
+ Eagerness?: 'low' | 'auto' | 'high';
36719
37551
  /** Server-VAD activation threshold (0–1); ignored without a mapping. */
36720
- Threshold?: number | null;
37552
+ Threshold?: number;
36721
37553
  /** Server-VAD trailing-silence duration in ms; ignored without a mapping. */
36722
- SilenceDurationMs?: number | null;
37554
+ SilenceDurationMs?: number;
37555
+ /**
37556
+ * What a turn's input may include. Declaring it keeps Gemini 3.8 Live's every-frame default (billed,
37557
+ * and consuming context) a decision rather than an inherited cost. Ignored without a mapping.
37558
+ */
37559
+ Coverage?: MJAIPromptEntity_RealtimeTurnCoverage;
37560
+ }
37561
+ /** Which plane handles reasoning: `'local'` (the application/agent loop, the default) or `'remote'`. */
37562
+ export type MJAIPromptEntity_RealtimeReasoningPlane = 'local' | 'remote';
37563
+ /** A reasoning effort in MJ's neutral vocabulary; each provider profile maps the values its model accepts. */
37564
+ export type MJAIPromptEntity_RealtimeReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
37565
+ /** The remote reasoning target, used when `Plane` is `'remote'`. */
37566
+ export interface MJAIPromptEntity_RealtimeRemoteReasoning {
37567
+ /** What the reference denotes: `'model'` (Live, Inworld) or `'hostedAgent'` (ElevenLabs). */
37568
+ Kind?: 'model' | 'hostedAgent';
37569
+ /** The target, e.g. `'gpt-5.6-terra'`, `'anthropic/claude-sonnet-4-6'`, `'MJ Realtime Co-Agent'`. */
37570
+ Ref?: string;
37571
+ /** The target's reasoning effort, for models that support one. */
37572
+ Effort?: MJAIPromptEntity_RealtimeReasoningEffort;
37573
+ /** The most output tokens for the remote reasoning pass. */
37574
+ MaxOutputTokens?: number;
37575
+ }
37576
+ /** Reasoning-plane settings for realtime models — dual delegation configuration. */
37577
+ export interface MJAIPromptEntity_RealtimeReasoningSettings {
37578
+ /** Absent = `'local'`. Fixed when the session is created. */
37579
+ Plane?: MJAIPromptEntity_RealtimeReasoningPlane;
37580
+ /** The remote target when `Plane` is `'remote'`. */
37581
+ Remote?: MJAIPromptEntity_RealtimeRemoteReasoning;
37582
+ /**
37583
+ * How hard the model itself reasons (Gemini `thinkingConfig.thinkingLevel`). A profile that cannot
37584
+ * honour the value logs a warning and uses its own default.
37585
+ */
37586
+ Level?: MJAIPromptEntity_RealtimeReasoningEffort;
37587
+ /**
37588
+ * Ask the model for human-readable summaries of its own reasoning (Gemini `includeThoughts`). They
37589
+ * are progress narration, not assistant speech. Absent = off.
37590
+ */
37591
+ IncludeThoughtSummaries?: boolean;
37592
+ }
37593
+ /** Which way samples flow on a track, relative to the model. */
37594
+ export type MJAIPromptEntity_RealtimeTrackDirection = 'inbound' | 'outbound';
37595
+ /** The modalities MJ itself reasons about (cost, consent, transcripts). */
37596
+ export type MJAIPromptEntity_RealtimeWellKnownModality = 'audio' | 'video' | 'image' | 'text';
37597
+ /** A modality key: one of the well-known values, or any registered string. */
37598
+ export type MJAIPromptEntity_RealtimeModalityKey = MJAIPromptEntity_RealtimeWellKnownModality | (string & {});
37599
+ /** How a track's usage is metered. */
37600
+ export type MJAIPromptEntity_RealtimeTrackUsageBasis = 'tokens' | 'seconds' | 'frames' | 'bytes';
37601
+ /**
37602
+ * One directional stream of one modality, as {@link MJAIPromptEntity_RealtimeConfigurationSettings.RequestedTracks}
37603
+ * requests it. Mirrors the track descriptor in `@memberjunction/ai` (`realtimeTracks.ts`).
37604
+ */
37605
+ export interface MJAIPromptEntity_RealtimeTrackDescriptor {
37606
+ /** The modality this track carries. */
37607
+ Modality: MJAIPromptEntity_RealtimeModalityKey;
37608
+ /** Which way samples flow, relative to the model. */
37609
+ Direction: MJAIPromptEntity_RealtimeTrackDirection;
37610
+ /** Wire encoding, e.g. `'audio/pcm;rate=16000'` or `'image/jpeg'`; absent = the profile's default. */
37611
+ Encoding?: string;
37612
+ /** Sample or frame cadence: fps for video, Hz for audio. */
37613
+ Rate?: number;
37614
+ /** How this track is metered; absent = the session's own basis. */
37615
+ UsageBasis?: readonly MJAIPromptEntity_RealtimeTrackUsageBasis[];
37616
+ /** Whether establishing this track needs an explicit human grant (camera, screen, microphone). */
37617
+ RequiresConsent?: boolean;
37618
+ /** Whether the session needs this track (`true`) or treats it as best-effort (`false`). */
37619
+ Required?: boolean;
37620
+ /** Which source feeds this track, when several streams of one modality and direction can exist. */
37621
+ SourceID?: string;
37622
+ /** A human-readable name for that source ("Whiteboard", "Camera"). */
37623
+ Label?: string;
36723
37624
  }
36724
37625
  /**
36725
- * Reasoning-plane settings for realtime models — dual delegation configuration. Absent defaults to
36726
- * `'local'`.
37626
+ * Which server signal means "the session has gone idle and deferred work may be flushed":
37627
+ * `'turnComplete'` (the default) or `'interactionStatus'`, for models with asynchronous reasoning
37628
+ * whose `turnComplete` arrives while they still reason and call tools.
36727
37629
  */
36728
- export interface MJAIPromptEntity_RealtimeReasoningSettings {
37630
+ export type MJAIPromptEntity_RealtimeIdleSignal = 'turnComplete' | 'interactionStatus';
37631
+ /** Tool-execution semantics a model permits. Capability declarations, not requests. */
37632
+ export interface MJAIPromptEntity_RealtimeToolingSettings {
36729
37633
  /**
36730
- * Which plane handles reasoning:
36731
- * - `'local'` — application/agent loop (default).
36732
- * - `'remote'` — delegated to remote model or hosted agent.
37634
+ * Whether synchronous blocking tool execution is legal. Absent = permitted. `false` on models that
37635
+ * reject blocking mode outright (Gemini 3.8 Live Extended Thinking).
36733
37636
  */
36734
- Plane?: 'local' | 'remote' | null;
36735
- /** Remote reasoning target configuration. */
36736
- Remote?: {
36737
- Kind?: 'model' | 'hostedAgent' | null;
36738
- Ref?: string | null;
36739
- Effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
36740
- MaxOutputTokens?: number | null;
36741
- } | null;
37637
+ SupportsBlockingExecution?: boolean;
37638
+ /**
37639
+ * Whether per-function scheduling hints are legal (Gemini `SILENT` / `WHEN_IDLE` / `INTERRUPTED`).
37640
+ * Absent = not supported.
37641
+ */
37642
+ SupportsScheduling?: boolean;
37643
+ /** Preferred function-calling behavior. */
37644
+ Behavior?: 'BLOCKING' | 'NON_BLOCKING';
37645
+ }
37646
+ /**
37647
+ * One price for a quantity a realtime session produces, in one currency. It applies only when all
37648
+ * three fields are set; a partial price, or a unit or currency the reader does not handle, counts
37649
+ * as no price.
37650
+ */
37651
+ export interface MJAIPromptEntity_RealtimeUnitPrice {
37652
+ /** The amount charged per {@link MJAIPromptEntity_RealtimeUnitPrice.Unit}. Never negative. */
37653
+ Price?: number | null;
37654
+ /**
37655
+ * The billing unit, named as in `MJ: AI Model Price Unit Types`. `'Per Minute'`: one minute.
37656
+ * `'Per 1M Tokens'`: one million tokens.
37657
+ */
37658
+ Unit?: 'Per Minute' | 'Per 1M Tokens' | null;
37659
+ /** ISO 4217 currency code, uppercase (e.g. `USD`), as on `MJ: AI Model Costs`. */
37660
+ Currency?: string | null;
37661
+ }
37662
+ /**
37663
+ * Prices for realtime output that the model's cost rows (`MJ: AI Model Costs`) do not price on
37664
+ * their own; the cost rows stay the authority for token prices. A price belongs to the host that
37665
+ * charges it, so set this on the model-vendor row: a price on the model or the model type would
37666
+ * reach every vendor that serves the model.
37667
+ */
37668
+ export interface MJAIPromptEntity_RealtimePricingSettings {
37669
+ /**
37670
+ * The price of avatar video output, charged on top of the session's token cost. `'Per Minute'`
37671
+ * prices the seconds of avatar video the model generates; `'Per 1M Tokens'` prices the output
37672
+ * tokens the provider counts as video. Set the price and its unit together: the cascade merges
37673
+ * per key, so a layer that sets only one of them keeps the other from the layer below.
37674
+ *
37675
+ * Unverified until checked against Google's bill (#5312): Gemini 3.8 Live on Vertex AI is
37676
+ * seeded at $0.37152 per minute, derived from Google's $1.00 per 1M avatar video output tokens
37677
+ * at 6,192 tokens per second.
37678
+ */
37679
+ AvatarVideoOutput?: MJAIPromptEntity_RealtimeUnitPrice | null;
36742
37680
  }
36743
37681
  /** Realtime (speech-to-speech) knobs. */
36744
37682
  export interface MJAIPromptEntity_RealtimeConfigurationSettings {
@@ -36752,7 +37690,31 @@ export interface MJAIPromptEntity_RealtimeConfigurationSettings {
36752
37690
  /**
36753
37691
  * Reasoning plane settings — dual delegation configuration. Absent defaults to `'local'`.
36754
37692
  */
36755
- Reasoning?: MJAIPromptEntity_RealtimeReasoningSettings | null;
37693
+ Reasoning?: MJAIPromptEntity_RealtimeReasoningSettings;
37694
+ /**
37695
+ * Whether this realtime model natively supports full-duplex conversational audio
37696
+ * (simultaneous speaking and listening with natural interruptions).
37697
+ *
37698
+ * When true, full-duplex models do not receive turn-taking tools or an energy-VAD floor gate,
37699
+ * allowing the provider's native full-duplex model to handle natural turn transitions.
37700
+ * Cascades AIModelType -> Vendor ModelDefaults -> AIModel -> AIModelVendor.
37701
+ */
37702
+ FullDuplex?: boolean | null;
37703
+ /** Tool-execution semantics this model permits. Absent = the profile's own defaults. */
37704
+ Tooling?: MJAIPromptEntity_RealtimeToolingSettings;
37705
+ /**
37706
+ * Media tracks a session asks the model to establish beyond audio. Absent or empty establishes
37707
+ * audio only, so a video track exists only because something asked for it and never arrives as an
37708
+ * inherited cost. Requests are intersected with what the model supports.
37709
+ */
37710
+ RequestedTracks?: readonly MJAIPromptEntity_RealtimeTrackDescriptor[];
37711
+ /** Which server signal means the session has gone idle. Absent = `'turnComplete'`. */
37712
+ IdleSignal?: MJAIPromptEntity_RealtimeIdleSignal;
37713
+ /**
37714
+ * Prices for output the token cost rows do not cover, such as avatar video. Set it on the
37715
+ * model-vendor row.
37716
+ */
37717
+ Pricing?: MJAIPromptEntity_RealtimePricingSettings | null;
36756
37718
  }
36757
37719
  /** Vision knobs. Reserved — no consumers yet. */
36758
37720
  export interface MJAIPromptEntity_VisionConfigurationSettings {
@@ -36762,6 +37724,22 @@ export interface MJAIPromptEntity_VisionConfigurationSettings {
36762
37724
  export interface MJAIPromptEntity_AudioConfigurationSettings {
36763
37725
  [key: string]: unknown;
36764
37726
  }
37727
+ /**
37728
+ * Privacy posture of the model deployment this configuration describes. Set it on the catalog layers
37729
+ * (`MJ: AI Models`, `MJ: AI Model Vendors`, a vendor's `ModelDefaults`): data retention is a property of
37730
+ * how a model is SERVED, so the vendor row is usually where it is true.
37731
+ */
37732
+ export interface MJAIPromptEntity_PrivacyConfigurationSettings {
37733
+ /**
37734
+ * Whether this model is served under a zero-data-retention agreement: the provider does not store
37735
+ * prompts, audio, images or outputs beyond serving the request. `true` is a positive claim that
37736
+ * somebody verified; absent, `null` and `false` all mean "not declared", never "retained", because
37737
+ * an undeclared model is not known to be bad. It is read by realtime channel exposure policy:
37738
+ * an agent that requires zero data retention for a channel's `'state'` or `'pixels'` exposure has
37739
+ * that exposure lowered on any model that does not declare `true` here.
37740
+ */
37741
+ ZeroDataRetention?: boolean | null;
37742
+ }
36765
37743
  /**
36766
37744
  * Typed-decision knobs, consumed at call time by the decision runner. They declare what a decision
36767
37745
  * model accepts, so an oversized request can be refused with a clear message before the call,
@@ -36796,6 +37774,8 @@ export interface MJAIPromptEntity_IAIModelConfiguration {
36796
37774
  Audio?: MJAIPromptEntity_AudioConfigurationSettings | null;
36797
37775
  /** Typed-decision limits. Honored at the catalog layers. */
36798
37776
  Decision?: MJAIPromptEntity_DecisionConfigurationSettings | null;
37777
+ /** Privacy posture of the model deployment. Honored at the catalog layers. */
37778
+ Privacy?: MJAIPromptEntity_PrivacyConfigurationSettings | null;
36799
37779
  }
36800
37780
  /**
36801
37781
  * The `PromptConfiguration` column on `MJ: AI Prompts` — per-prompt call-time knobs, layered ON TOP of the
@@ -36815,6 +37795,8 @@ export interface MJAIPromptEntity_IAIPromptConfiguration {
36815
37795
  Audio?: MJAIPromptEntity_AudioConfigurationSettings | null;
36816
37796
  /** Typed-decision limits. Reserved at this layer. */
36817
37797
  Decision?: MJAIPromptEntity_DecisionConfigurationSettings | null;
37798
+ /** Privacy posture. Reserved at this layer. */
37799
+ Privacy?: MJAIPromptEntity_PrivacyConfigurationSettings | null;
36818
37800
  }
36819
37801
  /**
36820
37802
  * The `PromptConfiguration` column on `MJ: AI Prompt Models` — the most specific layer, overriding both
@@ -36831,6 +37813,8 @@ export interface MJAIPromptEntity_IAIPromptModelConfiguration {
36831
37813
  Audio?: MJAIPromptEntity_AudioConfigurationSettings | null;
36832
37814
  /** Typed-decision limits. Reserved at this layer. */
36833
37815
  Decision?: MJAIPromptEntity_DecisionConfigurationSettings | null;
37816
+ /** Privacy posture. Reserved at this layer. */
37817
+ Privacy?: MJAIPromptEntity_PrivacyConfigurationSettings | null;
36834
37818
  }
36835
37819
  /**
36836
37820
  * `MJ: AI Vendors . Configuration` — the vendor's own configuration bag. General-purpose: a vendor
@@ -38807,7 +39791,8 @@ export declare class MJAIVendorTypeEntity extends BaseEntity<MJAIVendorTypeEntit
38807
39791
  * Two kinds of type live here, and the distinction is the whole point of the file:
38808
39792
  *
38809
39793
  * 1. **Shared modality sections** (`MJAIVendorEntity_LLMConfigurationSettings`, `MJAIVendorEntity_RealtimeConfigurationSettings`,
38810
- * `MJAIVendorEntity_VisionConfigurationSettings`, `MJAIVendorEntity_AudioConfigurationSettings`, `MJAIVendorEntity_DecisionConfigurationSettings`) —
39794
+ * `MJAIVendorEntity_VisionConfigurationSettings`, `MJAIVendorEntity_AudioConfigurationSettings`, `MJAIVendorEntity_DecisionConfigurationSettings`,
39795
+ * `MJAIVendorEntity_PrivacyConfigurationSettings`) —
38811
39796
  * what "the LLM configuration"
38812
39797
  * MEANS, defined once and reused by every layer that carries a configuration bag.
38813
39798
  * 2. **Per-table outer types** (`MJAIVendorEntity_IAIModelConfiguration`, `MJAIVendorEntity_IAIPromptConfiguration`,
@@ -38833,12 +39818,13 @@ export declare class MJAIVendorTypeEntity extends BaseEntity<MJAIVendorTypeEntit
38833
39818
  * therefore has to be self-contained — a definition cannot `import` a sibling, and `@file:`
38834
39819
  * substitutes a whole file rather than splicing one into another. Keeping every AI configuration
38835
39820
  * type in ONE file is what makes a shared section possible at all; the cost is that each of the
38836
- * five entities emits the full (prefixed) set, including outer types it does not use.
39821
+ * six entities emits the full (prefixed) set, including outer types it does not use.
38837
39822
  *
38838
39823
  * **Lockstep contract**: this file is the JSONType SOURCE; its package-side mirror is
38839
39824
  * `packages/AI/Core/src/generic/modelConfiguration.ts` in `@memberjunction/ai`, which runtime code
38840
- * compiles against. Keep the two in step when adding a section or property — the same pact
38841
- * `IAgentSettings` follows with `@memberjunction/ai-core-plus`.
39825
+ * compiles against (the track types mirror its `realtimeTracks.ts`). Keep the two in step when
39826
+ * adding a section or property — the same pact `IAgentSettings` follows with
39827
+ * `@memberjunction/ai-core-plus`. Core's `modelConfiguration.test.ts` fails when they differ.
38842
39828
  *
38843
39829
  * **Boundary rule**: anything the engine filters, sorts, or joins on stays a COLUMN (`PowerRank`,
38844
39830
  * `IsActive`, `Priority`, `Status` — SQL cannot cheaply predicate into this bag); anything a driver
@@ -38915,6 +39901,21 @@ export interface MJAIVendorEntity_LLMConfigurationSettings {
38915
39901
  */
38916
39902
  PrefixPromptCache?: boolean | null;
38917
39903
  }
39904
+ /**
39905
+ * MJ-normalized turn-detection mode, provider-neutral so a shared catalog is safe on every provider:
39906
+ * - `'default'` — let the provider profile decide (today's behavior).
39907
+ * - `'serverVad'` — classic silence-based server VAD.
39908
+ * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
39909
+ * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
39910
+ * to; the forward slot for full-duplex reasoning voice models.
39911
+ */
39912
+ export type MJAIVendorEntity_RealtimeTurnDetectionMode = 'default' | 'serverVad' | 'semanticVad' | 'native';
39913
+ /**
39914
+ * What a turn's input may include (distinct from detection, which decides when a turn ends):
39915
+ * - `'audioActivityOnly'` — audio activity only; video frames are sent deliberately.
39916
+ * - `'audioActivityAndAllVideo'` — audio activity plus every video frame (Gemini 3.8 Live's default).
39917
+ */
39918
+ export type MJAIVendorEntity_RealtimeTurnCoverage = 'audioActivityOnly' | 'audioActivityAndAllVideo';
38918
39919
  /**
38919
39920
  * MJ-normalized turn-detection settings for realtime (speech-to-speech) models. Every field is
38920
39921
  * optional; absent fields contribute nothing. Provider profiles translate this vocabulary to their
@@ -38922,39 +39923,139 @@ export interface MJAIVendorEntity_LLMConfigurationSettings {
38922
39923
  * default — a wrong inherited value degrades safely, it never rejects a session.
38923
39924
  */
38924
39925
  export interface MJAIVendorEntity_RealtimeTurnDetectionSettings {
38925
- /**
38926
- * - `'default'` — let the provider profile decide (today's behavior).
38927
- * - `'serverVad'` — classic silence-based server VAD.
38928
- * - `'semanticVad'` — semantic end-of-utterance detection (OpenAI `semantic_vad`).
38929
- * - `'native'` — this model's smartest documented turn/duplex mode, whatever the profile maps it
38930
- * to; the forward slot for full-duplex reasoning voice models.
38931
- */
38932
- Mode?: 'default' | 'serverVad' | 'semanticVad' | 'native' | null;
39926
+ /** The normalized mode; absent = `'default'`. */
39927
+ Mode?: MJAIVendorEntity_RealtimeTurnDetectionMode;
38933
39928
  /** Semantic-VAD aggressiveness (OpenAI `eagerness`); ignored without a mapping. */
38934
- Eagerness?: 'low' | 'auto' | 'high' | null;
39929
+ Eagerness?: 'low' | 'auto' | 'high';
38935
39930
  /** Server-VAD activation threshold (0–1); ignored without a mapping. */
38936
- Threshold?: number | null;
39931
+ Threshold?: number;
38937
39932
  /** Server-VAD trailing-silence duration in ms; ignored without a mapping. */
38938
- SilenceDurationMs?: number | null;
39933
+ SilenceDurationMs?: number;
39934
+ /**
39935
+ * What a turn's input may include. Declaring it keeps Gemini 3.8 Live's every-frame default (billed,
39936
+ * and consuming context) a decision rather than an inherited cost. Ignored without a mapping.
39937
+ */
39938
+ Coverage?: MJAIVendorEntity_RealtimeTurnCoverage;
39939
+ }
39940
+ /** Which plane handles reasoning: `'local'` (the application/agent loop, the default) or `'remote'`. */
39941
+ export type MJAIVendorEntity_RealtimeReasoningPlane = 'local' | 'remote';
39942
+ /** A reasoning effort in MJ's neutral vocabulary; each provider profile maps the values its model accepts. */
39943
+ export type MJAIVendorEntity_RealtimeReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
39944
+ /** The remote reasoning target, used when `Plane` is `'remote'`. */
39945
+ export interface MJAIVendorEntity_RealtimeRemoteReasoning {
39946
+ /** What the reference denotes: `'model'` (Live, Inworld) or `'hostedAgent'` (ElevenLabs). */
39947
+ Kind?: 'model' | 'hostedAgent';
39948
+ /** The target, e.g. `'gpt-5.6-terra'`, `'anthropic/claude-sonnet-4-6'`, `'MJ Realtime Co-Agent'`. */
39949
+ Ref?: string;
39950
+ /** The target's reasoning effort, for models that support one. */
39951
+ Effort?: MJAIVendorEntity_RealtimeReasoningEffort;
39952
+ /** The most output tokens for the remote reasoning pass. */
39953
+ MaxOutputTokens?: number;
39954
+ }
39955
+ /** Reasoning-plane settings for realtime models — dual delegation configuration. */
39956
+ export interface MJAIVendorEntity_RealtimeReasoningSettings {
39957
+ /** Absent = `'local'`. Fixed when the session is created. */
39958
+ Plane?: MJAIVendorEntity_RealtimeReasoningPlane;
39959
+ /** The remote target when `Plane` is `'remote'`. */
39960
+ Remote?: MJAIVendorEntity_RealtimeRemoteReasoning;
39961
+ /**
39962
+ * How hard the model itself reasons (Gemini `thinkingConfig.thinkingLevel`). A profile that cannot
39963
+ * honour the value logs a warning and uses its own default.
39964
+ */
39965
+ Level?: MJAIVendorEntity_RealtimeReasoningEffort;
39966
+ /**
39967
+ * Ask the model for human-readable summaries of its own reasoning (Gemini `includeThoughts`). They
39968
+ * are progress narration, not assistant speech. Absent = off.
39969
+ */
39970
+ IncludeThoughtSummaries?: boolean;
39971
+ }
39972
+ /** Which way samples flow on a track, relative to the model. */
39973
+ export type MJAIVendorEntity_RealtimeTrackDirection = 'inbound' | 'outbound';
39974
+ /** The modalities MJ itself reasons about (cost, consent, transcripts). */
39975
+ export type MJAIVendorEntity_RealtimeWellKnownModality = 'audio' | 'video' | 'image' | 'text';
39976
+ /** A modality key: one of the well-known values, or any registered string. */
39977
+ export type MJAIVendorEntity_RealtimeModalityKey = MJAIVendorEntity_RealtimeWellKnownModality | (string & {});
39978
+ /** How a track's usage is metered. */
39979
+ export type MJAIVendorEntity_RealtimeTrackUsageBasis = 'tokens' | 'seconds' | 'frames' | 'bytes';
39980
+ /**
39981
+ * One directional stream of one modality, as {@link MJAIVendorEntity_RealtimeConfigurationSettings.RequestedTracks}
39982
+ * requests it. Mirrors the track descriptor in `@memberjunction/ai` (`realtimeTracks.ts`).
39983
+ */
39984
+ export interface MJAIVendorEntity_RealtimeTrackDescriptor {
39985
+ /** The modality this track carries. */
39986
+ Modality: MJAIVendorEntity_RealtimeModalityKey;
39987
+ /** Which way samples flow, relative to the model. */
39988
+ Direction: MJAIVendorEntity_RealtimeTrackDirection;
39989
+ /** Wire encoding, e.g. `'audio/pcm;rate=16000'` or `'image/jpeg'`; absent = the profile's default. */
39990
+ Encoding?: string;
39991
+ /** Sample or frame cadence: fps for video, Hz for audio. */
39992
+ Rate?: number;
39993
+ /** How this track is metered; absent = the session's own basis. */
39994
+ UsageBasis?: readonly MJAIVendorEntity_RealtimeTrackUsageBasis[];
39995
+ /** Whether establishing this track needs an explicit human grant (camera, screen, microphone). */
39996
+ RequiresConsent?: boolean;
39997
+ /** Whether the session needs this track (`true`) or treats it as best-effort (`false`). */
39998
+ Required?: boolean;
39999
+ /** Which source feeds this track, when several streams of one modality and direction can exist. */
40000
+ SourceID?: string;
40001
+ /** A human-readable name for that source ("Whiteboard", "Camera"). */
40002
+ Label?: string;
38939
40003
  }
38940
40004
  /**
38941
- * Reasoning-plane settings for realtime models — dual delegation configuration. Absent defaults to
38942
- * `'local'`.
40005
+ * Which server signal means "the session has gone idle and deferred work may be flushed":
40006
+ * `'turnComplete'` (the default) or `'interactionStatus'`, for models with asynchronous reasoning
40007
+ * whose `turnComplete` arrives while they still reason and call tools.
38943
40008
  */
38944
- export interface MJAIVendorEntity_RealtimeReasoningSettings {
40009
+ export type MJAIVendorEntity_RealtimeIdleSignal = 'turnComplete' | 'interactionStatus';
40010
+ /** Tool-execution semantics a model permits. Capability declarations, not requests. */
40011
+ export interface MJAIVendorEntity_RealtimeToolingSettings {
38945
40012
  /**
38946
- * Which plane handles reasoning:
38947
- * - `'local'` — application/agent loop (default).
38948
- * - `'remote'` — delegated to remote model or hosted agent.
40013
+ * Whether synchronous blocking tool execution is legal. Absent = permitted. `false` on models that
40014
+ * reject blocking mode outright (Gemini 3.8 Live Extended Thinking).
38949
40015
  */
38950
- Plane?: 'local' | 'remote' | null;
38951
- /** Remote reasoning target configuration. */
38952
- Remote?: {
38953
- Kind?: 'model' | 'hostedAgent' | null;
38954
- Ref?: string | null;
38955
- Effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
38956
- MaxOutputTokens?: number | null;
38957
- } | null;
40016
+ SupportsBlockingExecution?: boolean;
40017
+ /**
40018
+ * Whether per-function scheduling hints are legal (Gemini `SILENT` / `WHEN_IDLE` / `INTERRUPTED`).
40019
+ * Absent = not supported.
40020
+ */
40021
+ SupportsScheduling?: boolean;
40022
+ /** Preferred function-calling behavior. */
40023
+ Behavior?: 'BLOCKING' | 'NON_BLOCKING';
40024
+ }
40025
+ /**
40026
+ * One price for a quantity a realtime session produces, in one currency. It applies only when all
40027
+ * three fields are set; a partial price, or a unit or currency the reader does not handle, counts
40028
+ * as no price.
40029
+ */
40030
+ export interface MJAIVendorEntity_RealtimeUnitPrice {
40031
+ /** The amount charged per {@link MJAIVendorEntity_RealtimeUnitPrice.Unit}. Never negative. */
40032
+ Price?: number | null;
40033
+ /**
40034
+ * The billing unit, named as in `MJ: AI Model Price Unit Types`. `'Per Minute'`: one minute.
40035
+ * `'Per 1M Tokens'`: one million tokens.
40036
+ */
40037
+ Unit?: 'Per Minute' | 'Per 1M Tokens' | null;
40038
+ /** ISO 4217 currency code, uppercase (e.g. `USD`), as on `MJ: AI Model Costs`. */
40039
+ Currency?: string | null;
40040
+ }
40041
+ /**
40042
+ * Prices for realtime output that the model's cost rows (`MJ: AI Model Costs`) do not price on
40043
+ * their own; the cost rows stay the authority for token prices. A price belongs to the host that
40044
+ * charges it, so set this on the model-vendor row: a price on the model or the model type would
40045
+ * reach every vendor that serves the model.
40046
+ */
40047
+ export interface MJAIVendorEntity_RealtimePricingSettings {
40048
+ /**
40049
+ * The price of avatar video output, charged on top of the session's token cost. `'Per Minute'`
40050
+ * prices the seconds of avatar video the model generates; `'Per 1M Tokens'` prices the output
40051
+ * tokens the provider counts as video. Set the price and its unit together: the cascade merges
40052
+ * per key, so a layer that sets only one of them keeps the other from the layer below.
40053
+ *
40054
+ * Unverified until checked against Google's bill (#5312): Gemini 3.8 Live on Vertex AI is
40055
+ * seeded at $0.37152 per minute, derived from Google's $1.00 per 1M avatar video output tokens
40056
+ * at 6,192 tokens per second.
40057
+ */
40058
+ AvatarVideoOutput?: MJAIVendorEntity_RealtimeUnitPrice | null;
38958
40059
  }
38959
40060
  /** Realtime (speech-to-speech) knobs. */
38960
40061
  export interface MJAIVendorEntity_RealtimeConfigurationSettings {
@@ -38968,7 +40069,31 @@ export interface MJAIVendorEntity_RealtimeConfigurationSettings {
38968
40069
  /**
38969
40070
  * Reasoning plane settings — dual delegation configuration. Absent defaults to `'local'`.
38970
40071
  */
38971
- Reasoning?: MJAIVendorEntity_RealtimeReasoningSettings | null;
40072
+ Reasoning?: MJAIVendorEntity_RealtimeReasoningSettings;
40073
+ /**
40074
+ * Whether this realtime model natively supports full-duplex conversational audio
40075
+ * (simultaneous speaking and listening with natural interruptions).
40076
+ *
40077
+ * When true, full-duplex models do not receive turn-taking tools or an energy-VAD floor gate,
40078
+ * allowing the provider's native full-duplex model to handle natural turn transitions.
40079
+ * Cascades AIModelType -> Vendor ModelDefaults -> AIModel -> AIModelVendor.
40080
+ */
40081
+ FullDuplex?: boolean | null;
40082
+ /** Tool-execution semantics this model permits. Absent = the profile's own defaults. */
40083
+ Tooling?: MJAIVendorEntity_RealtimeToolingSettings;
40084
+ /**
40085
+ * Media tracks a session asks the model to establish beyond audio. Absent or empty establishes
40086
+ * audio only, so a video track exists only because something asked for it and never arrives as an
40087
+ * inherited cost. Requests are intersected with what the model supports.
40088
+ */
40089
+ RequestedTracks?: readonly MJAIVendorEntity_RealtimeTrackDescriptor[];
40090
+ /** Which server signal means the session has gone idle. Absent = `'turnComplete'`. */
40091
+ IdleSignal?: MJAIVendorEntity_RealtimeIdleSignal;
40092
+ /**
40093
+ * Prices for output the token cost rows do not cover, such as avatar video. Set it on the
40094
+ * model-vendor row.
40095
+ */
40096
+ Pricing?: MJAIVendorEntity_RealtimePricingSettings | null;
38972
40097
  }
38973
40098
  /** Vision knobs. Reserved — no consumers yet. */
38974
40099
  export interface MJAIVendorEntity_VisionConfigurationSettings {
@@ -38978,6 +40103,22 @@ export interface MJAIVendorEntity_VisionConfigurationSettings {
38978
40103
  export interface MJAIVendorEntity_AudioConfigurationSettings {
38979
40104
  [key: string]: unknown;
38980
40105
  }
40106
+ /**
40107
+ * Privacy posture of the model deployment this configuration describes. Set it on the catalog layers
40108
+ * (`MJ: AI Models`, `MJ: AI Model Vendors`, a vendor's `ModelDefaults`): data retention is a property of
40109
+ * how a model is SERVED, so the vendor row is usually where it is true.
40110
+ */
40111
+ export interface MJAIVendorEntity_PrivacyConfigurationSettings {
40112
+ /**
40113
+ * Whether this model is served under a zero-data-retention agreement: the provider does not store
40114
+ * prompts, audio, images or outputs beyond serving the request. `true` is a positive claim that
40115
+ * somebody verified; absent, `null` and `false` all mean "not declared", never "retained", because
40116
+ * an undeclared model is not known to be bad. It is read by realtime channel exposure policy:
40117
+ * an agent that requires zero data retention for a channel's `'state'` or `'pixels'` exposure has
40118
+ * that exposure lowered on any model that does not declare `true` here.
40119
+ */
40120
+ ZeroDataRetention?: boolean | null;
40121
+ }
38981
40122
  /**
38982
40123
  * Typed-decision knobs, consumed at call time by the decision runner. They declare what a decision
38983
40124
  * model accepts, so an oversized request can be refused with a clear message before the call,
@@ -39012,6 +40153,8 @@ export interface MJAIVendorEntity_IAIModelConfiguration {
39012
40153
  Audio?: MJAIVendorEntity_AudioConfigurationSettings | null;
39013
40154
  /** Typed-decision limits. Honored at the catalog layers. */
39014
40155
  Decision?: MJAIVendorEntity_DecisionConfigurationSettings | null;
40156
+ /** Privacy posture of the model deployment. Honored at the catalog layers. */
40157
+ Privacy?: MJAIVendorEntity_PrivacyConfigurationSettings | null;
39015
40158
  }
39016
40159
  /**
39017
40160
  * The `PromptConfiguration` column on `MJ: AI Prompts` — per-prompt call-time knobs, layered ON TOP of the
@@ -39031,6 +40174,8 @@ export interface MJAIVendorEntity_IAIPromptConfiguration {
39031
40174
  Audio?: MJAIVendorEntity_AudioConfigurationSettings | null;
39032
40175
  /** Typed-decision limits. Reserved at this layer. */
39033
40176
  Decision?: MJAIVendorEntity_DecisionConfigurationSettings | null;
40177
+ /** Privacy posture. Reserved at this layer. */
40178
+ Privacy?: MJAIVendorEntity_PrivacyConfigurationSettings | null;
39034
40179
  }
39035
40180
  /**
39036
40181
  * The `PromptConfiguration` column on `MJ: AI Prompt Models` — the most specific layer, overriding both
@@ -39047,6 +40192,8 @@ export interface MJAIVendorEntity_IAIPromptModelConfiguration {
39047
40192
  Audio?: MJAIVendorEntity_AudioConfigurationSettings | null;
39048
40193
  /** Typed-decision limits. Reserved at this layer. */
39049
40194
  Decision?: MJAIVendorEntity_DecisionConfigurationSettings | null;
40195
+ /** Privacy posture. Reserved at this layer. */
40196
+ Privacy?: MJAIVendorEntity_PrivacyConfigurationSettings | null;
39050
40197
  }
39051
40198
  /**
39052
40199
  * `MJ: AI Vendors . Configuration` — the vendor's own configuration bag. General-purpose: a vendor
@@ -41996,8 +43143,14 @@ export interface MJApplicationEntity_IDefaultNavItem {
41996
43143
  * realtime persona/disclosure overrides). Every field is optional — an app opts into
41997
43144
  * exactly what it needs.
41998
43145
  *
41999
- * Disclosure values ('silent' | 'mention' | 'hand-voice') mirror the AgentDisclosurePolicy
42000
- * union declared in @memberjunction/ai-core-plus. Keep the two in lockstep.
43146
+ * Disclosure values ('silent' | 'mention' | 'hand-voice') mirror the RealtimeDisclosurePolicy
43147
+ * union declared in @memberjunction/ai-agents.
43148
+ *
43149
+ * **Lockstep contract**: this interface is mirrored, field for field, by `MJApplicationEntity_IAgentSettings` in
43150
+ * `packages/AI/CorePlus/src/agent-settings.ts` (`@memberjunction/ai-core-plus`). Runtime code parses
43151
+ * the column with that mirror (`ParseAgentSettings`) rather than the CodeGen-generated
43152
+ * `AgentSettingsObject` accessor, so a field added here is usable at runtime before CodeGen next
43153
+ * regenerates the inline copy. Edit both in the same commit.
42001
43154
  */
42002
43155
  export interface MJApplicationEntity_IAgentSettings {
42003
43156
  /** The app's default/lead agent (conversational default AND realtime lead identity). Agent ID. */
@@ -42042,6 +43195,37 @@ export interface MJApplicationEntity_IAgentSettings {
42042
43195
  } | null;
42043
43196
  /** Model preference override (AI Models Name or ID). */
42044
43197
  ModelPreference?: string | null;
43198
+ /**
43199
+ * Which interactive realtime channels (Whiteboard, Remote Browser, an Open App's own widget, …)
43200
+ * this app's sessions get. Layers into the same per-channel scoping cascade as the agent's own
43201
+ * `realtime.channels` configuration (see `@memberjunction/ai-core-plus` `ResolveRealtimeChannelScope`):
43202
+ * a layer's `Include` turns a channel on (the only way to get an `opt-in` channel), its `Exclude`
43203
+ * turns one off, and the MOST SPECIFIC layer to mention a channel wins; within one layer `Exclude`
43204
+ * beats `Include`. A channel's registry row `IsActive = false` remains a master kill switch that
43205
+ * nothing here can override. Channel keys match the channel's name, case-insensitively.
43206
+ */
43207
+ Channels?: {
43208
+ /** Channel keys to turn ON (required for `opt-in` channels; a no-op for `all-sessions` ones). */
43209
+ Include?: string[] | null;
43210
+ /** Channel keys to turn OFF. Beats `Include` within the same layer. */
43211
+ Exclude?: string[] | null;
43212
+ /** Per-channel opaque configuration, keyed by channel key; delivered to the channel at session start. */
43213
+ Config?: {
43214
+ [channelKey: string]: {
43215
+ [key: string]: unknown;
43216
+ };
43217
+ } | null;
43218
+ /** Per-channel display override, keyed by channel key. */
43219
+ DisplayPolicy?: {
43220
+ [channelKey: string]: 'open-on-start' | 'on-demand' | 'headless';
43221
+ } | null;
43222
+ /**
43223
+ * Exposure levels that need a zero-data-retention model. When the session model's configuration
43224
+ * does not declare `Privacy.ZeroDataRetention: true`, exposure is lowered to below the lowest level
43225
+ * listed, and the agent is told why. Applies to every channel in the session.
43226
+ */
43227
+ RequireZeroDataRetentionFor?: Array<'state' | 'pixels'> | null;
43228
+ } | null;
42045
43229
  } | null;
42046
43230
  }
42047
43231
  /**
@@ -50792,6 +51976,146 @@ export declare class MJConversationArtifactEntity extends BaseEntity<MJConversat
50792
51976
  */
50793
51977
  get ArtifactType(): string;
50794
51978
  }
51979
+ /**
51980
+ * MJ: Conversation Branches - strongly typed entity sub-class
51981
+ * * Schema: __mj
51982
+ * * Base Table: ConversationBranch
51983
+ * * Base View: vwConversationBranches
51984
+ * * @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.
51985
+ * * Primary Key: ID
51986
+ * @extends {BaseEntity}
51987
+ * @class
51988
+ * @public
51989
+ */
51990
+ export declare class MJConversationBranchEntity extends BaseEntity<MJConversationBranchEntityType> {
51991
+ /**
51992
+ * Loads the MJ: Conversation Branches record from the database
51993
+ * @param ID: string - primary key value to load the MJ: Conversation Branches record.
51994
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
51995
+ * @returns {Promise<boolean>} - true if successful, false otherwise
51996
+ * @public
51997
+ * @async
51998
+ * @memberof MJConversationBranchEntity
51999
+ * @method
52000
+ * @override
52001
+ */
52002
+ Load(ID: string, EntityRelationshipsToLoad?: string[]): Promise<boolean>;
52003
+ /**
52004
+ * MJ: Conversation Branches - Delete method override to wrap in transaction since CascadeDeletes is true.
52005
+ * Wrapping in a transaction ensures that all cascade delete operations are handled atomically.
52006
+ * @public
52007
+ * @method
52008
+ * @override
52009
+ * @memberof MJConversationBranchEntity
52010
+ * @returns {Promise<boolean>} - true if successful, false otherwise
52011
+ */
52012
+ Delete(options?: EntityDeleteOptions): Promise<boolean>;
52013
+ /**
52014
+ * * Field Name: ID
52015
+ * * Display Name: ID
52016
+ * * SQL Data Type: uniqueidentifier
52017
+ * * Default Value: newsequentialid()
52018
+ */
52019
+ get ID(): string;
52020
+ set ID(value: string);
52021
+ /**
52022
+ * * Field Name: ConversationID
52023
+ * * Display Name: Conversation
52024
+ * * SQL Data Type: uniqueidentifier
52025
+ * * Related Entity/Foreign Key: MJ: Conversations (vwConversations.ID)
52026
+ * * Description: The conversation this fork belongs to.
52027
+ */
52028
+ get ConversationID(): string;
52029
+ set ConversationID(value: string);
52030
+ /**
52031
+ * * Field Name: ParentBranchID
52032
+ * * Display Name: Parent Branch
52033
+ * * SQL Data Type: uniqueidentifier
52034
+ * * Related Entity/Foreign Key: MJ: Conversation Branches (vwConversationBranches.ID)
52035
+ * * Description: The fork this one started from. NULL means it started from Main, or before the first message when ForkFromSequence is also NULL.
52036
+ */
52037
+ get ParentBranchID(): string | null;
52038
+ set ParentBranchID(value: string | null);
52039
+ /**
52040
+ * * Field Name: ForkFromSequence
52041
+ * * Display Name: Fork From Sequence
52042
+ * * SQL Data Type: int
52043
+ * * 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.
52044
+ */
52045
+ get ForkFromSequence(): number | null;
52046
+ set ForkFromSequence(value: number | null);
52047
+ /**
52048
+ * * Field Name: Name
52049
+ * * Display Name: Name
52050
+ * * SQL Data Type: nvarchar(255)
52051
+ * * 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.
52052
+ */
52053
+ get Name(): string | null;
52054
+ set Name(value: string | null);
52055
+ /**
52056
+ * * Field Name: Kind
52057
+ * * Display Name: Kind
52058
+ * * SQL Data Type: nvarchar(20)
52059
+ * * Default Value: Fork
52060
+ * * Value List Type: List
52061
+ * * Possible Values
52062
+ * * Edit
52063
+ * * Fork
52064
+ * * Regenerate
52065
+ * * Description: How the fork started: Fork (Fork from here), Edit (a sent message was edited) or Regenerate (an answer was regenerated).
52066
+ */
52067
+ get Kind(): 'Edit' | 'Fork' | 'Regenerate';
52068
+ set Kind(value: 'Edit' | 'Fork' | 'Regenerate');
52069
+ /**
52070
+ * * Field Name: SourceDetailID
52071
+ * * Display Name: Source Detail
52072
+ * * SQL Data Type: uniqueidentifier
52073
+ * * 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.
52074
+ */
52075
+ get SourceDetailID(): string | null;
52076
+ set SourceDetailID(value: string | null);
52077
+ /**
52078
+ * * Field Name: UserID
52079
+ * * Display Name: User
52080
+ * * SQL Data Type: uniqueidentifier
52081
+ * * Related Entity/Foreign Key: MJ: Users (vwUsers.ID)
52082
+ * * Description: The person who started the fork.
52083
+ */
52084
+ get UserID(): string;
52085
+ set UserID(value: string);
52086
+ /**
52087
+ * * Field Name: __mj_CreatedAt
52088
+ * * Display Name: Created At
52089
+ * * SQL Data Type: datetimeoffset
52090
+ * * Default Value: getutcdate()
52091
+ */
52092
+ get __mj_CreatedAt(): Date;
52093
+ /**
52094
+ * * Field Name: __mj_UpdatedAt
52095
+ * * Display Name: Updated At
52096
+ * * SQL Data Type: datetimeoffset
52097
+ * * Default Value: getutcdate()
52098
+ */
52099
+ get __mj_UpdatedAt(): Date;
52100
+ /**
52101
+ * * Field Name: Conversation
52102
+ * * Display Name: Conversation Detail
52103
+ * * SQL Data Type: nvarchar(255)
52104
+ */
52105
+ get Conversation(): string | null;
52106
+ /**
52107
+ * * Field Name: ParentBranch
52108
+ * * Display Name: Parent Branch Detail
52109
+ * * SQL Data Type: nvarchar(255)
52110
+ */
52111
+ get ParentBranch(): string | null;
52112
+ /**
52113
+ * * Field Name: User
52114
+ * * Display Name: User Name
52115
+ * * SQL Data Type: nvarchar(100)
52116
+ */
52117
+ get User(): string;
52118
+ }
50795
52119
  /**
50796
52120
  * MJ: Conversation Compaction Runs - strongly typed entity sub-class
50797
52121
  * * Schema: __mj
@@ -51612,6 +52936,23 @@ export declare class MJConversationDetailEntity extends BaseEntity<MJConversatio
51612
52936
  */
51613
52937
  get Sequence(): number;
51614
52938
  /**
52939
+ * * Field Name: BranchID
52940
+ * * Display Name: Branch
52941
+ * * SQL Data Type: uniqueidentifier
52942
+ * * Related Entity/Foreign Key: MJ: Conversation Branches (vwConversationBranches.ID)
52943
+ * * Description: The fork this message belongs to. NULL means Main (the trunk). Every writer sets it explicitly.
52944
+ */
52945
+ get BranchID(): string | null;
52946
+ set BranchID(value: string | null);
52947
+ /**
52948
+ * * Field Name: ReplacedAt
52949
+ * * Display Name: Replaced At
52950
+ * * SQL Data Type: datetimeoffset
52951
+ * * 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.
52952
+ */
52953
+ get ReplacedAt(): Date | null;
52954
+ set ReplacedAt(value: Date | null);
52955
+ /**
51615
52956
  * * Field Name: Conversation
51616
52957
  * * Display Name: Conversation
51617
52958
  * * SQL Data Type: nvarchar(255)
@@ -51654,6 +52995,12 @@ export declare class MJConversationDetailEntity extends BaseEntity<MJConversatio
51654
52995
  */
51655
52996
  get TestRun(): string | null;
51656
52997
  /**
52998
+ * * Field Name: Branch
52999
+ * * Display Name: Branch
53000
+ * * SQL Data Type: nvarchar(255)
53001
+ */
53002
+ get Branch(): string | null;
53003
+ /**
51657
53004
  * * Field Name: RootParentID
51658
53005
  * * Display Name: Root Parent
51659
53006
  * * SQL Data Type: uniqueidentifier
@@ -55791,6 +57138,13 @@ export interface MJEntityEntity_IEntityCloneConfiguration {
55791
57138
  Enabled?: boolean;
55792
57139
  /** Hard refusal: this entity's rows are never created by the clone engine, as root or as child. Overrides every relationship policy. Use for audit, run, credential and metadata entities. */
55793
57140
  NotCloneable?: boolean;
57141
+ /**
57142
+ * Lets a NotCloneable entity's rows be copied after all, but only as children of a template copy: a
57143
+ * clone run under a preset with `TemplateSourceField` whose source record has that flag set. Use for
57144
+ * rows that are private to a person (conversations, dashboard preferences) and must never be copied
57145
+ * from one user to another, yet belong in a template built to be copied.
57146
+ */
57147
+ CloneableFromTemplate?: boolean;
55794
57148
  /** Shown to users and returned in warnings when NotCloneable or Enabled=false. */
55795
57149
  NotCloneableReason?: string;
55796
57150
  /** Authorization name checked with ancestors. Default 'Clone Records'; resolved per §9.1. */
@@ -55952,6 +57306,14 @@ export interface MJEntityEntity_IClonePreset {
55952
57306
  Relationships?: Record<string, {
55953
57307
  Policy: 'Deep' | 'Reference' | 'Skip';
55954
57308
  }>;
57309
+ /**
57310
+ * Makes this a template preset. Names a boolean field on the root entity; the preset is offered and
57311
+ * applied only when the source record has it set (e.g. `IsTemplate` on `MJ: Users`), and the plan is
57312
+ * blocked otherwise. A template preset may open edges the configuration Locks and copy children whose
57313
+ * entity is `CloneableFromTemplate`: those protections keep a person's private records from being
57314
+ * copied to someone else, which does not apply to a record built to be copied.
57315
+ */
57316
+ TemplateSourceField?: string;
55955
57317
  }
55956
57318
  /**
55957
57319
  * Declarative configuration for prospective IsA subtype resolution on an entity.
@@ -81197,6 +82559,175 @@ export declare class MJSchemaInfoEntity extends BaseEntity<MJSchemaInfoEntityTyp
81197
82559
  get CanonicalSchemaName(): string | null;
81198
82560
  set CanonicalSchemaName(value: string | null);
81199
82561
  }
82562
+ /**
82563
+ * MJ: Scoped Notification Configs - strongly typed entity sub-class
82564
+ * * Schema: __mj
82565
+ * * Base Table: ScopedNotificationConfig
82566
+ * * Base View: vwScopedNotificationConfigs
82567
+ * * @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.
82568
+ * * Primary Key: ID
82569
+ * @extends {BaseEntity}
82570
+ * @class
82571
+ * @public
82572
+ */
82573
+ export declare class MJScopedNotificationConfigEntity extends BaseEntity<MJScopedNotificationConfigEntityType> {
82574
+ /**
82575
+ * Loads the MJ: Scoped Notification Configs record from the database
82576
+ * @param ID: string - primary key value to load the MJ: Scoped Notification Configs record.
82577
+ * @param EntityRelationshipsToLoad - (optional) the relationships to load
82578
+ * @returns {Promise<boolean>} - true if successful, false otherwise
82579
+ * @public
82580
+ * @async
82581
+ * @memberof MJScopedNotificationConfigEntity
82582
+ * @method
82583
+ * @override
82584
+ */
82585
+ Load(ID: string, EntityRelationshipsToLoad?: string[]): Promise<boolean>;
82586
+ /**
82587
+ * * Field Name: ID
82588
+ * * Display Name: ID
82589
+ * * SQL Data Type: uniqueidentifier
82590
+ * * Default Value: newsequentialid()
82591
+ */
82592
+ get ID(): string;
82593
+ set ID(value: string);
82594
+ /**
82595
+ * * Field Name: NotificationTypeID
82596
+ * * Display Name: Notification Type
82597
+ * * SQL Data Type: uniqueidentifier
82598
+ * * Related Entity/Foreign Key: MJ: User Notification Types (vwUserNotificationTypes.ID)
82599
+ * * Description: The notification type this config is for.
82600
+ */
82601
+ get NotificationTypeID(): string;
82602
+ set NotificationTypeID(value: string);
82603
+ /**
82604
+ * * Field Name: Description
82605
+ * * Display Name: Description
82606
+ * * SQL Data Type: nvarchar(MAX)
82607
+ * * Description: Why the row exists, for the administrator who finds it.
82608
+ */
82609
+ get Description(): string | null;
82610
+ set Description(value: string | null);
82611
+ /**
82612
+ * * Field Name: PrimaryScopeEntityID
82613
+ * * Display Name: Primary Scope Entity ID
82614
+ * * SQL Data Type: uniqueidentifier
82615
+ * * Related Entity/Foreign Key: MJ: Entities (vwEntities.ID)
82616
+ * * Description: The entity of the primary scope record (Applications, Roles, Users, Companies, ...). NULL with PrimaryScopeRecordID NULL = a global row.
82617
+ */
82618
+ get PrimaryScopeEntityID(): string | null;
82619
+ set PrimaryScopeEntityID(value: string | null);
82620
+ /**
82621
+ * * Field Name: PrimaryScopeRecordID
82622
+ * * Display Name: Primary Scope Record ID
82623
+ * * SQL Data Type: nvarchar(100)
82624
+ * * 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.
82625
+ */
82626
+ get PrimaryScopeRecordID(): string | null;
82627
+ set PrimaryScopeRecordID(value: string | null);
82628
+ /**
82629
+ * * Field Name: SecondaryScopes
82630
+ * * Display Name: Secondary Scopes
82631
+ * * SQL Data Type: nvarchar(MAX)
82632
+ * * 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.
82633
+ */
82634
+ get SecondaryScopes(): string | null;
82635
+ set SecondaryScopes(value: string | null);
82636
+ /**
82637
+ * * Field Name: InApp
82638
+ * * Display Name: In-App Channel
82639
+ * * SQL Data Type: nvarchar(20)
82640
+ * * Value List Type: List
82641
+ * * Possible Values
82642
+ * * Allow
82643
+ * * Deny
82644
+ * * Description: The in-app channel: Allow, Deny, or NULL to leave it to the next row.
82645
+ */
82646
+ get InApp(): 'Allow' | 'Deny' | null;
82647
+ set InApp(value: 'Allow' | 'Deny' | null);
82648
+ /**
82649
+ * * Field Name: Email
82650
+ * * Display Name: Email Channel
82651
+ * * SQL Data Type: nvarchar(20)
82652
+ * * Value List Type: List
82653
+ * * Possible Values
82654
+ * * Allow
82655
+ * * Deny
82656
+ * * Description: The email channel: Allow, Deny, or NULL to leave it to the next row.
82657
+ */
82658
+ get Email(): 'Allow' | 'Deny' | null;
82659
+ set Email(value: 'Allow' | 'Deny' | null);
82660
+ /**
82661
+ * * Field Name: SMS
82662
+ * * Display Name: SMS Channel
82663
+ * * SQL Data Type: nvarchar(20)
82664
+ * * Value List Type: List
82665
+ * * Possible Values
82666
+ * * Allow
82667
+ * * Deny
82668
+ * * Description: The SMS channel: Allow, Deny, or NULL to leave it to the next row.
82669
+ */
82670
+ get SMS(): 'Allow' | 'Deny' | null;
82671
+ set SMS(value: 'Allow' | 'Deny' | null);
82672
+ /**
82673
+ * * Field Name: IsLocked
82674
+ * * Display Name: Is Locked
82675
+ * * SQL Data Type: bit
82676
+ * * Default Value: 0
82677
+ * * 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.
82678
+ */
82679
+ get IsLocked(): boolean;
82680
+ set IsLocked(value: boolean);
82681
+ /**
82682
+ * * Field Name: Priority
82683
+ * * Display Name: Priority
82684
+ * * SQL Data Type: int
82685
+ * * Default Value: 0
82686
+ * * Description: Tie-break for resolution. Higher wins when two rows tie on scope specificity and neither denies. Default 0.
82687
+ */
82688
+ get Priority(): number;
82689
+ set Priority(value: number);
82690
+ /**
82691
+ * * Field Name: Status
82692
+ * * Display Name: Status
82693
+ * * SQL Data Type: nvarchar(20)
82694
+ * * Default Value: Active
82695
+ * * Value List Type: List
82696
+ * * Possible Values
82697
+ * * Active
82698
+ * * Archived
82699
+ * * Provisional
82700
+ * * Description: Lifecycle: Active (live), Provisional (staged; eligible), Archived (excluded from resolution).
82701
+ */
82702
+ get Status(): 'Active' | 'Archived' | 'Provisional';
82703
+ set Status(value: 'Active' | 'Archived' | 'Provisional');
82704
+ /**
82705
+ * * Field Name: __mj_CreatedAt
82706
+ * * Display Name: Created At
82707
+ * * SQL Data Type: datetimeoffset
82708
+ * * Default Value: getutcdate()
82709
+ */
82710
+ get __mj_CreatedAt(): Date;
82711
+ /**
82712
+ * * Field Name: __mj_UpdatedAt
82713
+ * * Display Name: Updated At
82714
+ * * SQL Data Type: datetimeoffset
82715
+ * * Default Value: getutcdate()
82716
+ */
82717
+ get __mj_UpdatedAt(): Date;
82718
+ /**
82719
+ * * Field Name: NotificationType
82720
+ * * Display Name: Notification Type Name
82721
+ * * SQL Data Type: nvarchar(100)
82722
+ */
82723
+ get NotificationType(): string;
82724
+ /**
82725
+ * * Field Name: PrimaryScopeEntity
82726
+ * * Display Name: Primary Scope Entity
82727
+ * * SQL Data Type: nvarchar(255)
82728
+ */
82729
+ get PrimaryScopeEntity(): string | null;
82730
+ }
81200
82731
  /**
81201
82732
  * MJ: Scoped Prompt Configs - strongly typed entity sub-class
81202
82733
  * * Schema: __mj
@@ -91045,6 +92576,15 @@ export declare class MJUserEntity extends BaseEntity<MJUserEntityType> {
91045
92576
  get UserImageIconClass(): string | null;
91046
92577
  set UserImageIconClass(value: string | null);
91047
92578
  /**
92579
+ * * Field Name: IsTemplate
92580
+ * * Display Name: Is Template
92581
+ * * SQL Data Type: bit
92582
+ * * Default Value: 0
92583
+ * * 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.
92584
+ */
92585
+ get IsTemplate(): boolean;
92586
+ set IsTemplate(value: boolean);
92587
+ /**
91048
92588
  * * Field Name: FirstLast
91049
92589
  * * Display Name: First Last
91050
92590
  * * SQL Data Type: nvarchar(101)