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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.592";
1
+ export declare const CLI_VERSION = "0.1.593";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.592";
2
+ export const CLI_VERSION = "0.1.593";
3
3
  //# sourceMappingURL=version.js.map
@@ -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
- * Same-origin fire-and-forget POST to the app's OWN server (`/api/:fn`),
19
- * NOT ugly.bot. Used for telemetry (browser error capture) that must land
20
- * in the project's own Postgres `errorLog`. Never throws.
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 telemetry POST isn't re-captured as a network event
24
- * and doesn't recurse back into the log buffer. `keepalive` lets the last
25
- * batch survive a page unload.
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;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,OAAO,KAAa,GAC5B,IAAI,CAYN"}
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"}
@@ -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
- * Same-origin fire-and-forget POST to the app's OWN server (`/api/:fn`),
46
- * NOT ugly.bot. Used for telemetry (browser error capture) that must land
47
- * in the project's own Postgres `errorLog`. Never throws.
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 telemetry POST isn't re-captured as a network event
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 appServerRequestSilent(fn, input, fetchFn = fetch) {
55
- try {
56
- void fetchFn(`/api/${fn}`, {
57
- method: 'POST',
58
- headers: { 'Content-Type': 'application/json' },
59
- credentials: 'include',
60
- body: JSON.stringify({ input }),
61
- keepalive: true,
62
- }).catch(() => { });
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;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAU,EACV,KAA8B,EAC9B,UAAwB,KAAK;IAE7B,IAAI,CAAC;QACH,KAAK,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;YAC/B,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;AACH,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,CA+J/D"}
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":"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"}
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;AAOzD,wBAAgB,cAAc,IAAI,SAAS,CA4M1C"}
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
- // Same-origin POST to the project's OWN server → recordFeedback →
51
- // the project's Postgres. (Previously this called ugly.bot's
52
- // retired `feedbackReportCreateNoAuth`, which 400s on the live
53
- // billable-op proxy every child app's feedback silently failed.)
54
- // `credentials: 'include'` lets the server attribute the report to
55
- // the logged-in user when an auth cookie is present.
56
- // NOTE: screenshot persistence is intentionally dropped for now —
57
- // a follow-up can add a temp-key upload step (see Logger#feedback).
58
- const res = await fetch('/api/feedbackReportCreateNoAuth', {
59
- method: 'POST',
60
- headers: { 'Content-Type': 'application/json' },
61
- credentials: 'include',
62
- body: JSON.stringify({
63
- input: {
64
- description: message.trim(),
65
- type,
66
- url: window.location.href,
67
- logs: recentLogs,
68
- context,
69
- page: loc.pathname,
70
- query: Object.fromEntries(loc.searchParams),
71
- userAgent: navigator.userAgent,
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":"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"}
1
+ {"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../../src/client/components/FeedbackButton.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.592",
3
+ "version": "0.1.593",
4
4
  "type": "module",
5
5
  "main": "./dist/server/index.js",
6
6
  "exports": {
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.592";
2
+ export const CLI_VERSION = "0.1.593";
@@ -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
- * Same-origin fire-and-forget POST to the app's OWN server (`/api/:fn`),
60
- * NOT ugly.bot. Used for telemetry (browser error capture) that must land
61
- * in the project's own Postgres `errorLog`. Never throws.
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 telemetry POST isn't re-captured as a network event
65
- * and doesn't recurse back into the log buffer. `keepalive` lets the last
66
- * batch survive a page unload.
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
- try {
74
- void fetchFn(`/api/${fn}`, {
75
- method: 'POST',
76
- headers: { 'Content-Type': 'application/json' },
77
- credentials: 'include',
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
- // Same-origin POST to the project's OWN server → recordFeedback →
57
- // the project's Postgres. (Previously this called ugly.bot's
58
- // retired `feedbackReportCreateNoAuth`, which 400s on the live
59
- // billable-op proxy every child app's feedback silently failed.)
60
- // `credentials: 'include'` lets the server attribute the report to
61
- // the logged-in user when an auth cookie is present.
62
- // NOTE: screenshot persistence is intentionally dropped for now —
63
- // a follow-up can add a temp-key upload step (see Logger#feedback).
64
- const res = await fetch('/api/feedbackReportCreateNoAuth', {
65
- method: 'POST',
66
- headers: { 'Content-Type': 'application/json' },
67
- credentials: 'include',
68
- body: JSON.stringify({
69
- input: {
70
- description: message.trim(),
71
- type,
72
- url: window.location.href,
73
- logs: recentLogs,
74
- context,
75
- page: loc.pathname,
76
- query: Object.fromEntries(loc.searchParams),
77
- userAgent: navigator.userAgent,
78
- screenWidth: window.innerWidth,
79
- screenHeight: window.innerHeight,
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);