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.
- package/README.md +102 -1
- package/dist/AuthOverlay.d.ts +1 -14
- package/dist/AuthOverlay.js +9 -62
- package/dist/Discovery.js +0 -6
- package/dist/DogfoodRuntime.d.ts +124 -0
- package/dist/DogfoodRuntime.js +273 -0
- package/dist/FeedbackModal.js +347 -61
- package/dist/LoginScreen.d.ts +1 -5
- package/dist/LoginScreen.js +2 -6
- package/dist/MachinePickerScreen.d.ts +1 -3
- package/dist/MachinePickerScreen.js +6 -18
- package/dist/P2PClient.d.ts +116 -3
- package/dist/P2PClient.js +273 -3
- package/dist/P2PDogfoodDriver.d.ts +12 -0
- package/dist/P2PDogfoodDriver.js +118 -0
- package/dist/PairDeviceModal.d.ts +2 -3
- package/dist/ShakeDetector.js +31 -17
- package/dist/VibeChatScreen.d.ts +11 -1
- package/dist/VibeChatScreen.js +200 -41
- package/dist/YaverFeedback.d.ts +34 -0
- package/dist/YaverFeedback.js +124 -19
- package/dist/YaverModeBadge.d.ts +22 -0
- package/dist/YaverModeBadge.js +219 -0
- package/dist/__tests__/AuthDevices.test.js +1 -48
- package/dist/__tests__/DogfoodRuntime.test.d.ts +1 -0
- package/dist/__tests__/DogfoodRuntime.test.js +116 -0
- package/dist/__tests__/P2PDogfoodDriver.test.d.ts +1 -0
- package/dist/__tests__/P2PDogfoodDriver.test.js +64 -0
- package/dist/__tests__/ReportIdentity.test.d.ts +25 -1
- package/dist/__tests__/ReportIdentity.test.js +34 -22
- package/dist/__tests__/ShakeDetectorWeb.test.d.ts +1 -0
- package/dist/__tests__/ShakeDetectorWeb.test.js +27 -0
- package/dist/__tests__/YaverFeedback.test.js +13 -3
- package/dist/__tests__/deviceDogfood.test.d.ts +1 -0
- package/dist/__tests__/deviceDogfood.test.js +86 -0
- package/dist/__tests__/dogfoodPolicy.test.d.ts +1 -0
- package/dist/__tests__/dogfoodPolicy.test.js +33 -0
- package/dist/_core/ansi.d.ts +117 -0
- package/dist/_core/ansi.js +468 -0
- package/dist/_core/ansi.test.d.ts +1 -0
- package/dist/_core/ansi.test.js +225 -0
- package/dist/_core/buildFeedbackPrompt.d.ts +4 -9
- package/dist/_core/buildFeedbackPrompt.js +18 -72
- package/dist/_core/constants.d.ts +19 -6
- package/dist/_core/constants.js +20 -7
- package/dist/_core/device.d.ts +9 -23
- package/dist/_core/device.js +13 -28
- package/dist/_core/endpoints.d.ts +0 -7
- package/dist/_core/endpoints.js +0 -7
- package/dist/_core/index.d.ts +4 -0
- package/dist/_core/index.js +4 -0
- package/dist/_core/remoteless.d.ts +44 -0
- package/dist/_core/remoteless.js +75 -0
- package/dist/_core/trace.d.ts +47 -0
- package/dist/_core/trace.js +38 -0
- package/dist/_core/trace.test.d.ts +1 -0
- package/dist/_core/trace.test.js +60 -0
- package/dist/auth.d.ts +3 -60
- package/dist/auth.js +6 -88
- package/dist/deviceDogfood.d.ts +53 -0
- package/dist/deviceDogfood.js +137 -0
- package/dist/dogfoodPolicy.d.ts +25 -0
- package/dist/dogfoodPolicy.js +24 -0
- package/dist/index.d.ts +13 -4
- package/dist/index.js +24 -8
- package/dist/reloadActions.js +2 -2
- package/dist/types.d.ts +50 -7
- package/package.json +12 -3
- package/src/AuthOverlay.tsx +20 -106
- package/src/Discovery.ts +0 -6
- package/src/DogfoodRuntime.ts +373 -0
- package/src/FeedbackModal.tsx +445 -67
- package/src/LoginScreen.tsx +2 -22
- package/src/MachinePickerScreen.tsx +6 -21
- package/src/P2PClient.ts +347 -4
- package/src/P2PDogfoodDriver.ts +132 -0
- package/src/PairDeviceModal.tsx +2 -3
- package/src/ShakeDetector.ts +31 -18
- package/src/VibeChatScreen.tsx +232 -42
- package/src/YaverFeedback.ts +133 -22
- package/src/YaverModeBadge.tsx +234 -0
- package/src/__tests__/AuthDevices.test.ts +1 -52
- package/src/__tests__/DogfoodRuntime.test.ts +135 -0
- package/src/__tests__/P2PDogfoodDriver.test.ts +80 -0
- package/src/__tests__/ReportIdentity.test.ts +36 -27
- package/src/__tests__/ShakeDetectorWeb.test.ts +30 -0
- package/src/__tests__/YaverFeedback.test.ts +15 -3
- package/src/__tests__/deviceDogfood.test.ts +77 -0
- package/src/__tests__/dogfoodPolicy.test.ts +34 -0
- package/src/_core/ansi.test.ts +250 -0
- package/src/_core/ansi.ts +475 -0
- package/src/_core/buildFeedbackPrompt.ts +18 -95
- package/src/_core/constants.ts +20 -6
- package/src/_core/device.ts +13 -30
- package/src/_core/endpoints.ts +0 -7
- package/src/_core/index.ts +4 -0
- package/src/_core/remoteless.ts +110 -0
- package/src/_core/trace.test.ts +58 -0
- package/src/_core/trace.ts +75 -0
- package/src/auth.ts +7 -156
- package/src/deviceDogfood.ts +171 -0
- package/src/dogfoodPolicy.ts +40 -0
- package/src/index.ts +40 -11
- package/src/reloadActions.ts +2 -2
- package/src/types.ts +45 -7
- package/dist/GuestOnboardingScreen.d.ts +0 -8
- package/dist/GuestOnboardingScreen.js +0 -282
- 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,
|
|
59
|
-
export type { OAuthProvider, User, RemoteDevice, DeviceList,
|
|
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.
|
|
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; } });
|
package/dist/reloadActions.js
CHANGED
|
@@ -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 `
|
|
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 `
|
|
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.
|
|
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
|
},
|
package/src/AuthOverlay.tsx
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
62
|
-
const cached = await getToken();
|
|
35
|
+
void getToken().then((cached) => {
|
|
63
36
|
if (mounted && cached) setToken(cached);
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
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
|
-
|
|
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,
|