@bbearai/core 0.4.6 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -134,10 +134,10 @@ interface HostUserInfo {
134
134
  interface BugBearConfig {
135
135
  /** Your BugBear project ID */
136
136
  projectId: string;
137
- /** Supabase URL (uses BugBear's hosted if not provided) */
138
- supabaseUrl?: string;
139
- /** Supabase anon key */
140
- supabaseAnonKey?: string;
137
+ /** Supabase URL for the BugBear backend */
138
+ supabaseUrl: string;
139
+ /** Supabase anon key for the BugBear backend */
140
+ supabaseAnonKey: string;
141
141
  /** Enable voice input */
142
142
  enableVoice?: boolean;
143
143
  /** Enable screenshot capture */
@@ -173,6 +173,27 @@ interface BugBearConfig {
173
173
  * Wire this to your error reporting service (e.g. Sentry.captureException).
174
174
  */
175
175
  onError?: (error: Error, context?: Record<string, unknown>) => void;
176
+ /**
177
+ * Enable offline queue for network-resilient submissions.
178
+ * When a submitReport, sendMessage, or submitTestFeedback call fails
179
+ * due to a network error, the operation is stored locally and retried
180
+ * when connectivity returns.
181
+ */
182
+ offlineQueue?: {
183
+ enabled: boolean;
184
+ /** Maximum items to keep in the queue (oldest evicted first). Default 50. */
185
+ maxItems?: number;
186
+ /** Maximum retry attempts per item before it is dropped. Default 5. */
187
+ maxRetries?: number;
188
+ };
189
+ /**
190
+ * Enable Supabase Realtime subscriptions for instant updates.
191
+ * Subscribes to changes on test_assignments, discussion_messages, and reports.
192
+ * Falls back to polling if subscription fails.
193
+ */
194
+ realtime?: {
195
+ enabled: boolean;
196
+ };
176
197
  }
177
198
  interface BugBearTheme {
178
199
  /** Primary brand color */
@@ -231,6 +252,8 @@ interface TestAssignment {
231
252
  group?: TestGroup;
232
253
  /** Required app role for testing (e.g., Owner, Manager) */
233
254
  role?: ProjectRole;
255
+ /** Platforms this test applies to (e.g., ['ios', 'web']) */
256
+ platforms?: string[];
234
257
  };
235
258
  status: 'pending' | 'in_progress' | 'passed' | 'failed' | 'blocked' | 'skipped';
236
259
  /** Reason for skipping (when status is 'skipped') */
@@ -650,6 +673,97 @@ interface TesterIssue {
650
673
  originalBugTitle?: string;
651
674
  }
652
675
 
676
+ /**
677
+ * BugBear Offline Queue
678
+ *
679
+ * Persists failed network operations and retries them when connectivity returns.
680
+ * Uses a StorageAdapter interface so web (localStorage) and React Native
681
+ * (AsyncStorage) can each supply their own persistence layer.
682
+ */
683
+ /** Platform-agnostic async storage interface. */
684
+ interface StorageAdapter {
685
+ getItem(key: string): Promise<string | null>;
686
+ setItem(key: string, value: string): Promise<void>;
687
+ removeItem(key: string): Promise<void>;
688
+ }
689
+ /**
690
+ * Default adapter that wraps `window.localStorage`.
691
+ * Falls back to in-memory storage when localStorage is unavailable
692
+ * (e.g. SSR, workers, or storage quota exceeded).
693
+ */
694
+ declare class LocalStorageAdapter implements StorageAdapter {
695
+ private fallback;
696
+ private get isAvailable();
697
+ getItem(key: string): Promise<string | null>;
698
+ setItem(key: string, value: string): Promise<void>;
699
+ removeItem(key: string): Promise<void>;
700
+ }
701
+ type QueueItemType = 'report' | 'message' | 'feedback';
702
+ interface QueueItem {
703
+ /** Unique ID for this queued operation. */
704
+ id: string;
705
+ /** Which client method to replay. */
706
+ type: QueueItemType;
707
+ /** Already-enriched payload ready for INSERT/RPC. */
708
+ payload: unknown;
709
+ /** Epoch ms when the item was queued. */
710
+ createdAt: number;
711
+ /** How many times flush has tried (and failed) to replay this item. */
712
+ retries: number;
713
+ }
714
+ interface OfflineQueueConfig {
715
+ enabled: boolean;
716
+ /** Maximum items to keep in the queue (oldest evicted first). Default 50. */
717
+ maxItems?: number;
718
+ /** Maximum retry attempts per item before it is dropped. Default 5. */
719
+ maxRetries?: number;
720
+ /** Platform-specific storage adapter. Default: LocalStorageAdapter. */
721
+ storage?: StorageAdapter;
722
+ }
723
+ type FlushHandler = (payload: unknown) => Promise<{
724
+ success: boolean;
725
+ error?: string;
726
+ }>;
727
+ declare class OfflineQueue {
728
+ private items;
729
+ private maxItems;
730
+ private maxRetries;
731
+ private storage;
732
+ private storageKey;
733
+ private flushing;
734
+ private handlers;
735
+ private listener?;
736
+ constructor(config: OfflineQueueConfig);
737
+ /** Register a handler that replays a queued operation. */
738
+ registerHandler(type: QueueItemType, handler: FlushHandler): void;
739
+ /** Subscribe to queue count changes (for UI badges). */
740
+ onChange(callback: (count: number) => void): void;
741
+ private notify;
742
+ /** Load queue from persistent storage. Call once after construction. */
743
+ load(): Promise<void>;
744
+ private save;
745
+ /** Add a failed operation to the queue. Returns the item ID. */
746
+ enqueue(type: QueueItemType, payload: unknown): Promise<string>;
747
+ /** Number of items waiting to be flushed. */
748
+ get count(): number;
749
+ /** Read-only snapshot of pending items. */
750
+ get pending(): readonly QueueItem[];
751
+ /** Whether a flush is currently in progress. */
752
+ get isFlushing(): boolean;
753
+ /**
754
+ * Process all queued items in FIFO order.
755
+ * Stops early if a network error is encountered (still offline).
756
+ */
757
+ flush(): Promise<{
758
+ flushed: number;
759
+ failed: number;
760
+ }>;
761
+ /** Drop all queued items. */
762
+ clear(): Promise<void>;
763
+ }
764
+ /** Heuristic: does this error string look like a connectivity failure? */
765
+ declare function isNetworkError(error?: string | null): boolean;
766
+
653
767
  /**
654
768
  * BugBear Client
655
769
  * Handles communication with the BugBear backend
@@ -660,7 +774,38 @@ declare class BugBearClient {
660
774
  private config;
661
775
  private navigationHistory;
662
776
  private reportSubmitInFlight;
777
+ /** Offline queue — only created when config.offlineQueue.enabled is true. */
778
+ private _queue;
779
+ /** Active Realtime channel references for cleanup. */
780
+ private realtimeChannels;
663
781
  constructor(config: BugBearConfig);
782
+ /**
783
+ * Access the offline queue (if enabled).
784
+ * Use this to check queue.count, subscribe to changes, or trigger flush.
785
+ */
786
+ get queue(): OfflineQueue | null;
787
+ /**
788
+ * Initialize the offline queue with a platform-specific storage adapter.
789
+ * Must be called after construction for React Native (which supplies AsyncStorage).
790
+ * Web callers can skip this — LocalStorageAdapter is the default.
791
+ */
792
+ initQueue(storage?: StorageAdapter): Promise<void>;
793
+ private registerQueueHandlers;
794
+ /** Whether realtime is enabled in config. */
795
+ get realtimeEnabled(): boolean;
796
+ /**
797
+ * Subscribe to postgres_changes on relevant tables.
798
+ * Each callback fires when the corresponding table has changes —
799
+ * the provider should call its refresh function in response.
800
+ * Returns a cleanup function that unsubscribes all channels.
801
+ */
802
+ subscribeToChanges(callbacks: {
803
+ onAssignmentChange?: () => void;
804
+ onMessageChange?: () => void;
805
+ onReportChange?: () => void;
806
+ }): () => void;
807
+ /** Remove all active Realtime channels. */
808
+ unsubscribeAll(): void;
664
809
  /**
665
810
  * Track navigation for context.
666
811
  * Also forwards to contextCapture for auto-tracked navigation.
@@ -688,13 +833,17 @@ declare class BugBearClient {
688
833
  }): Promise<{
689
834
  success: boolean;
690
835
  reportId?: string;
836
+ queued?: boolean;
691
837
  error?: string;
692
838
  }>;
693
839
  /**
694
840
  * Get assigned tests for current user
695
841
  * First looks up the tester by email, then fetches their assignments
696
842
  */
697
- getAssignedTests(): Promise<TestAssignment[]>;
843
+ getAssignedTests(options?: {
844
+ page?: number;
845
+ pageSize?: number;
846
+ }): Promise<TestAssignment[]>;
698
847
  /**
699
848
  * Get assignment by ID with time tracking fields
700
849
  */
@@ -734,6 +883,14 @@ declare class BugBearClient {
734
883
  error?: string;
735
884
  durationSeconds?: number;
736
885
  }>;
886
+ /**
887
+ * Reopen a completed assignment — sets it back to in_progress with a fresh timer.
888
+ * Clears completed_at and duration_seconds so it can be re-evaluated.
889
+ */
890
+ reopenAssignment(assignmentId: string): Promise<{
891
+ success: boolean;
892
+ error?: string;
893
+ }>;
737
894
  /**
738
895
  * Skip a test assignment with a required reason
739
896
  * Marks the assignment as 'skipped' and records why it was skipped
@@ -751,6 +908,7 @@ declare class BugBearClient {
751
908
  */
752
909
  submitTestFeedback(options: SubmitFeedbackOptions): Promise<{
753
910
  success: boolean;
911
+ queued?: boolean;
754
912
  error?: string;
755
913
  }>;
756
914
  /**
@@ -1073,4 +1231,4 @@ declare function captureError(error: Error, errorInfo?: {
1073
1231
  componentStack?: string;
1074
1232
  };
1075
1233
 
1076
- export { type AddFindingOptions, type AppContext, BUG_CATEGORIES, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type BugCategory, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EndSessionOptions, type EnhancedBugContext, type FindingSeverity, type FindingType, type HostUserInfo, type IssueCategory, type IssueCounts, type MessageSenderType, type NetworkRequest, type PriorityFactors, type ProjectRole, type QAFinding, type QAHealthMetrics, type QAHealthScore, type QASession, type QASessionStatus, type QATrack, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type SkipReason, type StartSessionOptions, type SubmitFeedbackOptions, type TestAssignment, type TestFeedback, type TestGroup, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterIssue, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear, isBugCategory };
1234
+ export { type AddFindingOptions, type AppContext, BUG_CATEGORIES, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type BugCategory, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EndSessionOptions, type EnhancedBugContext, type FindingSeverity, type FindingType, type HostUserInfo, type IssueCategory, type IssueCounts, LocalStorageAdapter, type MessageSenderType, type NetworkRequest, OfflineQueue, type OfflineQueueConfig, type PriorityFactors, type ProjectRole, type QAFinding, type QAHealthMetrics, type QAHealthScore, type QASession, type QASessionStatus, type QATrack, type QueueItem, type QueueItemType, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type SkipReason, type StartSessionOptions, type StorageAdapter, type SubmitFeedbackOptions, type TestAssignment, type TestFeedback, type TestGroup, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterIssue, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear, isBugCategory, isNetworkError };
package/dist/index.d.ts CHANGED
@@ -134,10 +134,10 @@ interface HostUserInfo {
134
134
  interface BugBearConfig {
135
135
  /** Your BugBear project ID */
136
136
  projectId: string;
137
- /** Supabase URL (uses BugBear's hosted if not provided) */
138
- supabaseUrl?: string;
139
- /** Supabase anon key */
140
- supabaseAnonKey?: string;
137
+ /** Supabase URL for the BugBear backend */
138
+ supabaseUrl: string;
139
+ /** Supabase anon key for the BugBear backend */
140
+ supabaseAnonKey: string;
141
141
  /** Enable voice input */
142
142
  enableVoice?: boolean;
143
143
  /** Enable screenshot capture */
@@ -173,6 +173,27 @@ interface BugBearConfig {
173
173
  * Wire this to your error reporting service (e.g. Sentry.captureException).
174
174
  */
175
175
  onError?: (error: Error, context?: Record<string, unknown>) => void;
176
+ /**
177
+ * Enable offline queue for network-resilient submissions.
178
+ * When a submitReport, sendMessage, or submitTestFeedback call fails
179
+ * due to a network error, the operation is stored locally and retried
180
+ * when connectivity returns.
181
+ */
182
+ offlineQueue?: {
183
+ enabled: boolean;
184
+ /** Maximum items to keep in the queue (oldest evicted first). Default 50. */
185
+ maxItems?: number;
186
+ /** Maximum retry attempts per item before it is dropped. Default 5. */
187
+ maxRetries?: number;
188
+ };
189
+ /**
190
+ * Enable Supabase Realtime subscriptions for instant updates.
191
+ * Subscribes to changes on test_assignments, discussion_messages, and reports.
192
+ * Falls back to polling if subscription fails.
193
+ */
194
+ realtime?: {
195
+ enabled: boolean;
196
+ };
176
197
  }
177
198
  interface BugBearTheme {
178
199
  /** Primary brand color */
@@ -231,6 +252,8 @@ interface TestAssignment {
231
252
  group?: TestGroup;
232
253
  /** Required app role for testing (e.g., Owner, Manager) */
233
254
  role?: ProjectRole;
255
+ /** Platforms this test applies to (e.g., ['ios', 'web']) */
256
+ platforms?: string[];
234
257
  };
235
258
  status: 'pending' | 'in_progress' | 'passed' | 'failed' | 'blocked' | 'skipped';
236
259
  /** Reason for skipping (when status is 'skipped') */
@@ -650,6 +673,97 @@ interface TesterIssue {
650
673
  originalBugTitle?: string;
651
674
  }
652
675
 
676
+ /**
677
+ * BugBear Offline Queue
678
+ *
679
+ * Persists failed network operations and retries them when connectivity returns.
680
+ * Uses a StorageAdapter interface so web (localStorage) and React Native
681
+ * (AsyncStorage) can each supply their own persistence layer.
682
+ */
683
+ /** Platform-agnostic async storage interface. */
684
+ interface StorageAdapter {
685
+ getItem(key: string): Promise<string | null>;
686
+ setItem(key: string, value: string): Promise<void>;
687
+ removeItem(key: string): Promise<void>;
688
+ }
689
+ /**
690
+ * Default adapter that wraps `window.localStorage`.
691
+ * Falls back to in-memory storage when localStorage is unavailable
692
+ * (e.g. SSR, workers, or storage quota exceeded).
693
+ */
694
+ declare class LocalStorageAdapter implements StorageAdapter {
695
+ private fallback;
696
+ private get isAvailable();
697
+ getItem(key: string): Promise<string | null>;
698
+ setItem(key: string, value: string): Promise<void>;
699
+ removeItem(key: string): Promise<void>;
700
+ }
701
+ type QueueItemType = 'report' | 'message' | 'feedback';
702
+ interface QueueItem {
703
+ /** Unique ID for this queued operation. */
704
+ id: string;
705
+ /** Which client method to replay. */
706
+ type: QueueItemType;
707
+ /** Already-enriched payload ready for INSERT/RPC. */
708
+ payload: unknown;
709
+ /** Epoch ms when the item was queued. */
710
+ createdAt: number;
711
+ /** How many times flush has tried (and failed) to replay this item. */
712
+ retries: number;
713
+ }
714
+ interface OfflineQueueConfig {
715
+ enabled: boolean;
716
+ /** Maximum items to keep in the queue (oldest evicted first). Default 50. */
717
+ maxItems?: number;
718
+ /** Maximum retry attempts per item before it is dropped. Default 5. */
719
+ maxRetries?: number;
720
+ /** Platform-specific storage adapter. Default: LocalStorageAdapter. */
721
+ storage?: StorageAdapter;
722
+ }
723
+ type FlushHandler = (payload: unknown) => Promise<{
724
+ success: boolean;
725
+ error?: string;
726
+ }>;
727
+ declare class OfflineQueue {
728
+ private items;
729
+ private maxItems;
730
+ private maxRetries;
731
+ private storage;
732
+ private storageKey;
733
+ private flushing;
734
+ private handlers;
735
+ private listener?;
736
+ constructor(config: OfflineQueueConfig);
737
+ /** Register a handler that replays a queued operation. */
738
+ registerHandler(type: QueueItemType, handler: FlushHandler): void;
739
+ /** Subscribe to queue count changes (for UI badges). */
740
+ onChange(callback: (count: number) => void): void;
741
+ private notify;
742
+ /** Load queue from persistent storage. Call once after construction. */
743
+ load(): Promise<void>;
744
+ private save;
745
+ /** Add a failed operation to the queue. Returns the item ID. */
746
+ enqueue(type: QueueItemType, payload: unknown): Promise<string>;
747
+ /** Number of items waiting to be flushed. */
748
+ get count(): number;
749
+ /** Read-only snapshot of pending items. */
750
+ get pending(): readonly QueueItem[];
751
+ /** Whether a flush is currently in progress. */
752
+ get isFlushing(): boolean;
753
+ /**
754
+ * Process all queued items in FIFO order.
755
+ * Stops early if a network error is encountered (still offline).
756
+ */
757
+ flush(): Promise<{
758
+ flushed: number;
759
+ failed: number;
760
+ }>;
761
+ /** Drop all queued items. */
762
+ clear(): Promise<void>;
763
+ }
764
+ /** Heuristic: does this error string look like a connectivity failure? */
765
+ declare function isNetworkError(error?: string | null): boolean;
766
+
653
767
  /**
654
768
  * BugBear Client
655
769
  * Handles communication with the BugBear backend
@@ -660,7 +774,38 @@ declare class BugBearClient {
660
774
  private config;
661
775
  private navigationHistory;
662
776
  private reportSubmitInFlight;
777
+ /** Offline queue — only created when config.offlineQueue.enabled is true. */
778
+ private _queue;
779
+ /** Active Realtime channel references for cleanup. */
780
+ private realtimeChannels;
663
781
  constructor(config: BugBearConfig);
782
+ /**
783
+ * Access the offline queue (if enabled).
784
+ * Use this to check queue.count, subscribe to changes, or trigger flush.
785
+ */
786
+ get queue(): OfflineQueue | null;
787
+ /**
788
+ * Initialize the offline queue with a platform-specific storage adapter.
789
+ * Must be called after construction for React Native (which supplies AsyncStorage).
790
+ * Web callers can skip this — LocalStorageAdapter is the default.
791
+ */
792
+ initQueue(storage?: StorageAdapter): Promise<void>;
793
+ private registerQueueHandlers;
794
+ /** Whether realtime is enabled in config. */
795
+ get realtimeEnabled(): boolean;
796
+ /**
797
+ * Subscribe to postgres_changes on relevant tables.
798
+ * Each callback fires when the corresponding table has changes —
799
+ * the provider should call its refresh function in response.
800
+ * Returns a cleanup function that unsubscribes all channels.
801
+ */
802
+ subscribeToChanges(callbacks: {
803
+ onAssignmentChange?: () => void;
804
+ onMessageChange?: () => void;
805
+ onReportChange?: () => void;
806
+ }): () => void;
807
+ /** Remove all active Realtime channels. */
808
+ unsubscribeAll(): void;
664
809
  /**
665
810
  * Track navigation for context.
666
811
  * Also forwards to contextCapture for auto-tracked navigation.
@@ -688,13 +833,17 @@ declare class BugBearClient {
688
833
  }): Promise<{
689
834
  success: boolean;
690
835
  reportId?: string;
836
+ queued?: boolean;
691
837
  error?: string;
692
838
  }>;
693
839
  /**
694
840
  * Get assigned tests for current user
695
841
  * First looks up the tester by email, then fetches their assignments
696
842
  */
697
- getAssignedTests(): Promise<TestAssignment[]>;
843
+ getAssignedTests(options?: {
844
+ page?: number;
845
+ pageSize?: number;
846
+ }): Promise<TestAssignment[]>;
698
847
  /**
699
848
  * Get assignment by ID with time tracking fields
700
849
  */
@@ -734,6 +883,14 @@ declare class BugBearClient {
734
883
  error?: string;
735
884
  durationSeconds?: number;
736
885
  }>;
886
+ /**
887
+ * Reopen a completed assignment — sets it back to in_progress with a fresh timer.
888
+ * Clears completed_at and duration_seconds so it can be re-evaluated.
889
+ */
890
+ reopenAssignment(assignmentId: string): Promise<{
891
+ success: boolean;
892
+ error?: string;
893
+ }>;
737
894
  /**
738
895
  * Skip a test assignment with a required reason
739
896
  * Marks the assignment as 'skipped' and records why it was skipped
@@ -751,6 +908,7 @@ declare class BugBearClient {
751
908
  */
752
909
  submitTestFeedback(options: SubmitFeedbackOptions): Promise<{
753
910
  success: boolean;
911
+ queued?: boolean;
754
912
  error?: string;
755
913
  }>;
756
914
  /**
@@ -1073,4 +1231,4 @@ declare function captureError(error: Error, errorInfo?: {
1073
1231
  componentStack?: string;
1074
1232
  };
1075
1233
 
1076
- export { type AddFindingOptions, type AppContext, BUG_CATEGORIES, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type BugCategory, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EndSessionOptions, type EnhancedBugContext, type FindingSeverity, type FindingType, type HostUserInfo, type IssueCategory, type IssueCounts, type MessageSenderType, type NetworkRequest, type PriorityFactors, type ProjectRole, type QAFinding, type QAHealthMetrics, type QAHealthScore, type QASession, type QASessionStatus, type QATrack, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type SkipReason, type StartSessionOptions, type SubmitFeedbackOptions, type TestAssignment, type TestFeedback, type TestGroup, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterIssue, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear, isBugCategory };
1234
+ export { type AddFindingOptions, type AppContext, BUG_CATEGORIES, BugBearClient, type BugBearConfig, type BugBearReport, type BugBearTheme, type BugCategory, type ChecklistItem, type ChecklistResult, type ConsoleLogEntry, type CoverageGap, type CoverageMatrixCell, type CoverageMatrixRow, type DeployChecklist, type DeviceInfo, type EndSessionOptions, type EnhancedBugContext, type FindingSeverity, type FindingType, type HostUserInfo, type IssueCategory, type IssueCounts, LocalStorageAdapter, type MessageSenderType, type NetworkRequest, OfflineQueue, type OfflineQueueConfig, type PriorityFactors, type ProjectRole, type QAFinding, type QAHealthMetrics, type QAHealthScore, type QASession, type QASessionStatus, type QATrack, type QueueItem, type QueueItemType, type RegressionEvent, type ReportStatus, type ReportType, type RoutePriority, type RouteTestStats, type RubricMode, type RubricResult, type Severity, type SkipReason, type StartSessionOptions, type StorageAdapter, type SubmitFeedbackOptions, type TestAssignment, type TestFeedback, type TestGroup, type TestResult, type TestStep, type TestTemplate, type TesterInfo, type TesterIssue, type TesterMessage, type TesterProfileUpdate, type TesterThread, type ThreadPriority, type ThreadType, captureError, contextCapture, createBugBear, isBugCategory, isNetworkError };