@tapthrough/expo 0.0.0-stage → 0.1.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.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -2
  3. package/app.plugin.d.ts +37 -0
  4. package/app.plugin.js +79 -0
  5. package/dist/Annotator.d.ts +14 -0
  6. package/dist/Annotator.d.ts.map +1 -0
  7. package/dist/Annotator.js +160 -0
  8. package/dist/Annotator.js.map +1 -0
  9. package/dist/Bubble.d.ts +27 -0
  10. package/dist/Bubble.d.ts.map +1 -0
  11. package/dist/Bubble.js +234 -0
  12. package/dist/Bubble.js.map +1 -0
  13. package/dist/Feedback.d.ts +14 -0
  14. package/dist/Feedback.d.ts.map +1 -0
  15. package/dist/Feedback.js +977 -0
  16. package/dist/Feedback.js.map +1 -0
  17. package/dist/Overlay.d.ts +13 -0
  18. package/dist/Overlay.d.ts.map +1 -0
  19. package/dist/Overlay.js +44 -0
  20. package/dist/Overlay.js.map +1 -0
  21. package/dist/Popover.d.ts +98 -0
  22. package/dist/Popover.d.ts.map +1 -0
  23. package/dist/Popover.js +531 -0
  24. package/dist/Popover.js.map +1 -0
  25. package/dist/Tapthrough.d.ts +27 -0
  26. package/dist/Tapthrough.d.ts.map +1 -0
  27. package/dist/Tapthrough.js +111 -0
  28. package/dist/Tapthrough.js.map +1 -0
  29. package/dist/core/annotations.d.ts +63 -0
  30. package/dist/core/annotations.d.ts.map +1 -0
  31. package/dist/core/annotations.js +76 -0
  32. package/dist/core/annotations.js.map +1 -0
  33. package/dist/core/bubble.d.ts +21 -0
  34. package/dist/core/bubble.d.ts.map +1 -0
  35. package/dist/core/bubble.js +25 -0
  36. package/dist/core/bubble.js.map +1 -0
  37. package/dist/core/controller.d.ts +46 -0
  38. package/dist/core/controller.d.ts.map +1 -0
  39. package/dist/core/controller.js +103 -0
  40. package/dist/core/controller.js.map +1 -0
  41. package/dist/core/diagnostics.d.ts +47 -0
  42. package/dist/core/diagnostics.d.ts.map +1 -0
  43. package/dist/core/diagnostics.js +101 -0
  44. package/dist/core/diagnostics.js.map +1 -0
  45. package/dist/core/feedback.d.ts +302 -0
  46. package/dist/core/feedback.d.ts.map +1 -0
  47. package/dist/core/feedback.js +345 -0
  48. package/dist/core/feedback.js.map +1 -0
  49. package/dist/core/flags.d.ts +13 -0
  50. package/dist/core/flags.d.ts.map +1 -0
  51. package/dist/core/flags.js +25 -0
  52. package/dist/core/flags.js.map +1 -0
  53. package/dist/core/ideas.d.ts +166 -0
  54. package/dist/core/ideas.d.ts.map +1 -0
  55. package/dist/core/ideas.js +159 -0
  56. package/dist/core/ideas.js.map +1 -0
  57. package/dist/core/launch.d.ts +43 -0
  58. package/dist/core/launch.d.ts.map +1 -0
  59. package/dist/core/launch.js +81 -0
  60. package/dist/core/launch.js.map +1 -0
  61. package/dist/core/reset.d.ts +17 -0
  62. package/dist/core/reset.d.ts.map +1 -0
  63. package/dist/core/reset.js +19 -0
  64. package/dist/core/reset.js.map +1 -0
  65. package/dist/core/review.d.ts +49 -0
  66. package/dist/core/review.d.ts.map +1 -0
  67. package/dist/core/review.js +92 -0
  68. package/dist/core/review.js.map +1 -0
  69. package/dist/core/url.d.ts +9 -0
  70. package/dist/core/url.d.ts.map +1 -0
  71. package/dist/core/url.js +23 -0
  72. package/dist/core/url.js.map +1 -0
  73. package/dist/hooks.d.ts +6 -0
  74. package/dist/hooks.d.ts.map +1 -0
  75. package/dist/hooks.js +13 -0
  76. package/dist/hooks.js.map +1 -0
  77. package/dist/index.d.ts +9 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +7 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/native-intent.d.ts +18 -0
  82. package/dist/native-intent.d.ts.map +1 -0
  83. package/dist/native-intent.js +32 -0
  84. package/dist/native-intent.js.map +1 -0
  85. package/dist/runtime.d.ts +24 -0
  86. package/dist/runtime.d.ts.map +1 -0
  87. package/dist/runtime.js +17 -0
  88. package/dist/runtime.js.map +1 -0
  89. package/dist/screenshot.d.ts +7 -0
  90. package/dist/screenshot.d.ts.map +1 -0
  91. package/dist/screenshot.js +48 -0
  92. package/dist/screenshot.js.map +1 -0
  93. package/dist/supabase.d.ts +20 -0
  94. package/dist/supabase.d.ts.map +1 -0
  95. package/dist/supabase.js +18 -0
  96. package/dist/supabase.js.map +1 -0
  97. package/dist/ui/native.d.ts +34 -0
  98. package/dist/ui/native.d.ts.map +1 -0
  99. package/dist/ui/native.js +76 -0
  100. package/dist/ui/native.js.map +1 -0
  101. package/dist/ui/parts.d.ts +62 -0
  102. package/dist/ui/parts.d.ts.map +1 -0
  103. package/dist/ui/parts.js +110 -0
  104. package/dist/ui/parts.js.map +1 -0
  105. package/dist/ui/theme.d.ts +90 -0
  106. package/dist/ui/theme.d.ts.map +1 -0
  107. package/dist/ui/theme.js +61 -0
  108. package/dist/ui/theme.js.map +1 -0
  109. package/package.json +82 -3
  110. package/src/Annotator.tsx +279 -0
  111. package/src/Bubble.tsx +331 -0
  112. package/src/Feedback.tsx +1739 -0
  113. package/src/Overlay.tsx +61 -0
  114. package/src/Popover.tsx +1393 -0
  115. package/src/Tapthrough.tsx +171 -0
  116. package/src/core/annotations.ts +116 -0
  117. package/src/core/bubble.ts +45 -0
  118. package/src/core/controller.ts +119 -0
  119. package/src/core/diagnostics.ts +128 -0
  120. package/src/core/feedback.ts +589 -0
  121. package/src/core/flags.ts +31 -0
  122. package/src/core/ideas.ts +337 -0
  123. package/src/core/launch.ts +119 -0
  124. package/src/core/reset.ts +28 -0
  125. package/src/core/review.ts +148 -0
  126. package/src/core/url.ts +21 -0
  127. package/src/hooks.ts +15 -0
  128. package/src/index.ts +8 -0
  129. package/src/native-intent.ts +36 -0
  130. package/src/runtime.ts +30 -0
  131. package/src/screenshot.ts +64 -0
  132. package/src/supabase.ts +27 -0
  133. package/src/ui/native.ts +116 -0
  134. package/src/ui/parts.tsx +249 -0
  135. package/src/ui/theme.ts +75 -0
@@ -0,0 +1,47 @@
1
+ /** What a report carries about the moments before it: bounded, scrubbed, no request bodies. */
2
+ export interface Diagnostics {
3
+ screens: {
4
+ path: string;
5
+ at: number;
6
+ }[];
7
+ logs: {
8
+ level: 'error' | 'warn';
9
+ message: string;
10
+ at: number;
11
+ }[];
12
+ requests: {
13
+ method: string;
14
+ path: string;
15
+ status: number;
16
+ at: number;
17
+ }[];
18
+ }
19
+ /** Removes credentials from text: query params, Bearer headers and JWT-looking strings. */
20
+ export declare function redact(text: string): string;
21
+ /** Host and path only: query strings often carry tokens or personal data. */
22
+ export declare function requestPath(url: string): string;
23
+ export declare function createDiagnostics(now?: () => number): {
24
+ recordScreen(path: string): void;
25
+ recordLog(level: "error" | "warn", args: unknown[]): void;
26
+ recordRequest(method: string, url: string, status: number): void;
27
+ snapshot(): Diagnostics;
28
+ };
29
+ export type DiagnosticsRecorder = ReturnType<typeof createDiagnostics>;
30
+ interface Hooks {
31
+ console: Pick<Console, 'error' | 'warn'>;
32
+ errorUtils?: {
33
+ getGlobalHandler(): (error: unknown, isFatal?: boolean) => void;
34
+ setGlobalHandler(handler: (error: unknown, isFatal?: boolean) => void): void;
35
+ };
36
+ fetchHost: {
37
+ fetch: typeof fetch;
38
+ };
39
+ }
40
+ /**
41
+ * Starts recording console errors and warnings, uncaught errors and failed
42
+ * requests. Each hook calls through to the original, so the app behaves the
43
+ * same. Requests to `ignoreUrl` (Tapthrough itself) are skipped.
44
+ */
45
+ export declare function installDiagnostics(recorder: DiagnosticsRecorder, hooks: Hooks, ignoreUrl: string): void;
46
+ export {};
47
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/core/diagnostics.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACvC,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAChE,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACzE;AAID,2FAA2F;AAC3F,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ3C;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAqBD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,MAAiB;uBAMvC,MAAM;qBAIR,OAAO,GAAG,MAAM,QAAQ,OAAO,EAAE;0BAG5B,MAAM,OAAO,MAAM,UAAU,MAAM;gBAY7C,WAAW;EAI1B;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEtE,UAAU,KAAK;IACb,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,CAAA;IACxC,UAAU,CAAC,EAAE;QACX,gBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;QAC/D,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAA;KAC7E,CAAA;IACD,SAAS,EAAE;QAAE,KAAK,EAAE,OAAO,KAAK,CAAA;KAAE,CAAA;CACnC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,QAkChG"}
@@ -0,0 +1,101 @@
1
+ const LIMITS = { screens: 20, logs: 20, requests: 10 };
2
+ /** Removes credentials from text: query params, Bearer headers and JWT-looking strings. */
3
+ export function redact(text) {
4
+ return text
5
+ .replace(/\b(access_token|refresh_token|id_token|token|apikey|api_key|key|password|secret|t)=([^&\s"']+)/gi, '$1=[redacted]')
6
+ .replace(/\bBearer\s+[^\s"']+/gi, 'Bearer [redacted]')
7
+ .replace(/\beyJ[\w-]+\.[\w-]+\.[\w-]+/g, '[jwt]');
8
+ }
9
+ /** Host and path only: query strings often carry tokens or personal data. */
10
+ export function requestPath(url) {
11
+ const [withoutQuery = ''] = url.split(/[?#]/);
12
+ const match = /^[a-z][a-z0-9+.-]*:\/\/([^/]+)(\/.*)?$/i.exec(withoutQuery);
13
+ return redact(match ? `${match[1]}${match[2] ?? '/'}` : withoutQuery);
14
+ }
15
+ function format(args) {
16
+ return args
17
+ .map((arg) => {
18
+ if (typeof arg === 'string')
19
+ return arg;
20
+ if (arg instanceof Error)
21
+ return `${arg.name}: ${arg.message}`;
22
+ try {
23
+ return JSON.stringify(arg);
24
+ }
25
+ catch {
26
+ return String(arg);
27
+ }
28
+ })
29
+ .join(' ');
30
+ }
31
+ function push(list, item, max) {
32
+ list.push(item);
33
+ if (list.length > max)
34
+ list.splice(0, list.length - max);
35
+ }
36
+ export function createDiagnostics(now = Date.now) {
37
+ const screens = [];
38
+ const logs = [];
39
+ const requests = [];
40
+ return {
41
+ recordScreen(path) {
42
+ if (screens.at(-1)?.path === path)
43
+ return;
44
+ push(screens, { path: requestPath(path), at: now() }, LIMITS.screens);
45
+ },
46
+ recordLog(level, args) {
47
+ push(logs, { level, message: redact(format(args)).slice(0, 500), at: now() }, LIMITS.logs);
48
+ },
49
+ recordRequest(method, url, status) {
50
+ push(requests, {
51
+ method: method.toUpperCase().slice(0, 10),
52
+ path: requestPath(url).slice(0, 300),
53
+ status,
54
+ at: now(),
55
+ }, LIMITS.requests);
56
+ },
57
+ snapshot() {
58
+ return { screens: [...screens], logs: [...logs], requests: [...requests] };
59
+ },
60
+ };
61
+ }
62
+ /**
63
+ * Starts recording console errors and warnings, uncaught errors and failed
64
+ * requests. Each hook calls through to the original, so the app behaves the
65
+ * same. Requests to `ignoreUrl` (Tapthrough itself) are skipped.
66
+ */
67
+ export function installDiagnostics(recorder, hooks, ignoreUrl) {
68
+ const { console: target, errorUtils, fetchHost } = hooks;
69
+ for (const level of ['error', 'warn']) {
70
+ const original = target[level].bind(target);
71
+ target[level] = (...args) => {
72
+ recorder.recordLog(level, args);
73
+ original(...args);
74
+ };
75
+ }
76
+ if (errorUtils) {
77
+ const previous = errorUtils.getGlobalHandler();
78
+ errorUtils.setGlobalHandler((error, isFatal) => {
79
+ recorder.recordLog('error', [isFatal ? 'Uncaught (fatal):' : 'Uncaught:', error]);
80
+ previous(error, isFatal);
81
+ });
82
+ }
83
+ const originalFetch = fetchHost.fetch;
84
+ fetchHost.fetch = async (input, init) => {
85
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
86
+ const method = init?.method ?? (typeof input === 'object' && 'method' in input ? input.method : 'GET');
87
+ const ignored = url.startsWith(ignoreUrl);
88
+ try {
89
+ const response = await originalFetch(input, init);
90
+ if (!ignored && !response.ok)
91
+ recorder.recordRequest(method, url, response.status);
92
+ return response;
93
+ }
94
+ catch (error) {
95
+ if (!ignored)
96
+ recorder.recordRequest(method, url, 0);
97
+ throw error;
98
+ }
99
+ };
100
+ }
101
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/core/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ import type { Platform } from '@tapthrough/protocol';
2
+ import type { Annotation } from './annotations.js';
3
+ import type { Diagnostics } from './diagnostics.js';
4
+ /** Which PR build is running, read from the loaded EAS update's manifest. */
5
+ export interface PreviewContext {
6
+ updateGroupId: string;
7
+ /** The EAS project the update belongs to; the server checks it against the repo. */
8
+ projectId: string;
9
+ /** The EAS Update branch, e.g. `pr-142`. */
10
+ branch: string | undefined;
11
+ }
12
+ /**
13
+ * The update group of the running EAS update, from `Constants.manifest2`.
14
+ * A development build has it however the update was opened (QR code, Orbit
15
+ * or a Tapthrough link); an embedded or local build has none.
16
+ */
17
+ export declare function previewContextFromManifest(manifest: unknown): PreviewContext | null;
18
+ /** A link token's payload, read without verification (the seed hook and server verify). */
19
+ export declare function decodeTokenClaims(token: string): Record<string, unknown> | undefined;
20
+ /**
21
+ * The scenario ID (`scn`) from a link token, for attributing reports. The
22
+ * server checks the ID belongs to the same PR.
23
+ */
24
+ export declare function scenarioIdFromToken(token: string): string | undefined;
25
+ export interface FeedbackInput {
26
+ preview: PreviewContext;
27
+ platform: Platform;
28
+ body: string;
29
+ reporterName?: string;
30
+ route?: string;
31
+ scenarioId?: string;
32
+ device?: {
33
+ os?: string;
34
+ osVersion?: string;
35
+ model?: string;
36
+ };
37
+ screenshot?: {
38
+ contentType: 'image/jpeg' | 'image/png';
39
+ base64: string;
40
+ };
41
+ diagnostics?: Diagnostics;
42
+ /** Boxes drawn on the screenshot; only sent with a screenshot. */
43
+ annotations?: Annotation[];
44
+ /** The reporter's own call; left out, Tapthrough guesses. */
45
+ cause?: 'pr' | 'unrelated';
46
+ }
47
+ /** Whether a report is caused by the PR: Tapthrough's guess unless a person said. */
48
+ export type Cause = 'pr' | 'unrelated' | 'unknown';
49
+ export interface Triage {
50
+ cause: Cause;
51
+ causeSource: 'guess' | 'reporter' | 'developer';
52
+ /** Plain-text reasons behind the guess. */
53
+ reasons: string[];
54
+ /** GitHub's prefilled new-issue form, for bugs the PR didn't cause. */
55
+ issueUrl?: string;
56
+ /** `auto`: an issue filed from here gets `tapthrough:fix` and Claude starts. `label`: a developer adds it. */
57
+ issueFix?: 'auto' | 'label';
58
+ }
59
+ export type FeedbackResult = ({
60
+ ok: true;
61
+ commentUrl: string;
62
+ findingId?: string;
63
+ } & Partial<Triage>) | {
64
+ ok: false;
65
+ message: string;
66
+ };
67
+ /** Markdown reasons from the server, as plain text for the app. */
68
+ export declare function plainReason(reason: string): string;
69
+ /** Posts a report to Tapthrough, which comments it on the PR. Never throws. */
70
+ export declare function sendFeedback(input: FeedbackInput, options: {
71
+ apiUrl: string;
72
+ fetch?: typeof fetch;
73
+ }): Promise<FeedbackResult>;
74
+ export type StepResultValue = 'pass' | 'fail' | 'skip';
75
+ export interface ChecklistStep {
76
+ index: number;
77
+ action: string;
78
+ expect: string;
79
+ result: {
80
+ result: StepResultValue;
81
+ reporter: string | null;
82
+ platform: Platform;
83
+ /** Checked on this earlier commit; the push since didn't touch the screen. */
84
+ carriedFrom?: string;
85
+ } | null;
86
+ }
87
+ /** Checks from an earlier commit that a push cleared, and why. */
88
+ export interface ChecklistReset {
89
+ fromSha: string;
90
+ cleared: number;
91
+ reason: 'code' | 'config' | 'unknown';
92
+ }
93
+ /** Why the checklist started over, for a reviewer. */
94
+ export declare function resetMessage(reset: ChecklistReset): string;
95
+ /** A report from an earlier commit, to re-check on this build. */
96
+ export interface RecheckItem {
97
+ id: string;
98
+ excerpt: string;
99
+ reporter: string | null;
100
+ sha: string;
101
+ platform: Platform;
102
+ stillBrokenHere: boolean;
103
+ }
104
+ /** A later push to the PR than the build that's running. */
105
+ export interface NewerBuild {
106
+ sha: string;
107
+ updateGroupId: string;
108
+ /** Opens it in the development build; null when the server can't build the link. */
109
+ openUrl: string | null;
110
+ /** True when the push is a fix Claude made for a report. */
111
+ hasFix: boolean;
112
+ }
113
+ /**
114
+ * One part of getting the app into a scenario's starting state, said two ways:
115
+ * what Tapthrough does when it sets the app up, and what a person does by hand.
116
+ */
117
+ export interface SetupLine {
118
+ kind: 'account' | 'data' | 'flag' | 'screen';
119
+ /** e.g. "Signs you in as a test user with the viewer role" */
120
+ auto: string;
121
+ /** e.g. "Sign in as a user with the viewer role" */
122
+ manual: string;
123
+ }
124
+ export interface ChecklistScenario {
125
+ key: string;
126
+ title: string;
127
+ routePath: string;
128
+ /** Why the PR runs it, e.g. "This PR changes src/app/index.tsx". Older servers omit it. */
129
+ why?: string | null;
130
+ /** How the starting state is made. Older servers omit it. */
131
+ setup?: SetupLine[];
132
+ steps: ChecklistStep[];
133
+ }
134
+ /** A scenario in the run that isn't part of the PR's plan, for jumping into its state. */
135
+ export interface LibraryEntry {
136
+ key: string;
137
+ title: string;
138
+ routePath: string;
139
+ /** True for scenarios already in `scenarios`. */
140
+ picked: boolean;
141
+ why?: string | null;
142
+ setup?: SetupLine[];
143
+ }
144
+ export interface Checklist {
145
+ pr: number;
146
+ sha: string;
147
+ open: boolean;
148
+ scenarios: ChecklistScenario[];
149
+ recheck?: RecheckItem[];
150
+ newerBuild?: NewerBuild | null;
151
+ library?: LibraryEntry[];
152
+ reset?: ChecklistReset | null;
153
+ }
154
+ /** Whether the Review sheet has anything to show. */
155
+ export declare function hasReviewItems(checklist: Checklist | null): checklist is Checklist;
156
+ export interface Progress {
157
+ total: number;
158
+ passed: number;
159
+ failed: number;
160
+ }
161
+ /** Step results across the plan, keyed `scenario:index` like the Review sheet. */
162
+ export declare function checklistProgress(checklist: Checklist, results?: Record<string, StepResultValue | undefined>): Progress;
163
+ /** One line for the sheet's header, e.g. `1 of 3 checked` or `3 of 3 passed`. */
164
+ export declare function progressLabel({ total, passed, failed }: Progress): string;
165
+ export type Badge = {
166
+ kind: 'new-build';
167
+ } | {
168
+ kind: 'failed';
169
+ } | {
170
+ kind: 'remaining';
171
+ count: number;
172
+ } | {
173
+ kind: 'done';
174
+ }
175
+ /** Nothing to check here, but an idea waits on someone: questions, or a build to test. */
176
+ | {
177
+ kind: 'idea';
178
+ };
179
+ /** What the floating Review button shows: a new build wins, then failures, then steps left. */
180
+ export declare function reviewBadge(checklist: Checklist | null): Badge | null;
181
+ /** Marks an earlier report fixed or still broken on this build. Never throws. */
182
+ export declare function sendRecheck(input: {
183
+ preview: PreviewContext;
184
+ platform: Platform;
185
+ findingId: string;
186
+ result: 'fixed' | 'still_broken';
187
+ reporterName?: string;
188
+ }, options: {
189
+ apiUrl: string;
190
+ fetch?: typeof fetch;
191
+ }): Promise<{
192
+ ok: true;
193
+ } | {
194
+ ok: false;
195
+ message: string;
196
+ }>;
197
+ /** The reporter saying whether the PR caused a report. Never throws. */
198
+ export declare function sendCause(input: {
199
+ preview: PreviewContext;
200
+ platform: Platform;
201
+ findingId: string;
202
+ cause: 'pr' | 'unrelated';
203
+ }, options: {
204
+ apiUrl: string;
205
+ fetch?: typeof fetch;
206
+ }): Promise<{
207
+ ok: true;
208
+ } | {
209
+ ok: false;
210
+ message: string;
211
+ }>;
212
+ export type FixRequestResult = {
213
+ ok: true;
214
+ status: 'requested' | 'not_set_up';
215
+ } | {
216
+ ok: false;
217
+ message: string;
218
+ };
219
+ /** Asks Claude to fix a report on the PR's branch, in the repo's own Actions. Never throws. */
220
+ export declare function requestFix(input: {
221
+ preview: PreviewContext;
222
+ platform: Platform;
223
+ findingId: string;
224
+ reporterName?: string;
225
+ }, options: {
226
+ apiUrl: string;
227
+ fetch?: typeof fetch;
228
+ }): Promise<FixRequestResult>;
229
+ /** What happened to Claude after filing; `off` means a developer adds the label, null that it was filed before. */
230
+ export type IssueFix = 'started' | 'not_set_up' | 'refused' | 'off' | null;
231
+ export type IssueFileResult = {
232
+ ok: true;
233
+ issueNumber: number;
234
+ issueUrl: string;
235
+ fix: IssueFix;
236
+ }
237
+ /** `openInBrowser`: Tapthrough can't file it here, so offer GitHub's prefilled form instead. */
238
+ | {
239
+ ok: false;
240
+ message: string;
241
+ openInBrowser: boolean;
242
+ };
243
+ /**
244
+ * Files a report as a GitHub issue through Tapthrough, so the reporter doesn't
245
+ * need to sign in to GitHub on the phone. Never throws.
246
+ */
247
+ export declare function fileIssue(input: {
248
+ preview: PreviewContext;
249
+ platform: Platform;
250
+ findingId: string;
251
+ }, options: {
252
+ apiUrl: string;
253
+ fetch?: typeof fetch;
254
+ }): Promise<IssueFileResult>;
255
+ export type LaunchRequestResult = {
256
+ ok: true;
257
+ launchUrl: string;
258
+ } | {
259
+ ok: false;
260
+ message: string;
261
+ };
262
+ /**
263
+ * Asks Tapthrough for a launch link into one of the PR's scenarios, so the
264
+ * app can set itself up for it without leaving. Never throws.
265
+ */
266
+ export declare function requestLaunch(input: {
267
+ preview: PreviewContext;
268
+ platform: Platform;
269
+ scenarioKey: string;
270
+ }, options: {
271
+ apiUrl: string;
272
+ fetch?: typeof fetch;
273
+ }): Promise<LaunchRequestResult>;
274
+ /** The PR's test plan and current results for the running build, or null if there isn't one. */
275
+ export declare function fetchChecklist(preview: PreviewContext, platform: Platform, options: {
276
+ apiUrl: string;
277
+ fetch?: typeof fetch;
278
+ }): Promise<Checklist | null>;
279
+ /** Records a pass, fail or skip for one step. Never throws. */
280
+ export declare function sendStepResult(input: {
281
+ preview: PreviewContext;
282
+ platform: Platform;
283
+ scenarioKey: string;
284
+ stepIndex: number;
285
+ result: StepResultValue;
286
+ reporterName?: string;
287
+ findingId?: string;
288
+ }, options: {
289
+ apiUrl: string;
290
+ fetch?: typeof fetch;
291
+ }): Promise<{
292
+ ok: true;
293
+ } | {
294
+ ok: false;
295
+ message: string;
296
+ }>;
297
+ /** The report body for a failed step: the step and its expectation, then the reviewer's note. */
298
+ export declare function failedStepBody(step: {
299
+ action: string;
300
+ expect: string;
301
+ }, note: string): string;
302
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/core/feedback.ts"],"names":[],"mappings":"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"}