ugly-app 0.1.592 → 0.1.593
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/AppApi.d.ts +26 -6
- package/dist/client/AppApi.d.ts.map +1 -1
- package/dist/client/AppApi.js +48 -18
- package/dist/client/AppApi.js.map +1 -1
- package/dist/client/bootstrapApp.d.ts.map +1 -1
- package/dist/client/bootstrapApp.js +6 -1
- package/dist/client/bootstrapApp.js.map +1 -1
- package/dist/client/components/FeedbackButton.d.ts.map +1 -1
- package/dist/client/components/FeedbackButton.js +23 -30
- package/dist/client/components/FeedbackButton.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/AppApi.ts +85 -17
- package/src/client/bootstrapApp.tsx +6 -1
- package/src/client/components/FeedbackButton.tsx +26 -30
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.593";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/dist/client/AppApi.d.ts
CHANGED
|
@@ -14,15 +14,35 @@ export declare function appApiRequest(fn: string, input: Record<string, unknown>
|
|
|
14
14
|
* Fire-and-forget version — never throws. Used by Logger.
|
|
15
15
|
*/
|
|
16
16
|
export declare function appApiRequestSilent(fn: string, input: Record<string, unknown>): void;
|
|
17
|
+
interface AppRequestSocket {
|
|
18
|
+
request: (name: string, input: unknown, opts?: {
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}) => Promise<unknown>;
|
|
21
|
+
}
|
|
17
22
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
23
|
+
* Register the connected app socket so feedback/error requests prefer the WS
|
|
24
|
+
* path. Called by `bootstrapApp` once `socket.connect()` resolves; pass null
|
|
25
|
+
* on logout/teardown to force the POST path.
|
|
26
|
+
*/
|
|
27
|
+
export declare function setAppSocket(socket: AppRequestSocket | null): void;
|
|
28
|
+
/**
|
|
29
|
+
* Make a framework request to the app's OWN server, PREFERRING the WebSocket
|
|
30
|
+
* `socket.request` when a connected socket is registered (logged-in users) and
|
|
31
|
+
* failing over to a same-origin `POST /api/:fn` otherwise (logged-out users, or
|
|
32
|
+
* on socket error/timeout). Returns the handler's output; throws on failure.
|
|
21
33
|
*
|
|
22
34
|
* `fetchFn` lets callers pass an UNWRAPPED fetch (e.g. Logger's saved
|
|
23
|
-
* `_origFetch`) so the
|
|
24
|
-
|
|
25
|
-
|
|
35
|
+
* `_origFetch`) so the POST fallback isn't re-captured as a network event.
|
|
36
|
+
*/
|
|
37
|
+
export declare function appRequestPreferSocket(fn: string, input: Record<string, unknown>, opts?: {
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
fetchFn?: typeof fetch;
|
|
40
|
+
}): Promise<unknown>;
|
|
41
|
+
/**
|
|
42
|
+
* Fire-and-forget telemetry variant — never throws. Socket-preferred with POST
|
|
43
|
+
* failover, used by Logger + captureClientError for error capture that must
|
|
44
|
+
* land in the project's own Postgres `errorLog`.
|
|
26
45
|
*/
|
|
27
46
|
export declare function appServerRequestSilent(fn: string, input: Record<string, unknown>, fetchFn?: typeof fetch): void;
|
|
47
|
+
export {};
|
|
28
48
|
//# sourceMappingURL=AppApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppApi.d.ts","sourceRoot":"","sources":["../../src/client/AppApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAChC,GAAG,IAAI,CAIP;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAGN;AAED
|
|
1
|
+
{"version":3,"file":"AppApi.d.ts","sourceRoot":"","sources":["../../src/client/AppApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAChC,GAAG,IAAI,CAIP;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAGN;AAWD,UAAU,gBAAgB;IACxB,OAAO,EAAE,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAElE;AAwBD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GACpD,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,OAAO,KAAa,GAC5B,IAAI,CAMN"}
|
package/dist/client/AppApi.js
CHANGED
|
@@ -41,28 +41,58 @@ export function appApiRequestSilent(fn, input) {
|
|
|
41
41
|
return;
|
|
42
42
|
appApiRequest(fn, input).catch(() => { });
|
|
43
43
|
}
|
|
44
|
+
let _appSocket = null;
|
|
44
45
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
46
|
+
* Register the connected app socket so feedback/error requests prefer the WS
|
|
47
|
+
* path. Called by `bootstrapApp` once `socket.connect()` resolves; pass null
|
|
48
|
+
* on logout/teardown to force the POST path.
|
|
49
|
+
*/
|
|
50
|
+
export function setAppSocket(socket) {
|
|
51
|
+
_appSocket = socket;
|
|
52
|
+
}
|
|
53
|
+
async function postAppRequest(fn, input, fetchFn) {
|
|
54
|
+
const res = await fetchFn(`/api/${fn}`, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: { 'Content-Type': 'application/json' },
|
|
57
|
+
credentials: 'include',
|
|
58
|
+
body: JSON.stringify({ input }),
|
|
59
|
+
keepalive: true,
|
|
60
|
+
});
|
|
61
|
+
const json = (await res.json().catch(() => ({})));
|
|
62
|
+
if (!res.ok || json.error) {
|
|
63
|
+
throw new Error(json.error ?? `request ${fn} failed: HTTP ${res.status}`);
|
|
64
|
+
}
|
|
65
|
+
return json.result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Make a framework request to the app's OWN server, PREFERRING the WebSocket
|
|
69
|
+
* `socket.request` when a connected socket is registered (logged-in users) and
|
|
70
|
+
* failing over to a same-origin `POST /api/:fn` otherwise (logged-out users, or
|
|
71
|
+
* on socket error/timeout). Returns the handler's output; throws on failure.
|
|
48
72
|
*
|
|
49
73
|
* `fetchFn` lets callers pass an UNWRAPPED fetch (e.g. Logger's saved
|
|
50
|
-
* `_origFetch`) so the
|
|
51
|
-
* and doesn't recurse back into the log buffer. `keepalive` lets the last
|
|
52
|
-
* batch survive a page unload.
|
|
74
|
+
* `_origFetch`) so the POST fallback isn't re-captured as a network event.
|
|
53
75
|
*/
|
|
54
|
-
export function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
/* fire-and-forget */
|
|
76
|
+
export async function appRequestPreferSocket(fn, input, opts) {
|
|
77
|
+
const socket = _appSocket;
|
|
78
|
+
if (socket) {
|
|
79
|
+
try {
|
|
80
|
+
return await socket.request(fn, input, opts?.timeoutMs ? { timeoutMs: opts.timeoutMs } : undefined);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Socket present but failed (disconnect/timeout) — fail over to POST.
|
|
84
|
+
}
|
|
66
85
|
}
|
|
86
|
+
return postAppRequest(fn, input, opts?.fetchFn ?? fetch);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fire-and-forget telemetry variant — never throws. Socket-preferred with POST
|
|
90
|
+
* failover, used by Logger + captureClientError for error capture that must
|
|
91
|
+
* land in the project's own Postgres `errorLog`.
|
|
92
|
+
*/
|
|
93
|
+
export function appServerRequestSilent(fn, input, fetchFn = fetch) {
|
|
94
|
+
// Short socket timeout so a wedged connection fails over to POST quickly
|
|
95
|
+
// rather than holding telemetry for the default 60s.
|
|
96
|
+
void appRequestPreferSocket(fn, input, { timeoutMs: 10_000, fetchFn }).catch(() => { });
|
|
67
97
|
}
|
|
68
98
|
//# sourceMappingURL=AppApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppApi.js","sourceRoot":"","sources":["../../src/client/AppApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,IAAI,UAAU,GAAG,EAAE,CAAC;AACpB,IAAI,UAAU,GAAG,EAAE,CAAC;AACpB,IAAI,SAAS,GAAiC,IAAI,CAAC;AAEnD,MAAM,UAAU,UAAU,CAAC,IAI1B;IACC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5B,SAAS,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,KAA8B;IAE9B,MAAM,KAAK,GAAG,SAAS,EAAE,EAAE,CAAC;IAC5B,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,UAAU,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE;SAC3C,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAU,EACV,KAA8B;IAE9B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;QAAE,OAAO;IACvC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;
|
|
1
|
+
{"version":3,"file":"AppApi.js","sourceRoot":"","sources":["../../src/client/AppApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrapApp.d.ts","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAUzE,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAInF,UAAU,mBAAmB;IAC3B,mFAAmF;IACnF,QAAQ,EAAE,eAAe,CAAC;IAE1B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,eAAe,CAAC;IAE3B,uDAAuD;IACvD,cAAc,EAAE,aAAa,CAAC;QAC5B,QAAQ,EAAE,SAAS,CAAC;QACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC;KACjC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,MAAM,EAAE,MAAM,YAAY,CAAC;IAE3B,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAE5B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qFAAqF;IACrF,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,KAAK,CAAC;IAEjB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"bootstrapApp.d.ts","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAUzE,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAInF,UAAU,mBAAmB;IAC3B,mFAAmF;IACnF,QAAQ,EAAE,eAAe,CAAC;IAE1B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,eAAe,CAAC;IAE3B,uDAAuD;IACvD,cAAc,EAAE,aAAa,CAAC;QAC5B,QAAQ,EAAE,SAAS,CAAC;QACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC;KACjC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,MAAM,EAAE,MAAM,YAAY,CAAC;IAE3B,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAE5B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qFAAqF;IACrF,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,KAAK,CAAC;IAEjB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAoK/D"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import { createRoot } from 'react-dom/client';
|
|
3
3
|
import { frameworkMessages } from '../shared/FrameworkMessages.js';
|
|
4
4
|
import { frameworkRequests } from '../shared/FrameworkRequests.js';
|
|
5
|
-
import { initAppApi } from './AppApi.js';
|
|
5
|
+
import { initAppApi, setAppSocket } from './AppApi.js';
|
|
6
6
|
import { AppProvider } from './AppProvider.js';
|
|
7
7
|
import { MagicLinkCallback } from './auth/MagicLinkCallback.js';
|
|
8
8
|
import { attemptSilentSso, markSilentSsoTried } from './auth/startLogin.js';
|
|
@@ -107,6 +107,11 @@ export function bootstrapApp(options) {
|
|
|
107
107
|
socket
|
|
108
108
|
.connect(token)
|
|
109
109
|
.then(({ user, appToken }) => {
|
|
110
|
+
// Prefer the WS request path for feedback/error telemetry now that the
|
|
111
|
+
// socket is connected. Logged-out boots never reach here (they render
|
|
112
|
+
// without a socket above), so their telemetry falls back to POST. The
|
|
113
|
+
// reference persists across the socket's internal reconnects.
|
|
114
|
+
setAppSocket(socket);
|
|
110
115
|
// appToken comes from the framework's auth response. In:
|
|
111
116
|
// Mode B (self-auth): the SessionDO ships the project's
|
|
112
117
|
// AI_PROXY_TOKEN as appToken (charge → developer).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrapApp.js","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrapApp.js","sourceRoot":"","sources":["../../src/client/bootstrapApp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButton.d.ts","sourceRoot":"","sources":["../../../src/client/components/FeedbackButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FeedbackButton.d.ts","sourceRoot":"","sources":["../../../src/client/components/FeedbackButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQzD,wBAAgB,cAAc,IAAI,SAAS,CAuM1C"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useRef, useState } from 'react';
|
|
3
|
+
import { appRequestPreferSocket } from '../AppApi.js';
|
|
3
4
|
import { getFeedbackContext } from '../FeedbackContext.js';
|
|
4
5
|
import { getConsoleBuffer } from '../Logger.js';
|
|
5
6
|
import { captureElementMap, captureScreenshot } from '../Screenshot.js';
|
|
@@ -47,36 +48,28 @@ export function FeedbackButton() {
|
|
|
47
48
|
elementMap: JSON.stringify(captureElementMap()),
|
|
48
49
|
};
|
|
49
50
|
const loc = new URL(window.location.href);
|
|
50
|
-
//
|
|
51
|
-
// the
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
// NOTE: screenshot persistence is intentionally dropped for now —
|
|
57
|
-
//
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
screenWidth: window.innerWidth,
|
|
73
|
-
screenHeight: window.innerHeight,
|
|
74
|
-
},
|
|
75
|
-
}),
|
|
76
|
-
});
|
|
77
|
-
const json = (await res.json().catch(() => ({})));
|
|
78
|
-
if (!res.ok || json.error) {
|
|
79
|
-
throw new Error(json.error ?? `feedback failed: HTTP ${res.status}`);
|
|
51
|
+
// Submit to the project's OWN server → recordFeedback → the project's
|
|
52
|
+
// Postgres. Prefers the WS `socket.request` when the user is logged in
|
|
53
|
+
// (a connected socket is registered), failing over to same-origin
|
|
54
|
+
// `POST /api/feedbackReportCreateNoAuth` for logged-out visitors.
|
|
55
|
+
// (Previously this called ugly.bot's retired endpoint, which 400s on the
|
|
56
|
+
// live billable-op proxy — every child app's feedback silently failed.)
|
|
57
|
+
// NOTE: screenshot persistence is intentionally dropped for now — a
|
|
58
|
+
// follow-up can add a temp-key upload step (see Logger#feedback).
|
|
59
|
+
const result = (await appRequestPreferSocket('feedbackReportCreateNoAuth', {
|
|
60
|
+
description: message.trim(),
|
|
61
|
+
type,
|
|
62
|
+
url: window.location.href,
|
|
63
|
+
logs: recentLogs,
|
|
64
|
+
context,
|
|
65
|
+
page: loc.pathname,
|
|
66
|
+
query: Object.fromEntries(loc.searchParams),
|
|
67
|
+
userAgent: navigator.userAgent,
|
|
68
|
+
screenWidth: window.innerWidth,
|
|
69
|
+
screenHeight: window.innerHeight,
|
|
70
|
+
}));
|
|
71
|
+
if (!result?.ok) {
|
|
72
|
+
throw new Error('feedback submission did not succeed');
|
|
80
73
|
}
|
|
81
74
|
screenshotRef.current = null;
|
|
82
75
|
setDone(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../../src/client/components/FeedbackButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIxE,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe,SAAS,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAElD,KAAK,UAAU,UAAU;QACvB,sEAAsE;QACtE,kEAAkE;QAClE,yEAAyE;QACzE,uEAAuE;QACvE,uEAAuE;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,KAAK,OAAO,CAAC,IAAI,CAAC;YAChB,iBAAiB,EAAE;YACnB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACtE,CAAC;aACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,UAAU,YAAY;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO;QAC5B,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;YAEJ,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAA2B;gBACtC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;aAChD,CAAC;YAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE1C,kEAAkE;YAClE,
|
|
1
|
+
{"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../../src/client/components/FeedbackButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIxE,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe,SAAS,CAAC,CAAC;IAC1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAElD,KAAK,UAAU,UAAU;QACvB,sEAAsE;QACtE,kEAAkE;QAClE,yEAAyE;QACzE,uEAAuE;QACvE,uEAAuE;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC7B,KAAK,OAAO,CAAC,IAAI,CAAC;YAChB,iBAAiB,EAAE;YACnB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;SACtE,CAAC;aACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,UAAU,YAAY;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO;QAC5B,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;YAEJ,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAA2B;gBACtC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;aAChD,CAAC;YAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE1C,sEAAsE;YACtE,uEAAuE;YACvE,kEAAkE;YAClE,kEAAkE;YAClE,yEAAyE;YACzE,wEAAwE;YACxE,oEAAoE;YACpE,kEAAkE;YAClE,MAAM,MAAM,GAAG,CAAC,MAAM,sBAAsB,CAC1C,4BAA4B,EAC5B;gBACE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE;gBAC3B,IAAI;gBACJ,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBACzB,IAAI,EAAE,UAAU;gBAChB,OAAO;gBACP,IAAI,EAAE,GAAG,CAAC,QAAQ;gBAClB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC3C,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,YAAY,EAAE,MAAM,CAAC,WAAW;aACjC,CACF,CAAqB,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YACD,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,CACL,8BACE,4BACU,iBAAiB,EACzB,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EACrC,KAAK,EAAE;oBACL,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,EAAE;oBACV,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,UAAU;oBACnB,YAAY,EAAE,CAAC;oBACf,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;iBAChB,yBAGM,EAER,IAAI,IAAI,CACP,cACE,KAAK,EAAE;oBACL,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,EAAE;oBACV,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,MAAM;oBAClB,MAAM,EAAE,mBAAmB;oBAC3B,YAAY,EAAE,EAAE;oBAChB,OAAO,EAAE,EAAE;oBACX,KAAK,EAAE,GAAG;oBACV,SAAS,EAAE,6BAA6B;iBACzC,YAEA,IAAI,CAAC,CAAC,CAAC,CACN,YAAG,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,0CAE/C,CACL,CAAC,CAAC,CAAC,CACF,8BACE,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,YACrD,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC3D,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EACzB,KAAK,EAAE;oCACL,IAAI,EAAE,CAAC;oCACP,OAAO,EAAE,SAAS;oCAClB,YAAY,EAAE,CAAC;oCACf,MAAM,EAAE,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE;oCACzD,UAAU,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;oCAC3C,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oCACnC,MAAM,EAAE,SAAS;oCACjB,QAAQ,EAAE,EAAE;iCACb,YAEA,CAAC,IAbG,CAAC,CAcC,CACV,CAAC,GACE,EACN,mBACE,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,WAAW,EAAC,2BAA2B,EACvC,IAAI,EAAE,CAAC,EACP,KAAK,EAAE;gCACL,KAAK,EAAE,MAAM;gCACb,YAAY,EAAE,CAAC;gCACf,MAAM,EAAE,mBAAmB;gCAC3B,OAAO,EAAE,CAAC;gCACV,QAAQ,EAAE,EAAE;gCACZ,SAAS,EAAE,YAAY;6BACxB,GACD,EACF,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,aACpD,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC7B,KAAK,EAAE;wCACL,IAAI,EAAE,CAAC;wCACP,OAAO,EAAE,CAAC;wCACV,YAAY,EAAE,CAAC;wCACf,MAAM,EAAE,mBAAmB;wCAC3B,UAAU,EAAE,MAAM;wCAClB,MAAM,EAAE,SAAS;qCAClB,uBAGM,EACT,iBACE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC,EACvC,QAAQ,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EACvC,KAAK,EAAE;wCACL,IAAI,EAAE,CAAC;wCACP,OAAO,EAAE,CAAC;wCACV,YAAY,EAAE,CAAC;wCACf,MAAM,EAAE,MAAM;wCACd,UAAU,EAAE,SAAS;wCACrB,KAAK,EAAE,MAAM;wCACb,MAAM,EAAE,SAAS;wCACjB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qCAC9B,YAEA,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,GAC5B,IACL,IACL,CACJ,GACG,CACP,IACA,CACJ,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.593";
|
package/src/client/AppApi.ts
CHANGED
|
@@ -55,30 +55,98 @@ export function appApiRequestSilent(
|
|
|
55
55
|
appApiRequest(fn, input).catch(() => {});
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// ─── App-server requests (socket-preferred, POST failover) ──────────────────
|
|
59
|
+
//
|
|
60
|
+
// Feedback + error telemetry are framework REQUESTS. When the user is logged
|
|
61
|
+
// in the app holds a connected WebSocket, so we send them over `socket.request`
|
|
62
|
+
// (typed, multiplexed, no extra HTTP round-trip). When the user is logged out
|
|
63
|
+
// there is no socket — we fail over to a same-origin `POST /api/:fn`. We also
|
|
64
|
+
// fail over if a registered socket errors/times out, so a flaky connection
|
|
65
|
+
// never drops telemetry.
|
|
66
|
+
|
|
67
|
+
interface AppRequestSocket {
|
|
68
|
+
request: (
|
|
69
|
+
name: string,
|
|
70
|
+
input: unknown,
|
|
71
|
+
opts?: { timeoutMs?: number },
|
|
72
|
+
) => Promise<unknown>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let _appSocket: AppRequestSocket | null = null;
|
|
76
|
+
|
|
58
77
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
78
|
+
* Register the connected app socket so feedback/error requests prefer the WS
|
|
79
|
+
* path. Called by `bootstrapApp` once `socket.connect()` resolves; pass null
|
|
80
|
+
* on logout/teardown to force the POST path.
|
|
81
|
+
*/
|
|
82
|
+
export function setAppSocket(socket: AppRequestSocket | null): void {
|
|
83
|
+
_appSocket = socket;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function postAppRequest(
|
|
87
|
+
fn: string,
|
|
88
|
+
input: Record<string, unknown>,
|
|
89
|
+
fetchFn: typeof fetch,
|
|
90
|
+
): Promise<unknown> {
|
|
91
|
+
const res = await fetchFn(`/api/${fn}`, {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: { 'Content-Type': 'application/json' },
|
|
94
|
+
credentials: 'include',
|
|
95
|
+
body: JSON.stringify({ input }),
|
|
96
|
+
keepalive: true,
|
|
97
|
+
});
|
|
98
|
+
const json = (await res.json().catch(() => ({}))) as {
|
|
99
|
+
result?: unknown;
|
|
100
|
+
error?: string;
|
|
101
|
+
};
|
|
102
|
+
if (!res.ok || json.error) {
|
|
103
|
+
throw new Error(json.error ?? `request ${fn} failed: HTTP ${res.status}`);
|
|
104
|
+
}
|
|
105
|
+
return json.result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Make a framework request to the app's OWN server, PREFERRING the WebSocket
|
|
110
|
+
* `socket.request` when a connected socket is registered (logged-in users) and
|
|
111
|
+
* failing over to a same-origin `POST /api/:fn` otherwise (logged-out users, or
|
|
112
|
+
* on socket error/timeout). Returns the handler's output; throws on failure.
|
|
62
113
|
*
|
|
63
114
|
* `fetchFn` lets callers pass an UNWRAPPED fetch (e.g. Logger's saved
|
|
64
|
-
* `_origFetch`) so the
|
|
65
|
-
|
|
66
|
-
|
|
115
|
+
* `_origFetch`) so the POST fallback isn't re-captured as a network event.
|
|
116
|
+
*/
|
|
117
|
+
export async function appRequestPreferSocket(
|
|
118
|
+
fn: string,
|
|
119
|
+
input: Record<string, unknown>,
|
|
120
|
+
opts?: { timeoutMs?: number; fetchFn?: typeof fetch },
|
|
121
|
+
): Promise<unknown> {
|
|
122
|
+
const socket = _appSocket;
|
|
123
|
+
if (socket) {
|
|
124
|
+
try {
|
|
125
|
+
return await socket.request(
|
|
126
|
+
fn,
|
|
127
|
+
input,
|
|
128
|
+
opts?.timeoutMs ? { timeoutMs: opts.timeoutMs } : undefined,
|
|
129
|
+
);
|
|
130
|
+
} catch {
|
|
131
|
+
// Socket present but failed (disconnect/timeout) — fail over to POST.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return postAppRequest(fn, input, opts?.fetchFn ?? fetch);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Fire-and-forget telemetry variant — never throws. Socket-preferred with POST
|
|
139
|
+
* failover, used by Logger + captureClientError for error capture that must
|
|
140
|
+
* land in the project's own Postgres `errorLog`.
|
|
67
141
|
*/
|
|
68
142
|
export function appServerRequestSilent(
|
|
69
143
|
fn: string,
|
|
70
144
|
input: Record<string, unknown>,
|
|
71
145
|
fetchFn: typeof fetch = fetch,
|
|
72
146
|
): void {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
body: JSON.stringify({ input }),
|
|
79
|
-
keepalive: true,
|
|
80
|
-
}).catch(() => {});
|
|
81
|
-
} catch {
|
|
82
|
-
/* fire-and-forget */
|
|
83
|
-
}
|
|
147
|
+
// Short socket timeout so a wedged connection fails over to POST quickly
|
|
148
|
+
// rather than holding telemetry for the default 60s.
|
|
149
|
+
void appRequestPreferSocket(fn, input, { timeoutMs: 10_000, fetchFn }).catch(
|
|
150
|
+
() => {},
|
|
151
|
+
);
|
|
84
152
|
}
|
|
@@ -3,7 +3,7 @@ import { createRoot } from 'react-dom/client';
|
|
|
3
3
|
import type { MessageRegistry, RequestRegistry } from '../shared/Api.js';
|
|
4
4
|
import { frameworkMessages } from '../shared/FrameworkMessages.js';
|
|
5
5
|
import { frameworkRequests } from '../shared/FrameworkRequests.js';
|
|
6
|
-
import { initAppApi } from './AppApi.js';
|
|
6
|
+
import { initAppApi, setAppSocket } from './AppApi.js';
|
|
7
7
|
import { AppProvider } from './AppProvider.js';
|
|
8
8
|
import { MagicLinkCallback } from './auth/MagicLinkCallback.js';
|
|
9
9
|
import { attemptSilentSso, markSilentSsoTried } from './auth/startLogin.js';
|
|
@@ -194,6 +194,11 @@ export function bootstrapApp(options: BootstrapAppOptions): void {
|
|
|
194
194
|
socket
|
|
195
195
|
.connect(token)
|
|
196
196
|
.then(({ user, appToken }) => {
|
|
197
|
+
// Prefer the WS request path for feedback/error telemetry now that the
|
|
198
|
+
// socket is connected. Logged-out boots never reach here (they render
|
|
199
|
+
// without a socket above), so their telemetry falls back to POST. The
|
|
200
|
+
// reference persists across the socket's internal reconnects.
|
|
201
|
+
setAppSocket(socket);
|
|
197
202
|
// appToken comes from the framework's auth response. In:
|
|
198
203
|
// Mode B (self-auth): the SessionDO ships the project's
|
|
199
204
|
// AI_PROXY_TOKEN as appToken (charge → developer).
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useRef, useState, type ReactNode } from 'react';
|
|
2
|
+
import { appRequestPreferSocket } from '../AppApi.js';
|
|
2
3
|
import { getFeedbackContext } from '../FeedbackContext.js';
|
|
3
4
|
import { getConsoleBuffer } from '../Logger.js';
|
|
4
5
|
import { captureElementMap, captureScreenshot } from '../Screenshot.js';
|
|
@@ -53,36 +54,31 @@ export function FeedbackButton(): ReactNode {
|
|
|
53
54
|
|
|
54
55
|
const loc = new URL(window.location.href);
|
|
55
56
|
|
|
56
|
-
//
|
|
57
|
-
// the
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
// NOTE: screenshot persistence is intentionally dropped for now —
|
|
63
|
-
//
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}),
|
|
82
|
-
});
|
|
83
|
-
const json = (await res.json().catch(() => ({}))) as { error?: string };
|
|
84
|
-
if (!res.ok || json.error) {
|
|
85
|
-
throw new Error(json.error ?? `feedback failed: HTTP ${res.status}`);
|
|
57
|
+
// Submit to the project's OWN server → recordFeedback → the project's
|
|
58
|
+
// Postgres. Prefers the WS `socket.request` when the user is logged in
|
|
59
|
+
// (a connected socket is registered), failing over to same-origin
|
|
60
|
+
// `POST /api/feedbackReportCreateNoAuth` for logged-out visitors.
|
|
61
|
+
// (Previously this called ugly.bot's retired endpoint, which 400s on the
|
|
62
|
+
// live billable-op proxy — every child app's feedback silently failed.)
|
|
63
|
+
// NOTE: screenshot persistence is intentionally dropped for now — a
|
|
64
|
+
// follow-up can add a temp-key upload step (see Logger#feedback).
|
|
65
|
+
const result = (await appRequestPreferSocket(
|
|
66
|
+
'feedbackReportCreateNoAuth',
|
|
67
|
+
{
|
|
68
|
+
description: message.trim(),
|
|
69
|
+
type,
|
|
70
|
+
url: window.location.href,
|
|
71
|
+
logs: recentLogs,
|
|
72
|
+
context,
|
|
73
|
+
page: loc.pathname,
|
|
74
|
+
query: Object.fromEntries(loc.searchParams),
|
|
75
|
+
userAgent: navigator.userAgent,
|
|
76
|
+
screenWidth: window.innerWidth,
|
|
77
|
+
screenHeight: window.innerHeight,
|
|
78
|
+
},
|
|
79
|
+
)) as { ok?: boolean };
|
|
80
|
+
if (!result?.ok) {
|
|
81
|
+
throw new Error('feedback submission did not succeed');
|
|
86
82
|
}
|
|
87
83
|
screenshotRef.current = null;
|
|
88
84
|
setDone(true);
|