yaver-feedback-react-native 0.9.2 → 0.9.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 (108) hide show
  1. package/README.md +102 -1
  2. package/dist/AuthOverlay.d.ts +1 -14
  3. package/dist/AuthOverlay.js +9 -62
  4. package/dist/Discovery.js +0 -6
  5. package/dist/DogfoodRuntime.d.ts +124 -0
  6. package/dist/DogfoodRuntime.js +273 -0
  7. package/dist/FeedbackModal.js +347 -61
  8. package/dist/LoginScreen.d.ts +1 -5
  9. package/dist/LoginScreen.js +2 -6
  10. package/dist/MachinePickerScreen.d.ts +1 -3
  11. package/dist/MachinePickerScreen.js +6 -18
  12. package/dist/P2PClient.d.ts +116 -3
  13. package/dist/P2PClient.js +273 -3
  14. package/dist/P2PDogfoodDriver.d.ts +12 -0
  15. package/dist/P2PDogfoodDriver.js +118 -0
  16. package/dist/PairDeviceModal.d.ts +2 -3
  17. package/dist/ShakeDetector.js +31 -17
  18. package/dist/VibeChatScreen.d.ts +11 -1
  19. package/dist/VibeChatScreen.js +200 -41
  20. package/dist/YaverFeedback.d.ts +34 -0
  21. package/dist/YaverFeedback.js +124 -19
  22. package/dist/YaverModeBadge.d.ts +22 -0
  23. package/dist/YaverModeBadge.js +219 -0
  24. package/dist/__tests__/AuthDevices.test.js +1 -48
  25. package/dist/__tests__/DogfoodRuntime.test.d.ts +1 -0
  26. package/dist/__tests__/DogfoodRuntime.test.js +116 -0
  27. package/dist/__tests__/P2PDogfoodDriver.test.d.ts +1 -0
  28. package/dist/__tests__/P2PDogfoodDriver.test.js +64 -0
  29. package/dist/__tests__/ReportIdentity.test.d.ts +25 -1
  30. package/dist/__tests__/ReportIdentity.test.js +34 -22
  31. package/dist/__tests__/ShakeDetectorWeb.test.d.ts +1 -0
  32. package/dist/__tests__/ShakeDetectorWeb.test.js +27 -0
  33. package/dist/__tests__/YaverFeedback.test.js +13 -3
  34. package/dist/__tests__/deviceDogfood.test.d.ts +1 -0
  35. package/dist/__tests__/deviceDogfood.test.js +86 -0
  36. package/dist/__tests__/dogfoodPolicy.test.d.ts +1 -0
  37. package/dist/__tests__/dogfoodPolicy.test.js +33 -0
  38. package/dist/_core/ansi.d.ts +117 -0
  39. package/dist/_core/ansi.js +468 -0
  40. package/dist/_core/ansi.test.d.ts +1 -0
  41. package/dist/_core/ansi.test.js +225 -0
  42. package/dist/_core/buildFeedbackPrompt.d.ts +4 -9
  43. package/dist/_core/buildFeedbackPrompt.js +18 -72
  44. package/dist/_core/constants.d.ts +19 -6
  45. package/dist/_core/constants.js +20 -7
  46. package/dist/_core/device.d.ts +9 -23
  47. package/dist/_core/device.js +13 -28
  48. package/dist/_core/endpoints.d.ts +0 -7
  49. package/dist/_core/endpoints.js +0 -7
  50. package/dist/_core/index.d.ts +4 -0
  51. package/dist/_core/index.js +4 -0
  52. package/dist/_core/remoteless.d.ts +44 -0
  53. package/dist/_core/remoteless.js +75 -0
  54. package/dist/_core/trace.d.ts +47 -0
  55. package/dist/_core/trace.js +38 -0
  56. package/dist/_core/trace.test.d.ts +1 -0
  57. package/dist/_core/trace.test.js +60 -0
  58. package/dist/auth.d.ts +3 -60
  59. package/dist/auth.js +6 -88
  60. package/dist/deviceDogfood.d.ts +53 -0
  61. package/dist/deviceDogfood.js +137 -0
  62. package/dist/dogfoodPolicy.d.ts +25 -0
  63. package/dist/dogfoodPolicy.js +24 -0
  64. package/dist/index.d.ts +13 -4
  65. package/dist/index.js +24 -8
  66. package/dist/reloadActions.js +2 -2
  67. package/dist/types.d.ts +50 -7
  68. package/package.json +12 -3
  69. package/src/AuthOverlay.tsx +20 -106
  70. package/src/Discovery.ts +0 -6
  71. package/src/DogfoodRuntime.ts +373 -0
  72. package/src/FeedbackModal.tsx +445 -67
  73. package/src/LoginScreen.tsx +2 -22
  74. package/src/MachinePickerScreen.tsx +6 -21
  75. package/src/P2PClient.ts +347 -4
  76. package/src/P2PDogfoodDriver.ts +132 -0
  77. package/src/PairDeviceModal.tsx +2 -3
  78. package/src/ShakeDetector.ts +31 -18
  79. package/src/VibeChatScreen.tsx +232 -42
  80. package/src/YaverFeedback.ts +133 -22
  81. package/src/YaverModeBadge.tsx +234 -0
  82. package/src/__tests__/AuthDevices.test.ts +1 -52
  83. package/src/__tests__/DogfoodRuntime.test.ts +135 -0
  84. package/src/__tests__/P2PDogfoodDriver.test.ts +80 -0
  85. package/src/__tests__/ReportIdentity.test.ts +36 -27
  86. package/src/__tests__/ShakeDetectorWeb.test.ts +30 -0
  87. package/src/__tests__/YaverFeedback.test.ts +15 -3
  88. package/src/__tests__/deviceDogfood.test.ts +77 -0
  89. package/src/__tests__/dogfoodPolicy.test.ts +34 -0
  90. package/src/_core/ansi.test.ts +250 -0
  91. package/src/_core/ansi.ts +475 -0
  92. package/src/_core/buildFeedbackPrompt.ts +18 -95
  93. package/src/_core/constants.ts +20 -6
  94. package/src/_core/device.ts +13 -30
  95. package/src/_core/endpoints.ts +0 -7
  96. package/src/_core/index.ts +4 -0
  97. package/src/_core/remoteless.ts +110 -0
  98. package/src/_core/trace.test.ts +58 -0
  99. package/src/_core/trace.ts +75 -0
  100. package/src/auth.ts +7 -156
  101. package/src/deviceDogfood.ts +171 -0
  102. package/src/dogfoodPolicy.ts +40 -0
  103. package/src/index.ts +40 -11
  104. package/src/reloadActions.ts +2 -2
  105. package/src/types.ts +45 -7
  106. package/dist/GuestOnboardingScreen.d.ts +0 -8
  107. package/dist/GuestOnboardingScreen.js +0 -282
  108. package/src/GuestOnboardingScreen.tsx +0 -307
@@ -0,0 +1,25 @@
1
+ export interface SDKDogfoodConfig {
2
+ /** Explicit opt-in. Omitted/false keeps the normal Feedback SDK. */
3
+ enabled?: boolean;
4
+ /** App-account IDs allowed to enter Dogfood. Public identifiers, not secrets. */
5
+ accountIds?: string[];
6
+ /** The third-party app's currently authenticated account ID. */
7
+ currentAccountId?: string;
8
+ /** Account-free installation identity resolved by YaverDeviceDogfood. */
9
+ appId?: string;
10
+ installationId?: string;
11
+ installationStatus?: 'pending' | 'active' | 'cancelled' | 'revoked' | 'superseded';
12
+ /** Called after the user confirms Exit Dogfood mode. */
13
+ onExit?: () => void | Promise<void>;
14
+ /** Optional app label shown beside Dogfood mode. */
15
+ label?: string;
16
+ }
17
+ export interface SDKDogfoodStatus {
18
+ active: boolean;
19
+ code: 'SDK_DOGFOOD_ACTIVE' | 'SDK_DOGFOOD_DISABLED' | 'SDK_DOGFOOD_ACCOUNT_REQUIRED' | 'SDK_DOGFOOD_ACCOUNT_NOT_ALLOWED' | 'SDK_DOGFOOD_INSTALLATION_REQUIRED' | 'SDK_DOGFOOD_INSTALLATION_NOT_ACTIVE';
20
+ accountId?: string;
21
+ label: string;
22
+ }
23
+ /** Pure, fail-closed account gate shared by init, the Y badge and tests.
24
+ * This controls SDK UX only; every task/reload still requires Yaver auth. */
25
+ export declare function resolveSDKDogfood(config?: SDKDogfoodConfig | null): SDKDogfoodStatus;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSDKDogfood = resolveSDKDogfood;
4
+ /** Pure, fail-closed account gate shared by init, the Y badge and tests.
5
+ * This controls SDK UX only; every task/reload still requires Yaver auth. */
6
+ function resolveSDKDogfood(config) {
7
+ const label = String(config?.label || 'Dogfood').trim() || 'Dogfood';
8
+ if (config?.enabled !== true)
9
+ return { active: false, code: 'SDK_DOGFOOD_DISABLED', label };
10
+ if (config.appId) {
11
+ if (!config.installationId)
12
+ return { active: false, code: 'SDK_DOGFOOD_INSTALLATION_REQUIRED', label };
13
+ if (config.installationStatus !== 'active')
14
+ return { active: false, code: 'SDK_DOGFOOD_INSTALLATION_NOT_ACTIVE', label };
15
+ return { active: true, code: 'SDK_DOGFOOD_ACTIVE', accountId: config.installationId, label };
16
+ }
17
+ const accountId = String(config.currentAccountId || '').trim();
18
+ if (!accountId)
19
+ return { active: false, code: 'SDK_DOGFOOD_ACCOUNT_REQUIRED', label };
20
+ const allowed = new Set((config.accountIds || []).map((id) => String(id).trim()).filter(Boolean));
21
+ if (!allowed.has(accountId))
22
+ return { active: false, code: 'SDK_DOGFOOD_ACCOUNT_NOT_ALLOWED', accountId, label };
23
+ return { active: true, code: 'SDK_DOGFOOD_ACTIVE', accountId, label };
24
+ }
package/dist/index.d.ts CHANGED
@@ -28,6 +28,7 @@
28
28
  * ```
29
29
  */
30
30
  export { YaverFeedback } from './YaverFeedback';
31
+ export type { DogfoodOnboardingOptions } from './YaverFeedback';
31
32
  export { captureStoreScreenshots } from './storeShots';
32
33
  export type { CaptureStoreScreenshotsOptions, CaptureStoreScreenshotsResult, StoreShotFrame, } from './storeShots';
33
34
  export { BlackBox } from './BlackBox';
@@ -36,6 +37,8 @@ export type { YaverUpdatesConfig, PendingUpdate } from './YaverUpdates';
36
37
  export { initExpo } from './expo';
37
38
  export { YaverDiscovery } from './Discovery';
38
39
  export { P2PClient } from './P2PClient';
40
+ export type { DogfoodDevEvent, DogfoodDevServerStatus, DogfoodRemoteRuntimeCapabilities, DogfoodRemoteRuntimeSession, DogfoodRemoteRuntimeTarget, } from './P2PClient';
41
+ export { createP2PDogfoodDriver, type P2PDogfoodDriverOptions } from './P2PDogfoodDriver';
39
42
  export { reloadActions, reloadRequest, reloadFrameworkFamily, describeReloadFailure, RELOAD_PATH, RELOAD_APP_PATH, } from './reloadActions';
40
43
  export type { ReloadAction, ReloadActionId, ReloadActionsOptions, ReloadWireMode, DevServerSnapshot, } from './reloadActions';
41
44
  export { YaverConnectionScreen } from './ConnectionScreen';
@@ -43,20 +46,26 @@ export { YaverLoginScreen } from './LoginScreen';
43
46
  export type { YaverLoginScreenProps } from './LoginScreen';
44
47
  export { YaverMachinePickerScreen } from './MachinePickerScreen';
45
48
  export type { YaverMachinePickerProps } from './MachinePickerScreen';
46
- export { YaverGuestOnboardingScreen } from './GuestOnboardingScreen';
47
- export type { YaverGuestOnboardingScreenProps } from './GuestOnboardingScreen';
48
49
  export { PairDeviceModal } from './PairDeviceModal';
49
50
  export type { PairDeviceModalProps } from './PairDeviceModal';
50
51
  export { AuthOverlay } from './AuthOverlay';
51
52
  export { ShakeDetector } from './ShakeDetector';
52
53
  export { FloatingButton } from './FloatingButton';
54
+ export { YaverModeBadge, hideYaverModeBadge, showYaverModeBadge, isYaverModeBadgeHidden } from './YaverModeBadge';
55
+ export type { YaverModeBadgeProps } from './YaverModeBadge';
56
+ export { resolveSDKDogfood } from './dogfoodPolicy';
57
+ export type { SDKDogfoodConfig, SDKDogfoodStatus } from './dogfoodPolicy';
58
+ export { YaverDeviceDogfood } from './deviceDogfood';
59
+ export type { DeviceDogfoodOptions, DeviceDogfoodSession, DeviceDogfoodState } from './deviceDogfood';
60
+ export { DogfoodController, DogfoodRuntimeError, defaultDogfoodLane, dogfoodLaneOptions, dogfoodLogLinesFromDevEvent, runtimeLogLinesFromDevEvent, validateDogfoodProject, } from './DogfoodRuntime';
61
+ export type { DogfoodControllerOptions, DogfoodDriver, DogfoodFailure, DogfoodLane, DogfoodLaneOption, DogfoodLogLine, DogfoodPhase, DogfoodProject, DogfoodResult, DogfoodRunContext, DogfoodSnapshot, } from './DogfoodRuntime';
53
62
  export { FeedbackModal } from './FeedbackModal';
54
63
  export { QuickActionIcon } from './QuickActionIcon';
55
64
  export type { QuickActionIconProps } from './QuickActionIcon';
56
65
  export { FixReport } from './FixReport';
57
66
  export { getQuickIconDisabled, setQuickIconDisabled, clearQuickIconDisabled, } from './preferences';
58
- export { configureAuthEndpoints, getConvexSiteUrl, getWebBaseUrl, getToken, saveToken, clearToken, getUser, saveUser, getSelectedDeviceId, saveSelectedDeviceId, clearSelectedDeviceId, validateToken, signInWithApple, signInWithOAuth, signupWithEmail, loginWithEmail, listReachableDevices, fetchGuestHosts, findInviteByCode, acceptGuestByCode, acceptGuestInvitation, DEFAULT_CONVEX_SITE_URL, DEFAULT_WEB_BASE_URL, DEFAULT_OAUTH_REDIRECT, } from './auth';
59
- export type { OAuthProvider, User, RemoteDevice, DeviceList, GuestInvitation, ActiveGuestHost, GuestHostsResponse, InvitationHostDevice, InvitationPreview, } from './auth';
67
+ export { configureAuthEndpoints, getConvexSiteUrl, getWebBaseUrl, getToken, saveToken, clearToken, getUser, saveUser, getSelectedDeviceId, saveSelectedDeviceId, clearSelectedDeviceId, validateToken, signInWithApple, signInWithOAuth, signupWithEmail, loginWithEmail, listReachableDevices, DEFAULT_CONVEX_SITE_URL, DEFAULT_WEB_BASE_URL, DEFAULT_OAUTH_REDIRECT, } from './auth';
68
+ export type { OAuthProvider, User, RemoteDevice, DeviceList, } from './auth';
60
69
  export { captureScreenshot, pickFeedbackFile, startVideoRecording, stopVideoRecording, isVideoRecording, } from './capture';
61
70
  export { uploadFeedback } from './upload';
62
71
  export type { FeedbackConfig, FeedbackBundle, FeedbackMetadata, DeviceInfo, AppInfo, TimelineEvent, FeedbackReport, FeedbackStreamEvent, VoiceCapability, CapturedError, TestFix, TestSession, } from './types';
package/dist/index.js CHANGED
@@ -29,8 +29,8 @@
29
29
  * ```
30
30
  */
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.DEFAULT_WEB_BASE_URL = exports.DEFAULT_CONVEX_SITE_URL = exports.acceptGuestInvitation = exports.acceptGuestByCode = exports.findInviteByCode = exports.fetchGuestHosts = exports.listReachableDevices = exports.loginWithEmail = exports.signupWithEmail = exports.signInWithOAuth = exports.signInWithApple = exports.validateToken = exports.clearSelectedDeviceId = exports.saveSelectedDeviceId = exports.getSelectedDeviceId = exports.saveUser = exports.getUser = exports.clearToken = exports.saveToken = exports.getToken = exports.getWebBaseUrl = exports.getConvexSiteUrl = exports.configureAuthEndpoints = exports.clearQuickIconDisabled = exports.setQuickIconDisabled = exports.getQuickIconDisabled = exports.FixReport = exports.QuickActionIcon = exports.FeedbackModal = exports.FloatingButton = exports.ShakeDetector = exports.AuthOverlay = exports.PairDeviceModal = exports.YaverGuestOnboardingScreen = exports.YaverMachinePickerScreen = exports.YaverLoginScreen = exports.YaverConnectionScreen = exports.RELOAD_APP_PATH = exports.RELOAD_PATH = exports.describeReloadFailure = exports.reloadFrameworkFamily = exports.reloadRequest = exports.reloadActions = exports.P2PClient = exports.YaverDiscovery = exports.initExpo = exports.YaverUpdates = exports.BlackBox = exports.captureStoreScreenshots = exports.YaverFeedback = void 0;
33
- exports.uploadFeedback = exports.isVideoRecording = exports.stopVideoRecording = exports.startVideoRecording = exports.pickFeedbackFile = exports.captureScreenshot = exports.DEFAULT_OAUTH_REDIRECT = void 0;
32
+ exports.saveSelectedDeviceId = exports.getSelectedDeviceId = exports.saveUser = exports.getUser = exports.clearToken = exports.saveToken = exports.getToken = exports.getWebBaseUrl = exports.getConvexSiteUrl = exports.configureAuthEndpoints = exports.clearQuickIconDisabled = exports.setQuickIconDisabled = exports.getQuickIconDisabled = exports.FixReport = exports.QuickActionIcon = exports.FeedbackModal = exports.validateDogfoodProject = exports.runtimeLogLinesFromDevEvent = exports.dogfoodLogLinesFromDevEvent = exports.dogfoodLaneOptions = exports.defaultDogfoodLane = exports.DogfoodRuntimeError = exports.DogfoodController = exports.YaverDeviceDogfood = exports.resolveSDKDogfood = exports.isYaverModeBadgeHidden = exports.showYaverModeBadge = exports.hideYaverModeBadge = exports.YaverModeBadge = exports.FloatingButton = exports.ShakeDetector = exports.AuthOverlay = exports.PairDeviceModal = exports.YaverMachinePickerScreen = exports.YaverLoginScreen = exports.YaverConnectionScreen = exports.RELOAD_APP_PATH = exports.RELOAD_PATH = exports.describeReloadFailure = exports.reloadFrameworkFamily = exports.reloadRequest = exports.reloadActions = exports.createP2PDogfoodDriver = exports.P2PClient = exports.YaverDiscovery = exports.initExpo = exports.YaverUpdates = exports.BlackBox = exports.captureStoreScreenshots = exports.YaverFeedback = void 0;
33
+ exports.uploadFeedback = exports.isVideoRecording = exports.stopVideoRecording = exports.startVideoRecording = exports.pickFeedbackFile = exports.captureScreenshot = exports.DEFAULT_OAUTH_REDIRECT = exports.DEFAULT_WEB_BASE_URL = exports.DEFAULT_CONVEX_SITE_URL = exports.listReachableDevices = exports.loginWithEmail = exports.signupWithEmail = exports.signInWithOAuth = exports.signInWithApple = exports.validateToken = exports.clearSelectedDeviceId = void 0;
34
34
  var YaverFeedback_1 = require("./YaverFeedback");
35
35
  Object.defineProperty(exports, "YaverFeedback", { enumerable: true, get: function () { return YaverFeedback_1.YaverFeedback; } });
36
36
  var storeShots_1 = require("./storeShots");
@@ -45,6 +45,8 @@ var Discovery_1 = require("./Discovery");
45
45
  Object.defineProperty(exports, "YaverDiscovery", { enumerable: true, get: function () { return Discovery_1.YaverDiscovery; } });
46
46
  var P2PClient_1 = require("./P2PClient");
47
47
  Object.defineProperty(exports, "P2PClient", { enumerable: true, get: function () { return P2PClient_1.P2PClient; } });
48
+ var P2PDogfoodDriver_1 = require("./P2PDogfoodDriver");
49
+ Object.defineProperty(exports, "createP2PDogfoodDriver", { enumerable: true, get: function () { return P2PDogfoodDriver_1.createP2PDogfoodDriver; } });
48
50
  var reloadActions_1 = require("./reloadActions");
49
51
  Object.defineProperty(exports, "reloadActions", { enumerable: true, get: function () { return reloadActions_1.reloadActions; } });
50
52
  Object.defineProperty(exports, "reloadRequest", { enumerable: true, get: function () { return reloadActions_1.reloadRequest; } });
@@ -58,8 +60,6 @@ var LoginScreen_1 = require("./LoginScreen");
58
60
  Object.defineProperty(exports, "YaverLoginScreen", { enumerable: true, get: function () { return LoginScreen_1.YaverLoginScreen; } });
59
61
  var MachinePickerScreen_1 = require("./MachinePickerScreen");
60
62
  Object.defineProperty(exports, "YaverMachinePickerScreen", { enumerable: true, get: function () { return MachinePickerScreen_1.YaverMachinePickerScreen; } });
61
- var GuestOnboardingScreen_1 = require("./GuestOnboardingScreen");
62
- Object.defineProperty(exports, "YaverGuestOnboardingScreen", { enumerable: true, get: function () { return GuestOnboardingScreen_1.YaverGuestOnboardingScreen; } });
63
63
  var PairDeviceModal_1 = require("./PairDeviceModal");
64
64
  Object.defineProperty(exports, "PairDeviceModal", { enumerable: true, get: function () { return PairDeviceModal_1.PairDeviceModal; } });
65
65
  var AuthOverlay_1 = require("./AuthOverlay");
@@ -68,6 +68,26 @@ var ShakeDetector_1 = require("./ShakeDetector");
68
68
  Object.defineProperty(exports, "ShakeDetector", { enumerable: true, get: function () { return ShakeDetector_1.ShakeDetector; } });
69
69
  var FloatingButton_1 = require("./FloatingButton");
70
70
  Object.defineProperty(exports, "FloatingButton", { enumerable: true, get: function () { return FloatingButton_1.FloatingButton; } });
71
+ // The polite "you're inside Yaver" mark. Rendered automatically by the SDK's
72
+ // overlay host when config.modeBadge !== false; exported so an app that manages
73
+ // its own overlay tree can place it itself.
74
+ var YaverModeBadge_1 = require("./YaverModeBadge");
75
+ Object.defineProperty(exports, "YaverModeBadge", { enumerable: true, get: function () { return YaverModeBadge_1.YaverModeBadge; } });
76
+ Object.defineProperty(exports, "hideYaverModeBadge", { enumerable: true, get: function () { return YaverModeBadge_1.hideYaverModeBadge; } });
77
+ Object.defineProperty(exports, "showYaverModeBadge", { enumerable: true, get: function () { return YaverModeBadge_1.showYaverModeBadge; } });
78
+ Object.defineProperty(exports, "isYaverModeBadgeHidden", { enumerable: true, get: function () { return YaverModeBadge_1.isYaverModeBadgeHidden; } });
79
+ var dogfoodPolicy_1 = require("./dogfoodPolicy");
80
+ Object.defineProperty(exports, "resolveSDKDogfood", { enumerable: true, get: function () { return dogfoodPolicy_1.resolveSDKDogfood; } });
81
+ var deviceDogfood_1 = require("./deviceDogfood");
82
+ Object.defineProperty(exports, "YaverDeviceDogfood", { enumerable: true, get: function () { return deviceDogfood_1.YaverDeviceDogfood; } });
83
+ var DogfoodRuntime_1 = require("./DogfoodRuntime");
84
+ Object.defineProperty(exports, "DogfoodController", { enumerable: true, get: function () { return DogfoodRuntime_1.DogfoodController; } });
85
+ Object.defineProperty(exports, "DogfoodRuntimeError", { enumerable: true, get: function () { return DogfoodRuntime_1.DogfoodRuntimeError; } });
86
+ Object.defineProperty(exports, "defaultDogfoodLane", { enumerable: true, get: function () { return DogfoodRuntime_1.defaultDogfoodLane; } });
87
+ Object.defineProperty(exports, "dogfoodLaneOptions", { enumerable: true, get: function () { return DogfoodRuntime_1.dogfoodLaneOptions; } });
88
+ Object.defineProperty(exports, "dogfoodLogLinesFromDevEvent", { enumerable: true, get: function () { return DogfoodRuntime_1.dogfoodLogLinesFromDevEvent; } });
89
+ Object.defineProperty(exports, "runtimeLogLinesFromDevEvent", { enumerable: true, get: function () { return DogfoodRuntime_1.runtimeLogLinesFromDevEvent; } });
90
+ Object.defineProperty(exports, "validateDogfoodProject", { enumerable: true, get: function () { return DogfoodRuntime_1.validateDogfoodProject; } });
71
91
  var FeedbackModal_1 = require("./FeedbackModal");
72
92
  Object.defineProperty(exports, "FeedbackModal", { enumerable: true, get: function () { return FeedbackModal_1.FeedbackModal; } });
73
93
  var QuickActionIcon_1 = require("./QuickActionIcon");
@@ -96,10 +116,6 @@ Object.defineProperty(exports, "signInWithOAuth", { enumerable: true, get: funct
96
116
  Object.defineProperty(exports, "signupWithEmail", { enumerable: true, get: function () { return auth_1.signupWithEmail; } });
97
117
  Object.defineProperty(exports, "loginWithEmail", { enumerable: true, get: function () { return auth_1.loginWithEmail; } });
98
118
  Object.defineProperty(exports, "listReachableDevices", { enumerable: true, get: function () { return auth_1.listReachableDevices; } });
99
- Object.defineProperty(exports, "fetchGuestHosts", { enumerable: true, get: function () { return auth_1.fetchGuestHosts; } });
100
- Object.defineProperty(exports, "findInviteByCode", { enumerable: true, get: function () { return auth_1.findInviteByCode; } });
101
- Object.defineProperty(exports, "acceptGuestByCode", { enumerable: true, get: function () { return auth_1.acceptGuestByCode; } });
102
- Object.defineProperty(exports, "acceptGuestInvitation", { enumerable: true, get: function () { return auth_1.acceptGuestInvitation; } });
103
119
  Object.defineProperty(exports, "DEFAULT_CONVEX_SITE_URL", { enumerable: true, get: function () { return auth_1.DEFAULT_CONVEX_SITE_URL; } });
104
120
  Object.defineProperty(exports, "DEFAULT_WEB_BASE_URL", { enumerable: true, get: function () { return auth_1.DEFAULT_WEB_BASE_URL; } });
105
121
  Object.defineProperty(exports, "DEFAULT_OAUTH_REDIRECT", { enumerable: true, get: function () { return auth_1.DEFAULT_OAUTH_REDIRECT; } });
@@ -34,9 +34,9 @@
34
34
  // ── Auth ─────────────────────────────────────────────────────────────────────
35
35
  //
36
36
  // None of this needs a new secret. `/dev/reload` and `/dev/reload-app` are
37
- // registered under `authSDKOrGuest` (desktop/agent/httpserver.go), the same
37
+ // registered under `authSDK` (desktop/agent/httpserver.go), the same
38
38
  // middleware that already admits the bearer this SDK sends with its feedback
39
- // POST. A scope-limited SDK token needs the existing `guest-reload` scope,
39
+ // POST. A scope-limited SDK token needs the existing `reload` scope,
40
40
  // whose path list already contains both routes — no widening, no new gate.
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.RELOAD_APP_PATH = exports.RELOAD_PATH = void 0;
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { BlackBoxConfig } from './BlackBox';
2
+ import type { SDKDogfoodConfig } from './dogfoodPolicy';
2
3
  /**
3
4
  * Remote browser-style sign-in session for a coding-agent CLI on the
4
5
  * connected yaver host. Mirrors runnerBrowserAuthSession on the agent
@@ -32,6 +33,13 @@ export interface RunnerAuthStatusRow {
32
33
  path?: string;
33
34
  detail?: string;
34
35
  version?: string;
36
+ isDefault?: boolean;
37
+ models?: Array<{
38
+ id: string;
39
+ name?: string;
40
+ provider?: string;
41
+ isDefault?: boolean;
42
+ }>;
35
43
  }
36
44
  export interface OpenCodeProviderSummary {
37
45
  id: string;
@@ -141,6 +149,40 @@ export interface StoreShotsConfig {
141
149
  export interface FeedbackConfig {
142
150
  /** URL of the Yaver agent (e.g. "http://192.168.1.10:18080"). If omitted, auto-discovery is used. */
143
151
  agentUrl?: string;
152
+ /** Optional coding route. Defaults to agentUrl. */
153
+ codingAgentUrl?: string;
154
+ /** Optional render/reload route. Defaults to codingAgentUrl/agentUrl. */
155
+ renderAgentUrl?: string;
156
+ /** Device identities shown in the unified Settings card when routes differ. */
157
+ codingDeviceId?: string;
158
+ renderDeviceId?: string;
159
+ /**
160
+ * Show the small "Y" mark while this app is running INSIDE Yaver's container
161
+ * (a Hermes-pushed development bundle), so a tester can tell it apart from
162
+ * the build they installed — and can find the way back.
163
+ *
164
+ * DEFAULT TRUE. The failure it prevents is silent and lands on a tester
165
+ * rather than a developer: an app that looks installed but is someone's
166
+ * branch produces "bug reports" against unfinished work, and a tester with
167
+ * no visible way out is simply stuck. That class should not be opt-in.
168
+ *
169
+ * Costs nothing in a standalone build — outside Yaver's container the badge
170
+ * renders null (the YaverInfo native module is absent), so shipping with it
171
+ * enabled has no effect on what your users see.
172
+ *
173
+ * Set false if your app already shows its own in-container indicator, or if
174
+ * a pixel-exact surface cannot spare 22 points in a corner.
175
+ */
176
+ modeBadge?: boolean;
177
+ /** Corner for the mode badge. Default 'bottom-left' — bottom-right is where
178
+ * most apps put a FAB, and the badge must never compete with the app's own
179
+ * primary action. */
180
+ modeBadgePosition?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
181
+ /** Account-scoped direct Dogfood UX for an approved third-party app.
182
+ * When the current app account is allowlisted, the small Y opens Vibing
183
+ * directly instead of the normal feedback actions. This is a client UX gate,
184
+ * never an authentication mechanism; agent calls still require Yaver auth. */
185
+ dogfood?: SDKDogfoodConfig;
144
186
  /**
145
187
  * Enables the overlay's "App Store screenshots" action + the
146
188
  * `capture_store_shots` remote command. The host supplies the route
@@ -220,6 +262,14 @@ export interface FeedbackConfig {
220
262
  voiceCapabilities?: string[];
221
263
  sttProvider?: string;
222
264
  ttsProvider?: string;
265
+ /**
266
+ * Opt in to the microphone/STT controls in the feedback Vibing card.
267
+ *
268
+ * This is deliberately false unless explicitly enabled: ordinary phone
269
+ * and tablet surfaces stay keyboard-first. Car/watch-style hosts that are
270
+ * inherently voice-driven may set this to true.
271
+ */
272
+ voiceInputEnabled?: boolean;
223
273
  /** How feedback collection is triggered */
224
274
  trigger?: 'shake' | 'floating-button' | 'manual';
225
275
  /**
@@ -463,13 +513,6 @@ export interface FeedbackConfig {
463
513
  * Default: false (preserve historical behavior).
464
514
  */
465
515
  strictNativeAuth?: boolean;
466
- /**
467
- * Optional host invite code to prefill into the in-SDK guest onboarding
468
- * flow. Useful when your app receives the code from a deep link, QR flow,
469
- * or an out-of-band host handoff and you want the user to redeem it
470
- * without typing.
471
- */
472
- guestInviteCode?: string;
473
516
  }
474
517
  export interface FeedbackBundle {
475
518
  metadata: FeedbackMetadata;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yaver-feedback-react-native",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "Visual feedback SDK for Yaver — bug reports, screen recording, voice vibe coding, and local-first developer workflows",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,10 +28,13 @@
28
28
  "react-native-record-screen": ">=0.0.10",
29
29
  "expo-av": ">=14.0.0",
30
30
  "expo-file-system": ">=16.0.0",
31
- "expo-speech": ">=12.0.0"
31
+ "expo-speech": ">=12.0.0",
32
+ "expo-secure-store": ">=13.0.0",
33
+ "expo-crypto": ">=13.0.0"
32
34
  },
33
35
  "dependencies": {
34
- "buffer": "^6.0.3"
36
+ "buffer": "^6.0.3",
37
+ "tweetnacl": "^1.0.3"
35
38
  },
36
39
  "peerDependenciesMeta": {
37
40
  "expo-file-system": {
@@ -40,6 +43,12 @@
40
43
  "expo-speech": {
41
44
  "optional": true
42
45
  },
46
+ "expo-secure-store": {
47
+ "optional": true
48
+ },
49
+ "expo-crypto": {
50
+ "optional": true
51
+ },
43
52
  "@expo/config-plugins": {
44
53
  "optional": true
45
54
  },
@@ -2,83 +2,50 @@ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { DeviceEventEmitter, Modal } from 'react-native';
3
3
  import { YaverLoginScreen } from './LoginScreen';
4
4
  import { YaverMachinePickerScreen } from './MachinePickerScreen';
5
- import { YaverGuestOnboardingScreen } from './GuestOnboardingScreen';
6
5
  import { YaverFeedback } from './YaverFeedback';
7
- import { getToken, RemoteDevice, listReachableDevices } from './auth';
6
+ import { getToken, RemoteDevice } from './auth';
8
7
 
9
- /**
10
- * Presentation layer for the SDK's auth + machine-picker modals.
11
- *
12
- * Mounts automatically inside `<FeedbackModal />`, so consumers of the SDK
13
- * get in-app login with no extra wiring. It listens for events emitted by
14
- * `YaverFeedback.showLogin()` / `showMachinePicker()`:
15
- *
16
- * yaverFeedback:startLogin → show login modal
17
- * yaverFeedback:startMachinePicker → show machine picker
18
- *
19
- * The overlay closes itself once login/pick succeeds, then re-emits
20
- * `yaverFeedback:startReport` so the user continues straight into the
21
- * feedback flow they originally triggered.
22
- */
8
+ /** Owner sign-in and owner-machine selection for the Feedback SDK. */
23
9
  export const AuthOverlay: React.FC = () => {
24
10
  const [loginVisible, setLoginVisible] = useState(false);
25
- const [guestVisible, setGuestVisible] = useState(false);
26
11
  const [pickerVisible, setPickerVisible] = useState(false);
27
12
  const [token, setToken] = useState<string | null>(null);
28
- const [pendingInviteCode, setPendingInviteCode] = useState<string | null>(null);
29
- const activeOverlayRef = useRef<'none' | 'login' | 'guest' | 'picker'>('none');
13
+ const activeOverlayRef = useRef<'none' | 'login' | 'picker'>('none');
30
14
 
31
15
  const openLogin = useCallback(() => {
32
16
  activeOverlayRef.current = 'login';
33
- setGuestVisible(false);
34
17
  setPickerVisible(false);
35
18
  setLoginVisible(true);
36
19
  }, []);
37
20
 
38
- const openGuest = useCallback(() => {
39
- activeOverlayRef.current = 'guest';
40
- setLoginVisible(false);
41
- setPickerVisible(false);
42
- setGuestVisible(true);
43
- }, []);
44
-
45
21
  const openPicker = useCallback(() => {
46
22
  activeOverlayRef.current = 'picker';
47
23
  setLoginVisible(false);
48
- setGuestVisible(false);
49
24
  setPickerVisible(true);
50
25
  }, []);
51
26
 
52
27
  const closeAll = useCallback(() => {
53
28
  activeOverlayRef.current = 'none';
54
29
  setLoginVisible(false);
55
- setGuestVisible(false);
56
30
  setPickerVisible(false);
57
31
  }, []);
58
32
 
59
33
  useEffect(() => {
60
34
  let mounted = true;
61
- (async () => {
62
- const cached = await getToken();
35
+ void getToken().then((cached) => {
63
36
  if (mounted && cached) setToken(cached);
64
- })();
65
-
66
- const loginSub = DeviceEventEmitter.addListener(
67
- 'yaverFeedback:startLogin',
68
- () => {
69
- if (activeOverlayRef.current !== 'none') return;
70
- openLogin();
71
- },
72
- );
73
- const pickerSub = DeviceEventEmitter.addListener(
74
- 'yaverFeedback:startMachinePicker',
75
- async () => {
76
- if (activeOverlayRef.current !== 'none') return;
77
- const cached = await getToken();
78
- if (cached) setToken(cached);
79
- if (cached) openPicker();
80
- },
81
- );
37
+ });
38
+ const loginSub = DeviceEventEmitter.addListener('yaverFeedback:startLogin', () => {
39
+ if (activeOverlayRef.current === 'none') openLogin();
40
+ });
41
+ const pickerSub = DeviceEventEmitter.addListener('yaverFeedback:startMachinePicker', async () => {
42
+ if (activeOverlayRef.current !== 'none') return;
43
+ const cached = await getToken();
44
+ if (cached) {
45
+ setToken(cached);
46
+ openPicker();
47
+ }
48
+ });
82
49
  return () => {
83
50
  mounted = false;
84
51
  loginSub.remove();
@@ -86,55 +53,24 @@ export const AuthOverlay: React.FC = () => {
86
53
  };
87
54
  }, [openLogin, openPicker]);
88
55
 
89
- const continueAfterAuth = async (newToken: string, inviteCode?: string) => {
56
+ const handleLoggedIn = async (newToken: string) => {
90
57
  setToken(newToken);
91
58
  await YaverFeedback.setAuthToken(newToken);
92
- const devices = await listReachableDevices(newToken).catch(() => ({ owned: [], shared: [] }));
93
- const cleanedInviteCode = (inviteCode ?? '').trim().toUpperCase();
94
- if (cleanedInviteCode) {
95
- setPendingInviteCode(cleanedInviteCode);
96
- openGuest();
97
- return;
98
- }
99
- if (devices.owned.length === 0 && devices.shared.length === 0) {
100
- openGuest();
101
- return;
102
- }
103
59
  openPicker();
104
60
  };
105
61
 
106
- const handleLoggedIn = async (newToken: string, opts?: { inviteCode?: string }) => {
107
- await continueAfterAuth(newToken, opts?.inviteCode);
108
- };
109
-
110
62
  const handleDevicePicked = async (device: RemoteDevice) => {
111
63
  await YaverFeedback.setPreferredDevice(device.deviceId);
112
64
  closeAll();
113
- // Continue straight into the feedback flow the user originally triggered.
114
65
  DeviceEventEmitter.emit('yaverFeedback:startReport');
115
66
  };
116
67
 
117
68
  return (
118
69
  <>
119
- <Modal
120
- visible={loginVisible}
121
- animationType="slide"
122
- presentationStyle="fullScreen"
123
- onRequestClose={closeAll}
124
- >
125
- <YaverLoginScreen
126
- onLoggedIn={handleLoggedIn}
127
- onCancel={closeAll}
128
- initialInviteCode={pendingInviteCode ?? YaverFeedback.getConfig()?.guestInviteCode}
129
- />
70
+ <Modal visible={loginVisible} animationType="slide" presentationStyle="fullScreen" onRequestClose={closeAll}>
71
+ <YaverLoginScreen onLoggedIn={handleLoggedIn} onCancel={closeAll} />
130
72
  </Modal>
131
-
132
- <Modal
133
- visible={pickerVisible && !!token}
134
- animationType="slide"
135
- presentationStyle="fullScreen"
136
- onRequestClose={closeAll}
137
- >
73
+ <Modal visible={pickerVisible && !!token} animationType="slide" presentationStyle="fullScreen" onRequestClose={closeAll}>
138
74
  {token && (
139
75
  <YaverMachinePickerScreen
140
76
  token={token}
@@ -144,28 +80,6 @@ export const AuthOverlay: React.FC = () => {
144
80
  />
145
81
  )}
146
82
  </Modal>
147
-
148
- <Modal
149
- visible={guestVisible && !!token}
150
- animationType="slide"
151
- presentationStyle="fullScreen"
152
- onRequestClose={closeAll}
153
- >
154
- {token && (
155
- <YaverGuestOnboardingScreen
156
- token={token}
157
- initialInviteCode={pendingInviteCode ?? YaverFeedback.getConfig()?.guestInviteCode}
158
- onContinue={() => {
159
- setPendingInviteCode(null);
160
- openPicker();
161
- }}
162
- onCancel={() => {
163
- setPendingInviteCode(null);
164
- openPicker();
165
- }}
166
- />
167
- )}
168
- </Modal>
169
83
  </>
170
84
  );
171
85
  };
package/src/Discovery.ts CHANGED
@@ -195,12 +195,6 @@ export class YaverDiscovery {
195
195
  needsAuth: !!d.needsAuth,
196
196
  runnerDown: !!d.runnerDown,
197
197
  lastHeartbeat: d.lastHeartbeat ?? 0,
198
- isGuest: !!d.isGuest,
199
- hostUserId: d.hostUserId,
200
- hostName: d.hostName,
201
- hostEmail: d.hostEmail,
202
- hostUserIdString: d.hostUserIdString,
203
- accessScope: d.accessScope ?? 'owner',
204
198
  quicHost: d.quicHost ?? d.host ?? '',
205
199
  quicPort: d.quicPort ?? 0,
206
200
  httpPort: d.httpPort ?? d.quicPort,