@pitcher/js-api 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/js-api.esm.js +477 -44
  2. package/js-api.esm.js.map +1 -1
  3. package/js-api.umd.min.js +32 -11
  4. package/js-api.umd.min.js.map +1 -1
  5. package/lib/ai-tasks/__tests__/weekly-focus.spec.d.ts +1 -0
  6. package/lib/ai-tasks/weekly-focus.d.ts +241 -0
  7. package/lib/apps/browser/appTypes.d.ts +28 -0
  8. package/lib/apps/browser/stores/api.d.ts +6 -1
  9. package/lib/apps/browser/stores/app.d.ts +5 -0
  10. package/lib/apps/browser/stores/app.selectionPruneScope.test.d.ts +1 -0
  11. package/lib/apps/browser/stores/upload.d.ts +26 -1
  12. package/lib/apps/browser/stores/upload.types.d.ts +9 -0
  13. package/lib/apps/browser/util/lifecycle.d.ts +57 -0
  14. package/lib/apps/browser/util/lifecycle.test.d.ts +1 -0
  15. package/lib/apps/canvas-builder/components/ui/DynamicContent/useDynamicContent.d.ts +2 -0
  16. package/lib/apps/canvas-builder/components/ui/Multimedia/Multimedia.ldAsset.spec.d.ts +1 -0
  17. package/lib/apps/canvas-builder/composables/useCanvas.d.ts +203 -1
  18. package/lib/apps/canvas-builder/composables/useCanvas.saveEcho.spec.d.ts +1 -0
  19. package/lib/apps/canvas-builder/composables/useCanvasBlocks.d.ts +36 -0
  20. package/lib/apps/canvas-builder/composables/useCanvasExit.d.ts +1 -0
  21. package/lib/apps/canvas-builder/composables/useCanvasHistory.d.ts +36 -0
  22. package/lib/apps/canvas-builder/composables/useCanvasTheme.d.ts +20 -18
  23. package/lib/apps/canvas-builder/composables/useContentSelector.d.ts +8 -1
  24. package/lib/apps/canvas-builder/composables/useInstalledEmbeddables.d.ts +1 -1
  25. package/lib/apps/canvas-builder/composables/useNavigatorDrawer.d.ts +2 -0
  26. package/lib/apps/canvas-builder/composables/usePopupApps.d.ts +2 -0
  27. package/lib/apps/canvas-builder/types/canvas.d.ts +53 -3
  28. package/lib/apps/canvas-builder/util/canvas.util.d.ts +8 -0
  29. package/lib/apps/canvas-builder/util/completionWizard.util.d.ts +107 -0
  30. package/lib/apps/canvas-builder/util/completionWizard.util.test.d.ts +1 -0
  31. package/lib/apps/canvas-builder/util/fullscreenMode.util.d.ts +7 -0
  32. package/lib/apps/canvas-builder/util/fullscreenMode.util.test.d.ts +1 -0
  33. package/lib/apps/canvas-builder/util/lazySections.util.d.ts +35 -0
  34. package/lib/apps/canvas-builder/util/lazySections.util.test.d.ts +1 -0
  35. package/lib/apps/collection-player/composables/collection-navigation.util.d.ts +27 -0
  36. package/lib/apps/collection-player/composables/collection-navigation.util.spec.d.ts +1 -0
  37. package/lib/apps/collection-player/stores/app.store.d.ts +3 -0
  38. package/lib/apps/content-selector/components/Assets.uploaderRefresh.spec.d.ts +1 -0
  39. package/lib/apps/content-selector/stores/app.d.ts +1 -1
  40. package/lib/components/CFileViewer/pdf/CFileViewer.pdf.annotations.use.d.ts +5 -1
  41. package/lib/components/CFileViewer/pdf/CFileViewer.pdf.formFields.use.d.ts +8 -0
  42. package/lib/components/CFileViewer/pdf/CFileViewer.pdf.link.use.d.ts +1 -1
  43. package/lib/components/CFileViewer/pdf/CFileViewer.pdf.overlayItems.use.d.ts +1 -1
  44. package/lib/components/CFileViewer/pdf/CFileViewer.pdf.use.d.ts +4 -9
  45. package/lib/components/CFileViewer/pdf/CFileViewer.pdf.util.d.ts +1 -1
  46. package/lib/components/CFileViewer/pdf/CFileViewerFullscreen.pdf.use.d.ts +1 -1
  47. package/lib/components/CFileViewer/pdf/__tests__/CFileViewer.pdf.annotations.text.test.d.ts +1 -0
  48. package/lib/components/savedCanvases/CSavedCanvasesManagement.use.d.ts +1 -0
  49. package/lib/composables/useCourseOnlyApps.d.ts +1 -1
  50. package/lib/composables/usePdfInterpolation.d.ts +2 -2
  51. package/lib/composables/useWindowEvents.d.ts +1 -1
  52. package/lib/constants/cdp.const.d.ts +1 -0
  53. package/lib/constants/translationLanguages.const.d.ts +72 -0
  54. package/lib/main.lib.d.ts +2 -0
  55. package/lib/sdk/api/HighLevelApi.d.ts +26 -9
  56. package/lib/sdk/api/modules/admin/types.admin.d.ts +1 -0
  57. package/lib/sdk/api/modules/ai.d.ts +43 -1
  58. package/lib/sdk/api/modules/ai.spec.d.ts +1 -0
  59. package/lib/sdk/api/modules/canvas.d.ts +8 -0
  60. package/lib/sdk/api/modules/index.d.ts +2 -1
  61. package/lib/sdk/api/modules/stt.d.ts +65 -0
  62. package/lib/sdk/api/modules/stt.spec.d.ts +1 -0
  63. package/lib/sdk/api/modules/tts.d.ts +41 -0
  64. package/lib/sdk/api/modules/tts.spec.d.ts +1 -0
  65. package/lib/sdk/api/modules/ui/types.ui.d.ts +7 -0
  66. package/lib/sdk/interfaces.d.ts +26 -1
  67. package/lib/sdk/main.d.ts +35 -6
  68. package/lib/sdk/payload.types.d.ts +284 -0
  69. package/lib/types/ai-tasks.const.d.ts +39 -1
  70. package/lib/types/call.d.ts +14 -0
  71. package/lib/types/canvases.d.ts +0 -3
  72. package/lib/types/launchDarkly.types.d.ts +1 -3
  73. package/lib/types/organizationSettings.types.d.ts +10 -0
  74. package/lib/types/sfdc.d.ts +15 -0
  75. package/lib/util/soql.util.d.ts +36 -0
  76. package/lib/util/user.d.ts +18 -0
  77. package/lib/util/user.test.d.ts +1 -0
  78. package/package.json +1 -1
  79. package/types/openapi/index.d.ts +0 -1
  80. package/types/openapi/models/DeletedEnvironment.d.ts +0 -1
  81. package/types/openapi/models/Environment.d.ts +0 -1
  82. package/types/openapi/models/EnvironmentRequest.d.ts +0 -1
  83. package/types/openapi/models/File.d.ts +2 -0
  84. package/types/openapi/models/FileRetrieve.d.ts +2 -0
  85. package/types/openapi/models/PatchedEnvironmentRequest.d.ts +0 -1
  86. package/types/openapi/models/PatchedUserRequest.d.ts +1 -2
  87. package/types/openapi/models/User.d.ts +1 -2
  88. package/types/openapi/models/UserRequest.d.ts +1 -2
  89. package/lib/sdk/api/modules/languages.d.ts +0 -8
  90. package/types/openapi/models/LanguageEnum.d.ts +0 -12
package/lib/sdk/main.d.ts CHANGED
@@ -195,9 +195,11 @@ export declare function useApi(options?: ApiOptions): {
195
195
  broadcastToWebviews: (event: import('./interfaces').PitcherEvent) => Promise<any>;
196
196
  subscribe: () => Promise<any>;
197
197
  unsubscribe: () => Promise<any>;
198
+ postJsonWithTimeout<T>(url: string, body: unknown, accessToken: string, timeoutMs: number, label: string): Promise<T>;
198
199
  aiGetCapabilities(): Promise<import('./payload.types').AIRuntimeCapabilities>;
199
200
  aiComplete(payload: import('./payload.types').AICompletePayload): Promise<import('./payload.types').AICompleteResult>;
200
201
  piaSearchAnswer(payload: import('./payload.types').PiaSearchAnswerPayload): Promise<import('./payload.types').PiaSearchAnswerResult>;
202
+ weeklyFocusRank(payload: import('./payload.types').WeeklyFocusRankPayload): Promise<import('./payload.types').WeeklyFocusRankResult>;
201
203
  appsDbGetEntries(payload: import('./payload.types').AppsDbGetEntriesPayload): Promise<import('./payload.types').AppsDbEntriesResult>;
202
204
  appsDbUpsertEntry(payload: import('./payload.types').AppsDbUpsertEntryPayload): Promise<import('./payload.types').AppsDbEntry>;
203
205
  appsDbDeleteEntry(payload: import('./payload.types').AppsDbDeleteEntryPayload): Promise<void>;
@@ -206,10 +208,9 @@ export declare function useApi(options?: ApiOptions): {
206
208
  openExternalUrl(payload: import('./payload.types').OpenExternalUrlRequestPayload): Promise<void>;
207
209
  getEnv(): Promise<import('./interfaces').PitcherEnv>;
208
210
  updateMyUser(payload: {
209
- language?: import('../main.lib').LanguageEnum | undefined;
211
+ language?: string | undefined;
210
212
  }): Promise<import('../main.lib').User>;
211
213
  isOffline(): Promise<boolean>;
212
- getLanguages(): Promise<import('./api/modules').Language[]>;
213
214
  getCanvases(payload: import('../main.lib').GetCanvasesParams & {
214
215
  filters?: Record<string, any>;
215
216
  fields?: string;
@@ -222,6 +223,7 @@ export declare function useApi(options?: ApiOptions): {
222
223
  id: import('../main.lib').CanvasRetrieve["id"];
223
224
  instance_id?: import('../main.lib').Instance["id"];
224
225
  fields?: string;
226
+ lazy_sections?: boolean;
225
227
  }): Promise<import('../main.lib').CanvasRetrieve>;
226
228
  updateCanvasIndicators(payload: {
227
229
  indicators: Record<string, import('../main.lib').CanvasIndicator>;
@@ -373,6 +375,14 @@ export declare function useApi(options?: ApiOptions): {
373
375
  canvas_id: import('../main.lib').CanvasRetrieve["id"];
374
376
  theme_id: import('../main.lib').CanvasThemeRetrieve["id"];
375
377
  }>;
378
+ sttStart(payload: import('./payload.types').SttStartPayload): Promise<void>;
379
+ sttAvailability(): Promise<import('./payload.types').SttAvailabilityResult>;
380
+ sttWarmup(): Promise<void>;
381
+ sttStop(payload: import('./payload.types').SttStopPayload): Promise<import('./payload.types').SttStopResult>;
382
+ sttErrorCode(error: unknown): import('./payload.types').SttErrorCode | undefined;
383
+ ttsSpeak(payload: import('./payload.types').TtsSpeakPayload): Promise<import('./payload.types').TtsSpeakResult>;
384
+ ttsStop(): Promise<void>;
385
+ ttsErrorCode(error: unknown): import('./payload.types').TtsErrorCode | undefined;
376
386
  API: import('./api/LowLevelApi').LowLevelApi;
377
387
  } | {
378
388
  getUsers(payload?: import('../main.lib').GetUsersParams): Promise<import('../main.lib').PaginatedData<import('../main.lib').User>>;
@@ -492,9 +502,11 @@ export declare function useApi(options?: ApiOptions): {
492
502
  broadcastToWebviews: (event: import('./interfaces').PitcherEvent) => Promise<any>;
493
503
  subscribe: () => Promise<any>;
494
504
  unsubscribe: () => Promise<any>;
505
+ postJsonWithTimeout<T>(url: string, body: unknown, accessToken: string, timeoutMs: number, label: string): Promise<T>;
495
506
  aiGetCapabilities(): Promise<import('./payload.types').AIRuntimeCapabilities>;
496
507
  aiComplete(payload: import('./payload.types').AICompletePayload): Promise<import('./payload.types').AICompleteResult>;
497
508
  piaSearchAnswer(payload: import('./payload.types').PiaSearchAnswerPayload): Promise<import('./payload.types').PiaSearchAnswerResult>;
509
+ weeklyFocusRank(payload: import('./payload.types').WeeklyFocusRankPayload): Promise<import('./payload.types').WeeklyFocusRankResult>;
498
510
  appsDbGetEntries(payload: import('./payload.types').AppsDbGetEntriesPayload): Promise<import('./payload.types').AppsDbEntriesResult>;
499
511
  appsDbUpsertEntry(payload: import('./payload.types').AppsDbUpsertEntryPayload): Promise<import('./payload.types').AppsDbEntry>;
500
512
  appsDbDeleteEntry(payload: import('./payload.types').AppsDbDeleteEntryPayload): Promise<void>;
@@ -503,10 +515,9 @@ export declare function useApi(options?: ApiOptions): {
503
515
  openExternalUrl(payload: import('./payload.types').OpenExternalUrlRequestPayload): Promise<void>;
504
516
  getEnv(): Promise<import('./interfaces').PitcherEnv>;
505
517
  updateMyUser(payload: {
506
- language?: import('../main.lib').LanguageEnum | undefined;
518
+ language?: string | undefined;
507
519
  }): Promise<import('../main.lib').User>;
508
520
  isOffline(): Promise<boolean>;
509
- getLanguages(): Promise<import('./api/modules').Language[]>;
510
521
  getCanvases(payload: import('../main.lib').GetCanvasesParams & {
511
522
  filters?: Record<string, any>;
512
523
  fields?: string;
@@ -519,6 +530,7 @@ export declare function useApi(options?: ApiOptions): {
519
530
  id: import('../main.lib').CanvasRetrieve["id"];
520
531
  instance_id?: import('../main.lib').Instance["id"];
521
532
  fields?: string;
533
+ lazy_sections?: boolean;
522
534
  }): Promise<import('../main.lib').CanvasRetrieve>;
523
535
  updateCanvasIndicators(payload: {
524
536
  indicators: Record<string, import('../main.lib').CanvasIndicator>;
@@ -670,6 +682,14 @@ export declare function useApi(options?: ApiOptions): {
670
682
  canvas_id: import('../main.lib').CanvasRetrieve["id"];
671
683
  theme_id: import('../main.lib').CanvasThemeRetrieve["id"];
672
684
  }>;
685
+ sttStart(payload: import('./payload.types').SttStartPayload): Promise<void>;
686
+ sttAvailability(): Promise<import('./payload.types').SttAvailabilityResult>;
687
+ sttWarmup(): Promise<void>;
688
+ sttStop(payload: import('./payload.types').SttStopPayload): Promise<import('./payload.types').SttStopResult>;
689
+ sttErrorCode(error: unknown): import('./payload.types').SttErrorCode | undefined;
690
+ ttsSpeak(payload: import('./payload.types').TtsSpeakPayload): Promise<import('./payload.types').TtsSpeakResult>;
691
+ ttsStop(): Promise<void>;
692
+ ttsErrorCode(error: unknown): import('./payload.types').TtsErrorCode | undefined;
673
693
  API: import('./api/LowLevelApi').LowLevelApi;
674
694
  };
675
695
  openSharingSettings(payload: import('./api/modules/ui/types.ui').UiOpenSharingSettingsRequest): Promise<import('./api/modules/ui/types.ui').UiOpenSharingSettingsResponse>;
@@ -735,9 +755,11 @@ export declare function useApi(options?: ApiOptions): {
735
755
  broadcastToWebviews: (event: import('./interfaces').PitcherEvent) => Promise<any>;
736
756
  subscribe: () => Promise<any>;
737
757
  unsubscribe: () => Promise<any>;
758
+ postJsonWithTimeout<T>(url: string, body: unknown, accessToken: string, timeoutMs: number, label: string): Promise<T>;
738
759
  aiGetCapabilities(): Promise<import('./payload.types').AIRuntimeCapabilities>;
739
760
  aiComplete(payload: import('./payload.types').AICompletePayload): Promise<import('./payload.types').AICompleteResult>;
740
761
  piaSearchAnswer(payload: import('./payload.types').PiaSearchAnswerPayload): Promise<import('./payload.types').PiaSearchAnswerResult>;
762
+ weeklyFocusRank(payload: import('./payload.types').WeeklyFocusRankPayload): Promise<import('./payload.types').WeeklyFocusRankResult>;
741
763
  appsDbGetEntries(payload: import('./payload.types').AppsDbGetEntriesPayload): Promise<import('./payload.types').AppsDbEntriesResult>;
742
764
  appsDbUpsertEntry(payload: import('./payload.types').AppsDbUpsertEntryPayload): Promise<import('./payload.types').AppsDbEntry>;
743
765
  appsDbDeleteEntry(payload: import('./payload.types').AppsDbDeleteEntryPayload): Promise<void>;
@@ -745,10 +767,9 @@ export declare function useApi(options?: ApiOptions): {
745
767
  openExternalUrl(payload: import('./payload.types').OpenExternalUrlRequestPayload): Promise<void>;
746
768
  getEnv(): Promise<import('./interfaces').PitcherEnv>;
747
769
  updateMyUser(payload: {
748
- language?: import('../main.lib').LanguageEnum | undefined;
770
+ language?: string | undefined;
749
771
  }): Promise<import('../main.lib').User>;
750
772
  isOffline(): Promise<boolean>;
751
- getLanguages(): Promise<import('./api/modules').Language[]>;
752
773
  getCanvases(payload: import('../main.lib').GetCanvasesParams & {
753
774
  filters?: Record<string, any>;
754
775
  fields?: string;
@@ -903,6 +924,14 @@ export declare function useApi(options?: ApiOptions): {
903
924
  canvas_id: import('../main.lib').CanvasRetrieve["id"];
904
925
  theme_id: import('../main.lib').CanvasThemeRetrieve["id"];
905
926
  }>;
927
+ sttStart(payload: import('./payload.types').SttStartPayload): Promise<void>;
928
+ sttAvailability(): Promise<import('./payload.types').SttAvailabilityResult>;
929
+ sttWarmup(): Promise<void>;
930
+ sttStop(payload: import('./payload.types').SttStopPayload): Promise<import('./payload.types').SttStopResult>;
931
+ sttErrorCode(error: unknown): import('./payload.types').SttErrorCode | undefined;
932
+ ttsSpeak(payload: import('./payload.types').TtsSpeakPayload): Promise<import('./payload.types').TtsSpeakResult>;
933
+ ttsStop(): Promise<void>;
934
+ ttsErrorCode(error: unknown): import('./payload.types').TtsErrorCode | undefined;
906
935
  API: import('./api/LowLevelApi').LowLevelApi;
907
936
  } | {
908
937
  broadcast: (event: import('./interfaces').PitcherEvent) => Promise<any>;
@@ -563,6 +563,22 @@ export interface PiaSearchAnswerPayload {
563
563
  * Optional narrowing of the online route's candidate pool to these file ids.
564
564
  */
565
565
  file_ids?: string[];
566
+ /**
567
+ * Opt in to server-side document grounding: the online route fetches the
568
+ * transcripts of `file_ids` and adds query-relevant verbatim passages to the
569
+ * prompt. Requires `file_ids`; ignored without them.
570
+ *
571
+ * Explicit rather than inferred from `file_ids` so that a caller which
572
+ * already narrows by ids keeps its exact prompt. Online path only — the
573
+ * on-device token budget cannot absorb document excerpts.
574
+ */
575
+ include_document_text?: boolean;
576
+ /**
577
+ * Client-derived synonym terms for the query. Used only to choose WHICH
578
+ * passages of `file_ids` are excerpted — they can never add a file, and the
579
+ * server re-validates them. Ignored unless `include_document_text` is set.
580
+ */
581
+ expansion_terms?: string[];
566
582
  /**
567
583
  * Token budget for the on-device completion.
568
584
  */
@@ -662,3 +678,271 @@ export interface PiaSearchAnswerResult {
662
678
  */
663
679
  source: 'on_device' | 'online';
664
680
  }
681
+ /**
682
+ * Error codes returned on a rejected `stt.start` / `stt.stop` — cross-platform
683
+ * (iOS bridge AND the web host engines). Surfaced verbatim in the rejected
684
+ * request's error body (iOS: `error_code`/`errorCode`; web: the error `message` /
685
+ * `reason` string — read them uniformly via `api.sttErrorCode`).
686
+ *
687
+ * - `STT_DISABLED` — the `enable_stt_dictation` config flag is off for this instance.
688
+ * - `STT_DEVICE_UNSUPPORTED` — the device can't run the on-device model.
689
+ * - `STT_MODEL_NOT_READY` — the whisper model isn't downloaded yet. Trigger a
690
+ * model download (`ai.download_model` with `"whisper"`), then retry `stt.start`.
691
+ * - `STT_BUSY` — the mic is held by another session (a live call recording, or
692
+ * another dictation). Surface a "mic in use" hint / prompt to stop the other session.
693
+ * - `STT_MIC_PERMISSION_DENIED` — microphone permission was denied.
694
+ * - `STT_NOT_RECORDING` — `stt.stop` for a `session_id` that isn't active.
695
+ * - `STT_CAPTURE_FAILED` / `STT_ERROR` — generic capture / other failure.
696
+ */
697
+ export type SttErrorCode = 'STT_DISABLED' | 'STT_DEVICE_UNSUPPORTED' | 'STT_MODEL_NOT_READY' | 'STT_BUSY' | 'STT_MIC_PERMISSION_DENIED' | 'STT_NOT_RECORDING' | 'STT_CAPTURE_FAILED' | 'STT_ERROR';
698
+ /**
699
+ * Payload for `stt.start` — cross-platform (identical shape on iOS and web).
700
+ * Keys are already snake_case, so `LowLevelApi`'s `snakeCaseKeys` transform is a
701
+ * no-op (no `RAW_PAYLOAD_METHODS` entry needed; the `vocabulary` string values
702
+ * are left untouched by the key-only transform).
703
+ */
704
+ export interface SttStartPayload {
705
+ /**
706
+ * Caller-chosen session id. All `stt.partial` / `stt.interrupted` events and
707
+ * the matching `stt.stop` are keyed by it. Re-starting with the same id
708
+ * replaces that session.
709
+ */
710
+ session_id: string;
711
+ /**
712
+ * ISO 639-1 code (e.g. `"en"`) to force a language. Omit/`null` for
713
+ * auto-detect (the default, like native iOS dictation).
714
+ */
715
+ language?: string | null;
716
+ /**
717
+ * Proper nouns likely to be spoken (the current call's CRM contact / account
718
+ * / product names). Biases recognition toward correct spelling (e.g.
719
+ * "Dr. Sarah O'Brien" instead of "Dr. Starwhop Brine"). Send the relevant
720
+ * names, not the whole CRM — it's length-capped on the native side.
721
+ */
722
+ vocabulary?: string[];
723
+ }
724
+ /**
725
+ * Payload for `stt.stop` — cross-platform.
726
+ */
727
+ export interface SttStopPayload {
728
+ /**
729
+ * The `session_id` passed to the matching `stt.start`.
730
+ */
731
+ session_id: string;
732
+ }
733
+ /**
734
+ * Result of `stt.stop` — cross-platform.
735
+ */
736
+ export interface SttStopResult {
737
+ /**
738
+ * The final, full transcript for the session.
739
+ */
740
+ transcript: string;
741
+ }
742
+ /**
743
+ * Body of the `stt.partial` event (host → JS; native bridge on iOS, the Impact
744
+ * host engine on web). Fires roughly every ~2s while recording.
745
+ */
746
+ export interface SttPartialEvent {
747
+ /**
748
+ * Session the partial belongs to.
749
+ */
750
+ session_id: string;
751
+ /**
752
+ * The FULL transcript so far — NOT a delta. Replace the field's dictation
753
+ * content with it, don't append.
754
+ */
755
+ text: string;
756
+ /**
757
+ * Per-session monotonic counter (only advances when `text` changes) for
758
+ * ordering / de-dupe.
759
+ */
760
+ index: number;
761
+ }
762
+ /**
763
+ * Body of the `stt.interrupted` event (host → JS; native bridge on iOS, the
764
+ * Impact host engine on web). Fires only when a session ends WITHOUT a
765
+ * `stt.stop` — a normal `stt.stop` does NOT fire this.
766
+ */
767
+ export interface SttInterruptedEvent {
768
+ /**
769
+ * Session that was interrupted.
770
+ */
771
+ session_id: string;
772
+ /**
773
+ * Why the session ended — an opaque, host-specific string; don't parse it,
774
+ * just stop waiting for partials and reset the field. Known values:
775
+ * - iOS: `"preempted"` — a higher-priority call recording took the mic.
776
+ * - web: `"error:capture_ended"` (mic/track ended), `"error:<code>"` (a fatal
777
+ * Web Speech recognition error, e.g. `"error:network"`), `"error:restart_failed"`.
778
+ */
779
+ reason: string;
780
+ }
781
+ /**
782
+ * Which engine answers `stt.start` on the current platform: `"native"` (iOS
783
+ * on-device Speech), `"whisper"` (web on-device Whisper) or `"webspeech"` (web
784
+ * cloud fallback, audio leaves the device).
785
+ */
786
+ export type SttEngineKind = 'native' | 'whisper' | 'webspeech';
787
+ /**
788
+ * Why dictation is unavailable: `"disabled"` (the `enable_stt_dictation`
789
+ * instance flag is off) or `"unsupported"` (no engine can run on this device).
790
+ */
791
+ export type SttUnavailableReason = 'disabled' | 'unsupported';
792
+ /**
793
+ * Result of `stt.availability` — a side-effect-free capability check an app
794
+ * should call BEFORE offering a mic button. It does NOT prompt for the
795
+ * microphone or download any model; it only reports whether dictation could be
796
+ * started, so the UI can hide/disable the control up front.
797
+ */
798
+ export interface SttAvailabilityResult {
799
+ /**
800
+ * Dictation can be started right now — the feature is enabled AND an engine
801
+ * can run on this device.
802
+ */
803
+ available: boolean;
804
+ /**
805
+ * The engine that would answer `stt.start`, or `null` when unavailable. Note
806
+ * `"webspeech"` sends audio off-device, so a UI may want to reflect that.
807
+ */
808
+ engine: SttEngineKind | null;
809
+ /**
810
+ * Present when `available` is `false`: `"disabled"` (feature flag off) or
811
+ * `"unsupported"` (no engine on this device / browser).
812
+ */
813
+ reason?: SttUnavailableReason;
814
+ }
815
+ /**
816
+ * Error codes returned on `tts.speak` — as a bridge APIError
817
+ * (`{ code, message, details }`) on iOS, or in the host `{ reason }` on web.
818
+ *
819
+ * - `TTS_EMPTY_TEXT` — no text was provided.
820
+ * - `TTS_VOICE_UNAVAILABLE` — a `language` was requested but no installed voice
821
+ * matches. The message tells the user to download it (iOS Settings ›
822
+ * Accessibility › Spoken Content › Voices) — surface it so the UI can prompt.
823
+ * - `TTS_ERROR` — unexpected fallback.
824
+ */
825
+ export type TtsErrorCode = 'TTS_EMPTY_TEXT' | 'TTS_VOICE_UNAVAILABLE' | 'TTS_ERROR';
826
+ /**
827
+ * Payload for `tts.speak`. The exact native wire contract — keys are single
828
+ * words, so LowLevelApi's `snakeCaseKeys` transform is a no-op; no
829
+ * `RAW_PAYLOAD_METHODS` entry is needed.
830
+ */
831
+ export interface TtsSpeakPayload {
832
+ /**
833
+ * The text to speak. Empty/whitespace rejects with `TTS_EMPTY_TEXT`.
834
+ */
835
+ text: string;
836
+ /**
837
+ * BCP-47/ISO language tag (e.g. `"en-US"`). If given, an installed offline
838
+ * voice is required, else the call rejects with `TTS_VOICE_UNAVAILABLE`. Omit
839
+ * to use the system voice.
840
+ */
841
+ language?: string;
842
+ /**
843
+ * Speech rate; clamped to the platform min…max.
844
+ */
845
+ rate?: number;
846
+ /**
847
+ * Speech pitch; clamped `0.5`…`2.0` (`1.0` = normal).
848
+ */
849
+ pitch?: number;
850
+ }
851
+ /**
852
+ * Result of `tts.speak`. The promise resolves when the utterance FINISHES.
853
+ */
854
+ export interface TtsSpeakResult {
855
+ /**
856
+ * `true` → finished speaking naturally; `false` → it was stopped (`tts.stop`)
857
+ * or replaced by a newer `tts.speak` (only one utterance is active at a time).
858
+ */
859
+ completed: boolean;
860
+ }
861
+ /**
862
+ * Payload for `weeklyFocusRank` — one high-level call that ranks the rep's
863
+ * next-7-days meetings, routed on-device (iOS Gemma) or online (next-core
864
+ * Bedrock route). Calendar fetching stays caller-side: the caller owns the
865
+ * meeting list and passes it in.
866
+ */
867
+ export interface WeeklyFocusRankPayload {
868
+ /**
869
+ * The rep's meetings. Windowed to today + 6 days by the SDK/route — send the
870
+ * whole calendar if that is what you have.
871
+ */
872
+ meetings: WeeklyFocusRankMeeting[];
873
+ /**
874
+ * One CRM context bundle per UNIQUE account, keyed by `account_id` (open
875
+ * tasks, opportunity state, recent calls — whatever the admin mapped).
876
+ */
877
+ context?: Record<string, WeeklyFocusRankAccountContext>;
878
+ /**
879
+ * Instance to rank in. Defaults to the env's active instance.
880
+ */
881
+ instance_id?: string;
882
+ /**
883
+ * IANA zone the 7-day window is measured in. Defaults to the device's zone,
884
+ * which is the rep's zone on-device; ALWAYS sent to the online route, whose
885
+ * server clock is UTC.
886
+ */
887
+ time_zone?: string;
888
+ /**
889
+ * How many meetings to pick (1-8, default 5).
890
+ */
891
+ max_picks?: number;
892
+ /**
893
+ * Keep at most one pick per account. Default true.
894
+ */
895
+ one_per_account?: boolean;
896
+ }
897
+ export interface WeeklyFocusRankMeeting {
898
+ event_id: string;
899
+ account_id: string;
900
+ account_name: string;
901
+ meeting_subject: string;
902
+ /** ISO datetime, or a date-only 'YYYY-MM-DD'. */
903
+ meeting_time: string;
904
+ attendee_count?: number;
905
+ }
906
+ export interface WeeklyFocusRankAccountContext {
907
+ sections: Array<{
908
+ label: string;
909
+ items: Array<{
910
+ title: string;
911
+ fields?: Array<{
912
+ label: string;
913
+ value: string;
914
+ }>;
915
+ days_ago?: number | null;
916
+ }>;
917
+ fields_curated?: boolean;
918
+ }>;
919
+ }
920
+ /** One ranked pick, resolved back to a real meeting id. */
921
+ export interface WeeklyFocusRankPick {
922
+ event_id: string;
923
+ /** 1 = highest priority; unique and contiguous from 1. */
924
+ rank: number;
925
+ reason: string;
926
+ }
927
+ /**
928
+ * Unified `weeklyFocusRank` result across both serving paths.
929
+ */
930
+ export interface WeeklyFocusRankResult {
931
+ /**
932
+ * One or two sentences summarising the week. Empty when the week is empty.
933
+ */
934
+ hero: string;
935
+ /**
936
+ * The picked meetings, highest priority first.
937
+ */
938
+ top: WeeklyFocusRankPick[];
939
+ /**
940
+ * Meetings in the 7-day window that were NOT picked — including those the
941
+ * ranking never saw. The surface renders this as "+N more this week".
942
+ */
943
+ collapsed_count: number;
944
+ /**
945
+ * Which runtime produced the ranking.
946
+ */
947
+ source: 'on_device' | 'online';
948
+ }
@@ -28,6 +28,19 @@
28
28
  * engine — its context comes from the caller / iOS SmartStore — so it is
29
29
  * offline/Gemma-capable (`backends: ['bedrock', 'gemma']`).
30
30
  *
31
+ * `weekly_focus` (PIT-7257) is another NEW task added alongside the locked four
32
+ * (NOT a rename/removal). It ranks the rep's next-7-days meetings by how much
33
+ * they need preparation, using each account's CRM context. Unlike every other
34
+ * task it is a PORT of a shipped implementation: it has been running on-device
35
+ * (Gemma `ai.complete`) inside the pre-call-brief app since PIT-6305, so
36
+ * `backends: ['bedrock', 'gemma']` is validated in practice rather than aspired
37
+ * to. `requires` is empty for the same reason as `pia_search`: the meeting list
38
+ * and per-account context are request-envelope fields, not AITaskRequirement
39
+ * vocabulary. Its prompt/window/parser are implemented twice — in
40
+ * `src/lib/ai-tasks/weekly-focus.ts` (SDK + app) and in next-core's
41
+ * `prompts/weekly-focus.ts` (Bedrock route) — kept behaviourally in lockstep by
42
+ * each side's tests, since next-core imports canvas-ui types only (ADR-002).
43
+ *
31
44
  * `pia_search` (PIT-6863) is another NEW task added alongside the locked four
32
45
  * (NOT a rename/removal). It answers a rep's natural-language question over the
33
46
  * instance's content + metadata (Postgres/Django candidates + aiAnalysis
@@ -37,9 +50,34 @@
37
50
  * ['bedrock', 'gemma']`. `requires` is empty: its inputs (query + instance) are
38
51
  * request-envelope fields, not AITaskRequirement vocabulary, and candidate
39
52
  * retrieval happens server-side.
53
+ *
54
+ * `content_metadata` (cluster F / R137) is another NEW task added alongside the
55
+ * locked four (NOT a rename/removal). It proposes metadata field values and tags
56
+ * for ONE content file, constrained to the instance's own metadata template —
57
+ * Django validates `File.metadata` writes against that template, so select
58
+ * fields must stay inside the template's allowed option values. `backends:
59
+ * ['bedrock']` only: it is an admin-context bulk operation, with no on-device
60
+ * (Gemma) serving. `requires` is empty for the same reason as `pia_search`: the
61
+ * file facts and template fields are request-envelope inputs, not
62
+ * AITaskRequirement vocabulary.
63
+ *
64
+ * `translate` (Gartner R128 / cluster G) is another NEW task added alongside the
65
+ * locked four (NOT a rename/removal). It translates keyed prose segments of a
66
+ * canvas template into ONE target language — N segments in, N translations out,
67
+ * keyed, with per-segment error isolation: a segment whose translation loses a
68
+ * Handlebars placeholder or an HTML tag keeps its source text and is reported,
69
+ * rather than failing the whole template. It is the FIRST task whose output must
70
+ * line up 1:1 with its input, and because JSON Schema cannot express that, the
71
+ * parity guarantee lives in next-core code (`reconcileTranslations`, called
72
+ * route-side after the model call) and not in the output schema. `backends:
73
+ * ['bedrock']` only: it is an admin-context content-governance operation with no
74
+ * on-device (Gemma) serving, and binary documents take the DeepL document path
75
+ * instead, which is not an AITask. `requires` is empty for the same reason as
76
+ * `pia_search`: the segments and the target language are request-envelope inputs,
77
+ * not AITaskRequirement vocabulary.
40
78
  */
41
79
  /** Locked cross-backend task ids. AITask id === the wire-contract string. */
42
- export type AITask = 'meeting_prep' | 'discussion_points' | 'pitch_deck' | 'post_call_summary' | 'account_insights' | 'precall_notes' | 'pia_search';
80
+ export type AITask = 'meeting_prep' | 'discussion_points' | 'pitch_deck' | 'post_call_summary' | 'account_insights' | 'precall_notes' | 'pia_search' | 'weekly_focus' | 'content_metadata' | 'translate';
43
81
  /**
44
82
  * Vocabulary of declarative input requirements a task can depend on. A task's
45
83
  * `requires` list is server-enforced in next-core (missing → 400
@@ -54,5 +54,19 @@ export interface Call {
54
54
  presentationHistory?: CallPresentationHistory;
55
55
  presentationHistoryMetadata?: CallPresentationHistoryMetadata;
56
56
  recentAccounts?: SfAccount[];
57
+ /**
58
+ * Context accounts beyond the primary.
59
+ *
60
+ * The React meeting bar's "Set context" overlay is **single-select** — it writes exactly one
61
+ * account — so it no longer produces entries here; the field is kept because other flows (CRM
62
+ * Hub launches, passthrough, cross-account attendees) and calls persisted by older bundles can
63
+ * still carry them. `selectedAccount` stays the primary and remains the only account the
64
+ * single-account consumers see (the meeting-notes recording bridge, recents, and the deck
65
+ * scope), so this is purely additive — nothing existing reads it.
66
+ *
67
+ * Optional because `Call` is persisted in localStorage: a call object written by an older
68
+ * bundle has no such key.
69
+ */
70
+ additionalAccounts?: SfAccountMini[];
57
71
  }
58
72
  export declare const INITIAL_CALL_STATE: Call;
@@ -1,4 +1,3 @@
1
- import { CanvasRetrieve, User } from '../../types/openapi';
2
1
  export interface GetCanvasesParams {
3
2
  search?: string;
4
3
  account__id?: string;
@@ -19,11 +18,9 @@ export interface GetCanvasesParams {
19
18
  template__id?: string;
20
19
  }
21
20
  export interface CanvasMetadataRetrieve {
22
- canvas_id: CanvasRetrieve['id'];
23
21
  config: Record<string, any> & {
24
22
  presentation_component_metadata: Record<string, any>;
25
23
  };
26
- owner_id: User['id'];
27
24
  }
28
25
  export declare enum CanvasesViewsTypes {
29
26
  SAVED = "saved",
@@ -1,4 +1,4 @@
1
- export type LaunchDarklyBooleanFlagKey = 'ai_image_generation_model' | 'ai_video_generation_model' | 'allow_ai_prompts_in_canvas_text' | 'allow_bulk_actions_canvases_files' | 'allow_content_grid_autofill' | 'allow_canvas_duplication' | 'allow_canvases_tables_columns_settings' | 'allow_table_column_resizing' | 'allow_creating_canvas_with_no_template' | 'allow_dynamic_data_table_for_scribble_component' | 'allow_html_for_scribble_component' | 'allow_embeddable_for_scribble_component' | 'allow_embeddable_hiding' | 'allow_multimedia_for_scribble_component' | 'allow_note_taking' | 'allow_rep_canvas_metadata_edit' | 'allow_rep_file_distributions' | 'allow_rep_file_rating' | 'allow_rep_file_upload' | 'allow_saving_annotations_in_personal_layer' | 'allow_user_to_edit_font_size_and_color_in_canvas_tokens' | 'are_sections_system_controlled' | 'enable_canvas_core_distributions' | 'copy_context_to_canvas' | 'copy_template_metadata_to_canvas' | 'disable_canvas_edit_for_reps' | 'disable_custom_tooltips' | 'disable_file_edit_content' | 'enable_inline_wopi_edit_button' | 'disable_fullscreen_canvas_builder' | 'disable_impact_web_browser_fullscreen' | 'disable_user_invitations' | 'display_section_list_name' | 'disable_download_canvas' | 'enable_ai_generated_thumbnails' | 'enable_analytics' | 'enable_app_developer_role' | 'enable_algolia_search' | 'enable_background_image_theme_options' | 'enable_better_canvas_builder_control_bars_on_zoom' | 'enable_bulk_update_file_attributes' | 'enable_canvas_as_home' | 'enable_canvas_blocks' | 'enable_canvas_node_debugging' | 'enable_canvas_freeze' | 'enable_canvas_locks' | 'enable_canvas_template_edit_in_impact' | 'enable_canvas_tokens' | 'enable_collaborations' | 'enable_collection_player_data_accessor' | 'enable_content_grid_data_accessor' | 'enable_content_type_change_in_content_selector' | 'enable_cross_tab_instance_reload_for_ld_sync' | 'enable_create_section_from_section_template' | 'enable_custom_display_overrides' | 'enable_default_crm_shape' | 'enable_detailed_date_format' | 'enable_dsr_readonly_annotations' | 'enable_dnd_html_editor' | 'enable_dynamic_content_component' | 'enable_dynamic_data_table_component' | 'enable_custom_data_tables' | 'enable_embedded_video_autoplay' | 'enable_embedded_video' | 'enable_enhanced_canvas_drawer_app' | 'enable_enhanced_indicators' | 'enable_enhanced_section_execution_states' | 'enable_experimental_canvas_builder_dnd' | 'enable_extra_file_data' | 'enable_file_copy' | 'enable_file_pages_metadata' | 'enable_file_revisions' | 'enable_file_divisible_permission' | 'enable_folder_details_edit' | 'enable_folder_distributions' | 'enable_handlebar_template_support' | 'enable_height_in_component_theming' | 'enable_home_customization' | 'enable_hotspot_visibility' | 'enable_improved_canvas_node_updating' | 'enable_individual_users_in_file_distribution' | 'enable_inline_filter_options' | 'enable_insearch_in_section_selector' | 'enable_instance_cloner' | 'enable_advanced_cloner' | 'enable_content_promotion' | 'enable_instance_editor_role' | 'enable_instance_navigation_from_management' | 'enable_knock_notifications' | 'enable_maintain_section_theme_control' | 'enable_metadata_in_file_uploads_with_default_values' | 'enable_more_intuitive_component_spacing' | 'enable_multi_destination_upload' | 'enable_multimedia_component_ai_images' | 'enable_new_meeting_bar' | 'enable_provider_agnostic_meeting_bar' | 'enable_original_pdf_link' | 'enable_scale_content' | 'enable_sorting_in_tiptap_table' | 'enable_theme_assets' | 'enable_toc_enhancements_to_support_same_section_in_section_list' | 'enable_pia_assistant' | 'enable_pipe_character_multi_search' | 'enable_popup_apps' | 'enable_pre_send_validation' | 'enable_reorder_search' | 'enable_reorder_scribble_isolation' | 'enable_reorder_component_options_menu' | 'enable_resizable_multimedia_component' | 'enable_responsive_scribble_component' | 'enable_saved_canvases_filters' | 'enable_short_tag_column_in_tables' | 'enable_scribble_component' | 'enable_scribble_content_as_background' | 'enable_search_and_filters_in_multimedia_component' | 'enable_section_context_in_dsr' | 'enable_selectors_dnd' | 'enable_section_selector_edit_section' | 'enable_smart_folders' | 'enable_smart_folders_for_sections' | 'enable_smart_folders_in_section_selector' | 'enable_smart_folders_in_files' | 'enable_sorting_in_sections' | 'enable_suggested_tags' | 'enable_template_component_permissions' | 'enable_template_folders' | 'enable_theme_options_border_radius' | 'enable_themes' | 'hide_asset_uploader' | 'hide_user_feedback_widget' | 'include_files_content_in_print' | 'interpolate_rep_canvases_on_edit_mode' | 'is_timeline_component_allowed' | 'launch_in_full_screen_on_present_mode' | 'prefer_online_handlers' | 'restrict_owned_files_from_admins' | 'show_asset_manager_for_multimedia' | 'show_clear_all_annotations_button' | 'show_content_selector_list_view' | 'show_metadata_filters_in_all_canvas_things' | 'show_only_preview_mode_for_html_component' | 'show_popularity_icons' | 'use_core_endpoint_for_analytics' | 'convert_pptx_to_section_with_scribble_pdfjs' | 'use_short_url_for_shared_link' | 'use_zoho_instead_of_ms_wopi' | 'enable_new_section_list' | 'enable_sharebox_apps' | 'enable_sharebox_bulk_filtering' | 'enable_back_to_previous_location_in_canvas' | 'enable_crm_shape_for_external_links' | 'enable_adaptive_popup_apps' | 'enable_file_version_polling' | 'skip_pspdfkit_wait_for_high_res_thumbs' | 'enable_reactive_scribble_component_toolbar' | 'enable_embeddable_full_screen_mode' | 'enable_enhanced_user_management' | 'enable_impersonation' | 'enable_instance_admin_user_assignment' | 'keep_static_pptx_editable' | 'enable_canvas_pdf_dimensions' | 'enable_editable_pptx_of_canvas' | 'enable_editable_pptx_of_canvas_with_fonts' | 'enable_aspose_pptx_of_canvas' | 'enable_canvas_control_bars_collapse' | 'enable_rep_app_visibility_order' | 'enable_file_sharing_print_permissions' | 'enable_section_sharing_print_permissions' | 'enable_marketplace_tab' | 'enable_sfdc_account_visibility_for_canvases' | 'sfdc_offline_enabled' | 'enable_granular_permissions' | 'enable_hub_collections' | 'enable_hub_recommended_smart_folder' | 'enable_custom_user_properties';
1
+ export type LaunchDarklyBooleanFlagKey = 'allow_ai_prompts_in_canvas_text' | 'allow_bulk_actions_canvases_files' | 'allow_content_grid_autofill' | 'allow_canvas_duplication' | 'allow_canvases_tables_columns_settings' | 'allow_table_column_resizing' | 'allow_creating_canvas_with_no_template' | 'allow_dynamic_data_table_for_scribble_component' | 'allow_html_for_scribble_component' | 'allow_embeddable_for_scribble_component' | 'allow_embeddable_hiding' | 'allow_multimedia_for_scribble_component' | 'allow_note_taking' | 'allow_rep_canvas_metadata_edit' | 'allow_rep_file_distributions' | 'allow_rep_file_rating' | 'allow_rep_file_upload' | 'allow_saving_annotations_in_personal_layer' | 'allow_user_to_edit_font_size_and_color_in_canvas_tokens' | 'are_sections_system_controlled' | 'enable_canvas_core_distributions' | 'copy_context_to_canvas' | 'copy_template_metadata_to_canvas' | 'disable_canvas_edit_for_reps' | 'disable_custom_tooltips' | 'disable_file_edit_content' | 'enable_inline_wopi_edit_button' | 'disable_fullscreen_canvas_builder' | 'disable_impact_web_browser_fullscreen' | 'disable_user_invitations' | 'display_section_list_name' | 'disable_download_canvas' | 'enable_ai_generated_thumbnails' | 'enable_analytics' | 'enable_app_developer_role' | 'enable_algolia_search' | 'enable_background_image_theme_options' | 'enable_better_canvas_builder_control_bars_on_zoom' | 'enable_bulk_update_file_attributes' | 'enable_canvas_as_home' | 'enable_canvas_blocks' | 'enable_canvas_node_debugging' | 'enable_canvas_freeze' | 'enable_canvas_locks' | 'enable_canvas_template_edit_in_impact' | 'enable_canvas_tokens' | 'enable_collaborations' | 'enable_collection_player_data_accessor' | 'enable_content_grid_data_accessor' | 'enable_content_translation' | 'enable_content_type_change_in_content_selector' | 'enable_cross_tab_instance_reload_for_ld_sync' | 'enable_create_section_from_section_template' | 'enable_custom_display_overrides' | 'enable_default_crm_shape' | 'enable_detailed_date_format' | 'enable_dsr_readonly_annotations' | 'enable_dnd_html_editor' | 'enable_dynamic_content_component' | 'enable_dynamic_data_table_component' | 'enable_custom_data_tables' | 'enable_embedded_video_autoplay' | 'enable_embedded_video' | 'enable_enhanced_canvas_drawer_app' | 'enable_enhanced_indicators' | 'enable_enhanced_section_execution_states' | 'enable_experimental_canvas_builder_dnd' | 'enable_extra_file_data' | 'enable_file_copy' | 'enable_file_pages_metadata' | 'enable_file_revisions' | 'enable_file_divisible_permission' | 'enable_folder_details_edit' | 'enable_folder_distributions' | 'enable_handlebar_template_support' | 'enable_height_in_component_theming' | 'enable_home_customization' | 'enable_hotspot_visibility' | 'enable_improved_canvas_node_updating' | 'enable_individual_users_in_file_distribution' | 'enable_inline_filter_options' | 'enable_insearch_in_section_selector' | 'enable_instance_cloner' | 'enable_advanced_cloner' | 'enable_content_promotion' | 'enable_instance_editor_role' | 'enable_instance_navigation_from_management' | 'enable_knock_notifications' | 'enable_maintain_section_theme_control' | 'enable_metadata_in_file_uploads_with_default_values' | 'enable_more_intuitive_component_spacing' | 'enable_multi_destination_upload' | 'enable_new_meeting_bar' | 'enable_provider_agnostic_meeting_bar' | 'enable_original_pdf_link' | 'enable_scale_content' | 'enable_sorting_in_tiptap_table' | 'enable_stt_dictation' | 'enable_cloud_stt_fallback' | 'enable_theme_assets' | 'enable_toc_enhancements_to_support_same_section_in_section_list' | 'enable_pia_assistant' | 'enable_pipe_character_multi_search' | 'enable_popup_apps' | 'enable_pre_send_validation' | 'enable_reorder_search' | 'enable_reorder_scribble_isolation' | 'enable_reorder_component_options_menu' | 'enable_resizable_multimedia_component' | 'enable_responsive_scribble_component' | 'enable_saved_canvases_filters' | 'enable_short_tag_column_in_tables' | 'enable_scribble_component' | 'enable_scribble_content_as_background' | 'enable_search_and_filters_in_multimedia_component' | 'enable_section_context_in_dsr' | 'enable_selectors_dnd' | 'enable_section_selector_edit_section' | 'enable_smart_folders' | 'enable_smart_folders_for_sections' | 'enable_smart_folders_in_section_selector' | 'enable_smart_folders_in_files' | 'enable_sorting_in_sections' | 'enable_suggested_tags' | 'enable_template_component_permissions' | 'enable_template_folders' | 'enable_theme_options_border_radius' | 'enable_themes' | 'hide_asset_uploader' | 'hide_user_feedback_widget' | 'include_files_content_in_print' | 'interpolate_rep_canvases_on_edit_mode' | 'is_timeline_component_allowed' | 'launch_in_full_screen_on_present_mode' | 'prefer_online_handlers' | 'restrict_owned_files_from_admins' | 'show_asset_manager_for_multimedia' | 'show_clear_all_annotations_button' | 'show_content_selector_list_view' | 'show_metadata_filters_in_all_canvas_things' | 'show_only_preview_mode_for_html_component' | 'show_popularity_icons' | 'use_core_endpoint_for_analytics' | 'convert_pptx_to_section_with_scribble_pdfjs' | 'use_short_url_for_shared_link' | 'use_zoho_instead_of_ms_wopi' | 'enable_new_section_list' | 'enable_sharebox_apps' | 'enable_sharebox_bulk_filtering' | 'enable_back_to_previous_location_in_canvas' | 'enable_crm_shape_for_external_links' | 'enable_adaptive_popup_apps' | 'enable_file_version_polling' | 'skip_pspdfkit_wait_for_high_res_thumbs' | 'enable_reactive_scribble_component_toolbar' | 'enable_embeddable_full_screen_mode' | 'enable_enhanced_user_management' | 'enable_impersonation' | 'enable_instance_admin_user_assignment' | 'keep_static_pptx_editable' | 'enable_canvas_pdf_dimensions' | 'enable_editable_pptx_of_canvas' | 'enable_editable_pptx_of_canvas_with_fonts' | 'enable_aspose_pptx_of_canvas' | 'enable_canvas_control_bars_collapse' | 'enable_rep_app_visibility_order' | 'enable_file_sharing_print_permissions' | 'enable_section_sharing_print_permissions' | 'enable_marketplace_tab' | 'enable_sfdc_account_visibility_for_canvases' | 'sfdc_offline_enabled' | 'enable_granular_permissions' | 'enable_hub_collections' | 'enable_hub_recommended_smart_folder' | 'enable_custom_user_properties';
2
2
  export type LaunchDarklyNumberFlagKey = 'canvas_section_selector_page_size' | 'canvas_section_selector_selected_items_with_thumbnail_size';
3
3
  /** How PIA Search serves inference (PIT-6863). */
4
4
  export type PiaSearchMode = 'off' | 'on_device' | 'online';
@@ -29,8 +29,6 @@ declare const _LaunchDarklyStringFlags: {
29
29
  readonly pspdfkit_client_version: readonly ["", "pspdfkit-web/2024.6.0/pspdfkit.js", "pspdfkit-web/1.14.0/nutrient-viewer.js"];
30
30
  readonly slotty_ui_remote_script_url: readonly ["https://anyvalidurl.xyz", ""];
31
31
  readonly dsr_remote_script_url: readonly ["https://anyvalidurl.xyz", ""];
32
- readonly ai_image_generation_model: readonly ["minimax/image-01", ""];
33
- readonly ai_video_generation_model: readonly ["minimax/video-01", ""];
34
32
  readonly sharebox_format: readonly ["content-grid", "content-grid-default", "collection-player-default"];
35
33
  };
36
34
  type LaunchDarklyStringFlagValue<K extends LaunchDarklyStringFlagKey = LaunchDarklyStringFlagKey> = K extends LaunchDarklyStringFlagKey ? (typeof _LaunchDarklyStringFlags)[K][number] : never;
@@ -10,6 +10,7 @@ export type ContentMatchRule = {
10
10
  target_metadata_key: string;
11
11
  required?: boolean;
12
12
  };
13
+ export type FullscreenMode = 'focus' | 'fullscreen';
13
14
  type SmartFolderRuleAttribute = {
14
15
  name: string;
15
16
  type: 'string' | 'boolean' | 'number' | 'date' | 'array';
@@ -37,6 +38,10 @@ export type OrganizationSettings = {
37
38
  enable_read_only_canvas_creation_account?: boolean;
38
39
  scribble_file_renderer?: 'image' | 'pdfjs' | 'pspdfkit';
39
40
  enable_wizard_preview_button?: boolean;
41
+ enable_edit_opens_completion_wizard?: boolean;
42
+ enable_react_completion_wizard?: boolean;
43
+ enable_toc_open_by_default?: boolean;
44
+ use_canvas_exit_confirmation?: boolean;
40
45
  locks_polling_interval?: number;
41
46
  shared_link?: {
42
47
  title?: string;
@@ -117,15 +122,20 @@ export type OrganizationSettings = {
117
122
  location_prompt_message?: string;
118
123
  use_collection_player_with_annotations?: boolean;
119
124
  disable_core_canvas_metadata?: boolean;
125
+ enable_account_widgets?: boolean;
120
126
  enable_folder_description_via_name?: boolean;
121
127
  enable_download_original_file_in_impact?: boolean;
122
128
  alternative_canvas_fullscreen?: boolean;
129
+ enable_impact_web_presentation_browser_fullscreen?: boolean;
130
+ default_presentation_fullscreen_mode?: FullscreenMode;
123
131
  enable_presentation_annotations?: boolean;
124
132
  max_files_limit?: number;
125
133
  is_meeting_bar_account_selection_disabled?: boolean;
126
134
  meeting_bar_show_account_context?: 'off' | 'no-call-only' | 'always';
127
135
  meeting_bar_allow_attendee_edit_on_existing_events?: boolean;
128
136
  disable_postcall?: boolean;
137
+ preserve_account_after_call_stop?: boolean;
138
+ meeting_bar_show_meetings?: boolean;
129
139
  launch_in_present_mode_on_creation?: boolean;
130
140
  slotty_ui_route_config?: {
131
141
  name: string;
@@ -96,6 +96,21 @@ export type SfContact = {
96
96
  MailingAddress?: string;
97
97
  Phone?: string;
98
98
  };
99
+ /**
100
+ * Meeting-bar contacts live in a dual id-space: `Id` is the roster record the
101
+ * user picked — a standard Contact (`003…`) when the org's
102
+ * `contact_visibility_query` targets Contact, or a custom-object record (e.g.
103
+ * Demant's `Contact_Customer_Detail__c`, `a1i…`). `ContactMirrorId` is the
104
+ * standard Contact (`003…`) the roster record mirrors (its `Contact__r`
105
+ * lookup), when known — the only id that may ever be written to
106
+ * `Event.WhoId` / `EventWhoIds`. For standard-Contact rosters the roster id IS
107
+ * the mirror id. Hoisted in slotty-ui-ng's `resolveCustomAccountRelation`;
108
+ * synthetic (never written back to Salesforce), deliberately not `__c`-suffixed
109
+ * so it can't collide with a real custom field API name. PIT-7250.
110
+ */
111
+ export type SfRosterContact = SfContact & {
112
+ ContactMirrorId?: string | null;
113
+ };
99
114
  export interface SfContactBasic {
100
115
  AccountId: string;
101
116
  Email: string;