ugly-app 0.1.1075 → 0.1.1077

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 (66) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/version.d.ts +1 -1
  3. package/dist/cli/version.js +1 -1
  4. package/dist/client/InstallPrompt.d.ts +25 -0
  5. package/dist/client/InstallPrompt.d.ts.map +1 -0
  6. package/dist/client/InstallPrompt.js +213 -0
  7. package/dist/client/InstallPrompt.js.map +1 -0
  8. package/dist/client/LoginPopup.d.ts.map +1 -1
  9. package/dist/client/LoginPopup.js +8 -0
  10. package/dist/client/LoginPopup.js.map +1 -1
  11. package/dist/client/NewVersionBanner.d.ts +8 -0
  12. package/dist/client/NewVersionBanner.d.ts.map +1 -0
  13. package/dist/client/NewVersionBanner.js +30 -0
  14. package/dist/client/NewVersionBanner.js.map +1 -0
  15. package/dist/client/audio/AudioRecorder.d.ts +1 -0
  16. package/dist/client/audio/AudioRecorder.d.ts.map +1 -1
  17. package/dist/client/audio/AudioRecorder.js +11 -3
  18. package/dist/client/audio/AudioRecorder.js.map +1 -1
  19. package/dist/client/audio/useSTT.d.ts +2 -0
  20. package/dist/client/audio/useSTT.d.ts.map +1 -1
  21. package/dist/client/audio/useSTT.js +101 -7
  22. package/dist/client/audio/useSTT.js.map +1 -1
  23. package/dist/client/audio/useSTT.test.js +68 -0
  24. package/dist/client/audio/useSTT.test.js.map +1 -1
  25. package/dist/client/auth/startLogin.d.ts +27 -0
  26. package/dist/client/auth/startLogin.d.ts.map +1 -1
  27. package/dist/client/auth/startLogin.js +90 -1
  28. package/dist/client/auth/startLogin.js.map +1 -1
  29. package/dist/client/bootstrapApp.d.ts +17 -0
  30. package/dist/client/bootstrapApp.d.ts.map +1 -1
  31. package/dist/client/bootstrapApp.js +28 -3
  32. package/dist/client/bootstrapApp.js.map +1 -1
  33. package/dist/client/callAI.d.ts +21 -0
  34. package/dist/client/callAI.d.ts.map +1 -1
  35. package/dist/client/callAI.js +5 -0
  36. package/dist/client/callAI.js.map +1 -1
  37. package/dist/client/index.d.ts +3 -2
  38. package/dist/client/index.d.ts.map +1 -1
  39. package/dist/client/index.js +3 -2
  40. package/dist/client/index.js.map +1 -1
  41. package/dist/client/installPromptLogic.d.ts +33 -0
  42. package/dist/client/installPromptLogic.d.ts.map +1 -0
  43. package/dist/client/installPromptLogic.js +64 -0
  44. package/dist/client/installPromptLogic.js.map +1 -0
  45. package/dist/client/staleBuild.d.ts +38 -0
  46. package/dist/client/staleBuild.d.ts.map +1 -0
  47. package/dist/client/staleBuild.js +244 -0
  48. package/dist/client/staleBuild.js.map +1 -0
  49. package/package.json +2 -2
  50. package/src/cli/version.ts +1 -1
  51. package/src/client/InstallPrompt.tsx +289 -0
  52. package/src/client/LoginPopup.tsx +11 -0
  53. package/src/client/NewVersionBanner.tsx +53 -0
  54. package/src/client/audio/AudioRecorder.test.ts +24 -0
  55. package/src/client/audio/AudioRecorder.ts +10 -2
  56. package/src/client/audio/useSTT.test.tsx +69 -0
  57. package/src/client/audio/useSTT.ts +116 -14
  58. package/src/client/auth/startLogin.test.ts +118 -1
  59. package/src/client/auth/startLogin.ts +96 -1
  60. package/src/client/bootstrapApp.tsx +59 -1
  61. package/src/client/callAI.ts +15 -0
  62. package/src/client/index.ts +10 -1
  63. package/src/client/installPromptLogic.test.ts +113 -0
  64. package/src/client/installPromptLogic.ts +91 -0
  65. package/src/client/staleBuild.test.ts +130 -0
  66. package/src/client/staleBuild.ts +274 -0
package/README.md CHANGED
@@ -399,6 +399,8 @@ bootstrapApp({
399
399
  | `strings?` | Localization config — when present, wraps the tree with `<StringsProvider>`. |
400
400
  | `keyboard?: false` | Disable the framework `<KeyboardProvider>` wrapper. |
401
401
  | `billingBanner?: false` | Disable the out-of-credit banner. Only set on apps where the developer pays for AI (owner-billed proxy token) — apps that make user-billed calls should leave it on so a user with no credit sees a warning instead of silent request failures. Has no effect inside Ugly Studio (which shows its own). |
402
+ | `autoReloadOnNewBuild?: false` | Disable the automatic stale-build reload. By default, a page that was hidden or just resumed reloads onto a newer deploy; a page in active use gets a `<NewVersionBanner>` and reloads on next resume. Inert in dev (no build id). |
403
+ | `installPrompt?: boolean` | Opt in to the framework-level "Install &lt;app&gt;" banner on mobile browsers (Android Chromium install dialog, iOS "Add to Home Screen" hint). Default off. Shown to signed-in sessions only, never when already installed, framed, inside a native Ugly host, or on desktop. Apps can place `<InstallPrompt />` themselves instead. |
402
404
  | `silentSso?` | Apex-domain apps that use ugly.bot as their auth authority but don't share its cookie. When `true`, a logged-out boot attempts a top-level SSO redirect (once per tab) to adopt an existing ugly.bot session. Leave unset for `*.ugly.bot` subdomains and Mode B apps. |
403
405
  | `testMode?` | Skip ugly.bot silent SSO and trust the auth cookie the fixture set. Only honored when `UGLY_APP_TEST_MODE=1`. |
404
406
 
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.1075";
1
+ export declare const CLI_VERSION = "0.1.1077";
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.1075";
2
+ export const CLI_VERSION = "0.1.1077";
3
3
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Compact bottom banner that tells mobile users the app can be installed.
3
+ *
4
+ * - Android / Chromium: captures `beforeinstallprompt` and offers an Install
5
+ * button that opens the browser's native install dialog.
6
+ * - iOS / iPadOS Safari (and Chrome/Edge on iOS 16.4+): there is no API, so it
7
+ * explains the Share sheet step instead.
8
+ *
9
+ * Never shown when already installed (standalone), inside an iframe (Ugly
10
+ * Studio preview), inside a native Ugly host, on desktop, or in known in-app
11
+ * browsers. A dismissal is remembered for 30 days. OPT-IN: `bootstrapApp`
12
+ * mounts it for signed-in sessions only when the app passes
13
+ * `installPrompt: true`; apps can also place it themselves.
14
+ */
15
+ import { type ReactElement } from 'react';
16
+ /** Start listening for `beforeinstallprompt` / `appinstalled`. Idempotent. */
17
+ export declare function installInstallPromptCapture(): void;
18
+ export interface InstallPromptProps {
19
+ /** Delay before the banner appears (ms). Default 4000. */
20
+ delayMs?: number;
21
+ /** App name shown as "Install <title>". Default: manifest/document title. */
22
+ title?: string;
23
+ }
24
+ export declare function InstallPrompt({ delayMs, title: titleProp, }?: InstallPromptProps): ReactElement | null;
25
+ //# sourceMappingURL=InstallPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallPrompt.d.ts","sourceRoot":"","sources":["../../src/client/InstallPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AA4B/D,8EAA8E;AAC9E,wBAAgB,2BAA2B,IAAI,IAAI,CAalD;AA4GD,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAc,EACd,KAAK,EAAE,SAAS,GACjB,GAAE,kBAAuB,GAAG,YAAY,GAAG,IAAI,CAkH/C"}
@@ -0,0 +1,213 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Compact bottom banner that tells mobile users the app can be installed.
4
+ *
5
+ * - Android / Chromium: captures `beforeinstallprompt` and offers an Install
6
+ * button that opens the browser's native install dialog.
7
+ * - iOS / iPadOS Safari (and Chrome/Edge on iOS 16.4+): there is no API, so it
8
+ * explains the Share sheet step instead.
9
+ *
10
+ * Never shown when already installed (standalone), inside an iframe (Ugly
11
+ * Studio preview), inside a native Ugly host, on desktop, or in known in-app
12
+ * browsers. A dismissal is remembered for 30 days. OPT-IN: `bootstrapApp`
13
+ * mounts it for signed-in sessions only when the app passes
14
+ * `installPrompt: true`; apps can also place it themselves.
15
+ */
16
+ import { useEffect, useState } from 'react';
17
+ import { createPortal } from 'react-dom';
18
+ import { isNativeAvailable } from '../native/index.js';
19
+ import { isStandaloneDisplay } from './auth/startLogin.js';
20
+ import { Button } from './components/Button.js';
21
+ import { Z } from './components/zIndex.js';
22
+ import { INSTALL_DISMISS_KEY, installPromptMode, } from './installPromptLogic.js';
23
+ // ── beforeinstallprompt capture (module-level: the event can fire before the
24
+ // component mounts, and fires at most once per page) ─────────────────────────
25
+ let deferredPrompt = null;
26
+ let appInstalled = false;
27
+ const listeners = new Set();
28
+ const notify = () => {
29
+ for (const l of listeners)
30
+ l();
31
+ };
32
+ let captureInstalled = false;
33
+ /** Start listening for `beforeinstallprompt` / `appinstalled`. Idempotent. */
34
+ export function installInstallPromptCapture() {
35
+ if (captureInstalled || typeof window === 'undefined')
36
+ return;
37
+ captureInstalled = true;
38
+ window.addEventListener('beforeinstallprompt', (e) => {
39
+ e.preventDefault(); // suppress the mini-infobar; we show our own banner
40
+ deferredPrompt = e;
41
+ notify();
42
+ });
43
+ window.addEventListener('appinstalled', () => {
44
+ appInstalled = true;
45
+ deferredPrompt = null;
46
+ notify();
47
+ });
48
+ }
49
+ function readDismissedAt() {
50
+ try {
51
+ const raw = localStorage.getItem(INSTALL_DISMISS_KEY);
52
+ const n = raw ? Number(raw) : NaN;
53
+ return Number.isFinite(n) ? n : null;
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ function writeDismissed() {
60
+ try {
61
+ localStorage.setItem(INSTALL_DISMISS_KEY, String(Date.now()));
62
+ }
63
+ catch {
64
+ /* no storage: the banner just comes back next visit */
65
+ }
66
+ }
67
+ function inIframe() {
68
+ try {
69
+ return window.top !== window.self;
70
+ }
71
+ catch {
72
+ return true; // cross-origin parent
73
+ }
74
+ }
75
+ function nativeHost() {
76
+ try {
77
+ return isNativeAvailable();
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ function currentMode() {
84
+ if (typeof window === 'undefined' || typeof navigator === 'undefined') {
85
+ return null;
86
+ }
87
+ if (appInstalled)
88
+ return null;
89
+ return installPromptMode({
90
+ userAgent: navigator.userAgent,
91
+ maxTouchPoints: navigator.maxTouchPoints || 0,
92
+ standalone: isStandaloneDisplay(),
93
+ inIframe: inIframe(),
94
+ nativeHost: nativeHost(),
95
+ hasDeferredPrompt: deferredPrompt !== null,
96
+ dismissedAt: readDismissedAt(),
97
+ now: Date.now(),
98
+ });
99
+ }
100
+ /** Best app name: manifest short_name/name, then meta tags, then the title. */
101
+ async function resolveAppTitle() {
102
+ const fromDoc = () => {
103
+ const meta = document
104
+ .querySelector('meta[name="apple-mobile-web-app-title"]')
105
+ ?.getAttribute('content') ??
106
+ document
107
+ .querySelector('meta[name="application-name"]')
108
+ ?.getAttribute('content');
109
+ if (meta?.trim())
110
+ return meta.trim();
111
+ // "Page - App" / "Page | App": the app name is usually the last segment.
112
+ const parts = document.title.split(/\s+[|–—-]\s+/);
113
+ return (parts[parts.length - 1] ?? '').trim();
114
+ };
115
+ try {
116
+ const href = document
117
+ .querySelector('link[rel="manifest"]')
118
+ ?.getAttribute('href');
119
+ if (href) {
120
+ const res = await fetch(href, { credentials: 'same-origin' });
121
+ if (res.ok) {
122
+ const m = (await res.json());
123
+ const name = m.short_name?.trim() || m.name?.trim();
124
+ if (name)
125
+ return name;
126
+ }
127
+ }
128
+ }
129
+ catch {
130
+ /* fall back to the document */
131
+ }
132
+ return fromDoc();
133
+ }
134
+ /** iOS share glyph (square with an up arrow), inline so no icon dependency. */
135
+ function ShareGlyph() {
136
+ return (_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", style: { verticalAlign: '-3px', margin: '0 2px' }, children: [_jsx("path", { d: "M4 12v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7" }), _jsx("polyline", { points: "16 6 12 2 8 6" }), _jsx("line", { x1: "12", y1: "2", x2: "12", y2: "15" })] }));
137
+ }
138
+ export function InstallPrompt({ delayMs = 4000, title: titleProp, } = {}) {
139
+ const [ready, setReady] = useState(false);
140
+ const [mode, setMode] = useState(null);
141
+ const [title, setTitle] = useState(titleProp ?? '');
142
+ const [hidden, setHidden] = useState(false);
143
+ useEffect(() => {
144
+ installInstallPromptCapture();
145
+ const update = () => setMode(currentMode());
146
+ listeners.add(update);
147
+ const t = setTimeout(() => {
148
+ update();
149
+ setReady(true);
150
+ }, delayMs);
151
+ return () => {
152
+ clearTimeout(t);
153
+ listeners.delete(update);
154
+ };
155
+ }, [delayMs]);
156
+ useEffect(() => {
157
+ if (titleProp !== undefined) {
158
+ setTitle(titleProp);
159
+ return;
160
+ }
161
+ let live = true;
162
+ void resolveAppTitle().then((t) => {
163
+ if (live)
164
+ setTitle(t);
165
+ });
166
+ return () => {
167
+ live = false;
168
+ };
169
+ }, [titleProp]);
170
+ if (!ready || hidden || !mode || typeof document === 'undefined')
171
+ return null;
172
+ const dismiss = () => {
173
+ writeDismissed();
174
+ setHidden(true);
175
+ };
176
+ const install = () => {
177
+ const p = deferredPrompt;
178
+ if (!p)
179
+ return;
180
+ deferredPrompt = null; // single-use
181
+ void p
182
+ .prompt()
183
+ .then(() => p.userChoice)
184
+ .then(({ outcome }) => {
185
+ if (outcome === 'dismissed')
186
+ writeDismissed();
187
+ })
188
+ .catch(() => { })
189
+ .finally(() => setHidden(true));
190
+ };
191
+ const heading = title ? `Install ${title}` : 'Install this app';
192
+ return createPortal(_jsxs("div", { "data-id": "install-prompt", role: "dialog", "aria-label": heading, style: {
193
+ position: 'fixed',
194
+ left: 'calc(env(safe-area-inset-left, 0px) + 12px)',
195
+ right: 'calc(env(safe-area-inset-right, 0px) + 12px)',
196
+ bottom: 'calc(env(safe-area-inset-bottom, 0px) + 12px)',
197
+ maxWidth: 480,
198
+ margin: '0 auto',
199
+ zIndex: Z.toast,
200
+ display: 'flex',
201
+ alignItems: 'center',
202
+ gap: 10,
203
+ padding: '10px 8px 10px 14px',
204
+ borderRadius: 14,
205
+ background: 'rgba(17,17,17,0.94)',
206
+ color: '#fff',
207
+ fontSize: 14,
208
+ lineHeight: 1.35,
209
+ boxShadow: '0 6px 24px rgba(0,0,0,0.3)',
210
+ fontFamily: 'var(--app-font-body, system-ui, sans-serif)',
211
+ }, children: [_jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { style: { fontWeight: 600 }, children: heading }), mode === 'ios' ? (_jsxs("div", { style: { opacity: 0.85, fontSize: 13 }, children: ["Tap Share", _jsx(ShareGlyph, {}), ", then Add to Home Screen"] })) : null] }), mode === 'android' ? (_jsx(Button, { "data-id": "install-prompt-install", "aria-label": heading, size: "sm", onClick: install, children: "Install" })) : null, _jsx(Button, { "data-id": "install-prompt-dismiss", "aria-label": "Dismiss install prompt", size: "sm", variant: "ghost", onClick: dismiss, style: { color: '#fff', fontSize: 18, lineHeight: 1 }, children: "\u00D7" })] }), document.body);
212
+ }
213
+ //# sourceMappingURL=InstallPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallPrompt.js","sourceRoot":"","sources":["../../src/client/InstallPrompt.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoginPopup.d.ts","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"AAQA,UAAU,eAAe;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,MAAc,EAAE,EAAE,eAAe,+BA4NxE"}
1
+ {"version":3,"file":"LoginPopup.d.ts","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"AAYA,UAAU,eAAe;IACvB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,sFAAsF;IACtF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,MAAc,EAAE,EAAE,eAAe,+BAmOxE"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { isStandaloneDisplay, startUglyBotRedirectLogin, } from './auth/startLogin.js';
3
4
  const UGLY_BOT_URL = typeof window !== 'undefined'
4
5
  ? (window.__UGLY_BOT_URL__ ??
5
6
  'https://ugly.bot')
@@ -78,6 +79,13 @@ export function LoginPopup({ onSuccess, inline = false }) {
78
79
  })();
79
80
  }, [onSuccess]);
80
81
  const openPopup = useCallback(() => {
82
+ // Installed PWA: a popup lands in a separate browser context (or the native
83
+ // ugly.bot app), so the code never gets back here. Sign in same-window.
84
+ if (isStandaloneDisplay()) {
85
+ setStatus('waiting');
86
+ startUglyBotRedirectLogin();
87
+ return;
88
+ }
81
89
  const origin = encodeURIComponent(window.location.origin);
82
90
  const popup = window.open(`${UGLY_BOT_URL}/oauth?origin=${origin}`, 'ugly-bot-login', 'width=480,height=640,left=200,top=100');
83
91
  setStatus('waiting');
@@ -1 +1 @@
1
- {"version":3,"file":"LoginPopup.js","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LoginPopup.js","sourceRoot":"","sources":["../../src/client/LoginPopup.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Small, non-blocking "A new version is available" banner with a Reload button.
3
+ * Driven by `staleBuild.ts`; renders nothing until a newer build is detected
4
+ * while the user is actively using the page. Mounted by `bootstrapApp`.
5
+ */
6
+ import type { ReactElement } from 'react';
7
+ export declare function NewVersionBanner(): ReactElement | null;
8
+ //# sourceMappingURL=NewVersionBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewVersionBanner.d.ts","sourceRoot":"","sources":["../../src/client/NewVersionBanner.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,IAAI,CAyCtD"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { createPortal } from 'react-dom';
3
+ import { Button } from './components/Button.js';
4
+ import { Z } from './components/zIndex.js';
5
+ import { reloadForNewVersion, useNewVersionAvailable } from './staleBuild.js';
6
+ export function NewVersionBanner() {
7
+ const visible = useNewVersionAvailable();
8
+ if (!visible || typeof document === 'undefined')
9
+ return null;
10
+ return createPortal(_jsxs("div", { "data-id": "new-version-banner", role: "status", "aria-live": "polite", style: {
11
+ position: 'fixed',
12
+ top: 'calc(env(safe-area-inset-top, 0px) + 8px)',
13
+ left: '50%',
14
+ transform: 'translateX(-50%)',
15
+ zIndex: Z.tooltip + 5,
16
+ maxWidth: 'calc(100vw - 32px)',
17
+ display: 'flex',
18
+ alignItems: 'center',
19
+ gap: 10,
20
+ padding: '6px 6px 6px 14px',
21
+ borderRadius: 999,
22
+ background: 'rgba(17,17,17,0.92)',
23
+ color: '#fff',
24
+ fontSize: 14,
25
+ lineHeight: 1.3,
26
+ boxShadow: '0 4px 16px rgba(0,0,0,0.25)',
27
+ fontFamily: 'var(--app-font-body, system-ui, sans-serif)',
28
+ }, children: [_jsx("span", { children: "A new version is available" }), _jsx(Button, { "data-id": "new-version-reload", "aria-label": "Reload to get the new version", size: "sm", onClick: reloadForNewVersion, style: { borderRadius: 999 }, children: "Reload" })] }), document.body);
29
+ }
30
+ //# sourceMappingURL=NewVersionBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewVersionBanner.js","sourceRoot":"","sources":["../../src/client/NewVersionBanner.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,YAAY,CACjB,0BACU,oBAAoB,EAC5B,IAAI,EAAC,QAAQ,eACH,QAAQ,EAClB,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,2CAA2C;YAChD,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,kBAAkB;YAC7B,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;YACrB,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,EAAE;YACP,OAAO,EAAE,kBAAkB;YAC3B,YAAY,EAAE,GAAG;YACjB,UAAU,EAAE,qBAAqB;YACjC,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,6BAA6B;YACxC,UAAU,EAAE,6CAA6C;SAC1D,aAED,wDAAuC,EACvC,KAAC,MAAM,eACG,oBAAoB,gBACjB,+BAA+B,EAC1C,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,uBAGrB,IACL,EACN,QAAQ,CAAC,IAAI,CACd,CAAC;AACJ,CAAC"}
@@ -4,6 +4,7 @@ export declare class AudioRecorder {
4
4
  private stream;
5
5
  private worklet;
6
6
  private _listening;
7
+ private generation;
7
8
  private onChunk;
8
9
  get listening(): boolean;
9
10
  start(onChunk: (base64Audio: string) => void): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY,q3BAwBxB,CAAC;AAkBF,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA2C;IAE1D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA4ElE,IAAI,IAAI,IAAI;CAYb"}
1
+ {"version":3,"file":"AudioRecorder.d.ts","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY,q3BAwBxB,CAAC;AAkBF,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,OAAO,CAA2C;IAE1D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmFlE,IAAI,IAAI,IAAI;CAYb"}
@@ -42,6 +42,7 @@ export class AudioRecorder {
42
42
  stream = null;
43
43
  worklet = null;
44
44
  _listening = false;
45
+ generation = 0;
45
46
  onChunk = null;
46
47
  get listening() {
47
48
  return this._listening;
@@ -49,9 +50,10 @@ export class AudioRecorder {
49
50
  async start(onChunk) {
50
51
  if (this._listening)
51
52
  return;
53
+ const generation = ++this.generation;
52
54
  this.onChunk = onChunk;
53
55
  console.log('[AudioRecorder] requesting mic access…');
54
- this.stream = await navigator.mediaDevices.getUserMedia({
56
+ const stream = await navigator.mediaDevices.getUserMedia({
55
57
  audio: {
56
58
  sampleRate: TARGET_SAMPLE_RATE,
57
59
  channelCount: 1,
@@ -59,6 +61,11 @@ export class AudioRecorder {
59
61
  noiseSuppression: true,
60
62
  },
61
63
  });
64
+ if (generation !== this.generation) {
65
+ stream.getTracks().forEach((t) => t.stop());
66
+ return;
67
+ }
68
+ this.stream = stream;
62
69
  const track = this.stream.getAudioTracks()[0];
63
70
  if (track) {
64
71
  const settings = track.getSettings();
@@ -70,6 +77,8 @@ export class AudioRecorder {
70
77
  // Same CSP story as AudioPlayer: prefer the prebuilt same-origin asset,
71
78
  // fall back to the blob: URL when it isn't reachable (older builds).
72
79
  await addWorkletModuleWithFallback(this.ctx.audioWorklet, staticWorkletUrl('audioRecorder.worklet.js', import.meta.url, typeof document === 'undefined' ? undefined : document.baseURI), getWorkletUrl);
80
+ if (generation !== this.generation)
81
+ return;
73
82
  console.log('[AudioRecorder] worklet loaded');
74
83
  this.worklet = new AudioWorkletNode(this.ctx, 'audio-recorder');
75
84
  let chunkCount = 0;
@@ -102,8 +111,7 @@ export class AudioRecorder {
102
111
  console.log('[AudioRecorder] recording started');
103
112
  }
104
113
  stop() {
105
- if (!this._listening)
106
- return;
114
+ this.generation++;
107
115
  console.log('[AudioRecorder] stopping');
108
116
  this.worklet?.disconnect();
109
117
  this.stream?.getTracks().forEach((t) => t.stop());
@@ -1 +1 @@
1
- {"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EACL,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,+EAA+E;AAC/E,4EAA4E;AAC5E,gCAAgC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwB3B,CAAC;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,oCAAoC;AACpC,IAAI,UAAU,GAAkB,IAAI,CAAC;AACrC,SAAS,aAAa;IACpB,UAAU,KAAK,GAAG,CAAC,eAAe,CAChC,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAC7D,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC;AACD,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAOjC,MAAM,OAAO,aAAa;IAChB,GAAG,GAAwB,IAAI,CAAC;IAChC,MAAM,GAAuB,IAAI,CAAC;IAClC,OAAO,GAA4B,IAAI,CAAC;IACxC,UAAU,GAAG,KAAK,CAAC;IACnB,OAAO,GAAsC,IAAI,CAAC;IAE1D,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAsC;QAChD,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;YACtD,KAAK,EAAE;gBACL,UAAU,EAAE,kBAAkB;gBAC9B,YAAY,EAAE,CAAC;gBACf,gBAAgB,EAAE,IAAI;gBACtB,gBAAgB,EAAE,IAAI;aACvB;SACF,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CACT,iCAAiC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,UAAU,IAAI,GAAG,OAAO,QAAQ,CAAC,YAAY,IAAI,GAAG,KAAK,CACpH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CACT,sCAAsC,IAAI,CAAC,GAAG,CAAC,KAAK,eAAe,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CACzF,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7D,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,4BAA4B,CAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EACrB,gBAAgB,CACd,0BAA0B,EAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EACf,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAC/D,EACD,aAAa,CACd,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAEhE,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAwC,CAAC;YAC3D,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC;gBAC9B,UAAU,EAAE,CAAC;gBAEb,4CAA4C;gBAC5C,IAAI,MAAM,GAAG,CAAC,CAAC;gBACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBACxC,IAAI,GAAG,GAAG,MAAM;wBAAE,MAAM,GAAG,GAAG,CAAC;gBACjC,CAAC;gBACD,IAAI,MAAM,GAAG,KAAK;oBAAE,YAAY,EAAE,CAAC;gBAEnC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC;oBAC9C,OAAO,CAAC,GAAG,CACT,0BAA0B,UAAU,WAAW,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,YAAY,IAAI,UAAU,EAAE,CAC9G,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;gBACxC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAqB,CAAC,CAAC;gBAChE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF;AAED,SAAS,cAAc,CAAC,OAAqB;IAC3C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC;IAC7D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAmB;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;QACnC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"AudioRecorder.js","sourceRoot":"","sources":["../../../src/client/audio/AudioRecorder.ts"],"names":[],"mappings":"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"}
@@ -10,9 +10,11 @@ interface STTOptions {
10
10
  export declare function useSTT(socket: UglyBotSocket, options?: STTOptions): {
11
11
  start: () => Promise<void>;
12
12
  stop: () => void;
13
+ finish: () => Promise<string>;
13
14
  transcript: string;
14
15
  isFinal: boolean;
15
16
  listening: boolean;
17
+ finalizing: boolean;
16
18
  error: string | null;
17
19
  };
18
20
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"useSTT.d.ts","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;wEAEoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe;;;;;;;EA2PrE"}
1
+ {"version":3,"file":"useSTT.d.ts","sourceRoot":"","sources":["../../../src/client/audio/useSTT.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;wEAEoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAUD,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe;;;kBA2SrC,OAAO,CAAC,MAAM,CAAC;;;;;;EAsD/C"}